Version 2.1.0-dev.2.0

Merge commit 'e1039fc89e274951ebc1bbb5ddfc62557d1aeb38' into dev
diff --git a/BUILD.gn b/BUILD.gn
index 5dbba45..6f97c3c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -51,12 +51,8 @@
     "runtime/bin:sample_extension",
     "runtime/bin:test_extension",
     "runtime/vm:kernel_platform_files($host_toolchain)",
-
-    # TODO(rmacnak): Link this into 'dart'.
-    "utils/kernel-service:copy_kernel_service_snapshot",
     "utils/kernel-service:kernel-service",
   ]
-
   if (target_supports_aot) {
     deps += [ "runtime/bin:precompiler_entry_points_json" ]
   }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea563d2..02e5dcc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,20 @@
+## 2.1.0-dev.2.0
+
+### Tool Changes
+
+#### dartfmt
+
+*   Upgrade to an intermediate version of dartfmt.
+*   Address several dartfmt issues when used with the new CFE parser.
+
+### Core library changes
+
+#### `dart:core`:
+
+*   Deprecated the `provisional` annotation and the `Provisional`
+    annotation class. These should have been removed before releasing Dart 2.0,
+    and they have no effect.
+
 ## 2.1.0-dev.1.0
 
 ### Tool Changes
diff --git a/DEPS b/DEPS
index 3edb035..32c23b4 100644
--- a/DEPS
+++ b/DEPS
@@ -78,7 +78,7 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.1.3",  # Please see the note above before updating.
+  "dart_style_tag": "6f3efd209ff1828835936397b64be79265cc0c19",  # Please see the note above before updating.
 
   "dartdoc_tag" : "v0.20.2",
   "fixnum_tag": "0.10.8",
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 80b7482..8e19bd2 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -8,7 +8,7 @@
 \usepackage[T1]{fontenc}
 \title{Dart Programming Language Specification\\
 {5th edition draft}\\
-{\large Version 2.0.0-dev}}
+{\large Version 2.1.0-dev}}
 
 % For information about Location Markers (and in particular the
 % commands \LMHash and \LMLabel), see the long comment at the
@@ -18,6 +18,14 @@
 % =======
 % Significant changes to the specification.
 %
+% 2.1
+% - Remove 64-bit constraint on integer literals compiled to JavaScript numbers.
+% - Allow integer literals in a double context to evaluate to a double value.
+% - Specify dynamic error for a failing downcast in redirecting factory
+%   constructor invocation.
+% - Specify that type arguments passed in a redirecting factory constructor
+%   declaration must be taken into account during static checks.
+%
 % 2.0
 % - Don't allow functions as assert test values.
 % - Start running "async" functions synchronously.
@@ -69,6 +77,8 @@
 % - It is no longer an error for a getter to have return type `void`.
 % - Specify that each redirection of a constructor is checked, statically and
 %   dynamically.
+% - Specify that it is an error for a superinitializer to occur anywhere else
+%   than at the end of an initializer list.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -1351,8 +1361,13 @@
 \end{dartCode}
 
 \LMHash{}
-It is a compile-time error if a class $C$ declares a member with the same name as $C$.
-It is a compile-time error if a generic class declares a type variable with the same name as the class or any of its members or constructors.
+It is a compile-time error if a class named $C$ declares
+a member with basename (\ref{classMemberConflicts}) $C$.
+If a generic class named $G$ declares a type variable named $X$,
+it is a compile-time error
+if $X$ is equal to $G$,
+if $G$ has a member whose basename is $X$,
+and if $G$ has a constructor named \code{$G$.$X$}.
 
 
 \subsection{Instance Methods}
@@ -1634,6 +1649,23 @@
 A {\em constructor name} always begins with the name of its immediately enclosing class, and may optionally be followed by a dot and an identifier \id.
 It is a compile-time error if the name of a constructor is not a constructor name.
 
+\LMHash{}
+The {\em function type of a constructor} $k$ is the function type whose
+return type is the class that contains the declaration of $k$,
+and whose formal parameter types, optionality, and names of named parameters
+correspond to the declaration of $k$.
+
+\commentary{
+Note that the function type $F$ of a constructor $k$ may contain
+type variables declared by the enclosing class $C$.
+In that case we can apply a substitution to $F$, as in
+$[T_1/X_1, \ldots, T_m/X_m]F$,
+where $X_j, j \in 1 .. m$ are the formal type parameters of $C$
+and $T_j, j \in 1 .. m$ are specified in the given context.
+We may also omit such a substitution when the given context is
+the instance scope of $C$, where $X_1, \ldots, X_m$ are in scope.
+}
+
 \commentary{
 A constructor declaration may conflict with static member declarations
 (\ref{classMemberConflicts}).
@@ -1790,8 +1822,8 @@
 
 \LMHash{}
 It is a dynamic error if an actual argument passed in an invocation of a redirecting generative constructor $k$
-is not a subtype of the actual type 
-\ref{actualTypeOfADeclaration}) of the corresponding formal parameter in the declaration of $k$.
+is not a subtype of the actual type (\ref{actualTypeOfADeclaration})
+of the corresponding formal parameter in the declaration of $k$.
 It is a dynamic error if an actual argument passed to the redirectee $k'$ of a redirecting generative constructor
 is not a subtype of the actual type
 (\ref{actualTypeOfADeclaration}) of the corresponding formal parameter in the declaration of the redirectee.
@@ -1828,6 +1860,7 @@
 Then $k$ may include at most one superinitializer in its initializer list or a compile-time error occurs.
 If no superinitializer is provided, an implicit superinitializer of the form \SUPER{}() is added at the end of $k$'s initializer list,
 unless the enclosing class is class \code{Object}.
+It is a compile-time error if a superinitializer appears in $k$'s initializer list at any other position than at the end.
 It is a compile-time error if more than one initializer corresponding to a given instance variable appears in $k$'s initializer list.
 It is a compile-time error if $k$'s initializer list contains an initializer for a variable that is initialized by means of an initializing formal of $k$.
 It is a compile-time error if $k$'s initializer list contains an initializer for a final variable $f$ whose declaration includes an initialization expression.
@@ -1903,15 +1936,6 @@
 implicitly added superinitializer (\ref{initializerLists}) is executed to
 further initialize $i$.
 
-\commentary{
-The super constructor call can be written anywhere
-in the initializer list of $k$,
-but the actual call always happens after all initializers have been processed.
-It is not equivalent to moving the super call to the end of the initializer list
-because the argument expressions may have visible side effects
-which must happen in the order the expressions occur in the program text.
-}
-
 \LMHash{}
 After the superinitializer has completed, the body of $k$ is executed in a scope where \THIS{} is bound to $i$.
 
@@ -1953,18 +1977,18 @@
 is evaluated.
 
 \LMHash{}
-Then, after the remainder of the initializer list of $k$ has been executed,
-the superconstructor is executed as follows:
+Then the superconstructor is executed as follows:
 
 \LMHash{}
 Let $C$ be the class in which the superinitializer appears and let $S$ be the superclass of $C$.
-If $S$ is generic (\ref{generics}), let $U_1, \ldots, U_m$ be the actual type arguments passed to $S$ in the superclass clause of $C$.
+If $S$ is generic (\ref{generics}), let $U_1, \ldots, U_p$ be the actual type arguments passed to $S$,
+obtained by substituting $V_1, \ldots, V_m$ for the formal parameters in the superclass clause of $C$.
 
 \LMHash{}
 The generative constructor $S$ (respectively \code{$S$.\id}) of $S$ is executed
 to initialize $i$ with respect to the bindings that resulted from the evaluation of
 \code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
-and the type parameters (if any) of class $S$ bound to $U_1, \ldots, U_m$.
+and the type parameters (if any) of class $S$ bound to $U_1, \ldots, U_p$.
 
 \LMHash{}
 It is a compile-time error if class $S$ does not declare a generative constructor named $S$ (respectively \code{$S$.\id}).
@@ -2059,10 +2083,6 @@
 or it would amount to a dynamic error which is simply delayed a single step.
 }
 
-\LMHash{}
-Moreover, when $\ConstMetavar$ is \CONST{}
-the redirectee must be a constant constructor.
-
 \commentary{
 Note that the non-generic case is covered by letting $m$ or $p$ or both be zero,
 in which case the formal type parameter list of the class $C$
@@ -2077,6 +2097,11 @@
 }
 
 \LMHash{}
+It is a compile-time error if a formal parameter of $k'$ has a default value
+whose type is not a subtype of the type annotation
+on the corresponding formal parameter in $k$.
+
+\LMHash{}
 It is a compile-time error if a redirecting factory constructor redirects to itself, either directly or indirectly via a sequence of redirections.
 
 \LMHash{}
@@ -2125,10 +2150,19 @@
 It is a compile-time error if $k$ is prefixed with the \CONST{} modifier but $k'$ is not a constant constructor (\ref{constantConstructors}).
 
 \LMHash{}
-It is a compile-time error if the function type of $k'$ is not a subtype of the type of $k$.
+Let $T_1, \ldots, T_m$ be the actual type arguments passed to $k'$
+in the declaration of $k$.
+Let $X_1, \ldots, X_m$ be the formal type arguments declared by
+the class that contains the declaration of $k'$.
+Let $F'$ be the function of $k'$ (\ref{constructors}).
+It is a compile-time error if $[T_1/X_1, \ldots, T_m/X_m]F'$
+is not a subtype of the function type of $k$.
 
 \commentary{
-This implies that the resulting object conforms to the interface of the immediately enclosing class of $k$.
+In the case where the two classes are non-generic
+this is just a subtype check on the function types of the two constructors.
+In general, this implies that the resulting object conforms to
+the interface of the immediately enclosing class of $k$.
 }
 
 \LMHash{}
@@ -2140,6 +2174,11 @@
 and $k'$ is the redirectee of $k$.
 
 \LMHash{}
+It is a dynamic error if an actual argument passed in an invocation of $k$
+is not a subtype of the actual type (\ref{actualTypeOfADeclaration})
+of the corresponding formal parameter in the declaration of $k$.
+
+\LMHash{}
 When the redirectee $k'$ is a factory constructor,
 execution of $k$ amounts to execution of $k'$ with the actual arguments passed to $k$.
 The result of the execution of $k'$ is the result of $k$.
@@ -2267,7 +2306,23 @@
 }
 
 \LMHash{}
-When invoked from a constant object expression, a constant constructor must throw an exception if any of its actual parameters is a value that would prevent one of the potentially constant expressions within it from being a valid compile-time constant.
+When a constant constructor $k$ is invoked from a constant object expression,
+it is a compile-time error if
+the invocation of $k$ at run time would throw an exception,
+and it is a compile-time error if
+substitution of the actual arguments for the formal parameters
+yields an initializing expression $e$ in the initializer list of $k$
+which is not a constant expression.
+
+\commentary{
+For instance, if $e$ is \code{a.length}
+where \code{a} is a formal argument of $k$ with type \DYNAMIC{},
+$e$ is potentially constant and can be used in the initializer list of $k$.
+It is an error to invoke $k$ with an argument of type \code{C}
+if \code{C} is a class different from \code{String},
+even if \code{C} has a \code{length} getter,
+and that same expression would evaluate without errors at run time.
+}
 
 %Discuss External Constructors in ne subsubsection here
 
@@ -3521,7 +3576,14 @@
 In the former case, we also say that the expression {\em evaluates to a value}.
 
 \LMHash{}
-Every expression has an associated static type (\ref{staticTypes}).
+Every expression has an associated static type (\ref{staticTypes}) and
+may have an associated static context type.
+\commentary{The static context type represents
+the type expectation of the surrounding context,
+the expression or statement that the expression itself is part of.
+Some contexts may not introduce any static context type.}
+The static context type may affect the static type and evaluation
+of the expression.
 Every value has an associated dynamic type (\ref{dynamicTypeSystem}).
 
 \LMHash{}
@@ -3563,8 +3625,6 @@
 \commentary{
 Sadly, it may have an effect on the surrounding expression.
 Given a class $C$ with static method $m => 42$, $C.m()$ returns 42, but $(C).m()$ produces a \code{NoSuchMethodError}.
-This anomaly can be corrected by removing the restrictions on calling the members of instances of \code{Type}.
-This issue may be addressed in future versions of Dart.
 }
 
 
@@ -3810,7 +3870,12 @@
 
 \LMHash{}
 An {\em integer literal} is either a hexadecimal integer literal or a decimal integer literal.
-The static type of an integer literal is \code{int}.
+
+\LMHash{}
+An integer literal has static type \code{int},
+unless the surrounding static context type is a type
+which \code{int} is not assignable to, and \code{double} is.
+In that case the static type of the integer literal is \code{double}.
 
 \LMHash{}
 A numeric literal that is not an integer literal is a {\em double literal}.
@@ -3818,31 +3883,20 @@
 The static type of a double literal is \code{double}.
 
 \LMHash{}
-A hexadecimal integer literal with numeric value $i$ is a compile-time
-error if $i \ge{} 2^{64}$, unless it is prefixed by a unary minus operator,
-in which case it is a compile-time error if $i \gt{} 2^{63}$.
 If the \code{int} class is implemented as signed 64-bit two's complement integers,
-$i \ge{} 2^{63}$, and the literal is not prefixed by a unary minus operator, then
-the literal evaluates to an instance of the \code{int} class representing the integer value $i - 2^{64}$.
-Otherwise the literal evaluates to an instance of the \code{int} class representing
-the integer value $i$,
+and a hexadecimal integer literal with static type \code{int}
+and numeric value $i \ge{} 2^{63}$ is not prefixed by a unary minus operator,
+then it is a compile-time error if $i \ge{} 2^{64}$, and otherwise
+the hexadecimal integer literal evaluates to an instance of the \code{int} class
+representing the value $i - 2^{64}$.
+
+\LMHash{}
+Otherwise an integer literal with static type \code{int}
+that is not prefixed by a unary minus operator,
+evaluates to an instance of the \code{int} class representing the integer value $i$,
 and it is a compile-time error if the integer $i$ cannot be represented exactly
 by an instance of \code{int}.
 
-\LMHash{}
-A decimal integer literal with numeric value $i$ is a compile-time error
-if $i \ge{} 2^{63}$, unless $i$ is prefixed by a unary minus operator,
-in which case it is only a compile-time error if $i \gt{} 2^{63}$.
-Otherwise the literal evaluates to an instance of the \code{int} class representing
-the integer value $i$.
-It is a compile-time error if the value $i$ cannot be represented exactly
-by an instance of \code{int}.
-
-\LMHash{}
-A double literal evaluates to a an instance of the \code{double} class
-representing a 64 bit double precision floating point number
-as specified by the IEEE 754 standard.
-
 \commentary{
 Integers in Dart are designed to be implemented as
 64-bit two's complement integer representations.
@@ -3854,6 +3908,26 @@
 }
 
 \LMHash{}
+A double literal evaluates to a an instance of the \code{double} class
+representing a 64 bit double precision floating point number
+as specified by the IEEE 754 standard.
+
+\LMHash{}
+An integer literal with static type \code{double} and numeric value $i$
+evaluates to an instance of the \code{double} class representing
+the value $i$. It is a compile-time error if the value $i$ cannot be
+represented {\em precisely} by the an instace of \code{double}.
+\commentary{
+A 64 bit double precision floating point number
+is usually taken to represent a range of real numbers
+around the precise value denoted by the number's
+sign, mantissa and exponent.
+For integer literals evaluating to \code{double}
+values we insist that the integer literal's numeric value
+is the precise value of the \code{double} instance.
+}
+
+\LMHash{}
 It is a compile-time error for a class to extend, mix in or implement \code{int}.
 It is a compile-time error for a class to extend, mix in or implement \code{double}.
 It is a compile-time error for any class other than \code{int} and \code{double} to extend, mix in or implement \code{num}.
@@ -7134,17 +7208,26 @@
 %The expression $-e$ is equivalent to the method invocation \code{$e$.-()}.  The expression \code{-\SUPER{}} is equivalent to the method invocation \code{\SUPER{}.-()}.
 
 \LMHash{}
-If $e$ is an expression is of the form \code{-$l$}
-where $l$ is an integer literal (\ref{numbers}) with numerical integer value $i$,
-then it is a compile-time error if $i \gt{} 2^{63}$.
-Otherwise, when $0 \le{} i \le{} 2^{63}$, the static type of $e$ is \code{int}
-and $e$ evaluates to an instance of the class \code{int}
-representing the integer value $-i$,
-and it is a compile-time error if the integer $-i$ cannot be represented exactly
-by an instance of \code{int}.
-\rationale{This treats \code{-$l$} where $l$ is an integer literal as an atomic signed numeral.
-It does not {\em evaluate} $l$ as an individual expression because \code{-9223372036854775808}
-should represent a valid \code{int} even if \code{9223372036854775808} does not.}
+If $e$ is an expression of the form \code{-$l$}
+where $l$ is an integer literal (\ref{numbers}) with numeric integer value $i$,
+then the static type of $e$ is the same as the static type of an integer literal
+with the same context type,
+and evaluation of $e$ first proceeds as for an integer literal
+with numeric value $-i$, evaluating to a value $v$.
+Then, if the static type of the $e$ is \code{double} and $v$ is the \code{double} value 0.0, then $e$ evaluates to the \code{double} value -0.0,
+otherwise $e$ evaluates to $v$.
+\commentary{
+We treat \code{-$l$} \emph{as if} it is a single integer literal with a negative
+numeric value. The specified semantics of integer literals (\ref{numbers})
+allows negative numeric values, so they can be applied as-is to the value $-i$,
+except that we want \code{-0} in a \code{double} context
+to evaluate to \code{-0.0}.
+The expression \code{-$l$} is not \emph{itself} an integer literal,
+it's merely treated as one,
+so this rule does not apply twice to \code{- -$l$}.
+It also does not apply to \code{-($l$)}
+since a parenthesized expression is not an integer literal expression.
+}
 
 \LMHash{}
 Any other expression of the form \code{$op$ $e$} is equivalent to the method invocation \code{$e.op()$}.
diff --git a/docs/language/informal/invalid_returns.md b/docs/language/informal/invalid_returns.md
index 21e579f..0dbf0e2 100644
--- a/docs/language/informal/invalid_returns.md
+++ b/docs/language/informal/invalid_returns.md
@@ -11,14 +11,14 @@
 ### Expression bodied functions
 
 
-An asynchronous expression bodied function with return type `T` and return
-expression `e` has a valid return if:
+An asynchronous expression bodied function with return type `T` and body `exp`
+has a valid return if:
   * `flatten(T)` is `void`
   * or `return exp;` is a valid return for an equivalent block bodied function
   with return type `T` as defined below.
 
-A synchronous expression bodied function with return type `T` and return expression
-`e` has a valid return if:
+A synchronous expression bodied function with return type `T` and body `exp` has
+a valid return if:
   * `T` is `void`
   * or `return exp;` is a valid return for an equivalent block bodied function
   with return type `T` as defined below.
@@ -67,7 +67,7 @@
   * and `flatten(S)` is `void`, `dynamic` or `Null`
 
 * `return exp;` where `exp` has static type `S` is a valid return if:
-  * `flatten(T)` is not `void`
+  * `T` is not `void`
   * and `flatten(S)` is not `void`
   * and `Future<flatten(S)>` is assignable to `T`
 
@@ -77,14 +77,14 @@
 ### Expression bodied functions
 
 
-It is an error if an asynchronous expression bodied function with return type `T`
-has return expression `exp` and both:
+It is an error if an asynchronous expression bodied function with return type
+`T` has body `exp` and both:
   * `flatten(T)` is not `void`
   * `return exp;` would be an error in an equivalent block bodied function
   with return type `T` as defined below.
 
 It is an error if a synchronous expression bodied function with return type `T`
-has return expression `exp` and both:
+has body `exp` and both:
   * `T` is not `void`
   * `return exp;` would be an error in an equivalent block bodied function
   with return type `T` as defined below.
@@ -114,7 +114,7 @@
 
 * `return;` is an error if `flatten(T)` is not `void`, `dynamic`, or `Null`
 
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
+* `return exp;` where `exp` has static type `S` is an error if `T` is
   `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
 
 * `return exp;` where `exp` has static type `S` is an error if `flatten(S)` is
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 6dcfee7..439c653 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -36,13 +36,11 @@
 /// flags for the analysis server.
 class CommandLineParser {
   final List<String> _knownFlags;
-  final bool _alwaysIgnoreUnrecognized;
   final ArgParser _parser;
 
   /// Creates a new command line parser
-  CommandLineParser({bool alwaysIgnoreUnrecognized: false})
+  CommandLineParser()
       : _knownFlags = <String>[],
-        _alwaysIgnoreUnrecognized = alwaysIgnoreUnrecognized,
         _parser = new ArgParser(allowTrailingOptions: true);
 
   ArgParser get parser => _parser;
@@ -117,10 +115,11 @@
   }
 
   List<String> _filterUnknowns(List<String> args) {
-    // Only filter args if the ignore flag is specified, or if
-    // _alwaysIgnoreUnrecognized was set to true
-    if (_alwaysIgnoreUnrecognized ||
-        args.contains('--ignore-unrecognized-flags')) {
+    // TODO(devoncarew): Consider dropping support for the
+    // --ignore-unrecognized-flags option.
+
+    // Only filter args if the ignore flag is specified.
+    if (args.contains('--ignore-unrecognized-flags')) {
       // Filter all unrecognized flags and options.
       List<String> filtered = <String>[];
       for (int i = 0; i < args.length; ++i) {
@@ -456,14 +455,18 @@
 
       () async {
         // We first analyze code with an empty driver cache.
-        print('Analyzing with an empty driver cache:');
+        print('Analyzing${analysisServerOptions.useCFE ? ' using CFE' : ''} '
+            'with an empty driver cache:');
         int exitCode = await devServer.processDirectories([trainDirectory]);
+        if (exitCode != 0) exit(exitCode);
 
         print('');
 
         // Then again with a populated cache.
-        print('Analyzing with a populated driver cache:');
+        print('Analyzing${analysisServerOptions.useCFE ? ' using CFE' : ''} '
+            'with a populated driver cache:');
         exitCode = await devServer.processDirectories([trainDirectory]);
+        if (exitCode != 0) exit(exitCode);
 
         if (serve_http) {
           httpServer.close();
@@ -476,7 +479,17 @@
           // ignore any exception
         }
 
-        exit(exitCode);
+        if (!analysisServerOptions.useCFE) {
+          print('');
+
+          // And then run everything again with CFE to train both frontends.
+          List<String> args = new List<String>.from(arguments);
+          args.add("--use-cfe");
+          ServerStarter starter = new ServerStarter();
+          starter.start(args);
+        } else {
+          exit(exitCode);
+        }
       }();
     } else {
       _captureExceptions(instrumentationService, () {
@@ -532,8 +545,7 @@
    * Create and return the parser used to parse the command-line arguments.
    */
   CommandLineParser _createArgParser() {
-    CommandLineParser parser =
-        new CommandLineParser(alwaysIgnoreUnrecognized: true);
+    CommandLineParser parser = new CommandLineParser();
     parser.addOption(CLIENT_ID,
         help: "an identifier used to identify the client");
     parser.addOption(CLIENT_VERSION, help: "the version of the client");
diff --git a/pkg/analysis_server/test/edit/organize_directives_test.dart b/pkg/analysis_server/test/edit/organize_directives_test.dart
index b536416..585e45c 100644
--- a/pkg/analysis_server/test/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/edit/organize_directives_test.dart
@@ -180,8 +180,4 @@
   @override
   test_OK_remove_unresolvedDirectives() async =>
       super.test_OK_remove_unresolvedDirectives();
-
-  @failingTest
-  @override
-  test_OK_remove_unusedImports() async => super.test_OK_remove_unusedImports();
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
index 8d7c14e..4582519 100644
--- a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
@@ -18,6 +18,7 @@
 
 @reflectiveTest
 class GetStatementCompletionTest extends AbstractAnalysisServerIntegrationTest {
+  @TestTimeout(const Timeout.factor(2))
   test_statement_completion() async {
     String pathname = sourcePath('test.dart');
     String text = r'''
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
index bcad20a..cb8e5e1 100644
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ b/pkg/analysis_server/test/mock_sdk.dart
@@ -120,6 +120,10 @@
 }
 const Object deprecated = const Deprecated("next release");
 
+class Exception {
+  factory Exception([var message]);
+}
+
 class Iterator<E> {
   bool moveNext();
   E get current;
@@ -151,9 +155,13 @@
 }
 
 abstract class Map<K, V> extends Object {
+  Iterable<K> get keys;
+  int get length;
+  Iterable<V> get values;
+  V operator [](K key) => null;
+  void operator []=(K key, V value) {}
   Map<RK, RV> cast<RK, RV>();
   bool containsKey(Object key);
-  Iterable<K> get keys;
 }
 
 external bool identical(Object a, Object b);
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 6b5077f..2fc6261 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -7257,26 +7257,6 @@
 
   @failingTest
   @override
-  test_createConstructor_forFinalFields() =>
-      super.test_createConstructor_forFinalFields();
-
-  @failingTest
-  @override
-  test_createConstructor_forFinalFields_flutter() =>
-      super.test_createConstructor_forFinalFields_flutter();
-
-  @failingTest
-  @override
-  test_createConstructor_forFinalFields_flutter_childLast() =>
-      super.test_createConstructor_forFinalFields_flutter_childLast();
-
-  @failingTest
-  @override
-  test_createConstructor_forFinalFields_flutter_childrenLast() =>
-      super.test_createConstructor_forFinalFields_flutter_childrenLast();
-
-  @failingTest
-  @override
   test_createConstructor_named() => super.test_createConstructor_named();
 
   @failingTest
@@ -9036,36 +9016,6 @@
   @override
   test_lint_addMissingOverride_method_with_doc_comment_and_metadata() =>
       super.test_lint_addMissingOverride_method_with_doc_comment_and_metadata();
-
-  @failingTest
-  @override
-  test_replaceWithLiteral_linkedHashMap_withCommentsInGeneric() =>
-      super.test_replaceWithLiteral_linkedHashMap_withCommentsInGeneric();
-
-  @failingTest
-  @override
-  test_replaceWithLiteral_linkedHashMap_withDynamicGenerics() =>
-      super.test_replaceWithLiteral_linkedHashMap_withDynamicGenerics();
-
-  @failingTest
-  @override
-  test_replaceWithLiteral_linkedHashMap_withGeneric() =>
-      super.test_replaceWithLiteral_linkedHashMap_withGeneric();
-
-  @failingTest
-  @override
-  test_replaceWithLiteral_linkedHashMap_withoutGeneric() =>
-      super.test_replaceWithLiteral_linkedHashMap_withoutGeneric();
-
-  @failingTest
-  @override
-  test_replaceWithLiteral_map_withGeneric() =>
-      super.test_replaceWithLiteral_map_withGeneric();
-
-  @failingTest
-  @override
-  test_replaceWithLiteral_map_withoutGeneric() =>
-      super.test_replaceWithLiteral_map_withoutGeneric();
 }
 
 class _DartFixContextImpl implements DartFixContext {
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index cf5adfb..8c20bad 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -354,10 +354,6 @@
 
   @failingTest
   @override
-  test_remove_unusedImports() => super.test_remove_unusedImports();
-
-  @failingTest
-  @override
   test_remove_unusedImports_hasUnresolvedError() =>
       super.test_remove_unusedImports_hasUnresolvedError();
 
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index bc180ba..d458443 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -492,10 +492,6 @@
 
   @failingTest
   @override
-  test_searchReferences() => super.test_searchReferences();
-
-  @failingTest
-  @override
   test_searchReferences_discover_owned() {
     fail('Timeout');
 //    return callFailingTest(super.test_searchReferences_discover_owned);
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 9af71e2..18e4340 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -716,6 +716,8 @@
 
   R visitMethodInvocation(MethodInvocation node);
 
+  R visitMixinDeclaration(MixinDeclaration node);
+
   R visitNamedExpression(NamedExpression node);
 
   R visitNativeClause(NativeClause node);
@@ -724,6 +726,8 @@
 
   R visitNullLiteral(NullLiteral node);
 
+  R visitOnClause(OnClause node);
+
   R visitParenthesizedExpression(ParenthesizedExpression node);
 
   R visitPartDirective(PartDirective node);
@@ -1541,17 +1545,17 @@
   NodeList<CompilationUnitMember> get declarations;
 
   /**
-   * Return the directives contained in this compilation unit.
-   */
-  NodeList<Directive> get directives;
-
-  /**
    * Return the element associated with this compilation unit, or `null` if the
    * AST structure has not been resolved.
    */
   CompilationUnitElement get declaredElement;
 
   /**
+   * Return the directives contained in this compilation unit.
+   */
+  NodeList<Directive> get directives;
+
+  /**
    * Return the element associated with this compilation unit, or `null` if the
    * AST structure has not been resolved.
    */
@@ -5170,6 +5174,67 @@
 }
 
 /**
+ * The declaration of a mixin.
+ *
+ *    mixinDeclaration ::=
+ *        metadata? 'mixin' [SimpleIdentifier] [TypeParameterList]?
+ *        [OnClause]? [ImplementsClause]? '{' [ClassMember]* '}'
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class MixinDeclaration extends NamedCompilationUnitMember {
+  /**
+   * Return the implements clause for the mixin, or `null` if the mixin does not
+   * implement any interfaces.
+   */
+  ImplementsClause get implementsClause;
+
+  /**
+   * Return the left curly bracket.
+   */
+  Token get leftBracket;
+
+  /**
+   * Return the members defined by the mixin.
+   */
+  NodeList<ClassMember> get members;
+
+  /**
+   * Return the token representing the 'mixin' keyword.
+   */
+  Token get mixinKeyword;
+
+  /**
+   * Return the on clause for the mixin, or `null` if the mixin does not have
+   * any super-class constraints.
+   */
+  OnClause get onClause;
+
+  /**
+   * Return the right curly bracket.
+   */
+  Token get rightBracket;
+
+  /**
+   * Return the type parameters for the mixin, or `null` if the mixin does not
+   * have any type parameters.
+   */
+  TypeParameterList get typeParameters;
+
+  /**
+   * Return the field declared in the mixin with the given [name], or `null` if
+   * there is no such field.
+   */
+  VariableDeclaration getField(String name);
+
+  /**
+   * Return the method declared in the mixin with the given [name], or `null` if
+   * there is no such method.
+   */
+  MethodDeclaration getMethod(String name);
+}
+
+/**
  * A node that declares a single name within the scope of a compilation unit.
  *
  * Clients may not extend, implement or mix-in this class.
@@ -5529,6 +5594,26 @@
 }
 
 /**
+ * The "on" clause in a mixin declaration.
+ *
+ *    onClause ::=
+ *        'on' [TypeName] (',' [TypeName])*
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class OnClause extends AstNode {
+  /**
+   * Return the token representing the 'on' keyword.
+   */
+  Token get onKeyword;
+
+  /**
+   * Return the list of the classes are super-class constraints for the mixin.
+   */
+  NodeList<TypeName> get superclassConstraints;
+}
+
+/**
  * A parenthesized expression.
  *
  *    parenthesizedExpression ::=
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 2509d85..d3e0138 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -813,6 +813,21 @@
       ArgumentList argumentList);
 
   /**
+   * Return a newly created mixin declaration.
+   */
+  MixinDeclaration mixinDeclaration(
+      Comment comment,
+      List<Annotation> metadata,
+      Token mixinKeyword,
+      SimpleIdentifier name,
+      TypeParameterList typeParameters,
+      OnClause onClause,
+      ImplementsClause implementsClause,
+      Token leftBracket,
+      List<ClassMember> members,
+      Token rightBracket);
+
+  /**
    * Returns a newly created named expression..
    */
   NamedExpression namedExpression(Label name, Expression expression);
@@ -842,6 +857,11 @@
   NullLiteral nullLiteral(Token literal);
 
   /**
+   * Return a newly created on clause.
+   */
+  OnClause onClause(Token onKeyword, List<TypeName> superclassConstraints);
+
+  /**
    * Returns a newly created parenthesized expression.
    */
   ParenthesizedExpression parenthesizedExpression(
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 79f3bfb..836054d 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -412,6 +412,10 @@
   R visitMethodInvocation(MethodInvocation node) =>
       visitInvocationExpression(node);
 
+  @override
+  R visitMixinDeclaration(MixinDeclaration node) =>
+      visitNamedCompilationUnitMember(node);
+
   R visitNamedCompilationUnitMember(NamedCompilationUnitMember node) =>
       visitCompilationUnitMember(node);
 
@@ -439,6 +443,9 @@
   R visitNullLiteral(NullLiteral node) => visitLiteral(node);
 
   @override
+  R visitOnClause(OnClause node) => visitNode(node);
+
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) =>
       visitExpression(node);
 
@@ -1015,6 +1022,12 @@
   }
 
   @override
+  R visitMixinDeclaration(MixinDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R visitNamedExpression(NamedExpression node) {
     node.visitChildren(this);
     return null;
@@ -1039,6 +1052,12 @@
   }
 
   @override
+  R visitOnClause(OnClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) {
     node.visitChildren(this);
     return null;
@@ -1482,6 +1501,9 @@
   R visitMethodInvocation(MethodInvocation node) => null;
 
   @override
+  R visitMixinDeclaration(MixinDeclaration node) => null;
+
+  @override
   R visitNamedExpression(NamedExpression node) => null;
 
   @override
@@ -1494,6 +1516,9 @@
   R visitNullLiteral(NullLiteral node) => null;
 
   @override
+  R visitOnClause(OnClause node) => null;
+
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) => null;
 
   @override
@@ -1834,6 +1859,9 @@
   R visitMethodInvocation(MethodInvocation node) => _throw(node);
 
   @override
+  R visitMixinDeclaration(MixinDeclaration node) => _throw(node);
+
+  @override
   R visitNamedExpression(NamedExpression node) => _throw(node);
 
   @override
@@ -1846,6 +1874,9 @@
   R visitNullLiteral(NullLiteral node) => _throw(node);
 
   @override
+  R visitOnClause(OnClause node) => _throw(node);
+
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) => _throw(node);
 
   @override
@@ -2554,6 +2585,14 @@
   }
 
   @override
+  T visitMixinDeclaration(MixinDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitMixinDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T visitNamedExpression(NamedExpression node) {
     stopwatch.start();
     T result = _baseVisitor.visitNamedExpression(node);
@@ -2586,6 +2625,14 @@
   }
 
   @override
+  T visitOnClause(OnClause node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitOnClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T visitParenthesizedExpression(ParenthesizedExpression node) {
     stopwatch.start();
     T result = _baseVisitor.visitParenthesizedExpression(node);
@@ -3109,6 +3156,9 @@
   R visitMethodInvocation(MethodInvocation node) => visitNode(node);
 
   @override
+  R visitMixinDeclaration(MixinDeclaration node) => visitNode(node);
+
+  @override
   R visitNamedExpression(NamedExpression node) => visitNode(node);
 
   @override
@@ -3126,6 +3176,9 @@
   R visitNullLiteral(NullLiteral node) => visitNode(node);
 
   @override
+  R visitOnClause(OnClause node) => visitNode(node);
+
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) =>
       visitNode(node);
 
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 6d9ae48..f1a2511 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -15,18 +15,25 @@
 import 'package:watcher/watcher.dart';
 
 /**
- * The name of the directory containing plugin specific subfolders used to
- * store data across sessions.
+ * The name of the directory containing plugin specific subfolders used to store
+ * data across sessions.
  */
 const String _SERVER_DIR = ".dartServer";
 
 /**
- * Returns the path to the user's home directory.
+ * Returns the path to default state location.
+ *
+ * Generally this is ~/.dartServer. It can be overridden via the
+ * ANALYZER_STATE_LOCATION_OVERRIDE environment variable, in which case this
+ * method will return the contents of that environment variable.
  */
 String _getStandardStateLocation() {
-  final home = io.Platform.isWindows
-      ? io.Platform.environment['LOCALAPPDATA']
-      : io.Platform.environment['HOME'];
+  final Map<String, String> env = io.Platform.environment;
+  if (env.containsKey('ANALYZER_STATE_LOCATION_OVERRIDE')) {
+    return env['ANALYZER_STATE_LOCATION_OVERRIDE'];
+  }
+
+  final home = io.Platform.isWindows ? env['LOCALAPPDATA'] : env['HOME'];
   return home != null && io.FileSystemEntity.isDirectorySync(home)
       ? join(home, _SERVER_DIR)
       : null;
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 748d8dc..578c149 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -245,9 +245,13 @@
           }
         });
 
-        // TODO(scheglov) Only for new libraries?
-        _component.computeCanonicalNames();
-        _component.accept(new _ShadowCleaner());
+        _ShadowCleaner cleaner = new _ShadowCleaner();
+        for (var library in _component.libraries) {
+          if (!_results.containsKey(library.importUri)) {
+            _component.computeCanonicalNamesForLibrary(library);
+            library.accept(cleaner);
+          }
+        }
 
         _logger.run('Compute dependencies', _computeDependencies);
 
@@ -420,6 +424,11 @@
   }
 
   @override
+  Declaration getAbstractClassInstantiationError(loader) {
+    return loader.coreLibrary.getConstructor('Exception');
+  }
+
+  @override
   Declaration getDuplicatedFieldInitializerError(loader) {
     return loader.coreLibrary.getConstructor('Exception');
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
index ea14d1d..59be9f0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
@@ -108,9 +108,13 @@
     if (newRepository != null) {
       _indexNewMetadata(newRepository);
       if (repository != null) {
-        newRepository.mapping.addAll(repository.mapping);
+        // Copy the new (partial) metadata into the existing metadata repository
+        // and replace the reference to the partial data with the full data.
+        repository.mapping.addAll(newRepository.mapping);
+        newComponent.metadata[AnalyzerMetadataRepository.TAG] = repository;
+      } else {
+        repository = newRepository;
       }
-      repository = newRepository;
     } else {
       newComponent.metadata[AnalyzerMetadataRepository.TAG] = repository;
     }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 7a6d522..c655ac4 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -1643,7 +1643,7 @@
  *        [ImplementsClause]?
  *        '{' [ClassMember]* '}'
  */
-class ClassDeclarationImpl extends NamedCompilationUnitMemberImpl
+class ClassDeclarationImpl extends ClassOrMixinDeclarationImpl
     implements ClassDeclaration {
   /**
    * The 'abstract' keyword, or `null` if the keyword was absent.
@@ -1658,12 +1658,6 @@
   Token classKeyword;
 
   /**
-   * The type parameters for the class, or `null` if the class does not have any
-   * type parameters.
-   */
-  TypeParameterListImpl _typeParameters;
-
-  /**
    * The extends clause for the class, or `null` if the class does not extend
    * any other class.
    */
@@ -1676,35 +1670,12 @@
   WithClauseImpl _withClause;
 
   /**
-   * The implements clause for the class, or `null` if the class does not
-   * implement any interfaces.
-   */
-  ImplementsClauseImpl _implementsClause;
-
-  /**
    * The native clause for the class, or `null` if the class does not have a
    * native clause.
    */
   NativeClauseImpl _nativeClause;
 
   /**
-   * The left curly bracket.
-   */
-  @override
-  Token leftBracket;
-
-  /**
-   * The members defined by the class.
-   */
-  NodeList<ClassMember> _members;
-
-  /**
-   * The right curly bracket.
-   */
-  @override
-  Token rightBracket;
-
-  /**
    * Initialize a newly created class declaration. Either or both of the
    * [comment] and [metadata] can be `null` if the class does not have the
    * corresponding attribute. The [abstractKeyword] can be `null` if the class
@@ -1724,15 +1695,13 @@
       ExtendsClauseImpl extendsClause,
       WithClauseImpl withClause,
       ImplementsClauseImpl implementsClause,
-      this.leftBracket,
+      Token leftBracket,
       List<ClassMember> members,
-      this.rightBracket)
-      : super(comment, metadata, name) {
-    _typeParameters = _becomeParentOf(typeParameters);
+      Token rightBracket)
+      : super(comment, metadata, name, typeParameters, implementsClause,
+            leftBracket, members, rightBracket) {
     _extendsClause = _becomeParentOf(extendsClause);
     _withClause = _becomeParentOf(withClause);
-    _implementsClause = _becomeParentOf(implementsClause);
-    _members = new NodeListImpl<ClassMember>(this, members);
   }
 
   @override
@@ -1757,9 +1726,6 @@
   ClassElement get element => declaredElement;
 
   @override
-  Token get endToken => rightBracket;
-
-  @override
   ExtendsClause get extendsClause => _extendsClause;
 
   @override
@@ -1776,21 +1742,9 @@
   }
 
   @override
-  ImplementsClause get implementsClause => _implementsClause;
-
-  @override
-  void set implementsClause(ImplementsClause implementsClause) {
-    _implementsClause =
-        _becomeParentOf(implementsClause as ImplementsClauseImpl);
-  }
-
-  @override
   bool get isAbstract => abstractKeyword != null;
 
   @override
-  NodeList<ClassMember> get members => _members;
-
-  @override
   NativeClause get nativeClause => _nativeClause;
 
   @override
@@ -1799,14 +1753,6 @@
   }
 
   @override
-  TypeParameterList get typeParameters => _typeParameters;
-
-  @override
-  void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
-  }
-
-  @override
   WithClause get withClause => _withClause;
 
   @override
@@ -1837,44 +1783,6 @@
   }
 
   @override
-  VariableDeclaration getField(String name) {
-    int memberLength = _members.length;
-    for (int i = 0; i < memberLength; i++) {
-      ClassMember classMember = _members[i];
-      if (classMember is FieldDeclaration) {
-        FieldDeclaration fieldDeclaration = classMember;
-        NodeList<VariableDeclaration> fields =
-            fieldDeclaration.fields.variables;
-        int fieldLength = fields.length;
-        for (int i = 0; i < fieldLength; i++) {
-          VariableDeclaration field = fields[i];
-          SimpleIdentifier fieldName = field.name;
-          if (fieldName != null && name == fieldName.name) {
-            return field;
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  MethodDeclaration getMethod(String name) {
-    int length = _members.length;
-    for (int i = 0; i < length; i++) {
-      ClassMember classMember = _members[i];
-      if (classMember is MethodDeclaration) {
-        MethodDeclaration method = classMember;
-        SimpleIdentifier methodName = method.name;
-        if (methodName != null && name == methodName.name) {
-          return method;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _name?.accept(visitor);
@@ -1900,6 +1808,104 @@
       : super(comment, metadata);
 }
 
+abstract class ClassOrMixinDeclarationImpl
+    extends NamedCompilationUnitMemberImpl {
+  /**
+   * The type parameters for the class or mixin,
+   * or `null` if the declaration does not have any type parameters.
+   */
+  TypeParameterListImpl _typeParameters;
+
+  /**
+   * The implements clause for the class or mixin,
+   * or `null` if the declaration does not implement any interfaces.
+   */
+  ImplementsClauseImpl _implementsClause;
+
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The members defined by the class or mixin.
+   */
+  NodeList<ClassMember> _members;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  ClassOrMixinDeclarationImpl(
+      CommentImpl comment,
+      List<Annotation> metadata,
+      SimpleIdentifierImpl name,
+      TypeParameterListImpl typeParameters,
+      ImplementsClauseImpl implementsClause,
+      this.leftBracket,
+      List<ClassMember> members,
+      this.rightBracket)
+      : super(comment, metadata, name) {
+    _typeParameters = _becomeParentOf(typeParameters);
+    _implementsClause = _becomeParentOf(implementsClause);
+    _members = new NodeListImpl<ClassMember>(this, members);
+  }
+
+  Token get endToken => rightBracket;
+
+  ImplementsClause get implementsClause => _implementsClause;
+
+  void set implementsClause(ImplementsClause implementsClause) {
+    _implementsClause =
+        _becomeParentOf(implementsClause as ImplementsClauseImpl);
+  }
+
+  NodeList<ClassMember> get members => _members;
+
+  TypeParameterList get typeParameters => _typeParameters;
+
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  }
+
+  VariableDeclaration getField(String name) {
+    int memberLength = _members.length;
+    for (int i = 0; i < memberLength; i++) {
+      ClassMember classMember = _members[i];
+      if (classMember is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = classMember;
+        NodeList<VariableDeclaration> fields =
+            fieldDeclaration.fields.variables;
+        int fieldLength = fields.length;
+        for (int i = 0; i < fieldLength; i++) {
+          VariableDeclaration field = fields[i];
+          SimpleIdentifier fieldName = field.name;
+          if (fieldName != null && name == fieldName.name) {
+            return field;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  MethodDeclaration getMethod(String name) {
+    int length = _members.length;
+    for (int i = 0; i < length; i++) {
+      ClassMember classMember = _members[i];
+      if (classMember is MethodDeclaration) {
+        MethodDeclaration method = classMember;
+        SimpleIdentifier methodName = method.name;
+        if (methodName != null && name == methodName.name) {
+          return method;
+        }
+      }
+    }
+    return null;
+  }
+}
+
 /**
  * A class type alias.
  *
@@ -7756,6 +7762,112 @@
 }
 
 /**
+ * The declaration of a mixin.
+ *
+ *    mixinDeclaration ::=
+ *        metadata? 'mixin' [SimpleIdentifier] [TypeParameterList]?
+ *        [RequiresClause]? [ImplementsClause]? '{' [ClassMember]* '}'
+ */
+class MixinDeclarationImpl extends ClassOrMixinDeclarationImpl
+    implements MixinDeclaration {
+  @override
+  Token mixinKeyword;
+
+  /**
+   * The on clause for the mixin, or `null` if the mixin does not have any
+   * super-class constraints.
+   */
+  OnClauseImpl _onClause;
+
+  /**
+   * Initialize a newly created mixin declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the mixin does not have the
+   * corresponding attribute. The [typeParameters] can be `null` if the mixin does not
+   * have any type parameters. Either or both of the [onClause],
+   * and [implementsClause] can be `null` if the mixin does not have the
+   * corresponding clause. The list of [members] can be `null` if the mixin does
+   * not have any members.
+   */
+  MixinDeclarationImpl(
+      CommentImpl comment,
+      List<Annotation> metadata,
+      this.mixinKeyword,
+      SimpleIdentifierImpl name,
+      TypeParameterListImpl typeParameters,
+      OnClauseImpl onClause,
+      ImplementsClauseImpl implementsClause,
+      Token leftBracket,
+      List<ClassMember> members,
+      Token rightBracket)
+      : super(comment, metadata, name, typeParameters, implementsClause,
+            leftBracket, members, rightBracket) {
+    _onClause = _becomeParentOf(onClause);
+  }
+
+  @override
+  Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(mixinKeyword)
+    ..add(_name)
+    ..add(_typeParameters)
+    ..add(_onClause)
+    ..add(_implementsClause)
+    ..add(leftBracket)
+    ..addAll(members)
+    ..add(rightBracket);
+
+  @override
+//  MixinElement get declaredElement => _name?.staticElement as MixinElement;
+  Element get declaredElement => throw new UnimplementedError();
+
+  @deprecated
+  @override
+  Element get element => declaredElement;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    return mixinKeyword;
+  }
+
+  @override
+  ImplementsClause get implementsClause => _implementsClause;
+
+  void set implementsClause(ImplementsClause implementsClause) {
+    _implementsClause =
+        _becomeParentOf(implementsClause as ImplementsClauseImpl);
+  }
+
+  @override
+  NodeList<ClassMember> get members => _members;
+
+  @override
+  OnClause get onClause => _onClause;
+
+  void set onClause(OnClause onClause) {
+    _onClause = _becomeParentOf(onClause as OnClauseImpl);
+  }
+
+  @override
+  TypeParameterList get typeParameters => _typeParameters;
+
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
+  }
+
+  @override
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitMixinDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _name?.accept(visitor);
+    _typeParameters?.accept(visitor);
+    _onClause?.accept(visitor);
+    _implementsClause?.accept(visitor);
+    members.accept(visitor);
+  }
+}
+
+/**
  * A node that declares a single name within the scope of a compilation unit.
  */
 abstract class NamedCompilationUnitMemberImpl extends CompilationUnitMemberImpl
@@ -8377,6 +8489,53 @@
 }
 
 /**
+ * The "on" clause in a mixin declaration.
+ *
+ *    onClause ::=
+ *        'on' [TypeName] (',' [TypeName])*
+ */
+class OnClauseImpl extends AstNodeImpl implements OnClause {
+  @override
+  Token onKeyword;
+
+  /**
+   * The classes are super-class constraints for the mixin.
+   */
+  NodeList<TypeName> _superclassConstraints;
+
+  /**
+   * Initialize a newly created on clause.
+   */
+  OnClauseImpl(this.onKeyword, List<TypeName> superclassConstraints) {
+    _superclassConstraints =
+        new NodeListImpl<TypeName>(this, superclassConstraints);
+  }
+
+  @override
+  Token get beginToken => onKeyword;
+
+  @override
+  // TODO(paulberry): add commas.
+  Iterable<SyntacticEntity> get childEntities => new ChildEntities()
+    ..add(onKeyword)
+    ..addAll(superclassConstraints);
+
+  @override
+  Token get endToken => _superclassConstraints.endToken;
+
+  @override
+  NodeList<TypeName> get superclassConstraints => _superclassConstraints;
+
+  @override
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitOnClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _superclassConstraints.accept(visitor);
+  }
+}
+
+/**
  * A parenthesized expression.
  *
  *    parenthesizedExpression ::=
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 643c888..7adb96a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -723,6 +723,30 @@
           target, operator, methodName, typeArguments, argumentList);
 
   @override
+  MixinDeclaration mixinDeclaration(
+          Comment comment,
+          List<Annotation> metadata,
+          Token mixinKeyword,
+          SimpleIdentifier name,
+          TypeParameterList typeParameters,
+          OnClause onClause,
+          ImplementsClause implementsClause,
+          Token leftBracket,
+          List<ClassMember> members,
+          Token rightBracket) =>
+      new MixinDeclarationImpl(
+          comment,
+          metadata,
+          mixinKeyword,
+          name,
+          typeParameters,
+          onClause,
+          implementsClause,
+          leftBracket,
+          members,
+          rightBracket);
+
+  @override
   NamedExpression namedExpression(Label name, Expression expression) =>
       new NamedExpressionImpl(name, expression);
 
@@ -743,6 +767,10 @@
   NullLiteral nullLiteral(Token literal) => new NullLiteralImpl(literal);
 
   @override
+  OnClause onClause(Token onKeyword, List<TypeName> superclassConstraints) =>
+      new OnClauseImpl(onKeyword, superclassConstraints);
+
+  @override
   ParenthesizedExpression parenthesizedExpression(Token leftParenthesis,
           Expression expression, Token rightParenthesis) =>
       new ParenthesizedExpressionImpl(
@@ -859,6 +887,7 @@
   @override
   SuperExpression superExpression(Token superKeyword) =>
       new SuperExpressionImpl(superKeyword);
+
   @override
   SwitchCase switchCase(List<Label> labels, Token keyword,
           Expression expression, Token colon, List<Statement> statements) =>
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index cb51084..cd0aa53 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -740,6 +740,20 @@
           cloneNode(node.argumentList));
 
   @override
+  AstNode visitMixinDeclaration(MixinDeclaration node) =>
+      astFactory.mixinDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.mixinKeyword),
+          cloneNode(node.name),
+          cloneNode(node.typeParameters),
+          cloneNode(node.onClause),
+          cloneNode(node.implementsClause),
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.members),
+          cloneToken(node.rightBracket));
+
+  @override
   NamedExpression visitNamedExpression(NamedExpression node) => astFactory
       .namedExpression(cloneNode(node.name), cloneNode(node.expression));
 
@@ -757,6 +771,10 @@
       astFactory.nullLiteral(cloneToken(node.literal));
 
   @override
+  AstNode visitOnClause(OnClause node) => astFactory.onClause(
+      cloneToken(node.onKeyword), cloneNodeList(node.superclassConstraints));
+
+  @override
   ParenthesizedExpression visitParenthesizedExpression(
           ParenthesizedExpression node) =>
       astFactory.parenthesizedExpression(cloneToken(node.leftParenthesis),
@@ -1817,6 +1835,22 @@
   }
 
   @override
+  bool visitMixinDeclaration(MixinDeclaration node) {
+    MixinDeclaration other = _other as MixinDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.mixinKeyword, other.mixinKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.typeParameters, other.typeParameters) &&
+        isEqualNodes(node.onClause, other.onClause) &&
+        isEqualNodes(node.implementsClause, other.implementsClause) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.members, other.members) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression other = _other as NamedExpression;
     return isEqualNodes(node.name, other.name) &&
@@ -1845,6 +1879,14 @@
   }
 
   @override
+  bool visitOnClause(OnClause node) {
+    OnClause other = _other as OnClause;
+    return isEqualTokens(node.onKeyword, other.onKeyword) &&
+        _isEqualNodeLists(
+            node.superclassConstraints, other.superclassConstraints);
+  }
+
+  @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression other = _other as ParenthesizedExpression;
     return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
@@ -3517,6 +3559,20 @@
   }
 
   @override
+  AstNode visitMixinDeclaration(MixinDeclaration node) =>
+      astFactory.mixinDeclaration(
+          _cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata),
+          _mapToken(node.mixinKeyword),
+          _cloneNode(node.name),
+          _cloneNode(node.typeParameters),
+          _cloneNode(node.onClause),
+          _cloneNode(node.implementsClause),
+          _mapToken(node.leftBracket),
+          _cloneNodeList(node.members),
+          _mapToken(node.rightBracket));
+
+  @override
   NamedExpression visitNamedExpression(NamedExpression node) {
     NamedExpression copy = astFactory.namedExpression(
         _cloneNode(node.name), _cloneNode(node.expression));
@@ -3541,6 +3597,10 @@
   }
 
   @override
+  AstNode visitOnClause(OnClause node) => astFactory.onClause(
+      _mapToken(node.onKeyword), _cloneNodeList(node.superclassConstraints));
+
+  @override
   ParenthesizedExpression visitParenthesizedExpression(
       ParenthesizedExpression node) {
     ParenthesizedExpression copy = astFactory.parenthesizedExpression(
@@ -4912,6 +4972,33 @@
   }
 
   @override
+  bool visitMixinDeclaration(MixinDeclaration node) {
+    if (identical(node.documentationComment, _oldNode)) {
+      node.documentationComment = _newNode as Comment;
+      return true;
+    } else if (_replaceInList(node.metadata)) {
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      (node as MixinDeclarationImpl).typeParameters =
+          _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.onClause, _oldNode)) {
+      (node as MixinDeclarationImpl).onClause = _newNode as OnClause;
+      return true;
+    } else if (identical(node.implementsClause, _oldNode)) {
+      (node as MixinDeclarationImpl).implementsClause =
+          _newNode as ImplementsClause;
+      return true;
+    } else if (_replaceInList(node.members)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitNamedExpression(NamedExpression node) {
     if (identical(node.name, _oldNode)) {
       node.name = _newNode as Label;
@@ -4969,6 +5056,14 @@
   bool visitNullLiteral(NullLiteral node) => visitNode(node);
 
   @override
+  bool visitOnClause(OnClause node) {
+    if (_replaceInList(node.superclassConstraints)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     if (identical(node.expression, _oldNode)) {
       node.expression = _newNode as Expression;
@@ -6193,6 +6288,22 @@
   }
 
   @override
+  bool visitMixinDeclaration(MixinDeclaration node) {
+    MixinDeclaration toNode = this._toNode as MixinDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.mixinKeyword, toNode.mixinKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualNodes(node.onClause, toNode.onClause),
+        _isEqualNodes(node.implementsClause, toNode.implementsClause),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.members, toNode.members),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression toNode = this._toNode as NamedExpression;
     if (_and(_isEqualNodes(node.name, toNode.name),
@@ -6230,6 +6341,15 @@
   }
 
   @override
+  bool visitOnClause(OnClause node) {
+    OnClause toNode = this._toNode as OnClause;
+    return _and(
+        _isEqualTokens(node.onKeyword, toNode.onKeyword),
+        _isEqualNodeLists(
+            node.superclassConstraints, toNode.superclassConstraints));
+  }
+
+  @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
     if (_and(
@@ -7688,6 +7808,20 @@
   }
 
   @override
+  bool visitMixinDeclaration(MixinDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("mixin ");
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _visitNodeWithPrefix(" ", node.onClause);
+    _visitNodeWithPrefix(" ", node.implementsClause);
+    _writer.print(" {");
+    _visitNodeListWithSeparator(node.members, " ");
+    _writer.print("}");
+    return null;
+  }
+
+  @override
   Object visitNamedExpression(NamedExpression node) {
     _visitNode(node.name);
     _visitNodeWithPrefix(" ", node.expression);
@@ -7716,6 +7850,13 @@
   }
 
   @override
+  bool visitOnClause(OnClause node) {
+    _writer.print('on ');
+    _visitNodeListWithSeparator(node.superclassConstraints, ", ");
+    return null;
+  }
+
+  @override
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     _writer.print('(');
     _visitNode(node.expression);
@@ -9003,6 +9144,20 @@
   }
 
   @override
+  bool visitMixinDeclaration(MixinDeclaration node) {
+    safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    sink.write("mixin ");
+    safelyVisitNode(node.name);
+    safelyVisitNode(node.typeParameters);
+    safelyVisitNodeWithPrefix(" ", node.onClause);
+    safelyVisitNodeWithPrefix(" ", node.implementsClause);
+    sink.write(" {");
+    safelyVisitNodeListWithSeparator(node.members, " ");
+    sink.write("}");
+    return null;
+  }
+
+  @override
   Object visitNamedExpression(NamedExpression node) {
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(" ", node.expression);
@@ -9031,6 +9186,13 @@
   }
 
   @override
+  bool visitOnClause(OnClause node) {
+    sink.write('on ');
+    safelyVisitNodeListWithSeparator(node.superclassConstraints, ", ");
+    return null;
+  }
+
+  @override
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     sink.write('(');
     safelyVisitNode(node.expression);
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 9bcc88bd..81f3e41 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.dart.constant.utilities;
-
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 1726409..8bd4925 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -690,6 +690,7 @@
       elementAnnotations = _createElementAnnotations(node.metadata);
     }
     _setVariableDeclarationListAnnotations(node, elementAnnotations);
+    _setVariableDeclarationListCodeRanges(node);
     return null;
   }
 
@@ -1312,6 +1313,7 @@
     List<ElementAnnotation> elementAnnotations =
         _createElementAnnotations(node.metadata);
     _setVariableDeclarationListAnnotations(node, elementAnnotations);
+    _setVariableDeclarationListCodeRanges(node);
     return null;
   }
 
@@ -1613,11 +1615,21 @@
       List<ElementAnnotation> elementAnnotations) {
     for (VariableDeclaration variableDeclaration in node.variables) {
       ElementImpl element = variableDeclaration.declaredElement as ElementImpl;
-      _setCodeRange(element, node.parent);
       element.metadata = elementAnnotations;
     }
   }
 
+  void _setVariableDeclarationListCodeRanges(VariableDeclarationList node) {
+    List<VariableDeclaration> variables = node.variables;
+    for (var i = 0; i < variables.length; i++) {
+      var variable = variables[i];
+      var offset = (i == 0 ? node.parent : variable).offset;
+      var length = variable.end - offset;
+      var element = variable.declaredElement as ElementImpl;
+      element.setCodeRange(offset, length);
+    }
+  }
+
   /**
    * Make the given holder be the current holder while visiting the given node.
    *
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9572717..e99cc46 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -7990,6 +7990,10 @@
 
   @override
   int get codeLength {
+    if (_kernel != null) {
+      var metadata = AnalyzerMetadata.forNode(_kernel);
+      return metadata?.codeLength;
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.codeRange?.length;
     }
@@ -7998,6 +8002,10 @@
 
   @override
   int get codeOffset {
+    if (_kernel != null) {
+      var metadata = AnalyzerMetadata.forNode(_kernel);
+      return metadata?.codeOffset;
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.codeRange?.offset;
     }
@@ -8288,6 +8296,10 @@
 
   @override
   int get codeLength {
+    if (_kernel != null) {
+      var metadata = AnalyzerMetadata.forNode(_kernel);
+      return metadata?.codeLength;
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.codeRange?.length;
     }
@@ -8296,6 +8308,10 @@
 
   @override
   int get codeOffset {
+    if (_kernel != null) {
+      var metadata = AnalyzerMetadata.forNode(_kernel);
+      return metadata?.codeOffset;
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.codeRange?.offset;
     }
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index ac0dd3e..9ca8202 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -527,8 +527,8 @@
 
   static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode(
       'MISSING_CLASS_BODY',
-      "A class definition must have a body, even if it is empty.",
-      correction: "Try adding a class body.");
+      "A class or mixin definition must have a body, even if it is empty.",
+      correction: "Try adding a body to your class or mixin.");
 
   static const ParserErrorCode MISSING_CLOSING_PARENTHESIS =
       const ParserErrorCode(
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 764c982..2fde37f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1144,8 +1144,13 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     assert(optionalOrNull('this', thisKeyword));
     assert(thisKeyword == null
         ? periodAfterThis == null
@@ -1734,10 +1739,11 @@
   }
 
   @override
-  void endClassBody(int memberCount, Token leftBracket, Token rightBracket) {
+  void endClassOrMixinBody(
+      int memberCount, Token leftBracket, Token rightBracket) {
     assert(optional('{', leftBracket));
     assert(optional('}', rightBracket));
-    debugEvent("ClassBody");
+    debugEvent("ClassOrMixinBody");
 
     classDeclaration.leftBracket = leftBracket;
     classDeclaration.rightBracket = rightBracket;
@@ -1773,7 +1779,8 @@
   }
 
   @override
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
     assert(optionalOrNull('implements', implementsKeyword));
     debugEvent("ClassImplements");
 
@@ -1805,7 +1812,8 @@
     Token abstractKeyword = modifiers?.abstractKeyword;
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, begin);
-    // leftBracket, members, and rightBracket are set in [endClassBody].
+    // leftBracket, members, and rightBracket
+    // are set in [endClassOrMixinBody].
     classDeclaration = ast.classDeclaration(
       comment,
       metadata,
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 9cb7174..614fadb 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -266,6 +266,12 @@
             offset,
             length);
         return;
+      case "FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR":
+        errorReporter?.reportErrorForOffset(
+            CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+            offset,
+            length);
+        return;
       case "FINAL_AND_COVARIANT":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.FINAL_AND_COVARIANT, offset, length);
@@ -279,6 +285,14 @@
         errorReporter?.reportErrorForOffset(
             StaticWarningCode.FINAL_NOT_INITIALIZED, offset, length, [name]);
         return;
+      case "FINAL_NOT_INITIALIZED_CONSTRUCTOR_1":
+        String name = arguments['name'];
+        errorReporter?.reportErrorForOffset(
+            StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
+            offset,
+            length,
+            [name]);
+        return;
       case "FUNCTION_TYPED_PARAMETER_VAR":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, offset, length);
@@ -388,6 +402,10 @@
         _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
             offset, length);
         return;
+      case "INVALID_SUPER_INVOCATION":
+        errorReporter?.reportErrorForOffset(
+            StrongModeCode.INVALID_SUPER_INVOCATION, offset, length);
+        return;
       case "INVALID_UNICODE_ESCAPE":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.INVALID_UNICODE_ESCAPE, offset, length);
@@ -567,6 +585,12 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.STATIC_OPERATOR, offset, length);
         return;
+      case "SUPER_IN_REDIRECTING_CONSTRUCTOR":
+        errorReporter?.reportErrorForOffset(
+            CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
+            offset,
+            length);
+        return;
       case "SWITCH_HAS_CASE_AFTER_DEFAULT_CASE":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, offset, length);
@@ -660,11 +684,6 @@
   }
 
   void reportCompilationMessage(CompilationMessage message) {
-    // TODO(scheglov) https://github.com/dart-lang/sdk/issues/33680
-    if (message.code == 'MissingImplementationCause') {
-      return;
-    }
-
     String errorCodeStr = message.analyzerCode;
     ErrorCode errorCode = _getErrorCode(errorCodeStr);
     if (errorCode != null) {
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 26afda9..6a416b6 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -128,8 +128,10 @@
     node.leftHandSide.accept(this);
     node.rightHandSide.accept(this);
 
-    SyntacticEntity entity = _getAssignmentEntity(node.leftHandSide);
-    var data = _get(entity);
+    SyntacticEntity entity =
+        _getAssignmentEntity(node.leftHandSide) ?? node.operator;
+    var data = _get(entity,
+        isSynthetic: entity is SimpleIdentifier && entity.isSynthetic);
     node.staticElement = _translateAuxiliaryReference(data.combiner);
     node.staticType = _translateType(data.inferredType);
   }
@@ -557,7 +559,8 @@
   @override
   void visitPostfixExpression(PostfixExpression node) {
     node.operand.accept(this);
-    SyntacticEntity entity = _getAssignmentEntity(node.operand);
+    SyntacticEntity entity =
+        _getAssignmentEntity(node.operand) ?? node.operator;
     var data = _get(entity);
     node.staticElement = _translateAuxiliaryReference(data.combiner);
     node.staticType = _translateType(data.inferredType);
@@ -577,7 +580,8 @@
     if (tokenType.isIncrementOperator) {
       // ++v;
       // This is an assignment, it is associated with the operand.
-      SyntacticEntity entity = _getAssignmentEntity(node.operand);
+      SyntacticEntity entity =
+          _getAssignmentEntity(node.operand) ?? node.operator;
       var data = _get(entity);
       node.staticElement = _translateAuxiliaryReference(data.combiner);
       node.staticType = _translateType(data.inferredType);
@@ -749,8 +753,7 @@
     } else if (leftHandSide is ParenthesizedExpression) {
       return leftHandSide.rightParenthesis;
     } else {
-      throw new StateError(
-          'Unexpected LHS (${leftHandSide.runtimeType}) $leftHandSide');
+      return null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 24c2adc..81ff987 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -791,11 +791,13 @@
   void variableAssign(
       ExpressionJudgment judgment,
       int location,
+      bool isSyntheticLhs,
       DartType writeContext,
       covariant VariableDeclarationBinder writeVariableBinder,
       Node combiner,
       DartType inferredType) {
     _store(location,
+        isSynthetic: isSyntheticLhs,
         declaration: writeVariableBinder?.fileOffset,
         isWriteReference: true,
         writeContext: writeContext,
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 3cd2978..e916ae7 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -397,7 +397,6 @@
       _errorReporter.reportErrorForToken(
           CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, node.awaitKeyword);
     }
-    _checkForUseOfVoidResult(node.expression);
     return super.visitAwaitExpression(node);
   }
 
@@ -5269,7 +5268,8 @@
       if (toType.isDynamic || toType.isDartCoreNull || toType.isBottom) {
         return;
       }
-    } else {
+    }
+    if (!expectedType.isVoid && !fromType.isVoid) {
       var checkWithType = (!_inAsync)
           ? fromType
           : _typeProvider.futureType.instantiate(<DartType>[fromType]);
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 1e09202..82e23f4 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -58,6 +58,21 @@
   }
 
   @override
+  set parseGenericMethods(_) {}
+
+  /// Append the given token to the end of the token stream,
+  /// and update the token's offset.
+  appendToken(Token token, Token newToken) {
+    while (!token.next.isEof) {
+      token = token.next;
+    }
+    newToken
+      ..offset = token.end
+      ..setNext(token.next);
+    token.setNext(newToken);
+  }
+
+  @override
   Expression parseAdditiveExpression() => parseExpression2();
 
   @override
@@ -69,6 +84,18 @@
   }
 
   @override
+  Expression parseArgument() {
+    currentToken = new SimpleToken(TokenType.OPEN_PAREN, 0)
+      ..setNext(currentToken);
+    appendToken(currentToken, new SimpleToken(TokenType.CLOSE_PAREN, 0));
+    currentToken = fastaParser
+        .parseArguments(fastaParser.syntheticPreviousToken(currentToken))
+        .next;
+    MethodInvocation invocation = astBuilder.pop();
+    return invocation.argumentList.arguments[0];
+  }
+
+  @override
   ArgumentList parseArgumentList() {
     currentToken = fastaParser
         .parseArguments(fastaParser.syntheticPreviousToken(currentToken))
@@ -107,7 +134,7 @@
       <ClassMember>[],
       null /* rightBracket */,
     );
-    currentToken = fastaParser.parseClassMember(currentToken);
+    currentToken = fastaParser.parseClassOrMixinMember(currentToken);
     ClassDeclaration declaration = astBuilder.classDeclaration;
     astBuilder.classDeclaration = null;
     return declaration.members.isNotEmpty ? declaration.members[0] : null;
@@ -339,18 +366,6 @@
 
   @override
   Expression parseUnaryExpression() => parseExpression2();
-
-  /// Append the given token to the end of the token stream,
-  /// and update the token's offset.
-  appendToken(Token token, Token newToken) {
-    while (!token.next.isEof) {
-      token = token.next;
-    }
-    newToken
-      ..offset = token.end
-      ..setNext(token.next);
-    token.setNext(newToken);
-  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index 156b98df..4551401 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -990,7 +990,8 @@
     bool isCovariant = isField
         ? (variables.parent as FieldDeclaration).covariantKeyword != null
         : false;
-    for (VariableDeclaration variable in variables.variables) {
+    for (int i = 0; i < variables.variables.length; i++) {
+      VariableDeclaration variable = variables.variables[i];
       UnlinkedVariableBuilder b = new UnlinkedVariableBuilder();
       b.isConst = variables.isConst;
       b.isCovariant = isCovariant;
@@ -1001,7 +1002,13 @@
       b.type = serializeType(variables.type);
       b.documentationComment = serializeDocumentation(documentationComment);
       b.annotations = serializeAnnotations(annotations);
-      b.codeRange = serializeCodeRange(variables.parent);
+
+      {
+        int offset = (i == 0 ? variables.parent : variable).offset;
+        int length = variable.end - offset;
+        b.codeRange = new CodeRangeBuilder(offset: offset, length: length);
+      }
+
       bool serializeBodyExpr = variable.isConst ||
           variable.isFinal && isField && !isDeclaredStatic ||
           variables.type == null;
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index aeb96dc..7b5c8ef 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.32.4
+version: 0.33.0-alpha
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
diff --git a/pkg/analyzer/test/dart/element/builder_test.dart b/pkg/analyzer/test/dart/element/builder_test.dart
index e719c0e..741f593 100644
--- a/pkg/analyzer/test/dart/element/builder_test.dart
+++ b/pkg/analyzer/test/dart/element/builder_test.dart
@@ -175,6 +175,11 @@
       expect(b.initializer, isNull);
     }
   }
+
+  @override
+  void _assertHasVariableInitializer(VariableElement element) {
+    expect(element.initializer, isNull);
+  }
 }
 
 @reflectiveTest
@@ -747,7 +752,7 @@
     var code = 'class C { C() { var v = 1; } }';
     buildElementsForText(code);
     var v = findLocalVariable(code, 'v =');
-    assertHasCodeRange(v, 16, 10);
+    assertHasCodeRange(v, 16, 9);
     expect(v.hasImplicitType, isTrue);
     expect(v.name, 'v');
     _assertVisibleRange(v, 14, 28);
@@ -1798,40 +1803,35 @@
   }
 
   void test_visitFieldDeclaration() {
-    String firstFieldName = "x";
-    String secondFieldName = "y";
-    FieldDeclaration fieldDeclaration =
-        AstTestFactory.fieldDeclaration2(false, null, [
-      AstTestFactory.variableDeclaration(firstFieldName),
-      AstTestFactory.variableDeclaration(secondFieldName)
-    ]);
-    fieldDeclaration.documentationComment = AstTestFactory.documentationComment(
-        [TokenFactory.tokenFromString('/// aaa')..offset = 50], []);
-    fieldDeclaration.endToken.offset = 110;
-
-    ElementHolder holder = buildElementsForAst(fieldDeclaration);
-    List<FieldElement> fields = holder.fields;
+    var holder = buildElementsForText(r'''
+class C {
+  /// aaa
+  int x = 1, y;
+}
+''');
+    ClassElement c = holder.types.single;
+    List<FieldElement> fields = c.fields;
     expect(fields, hasLength(2));
 
-    FieldElement firstField = fields[0];
-    expect(firstField, isNotNull);
-    assertHasCodeRange(firstField, 50, 61);
-    expect(firstField.documentationComment, '/// aaa');
-    expect(firstField.name, firstFieldName);
-    expect(firstField.initializer, isNull);
-    expect(firstField.isConst, isFalse);
-    expect(firstField.isFinal, isFalse);
-    expect(firstField.isSynthetic, isFalse);
+    FieldElement x = fields[0];
+    expect(x, isNotNull);
+    assertHasCodeRange(x, 12, 19);
+    expect(x.documentationComment, '/// aaa');
+    expect(x.name, 'x');
+    _assertHasVariableInitializer(x);
+    expect(x.isConst, isFalse);
+    expect(x.isFinal, isFalse);
+    expect(x.isSynthetic, isFalse);
 
-    FieldElement secondField = fields[1];
-    expect(secondField, isNotNull);
-    assertHasCodeRange(secondField, 50, 61);
-    expect(secondField.documentationComment, '/// aaa');
-    expect(secondField.name, secondFieldName);
-    expect(secondField.initializer, isNull);
-    expect(secondField.isConst, isFalse);
-    expect(secondField.isFinal, isFalse);
-    expect(secondField.isSynthetic, isFalse);
+    FieldElement y = fields[1];
+    expect(y, isNotNull);
+    assertHasCodeRange(y, 33, 1);
+    expect(y.documentationComment, '/// aaa');
+    expect(y.name, 'y');
+    expect(y.initializer, isNull);
+    expect(y.isConst, isFalse);
+    expect(y.isFinal, isFalse);
+    expect(y.isSynthetic, isFalse);
   }
 
   void test_visitFieldFormalParameter() {
@@ -2551,6 +2551,10 @@
     expect(typeParameterElement.bound, isNull);
     expect(typeParameterElement.isSynthetic, isFalse);
   }
+
+  void _assertHasVariableInitializer(VariableElement element) {
+    expect(element.initializer, isNotNull);
+  }
 }
 
 abstract class _BaseTest extends ParserTestCase {
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 7fc7f6c..d6835c5 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -77,13 +77,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33827')
-  test_conflictingTypeVariableAndMember_setter() async {
-    await super.test_conflictingTypeVariableAndMember_setter();
-  }
-
-  @override
-  @failingTest
   test_constConstructorWithNonFinalField_super() async {
     await super.test_constConstructorWithNonFinalField_super();
   }
@@ -308,25 +301,6 @@
 
   @override
   @failingTest
-  test_fieldInitializerRedirectingConstructor_afterRedirection() async {
-    return super.test_fieldInitializerRedirectingConstructor_afterRedirection();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializerRedirectingConstructor_beforeRedirection() async {
-    return super
-        .test_fieldInitializerRedirectingConstructor_beforeRedirection();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializingFormalRedirectingConstructor() async {
-    return super.test_fieldInitializingFormalRedirectingConstructor();
-  }
-
-  @override
-  @failingTest
   test_genericFunctionTypeArgument_class() async {
     await super.test_genericFunctionTypeArgument_class();
   }
@@ -1292,15 +1266,9 @@
   }
 
   @override
-  @failingTest
-  test_superInRedirectingConstructor_redirectionSuper() async {
-    return super.test_superInRedirectingConstructor_redirectionSuper();
-  }
-
-  @override
-  @failingTest
+  @failingTest // Deliberately only reports one of the expected errors.
   test_superInRedirectingConstructor_superRedirection() async {
-    return super.test_superInRedirectingConstructor_superRedirection();
+    await super.test_superInRedirectingConstructor_superRedirection();
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 82b8b39..40f2c23 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -108,9 +108,9 @@
   }
 
   @override
-  void beginClassBody(Token token) {
-    super.beginClassBody(token);
-    begin('ClassBody');
+  void beginClassOrMixinBody(Token token) {
+    super.beginClassOrMixinBody(token);
+    begin('ClassOrMixinBody');
   }
 
   @override
@@ -360,7 +360,7 @@
 
   @override
   void beginMember() {
-    expectIn('ClassBody');
+    expectIn('ClassOrMixinBody');
     super.beginMember();
     begin('Member');
   }
@@ -600,9 +600,9 @@
   }
 
   @override
-  void endClassBody(int memberCount, Token beginToken, Token endToken) {
-    end('ClassBody');
-    super.endClassBody(memberCount, beginToken, endToken);
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    end('ClassOrMixinBody');
+    super.endClassOrMixinBody(memberCount, beginToken, endToken);
   }
 
   @override
@@ -749,11 +749,16 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     end('FormalParameter');
     super.endFormalParameter(
-        thisKeyword, periodAfterThis, nameToken, kind, memberKind);
+        thisKeyword, periodAfterThis, nameToken, kind, memberKind, endToken);
   }
 
   @override
@@ -1091,9 +1096,10 @@
   }
 
   @override
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
-    expectIn('ClassDeclaration');
-    listener.handleClassImplements(implementsKeyword, interfacesCount);
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
+    expectInOneOf(['ClassDeclaration', 'MixinDeclaration']);
+    listener.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 92a6f6a..db49d52 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -377,6 +377,11 @@
     return _parseExpression(code);
   }
 
+  Expression parseArgument(String source) {
+    createParser(source);
+    return _parserProxy.parseArgument();
+  }
+
   @override
   Expression parseAssignableExpression(String code, bool primaryAllowed) {
     return _parseExpression(code);
@@ -838,7 +843,7 @@
 
   @override
   ClassMember parseClassMember(String className) {
-    return _run('ClassBody', () => super.parseClassMember(className));
+    return _run('ClassOrMixinBody', () => super.parseClassMember(className));
   }
 
   List<Combinator> parseCombinators() {
@@ -1018,7 +1023,22 @@
 
 @reflectiveTest
 class SimpleParserTest_Fasta extends FastaParserTestCase
-    with SimpleParserTestMixin {}
+    with SimpleParserTestMixin {
+  test_parseArgument() {
+    Expression result = parseArgument('3');
+    expect(result, const TypeMatcher<IntegerLiteral>());
+    IntegerLiteral literal = result;
+    expect(literal.value, 3);
+  }
+
+  test_parseArgument_named() {
+    Expression result = parseArgument('foo: "a"');
+    expect(result, const TypeMatcher<NamedExpression>());
+    NamedExpression expression = result;
+    StringLiteral literal = expression.expression;
+    expect(literal.stringValue, 'a');
+  }
+}
 
 /**
  * Tests of the fasta parser based on [StatementParserTestMixin].
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 3b5df26..8a3a172 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -10,14 +10,16 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:front_end/src/fasta/scanner/abstract_scanner.dart';
+import 'package:front_end/src/fasta/scanner.dart'
+    show ScannerResult, scanString;
+import 'package:front_end/src/fasta/scanner/abstract_scanner.dart'
+    show AbstractScanner;
+import 'package:front_end/src/scanner/errors.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -25,7 +27,10 @@
 
 main() {
   // The fasta parser has a parallel set of tests in parser_fasta_test.dart
-  if (Parser.useFasta) return;
+  if (Parser.useFasta) {
+    test('useFasta', () => true);
+    return;
+  }
 
   defineReflectiveSuite(() {
     defineReflectiveTests(ClassMemberParserTest);
@@ -9967,17 +9972,32 @@
    * prepared to parse the tokens scanned from the given [content].
    */
   void createParser(String content, {int expectedEndOffset}) {
+    Source source = new TestSource();
     listener = new GatheringErrorListener();
+
+    void reportError(
+        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      listener
+          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
+    }
+
     //
     // Scan the source.
     //
-    TestSource source = new TestSource();
-    CharacterReader reader = new CharSequenceReader(content);
-    Scanner scanner = new Scanner(source, reader, listener);
-    scanner.scanGenericMethodComments = enableGenericMethodComments;
-    scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
-    Token tokenStream = scanner.tokenize();
-    listener.setLineInfo(source, scanner.lineStarts);
+    ScannerResult result = scanString(content,
+        includeComments: true,
+        scanGenericMethodComments: enableGenericMethodComments,
+        scanLazyAssignmentOperators: enableLazyAssignmentOperators);
+    Token token = result.tokens;
+    if (result.hasErrors) {
+      // The default recovery strategy used by scanString
+      // places all error tokens at the head of the stream.
+      while (token.type == TokenType.BAD_INPUT) {
+        translateErrorToken(token, reportError);
+        token = token.next;
+      }
+    }
+    listener.setLineInfo(source, result.lineStarts);
     //
     // Create and initialize the parser.
     //
@@ -9987,7 +10007,7 @@
     parser.parseFunctionBodies = parseFunctionBodies;
     parser.enableNnbd = enableNnbd;
     parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
-    parser.currentToken = tokenStream;
+    parser.currentToken = token;
   }
 
   @override
@@ -10103,15 +10123,36 @@
    * @throws Exception if the source could not be parsed, if the compilation errors in the source do
    *           not match those that are expected, or if the result would have been `null`
    */
-  CompilationUnit parseCompilationUnit(String source,
+  CompilationUnit parseCompilationUnit(String content,
       {List<ErrorCode> codes, List<ExpectedError> errors}) {
+    Source source = new TestSource();
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scanner scanner =
-        new Scanner(null, new CharSequenceReader(source), listener);
-    TestSource testSource = new TestSource();
-    listener.setLineInfo(testSource, scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(testSource, listener);
+
+    void reportError(
+        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      listener
+          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
+    }
+
+    //
+    // Scan the source.
+    //
+    ScannerResult result = scanString(content,
+        includeComments: true,
+        scanGenericMethodComments: enableGenericMethodComments,
+        scanLazyAssignmentOperators: enableLazyAssignmentOperators);
+    Token token = result.tokens;
+    if (result.hasErrors) {
+      // The default recovery strategy used by scanString
+      // places all error tokens at the head of the stream.
+      while (token.type == TokenType.BAD_INPUT) {
+        translateErrorToken(token, reportError);
+        token = token.next;
+      }
+    }
+    listener.setLineInfo(source, result.lineStarts);
+
+    Parser parser = new Parser(source, listener);
     parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     expect(unit, isNotNull);
@@ -10126,17 +10167,40 @@
   }
 
   /**
-   * Parse the given [code] as a compilation unit.
+   * Parse the given [content] as a compilation unit.
    */
-  CompilationUnit parseCompilationUnit2(String code,
+  CompilationUnit parseCompilationUnit2(String content,
       {AnalysisErrorListener listener}) {
+    Source source = NonExistingSource.unknown;
     listener ??= AnalysisErrorListener.NULL_LISTENER;
-    Scanner scanner = new Scanner(null, new CharSequenceReader(code), listener);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(NonExistingSource.unknown, listener);
+
+    void reportError(
+        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      listener
+          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
+    }
+
+    //
+    // Scan the source.
+    //
+    ScannerResult result = scanString(content,
+        includeComments: true,
+        scanGenericMethodComments: enableGenericMethodComments,
+        scanLazyAssignmentOperators: enableLazyAssignmentOperators);
+    Token token = result.tokens;
+    if (result.hasErrors) {
+      // The default recovery strategy used by scanString
+      // places all error tokens at the head of the stream.
+      while (token.type == TokenType.BAD_INPUT) {
+        translateErrorToken(token, reportError);
+        token = token.next;
+      }
+    }
+
+    Parser parser = new Parser(source, listener);
     parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     CompilationUnit unit = parser.parseCompilationUnit(token);
-    unit.lineInfo = new LineInfo(scanner.lineStarts);
+    unit.lineInfo = new LineInfo(result.lineStarts);
     return unit;
   }
 
@@ -10453,22 +10517,42 @@
   }
 
   /**
-   * Parse the given [source] as a statement. If [enableLazyAssignmentOperators]
+   * Parse the given [content] as a statement. If [enableLazyAssignmentOperators]
    * is `true`, then lazy assignment operators should be enabled.
    */
-  Statement parseStatement(String source,
+  Statement parseStatement(String content,
       {bool enableLazyAssignmentOperators, int expectedEndOffset}) {
+    Source source = new TestSource();
     listener = new GatheringErrorListener();
-    Scanner scanner =
-        new Scanner(null, new CharSequenceReader(source), listener);
-    scanner.scanGenericMethodComments = enableGenericMethodComments;
     if (enableLazyAssignmentOperators != null) {
-      scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
+      this.enableLazyAssignmentOperators = enableLazyAssignmentOperators;
     }
-    var testSource = new TestSource();
-    listener.setLineInfo(testSource, scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(testSource, listener);
+
+    void reportError(
+        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      listener
+          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
+    }
+
+    //
+    // Scan the source.
+    //
+    ScannerResult result = scanString(content,
+        includeComments: true,
+        scanGenericMethodComments: enableGenericMethodComments,
+        scanLazyAssignmentOperators: enableLazyAssignmentOperators);
+    Token token = result.tokens;
+    if (result.hasErrors) {
+      // The default recovery strategy used by scanString
+      // places all error tokens at the head of the stream.
+      while (token.type == TokenType.BAD_INPUT) {
+        translateErrorToken(token, reportError);
+        token = token.next;
+      }
+    }
+    listener.setLineInfo(source, result.lineStarts);
+
+    Parser parser = new Parser(source, listener);
     parser.parseGenericMethodComments = enableGenericMethodComments;
     parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     Statement statement = parser.parseStatement(token);
@@ -10487,15 +10571,35 @@
    *           the expected count, if the compilation errors in the source do not match those that
    *           are expected, or if the result would have been `null`
    */
-  List<Statement> parseStatements(String source, int expectedCount,
+  List<Statement> parseStatements(String content, int expectedCount,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+    Source source = new TestSource();
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scanner scanner =
-        new Scanner(null, new CharSequenceReader(source), listener);
-    var testSource = new TestSource();
-    listener.setLineInfo(testSource, scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(testSource, listener);
+
+    void reportError(
+        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      listener
+          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
+    }
+
+    //
+    // Scan the source.
+    //
+    ScannerResult result = scanString(content,
+        scanGenericMethodComments: enableGenericMethodComments,
+        scanLazyAssignmentOperators: enableLazyAssignmentOperators);
+    Token token = result.tokens;
+    if (result.hasErrors) {
+      // The default recovery strategy used by scanString
+      // places all error tokens at the head of the stream.
+      while (token.type == TokenType.BAD_INPUT) {
+        translateErrorToken(token, reportError);
+        token = token.next;
+      }
+    }
+    listener.setLineInfo(source, result.lineStarts);
+
+    Parser parser = new Parser(source, listener);
     parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     List<Statement> statements = parser.parseStatements(token);
     expect(statements, hasLength(expectedCount));
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index 349fda9..6040a18 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -286,18 +286,6 @@
 
   @override
   @failingTest
-  test_finalNotInitialized_instanceField_final() async {
-    return super.test_finalNotInitialized_instanceField_final();
-  }
-
-  @override
-  @failingTest
-  test_finalNotInitialized_instanceField_final_static() async {
-    return super.test_finalNotInitialized_instanceField_final_static();
-  }
-
-  @override
-  @failingTest
   test_generalizedVoid_invocationOfVoidFieldError() async {
     return super.test_generalizedVoid_invocationOfVoidFieldError();
   }
@@ -588,19 +576,4 @@
   test_undefinedIdentifier_function() async {
     return super.test_undefinedIdentifier_function();
   }
-
-  @override
-  test_useOfVoidResult_await() async {
-    return super.test_useOfVoidResult_await();
-  }
-
-  @override
-  test_useOfVoidResult_inForLoop_ok() async {
-    return super.test_useOfVoidResult_inForLoop_ok();
-  }
-
-  @override
-  test_useOfVoidResult_variableDeclaration_method_ok() async {
-    return super.test_useOfVoidResult_variableDeclaration_method_ok();
-  }
 }
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index c23c7b4..7582ed5 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -1743,11 +1743,7 @@
 void f(void x) {}
 ''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
   }
 
   test_generalizedVoid_assignToVoid_notStrong_error() async {
@@ -2088,11 +2084,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
   }
 
   test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
@@ -2114,11 +2106,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
   }
 
   test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
@@ -2140,11 +2128,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
   }
 
   test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
@@ -2166,11 +2150,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
   }
 
   test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
@@ -2182,7 +2162,10 @@
 ''');
     await computeAnalysisResult(source);
     if (useCFE) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+      assertErrors(source, [
+        StaticTypeWarningCode.UNDEFINED_METHOD,
+        StaticWarningCode.USE_OF_VOID_RESULT
+      ]);
     } else {
       assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
     }
@@ -2290,11 +2273,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
   }
 
   test_importDuplicatedLibraryNamed() async {
@@ -4885,10 +4864,7 @@
 }''');
     await computeAnalysisResult(source);
     if (useCFE) {
-      assertErrors(source, [
-        StaticWarningCode.USE_OF_VOID_RESULT,
-        StaticWarningCode.USE_OF_VOID_RESULT
-      ]);
+      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
     } else {
       assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
     }
@@ -4906,10 +4882,7 @@
 }''');
     await computeAnalysisResult(source);
     if (useCFE) {
-      assertErrors(source, [
-        StaticWarningCode.USE_OF_VOID_RESULT,
-        StaticWarningCode.USE_OF_VOID_RESULT
-      ]);
+      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
     } else {
       assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
     }
@@ -4923,7 +4896,7 @@
   await x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -4949,11 +4922,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -4979,11 +4948,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -5025,11 +4990,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (useCFE) {
-      assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 05a13c0..84369c0 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -3188,8 +3188,9 @@
   }
 
   void test_constructorFieldInitializer() {
-    ConstructorFieldInitializer node = AstTestFactory
-        .constructorFieldInitializer(false, "f", AstTestFactory.integer(0));
+    ConstructorFieldInitializer node =
+        AstTestFactory.constructorFieldInitializer(
+            false, "f", AstTestFactory.integer(0));
     _assertReplace(
         node, new Getter_NodeReplacerTest_test_constructorFieldInitializer());
     _assertReplace(
@@ -3342,8 +3343,8 @@
   }
 
   void test_formalParameterList() {
-    FormalParameterList node = AstTestFactory
-        .formalParameterList([AstTestFactory.simpleFormalParameter3("p")]);
+    FormalParameterList node = AstTestFactory.formalParameterList(
+        [AstTestFactory.simpleFormalParameter3("p")]);
     _assertReplace(
         node, new ListGetter_NodeReplacerTest_test_formalParameterList(0));
   }
@@ -3425,8 +3426,8 @@
   }
 
   void test_functionExpressionInvocation() {
-    FunctionExpressionInvocation node = AstTestFactory
-        .functionExpressionInvocation(
+    FunctionExpressionInvocation node =
+        AstTestFactory.functionExpressionInvocation(
             AstTestFactory.identifier3("f"), [AstTestFactory.integer(0)]);
     _assertReplace(
         node, new Getter_NodeReplacerTest_test_functionExpressionInvocation());
@@ -3454,8 +3455,10 @@
   }
 
   void test_functionTypedFormalParameter() {
-    FunctionTypedFormalParameter node = AstTestFactory
-        .functionTypedFormalParameter(AstTestFactory.typeName4("R"), "f",
+    FunctionTypedFormalParameter node =
+        AstTestFactory.functionTypedFormalParameter(
+            AstTestFactory.typeName4("R"),
+            "f",
             [AstTestFactory.simpleFormalParameter3("p")]);
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata = [
@@ -3511,9 +3514,9 @@
   }
 
   void test_instanceCreationExpression() {
-    InstanceCreationExpression node = AstTestFactory
-        .instanceCreationExpression3(null, AstTestFactory.typeName4("C"), "c",
-            [AstTestFactory.integer(2)]);
+    InstanceCreationExpression node =
+        AstTestFactory.instanceCreationExpression3(null,
+            AstTestFactory.typeName4("C"), "c", [AstTestFactory.integer(2)]);
     _assertReplace(
         node, new Getter_NodeReplacerTest_test_instanceCreationExpression_2());
     _assertReplace(
@@ -3539,8 +3542,8 @@
   }
 
   void test_labeledStatement() {
-    LabeledStatement node = AstTestFactory
-        .labeledStatement([AstTestFactory.label2("l")], AstTestFactory.block());
+    LabeledStatement node = AstTestFactory.labeledStatement(
+        [AstTestFactory.label2("l")], AstTestFactory.block());
     _assertReplace(
         node, new ListGetter_NodeReplacerTest_test_labeledStatement(0));
     _assertReplace(node, new Getter_NodeReplacerTest_test_labeledStatement());
@@ -3649,8 +3652,8 @@
   }
 
   void test_partOfDirective() {
-    PartOfDirective node = AstTestFactory
-        .partOfDirective(AstTestFactory.libraryIdentifier2(["lib"]));
+    PartOfDirective node = AstTestFactory.partOfDirective(
+        AstTestFactory.libraryIdentifier2(["lib"]));
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
         .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
@@ -3685,8 +3688,9 @@
   }
 
   void test_redirectingConstructorInvocation() {
-    RedirectingConstructorInvocation node = AstTestFactory
-        .redirectingConstructorInvocation2("c", [AstTestFactory.integer(0)]);
+    RedirectingConstructorInvocation node =
+        AstTestFactory.redirectingConstructorInvocation2(
+            "c", [AstTestFactory.integer(0)]);
     _assertReplace(node,
         new Getter_NodeReplacerTest_test_redirectingConstructorInvocation());
     _assertReplace(node,
@@ -3725,8 +3729,9 @@
   }
 
   void test_superConstructorInvocation() {
-    SuperConstructorInvocation node = AstTestFactory
-        .superConstructorInvocation2("s", [AstTestFactory.integer(1)]);
+    SuperConstructorInvocation node =
+        AstTestFactory.superConstructorInvocation2(
+            "s", [AstTestFactory.integer(1)]);
     _assertReplace(
         node, new Getter_NodeReplacerTest_test_superConstructorInvocation());
     _assertReplace(
@@ -3741,8 +3746,8 @@
   }
 
   void test_switchDefault() {
-    SwitchDefault node = AstTestFactory
-        .switchDefault([AstTestFactory.label2("l")], [AstTestFactory.block()]);
+    SwitchDefault node = AstTestFactory.switchDefault(
+        [AstTestFactory.label2("l")], [AstTestFactory.block()]);
     _testSwitchMember(node);
   }
 
@@ -3751,8 +3756,8 @@
         AstTestFactory.switchStatement(AstTestFactory.identifier3("x"), [
       AstTestFactory.switchCase2([AstTestFactory.label2("l")],
           AstTestFactory.integer(0), [AstTestFactory.block()]),
-      AstTestFactory
-          .switchDefault([AstTestFactory.label2("l")], [AstTestFactory.block()])
+      AstTestFactory.switchDefault(
+          [AstTestFactory.label2("l")], [AstTestFactory.block()])
     ]);
     _assertReplace(node, new Getter_NodeReplacerTest_test_switchStatement());
     _assertReplace(
@@ -3766,8 +3771,10 @@
   }
 
   void test_topLevelVariableDeclaration() {
-    TopLevelVariableDeclaration node = AstTestFactory
-        .topLevelVariableDeclaration(null, AstTestFactory.typeName4("T"),
+    TopLevelVariableDeclaration node =
+        AstTestFactory.topLevelVariableDeclaration(
+            null,
+            AstTestFactory.typeName4("T"),
             [AstTestFactory.variableDeclaration("t")]);
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
@@ -3845,8 +3852,10 @@
   }
 
   void test_variableDeclarationStatement() {
-    VariableDeclarationStatement node = AstTestFactory
-        .variableDeclarationStatement(null, AstTestFactory.typeName4("T"),
+    VariableDeclarationStatement node =
+        AstTestFactory.variableDeclarationStatement(
+            null,
+            AstTestFactory.typeName4("T"),
             [AstTestFactory.variableDeclaration("a")]);
     _assertReplace(
         node, new Getter_NodeReplacerTest_test_variableDeclarationStatement());
@@ -4248,8 +4257,8 @@
 
   void test_printListOfQuotedNames_five() {
     expect(
-        StringUtilities
-            .printListOfQuotedNames(<String>["a", "b", "c", "d", "e"]),
+        StringUtilities.printListOfQuotedNames(
+            <String>["a", "b", "c", "d", "e"]),
         "'a', 'b', 'c', 'd' and 'e'");
   }
 
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
index e4a2e9e..acbef13 100644
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ b/pkg/analyzer/test/src/context/mock_sdk.dart
@@ -302,11 +302,13 @@
 }
 
 class Map<K, V> extends Object {
-  V operator [](K key) => null;
-  void operator []=(K key, V value) {}
   Iterable<K> get keys => null;
   int get length;
   Iterable<V> get values;
+  V operator [](K key) => null;
+  void operator []=(K key, V value) {}
+  Map<RK, RV> cast<RK, RV>();
+  bool containsKey(Object key);
 }
 
 class Duration implements Comparable<Duration> {}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index 7a79612..5b6ae42 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -74,12 +74,6 @@
 
   @override
   @failingTest
-  test_unresolved_methodInvocation_target_unresolved() async {
-    await super.test_unresolved_methodInvocation_target_unresolved();
-  }
-
-  @override
-  @failingTest
   test_unresolved_redirectingFactory_22() async {
     await super.test_unresolved_redirectingFactory_22();
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 4b6176e..390a0ca 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -159,6 +159,13 @@
     }
   }
 
+  void assertUnresolvedInvokeType(DartType invokeType) {
+    if (useCFE) {
+      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/33682
+      expect(invokeType.toString(), '() → dynamic');
+    }
+  }
+
   /// Creates a function that checks that an expression is a reference to a top
   /// level variable with the given [name].
   void Function(Expression) checkTopVarRef(String name) {
@@ -880,6 +887,88 @@
     }
   }
 
+  test_assign_in_const_context() async {
+    addTestFile('''
+void f(num x, int y) {
+  const [x = y];
+}
+''');
+    await resolveTestFile();
+
+    var xRef = findNode.simple('x =');
+    assertType(xRef, 'num');
+    assertElement(xRef, findElement.parameter('x'));
+    var yRef = findNode.simple('y]');
+    assertType(yRef, 'int');
+    assertElement(yRef, findElement.parameter('y'));
+  }
+
+  test_assign_to_ambiguous_type() async {
+    provider.newFile(_p('/test/lib/a.dart'), 'class C {}');
+    provider.newFile(_p('/test/lib/b.dart'), 'class C {}');
+    addTestFile('''
+import 'a.dart';
+import 'b.dart';
+void f(int x) {
+  C = x;
+}
+''');
+    await resolveTestFile();
+
+    var xRef = findNode.simple('x;');
+    assertType(xRef, 'int');
+    assertElement(xRef, findElement.parameter('x'));
+  }
+
+  test_assign_to_class() async {
+    addTestFile('''
+class C {}
+void f(int x) {
+  C = x;
+}
+''');
+    await resolveTestFile();
+
+    var cRef = findNode.simple('C =');
+    assertType(cRef, 'Type');
+    assertElement(cRef, findElement.class_('C'));
+    var xRef = findNode.simple('x;');
+    assertType(xRef, 'int');
+    assertElement(xRef, findElement.parameter('x'));
+  }
+
+  test_assign_to_non_lvalue() async {
+    addTestFile('''
+void f(int x, double y, String z) {
+  x + y = z;
+}
+''');
+    await resolveTestFile();
+
+    var xRef = findNode.simple('x +');
+    assertType(xRef, 'int');
+    assertElement(xRef, findElement.parameter('x'));
+    var yRef = findNode.simple('y =');
+    assertType(yRef, 'double');
+    assertElement(yRef, findElement.parameter('y'));
+    var zRef = findNode.simple('z;');
+    assertType(zRef, 'String');
+    assertElement(zRef, findElement.parameter('z'));
+  }
+
+  test_assign_with_synthetic_lhs() async {
+    addTestFile('''
+void f(int x) {
+  = x;
+}
+''');
+    await resolveTestFile();
+
+    var xRef = findNode.simple('x;');
+    assertType(xRef, 'int');
+    assertElement(xRef, findElement.parameter('x'));
+  }
+
   test_assignment_to_final_parameter() async {
     addTestFile('''
 f(final int x) {
@@ -4405,12 +4494,7 @@
 
     var invocation = findNode.methodInvocation('p(a)');
     expect(invocation.staticType, isDynamicType);
-    if (useCFE) {
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/33682
-      expect(invocation.staticInvokeType.toString(), '() → dynamic');
-    } else {
-      expect(invocation.staticInvokeType, isDynamicType);
-    }
+    assertUnresolvedInvokeType(invocation.staticInvokeType);
 
     var pRef = invocation.methodName;
     assertElement(pRef, import.prefix);
@@ -4438,12 +4522,7 @@
 
     MethodInvocation invocation = statement.expression;
     expect(invocation.staticType, isDynamicType);
-    if (useCFE) {
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/33682
-      expect(invocation.staticInvokeType.toString(), '() → dynamic');
-    } else {
-      expect(invocation.staticInvokeType, typeProvider.intType);
-    }
+    assertUnresolvedInvokeType(invocation.staticInvokeType);
 
     SimpleIdentifier name = invocation.methodName;
     expect(name.staticElement, same(foo.getter));
@@ -9611,12 +9690,7 @@
 
     MethodInvocation invocation = statement.expression;
     expect(invocation.staticType, isDynamicType);
-    if (useCFE) {
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/33682
-      expect(invocation.staticInvokeType.toString(), '() → dynamic');
-    } else {
-      expect(invocation.staticInvokeType, isDynamicType);
-    }
+    assertUnresolvedInvokeType(invocation.staticInvokeType);
 
     SimpleIdentifier target = invocation.target;
     expect(target.staticElement, same(foo.getter));
@@ -9624,12 +9698,7 @@
 
     SimpleIdentifier name = invocation.methodName;
     expect(name.staticElement, isNull);
-    if (useCFE) {
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/33682
-      expect(name.staticType.toString(), '() → dynamic');
-    } else {
-      expect(name.staticType, isDynamicType);
-    }
+    assertUnresolvedInvokeType(name.staticType);
 
     assertTypeArguments(invocation.typeArguments, [intType, doubleType]);
     _assertInvocationArguments(invocation.argumentList,
@@ -9646,20 +9715,17 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    List<Statement> statements = _getMainStatements(result);
-    ExpressionStatement statement = statements[0];
-
-    MethodInvocation invocation = statement.expression;
-    expect(invocation.staticType, isDynamicType);
-    expect(invocation.staticInvokeType, isDynamicType);
+    var invocation = findNode.methodInvocation('foo.bar');
+    assertTypeDynamic(invocation);
+    assertUnresolvedInvokeType(invocation.staticInvokeType);
 
     SimpleIdentifier target = invocation.target;
-    expect(target.staticElement, isNull);
-    expect(target.staticType, isDynamicType);
+    assertElementNull(target);
+    assertTypeDynamic(target);
 
     SimpleIdentifier name = invocation.methodName;
-    expect(name.staticElement, isNull);
-    expect(name.staticType, isDynamicType);
+    assertElementNull(name);
+    assertUnresolvedInvokeType(name.staticType);
 
     assertTypeArguments(invocation.typeArguments, [intType, doubleType]);
     _assertInvocationArguments(invocation.argumentList,
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index fe2e68b..7a7e093 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -117,7 +117,7 @@
     _assertHasDeclaration(declarations, 'C', DeclarationKind.CLASS,
         offset: 6, codeOffset: 0, codeLength: 91);
     _assertHasDeclaration(declarations, 'f', DeclarationKind.FIELD,
-        offset: 16, codeOffset: 12, codeLength: 6, className: 'C');
+        offset: 16, codeOffset: 12, codeLength: 5, className: 'C');
     _assertHasDeclaration(declarations, '', DeclarationKind.CONSTRUCTOR,
         offset: 21, codeOffset: 21, codeLength: 4, className: 'C');
     _assertHasDeclaration(declarations, 'named', DeclarationKind.CONSTRUCTOR,
@@ -363,7 +363,7 @@
       codeLength: 16,
     );
     _assertHasDeclaration(declarations, 'v', DeclarationKind.VARIABLE,
-        offset: 54, codeOffset: 50, codeLength: 6);
+        offset: 54, codeOffset: 50, codeLength: 5);
     _assertHasDeclaration(
         declarations, 'tf1', DeclarationKind.FUNCTION_TYPE_ALIAS,
         offset: 70, codeOffset: 57, codeLength: 19);
@@ -1989,95 +1989,16 @@
 
   @failingTest
   @override
-  test_references_discover() => super.test_references_discover();
-
-  @failingTest
-  @override
-  test_references_discover_onlyOwned() =>
-      super.test_references_discover_onlyOwned();
-
-  @failingTest
-  @override
-  test_searchReferences_ClassElement_definedInSdk_declarationSite() =>
-      super.test_searchReferences_ClassElement_definedInSdk_declarationSite();
-
-  @failingTest
-  @override
-  test_searchReferences_ClassElement_definedInSdk_useSite() =>
-      super.test_searchReferences_ClassElement_definedInSdk_useSite();
-
-  @failingTest
-  @override
-  test_searchReferences_ClassElement_definedInside() =>
-      super.test_searchReferences_ClassElement_definedInside();
-
-  @failingTest
-  @override
-  test_searchReferences_ClassElement_definedOutside() =>
-      super.test_searchReferences_ClassElement_definedOutside();
-
-  @failingTest
-  @override
-  test_searchReferences_FieldElement() =>
-      super.test_searchReferences_FieldElement();
-
-  @failingTest
-  @override
   test_searchReferences_LabelElement() =>
       super.test_searchReferences_LabelElement();
 
   @failingTest
   @override
-  test_searchReferences_ParameterElement_ofConstructor() =>
-      super.test_searchReferences_ParameterElement_ofConstructor();
-
-  @failingTest
-  @override
-  test_searchReferences_PrefixElement() =>
-      super.test_searchReferences_PrefixElement();
-
-  @failingTest
-  @override
-  test_searchReferences_PrefixElement_inPackage() =>
-      super.test_searchReferences_PrefixElement_inPackage();
-
-  @failingTest
-  @override
-  test_searchReferences_private_declaredInDefiningUnit() =>
-      super.test_searchReferences_private_declaredInDefiningUnit();
-
-  @failingTest
-  @override
-  test_searchReferences_private_declaredInPart() =>
-      super.test_searchReferences_private_declaredInPart();
-
-  @failingTest
-  @override
-  test_searchReferences_private_inPackage() =>
-      super.test_searchReferences_private_inPackage();
-
-  @failingTest
-  @override
   test_searchReferences_TopLevelVariableElement() =>
       super.test_searchReferences_TopLevelVariableElement();
 
   @failingTest
   @override
-  test_searchReferences_TypeParameterElement_ofClass() =>
-      super.test_searchReferences_TypeParameterElement_ofClass();
-
-  @failingTest
-  @override
-  test_searchReferences_TypeParameterElement_ofMethod() =>
-      super.test_searchReferences_TypeParameterElement_ofMethod();
-
-  @failingTest
-  @override
-  test_searchReferences_TypeParameterElement_ofTopLevelFunction() =>
-      super.test_searchReferences_TypeParameterElement_ofTopLevelFunction();
-
-  @failingTest
-  @override
   test_subtypes_partWithoutLibrary() =>
       super.test_subtypes_partWithoutLibrary();
 }
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index a0a25fc..935abfb 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -242,6 +242,9 @@
       buffer.write('.');
       writeName(e);
     }
+    if (!e.isSynthetic) {
+      writeCodeRange(e);
+    }
 
     writeParameterElements(e.parameters);
 
@@ -682,6 +685,7 @@
     }
 
     writeName(e);
+    writeCodeRange(e);
 
     if (e.parameters.isNotEmpty) {
       writeList('(', ')', e.parameters, ', ', writeParameterElement,
@@ -825,6 +829,7 @@
     writeType2(type);
 
     writeName(e);
+    writeCodeRange(e);
 
     writeVariableTypeInferenceError(e);
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 9aa0713..50151bf 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -2672,6 +2672,215 @@
         withConstElements: false);
   }
 
+  test_codeRange_constructor() async {
+    var library = await checkLibrary('''
+class C {
+  C();
+
+  C.raw() {}
+
+  /// Comment 1.
+  /// Comment 2.
+  C.hasDocComment() {}
+
+  @Object()
+  C.hasAnnotation() {}
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  C.annotationThenComment() {}
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  C.commentThenAnnotation() {}
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  C.commentAroundAnnotation() {}
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class C/*codeOffset=0, codeLength=362*/ {
+  C/*codeOffset=12, codeLength=4*/();
+  C.raw/*codeOffset=20, codeLength=10*/();
+  /// Comment 1.
+  /// Comment 2.
+  C.hasDocComment/*codeOffset=34, codeLength=54*/();
+  @Object()
+  C.hasAnnotation/*codeOffset=92, codeLength=32*/();
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  C.annotationThenComment/*codeOffset=128, codeLength=74*/();
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  C.commentThenAnnotation/*codeOffset=206, codeLength=74*/();
+  /// Comment 2.
+  @Object()
+  C.commentAroundAnnotation/*codeOffset=301, codeLength=59*/();
+}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_constructor_factory() async {
+    var library = await checkLibrary('''
+class C {
+  factory C() => null;
+
+  factory C.raw() => null;
+
+  /// Comment 1.
+  /// Comment 2.
+  factory C.hasDocComment() => null;
+
+  @Object()
+  factory C.hasAnnotation() => null;
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  factory C.annotationThenComment() => null;
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  factory C.commentThenAnnotation() => null;
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  factory C.commentAroundAnnotation() => null;
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class C/*codeOffset=0, codeLength=462*/ {
+  factory C/*codeOffset=12, codeLength=20*/();
+  factory C.raw/*codeOffset=36, codeLength=24*/();
+  /// Comment 1.
+  /// Comment 2.
+  factory C.hasDocComment/*codeOffset=64, codeLength=68*/();
+  @Object()
+  factory C.hasAnnotation/*codeOffset=136, codeLength=46*/();
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  factory C.annotationThenComment/*codeOffset=186, codeLength=88*/();
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  factory C.commentThenAnnotation/*codeOffset=278, codeLength=88*/();
+  /// Comment 2.
+  @Object()
+  factory C.commentAroundAnnotation/*codeOffset=387, codeLength=73*/();
+}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_field() async {
+    var library = await checkLibrary('''
+class C {
+  int withInit = 1;
+
+  int withoutInit;
+
+  int multiWithInit = 2, multiWithoutInit, multiWithInit2 = 3; 
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class C/*codeOffset=0, codeLength=116*/ {
+  int withInit/*codeOffset=12, codeLength=16*/;
+  int withoutInit/*codeOffset=33, codeLength=15*/;
+  int multiWithInit/*codeOffset=53, codeLength=21*/;
+  int multiWithoutInit/*codeOffset=76, codeLength=16*/;
+  int multiWithInit2/*codeOffset=94, codeLength=18*/;
+}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_field_annotations() async {
+    var library = await checkLibrary('''
+class C {
+  /// Comment 1.
+  /// Comment 2.
+  int hasDocComment, hasDocComment2;
+
+  @Object()
+  int hasAnnotation, hasAnnotation2;
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  int annotationThenComment, annotationThenComment2;
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  int commentThenAnnotation, commentThenAnnotation2;
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  int commentAroundAnnotation, commentAroundAnnotation2;
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class C/*codeOffset=0, codeLength=436*/ {
+  /// Comment 1.
+  /// Comment 2.
+  int hasDocComment/*codeOffset=12, codeLength=51*/;
+  /// Comment 1.
+  /// Comment 2.
+  int hasDocComment2/*codeOffset=65, codeLength=14*/;
+  @Object()
+  int hasAnnotation/*codeOffset=84, codeLength=29*/;
+  @Object()
+  int hasAnnotation2/*codeOffset=115, codeLength=14*/;
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  int annotationThenComment/*codeOffset=134, codeLength=71*/;
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  int annotationThenComment2/*codeOffset=207, codeLength=22*/;
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  int commentThenAnnotation/*codeOffset=234, codeLength=71*/;
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  int commentThenAnnotation2/*codeOffset=307, codeLength=22*/;
+  /// Comment 2.
+  @Object()
+  int commentAroundAnnotation/*codeOffset=351, codeLength=56*/;
+  /// Comment 2.
+  @Object()
+  int commentAroundAnnotation2/*codeOffset=409, codeLength=24*/;
+}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
   test_codeRange_function() async {
     var library = await checkLibrary('''
 void raw() {}
@@ -2727,24 +2936,24 @@
     var library = await checkLibrary('''
 class C {
   void raw() {}
-  
+
   /// Comment 1.
   /// Comment 2.
   void hasDocComment() {}
-  
+
   @Object()
   void hasAnnotation() {}
-  
+
   @Object()
   /// Comment 1.
   /// Comment 2.
   void annotationThenComment() {}
-  
+
   /// Comment 1.
   /// Comment 2.
   @Object()
   void commentThenAnnotation() {}
-  
+
   /// Comment 1.
   @Object()
   /// Comment 2.
@@ -2754,30 +2963,143 @@
     checkElementText(
         library,
         r'''
-class C/*codeOffset=0, codeLength=382*/ {
+class C/*codeOffset=0, codeLength=372*/ {
   void raw/*codeOffset=12, codeLength=13*/() {}
   /// Comment 1.
   /// Comment 2.
-  void hasDocComment/*codeOffset=31, codeLength=57*/() {}
+  void hasDocComment/*codeOffset=29, codeLength=57*/() {}
   @Object()
-  void hasAnnotation/*codeOffset=94, codeLength=35*/() {}
+  void hasAnnotation/*codeOffset=90, codeLength=35*/() {}
   /// Comment 1.
   /// Comment 2.
   @Object()
-  void annotationThenComment/*codeOffset=135, codeLength=77*/() {}
+  void annotationThenComment/*codeOffset=129, codeLength=77*/() {}
   /// Comment 1.
   /// Comment 2.
   @Object()
-  void commentThenAnnotation/*codeOffset=218, codeLength=77*/() {}
+  void commentThenAnnotation/*codeOffset=210, codeLength=77*/() {}
   /// Comment 2.
   @Object()
-  void commentAroundAnnotation/*codeOffset=318, codeLength=62*/() {}
+  void commentAroundAnnotation/*codeOffset=308, codeLength=62*/() {}
 }
 ''',
         withCodeRanges: true,
         withConstElements: false);
   }
 
+  test_codeRange_parameter() async {
+    var library = await checkLibrary('''
+main({int a = 1, int b, int c = 2}) {}
+''');
+    checkElementText(
+        library,
+        'dynamic main/*codeOffset=0, codeLength=38*/('
+        '{int a/*codeOffset=6, codeLength=9*/: 1}, '
+        '{int b/*codeOffset=17, codeLength=5*/}, '
+        '{int c/*codeOffset=24, codeLength=9*/: 2}) {}\n',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_parameter_annotations() async {
+    var library = await checkLibrary('''
+main(@Object() int a, int b, @Object() int c) {}
+''');
+    checkElementText(
+        library,
+        'dynamic main/*codeOffset=0, codeLength=48*/('
+        '@Object() int a/*codeOffset=5, codeLength=15*/, '
+        'int b/*codeOffset=22, codeLength=5*/, '
+        '@Object() int c/*codeOffset=29, codeLength=15*/) {}\n',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_topLevelVariable() async {
+    var library = await checkLibrary('''
+int withInit = 1 + 2 * 3;
+
+int withoutInit;
+
+int multiWithInit = 2, multiWithoutInit, multiWithInit2 = 3; 
+''');
+    checkElementText(
+        library,
+        r'''
+int withInit/*codeOffset=0, codeLength=24*/;
+int withoutInit/*codeOffset=27, codeLength=15*/;
+int multiWithInit/*codeOffset=45, codeLength=21*/;
+int multiWithoutInit/*codeOffset=68, codeLength=16*/;
+int multiWithInit2/*codeOffset=86, codeLength=18*/;
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_topLevelVariable_annotations() async {
+    var library = await checkLibrary('''
+/// Comment 1.
+/// Comment 2.
+int hasDocComment, hasDocComment2;
+
+@Object()
+int hasAnnotation, hasAnnotation2;
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+int annotationThenComment, annotationThenComment2;
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+int commentThenAnnotation, commentThenAnnotation2;
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+int commentAroundAnnotation, commentAroundAnnotation2;
+''');
+    checkElementText(
+        library,
+        r'''
+/// Comment 1.
+/// Comment 2.
+int hasDocComment/*codeOffset=0, codeLength=47*/;
+/// Comment 1.
+/// Comment 2.
+int hasDocComment2/*codeOffset=49, codeLength=14*/;
+@Object()
+int hasAnnotation/*codeOffset=66, codeLength=27*/;
+@Object()
+int hasAnnotation2/*codeOffset=95, codeLength=14*/;
+/// Comment 1.
+/// Comment 2.
+@Object()
+int annotationThenComment/*codeOffset=112, codeLength=65*/;
+/// Comment 1.
+/// Comment 2.
+@Object()
+int annotationThenComment2/*codeOffset=179, codeLength=22*/;
+/// Comment 1.
+/// Comment 2.
+@Object()
+int commentThenAnnotation/*codeOffset=204, codeLength=65*/;
+/// Comment 1.
+/// Comment 2.
+@Object()
+int commentThenAnnotation2/*codeOffset=271, codeLength=22*/;
+/// Comment 2.
+@Object()
+int commentAroundAnnotation/*codeOffset=311, codeLength=52*/;
+/// Comment 2.
+@Object()
+int commentAroundAnnotation2/*codeOffset=365, codeLength=24*/;
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
   test_const_constructor_inferred_args() async {
     if (!isStrongMode) return;
     var library = await checkLibrary('''
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 957f337..0044bc0 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -9875,8 +9875,8 @@
     if (!includeInformative) return;
     serializeLibraryText(' int a = 1, b = 22;');
     List<UnlinkedVariable> variables = unlinkedUnits[0].variables;
-    _assertCodeRange(variables[0].codeRange, 1, 18);
-    _assertCodeRange(variables[1].codeRange, 1, 18);
+    _assertCodeRange(variables[0].codeRange, 1, 9);
+    _assertCodeRange(variables[1].codeRange, 12, 6);
   }
 
   test_variable_const() {
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 4dd6d1a..4c4eb38 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -173,8 +173,8 @@
   }
 
   @override
-  void endClassBody(int memberCount, Token beginToken, Token endToken) {
-    debugEvent("ClassBody");
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    debugEvent("ClassOrMixinBody");
     push(popList(memberCount,
         new List<ClassMember>.filled(memberCount, null, growable: true)));
   }
@@ -240,8 +240,13 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     debugEvent("FormalParameter");
     pop(); // Name
     pop(); // Type
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 2dc90ba..da0506a 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -31,16 +31,7 @@
   static const String generateCodeWithCompileTimeErrors =
       '--generate-code-with-compile-time-errors';
 
-  /// TODO(sigmund): delete these flags.
-  static const String useKernel = '--use-kernel';
-  static const String useOldFrontend = '--use-old-frontend';
-
-  static const String strongMode = '--strong';
   static const String previewDart2 = '--preview-dart-2';
-  // Revert to Dart 1.0
-  //
-  // Temporary option to opt-out of Dart 2.0 while migrating.
-  static const String noPreviewDart2 = '--no-preview-dart-2';
 
   static const String omitImplicitChecks = '--omit-implicit-checks';
   static const String laxRuntimeTypeToString = '--lax-runtime-type-to-string';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index fe6d994..663d010 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -15,6 +15,7 @@
 import 'js_backend/backend.dart' show JavaScriptBackend;
 import 'js_backend/constant_system_javascript.dart';
 import 'js_backend/native_data.dart' show NativeBasicData;
+import 'native/native.dart';
 import 'types/abstract_value_domain.dart';
 import 'universe/call_structure.dart' show CallStructure;
 import 'universe/selector.dart' show Selector;
@@ -1285,6 +1286,32 @@
 
   bool isForeign(MemberEntity element) => element.library == foreignLibrary;
 
+  /// Returns `true` if [member] is a "foreign helper", that is, a member whose
+  /// semantics is defined synthetically and not through Dart code.
+  ///
+  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
+  bool isForeignHelper(MemberEntity member) {
+    return member.library == foreignLibrary ||
+        isCreateInvocationMirrorHelper(member);
+  }
+
+  /// Returns `true` if [function] is allowed to be external.
+  ///
+  /// This returns `true` for foreign helpers, from environment constructors and
+  /// members of libraries that support native.
+  ///
+  /// This returns `false` for JS interop members which therefore must be
+  /// allowed to be external through the JS interop annotation handling.
+  bool isExternalAllowed(FunctionEntity function) {
+    return isForeignHelper(function) ||
+        (function is ConstructorEntity &&
+            function.isFromEnvironmentConstructor) ||
+        maybeEnableNative(function.library.canonicalUri) ||
+        // TODO(johnniwinther): Remove this when importing dart:mirrors is
+        // a compile-time error.
+        function.library.canonicalUri == Uris.dart_mirrors;
+  }
+
   /// Returns `true` if the implementation of the 'operator ==' [function] is
   /// known to handle `null` as argument.
   bool operatorEqHandlesNullArgument(FunctionEntity function) {
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 5ce1f00..f261270 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -124,7 +124,6 @@
   bool trustTypeAnnotations = false;
   bool checkedMode = false;
   bool strongMode = true;
-  bool forceStrongMode = false;
   List<String> hints = <String>[];
   bool verbose;
   bool throwOnError;
@@ -225,16 +224,6 @@
     passThrough(argument);
   }
 
-  void setForceStrongMode(_) {
-    strongMode = forceStrongMode = true;
-    passThrough(Flags.strongMode);
-  }
-
-  void setLegacyMode(_) {
-    if (!forceStrongMode) strongMode = false;
-    passThrough(Flags.noPreviewDart2);
-  }
-
   void addInEnvironment(String argument) {
     int eqIndex = argument.indexOf('=');
     String name = argument.substring(2, eqIndex);
@@ -257,10 +246,6 @@
     passThrough('--categories=${categories.join(",")}');
   }
 
-  void setUseOldFrontend(String argument) {
-    helpAndFail("Option '${Flags.useOldFrontend}' is not supported.");
-  }
-
   void setPlatformBinaries(String argument) {
     platformBinaries =
         currentDirectory.resolve(extractPath(argument, isDirectory: true));
@@ -315,8 +300,7 @@
     new OptionHandler(
         '--output-type=dart|--output-type=dart-multi|--output-type=js',
         setOutputType),
-    new OptionHandler(Flags.useKernel, ignoreOption),
-    new OptionHandler(Flags.useOldFrontend, setUseOldFrontend),
+    new OptionHandler('--use-kernel', ignoreOption),
     new OptionHandler(Flags.platformBinaries, setPlatformBinaries),
     new OptionHandler(Flags.noFrequencyBasedMinification, passThrough),
     new OptionHandler(Flags.verbose, setVerbose),
@@ -366,14 +350,8 @@
     new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
     new OptionHandler(Flags.enableAssertMessage, passThrough),
-    // TODO(sigmund): ignore this option after we update our test bot
-    // configurations or stop testing Dart1.
-    // At the time this was added, some bots invoked dart2js with
-    // --no-preview-dart-2, but some test files contain extra dart2js options,
-    // including --strong. We want to make sure --strong takes precedence.
-    new OptionHandler(Flags.strongMode, setForceStrongMode),
-    new OptionHandler(Flags.previewDart2, setForceStrongMode),
-    new OptionHandler(Flags.noPreviewDart2, setLegacyMode),
+    new OptionHandler('--strong', ignoreOption),
+    new OptionHandler(Flags.previewDart2, ignoreOption),
     new OptionHandler(Flags.omitImplicitChecks, passThrough),
     new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
@@ -668,14 +646,6 @@
     Produce JavaScript that can be parsed more quickly by VMs. This option
     usually results in larger JavaScript files with faster startup.
 
-  --no-preview-dart-2
-    Temporarily revert to Dart 1.0 semantics.
-
-    By default dart2js compiles programs in Dart 2.0 semantics, which includes
-    generic methods and strong mode type checks. Since apps may have additional
-    checks that fail at runtime, this temporary flag may help in the migration
-    process. See also '--omit-implicit-checks'.
-
   -O<0,1,2,3,4>
     Controls optimizations that can help reduce code-size and improve
     performance of the generated code for deployment.
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 7875d84..5f32672 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -361,11 +361,6 @@
                 _collectTypeDependencies(type, dependencies);
               }
               break;
-            case TypeUseKind.CHECKED_MODE_CHECK:
-              if (compiler.options.assignmentCheckPolicy.isEmitted) {
-                _collectTypeDependencies(type, dependencies);
-              }
-              break;
             case TypeUseKind.RTI_VALUE:
             case TypeUseKind.TYPE_ARGUMENT:
               failedAt(element, "Unexpected type use: $typeUse.");
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 3fbfef7..63f77e8 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -43,6 +43,7 @@
   HIDDEN_HINTS,
   HIDDEN_WARNINGS,
   HIDDEN_WARNINGS_HINTS,
+  IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED,
   INVALID_ASSERT_VALUE,
   INVALID_ASSERT_VALUE_MESSAGE,
   INVALID_BOOL_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
@@ -59,8 +60,8 @@
   INVALID_CONSTANT_INTERPOLATION_TYPE,
   INVALID_CONSTANT_NEGATE_TYPE,
   INVALID_CONSTANT_NOT_TYPE,
-  INVALID_CONSTANT_NUM_ADD_TYPE,
   INVALID_CONSTANT_STRING_ADD_TYPE,
+  INVALID_CONSTANT_NUM_ADD_TYPE,
   INVALID_CONSTANT_STRING_LENGTH_TYPE,
   INVALID_CONSTANT_SHIFT,
   INVALID_FROM_ENVIRONMENT_NAME_TYPE,
@@ -73,9 +74,12 @@
   INVALID_PACKAGE_URI,
   INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
   JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
+  JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR,
   JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
-  // TODO(johnniwinther): Why isn't this used?
+  JS_INTEROP_FIELD_NOT_SUPPORTED,
   JS_INTEROP_INDEX_NOT_SUPPORTED,
+  JS_INTEROP_NON_EXTERNAL_MEMBER,
+  JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS,
   JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
   JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
   JS_PLACEHOLDER_CAPTURE,
@@ -84,6 +88,7 @@
   MISSING_EXPRESSION_IN_THROW,
   MULTI_INHERITANCE,
   NO_SUCH_SUPER_MEMBER,
+  NON_NATIVE_EXTERNAL,
   NOT_A_COMPILE_TIME_CONSTANT,
   NOT_ASSIGNABLE,
   PLEASE_REPORT_THE_CRASH,
@@ -198,46 +203,6 @@
               """
           ]),
 
-      MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER: const MessageTemplate(
-          MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
-          "Member '#{member}' in js-interop class '#{cls}' is not external.",
-          howToFix: "Mark all interop methods external",
-          examples: const [
-            """
-              import 'package:js/js.dart';
-
-              @JS()
-              class Foo {
-                bar() {}
-              }
-
-              main() {
-                new Foo().bar();
-              }
-              """
-          ]),
-
-      MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS: const MessageTemplate(
-          MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
-          "Js-interop method '#{method}' has named arguments but is not "
-          "a factory constructor of an @anonymous @JS class.",
-          howToFix: "Remove all named arguments from js-interop method or "
-              "in the case of a factory constructor annotate the class "
-              "as @anonymous.",
-          examples: const [
-            """
-              import 'package:js/js.dart';
-
-              @JS()
-              class Foo {
-                external bar(foo, {baz});
-              }
-
-              main() {
-                new Foo().bar(4, baz: 5);
-              }
-              """
-          ]),
       MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED: const MessageTemplate(
           MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED,
           "Js-interop does not support [] and []= operator methods.",
@@ -281,20 +246,85 @@
                   "constructors named.",
               examples: const [
             """
+class Super {
+  factory Super.foo() => null;
+}
+class Class extends Super {
+  Class() : super.foo();
+}
+main() => new Class();
+"""
+          ]),
+
+      MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER: const MessageTemplate(
+          MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER,
+          "Js-interop members must be 'external'."),
+
+      MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS: const MessageTemplate(
+          MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS,
+          "Js-interop class members are only supported in js-interop classes.",
+          howToFix: "Try marking the enclosing class as js-interop or "
+              "remove the js-interop annotation from the member."),
+
+      MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR:
+          const MessageTemplate(
+              MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR,
+              "Constructor '#{constructor}' in js-interop class '#{cls}' is "
+              "not external.",
+              howToFix: "Try adding the 'external' to '#{constructor}'."),
+
+      MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER: const MessageTemplate(
+          MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
+          "Member '#{member}' in js-interop class '#{cls}' is not external.",
+          howToFix: "Try adding the 'external' to '#{member}'.",
+          examples: const [
+            """
               import 'package:js/js.dart';
 
-              @anonymous
               @JS()
               class Foo {
-                external factory Foo(foo, {baz});
+                bar() {}
               }
 
               main() {
-                new Foo(5, baz: 5);
+                new Foo().bar();
               }
               """
           ]),
 
+      MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS: const MessageTemplate(
+          MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
+          "Js-interop method '#{method}' has named arguments but is not "
+          "a factory constructor of an @anonymous @JS class.",
+          howToFix: "Remove all named arguments from js-interop method or "
+              "in the case of a factory constructor annotate the class "
+              "as @anonymous.",
+          examples: const [
+            """
+              import 'package:js/js.dart';
+
+              @JS()
+              class Foo {
+                external bar(foo, {baz});
+              }
+
+              main() {
+                new Foo().bar(4, baz: 5);
+              }
+              """
+          ]),
+      MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED:
+          const MessageTemplate(
+              MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED,
+              "Fields in js-interop classes are not supported.",
+              howToFix: "Try replacing the field with an "
+                  "external getter and/or setter."),
+      MessageKind.JS_INTEROP_FIELD_NOT_SUPPORTED: const MessageTemplate(
+          MessageKind.JS_INTEROP_FIELD_NOT_SUPPORTED,
+          "Field can't be marked as js-interop.",
+          howToFix: "Try replacing the field with an "
+              "external getter and/or setter."),
+
       MessageKind.LIBRARY_NOT_FOUND: const MessageTemplate(
           MessageKind.LIBRARY_NOT_FOUND, "Library not found '#{resolvedUri}'."),
 
@@ -631,6 +661,13 @@
           howToFix: "If used only for debugging, consider using option "
               "${Flags.laxRuntimeTypeToString} to reduce the code size "
               "impact."),
+
+      MessageKind.NON_NATIVE_EXTERNAL: const MessageTemplate(
+          MessageKind.NON_NATIVE_EXTERNAL,
+          "Only external js-interop functions are supported.",
+          howToFix:
+              "Try removing 'external' keyword or annotating the function "
+              "as a js-interop function."),
     }); // End of TEMPLATES.
 
   String toString() => template;
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 385a7ab..b022af7 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -292,9 +292,8 @@
     String returnType = '${functionType.returnType}';
 
     String inferredReturnType = '${_resultOfMember(function).returnType}';
-    String sideEffects = '${compiler
-        .globalInference.resultsForTesting.inferredData
-        .getSideEffectsOfElement(function)}';
+    String sideEffects =
+        '${compiler.globalInference.resultsForTesting.inferredData.getSideEffectsOfElement(function)}';
 
     int inlinedCount = compiler.dumpInfoTask.inlineCount[function];
     if (inlinedCount == null) inlinedCount = 0;
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 9248fe1..d869e48 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -952,7 +952,6 @@
 abstract class AbstractTypeRelation<T extends DartType>
     extends BaseDartTypeVisitor<bool, T> {
   CommonElements get commonElements;
-  bool get strongMode;
 
   final _Assumptions assumptions = new _Assumptions();
 
@@ -1186,30 +1185,15 @@
 abstract class MoreSpecificVisitor<T extends DartType>
     extends AbstractTypeRelation<T> {
   bool isMoreSpecific(T t, T s) {
-    if (strongMode) {
-      if (identical(t, s) ||
-          s.treatAsDynamic ||
-          s.isVoid ||
-          s == commonElements.objectType ||
-          t == commonElements.nullType) {
-        return true;
-      }
-      if (t.treatAsDynamic) {
-        return false;
-      }
-    } else {
-      if (identical(t, s) || s.treatAsDynamic || t == commonElements.nullType) {
-        return true;
-      }
-      if (t.isVoid || s.isVoid) {
-        return false;
-      }
-      if (t.treatAsDynamic) {
-        return false;
-      }
-      if (s == commonElements.objectType) {
-        return true;
-      }
+    if (identical(t, s) ||
+        s.treatAsDynamic ||
+        s.isVoid ||
+        s == commonElements.objectType ||
+        t == commonElements.nullType) {
+      return true;
+    }
+    if (t.treatAsDynamic) {
+      return false;
     }
 
     t = getUnaliased(t);
@@ -1248,9 +1232,6 @@
 abstract class SubtypeVisitor<T extends DartType>
     extends MoreSpecificVisitor<T> {
   bool isSubtype(DartType t, DartType s) {
-    if (!strongMode && t.treatAsDynamic) {
-      return true;
-    }
     if (s.isFutureOr) {
       FutureOrType sFutureOr = s;
       if (isSubtype(t, sFutureOr.typeArgument)) {
@@ -1276,13 +1257,11 @@
   }
 
   bool invalidFunctionReturnTypes(T t, T s) {
-    if (strongMode) return !isSubtype(t, s);
-    return !s.isVoid && !isAssignable(t, s);
+    return !isSubtype(t, s);
   }
 
   bool invalidFunctionParameterTypes(T t, T s) {
-    if (strongMode) return !isSubtype(s, t);
-    return !isAssignable(t, s);
+    return !isSubtype(s, t);
   }
 
   bool invalidTypeVariableBounds(T bound, T s) {
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 47c5f6e..47f8804 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -377,11 +377,6 @@
           _registerIsCheck(type);
         }
         break;
-      case TypeUseKind.CHECKED_MODE_CHECK:
-        if (_options.assignmentCheckPolicy.isEmitted) {
-          _registerIsCheck(type);
-        }
-        break;
       case TypeUseKind.TYPE_LITERAL:
         if (type is TypeVariableType) {
           _worldBuilder.registerTypeVariableTypeLiteral(type);
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index bc20a5d..df34fdb 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -760,7 +760,7 @@
 
       TypeInformation type =
           handleStaticInvoke(node, selector, mask, info.callMethod, arguments);
-      if (_options.strongMode && useStaticResultTypes) {
+      if (useStaticResultTypes) {
         type = _types.narrowType(type, _elementMap.getStaticType(node));
       }
       return type;
@@ -785,7 +785,7 @@
     }
     TypeInformation type = handleDynamicInvoke(
         CallType.access, node, selector, mask, receiverType, arguments);
-    if (_options.strongMode && useStaticResultTypes) {
+    if (useStaticResultTypes) {
       type = _types.narrowType(type, _elementMap.getStaticType(node));
     }
     return type;
@@ -1185,14 +1185,14 @@
     } else if (member.isFunction) {
       TypeInformation type =
           handleStaticInvoke(node, selector, mask, member, arguments);
-      if (_options.strongMode && useStaticResultTypes) {
+      if (useStaticResultTypes) {
         type = _types.narrowType(type, _elementMap.getStaticType(node));
       }
       return type;
     } else {
       TypeInformation type =
           handleClosureCall(node, selector, mask, member, arguments);
-      if (_options.strongMode && useStaticResultTypes) {
+      if (useStaticResultTypes) {
         type = _types.narrowType(type, _elementMap.getStaticType(node));
       }
       return type;
@@ -1211,7 +1211,7 @@
     AbstractValue mask = _memberData.typeOfSend(node);
     TypeInformation type = handleStaticInvoke(
         node, new Selector.getter(member.memberName), mask, member, null);
-    if (_options.strongMode && useStaticResultTypes) {
+    if (useStaticResultTypes) {
       type = _types.narrowType(type, _elementMap.getStaticType(node));
     }
     return type;
@@ -1242,7 +1242,7 @@
           selector, _types.newTypedSelector(receiverType, mask));
     }
     TypeInformation type = handleDynamicGet(node, selector, mask, receiverType);
-    if (_options.strongMode && useStaticResultTypes) {
+    if (useStaticResultTypes) {
       type = _types.narrowType(type, _elementMap.getStaticType(node));
     }
     return type;
@@ -1257,7 +1257,7 @@
     Selector selector = new Selector.getter(member.memberName);
     _checkIfExposesThis(selector, _types.newTypedSelector(receiverType, mask));
     TypeInformation type = handleDynamicGet(node, selector, mask, receiverType);
-    if (_options.strongMode && useStaticResultTypes) {
+    if (useStaticResultTypes) {
       type = _types.narrowType(type, _elementMap.getStaticType(node));
     }
     return type;
@@ -1686,7 +1686,7 @@
     } else {
       TypeInformation type =
           handleStaticInvoke(node, selector, mask, member, null);
-      if (_options.strongMode && useStaticResultTypes) {
+      if (useStaticResultTypes) {
         type = _types.narrowType(type, _elementMap.getStaticType(node));
       }
       return type;
@@ -1733,7 +1733,7 @@
       } else {
         TypeInformation type =
             handleStaticInvoke(node, selector, mask, member, arguments);
-        if (_options.strongMode && useStaticResultTypes) {
+        if (useStaticResultTypes) {
           type = _types.narrowType(type, _elementMap.getStaticType(node));
         }
         return type;
@@ -1741,7 +1741,7 @@
     } else {
       TypeInformation type =
           handleClosureCall(node, selector, mask, member, arguments);
-      if (_options.strongMode && useStaticResultTypes) {
+      if (useStaticResultTypes) {
         type = _types.narrowType(type, _elementMap.getStaticType(node));
       }
       return type;
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index af23b66..777d861 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -549,8 +549,7 @@
           }
           if (debug.VERBOSE) {
             print("traced closure $element as "
-                "${inferredDataBuilder
-                    .getCurrentlyKnownMightBePassedToApply(element)}");
+                "${inferredDataBuilder.getCurrentlyKnownMightBePassedToApply(element)}");
           }
         });
       }
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 6487088a..d89a8a8 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -820,7 +820,6 @@
       // The trusting of the parameter types within the body of the method is
       // is done through `LocalsHandler.update` called in
       // `KernelTypeGraphBuilder.handleParameter`.
-      assert(!inferrer.options.enableTypeAssertions);
       return _narrowType(inferrer.closedWorld, mask, _type);
     }
     return mask;
@@ -1236,8 +1235,7 @@
               if (abstractValueDomain.containsDictionaryKey(typeMask, key)) {
                 if (debug.VERBOSE) {
                   print("Dictionary lookup for $key yields "
-                      "${abstractValueDomain.
-                      getDictionaryValueForKey(typeMask, key)}.");
+                      "${abstractValueDomain.getDictionaryValueForKey(typeMask, key)}.");
                 }
                 return abstractValueDomain.getDictionaryValueForKey(
                     typeMask, key);
diff --git a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
index d57a0a0..9147fae 100644
--- a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
@@ -104,7 +104,6 @@
       // in-allocator initialization.
       return false;
     }
-    if (!_options.strongMode) return false;
     return true;
   }
   // TODO(sra): Add way to let injected fields be initialized to a constant in
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 835870b..3ed2a84 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -90,11 +90,12 @@
   // don't know about the general case yet.
   static const int _canInlineInLoopMayInlineOutside = 3;
   static const int _canInline = 4;
-  static const int _mustInline = 5;
 
   final Map<FunctionEntity, int> _cachedDecisions =
       new Map<FunctionEntity, int>();
 
+  final Set<FunctionEntity> _tryInlineFunctions = new Set<FunctionEntity>();
+
   /// Checks that [method] is the canonical representative for this method.
   ///
   /// For a [MethodElement] this means it must be the declaration element.
@@ -137,7 +138,6 @@
         case _canInlineInLoopMustNotOutside:
         case _canInlineInLoopMayInlineOutside:
         case _canInline:
-        case _mustInline:
           return true;
       }
     } else {
@@ -154,7 +154,6 @@
           return null;
 
         case _canInline:
-        case _mustInline:
           return true;
       }
     }
@@ -192,7 +191,6 @@
         case _canInlineInLoopMustNotOutside:
         case _canInlineInLoopMayInlineOutside:
         case _canInline:
-        case _mustInline:
           // Do nothing.
           break;
       }
@@ -212,7 +210,6 @@
           break;
 
         case _canInline:
-        case _mustInline:
           // Do nothing.
           break;
       }
@@ -232,7 +229,6 @@
         case _canInlineInLoopMustNotOutside:
         case _canInlineInLoopMayInlineOutside:
         case _canInline:
-        case _mustInline:
           throw failedAt(
               element,
               "Can't mark a function as non-inlinable and inlinable at the "
@@ -250,7 +246,6 @@
     } else {
       switch (oldDecision) {
         case _canInline:
-        case _mustInline:
           throw failedAt(
               element,
               "Can't mark a function as non-inlinable and inlinable at the "
@@ -278,9 +273,14 @@
     }
   }
 
-  void markAsMustInline(FunctionEntity element) {
+  void markAsTryInline(FunctionEntity element) {
     assert(checkFunction(element), failedAt(element));
-    _cachedDecisions[element] = _mustInline;
+    _tryInlineFunctions.add(element);
+  }
+
+  bool markedAsTryInline(FunctionEntity element) {
+    assert(checkFunction(element), failedAt(element));
+    return _tryInlineFunctions.contains(element);
   }
 }
 
@@ -614,7 +614,7 @@
             _allocatorResolutionAnalysis,
             _nativeResolutionEnqueuer,
             noSuchMethodRegistry,
-            compiler.options.strongMode && useStrongModeWorldStrategy
+            useStrongModeWorldStrategy
                 ? const StrongModeWorldStrategy()
                 : const OpenWorldStrategy(),
             classHierarchyBuilder,
@@ -795,8 +795,7 @@
         closedWorld.nativeData,
         closedWorld.elementEnvironment,
         closedWorld.commonElements,
-        closedWorld.rtiNeed,
-        strongMode: compiler.options.strongMode);
+        closedWorld.rtiNeed);
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter);
     // TODO(johnniwinther): Share the impact object created in
     // createCodegenEnqueuer.
@@ -817,7 +816,6 @@
         closedWorld.elementEnvironment,
         closedWorld.commonElements,
         impacts,
-        checkedModeHelpers,
         closedWorld.nativeData,
         closedWorld.backendUsage,
         closedWorld.rtiNeed,
@@ -868,7 +866,7 @@
           reporter.reportErrorMessage(element, MessageKind.GENERIC,
               {'text': '@tryInline must not be used with @noInline.'});
         } else {
-          inlineCache.markAsMustInline(element);
+          inlineCache.markAsTryInline(element);
         }
       }
     }
@@ -895,7 +893,7 @@
           reporter.reportHintMessage(
               method, MessageKind.GENERIC, {'text': "Must inline"});
         }
-        inlineCache.markAsMustInline(method);
+        inlineCache.markAsTryInline(method);
       } else if (cls == commonElements.noInlineClass) {
         hasNoInline = true;
         if (VERBOSE_OPTIMIZER_HINTS) {
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index b560560..fb7290e 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -462,13 +462,6 @@
     return _typeCheck ??= new BackendImpact(otherImpacts: [boolValues]);
   }
 
-  BackendImpact _checkedModeTypeCheck;
-
-  BackendImpact get checkedModeTypeCheck {
-    return _checkedModeTypeCheck ??=
-        new BackendImpact(staticUses: [_commonElements.throwRuntimeError]);
-  }
-
   BackendImpact _malformedTypeCheck;
 
   BackendImpact get malformedTypeCheck {
@@ -497,13 +490,6 @@
     return _genericIsCheck ??= new BackendImpact(otherImpacts: [intValues]);
   }
 
-  BackendImpact _genericCheckedModeTypeCheck;
-
-  BackendImpact get genericCheckedModeTypeCheck {
-    return _genericCheckedModeTypeCheck ??=
-        new BackendImpact(staticUses: [_commonElements.assertSubtype]);
-  }
-
   BackendImpact _typeVariableTypeCheck;
 
   BackendImpact get typeVariableTypeCheck {
@@ -511,13 +497,6 @@
         staticUses: [_commonElements.checkSubtypeOfRuntimeType]);
   }
 
-  BackendImpact _typeVariableCheckedModeTypeCheck;
-
-  BackendImpact get typeVariableCheckedModeTypeCheck {
-    return _typeVariableCheckedModeTypeCheck ??= new BackendImpact(
-        staticUses: [_commonElements.assertSubtypeOfRuntimeType]);
-  }
-
   BackendImpact _functionTypeCheck;
 
   BackendImpact get functionTypeCheck {
@@ -668,17 +647,6 @@
         globalUses: [_commonElements.isJsIndexable]);
   }
 
-  BackendImpact _enableTypeAssertions;
-
-  BackendImpact get enableTypeAssertions {
-    return _enableTypeAssertions ??= new BackendImpact(
-        // Register the helper that checks if the expression in an if/while/for
-        // is a boolean.
-        // TODO(johnniwinther): Should this be registered through a [Feature]
-        // instead?
-        globalUses: [_commonElements.boolConversionCheck]);
-  }
-
   BackendImpact _traceHelper;
 
   BackendImpact get traceHelper {
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 917c236..361a39b 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -194,11 +194,6 @@
           _registerIsCheck(type);
         }
         break;
-      case TypeUseKind.CHECKED_MODE_CHECK:
-        if (_options.assignmentCheckPolicy.isEmitted) {
-          _registerIsCheck(type);
-        }
-        break;
       case TypeUseKind.TYPE_LITERAL:
         if (type is TypeVariableType) {
           _worldBuilder.registerTypeVariableTypeLiteral(type);
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index c69431f..8876430 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -25,7 +25,6 @@
 import '../util/util.dart';
 import 'backend_impact.dart';
 import 'backend_usage.dart';
-import 'checked_mode_helpers.dart';
 import 'custom_elements_analysis.dart';
 import 'interceptor_data.dart';
 import 'namer.dart';
@@ -174,11 +173,6 @@
             onIsCheck(type, transformed);
           }
           break;
-        case TypeUseKind.CHECKED_MODE_CHECK:
-          if (_options.assignmentCheckPolicy.isEmitted) {
-            onIsCheck(type, transformed);
-          }
-          break;
         case TypeUseKind.CATCH_TYPE:
           onIsCheck(type, transformed);
           break;
@@ -257,7 +251,7 @@
           if (type.containsTypeVariables ||
               // TODO(johnniwinther): Can we avoid the need for signatures in
               // Dart 2?
-              _options.strongMode) {
+              true) {
             registerImpact(_impacts.computeSignature);
           }
           break;
@@ -321,23 +315,13 @@
     type = _elementEnvironment.getUnaliasedType(type);
     registerImpact(_impacts.typeCheck);
 
-    bool inCheckedMode = _options.enableTypeAssertions;
-    if (inCheckedMode) {
-      registerImpact(_impacts.checkedModeTypeCheck);
-    }
     if (type.isMalformed) {
       registerImpact(_impacts.malformedTypeCheck);
     }
     if (!type.treatAsRaw || type.containsTypeVariables || type.isFunctionType) {
       registerImpact(_impacts.genericTypeCheck);
-      if (inCheckedMode) {
-        registerImpact(_impacts.genericCheckedModeTypeCheck);
-      }
       if (type.isTypeVariable) {
         registerImpact(_impacts.typeVariableTypeCheck);
-        if (inCheckedMode) {
-          registerImpact(_impacts.typeVariableCheckedModeTypeCheck);
-        }
       }
     }
     if (type is FunctionType) {
@@ -357,7 +341,6 @@
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
   final BackendImpacts _impacts;
-  final CheckedModeHelpers _checkedModeHelpers;
   final NativeData _nativeData;
   final BackendUsage _backendUsage;
   final RuntimeTypesNeed _rtiNeed;
@@ -371,7 +354,6 @@
       this._elementEnvironment,
       this._commonElements,
       this._impacts,
-      this._checkedModeHelpers,
       this._nativeData,
       this._backendUsage,
       this._rtiNeed,
@@ -386,28 +368,6 @@
     type = type.unaliased;
     _impacts.typeCheck.registerImpact(transformed, _elementEnvironment);
 
-    bool inCheckedMode = _options.enableTypeAssertions;
-    // [registerIsCheck] is also called for checked mode checks, so we
-    // need to register checked mode helpers.
-    if (inCheckedMode) {
-      // All helpers are added to resolution queue in enqueueHelpers. These
-      // calls to [enqueue] with the resolution enqueuer serve as assertions
-      // that the helper was in fact added.
-      // TODO(13155): Find a way to enqueue helpers lazily.
-      CheckedModeHelper helper = _checkedModeHelpers
-          .getCheckedModeHelper(type, _commonElements, typeCast: false);
-      if (helper != null) {
-        StaticUse staticUse = helper.getStaticUse(_commonElements);
-        transformed.registerStaticUse(staticUse);
-      }
-      // We also need the native variant of the check (for DOM types).
-      helper = _checkedModeHelpers
-          .getNativeCheckedModeHelper(type, _commonElements, typeCast: false);
-      if (helper != null) {
-        StaticUse staticUse = helper.getStaticUse(_commonElements);
-        transformed.registerStaticUse(staticUse);
-      }
-    }
     if (!type.treatAsRaw || type.containsTypeVariables) {
       _impacts.genericIsCheck.registerImpact(transformed, _elementEnvironment);
     }
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index 6d75fca..4c47390 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -72,6 +72,8 @@
   final Set<FunctionEntity> throwingImpls = new Set<FunctionEntity>();
 
   /// The implementations that fall into category C, described above.
+  // TODO(johnniwinther): Remove this category when Dart 1 is no longer
+  // supported.
   final Set<FunctionEntity> notApplicableImpls = new Set<FunctionEntity>();
 
   /// The implementations that fall into category D, described above.
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 9e79876..e73e773 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -422,9 +422,6 @@
     // will instantiate those two classes.
     _addInterceptors(_commonElements.jsBoolClass, impactBuilder);
     _addInterceptors(_commonElements.jsNullClass, impactBuilder);
-    if (_options.enableTypeAssertions) {
-      _registerBackendImpact(impactBuilder, _impacts.enableTypeAssertions);
-    }
     if (_options.disableRtiOptimization) {
       // When RTI optimization is disabled we always need all RTI helpers, so
       // register these here.
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 95682d0..fccfdae 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -91,8 +91,6 @@
   /// arguments.
   bool selectorNeedsTypeArguments(Selector selector);
 
-  bool get runtimeTypeUsedOnClosures;
-
   /// Returns `true` if a generic instantiation on an expression of type
   /// [functionType] with the given [typeArgumentCount] needs to pass type
   /// arguments.
@@ -120,9 +118,6 @@
   bool selectorNeedsTypeArguments(Selector selector) => true;
 
   @override
-  bool get runtimeTypeUsedOnClosures => true;
-
-  @override
   bool instantiationNeedsTypeArguments(
       DartType functionType, int typeArgumentCount) {
     return true;
@@ -251,8 +246,7 @@
         ..typeArgument = true
         ..checkedTypeArgument = true
         ..typeLiteral = true
-        ..functionType = _computeFunctionType(_elementEnvironment, cls,
-            strongMode: options.strongMode);
+        ..functionType = _computeFunctionType(_elementEnvironment, cls);
       classUseMap[cls] = classUse;
     }
     TypeChecks typeChecks = _substitutions._requiredChecks =
@@ -722,9 +716,6 @@
   final Set<Local> localFunctionsNeedingTypeArguments;
   final Set<Selector> selectorsNeedingTypeArguments;
   final Set<int> instantiationsNeedingTypeArguments;
-  // TODO(johnniwinther): Remove these fields together with Dart 1.
-  final bool allNeedsTypeArguments;
-  final bool runtimeTypeUsedOnClosures;
 
   RuntimeTypesNeedImpl(
       this._elementEnvironment,
@@ -734,33 +725,28 @@
       this.localFunctionsNeedingSignature,
       this.localFunctionsNeedingTypeArguments,
       this.selectorsNeedingTypeArguments,
-      this.instantiationsNeedingTypeArguments,
-      {this.allNeedsTypeArguments,
-      this.runtimeTypeUsedOnClosures});
+      this.instantiationsNeedingTypeArguments);
 
   bool checkClass(covariant ClassEntity cls) => true;
 
   bool classNeedsTypeArguments(ClassEntity cls) {
     assert(checkClass(cls));
     if (!_elementEnvironment.isGenericClass(cls)) return false;
-    if (allNeedsTypeArguments) return true;
     return classesNeedingTypeArguments.contains(cls);
   }
 
   bool methodNeedsSignature(FunctionEntity function) {
-    return allNeedsTypeArguments || methodsNeedingSignature.contains(function);
+    return methodsNeedingSignature.contains(function);
   }
 
   bool methodNeedsTypeArguments(FunctionEntity function) {
     if (function.parameterStructure.typeParameters == 0) return false;
-    if (allNeedsTypeArguments) return true;
     return methodsNeedingTypeArguments.contains(function);
   }
 
   @override
   bool selectorNeedsTypeArguments(Selector selector) {
     if (selector.callStructure.typeArgumentCount == 0) return false;
-    if (allNeedsTypeArguments) return true;
     return selectorsNeedingTypeArguments.contains(selector);
   }
 
@@ -1487,9 +1473,7 @@
       });
     }
 
-    Set<Local> localFunctions = options.strongMode
-        ? resolutionWorldBuilder.localFunctions.toSet()
-        : resolutionWorldBuilder.localFunctionsWithFreeTypeVariables.toSet();
+    Set<Local> localFunctions = resolutionWorldBuilder.localFunctions.toSet();
     Set<FunctionEntity> closurizedMembers =
         resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables.toSet();
 
@@ -1509,35 +1493,24 @@
 
       Set<Local> localFunctionsToRemove;
       Set<FunctionEntity> closurizedMembersToRemove;
-      if (options.strongMode) {
-        for (Local function in localFunctions) {
-          FunctionType functionType =
-              _elementEnvironment.getLocalFunctionType(function);
-          if (potentialSubtypeOf == null ||
-              closedWorld.dartTypes.isPotentialSubtype(
-                  functionType, potentialSubtypeOf,
-                  // TODO(johnniwinther): Use register generic instantiations
-                  // instead.
-                  assumeInstantiations: _genericInstantiations.isNotEmpty)) {
-            functionType.forEachTypeVariable((TypeVariableType typeVariable) {
-              Entity typeDeclaration = typeVariable.element.typeDeclaration;
-              if (!processedEntities.contains(typeDeclaration)) {
-                potentiallyNeedTypeArguments(typeDeclaration);
-              }
-            });
-            localFunctionsNeedingSignature.add(function);
-            localFunctionsToRemove ??= new Set<Local>();
-            localFunctionsToRemove.add(function);
-          }
-        }
-      } else {
-        for (Local function in localFunctions) {
-          if (checkFunctionType(
-              _elementEnvironment.getLocalFunctionType(function))) {
-            localFunctionsNeedingSignature.add(function);
-            localFunctionsToRemove ??= new Set<Local>();
-            localFunctionsToRemove.add(function);
-          }
+      for (Local function in localFunctions) {
+        FunctionType functionType =
+            _elementEnvironment.getLocalFunctionType(function);
+        if (potentialSubtypeOf == null ||
+            closedWorld.dartTypes
+                .isPotentialSubtype(functionType, potentialSubtypeOf,
+                    // TODO(johnniwinther): Use register generic instantiations
+                    // instead.
+                    assumeInstantiations: _genericInstantiations.isNotEmpty)) {
+          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            if (!processedEntities.contains(typeDeclaration)) {
+              potentiallyNeedTypeArguments(typeDeclaration);
+            }
+          });
+          localFunctionsNeedingSignature.add(function);
+          localFunctionsToRemove ??= new Set<Local>();
+          localFunctionsToRemove.add(function);
         }
       }
       for (FunctionEntity function in closurizedMembers) {
@@ -1586,10 +1559,6 @@
     processChecks(typeVariableTests.explicitIsChecks);
     processChecks(typeVariableTests.implicitIsChecks);
 
-    if (options.enableTypeAssertions) {
-      checkClosures();
-    }
-
     // Add the classes, methods and local functions that need type arguments
     // because they use a type variable as a literal.
     classesUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
@@ -1629,146 +1598,135 @@
       }
     }
 
-    bool allNeedsTypeArguments;
-    bool runtimeTypeUsedOnClosures;
     BackendUsage backendUsage = closedWorld.backendUsage;
     CommonElements commonElements = closedWorld.commonElements;
-    if (!options.strongMode) {
-      allNeedsTypeArguments =
-          runtimeTypeUsedOnClosures = backendUsage.isRuntimeTypeUsed;
-    } else {
-      allNeedsTypeArguments = runtimeTypeUsedOnClosures = false;
 
-      /// Set to `true` if subclasses of `Object` need runtimeType. This is
-      /// only used to stop the computation early.
-      bool neededOnAll = false;
+    /// Set to `true` if subclasses of `Object` need runtimeType. This is
+    /// only used to stop the computation early.
+    bool neededOnAll = false;
 
-      /// Set to `true` if subclasses of `Function` need runtimeType.
-      bool neededOnFunctions = false;
+    /// Set to `true` if subclasses of `Function` need runtimeType.
+    bool neededOnFunctions = false;
 
-      Set<ClassEntity> classesDirectlyNeedingRuntimeType =
-          new Set<ClassEntity>();
+    Set<ClassEntity> classesDirectlyNeedingRuntimeType = new Set<ClassEntity>();
 
-      ClassEntity impliedClass(DartType type) {
-        if (type is InterfaceType) {
-          return type.element;
-        } else if (type is DynamicType) {
-          return commonElements.objectClass;
-        } else if (type is FunctionType) {
-          // TODO(johnniwinther): Include only potential function type subtypes.
-          return commonElements.functionClass;
-        } else if (type is VoidType) {
-          // No classes implied.
-        } else if (type is FunctionTypeVariable) {
-          return impliedClass(type.bound);
-        } else if (type is TypeVariableType) {
-          // TODO(johnniwinther): Can we do better?
-          return impliedClass(
-              _elementEnvironment.getTypeVariableBound(type.element));
-        }
-        throw new UnsupportedError('Unexpected type $type');
+    ClassEntity impliedClass(DartType type) {
+      if (type is InterfaceType) {
+        return type.element;
+      } else if (type is DynamicType) {
+        return commonElements.objectClass;
+      } else if (type is FunctionType) {
+        // TODO(johnniwinther): Include only potential function type subtypes.
+        return commonElements.functionClass;
+      } else if (type is VoidType) {
+        // No classes implied.
+      } else if (type is FunctionTypeVariable) {
+        return impliedClass(type.bound);
+      } else if (type is TypeVariableType) {
+        // TODO(johnniwinther): Can we do better?
+        return impliedClass(
+            _elementEnvironment.getTypeVariableBound(type.element));
       }
+      throw new UnsupportedError('Unexpected type $type');
+    }
 
-      void addClass(ClassEntity cls) {
-        if (cls != null) {
-          classesDirectlyNeedingRuntimeType.add(cls);
-        }
-        if (cls == commonElements.objectClass) {
-          neededOnAll = true;
-        }
-        if (cls == commonElements.functionClass) {
-          neededOnFunctions = true;
-        }
+    void addClass(ClassEntity cls) {
+      if (cls != null) {
+        classesDirectlyNeedingRuntimeType.add(cls);
       }
-
-      for (RuntimeTypeUse runtimeTypeUse in backendUsage.runtimeTypeUses) {
-        switch (runtimeTypeUse.kind) {
-          case RuntimeTypeUseKind.string:
-            if (!options.laxRuntimeTypeToString) {
-              addClass(impliedClass(runtimeTypeUse.receiverType));
-            }
-
-            break;
-          case RuntimeTypeUseKind.equals:
-            ClassEntity receiverClass =
-                impliedClass(runtimeTypeUse.receiverType);
-            ClassEntity argumentClass =
-                impliedClass(runtimeTypeUse.argumentType);
-
-            // TODO(johnniwinther): Special case use of `this.runtimeType`.
-            SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
-                receiverClass,
-                ClassQuery.SUBTYPE,
-                argumentClass,
-                ClassQuery.SUBTYPE);
-            switch (result.kind) {
-              case SubclassResultKind.EMPTY:
-                break;
-              case SubclassResultKind.EXACT1:
-              case SubclassResultKind.SUBCLASS1:
-              case SubclassResultKind.SUBTYPE1:
-                addClass(receiverClass);
-                break;
-              case SubclassResultKind.EXACT2:
-              case SubclassResultKind.SUBCLASS2:
-              case SubclassResultKind.SUBTYPE2:
-                addClass(argumentClass);
-                break;
-              case SubclassResultKind.SET:
-                for (ClassEntity cls in result.classes) {
-                  addClass(cls);
-                  if (neededOnAll) break;
-                }
-                break;
-            }
-            break;
-          case RuntimeTypeUseKind.unknown:
-            addClass(impliedClass(runtimeTypeUse.receiverType));
-            break;
-        }
-        if (neededOnAll) break;
+      if (cls == commonElements.objectClass) {
+        neededOnAll = true;
       }
-      Set<ClassEntity> allClassesNeedingRuntimeType;
-      if (neededOnAll) {
+      if (cls == commonElements.functionClass) {
         neededOnFunctions = true;
-        allClassesNeedingRuntimeType = closedWorld.classHierarchy
-            .subclassesOf(commonElements.objectClass)
-            .toSet();
-      } else {
-        allClassesNeedingRuntimeType = new Set<ClassEntity>();
-        // TODO(johnniwinther): Support this operation directly in
-        // [ClosedWorld] using the [ClassSet]s.
-        for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
-          if (!allClassesNeedingRuntimeType.contains(cls)) {
-            allClassesNeedingRuntimeType
-                .addAll(closedWorld.classHierarchy.subtypesOf(cls));
+      }
+    }
+
+    for (RuntimeTypeUse runtimeTypeUse in backendUsage.runtimeTypeUses) {
+      switch (runtimeTypeUse.kind) {
+        case RuntimeTypeUseKind.string:
+          if (!options.laxRuntimeTypeToString) {
+            addClass(impliedClass(runtimeTypeUse.receiverType));
           }
+
+          break;
+        case RuntimeTypeUseKind.equals:
+          ClassEntity receiverClass = impliedClass(runtimeTypeUse.receiverType);
+          ClassEntity argumentClass = impliedClass(runtimeTypeUse.argumentType);
+
+          // TODO(johnniwinther): Special case use of `this.runtimeType`.
+          SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
+              receiverClass,
+              ClassQuery.SUBTYPE,
+              argumentClass,
+              ClassQuery.SUBTYPE);
+          switch (result.kind) {
+            case SubclassResultKind.EMPTY:
+              break;
+            case SubclassResultKind.EXACT1:
+            case SubclassResultKind.SUBCLASS1:
+            case SubclassResultKind.SUBTYPE1:
+              addClass(receiverClass);
+              break;
+            case SubclassResultKind.EXACT2:
+            case SubclassResultKind.SUBCLASS2:
+            case SubclassResultKind.SUBTYPE2:
+              addClass(argumentClass);
+              break;
+            case SubclassResultKind.SET:
+              for (ClassEntity cls in result.classes) {
+                addClass(cls);
+                if (neededOnAll) break;
+              }
+              break;
+          }
+          break;
+        case RuntimeTypeUseKind.unknown:
+          addClass(impliedClass(runtimeTypeUse.receiverType));
+          break;
+      }
+      if (neededOnAll) break;
+    }
+    Set<ClassEntity> allClassesNeedingRuntimeType;
+    if (neededOnAll) {
+      neededOnFunctions = true;
+      allClassesNeedingRuntimeType = closedWorld.classHierarchy
+          .subclassesOf(commonElements.objectClass)
+          .toSet();
+    } else {
+      allClassesNeedingRuntimeType = new Set<ClassEntity>();
+      // TODO(johnniwinther): Support this operation directly in
+      // [ClosedWorld] using the [ClassSet]s.
+      for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
+        if (!allClassesNeedingRuntimeType.contains(cls)) {
+          allClassesNeedingRuntimeType
+              .addAll(closedWorld.classHierarchy.subtypesOf(cls));
         }
       }
-      allClassesNeedingRuntimeType.forEach(potentiallyNeedTypeArguments);
-      if (neededOnFunctions) {
-        for (Local function in resolutionWorldBuilder.genericLocalFunctions) {
-          potentiallyNeedTypeArguments(function);
-        }
-        for (Local function in localFunctions) {
-          FunctionType functionType =
-              _elementEnvironment.getLocalFunctionType(function);
-          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
-            Entity typeDeclaration = typeVariable.element.typeDeclaration;
-            if (!processedEntities.contains(typeDeclaration)) {
-              potentiallyNeedTypeArguments(typeDeclaration);
-            }
-          });
-          localFunctionsNeedingSignature.addAll(localFunctions);
-        }
-        for (FunctionEntity function in resolutionWorldBuilder.genericMethods) {
-          potentiallyNeedTypeArguments(function);
-        }
-        for (FunctionEntity function
-            in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
-          methodsNeedingSignature.add(function);
-          potentiallyNeedTypeArguments(function.enclosingClass);
-        }
+    }
+    allClassesNeedingRuntimeType.forEach(potentiallyNeedTypeArguments);
+    if (neededOnFunctions) {
+      for (Local function in resolutionWorldBuilder.genericLocalFunctions) {
+        potentiallyNeedTypeArguments(function);
+      }
+      for (Local function in localFunctions) {
+        FunctionType functionType =
+            _elementEnvironment.getLocalFunctionType(function);
+        functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+          Entity typeDeclaration = typeVariable.element.typeDeclaration;
+          if (!processedEntities.contains(typeDeclaration)) {
+            potentiallyNeedTypeArguments(typeDeclaration);
+          }
+        });
+        localFunctionsNeedingSignature.addAll(localFunctions);
+      }
+      for (FunctionEntity function in resolutionWorldBuilder.genericMethods) {
+        potentiallyNeedTypeArguments(function);
+      }
+      for (FunctionEntity function
+          in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
+        methodsNeedingSignature.add(function);
+        potentiallyNeedTypeArguments(function.enclosingClass);
       }
     }
 
@@ -1838,9 +1796,7 @@
     print('selectorsNeedingTypeArguments:');
     selectorsNeedingTypeArguments.forEach((e) => print('  $e'));
     print('instantiationsNeedingTypeArguments: '
-        '$instantiationsNeedingTypeArguments');
-    print('allNeedsTypeArguments=$allNeedsTypeArguments');
-    print('runtimeTypeUsedOnClosures=$runtimeTypeUsedOnClosures');*/
+        '$instantiationsNeedingTypeArguments');*/
 
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
@@ -1850,9 +1806,7 @@
         localFunctionsNeedingSignature,
         localFunctionsNeedingTypeArguments,
         selectorsNeedingTypeArguments,
-        instantiationsNeedingTypeArguments,
-        allNeedsTypeArguments: allNeedsTypeArguments,
-        runtimeTypeUsedOnClosures: runtimeTypeUsedOnClosures);
+        instantiationsNeedingTypeArguments);
   }
 }
 
@@ -2030,56 +1984,30 @@
     explicitIsChecks.forEach(processCheckedType);
     implicitIsChecks.forEach(processCheckedType);
 
-    // In Dart 1, a class that defines a `call` method implicitly has function
-    // type of its `call` method and needs a signature function for testing its
-    // function type against typedefs and function types that are used in
-    // is-checks.
-    //
-    // In Dart 2, a closure class implements the function type of its `call`
+    // A closure class implements the function type of its `call`
     // method and needs a signature function for testing its function type
     // against typedefs and function types that are used in is-checks. Since
     // closures have a signature method iff they need it and should have a
-    // function type iff they have a signature, we process all classes. We know
-    // that the function type is not inherited, so we don't need to process
-    // their super classes.
-    if (isFunctionChecked ||
-        checkedFunctionTypes.isNotEmpty ||
-        options.strongMode) {
-      Set<ClassEntity> processedClasses = new Set<ClassEntity>();
-
-      void processClass(ClassEntity cls) {
-        ClassFunctionType functionType = _computeFunctionType(
-            _elementEnvironment, cls,
-            strongMode: options.strongMode);
-        if (functionType != null) {
-          ClassUse classUse =
-              classUseMap.putIfAbsent(cls, () => new ClassUse());
-          classUse.functionType = functionType;
-        }
-      }
-
-      void processSuperClasses(ClassEntity cls, [ClassUse classUse]) {
-        while (cls != null && processedClasses.add(cls)) {
-          processClass(cls);
-          cls = _elementEnvironment.getSuperClass(cls);
-        }
-      }
-
-      // Collect classes that are 'live' either through instantiation or use in
-      // type arguments.
-      List<ClassEntity> liveClasses = <ClassEntity>[];
-      classUseMap.forEach((ClassEntity cls, ClassUse classUse) {
-        if (classUse.isLive) {
-          liveClasses.add(cls);
-        }
-      });
-      if (options.strongMode) {
-        liveClasses.forEach(processClass);
-      } else {
-        liveClasses.forEach(processSuperClasses);
+    // function type iff they have a signature, we process all classes.
+    void processClass(ClassEntity cls) {
+      ClassFunctionType functionType =
+          _computeFunctionType(_elementEnvironment, cls);
+      if (functionType != null) {
+        ClassUse classUse = classUseMap.putIfAbsent(cls, () => new ClassUse());
+        classUse.functionType = functionType;
       }
     }
 
+    // Collect classes that are 'live' either through instantiation or use in
+    // type arguments.
+    List<ClassEntity> liveClasses = <ClassEntity>[];
+    classUseMap.forEach((ClassEntity cls, ClassUse classUse) {
+      if (classUse.isLive) {
+        liveClasses.add(cls);
+      }
+    });
+    liveClasses.forEach(processClass);
+
     if (options.parameterCheckPolicy.isEmitted) {
       for (FunctionEntity method in codegenWorldBuilder.genericMethods) {
         if (_rtiNeed.methodNeedsTypeArguments(method)) {
@@ -2106,19 +2034,18 @@
 /// In Dart 1, any class with a `call` method has a function type, in Dart 2
 /// only closure classes have a function type.
 ClassFunctionType _computeFunctionType(
-    ElementEnvironment elementEnvironment, ClassEntity cls,
-    {bool strongMode}) {
+    ElementEnvironment elementEnvironment, ClassEntity cls) {
   FunctionEntity signatureFunction;
   if (cls.isClosure) {
     // Use signature function if available.
     signatureFunction =
         elementEnvironment.lookupLocalClassMember(cls, Identifiers.signature);
-    if (signatureFunction == null && strongMode) {
+    if (signatureFunction == null) {
       // In Dart 2, a closure only needs its function type if it has a
       // signature function.
       return null;
     }
-  } else if (strongMode) {
+  } else {
     // Only closures have function type in Dart 2.
     return null;
   }
@@ -2140,11 +2067,9 @@
   final RuntimeTypesNeed _rtiNeed;
 
   RuntimeTypesEncoderImpl(this.namer, NativeBasicData nativeData,
-      this._elementEnvironment, this.commonElements, this._rtiNeed,
-      {bool strongMode})
-      : _representationGenerator = new TypeRepresentationGenerator(
-            namer, nativeData,
-            strongMode: strongMode);
+      this._elementEnvironment, this.commonElements, this._rtiNeed)
+      : _representationGenerator =
+            new TypeRepresentationGenerator(namer, nativeData);
 
   @override
   bool isSimpleFunctionType(FunctionType type) {
@@ -2364,16 +2289,13 @@
     implements DartTypeVisitor<jsAst.Expression, Emitter> {
   final Namer namer;
   final NativeBasicData _nativeData;
-  // If true, compile using strong mode.
-  final bool _strongMode;
 
   OnVariableCallback onVariable;
   ShouldEncodeTypedefCallback shouldEncodeTypedef;
   Map<TypeVariableType, jsAst.Expression> typedefBindings;
   List<FunctionTypeVariable> functionTypeVariables = <FunctionTypeVariable>[];
 
-  TypeRepresentationGenerator(this.namer, this._nativeData, {bool strongMode})
-      : _strongMode = strongMode;
+  TypeRepresentationGenerator(this.namer, this._nativeData);
 
   /**
    * Creates a type representation for [type]. [onVariable] is called to provide
@@ -2410,9 +2332,6 @@
 
   jsAst.Expression visitTypeVariableType(
       TypeVariableType type, Emitter emitter) {
-    if (!_strongMode && type.element.typeDeclaration is! ClassEntity) {
-      return getDynamicValue();
-    }
     if (typedefBindings != null) {
       assert(typedefBindings[type] != null);
       return typedefBindings[type];
@@ -2446,7 +2365,7 @@
   jsAst.Expression visitInterfaceType(InterfaceType type, Emitter emitter) {
     jsAst.Expression name = getJavaScriptClassName(type.element, emitter);
     jsAst.Expression result;
-    if ((!_strongMode && type.treatAsRaw) || type.typeArguments.isEmpty) {
+    if (type.typeArguments.isEmpty) {
       result = name;
     } else {
       // Visit all type arguments. This is done even for jsinterop classes to
@@ -2531,9 +2450,7 @@
           visitList(type.typeVariables.map((v) => v.bound).toList(), emitter));
     }
 
-    if (!_strongMode && type.returnType.isVoid) {
-      addProperty(namer.functionTypeVoidReturnTag, js('true'));
-    } else if (!type.returnType.treatAsDynamic) {
+    if (!type.returnType.treatAsDynamic) {
       addProperty(
           namer.functionTypeReturnTypeTag, visit(type.returnType, emitter));
     }
@@ -2568,7 +2485,7 @@
   }
 
   jsAst.Expression visitVoidType(VoidType type, Emitter emitter) {
-    return _strongMode ? getVoidValue() : getDynamicValue();
+    return getVoidValue();
   }
 
   jsAst.Expression visitTypedefType(TypedefType type, Emitter emitter) {
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index d51e23b..8a5364e3 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -179,10 +179,8 @@
           compiler.reporter,
           closedWorld.elementEnvironment,
           closedWorld.commonElements,
-          closedWorld.dartTypes,
           compiler.deferredLoadTask,
           backend.outputUnitData,
-          compiler.backendStrategy.closureDataLookup,
           compiler.codegenWorldBuilder,
           backend.nativeCodegenEnqueuer,
           closedWorld.backendUsage,
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 8dd194e..02253a2 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -1689,9 +1689,9 @@
   jsAst.Comment buildGeneratedBy() {
     StringBuffer flavor = new StringBuffer();
     flavor.write('full emitter');
-    if (compiler.options.strongMode) flavor.write(', strong');
+    // TODO(johnniwinther): Remove this flavor.
+    flavor.write(', strong');
     if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
-    if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
     if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
     if (compiler.options.laxRuntimeTypeToString) {
       flavor.write(', lax runtime type');
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 547f81d..0e3bb18 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -308,7 +308,7 @@
       // checked mode, so we don't optimize the interceptor if the
       // _compiler has type assertions enabled.
       if (selector.isIndexSet &&
-          (_options.enableTypeAssertions || !containsArray)) {
+          (_options.parameterCheckPolicy.isEmitted || !containsArray)) {
         return null;
       }
       if (!containsArray && !containsString) {
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
index 440fecd..ae7de9e 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
@@ -100,7 +100,7 @@
         js.Name accessorName = _namer.fieldAccessorName(field);
         js.Name fieldName = _namer.fieldPropertyName(field);
         bool needsCheckedSetter = false;
-        if (_options.enableTypeAssertions &&
+        if (_options.parameterCheckPolicy.isEmitted &&
             needsSetter &&
             !canAvoidGeneratedCheckedSetter(field)) {
           needsCheckedSetter = true;
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 7679275..4138b1f 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
@@ -7,7 +7,6 @@
 import 'dart:io';
 import 'dart:convert' show jsonDecode;
 
-import '../../closure.dart' show ClosureConversionTask;
 import '../../common.dart';
 import '../../common/names.dart' show Names, Selectors;
 import '../../constants/values.dart'
@@ -64,10 +63,8 @@
   final DiagnosticReporter _reporter;
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
-  final DartTypes _types;
   final DeferredLoadTask _deferredLoadTask;
   final OutputUnitData _outputUnitData;
-  final ClosureConversionTask _closureDataLookup;
   final CodegenWorldBuilder _worldBuilder;
   final NativeCodegenEnqueuer _nativeCodegenEnqueuer;
   final BackendUsage _backendUsage;
@@ -112,10 +109,8 @@
       this._reporter,
       this._elementEnvironment,
       this._commonElements,
-      this._types,
       this._deferredLoadTask,
       this._outputUnitData,
-      this._closureDataLookup,
       this._worldBuilder,
       this._nativeCodegenEnqueuer,
       this._backendUsage,
@@ -541,28 +536,7 @@
               FunctionEntity fn = member;
               functionType = _elementEnvironment.getFunctionType(fn);
             } else if (member.isGetter) {
-              if (_options.trustTypeAnnotations) {
-                DartType returnType =
-                    _elementEnvironment.getFunctionType(member).returnType;
-                if (returnType.isFunctionType) {
-                  functionType = returnType;
-                } else if (returnType.treatAsDynamic ||
-                    _types.isSubtype(
-                        returnType,
-                        // ignore: UNNECESSARY_CAST
-                        _commonElements.functionType as DartType)) {
-                  if (returnType.isTypedef) {
-                    TypedefType typedef = returnType;
-                    functionType = typedef.unaliased;
-                  } else {
-                    // Other misc function type such as commonElements.Function.
-                    // Allow any number of arguments.
-                    isFunctionLike = true;
-                  }
-                }
-              } else {
-                isFunctionLike = true;
-              }
+              isFunctionLike = true;
             } // TODO(jacobr): handle field elements.
 
             if (isFunctionLike || functionType != null) {
@@ -667,14 +641,12 @@
         enableMinification: _options.enableMinification);
     RuntimeTypeGenerator runtimeTypeGenerator = new RuntimeTypeGenerator(
         _commonElements,
-        _closureDataLookup,
         _outputUnitData,
         _task,
         _namer,
         _rtiChecks,
         _rtiEncoder,
-        _jsInteropAnalysis,
-        _options.strongMode);
+        _jsInteropAnalysis);
 
     void visitMember(MemberEntity member) {
       if (member.isInstanceMember && !member.isAbstract && !member.isField) {
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index fbc15f5..cd30c3d 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -4,8 +4,6 @@
 
 library dart2js.js_emitter.runtime_type_generator;
 
-import '../closure.dart'
-    show ClosureRepresentationInfo, ClosureConversionTask, ScopeInfo;
 import '../common_elements.dart' show CommonElements;
 import '../deferred_load.dart' show OutputUnit, OutputUnitData;
 import '../elements/entities.dart';
@@ -23,7 +21,6 @@
         Substitution,
         TypeCheck;
 import '../js_emitter/sorter.dart';
-import '../js_model/closure.dart' show JClosureField;
 import '../util/util.dart' show Setlet;
 
 import 'code_emitter_task.dart' show CodeEmitterTask;
@@ -93,26 +90,22 @@
 
 class RuntimeTypeGenerator {
   final CommonElements _commonElements;
-  final ClosureConversionTask _closureDataLookup;
   final OutputUnitData _outputUnitData;
   final CodeEmitterTask emitterTask;
   final Namer _namer;
   final RuntimeTypesChecks _rtiChecks;
   final RuntimeTypesEncoder _rtiEncoder;
   final JsInteropAnalysis _jsInteropAnalysis;
-  final bool _strongMode;
   final _TypeContainedInOutputUnitVisitor _outputUnitVisitor;
 
   RuntimeTypeGenerator(
       this._commonElements,
-      this._closureDataLookup,
       this._outputUnitData,
       this.emitterTask,
       this._namer,
       this._rtiChecks,
       this._rtiEncoder,
-      this._jsInteropAnalysis,
-      this._strongMode)
+      this._jsInteropAnalysis)
       : _outputUnitVisitor = new _TypeContainedInOutputUnitVisitor(
             _commonElements, _outputUnitData);
 
@@ -170,43 +163,21 @@
       } else {
         jsAst.Expression encoding =
             generatedCode[classFunctionType.signatureFunction];
-        if (_strongMode) {
-          if (classFunctionType.signatureFunction == null) {
-            // The signature function isn't live.
-            return;
+        if (classFunctionType.signatureFunction == null) {
+          // The signature function isn't live.
+          return;
+        }
+        if (functionTypeIndex != null) {
+          if (isDeferred) {
+            // The function type index must be offset by the number of types
+            // already loaded.
+            encoding = new jsAst.Binary(
+                '+',
+                new jsAst.VariableUse(_namer.typesOffsetName),
+                functionTypeIndex);
+          } else {
+            encoding = functionTypeIndex;
           }
-          if (functionTypeIndex != null) {
-            if (isDeferred) {
-              // The function type index must be offset by the number of types
-              // already loaded.
-              encoding = new jsAst.Binary(
-                  '+',
-                  new jsAst.VariableUse(_namer.typesOffsetName),
-                  functionTypeIndex);
-            } else {
-              encoding = functionTypeIndex;
-            }
-          }
-        } else if (encoding == null) {
-          // Generate the signature on the fly. This is only supported for
-          // Dart 1.
-
-          jsAst.Expression thisAccess = new jsAst.This();
-          if (method.enclosingClass.isClosure) {
-            ScopeInfo scopeInfo = _closureDataLookup.getScopeInfo(method);
-            if (scopeInfo is ClosureRepresentationInfo) {
-              FieldEntity thisLocal = scopeInfo.thisFieldEntity;
-              if (thisLocal != null) {
-                assert(thisLocal is JClosureField);
-                jsAst.Name thisName =
-                    _namer.instanceFieldPropertyName(thisLocal);
-                thisAccess = js('this.#', thisName);
-              }
-            }
-          }
-
-          encoding = _rtiEncoder.getSignatureEncoding(
-              emitterTask.emitter, type, thisAccess);
         }
         if (encoding != null) {
           jsAst.Name operatorSignature =
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 26ac418..ad0cb13 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -397,54 +397,6 @@
   })()
 ''';
 
-/// Deferred fragments (aka 'hunks') are built similarly to the main fragment.
-///
-/// However, at specific moments they need to contribute their data.
-/// For example, once the holders have been created, they are included into
-/// the main holders.
-///
-/// This template is used for Dart 1.
-const String deferredBoilerplateDart1 = '''
-function(inherit, mixin, lazy, makeConstList, convertToFastObject,
-         installTearOff, setFunctionNamesIfNecessary, updateHolder, updateTypes,
-         setOrUpdateInterceptorsByTag, setOrUpdateLeafTags,
-         #embeddedGlobalsObject, holdersList, #staticState) {
-
-// Builds the holders. They only contain the data for new holders.
-#holders;
-
-// If the name is not set on the functions, do it now.
-setFunctionNamesIfNecessary(#deferredHoldersList);
-
-// Updates the holders of the main-fragment. Uses the provided holdersList to
-// access the main holders.
-// The local holders are replaced by the combined holders. This is necessary
-// for the inheritance setup below.
-#updateHolders;
-// Sets the prototypes of the new classes.
-#prototypes;
-// Sets aliases of methods (on the prototypes of classes).
-#aliases;
-// Installs the tear-offs of functions.
-#tearOffs;
-// Builds the inheritance structure.
-#inheritance;
-
-// Instantiates all constants of this deferred fragment.
-// Note that the constant-holder has been updated earlier and storing the
-// constant values in the constant-holder makes them available globally.
-#constants;
-// Initializes the static non-final fields (with their constant values).
-#staticNonFinalFields;
-// Creates lazy getters for statics that must run initializers on first access.
-#lazyStatics;
-
-updateTypes(#types);
-
-// Native-support uses setOrUpdateInterceptorsByTag and setOrUpdateLeafTags.
-#nativeSupport;
-}''';
-
 /// Soft-deferred fragments are built similarly to the main fragment.
 
 /// Deferred fragments (aka 'hunks') are built similarly to the main fragment.
@@ -645,51 +597,28 @@
           '#holder = updateHolder(holdersList[#index], #holder)',
           {'index': js.number(i), 'holder': new js.VariableUse(holder.name)}));
     }
-    if (compiler.options.strongMode) {
-      // TODO(floitsch): don't just reference 'init'.
-      return js.js(deferredBoilerplateDart2, {
-        'embeddedGlobalsObject': new js.Parameter('init'),
-        'staticState': new js.Parameter(namer.staticStateHolder),
-        'holders': emitHolders(holders, fragment),
-        'deferredHoldersList': new js.ArrayInitializer(nonStaticStateHolders
-            .map((holder) => js.js("#", holder.name))
-            .toList(growable: false)),
-        'updateHolders': new js.Block(updateHolderAssignments),
-        'prototypes': emitPrototypes(fragment, includeClosures: false),
-        'closures': emitPrototypes(fragment, includeClosures: true),
-        'inheritance': emitInheritance(fragment),
-        'aliases': emitInstanceMethodAliases(fragment),
-        'tearOffs': emitInstallTearOffs(fragment),
-        'constants': emitConstants(fragment),
-        'staticNonFinalFields': emitStaticNonFinalFields(fragment),
-        'lazyStatics': emitLazilyInitializedStatics(fragment),
-        'types': deferredTypes,
-        // TODO(floitsch): only call emitNativeSupport if we need native.
-        'nativeSupport': emitNativeSupport(fragment),
-        'typesOffset': namer.typesOffsetName,
-      });
-    } else {
-      // TODO(floitsch): don't just reference 'init'.
-      return js.js(deferredBoilerplateDart1, {
-        'embeddedGlobalsObject': new js.Parameter('init'),
-        'staticState': new js.Parameter(namer.staticStateHolder),
-        'holders': emitHolders(holders, fragment),
-        'deferredHoldersList': new js.ArrayInitializer(nonStaticStateHolders
-            .map((holder) => js.js("#", holder.name))
-            .toList(growable: false)),
-        'updateHolders': new js.Block(updateHolderAssignments),
-        'prototypes': emitPrototypes(fragment),
-        'inheritance': emitInheritance(fragment),
-        'aliases': emitInstanceMethodAliases(fragment),
-        'tearOffs': emitInstallTearOffs(fragment),
-        'constants': emitConstants(fragment),
-        'staticNonFinalFields': emitStaticNonFinalFields(fragment),
-        'lazyStatics': emitLazilyInitializedStatics(fragment),
-        'types': deferredTypes,
-        // TODO(floitsch): only call emitNativeSupport if we need native.
-        'nativeSupport': emitNativeSupport(fragment),
-      });
-    }
+    // TODO(floitsch): don't just reference 'init'.
+    return js.js(deferredBoilerplateDart2, {
+      'embeddedGlobalsObject': new js.Parameter('init'),
+      'staticState': new js.Parameter(namer.staticStateHolder),
+      'holders': emitHolders(holders, fragment),
+      'deferredHoldersList': new js.ArrayInitializer(nonStaticStateHolders
+          .map((holder) => js.js("#", holder.name))
+          .toList(growable: false)),
+      'updateHolders': new js.Block(updateHolderAssignments),
+      'prototypes': emitPrototypes(fragment, includeClosures: false),
+      'closures': emitPrototypes(fragment, includeClosures: true),
+      'inheritance': emitInheritance(fragment),
+      'aliases': emitInstanceMethodAliases(fragment),
+      'tearOffs': emitInstallTearOffs(fragment),
+      'constants': emitConstants(fragment),
+      'staticNonFinalFields': emitStaticNonFinalFields(fragment),
+      'lazyStatics': emitLazilyInitializedStatics(fragment),
+      'types': deferredTypes,
+      // TODO(floitsch): only call emitNativeSupport if we need native.
+      'nativeSupport': emitNativeSupport(fragment),
+      'typesOffset': namer.typesOffsetName,
+    });
   }
 
   /// Emits all holders, except for the static-state holder.
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 380e458..624d640 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -222,9 +222,9 @@
   js.Comment buildGeneratedBy() {
     StringBuffer flavor = new StringBuffer();
     flavor.write('fast startup emitter');
-    if (compiler.options.strongMode) flavor.write(', strong');
+    // TODO(johnniwinther): Remove this flavor.
+    flavor.write(', strong');
     if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
-    if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
     if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
     if (compiler.options.laxRuntimeTypeToString) {
       flavor.write(', lax runtime type');
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index f4d37d7..ecb5a5f 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -25,8 +25,7 @@
 class KernelClosureAnalysis {
   /// Inspect members and mark if those members capture any state that needs to
   /// be marked as free variables.
-  static ScopeModel computeScopeModel(
-      MemberEntity entity, ir.Member node, CompilerOptions options) {
+  static ScopeModel computeScopeModel(MemberEntity entity, ir.Member node) {
     if (entity.isAbstract) return null;
     if (entity.isField && !entity.isInstanceMember) {
       ir.Field field = node;
@@ -43,7 +42,7 @@
     }
     ScopeModel model = new ScopeModel();
     CapturedScopeBuilder translator =
-        new CapturedScopeBuilder(model, options, hasThisLocal: hasThisLocal);
+        new CapturedScopeBuilder(model, hasThisLocal: hasThisLocal);
     if (entity.isField) {
       if (node is ir.Field && node.initializer != null) {
         node.accept(translator);
diff --git a/pkg/compiler/lib/src/js_model/closure_visitors.dart b/pkg/compiler/lib/src/js_model/closure_visitors.dart
index 9c1dfbb..9c67a77 100644
--- a/pkg/compiler/lib/src/js_model/closure_visitors.dart
+++ b/pkg/compiler/lib/src/js_model/closure_visitors.dart
@@ -5,7 +5,6 @@
 import 'package:kernel/ast.dart' as ir;
 
 import '../closure.dart';
-import '../options.dart';
 import 'closure.dart';
 
 /// This builder walks the code to determine what variables are captured/free at
@@ -14,8 +13,6 @@
 class CapturedScopeBuilder extends ir.Visitor {
   ScopeModel _model;
 
-  CompilerOptions _options;
-
   /// A map of each visited call node with the associated information about what
   /// variables are captured/used. Each ir.Node key corresponds to a scope that
   /// was encountered while visiting a closure (initially called through
@@ -75,7 +72,7 @@
   /// type variable usage, such as type argument in method invocations.
   VariableUse _currentTypeUsage;
 
-  CapturedScopeBuilder(this._model, this._options, {bool hasThisLocal})
+  CapturedScopeBuilder(this._model, {bool hasThisLocal})
       : this._hasThisLocal = hasThisLocal;
 
   /// Update the [CapturedScope] object corresponding to
@@ -675,9 +672,6 @@
   /// indicating it *may* be used only if runtime type information is checked.
   void _useTypeVariableAsLocal(
       TypeVariableTypeWithContext typeVariable, VariableUse usage) {
-    if (typeVariable.kind != TypeVariableKind.cls && !_options.strongMode) {
-      return;
-    }
     _markVariableAsUsed(typeVariable, usage);
   }
 }
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index a4b4472..095117e 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -353,10 +353,7 @@
           new JsClosureRtiNeed(
               jRtiNeed,
               localFunctionsNodesNeedingTypeArguments,
-              localFunctionsNodesNeedingSignature,
-              runtimeTypeUsedOnClosures:
-                  kernelRtiNeed.runtimeTypeUsedOnClosures,
-              allNeedsTypeArguments: kernelRtiNeed.allNeedsTypeArguments));
+              localFunctionsNodesNeedingSignature));
 
       List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
       for (ir.Node node in localFunctionsNodesNeedingSignature) {
@@ -582,9 +579,7 @@
         null,
         null,
         selectorsNeedingTypeArguments,
-        rtiNeed.instantiationsNeedingTypeArguments,
-        allNeedsTypeArguments: rtiNeed.allNeedsTypeArguments,
-        runtimeTypeUsedOnClosures: rtiNeed.runtimeTypeUsedOnClosures);
+        rtiNeed.instantiationsNeedingTypeArguments);
   }
 
   /// Construct a closure class and set up the necessary class inference
@@ -865,18 +860,14 @@
   final RuntimeTypesNeed rtiNeed;
   final Set<ir.Node> localFunctionsNodesNeedingTypeArguments;
   final Set<ir.Node> localFunctionsNodesNeedingSignature;
-  final bool runtimeTypeUsedOnClosures;
-  final bool allNeedsTypeArguments;
 
   JsClosureRtiNeed(this.rtiNeed, this.localFunctionsNodesNeedingTypeArguments,
-      this.localFunctionsNodesNeedingSignature,
-      {this.runtimeTypeUsedOnClosures, this.allNeedsTypeArguments});
+      this.localFunctionsNodesNeedingSignature);
 
   @override
   bool localFunctionNeedsSignature(ir.Node node) {
     assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return runtimeTypeUsedOnClosures ||
-        localFunctionsNodesNeedingSignature.contains(node);
+    return localFunctionsNodesNeedingSignature.contains(node);
   }
 
   @override
@@ -890,8 +881,7 @@
   @override
   bool localFunctionNeedsTypeArguments(ir.Node node) {
     assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return allNeedsTypeArguments ||
-        localFunctionsNodesNeedingTypeArguments.contains(node);
+    return localFunctionsNodesNeedingTypeArguments.contains(node);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 891f792..e6d05b3 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -45,15 +45,11 @@
   bool get errorOnUnexactWebIntLiterals => true;
 
   @override
-  void performModularTransformationsOnLibraries(
+  void performModularTransformationsOnLibraries(ir.Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<ir.Library> libraries,
       {void logger(String msg)}) {}
 
   @override
-  void performGlobalTransformations(CoreTypes coreTypes, ir.Component component,
-      {void logger(String msg)}) {}
-
-  @override
   ir.Expression instantiateInvocation(
       CoreTypes coreTypes,
       ir.Expression receiver,
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index c085388..998afb5 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -93,12 +93,6 @@
   /// Returns the [Name] corresponding to [name].
   Name getName(ir.Name name);
 
-  /// Return `true` if [member] is a "foreign helper", that is, a member whose
-  /// semantics is defined synthetically and not through Dart code.
-  ///
-  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
-  bool isForeignHelper(MemberEntity member);
-
   /// Computes the [native.NativeBehavior] for a call to the [JS] function.
   native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 524c487..aa15678 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -464,7 +464,7 @@
       namedParameterTypes.add(getParameterType(variable));
     }
     List<FunctionTypeVariable> typeVariables;
-    if (node.typeParameters.isNotEmpty && options.strongMode) {
+    if (node.typeParameters.isNotEmpty) {
       List<DartType> typeParameters = <DartType>[];
       for (ir.TypeParameter typeParameter in node.typeParameters) {
         typeParameters
@@ -511,7 +511,7 @@
   void _ensureCallType(IndexedClass cls, ClassData data) {
     if (!data.isCallTypeComputed) {
       data.isCallTypeComputed = true;
-      if (options.strongMode && !cls.isClosure) {
+      if (!cls.isClosure) {
         // In Dart 2, a regular class with a 'call' method is no longer a
         // subtype of its function type.
         return;
@@ -861,8 +861,7 @@
       try {
         _typeEnvironment ??= new ir.TypeEnvironment(
             new ir.CoreTypes(_env.mainComponent),
-            new ir.ClassHierarchy(_env.mainComponent),
-            strongMode: options.strongMode);
+            new ir.ClassHierarchy(_env.mainComponent));
       } catch (e) {}
     }
     if (_typeEnvironment == null) {
@@ -1163,11 +1162,8 @@
     int typeParameters = node.typeParameters.length;
     List<String> namedParameters =
         node.namedParameters.map((p) => p.name).toList()..sort();
-    return new ParameterStructure(
-        requiredParameters,
-        positionalParameters,
-        namedParameters,
-        options.strongMode && includeTypeParameters ? typeParameters : 0);
+    return new ParameterStructure(requiredParameters, positionalParameters,
+        namedParameters, includeTypeParameters ? typeParameters : 0);
   }
 
   IndexedLibrary createLibrary(String name, Uri canonicalUri);
@@ -1347,7 +1343,7 @@
 
   ScopeModel computeScopeModel(KMember member) {
     ir.Member node = _members.getData(member).definition.node;
-    return KernelClosureAnalysis.computeScopeModel(member, node, options);
+    return KernelClosureAnalysis.computeScopeModel(member, node);
   }
 
   /// Returns the kernel [ir.Procedure] node for the [method].
@@ -1820,16 +1816,6 @@
     if (typeParameter != null) {
       return typeParameter;
     }
-    if (node.parameter.parent is ir.FunctionNode &&
-        node.parameter.parent.parent is ir.Procedure) {
-      // Special case for Dart 1 compatibility in checked mode.
-      ir.Procedure typeParameterParent = node.parameter.parent.parent;
-      if (typeParameterParent.kind != ir.ProcedureKind.Factory &&
-          !elementMap.options.strongMode) {
-        return new Dart1MethodTypeVariableType(
-            elementMap.getTypeVariable(node.parameter));
-      }
-    }
     if (node.parameter.parent is ir.Typedef) {
       // Typedefs are only used in type literals so we never need their type
       // variables.
@@ -1843,14 +1829,10 @@
     int index = 0;
     List<FunctionTypeVariable> typeVariables;
     for (ir.TypeParameter typeParameter in node.typeParameters) {
-      if (elementMap.options.strongMode) {
-        FunctionTypeVariable typeVariable = new FunctionTypeVariable(index);
-        currentFunctionTypeParameters[typeParameter] = typeVariable;
-        typeVariables ??= <FunctionTypeVariable>[];
-        typeVariables.add(typeVariable);
-      } else {
-        currentFunctionTypeParameters[typeParameter] = const DynamicType();
-      }
+      FunctionTypeVariable typeVariable = new FunctionTypeVariable(index);
+      currentFunctionTypeParameters[typeParameter] = typeVariable;
+      typeVariables ??= <FunctionTypeVariable>[];
+      typeVariables.add(typeVariable);
       index++;
     }
     if (typeVariables != null) {
@@ -1882,11 +1864,7 @@
     ClassEntity cls = elementMap.getClass(node.classNode);
     if (cls.name == 'FutureOr' &&
         cls.library == elementMap.commonElements.asyncLibrary) {
-      if (elementMap.options.strongMode) {
-        return new FutureOrType(visitTypes(node.typeArguments).single);
-      }
-      // In Dart 1 we encode 'FutureOr' as a dynamic type.
-      return const DynamicType();
+      return new FutureOrType(visitTypes(node.typeArguments).single);
     }
     return new InterfaceType(cls, visitTypes(node.typeArguments));
   }
@@ -2296,7 +2274,7 @@
           _libraries.register<IndexedLibrary, LibraryData, LibraryEnv>(
               newLibrary,
               data.copy(),
-              options.strongMode && useStrongModeWorldStrategy
+              useStrongModeWorldStrategy
                   ? env.copyLive(_elementMap, liveMembers)
                   : env);
       assert(newLibrary.libraryIndex == oldLibrary.libraryIndex);
@@ -2313,7 +2291,7 @@
       _classMap[env.cls] = _classes.register(
           newClass,
           data.copy(),
-          options.strongMode && useStrongModeWorldStrategy
+          useStrongModeWorldStrategy
               ? env.copyLive(_elementMap, liveMembers)
               : env);
       assert(newClass.classIndex == oldClass.classIndex);
@@ -2342,9 +2320,7 @@
         memberIndex < _elementMap._members.length;
         memberIndex++) {
       IndexedMember oldMember = _elementMap._members.getEntity(memberIndex);
-      if (options.strongMode &&
-          useStrongModeWorldStrategy &&
-          !liveMembers.contains(oldMember)) {
+      if (useStrongModeWorldStrategy && !liveMembers.contains(oldMember)) {
         _members.skipIndex(oldMember.memberIndex);
         continue;
       }
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index 88c8a8c..5dc1496 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -45,8 +45,8 @@
   CallStructure getCallStructure(ir.Arguments arguments) {
     int argumentCount = arguments.positional.length + arguments.named.length;
     List<String> namedArguments = arguments.named.map((e) => e.name).toList();
-    return new CallStructure(argumentCount, namedArguments,
-        options.strongMode ? arguments.types.length : 0);
+    return new CallStructure(
+        argumentCount, namedArguments, arguments.types.length);
   }
 
   @override
@@ -104,15 +104,6 @@
     return new Selector.setter(name);
   }
 
-  /// Return `true` if [member] is a "foreign helper", that is, a member whose
-  /// semantics is defined synthetically and not through Dart code.
-  ///
-  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
-  bool isForeignHelper(MemberEntity member) {
-    return member.library == commonElements.foreignLibrary ||
-        commonElements.isCreateInvocationMirrorHelper(member);
-  }
-
   /// Looks up [typeName] for use in the spec-string of a `JS` call.
   // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling
   // the `ForeignResolver`.
@@ -391,7 +382,7 @@
 
   /// Compute the kind of foreign helper function called by [node], if any.
   ForeignKind getForeignKind(ir.StaticInvocation node) {
-    if (isForeignHelper(getMember(node.target))) {
+    if (commonElements.isForeignHelper(getMember(node.target))) {
       switch (node.target.name.name) {
         case JavaScriptBackend.JS:
           return ForeignKind.JS;
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index e907171..82dfbb8 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -731,8 +731,7 @@
   List<TypeVariableType> getFunctionTypeVariables(
       covariant KernelToElementMapBase elementMap) {
     if (_typeVariables == null) {
-      if (functionNode.typeParameters.isEmpty ||
-          !elementMap.options.strongMode) {
+      if (functionNode.typeParameters.isEmpty) {
         _typeVariables = const <TypeVariableType>[];
       } else {
         ir.TreeNode parent = functionNode.parent;
diff --git a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
index 09ecdca..7753d69 100644
--- a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
@@ -58,7 +58,8 @@
     // Codegen inlines field initializers. It only needs to generate
     // code for checked setters.
     if (entity.isField && entity.isInstanceMember) {
-      if (!_options.enableTypeAssertions || entity.enclosingClass.isClosure) {
+      if (!_options.parameterCheckPolicy.isEmitted ||
+          entity.enclosingClass.isClosure) {
         return null;
       }
     }
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index 44e8651..7a05fc0 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -66,15 +66,42 @@
 
     String libraryName = getJsInteropName(
         library, elementEnvironment.getLibraryMetadata(library));
-    bool isJsLibrary = libraryName != null;
+    final bool isExplicitlylyJsLibrary = libraryName != null;
+    bool isJsLibrary = isExplicitlylyJsLibrary;
 
     elementEnvironment.forEachLibraryMember(library, (MemberEntity member) {
-      if (member.isField) return;
       String memberName = getJsInteropName(
           library, elementEnvironment.getMemberMetadata(member));
-      if (memberName != null) {
-        _nativeBasicDataBuilder.markAsJsInteropMember(member, memberName);
-        checkFunctionParameters(member);
+      if (member.isField) {
+        if (memberName != null) {
+          // TODO(34174): Disallow js-interop fields.
+          /*reporter.reportErrorMessage(
+              member, MessageKind.JS_INTEROP_FIELD_NOT_SUPPORTED);*/
+        }
+      } else {
+        FunctionEntity function = member;
+        if (function.isExternal && isExplicitlylyJsLibrary) {
+          // External members of explicit js-interop library are implicitly
+          // js-interop members.
+          memberName ??= function.name;
+        }
+        if (memberName != null) {
+          if (!function.isExternal) {
+            // TODO(johnniwinther): Disallow non-external js-interop members.
+            /*reporter.reportErrorMessage(
+                function, MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER);*/
+          } else {
+            _nativeBasicDataBuilder.markAsJsInteropMember(function, memberName);
+            checkFunctionParameters(function);
+            // TODO(johnniwinther): It is unclear whether library can be
+            // implicitly js-interop. For now we allow it.
+            isJsLibrary = true;
+          }
+        } else if (function.isExternal &&
+            !commonElements.isExternalAllowed(function)) {
+          reporter.reportErrorMessage(
+              function, MessageKind.NON_NATIVE_EXTERNAL);
+        }
       }
     });
 
@@ -94,42 +121,71 @@
         // has a non-empty name.
         _nativeBasicDataBuilder.markAsJsInteropClass(cls,
             name: className, isAnonymous: isAnonymous);
-        // TODO(johnniwinther): When fasta supports library metadata, report
-        // and error if [isJsLibrary] is false.
-        // For now, assume the library is a js-interop library.
+        // TODO(johnniwinther): It is unclear whether library can be implicitly
+        // js-interop. For now we allow it.
         isJsLibrary = true;
 
         elementEnvironment.forEachLocalClassMember(cls, (MemberEntity member) {
-          if (member.isField) return;
-          FunctionEntity function = member;
+          if (member.isField) {
+            // TODO(34174): Disallow js-interop fields.
+            /*reporter.reportErrorMessage(
+                member, MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED);*/
+          } else {
+            FunctionEntity function = member;
+            String memberName = getJsInteropName(
+                library, elementEnvironment.getMemberMetadata(function));
 
-          String memberName = getJsInteropName(
-              library, elementEnvironment.getMemberMetadata(function));
-          if (memberName != null) {
-            _nativeBasicDataBuilder.markAsJsInteropMember(function, memberName);
+            if (function.isExternal) {
+              memberName ??= function.name;
+            }
+            if (memberName != null) {
+              // TODO(johnniwinther): The documentation states that explicit
+              // member name annotations are not allowed on instance members.
+              _nativeBasicDataBuilder.markAsJsInteropMember(
+                  function, memberName);
+            }
+
+            if (!function.isExternal &&
+                !function.isAbstract &&
+                !function.isStatic) {
+              reporter.reportErrorMessage(
+                  function,
+                  MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
+                  {'cls': cls.name, 'member': member.name});
+            }
+
+            checkFunctionParameters(function);
           }
-
-          if (!function.isExternal &&
-              !function.isAbstract &&
-              !function.isConstructor &&
-              !function.isStatic) {
-            reporter.reportErrorMessage(
-                function,
-                MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
-                {'cls': cls.name, 'member': member.name});
-          }
-
-          checkFunctionParameters(function);
         });
         elementEnvironment.forEachConstructor(cls,
             (ConstructorEntity constructor) {
           String memberName = getJsInteropName(
               library, elementEnvironment.getMemberMetadata(constructor));
+          if (constructor.isExternal) {
+            // TODO(johnniwinther): It should probably be an error to have a
+            // no-name constructor without a @JS() annotation.
+            memberName ??= constructor.name;
+          }
           if (memberName != null) {
+            // TODO(johnniwinther): The documentation states that explicit
+            // member name annotations are not allowed on instance members.
             _nativeBasicDataBuilder.markAsJsInteropMember(
                 constructor, memberName);
           }
 
+          // TODO(33834): It is a breaking change (at least against in some of
+          // our own tests) but JS-interop constructors should be required to be
+          // external since we otherwise allow creating a Dart object that tries
+          // to pass as a JS-interop class.
+          /*if (!constructor.isExternal) {
+            reporter.reportErrorMessage(constructor,
+                MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR, {
+              'cls': cls.name,
+              'constructor':
+                  constructor.name.isEmpty ? '${cls.name}.' : constructor.name
+            });
+          }*/
+
           if (constructor.isFactoryConstructor && isAnonymous) {
             if (constructor.parameterStructure.positionalParameters > 0) {
               reporter.reportErrorMessage(
@@ -142,12 +198,42 @@
             checkFunctionParameters(constructor);
           }
         });
+      } else {
+        elementEnvironment.forEachLocalClassMember(cls, (MemberEntity member) {
+          String memberName = getJsInteropName(
+              library, elementEnvironment.getMemberMetadata(member));
+          if (memberName != null) {
+            reporter.reportErrorMessage(
+                member, MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS);
+          } else if (member is FunctionEntity) {
+            if (member.isExternal &&
+                !commonElements.isExternalAllowed(member)) {
+              reporter.reportErrorMessage(
+                  member, MessageKind.NON_NATIVE_EXTERNAL);
+            }
+          }
+        });
+        elementEnvironment.forEachConstructor(cls,
+            (ConstructorEntity constructor) {
+          String memberName = getJsInteropName(
+              library, elementEnvironment.getMemberMetadata(constructor));
+          if (memberName != null) {
+            reporter.reportErrorMessage(constructor,
+                MessageKind.JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS);
+          } else {
+            if (constructor.isExternal &&
+                !commonElements.isExternalAllowed(constructor)) {
+              reporter.reportErrorMessage(
+                  constructor, MessageKind.NON_NATIVE_EXTERNAL);
+            }
+          }
+        });
       }
     });
 
     if (isJsLibrary) {
-      // TODO(johnniwinther): Remove this when fasta supports library metadata.
-      // For now, assume the empty name.
+      // TODO(johnniwinther): It is unclear whether library can be implicitly
+      // js-interop. For now we allow it and assume the empty name.
       libraryName ??= '';
       _nativeBasicDataBuilder.markAsJsInteropLibrary(library,
           name: libraryName);
diff --git a/pkg/compiler/lib/src/kernel/types.dart b/pkg/compiler/lib/src/kernel/types.dart
index 6775859..62f38ba 100644
--- a/pkg/compiler/lib/src/kernel/types.dart
+++ b/pkg/compiler/lib/src/kernel/types.dart
@@ -144,7 +144,6 @@
 class _KernelSubtypeVisitor extends SubtypeVisitor<DartType>
     with _AbstractTypeRelationMixin {
   final KernelToElementMapBase elementMap;
-  bool get strongMode => elementMap.options.strongMode;
 
   _KernelSubtypeVisitor(this.elementMap);
 }
@@ -152,7 +151,6 @@
 class _KernelPotentialSubtypeVisitor extends PotentialSubtypeVisitor<DartType>
     with _AbstractTypeRelationMixin {
   final KernelToElementMapBase elementMap;
-  bool get strongMode => elementMap.options.strongMode;
 
   _KernelPotentialSubtypeVisitor(this.elementMap);
 }
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index 5a86659..a941245 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -52,16 +52,12 @@
         component = new ir.Component();
         new BinaryBuilder(input.data).readComponent(component);
       } else {
-        bool strongMode = _options.strongMode;
         String targetName =
             _options.compileForServer ? "dart2js_server" : "dart2js";
-        String platform = strongMode
-            ? '${targetName}_platform_strong.dill'
-            : '${targetName}_platform.dill';
+        String platform = '${targetName}_platform_strong.dill';
         initializedCompilerState = fe.initializeCompiler(
             initializedCompilerState,
-            new Dart2jsTarget(
-                targetName, new TargetFlags(strongMode: strongMode)),
+            new Dart2jsTarget(targetName, new TargetFlags(strongMode: true)),
             _options.librariesSpecificationUri,
             _options.platformBinaries.resolve(platform),
             _options.packageConfig);
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index d191778..7583e78 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -145,9 +145,6 @@
   /// core libraries. If false, all native classes will be included by default.
   bool enableNativeLiveTypeAnalysis = true;
 
-  /// Whether to generate code containing checked-mode assignability checks.
-  bool enableTypeAssertions = false;
-
   /// Whether to generate code containing user's `assert` statements.
   bool enableUserAssertions = false;
 
@@ -182,9 +179,6 @@
   /// Whether to trust primitive types during inference and optimizations.
   bool trustPrimitives = false;
 
-  /// Whether to trust type annotations during inference and optimizations.
-  bool trustTypeAnnotations = false;
-
   /// Whether to omit implicit strong mode checks.
   bool omitImplicitChecks = false;
 
@@ -210,9 +204,6 @@
   /// Whether to generate code compliant with content security policy (CSP).
   bool useContentSecurityPolicy = false;
 
-  /// Enables strong mode in dart2js.
-  bool strongMode = true;
-
   /// When obfuscating for minification, whether to use the frequency of a name
   /// as an heuristic to pick shorter names.
   bool useFrequencyNamer = true;
@@ -260,8 +251,6 @@
   /// Create an options object by parsing flags from [options].
   static CompilerOptions parse(List<String> options,
       {Uri libraryRoot, Uri platformBinaries}) {
-    bool isStrong = _hasOption(options, Flags.strongMode) ||
-        !_hasOption(options, Flags.noPreviewDart2);
     return new CompilerOptions()
       ..libraryRoot = libraryRoot
       ..allowMockCompilation = _hasOption(options, Flags.allowMockCompilation)
@@ -288,8 +277,6 @@
       ..enableMinification = _hasOption(options, Flags.minify)
       ..enableNativeLiveTypeAnalysis =
           !_hasOption(options, Flags.disableNativeLiveTypeAnalysis)
-      ..enableTypeAssertions =
-          _hasOption(options, Flags.enableCheckedMode) && !isStrong
       ..enableUserAssertions = _hasOption(options, Flags.enableCheckedMode) ||
           _hasOption(options, Flags.enableAsserts)
       ..experimentalTrackAllocations =
@@ -306,7 +293,6 @@
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
-      ..strongMode = isStrong
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
       ..laxRuntimeTypeToString =
           _hasOption(options, Flags.laxRuntimeTypeToString)
@@ -314,7 +300,6 @@
       ..trustJSInteropTypeAnnotations =
           _hasOption(options, Flags.trustJSInteropTypeAnnotations)
       ..trustPrimitives = _hasOption(options, Flags.trustPrimitives)
-      ..trustTypeAnnotations = _hasOption(options, Flags.trustTypeAnnotations)
       ..useContentSecurityPolicy =
           _hasOption(options, Flags.useContentSecurityPolicy)
       ..useFrequencyNamer =
@@ -352,11 +337,7 @@
     if (benchmarkingProduction) {
       useStartupEmitter = true;
       trustPrimitives = true;
-      if (strongMode) {
-        omitImplicitChecks = true;
-      } else {
-        trustTypeAnnotations = true;
-      }
+      omitImplicitChecks = true;
     }
 
     if (optimizationLevel != null) {
@@ -384,31 +365,15 @@
     }
     librariesSpecificationUri = _resolveLibrariesSpecification(libraryRoot);
 
-    if (strongMode) {
-      // Strong mode always trusts type annotations (inferred or explicit), so
-      // assignments checks should be trusted.
-      assignmentCheckPolicy = CheckPolicy.trusted;
-      if (omitImplicitChecks) {
-        parameterCheckPolicy = CheckPolicy.trusted;
-        implicitDowncastCheckPolicy = CheckPolicy.trusted;
-      } else {
-        parameterCheckPolicy = CheckPolicy.checked;
-        implicitDowncastCheckPolicy = CheckPolicy.checked;
-      }
+    // Strong mode always trusts type annotations (inferred or explicit), so
+    // assignments checks should be trusted.
+    assignmentCheckPolicy = CheckPolicy.trusted;
+    if (omitImplicitChecks) {
+      parameterCheckPolicy = CheckPolicy.trusted;
+      implicitDowncastCheckPolicy = CheckPolicy.trusted;
     } else {
-      // The implicit-downcast representation is a strong-mode only feature.
-      implicitDowncastCheckPolicy = CheckPolicy.ignored;
-
-      if (enableTypeAssertions) {
-        assignmentCheckPolicy = CheckPolicy.checked;
-        parameterCheckPolicy = CheckPolicy.checked;
-      } else if (trustTypeAnnotations) {
-        assignmentCheckPolicy = CheckPolicy.trusted;
-        parameterCheckPolicy = CheckPolicy.trusted;
-      } else {
-        assignmentCheckPolicy = CheckPolicy.ignored;
-        parameterCheckPolicy = CheckPolicy.ignored;
-      }
+      parameterCheckPolicy = CheckPolicy.checked;
+      implicitDowncastCheckPolicy = CheckPolicy.checked;
     }
   }
 
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 4e5b4ee..efb6546 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -328,7 +328,7 @@
     _inLazyInitializerExpression = node.isStatic;
     FieldEntity field = _elementMap.getMember(node);
     openFunction(field, checks: TargetChecks.none);
-    if (node.isInstanceMember && options.enableTypeAssertions) {
+    if (node.isInstanceMember && options.parameterCheckPolicy.isEmitted) {
       HInstruction thisInstruction = localsHandler.readThis(
           sourceInformation: _sourceInformationBuilder.buildGet(node));
       // Use dynamic type because the type computed by the inferrer is
@@ -949,13 +949,10 @@
     FunctionType functionType =
         _elementMap.getFunctionType(originalClosureNode);
     functionType.forEachTypeVariable((TypeVariableType typeVariableType) {
-      if (options.strongMode ||
-          typeVariableType.element.typeDeclaration is ClassEntity) {
-        DartType result = localsHandler.substInContext(typeVariableType);
-        HInstruction argument =
-            typeBuilder.analyzeTypeArgument(result, sourceElement);
-        typeArguments.add(argument);
-      }
+      DartType result = localsHandler.substInContext(typeVariableType);
+      HInstruction argument =
+          typeBuilder.analyzeTypeArgument(result, sourceElement);
+      typeArguments.add(argument);
     });
     push(new HTypeInfoExpression(
         TypeInfoExpressionKind.COMPLETE,
@@ -1160,18 +1157,13 @@
       HInstruction newParameter = localsHandler.directLocals[local];
       DartType type = _getDartTypeIfValid(variable.type);
 
-      if (options.strongMode) {
-        if (targetChecks.checkAllParameters ||
-            (targetChecks.checkCovariantParameters &&
-                (variable.isGenericCovariantImpl || variable.isCovariant))) {
-          newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
-              newParameter, type);
-        } else {
-          newParameter = typeBuilder.trustTypeOfParameter(newParameter, type);
-        }
-      } else {
+      if (targetChecks.checkAllParameters ||
+          (targetChecks.checkCovariantParameters &&
+              (variable.isGenericCovariantImpl || variable.isCovariant))) {
         newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
             newParameter, type);
+      } else {
+        newParameter = typeBuilder.trustTypeOfParameter(newParameter, type);
       }
 
       localsHandler.directLocals[local] = newParameter;
@@ -1480,7 +1472,9 @@
       node.expression.accept(this);
       value = pop();
       if (_currentFrame.asyncMarker == AsyncMarker.ASYNC) {
-        if (options.enableTypeAssertions &&
+        // TODO(johnniwinther): Is this special-casing of async still needed
+        // or should we use the general check below?
+        /*if (options.enableTypeAssertions &&
             !isValidAsyncReturnType(_returnType)) {
           generateTypeError(
               "Async function returned a Future,"
@@ -1488,7 +1482,7 @@
               sourceInformation);
           pop();
           return;
-        }
+        }*/
       } else {
         value = typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
             value, _returnType);
@@ -3188,7 +3182,7 @@
   /// returns the selector corresponding to the passed type arguments.
   Selector _fillDynamicTypeArguments(
       Selector selector, ir.Arguments arguments, List<DartType> typeArguments) {
-    if (options.strongMode && selector.typeArgumentCount > 0) {
+    if (selector.typeArgumentCount > 0) {
       if (rtiNeed.selectorNeedsTypeArguments(selector)) {
         typeArguments.addAll(arguments.types.map(_elementMap.getDartType));
       } else {
@@ -3217,7 +3211,7 @@
 
   List<DartType> _getStaticTypeArguments(
       FunctionEntity function, ir.Arguments arguments) {
-    if (options.strongMode && rtiNeed.methodNeedsTypeArguments(function)) {
+    if (rtiNeed.methodNeedsTypeArguments(function)) {
       return arguments.types.map(_elementMap.getDartType).toList();
     }
     return const <DartType>[];
@@ -3294,13 +3288,12 @@
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildCall(node, node);
     FunctionEntity function = _elementMap.getMember(target);
-    if (_elementMap.isForeignHelper(function)) {
+    if (_commonElements.isForeignHelper(function)) {
       handleInvokeStaticForeign(node, function);
       return;
     }
 
-    if (options.strongMode &&
-        function == _commonElements.extractTypeArguments &&
+    if (function == _commonElements.extractTypeArguments &&
         handleExtractTypeArguments(node, sourceInformation)) {
       return;
     }
@@ -3368,10 +3361,6 @@
 
     InterfaceType instanceType = _elementMap.createInterfaceType(
         invocation.target.enclosingClass, invocation.arguments.types);
-    if (_checkAllTypeVariableBounds(
-        function, instanceType, sourceInformation)) {
-      return;
-    }
 
     AbstractValue resultType = typeMask;
 
@@ -4600,94 +4589,6 @@
         sourceInformation);
   }
 
-  /// In checked mode checks the [type] of [node] to be well-bounded.
-  /// Returns `true` if an error can be statically determined.
-  ///
-  /// We do this at the call site rather that in the constructor body so that we
-  /// can perform *static* analysis errors/warnings rather than only dynamic
-  /// ones from the type pararameters passed in to the constructors. This also
-  /// performs all checks for the instantiated class and all of its supertypes
-  /// (extended and inherited) at this single call site because interface type
-  /// variable constraints (when applicable) need to be checked but will not
-  /// have a constructor body that gets inlined to execute.
-  bool _checkAllTypeVariableBounds(ConstructorEntity constructor,
-      InterfaceType type, SourceInformation sourceInformation) {
-    if (!options.enableTypeAssertions) return false;
-
-    // This map keeps track of what checks we perform as we walk up the
-    // inheritance chain so that we don't check the same thing more than once.
-    Map<DartType, Set<DartType>> seenChecksMap =
-        new Map<DartType, Set<DartType>>();
-    bool knownInvalidBounds = false;
-
-    void _addTypeVariableBoundCheck(InterfaceType instance,
-        DartType typeArgument, TypeVariableType typeVariable, DartType bound) {
-      if (knownInvalidBounds) return;
-
-      int subtypeRelation = types.computeSubtypeRelation(typeArgument, bound);
-      if (subtypeRelation == DartTypes.IS_SUBTYPE) return;
-
-      String prefix = "Can't create an instance of malbounded type '$type': '";
-      String infix = "' is not a subtype of bound '";
-      String suffix;
-
-      if (type == instance) {
-        suffix = "' type variable '${typeVariable}' of type "
-            "'${types.getThisType(type.element)}'.";
-      } else {
-        suffix = "' type variable '${typeVariable}' of type "
-            "'${types.getThisType(instance.element)}' on the supertype "
-            "'${instance}' of '${type}'.";
-      }
-
-      if (subtypeRelation == DartTypes.NOT_SUBTYPE) {
-        String message = "TypeError: $prefix$typeArgument$infix$bound$suffix";
-        generateTypeError(message, sourceInformation);
-        knownInvalidBounds = true;
-        return;
-      } else if (subtypeRelation == DartTypes.MAYBE_SUBTYPE) {
-        Set<DartType> seenChecks =
-            seenChecksMap.putIfAbsent(typeArgument, () => new Set<DartType>());
-        if (!seenChecks.contains(bound)) {
-          seenChecks.add(bound);
-          _assertIsSubtype(typeArgument, bound, prefix, infix, suffix);
-        }
-      }
-    }
-
-    types.checkTypeVariableBounds(
-        type,
-        type.typeArguments,
-        _elementMap.elementEnvironment.getThisType(type.element).typeArguments,
-        _addTypeVariableBoundCheck);
-    if (knownInvalidBounds) {
-      return true;
-    }
-    for (InterfaceType supertype
-        in types.getSupertypes(constructor.enclosingClass)) {
-      InterfaceType instance = types.asInstanceOf(type, supertype.element);
-      types.checkTypeVariableBounds(
-          instance,
-          instance.typeArguments,
-          _elementMap.elementEnvironment
-              .getThisType(instance.element)
-              .typeArguments,
-          _addTypeVariableBoundCheck);
-      if (knownInvalidBounds) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void _assertIsSubtype(DartType subtype, DartType supertype, String prefix,
-      String infix, String suffix) {
-    HInstruction subtypeInstruction = typeBuilder.analyzeTypeArgument(
-        localsHandler.substInContext(subtype), sourceElement);
-    _assertIsType(subtypeInstruction, supertype, prefix, infix, suffix);
-    registry?.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
-  }
-
   void _assertIsType(HInstruction subtypeInstruction, DartType supertype,
       String prefix, String infix, String suffix) {
     HInstruction supertypeInstruction = typeBuilder.analyzeTypeArgument(
@@ -4729,11 +4630,6 @@
         target.enclosingClass, node.arguments.types);
     instanceType = localsHandler.substInContext(instanceType);
 
-    if (_checkAllTypeVariableBounds(
-        constructor, instanceType, sourceInformation)) {
-      return;
-    }
-
     List<HInstruction> arguments = <HInstruction>[];
     if (constructor.isGenerativeConstructor &&
         nativeData.isNativeOrExtendsNative(constructor.enclosingClass) &&
@@ -5153,19 +5049,40 @@
             InlineWeeder.INLINING_NODES_OUTSIDE_LOOP_ARG_FACTOR * numParameters;
       }
 
-      // If a method is called only once, and all the methods in the
-      // inlining stack are called only once as well, we know we will
-      // save on output size by inlining this method.
-      if (_isCalledOnce(function)) {
+      bool markedTryInline = inlineCache.markedAsTryInline(function);
+      bool calledOnce = _isCalledOnce(function);
+      // If a method is called only once, and all the methods in the inlining
+      // stack are called only once as well, we know we will save on output size
+      // by inlining this method.
+      if (markedTryInline || calledOnce) {
         maxInliningNodes = null;
       }
+      bool allowLoops = false;
+      if (markedTryInline) {
+        allowLoops = true;
+      }
+
       bool canInline = InlineWeeder.canBeInlined(
           _elementMap, function, maxInliningNodes,
+          allowLoops: allowLoops,
           enableUserAssertions: options.enableUserAssertions);
-      if (canInline) {
-        inlineCache.markAsInlinable(function, insideLoop: insideLoop);
+      if (markedTryInline) {
+        if (canInline) {
+          inlineCache.markAsInlinable(function, insideLoop: true);
+          inlineCache.markAsInlinable(function, insideLoop: false);
+        } else {
+          inlineCache.markAsNonInlinable(function, insideLoop: true);
+          inlineCache.markAsNonInlinable(function, insideLoop: false);
+        }
+      } else if (calledOnce) {
+        // TODO(34203): We can't update the decision due to imprecision in the
+        // calledOnce data, described in Issue 34203.
       } else {
-        inlineCache.markAsNonInlinable(function, insideLoop: insideLoop);
+        if (canInline) {
+          inlineCache.markAsInlinable(function, insideLoop: insideLoop);
+        } else {
+          inlineCache.markAsNonInlinable(function, insideLoop: insideLoop);
+        }
       }
       return canInline;
     }
@@ -5553,15 +5470,13 @@
     // TODO(sra): Incorporate properties of call site to help determine which
     // type parameters and value parameters need to be checked.
     bool trusted = false;
-    if (options.strongMode) {
-      if (function.isStatic ||
-          function.isTopLevel ||
-          function.isConstructor ||
-          function is ConstructorBodyEntity) {
-        // We inline static methods, top-level methods, constructors and
-        // constructor bodies only from direct call sites.
-        trusted = true;
-      }
+    if (function.isStatic ||
+        function.isTopLevel ||
+        function.isConstructor ||
+        function is ConstructorBodyEntity) {
+      // We inline static methods, top-level methods, constructors and
+      // constructor bodies only from direct call sites.
+      trusted = true;
     }
 
     if (!trusted) {
@@ -5720,7 +5635,7 @@
   bool registerNode() {
     if (maxInliningNodes == null) return true;
     if (nodeCount++ > maxInliningNodes) {
-      tooDifficultReason = 'too many nodes';
+      tooDifficultReason ??= 'too many nodes';
       return false;
     }
     return true;
@@ -5731,7 +5646,7 @@
     if (tooDifficult) return;
     if (!registerNode()) return;
     if (seenReturn) {
-      tooDifficultReason = 'code after return';
+      tooDifficultReason ??= 'code after return';
       return;
     }
     node.visitChildren(this);
@@ -5741,7 +5656,7 @@
   visitReturnStatement(ir.ReturnStatement node) {
     if (!registerNode()) return;
     if (seenReturn) {
-      tooDifficultReason = 'code after return';
+      tooDifficultReason ??= 'code after return';
       return;
     }
     node.visitChildren(this);
@@ -5752,69 +5667,66 @@
   visitThrow(ir.Throw node) {
     if (!registerNode()) return;
     if (seenReturn) {
-      tooDifficultReason = 'code after return';
+      tooDifficultReason ??= 'code after return';
       return;
     }
     node.visitChildren(this);
   }
 
-  _handleLoop() {
-    // It's actually not difficult to inline a method with a loop, but
-    // our measurements show that it's currently better to not inline a
-    // method that contains a loop.
-    if (!allowLoops) tooDifficultReason = 'loop';
-    // TODO(johnniwinther): Shouldn't the loop body have been counted here? It
-    // isn't in the AST based inline weeder.
+  _handleLoop(ir.Node node) {
+    // It's actually not difficult to inline a method with a loop, but our
+    // measurements show that it's currently better to not inline a method that
+    // contains a loop.
+    if (!allowLoops) tooDifficultReason ??= 'loop';
+    node.visitChildren(this);
   }
 
   @override
   visitForStatement(ir.ForStatement node) {
-    _handleLoop();
+    _handleLoop(node);
   }
 
   @override
   visitForInStatement(ir.ForInStatement node) {
-    _handleLoop();
+    _handleLoop(node);
   }
 
   @override
   visitWhileStatement(ir.WhileStatement node) {
-    _handleLoop();
+    _handleLoop(node);
   }
 
   @override
   visitDoStatement(ir.DoStatement node) {
-    _handleLoop();
+    _handleLoop(node);
   }
 
   @override
   visitTryCatch(ir.TryCatch node) {
-    if (tooDifficult) return;
-    tooDifficultReason = 'try';
+    tooDifficultReason ??= 'try';
   }
 
   @override
   visitTryFinally(ir.TryFinally node) {
-    if (tooDifficult) return;
-    tooDifficultReason = 'try';
+    tooDifficultReason ??= 'try';
   }
 
   @override
   visitFunctionExpression(ir.FunctionExpression node) {
     if (!registerNode()) return;
-    tooDifficultReason = 'closure';
+    tooDifficultReason ??= 'closure';
   }
 
   @override
   visitFunctionDeclaration(ir.FunctionDeclaration node) {
     if (!registerNode()) return;
-    tooDifficultReason = 'closure';
+    tooDifficultReason ??= 'closure';
   }
 
   @override
   visitFunctionNode(ir.FunctionNode node) {
     if (node.asyncMarker != ir.AsyncMarker.Sync) {
-      tooDifficultReason = 'async/await';
+      tooDifficultReason ??= 'async/await';
       return;
     }
     node.visitChildren(this);
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index b92ef53..d70f774 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -2757,7 +2757,7 @@
   void checkTypeViaInstanceof(HInstruction input, InterfaceType type,
       SourceInformation sourceInformation,
       {bool negative: false}) {
-    _registry.registerTypeUse(new TypeUse.isCheck(type));
+    _registry.registerTypeUse(new TypeUse.instanceConstructor(type));
 
     use(input);
 
@@ -2767,7 +2767,6 @@
     if (negative) {
       push(new js.Prefix('!', pop()).withSourceInformation(sourceInformation));
     }
-    _registry.registerInstantiation(type);
   }
 
   void handleNumberOrStringSupertypeCheck(
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index cbd3ef2..4468833 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -296,8 +296,6 @@
         return options.enableMinification;
       case 'MUST_RETAIN_METADATA':
         return false;
-      case 'STRONG_MODE':
-        return options.strongMode;
       case 'USE_CONTENT_SECURITY_POLICY':
         return options.useContentSecurityPolicy;
       default:
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 43e9c67..0f34e16 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -125,10 +125,12 @@
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.inputs[1];
     HInstruction index = instruction.inputs[2];
-    if (!receiver.isMutableIndexable(closedWorld.abstractValueDomain))
+    if (!receiver.isMutableIndexable(closedWorld.abstractValueDomain)) {
       return null;
+    }
+    // TODO(johnniwinther): Merge this and the following if statement.
     if (!index.isInteger(closedWorld.abstractValueDomain) &&
-        options.enableTypeAssertions) {
+        options.parameterCheckPolicy.isEmitted) {
       // We want the right checked mode error.
       return null;
     }
@@ -186,9 +188,12 @@
       CommonElements commonElements,
       JClosedWorld closedWorld) {
     if (!instruction.inputs[1]
-        .isIndexablePrimitive(closedWorld.abstractValueDomain)) return null;
+        .isIndexablePrimitive(closedWorld.abstractValueDomain)) {
+      return null;
+    }
+    // TODO(johnniwinther): Merge this and the following if statement.
     if (!instruction.inputs[2].isInteger(closedWorld.abstractValueDomain) &&
-        options.enableTypeAssertions) {
+        options.parameterCheckPolicy.isEmitted) {
       // We want the right checked mode error.
       return null;
     }
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 9fbf7d5..0542e2a 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:front_end/src/fasta/operator.dart';
 import 'package:kernel/ast.dart' as ir;
 
 import '../common.dart';
@@ -61,17 +62,8 @@
     DartType type = elementMap.getDartType(irType);
     if (kind != null && !type.isDynamic) {
       switch (kind) {
-        case TypeUseKind.CHECKED_MODE_CHECK:
-          if (!_options.strongMode) {
-            impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type));
-          }
-          break;
         case TypeUseKind.PARAMETER_CHECK:
-          if (!_options.strongMode) {
-            impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type));
-          } else {
-            impactBuilder.registerTypeUse(new TypeUse.parameterCheck(type));
-          }
+          impactBuilder.registerTypeUse(new TypeUse.parameterCheck(type));
           break;
         case TypeUseKind.IMPLICIT_CAST:
           impactBuilder.registerTypeUse(new TypeUse.implicitCast(type));
@@ -98,17 +90,12 @@
 
   /// Add checked-mode type use for parameter and return types, and add
   /// constants for default values.
-  void handleSignature(ir.FunctionNode node, {bool checkReturnType: true}) {
-    if (checkReturnType) {
-      checkType(node.returnType, TypeUseKind.CHECKED_MODE_CHECK);
-    }
+  void handleSignature(ir.FunctionNode node) {
     registerSeenClasses(node.returnType);
     node.positionalParameters.forEach(handleParameter);
     node.namedParameters.forEach(handleParameter);
-    if (_options.strongMode) {
-      for (ir.TypeParameter parameter in node.typeParameters) {
-        checkType(parameter.bound, TypeUseKind.PARAMETER_CHECK);
-      }
+    for (ir.TypeParameter parameter in node.typeParameters) {
+      checkType(parameter.bound, TypeUseKind.PARAMETER_CHECK);
     }
   }
 
@@ -139,11 +126,11 @@
   }
 
   ResolutionImpact buildConstructor(ir.Constructor constructor) {
-    handleSignature(constructor.function, checkReturnType: false);
+    handleSignature(constructor.function);
     visitNodes(constructor.initializers);
     visitNode(constructor.function.body);
     MemberEntity member = elementMap.getMember(constructor);
-    if (constructor.isExternal && !elementMap.isForeignHelper(member)) {
+    if (constructor.isExternal && !commonElements.isForeignHelper(member)) {
       bool isJsInterop = elementMap.nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(constructor, isJsInterop: isJsInterop));
@@ -198,7 +185,7 @@
     visitNode(procedure.function.body);
     handleAsyncMarker(procedure.function);
     MemberEntity member = elementMap.getMember(procedure);
-    if (procedure.isExternal && !elementMap.isForeignHelper(member)) {
+    if (procedure.isExternal && !commonElements.isForeignHelper(member)) {
       bool isJsInterop = elementMap.nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(procedure, isJsInterop: isJsInterop));
@@ -269,8 +256,7 @@
   @override
   void visitListLiteral(ir.ListLiteral literal) {
     visitNodes(literal.expressions);
-    DartType elementType =
-        checkType(literal.typeArgument, TypeUseKind.CHECKED_MODE_CHECK);
+    DartType elementType = elementMap.getDartType(literal.typeArgument);
     registerSeenClasses(literal.typeArgument);
 
     impactBuilder.registerListLiteral(new ListLiteralUse(
@@ -282,10 +268,8 @@
   @override
   void visitMapLiteral(ir.MapLiteral literal) {
     visitNodes(literal.entries);
-    DartType keyType =
-        checkType(literal.keyType, TypeUseKind.CHECKED_MODE_CHECK);
-    DartType valueType =
-        checkType(literal.valueType, TypeUseKind.CHECKED_MODE_CHECK);
+    DartType keyType = elementMap.getDartType(literal.keyType);
+    DartType valueType = elementMap.getDartType(literal.valueType);
     registerSeenClasses(literal.keyType);
     registerSeenClasses(literal.valueType);
     impactBuilder.registerMapLiteral(new MapLiteralUse(
@@ -312,9 +296,7 @@
     arguments.positional.forEach(visitNode);
     arguments.named.forEach(visitNode);
     if (arguments.types.isEmpty) return null;
-    return _options.strongMode
-        ? arguments.types.map(elementMap.getDartType).toList()
-        : const <DartType>[];
+    return arguments.types.map(elementMap.getDartType).toList();
   }
 
   @override
@@ -406,8 +388,7 @@
     } else {
       FunctionEntity target = elementMap.getMethod(node.target);
       List<DartType> typeArguments = _visitArguments(node.arguments);
-      if (_options.strongMode &&
-          target == commonElements.extractTypeArguments) {
+      if (target == commonElements.extractTypeArguments) {
         _handleExtractTypeArguments(node, target, typeArguments);
         return;
       }
@@ -510,7 +491,7 @@
     // target.
     Object constraint;
     MemberEntity member = elementMap.getMember(node.target);
-    if (_options.strongMode && useStrongModeWorldStrategy) {
+    if (useStrongModeWorldStrategy) {
       // TODO(johnniwinther): Restrict this to subclasses?
       constraint = new StrongModeConstraint(member.enclosingClass);
     }
@@ -600,16 +581,14 @@
         receiver.variable.parent is ir.FunctionDeclaration) {
       Local localFunction =
           elementMap.getLocalFunction(receiver.variable.parent);
-      // Invocation of a local function. No need for dynamic use.
-      if (_options.strongMode) {
-        // We need to track the type arguments.
-        impactBuilder.registerStaticUse(new StaticUse.closureCall(
-            localFunction, selector.callStructure, typeArguments));
-      }
+      // Invocation of a local function. No need for dynamic use, but
+      // we need to track the type arguments.
+      impactBuilder.registerStaticUse(new StaticUse.closureCall(
+          localFunction, selector.callStructure, typeArguments));
     } else {
       visitNode(node.receiver);
       Object constraint;
-      if (_options.strongMode && useStrongModeWorldStrategy) {
+      if (useStrongModeWorldStrategy) {
         DartType receiverType = elementMap.getStaticType(node.receiver);
         if (receiverType is InterfaceType) {
           constraint = new StrongModeConstraint(receiverType.element);
@@ -618,6 +597,19 @@
 
       impactBuilder.registerDynamicUse(
           new ConstrainedDynamicUse(selector, constraint, typeArguments));
+
+      ir.Member interfaceTarget = node.interfaceTarget;
+      if (operatorFromString(node.name.name) == null) {
+        if (interfaceTarget == null ||
+            interfaceTarget is ir.Field ||
+            interfaceTarget is ir.Procedure &&
+                interfaceTarget.kind == ir.ProcedureKind.Getter) {
+          // An `o.foo()` invocation is (potentially) an `o.foo.call()`
+          // invocation.
+          impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+              selector.toCallSelector(), null, typeArguments));
+        }
+      }
     }
   }
 
@@ -625,7 +617,7 @@
   void visitPropertyGet(ir.PropertyGet node) {
     visitNode(node.receiver);
     Object constraint;
-    if (_options.strongMode && useStrongModeWorldStrategy) {
+    if (useStrongModeWorldStrategy) {
       DartType receiverType = elementMap.getStaticType(node.receiver);
       if (receiverType is InterfaceType) {
         constraint = new StrongModeConstraint(receiverType.element);
@@ -636,34 +628,28 @@
         constraint, const <DartType>[]));
 
     if (node.name.name == Identifiers.runtimeType_) {
-      if (_options.strongMode) {
-        RuntimeTypeUse runtimeTypeUse = computeRuntimeTypeUse(elementMap, node);
-        if (_options.omitImplicitChecks) {
-          switch (runtimeTypeUse.kind) {
-            case RuntimeTypeUseKind.string:
-              if (!_options.laxRuntimeTypeToString) {
-                if (runtimeTypeUse.receiverType == commonElements.objectType) {
-                  reporter.reportHintMessage(
-                      computeSourceSpanFromTreeNode(node),
-                      MessageKind.RUNTIME_TYPE_TO_STRING_OBJECT);
-                } else {
-                  reporter.reportHintMessage(
-                      computeSourceSpanFromTreeNode(node),
-                      MessageKind.RUNTIME_TYPE_TO_STRING_SUBTYPE,
-                      {'receiverType': '${runtimeTypeUse.receiverType}.'});
-                }
+      RuntimeTypeUse runtimeTypeUse = computeRuntimeTypeUse(elementMap, node);
+      if (_options.omitImplicitChecks) {
+        switch (runtimeTypeUse.kind) {
+          case RuntimeTypeUseKind.string:
+            if (!_options.laxRuntimeTypeToString) {
+              if (runtimeTypeUse.receiverType == commonElements.objectType) {
+                reporter.reportHintMessage(computeSourceSpanFromTreeNode(node),
+                    MessageKind.RUNTIME_TYPE_TO_STRING_OBJECT);
+              } else {
+                reporter.reportHintMessage(
+                    computeSourceSpanFromTreeNode(node),
+                    MessageKind.RUNTIME_TYPE_TO_STRING_SUBTYPE,
+                    {'receiverType': '${runtimeTypeUse.receiverType}.'});
               }
-              break;
-            case RuntimeTypeUseKind.equals:
-            case RuntimeTypeUseKind.unknown:
-              break;
-          }
+            }
+            break;
+          case RuntimeTypeUseKind.equals:
+          case RuntimeTypeUseKind.unknown:
+            break;
         }
-        impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
-      } else {
-        impactBuilder.registerRuntimeTypeUse(new RuntimeTypeUse(
-            RuntimeTypeUseKind.unknown, const DynamicType(), null));
       }
+      impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
     }
   }
 
@@ -672,7 +658,7 @@
     visitNode(node.receiver);
     visitNode(node.value);
     Object constraint;
-    if (_options.strongMode && useStrongModeWorldStrategy) {
+    if (useStrongModeWorldStrategy) {
       DartType receiverType = elementMap.getStaticType(node.receiver);
       if (receiverType is InterfaceType) {
         constraint = new StrongModeConstraint(receiverType.element);
@@ -727,7 +713,6 @@
 
   @override
   void visitVariableDeclaration(ir.VariableDeclaration node) {
-    checkType(node.type, TypeUseKind.CHECKED_MODE_CHECK);
     registerSeenClasses(node.type);
     if (node.initializer != null) {
       visitNode(node.initializer);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 145497d..e5759ba 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -627,7 +627,7 @@
 
     List<HInstruction> inputs = node.inputs.sublist(1);
     bool canInline = true;
-    if (_options.enableTypeAssertions && inputs.length > 1) {
+    if (_options.parameterCheckPolicy.isEmitted && inputs.length > 1) {
       // TODO(sra): Check if [input] is guaranteed to pass the parameter
       // type check.  Consider using a strengthened type check to avoid
       // passing `null` to primitive types since the native methods usually
@@ -1088,7 +1088,7 @@
     // Use `node.inputs.last` in case the call follows the interceptor calling
     // convention, but is not a call on an interceptor.
     HInstruction value = node.inputs.last;
-    if (_options.enableTypeAssertions) {
+    if (_options.parameterCheckPolicy.isEmitted) {
       DartType type = _closedWorld.elementEnvironment.getFieldType(field);
       if (!type.treatAsRaw ||
           type.isTypeVariable ||
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 95cb53e..c882028 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -128,11 +128,6 @@
   HInstruction addTypeVariableReference(
       TypeVariableType type, MemberEntity member,
       {SourceInformation sourceInformation}) {
-    if (type.element.typeDeclaration is! ClassEntity &&
-        !builder.options.strongMode) {
-      // GENERIC_METHODS:  We currently don't reify method type variables.
-      return builder.graph.addConstantNull(builder.closedWorld);
-    }
     Local typeVariableLocal =
         builder.localsHandler.getTypeVariableAsLocal(type);
 
@@ -232,12 +227,9 @@
 
     List<HInstruction> inputs = <HInstruction>[];
     argument.forEachTypeVariable((TypeVariableType variable) {
-      if (variable.element.typeDeclaration is ClassEntity ||
-          builder.options.strongMode) {
-        // TODO(johnniwinther): Also make this conditional on whether we have
-        // calculated we need that particular method signature.
-        inputs.add(analyzeTypeArgument(variable, sourceElement));
-      }
+      // TODO(johnniwinther): Also make this conditional on whether we have
+      // calculated we need that particular method signature.
+      inputs.add(analyzeTypeArgument(variable, sourceElement));
     });
     HInstruction result = new HTypeInfoExpression(
         TypeInfoExpressionKind.COMPLETE,
@@ -249,10 +241,7 @@
     return result;
   }
 
-  bool get checkOrTrustTypes =>
-      builder.options.strongMode ||
-      builder.options.enableTypeAssertions ||
-      builder.options.trustTypeAnnotations;
+  bool get checkOrTrustTypes => true;
 
   /// Build a [HTypeConversion] for converting [original] to type [type].
   ///
@@ -262,14 +251,6 @@
       HInstruction original, DartType type, int kind,
       {SourceInformation sourceInformation}) {
     if (type == null) return original;
-    if (type.isTypeVariable) {
-      TypeVariableType typeVariable = type;
-      // In Dart 1, method type variables are ignored.
-      if (!builder.options.strongMode &&
-          typeVariable.element.typeDeclaration is! ClassEntity) {
-        type = const DynamicType();
-      }
-    }
     type = type.unaliased;
     if (type.isInterfaceType && !type.treatAsRaw) {
       InterfaceType interfaceType = type;
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index 14d25b9..b034bbd 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -336,8 +336,6 @@
   // expected by the call.
   // Return true if the argument type check was added.
   bool checkArgument(HInvokeDynamic instruction) {
-    // We want the right error in checked mode.
-    if (options.enableTypeAssertions) return false;
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
 
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index c7f7664..14a3f0a 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -81,7 +81,7 @@
   /// Returns the types that are live as constant type literals.
   Iterable<DartType> get constTypeLiterals;
 
-  /// Returns the types that are live as constant type literals.
+  /// Returns the types that are live as constant type arguments.
   Iterable<DartType> get liveTypeArguments;
 }
 
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index e8fd4b6..3b77119 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -528,11 +528,9 @@
     info.addInstantiation(constructor, type, kind,
         isRedirection: isRedirection);
     if (kind != Instantiation.UNINSTANTIATED) {
-      if (_options.strongMode) {
-        _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
-            directlyInstantiated: info.isDirectlyInstantiated,
-            abstractlyInstantiated: info.isAbstractlyInstantiated);
-      }
+      _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
+          directlyInstantiated: info.isDirectlyInstantiated,
+          abstractlyInstantiated: info.isAbstractlyInstantiated);
       _processInstantiatedClass(cls, classUsed);
     }
 
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 3f984aa..c573eb7 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -568,7 +568,6 @@
 enum TypeUseKind {
   IS_CHECK,
   AS_CAST,
-  CHECKED_MODE_CHECK,
   CATCH_TYPE,
   TYPE_LITERAL,
   INSTANTIATION,
@@ -600,9 +599,6 @@
       case TypeUseKind.AS_CAST:
         sb.write('as:');
         break;
-      case TypeUseKind.CHECKED_MODE_CHECK:
-        sb.write('check:');
-        break;
       case TypeUseKind.CATCH_TYPE:
         sb.write('catch:');
         break;
@@ -642,11 +638,6 @@
     return new TypeUse.internal(type, TypeUseKind.AS_CAST);
   }
 
-  /// [type] used as a type annotation in Dart 1, like `T foo;`.
-  factory TypeUse.checkedModeCheck(DartType type) {
-    return new TypeUse.internal(type, TypeUseKind.CHECKED_MODE_CHECK);
-  }
-
   /// [type] used as a parameter type or field type in Dart 2, like `T` in:
   ///
   ///    method(T t) {}
@@ -690,6 +681,13 @@
     return new TypeUse.internal(type, TypeUseKind.RTI_VALUE);
   }
 
+  /// [type] used in a `instanceof` check.
+  factory TypeUse.instanceConstructor(DartType type) {
+    // TODO(johnniwinther,sra): Use a separate use kind if constructors is no
+    // longer used for RTI.
+    return new TypeUse.internal(type, TypeUseKind.RTI_VALUE);
+  }
+
   /// [type] used directly as a type argument.
   ///
   /// The happens during optimization where a type variable can be replaced by
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index ef0f3ca..202d2c9 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -1233,6 +1233,11 @@
     return _emitClassDeclaration(node, node.declaredElement, []);
   }
 
+  @override
+  JS.Statement visitMixinDeclaration(MixinDeclaration node) {
+    throw new UnimplementedError();
+  }
+
   /// Wraps a possibly generic class in its type arguments.
   JS.Statement _defineClassTypeArguments(TypeDefiningElement element,
       List<TypeParameterElement> formals, JS.Statement body,
@@ -6302,6 +6307,10 @@
   @override
   visitFormalParameterList(node) => _unreachable(node);
 
+  /// Unused, handled by [visitMixinDeclaration].
+  @override
+  JS.Node visitOnClause(OnClause node) => _unreachable(node);
+
   /// Unused, handled by imports/exports.
   @override
   visitShowCombinator(node) => _unreachable(node);
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 59fa78a..153ab71 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -80,7 +80,14 @@
         help: 'emit API summary in a .js.txt file', defaultsTo: true)
     // TODO(jmesserly): add verbose help to show hidden options
     ..addOption('dart-sdk-summary',
-        help: 'The path to the Dart SDK summary file.', hide: true);
+        help: 'The path to the Dart SDK summary file.', hide: true)
+    ..addOption('multi-root-scheme',
+        help: 'The custom scheme to indicate a multi-root uri.',
+        defaultsTo: 'org-dartlang-app')
+    ..addMultiOption('multi-root',
+        help: 'The directories to search when encountering uris with the '
+            'specified multi-root scheme.',
+        defaultsTo: [Uri.base.path]);
   SharedCompilerOptions.addArguments(argParser);
 
   var declaredVariables = parseAndRemoveDeclaredVariables(args);
@@ -96,13 +103,18 @@
   // lib folder). The following [FileSystem] will resolve those references to
   // the correct location and keeps the real file location hidden from the
   // front end.
-  var customScheme = 'org-dartlang-app';
+  var multiRootScheme = argResults['multi-root-scheme'] as String;
+
   var fileSystem = MultiRootFileSystem(
-      customScheme, [Uri.base], StandardFileSystem.instance);
+      multiRootScheme,
+      (argResults['multi-root'] as Iterable<String>)
+          .map(Uri.base.resolve)
+          .toList(),
+      StandardFileSystem.instance);
 
   Uri toCustomUri(Uri uri) {
     if (uri.scheme == '') {
-      return Uri(scheme: customScheme, path: '/' + uri.path);
+      return Uri(scheme: multiRootScheme, path: '/' + uri.path);
     }
     return uri;
   }
@@ -190,7 +202,8 @@
       buildSourceMap: argResults['source-map'] as bool,
       jsUrl: path.toUri(output).toString(),
       mapUrl: path.toUri(output + '.map').toString(),
-      bazelMapping: options.bazelMapping);
+      bazelMapping: options.bazelMapping,
+      customScheme: multiRootScheme);
 
   outFiles.add(file.writeAsString(jsCode.code));
   if (jsCode.sourceMap != null) {
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 56f5b5f..ea955ac 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -64,15 +64,11 @@
   bool get enableNoSuchMethodForwarders => true;
 
   @override
-  void performModularTransformationsOnLibraries(
+  void performModularTransformationsOnLibraries(Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
       {void logger(String msg)}) {}
 
   @override
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
-      {void logger(String msg)}) {}
-
-  @override
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
       String name, Arguments arguments, int offset, bool isSuper) {
     // TODO(jmesserly): preserve source information?
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index 6c43905..4e13741 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -213,4 +213,7 @@
   ///
   /// Typically used by developers to debug internals of the compiler.
   bool throwOnWarningsForDebugging = false;
+
+  /// Whether to generate bytecode.
+  bool bytecode = false;
 }
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index c4086f7..0b25e2f 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -320,6 +320,9 @@
   /// Whether to interpret Dart sources in strong-mode.
   bool get strongMode => _raw.strongMode;
 
+  /// Whether to generate bytecode.
+  bool get bytecode => _raw.bytecode;
+
   Target _target;
   Target get target => _target ??=
       _raw.target ?? new NoneTarget(new TargetFlags(strongMode: strongMode));
@@ -375,7 +378,8 @@
 
   /// Helper to load a .dill file from [uri] using the existing [nameRoot].
   Component loadComponent(List<int> bytes, CanonicalName nameRoot) {
-    Component component = new Component(nameRoot: nameRoot);
+    Component component =
+        target.configureComponent(new Component(nameRoot: nameRoot));
     // TODO(ahe): Pass file name to BinaryBuilder.
     // TODO(ahe): Control lazy loading via an option.
     new BinaryBuilder(bytes, filename: null, disableLazyReading: false)
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 88baf99..537c775 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -2357,29 +2357,10 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(Token token)> templateExpectedClassBody =
-    const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a class body, but got '#lexeme'.""",
-        withArguments: _withArgumentsExpectedClassBody);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(Token token)> codeExpectedClassBody =
-    const Code<Message Function(Token token)>(
-        "ExpectedClassBody", templateExpectedClassBody,
-        analyzerCode: "MISSING_CLASS_BODY", dart2jsCode: "*fatal*");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsExpectedClassBody(Token token) {
-  String lexeme = token.lexeme;
-  return new Message(codeExpectedClassBody,
-      message: """Expected a class body, but got '${lexeme}'.""",
-      arguments: {'token': token});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedClassBodyToSkip =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a class body, but got '#lexeme'.""",
+        messageTemplate:
+            r"""Expected a class or mixin body, but got '#lexeme'.""",
         withArguments: _withArgumentsExpectedClassBodyToSkip);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2392,7 +2373,7 @@
 Message _withArgumentsExpectedClassBodyToSkip(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedClassBodyToSkip,
-      message: """Expected a class body, but got '${lexeme}'.""",
+      message: """Expected a class or mixin body, but got '${lexeme}'.""",
       arguments: {'token': token});
 }
 
@@ -2417,6 +2398,27 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(Token token)> templateExpectedClassOrMixinBody =
+    const Template<Message Function(Token token)>(
+        messageTemplate:
+            r"""Expected a class or mixin body, but got '#lexeme'.""",
+        withArguments: _withArgumentsExpectedClassOrMixinBody);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Token token)> codeExpectedClassOrMixinBody =
+    const Code<Message Function(Token token)>(
+        "ExpectedClassOrMixinBody", templateExpectedClassOrMixinBody,
+        analyzerCode: "MISSING_CLASS_BODY", dart2jsCode: "*fatal*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExpectedClassOrMixinBody(Token token) {
+  String lexeme = token.lexeme;
+  return new Message(codeExpectedClassOrMixinBody,
+      message: """Expected a class or mixin body, but got '${lexeme}'.""",
+      arguments: {'token': token});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedDeclaration =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""Expected a declaration, but got '#lexeme'.""",
@@ -2944,6 +2946,9 @@
   --dump-ir
     Print compiled libraries in Kernel source notation.
 
+  --bytecode
+    Generate bytecode. Supported only for SDK platform compilation.
+
   --exclude-source
     Do not include source code in the dill file.
 
@@ -3010,6 +3015,66 @@
 const Template<
     Message Function(
         String
+            name)> templateFinalFieldNotInitialized = const Template<
+        Message Function(String name)>(
+    messageTemplate: r"""Final field '#name' is not initialized.""",
+    tipTemplate:
+        r"""Try to initialize the field in the declaration or in every constructor.""",
+    withArguments: _withArgumentsFinalFieldNotInitialized);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeFinalFieldNotInitialized =
+    const Code<Message Function(String name)>(
+        "FinalFieldNotInitialized", templateFinalFieldNotInitialized,
+        analyzerCode: "FINAL_NOT_INITIALIZED",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsFinalFieldNotInitialized(String name) {
+  return new Message(codeFinalFieldNotInitialized,
+      message: """Final field '${name}' is not initialized.""",
+      tip:
+          """Try to initialize the field in the declaration or in every constructor.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateFinalFieldNotInitializedByConstructor = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Final field '#name' is not initialized by this constructor.""",
+    tipTemplate:
+        r"""Try to initialize the field using an initializing formal or a field initializer.""",
+    withArguments: _withArgumentsFinalFieldNotInitializedByConstructor);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeFinalFieldNotInitializedByConstructor =
+    const Code<Message Function(String name)>(
+        "FinalFieldNotInitializedByConstructor",
+        templateFinalFieldNotInitializedByConstructor,
+        analyzerCode: "FINAL_NOT_INITIALIZED_CONSTRUCTOR_1",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsFinalFieldNotInitializedByConstructor(String name) {
+  return new Message(codeFinalFieldNotInitializedByConstructor,
+      message:
+          """Final field '${name}' is not initialized by this constructor.""",
+      tip:
+          """Try to initialize the field using an initializing formal or a field initializer.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
             name)> templateFinalFieldWithoutInitializer = const Template<
         Message Function(String name)>(
     messageTemplate: r"""The final variable '#name' must be initialized.""",
@@ -5095,6 +5160,18 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMoreThanOneSuperOrThisInitializer =
+    messageMoreThanOneSuperOrThisInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMoreThanOneSuperOrThisInitializer = const MessageCode(
+    "MoreThanOneSuperOrThisInitializer",
+    analyzerCode: "SUPER_IN_REDIRECTING_CONSTRUCTOR",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message: r"""Can't have more than one 'super' or 'this' initializer.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMultipleExtends = messageMultipleExtends;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6506,6 +6583,17 @@
     message: r"""Expected identifier, but got 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSuperInitializerNotLast = messageSuperInitializerNotLast;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSuperInitializerNotLast = const MessageCode(
+    "SuperInitializerNotLast",
+    analyzerCode: "INVALID_SUPER_INVOCATION",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message: r"""Can't have initializers after 'super'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSuperNullAware = messageSuperNullAware;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6749,6 +6837,17 @@
     message: r"""Expected identifier, but got 'this'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeThisInitializerNotAlone = messageThisInitializerNotAlone;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageThisInitializerNotAlone = const MessageCode(
+    "ThisInitializerNotAlone",
+    analyzerCode: "FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message: r"""Can't have other initializers together with 'this'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)>
     templateThisOrSuperAccessInFieldInitializer =
     const Template<Message Function(String string)>(
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 4bdff1a..476c2da 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -188,16 +188,17 @@
       for (Uri uri in new Set<Uri>.from(dillLoadedData.loader.builders.keys)
         ..removeAll(reusedLibraryUris)) {
         dillLoadedData.loader.builders.remove(uri);
+        dillLoadedDataUriToSource.remove(uri);
         userBuilders?.remove(uri);
       }
 
       if (hierarchy != null) {
-        List<Class> removedClasses = new List<Class>();
+        List<Library> removedLibraries = new List<Library>();
         for (LibraryBuilder builder in notReusedLibraries) {
           Library lib = builder.target;
-          removedClasses.addAll(lib.classes);
+          removedLibraries.add(lib);
         }
-        hierarchy.applyTreeChanges(removedClasses, const []);
+        hierarchy.applyTreeChanges(removedLibraries, const []);
       }
 
       if (userCode != null) {
@@ -245,8 +246,8 @@
         }
         userCode.loader.builders.clear();
         userCode = userCodeOld;
-        return new Component(
-            libraries: compiledLibraries, uriToSource: <Uri, Source>{});
+        return context.options.target.configureComponent(new Component(
+            libraries: compiledLibraries, uriToSource: <Uri, Source>{}));
       }
       if (componentWithDill != null) {
         this.invalidatedUris.clear();
@@ -281,7 +282,8 @@
       }
 
       // This is the incremental component.
-      return new Component(libraries: outputLibraries, uriToSource: uriToSource)
+      return context.options.target.configureComponent(
+          new Component(libraries: outputLibraries, uriToSource: uriToSource))
         ..mainMethod = mainMethod;
     });
   }
@@ -327,16 +329,19 @@
       }
     }
 
-    List<Class> removedClasses = new List<Class>();
+    List<Library> removedLibraries = new List<Library>();
     for (Uri uri in potentiallyReferencedLibraries.keys) {
       if (uri.scheme == "package") continue;
       LibraryBuilder builder = userCode.loader.builders.remove(uri);
       if (builder != null) {
         Library lib = builder.target;
-        removedClasses.addAll(lib.classes);
+        removedLibraries.add(lib);
+        dillLoadedData.loader.builders.remove(uri);
+        dillLoadedDataUriToSource.remove(uri);
+        userBuilders?.remove(uri);
       }
     }
-    hierarchy?.applyTreeChanges(removedClasses, const []);
+    hierarchy?.applyTreeChanges(removedLibraries, const []);
 
     return result;
   }
@@ -348,7 +353,7 @@
 
     if (summaryBytes != null) {
       ticker.logMs("Read ${c.options.sdkSummary}");
-      data.component = new Component();
+      data.component = c.options.target.configureComponent(new Component());
       new BinaryBuilder(summaryBytes, disableLazyReading: false)
           .readComponent(data.component);
       ticker.logMs("Deserialized ${c.options.sdkSummary}");
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 7c85c12..81eb16d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -114,6 +114,8 @@
 
 import 'kernel_builder.dart';
 
+import 'kernel_expression_generator.dart' show KernelNonLValueGenerator;
+
 import 'type_algorithms.dart' show calculateBounds;
 
 // TODO(ahe): Remove this and ensure all nodes have a location.
@@ -593,7 +595,7 @@
                   formal.charOffset, new VariableGet(formal.declaration),
                   formalType: formal.declaration.type);
             }
-            member.addInitializer(initializer, _typeInferrer);
+            member.addInitializer(initializer, this);
           }
         }
       }
@@ -657,7 +659,7 @@
     }
     _typeInferrer.inferInitializer(this, initializer);
     if (member is KernelConstructorBuilder && !member.isExternal) {
-      member.addInitializer(initializer, _typeInferrer);
+      member.addInitializer(initializer, this);
     } else {
       addCompileTimeError(
           fasta.templateInitializerOutsideConstructor
@@ -2038,16 +2040,15 @@
   void handleAssignmentExpression(Token token) {
     debugEvent("AssignmentExpression");
     Expression value = popForValue();
-    Object generator = pop();
-    if (generator is! Generator) {
-      push(new SyntheticExpressionJudgment(buildCompileTimeError(
-          fasta.messageNotAnLvalue,
-          offsetForToken(token),
-          lengthForToken(token))));
+    Object lhs = pop();
+    Generator generator;
+    if (lhs is Generator) {
+      generator = lhs;
     } else {
-      push(new DelayedAssignment(
-          this, token, generator, value, token.stringValue));
+      generator = new KernelNonLValueGenerator(this, token, lhs);
     }
+    push(new DelayedAssignment(
+        this, token, generator, value, token.stringValue));
   }
 
   @override
@@ -2460,8 +2461,13 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     debugEvent("FormalParameter");
     if (thisKeyword != null) {
       if (!inConstructor) {
@@ -4095,9 +4101,10 @@
 
   @override
   Expression buildCompileTimeErrorExpression(Message message, int offset,
-      {int length}) {
+      {int length, Expression original}) {
     return new SyntheticExpressionJudgment(
-        buildCompileTimeError(message, offset, length ?? noLength));
+        buildCompileTimeError(message, offset, length ?? noLength),
+        original: original);
   }
 
   Expression wrapInCompileTimeError(Expression expression, Message message,
@@ -4198,7 +4205,9 @@
       Statement statement, Message message) {
     // TODO(askesc): Produce explicit error statement wrapping the original.
     // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
-    return buildCompileTimeErrorStatement(message, statement.fileOffset);
+    var error = buildCompileTimeErrorStatement(message, statement.fileOffset);
+    statement.parent = error; // to avoid dangling statement
+    return error;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 5678166..05b2a4d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1007,11 +1007,23 @@
   }
 
   Expression handleAssignment(bool voidContext) {
+    var assignment = makeAssignmentExpression(voidContext);
     if (helper.constantContext != ConstantContext.none) {
+      // The assignment needs to have a parent so that type inference can be
+      // applied to it, but it doesn't matter what the parent is because the
+      // assignment won't appear in the tree.  So just give it a quick and dirty
+      // parent.
+      new VariableDeclaration.forValue(assignment);
+
       return helper.buildCompileTimeErrorExpression(
           messageNotAConstantExpression, offsetForToken(token),
-          length: token.length);
+          length: token.length, original: assignment);
+    } else {
+      return assignment;
     }
+  }
+
+  Expression makeAssignmentExpression(bool voidContext) {
     if (identical("=", assignmentOperator)) {
       return generator.buildAssignment(value, voidContext: voidContext);
     } else if (identical("+=", assignmentOperator)) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index ec1d489..a1ca4c0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -77,7 +77,7 @@
       {List<LocatedMessage> context});
 
   Expression buildCompileTimeErrorExpression(Message message, int offset,
-      {int length});
+      {int length, Expression original});
 
   Expression wrapInCompileTimeError(Expression expression, Message message);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index a245bb8..e098d26 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -136,9 +136,9 @@
         null,
         <FormalParameterBuilder>[
           new KernelFormalParameterBuilder(
-              null, 0, intType, "index", true, parent, charOffset),
+              null, 0, intType, "index", true, parent, charOffset, 0, 0),
           new KernelFormalParameterBuilder(
-              null, 0, stringType, "_name", true, parent, charOffset)
+              null, 0, stringType, "_name", true, parent, charOffset, 0, 0)
         ],
         parent,
         charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 060e95f..90a8c07 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -1319,36 +1319,51 @@
   @override
   Expression get expression {
     if (super.expression == null) {
-      int offset = offsetForToken(token);
-      if (declaration is KernelInvalidTypeBuilder) {
-        KernelInvalidTypeBuilder declaration = this.declaration;
-        helper.addProblemErrorIfConst(
-            declaration.message.messageObject, offset, token.length);
-        super.expression = new SyntheticExpressionJudgment(
-            new Throw(forest.literalString(declaration.message.message, token))
-              ..fileOffset = offset);
-      } else {
-        super.expression = forest.literalType(
-            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
-            token);
-      }
+      super.expression = computeExpression();
     }
     return super.expression;
   }
 
+  Expression computeExpression({bool silent: false}) {
+    int offset = offsetForToken(token);
+    if (declaration is KernelInvalidTypeBuilder) {
+      KernelInvalidTypeBuilder declaration = this.declaration;
+      if (!silent) {
+        helper.addProblemErrorIfConst(
+            declaration.message.messageObject, offset, token.length);
+      }
+      return new UnresolvedVariableGetJudgment(
+          new Throw(forest.literalString(declaration.message.message, token))
+            ..fileOffset = offset,
+          token.isSynthetic)
+        ..fileOffset = offset;
+    } else {
+      return forest.literalType(
+          buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
+          token);
+    }
+  }
+
   @override
   Node get fieldInitializerTarget =>
       declaration.hasTarget ? declaration.target : null;
 
   @override
   Expression makeInvalidWrite(Expression value) {
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
+    var read = computeExpression(silent: true);
+    // The read needs to have a parent so that type inference can be applied to
+    // it, but it doesn't mater what the parent is because the final read won't
+    // appear in the tree.  So just give it a quick and dirty parent.
+    new VariableDeclaration.forValue(read);
+
+    var throwExpr = helper.throwNoSuchMethodError(
         forest.literalNull(token),
         plainNameForRead,
         forest.arguments(<Expression>[value], noLocation, noLocation)
           ..fileOffset = value.fileOffset,
         offsetForToken(token),
-        isSetter: true));
+        isSetter: true);
+    return new SyntheticExpressionJudgment(throwExpr, original: read);
   }
 
   @override
@@ -1555,11 +1570,12 @@
   UnresolvedVariableAssignmentJudgment _buildUnresolvedVariableAssignment(
       bool isCompound, Expression value) {
     return new UnresolvedVariableAssignmentJudgment(
-      buildError(forest.arguments(<Expression>[value], token, token),
-          isSetter: true),
-      isCompound,
-      value,
-    )..fileOffset = token.charOffset;
+        buildError(forest.arguments(<Expression>[value], token, token),
+            isSetter: true),
+        isCompound,
+        value,
+        token.isSynthetic)
+      ..fileOffset = token.charOffset;
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index 178e709..cbff91f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -376,6 +376,26 @@
   }
 }
 
+class KernelNonLValueGenerator extends KernelReadOnlyAccessGenerator {
+  KernelNonLValueGenerator(
+      ExpressionGeneratorHelper helper, Token token, Expression expression)
+      : super(helper, token, expression, null);
+
+  String get debugName => "KernelNonLValueGenerator";
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
+    return new IllegalAssignmentJudgment(rhs,
+        assignmentOffset: offsetForToken(token));
+  }
+
+  Expression makeInvalidWrite(Expression value) {
+    var error = helper.buildCompileTimeError(
+        messageNotAnLvalue, offsetForToken(token), lengthForToken(token));
+    return new InvalidWriteJudgment(error, expression);
+  }
+}
+
 class ParenthesizedExpressionGenerator extends KernelReadOnlyAccessGenerator {
   ParenthesizedExpressionGenerator(
       ExpressionGeneratorHelper helper, Token token, Expression expression)
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 3cf6839..28731e1 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
@@ -21,6 +21,8 @@
     extends FormalParameterBuilder<KernelTypeBuilder> {
   VariableDeclarationJudgment declaration;
   final int charOffset;
+  final int codeStartOffset;
+  final int codeEndOffset;
 
   KernelFormalParameterBuilder(
       List<MetadataBuilder> metadata,
@@ -29,7 +31,9 @@
       String name,
       bool hasThis,
       KernelLibraryBuilder compilationUnit,
-      this.charOffset)
+      this.charOffset,
+      this.codeStartOffset,
+      this.codeEndOffset)
       : super(metadata, modifiers, type, name, hasThis, compilationUnit,
             charOffset);
 
@@ -47,6 +51,8 @@
           isFieldFormal: hasThis,
           isCovariant: isCovariant)
         ..fileOffset = charOffset;
+      library.loader.target.metadataCollector
+          ?.setCodeStartEnd(declaration, codeStartOffset, codeEndOffset);
     }
     return declaration;
   }
@@ -56,8 +62,16 @@
     assert(declaration != null);
     return !hasThis
         ? this
-        : (new KernelFormalParameterBuilder(metadata, modifiers | finalMask,
-            type, name, hasThis, parent, charOffset)
+        : (new KernelFormalParameterBuilder(
+            metadata,
+            modifiers | finalMask,
+            type,
+            name,
+            hasThis,
+            parent,
+            charOffset,
+            codeStartOffset,
+            codeEndOffset)
           ..declaration = declaration);
   }
 }
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 077758d..437b729 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
@@ -71,6 +71,7 @@
       if (type.formals != null) {
         for (KernelFormalParameterBuilder formal in type.formals) {
           VariableDeclaration parameter = formal.build(libraryBuilder);
+          parameter.parent = target;
           parameter.type = freshTypeParameters.substitute(parameter.type);
           if (formal.isNamed) {
             target.namedParameters.add(parameter);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 078ccce..11ed95df 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -279,9 +279,7 @@
 
     members.forEach(setParentAndCheckConflicts);
     constructors.forEach(setParentAndCheckConflicts);
-    // Formally, a setter has the name `id=`, so it can never conflict with a
-    // type variable.
-    setters.forEach(setParent);
+    setters.forEach(setParentAndCheckConflicts);
     addBuilder(className, cls, charOffset);
   }
 
@@ -556,13 +554,19 @@
       KernelTypeBuilder type,
       String name,
       int charOffset,
+      int codeStartOffset,
+      int codeEndOffset,
       Token initializerTokenForInference,
       bool hasInitializer) {
     var builder = new KernelFieldBuilder(metadata, type, name, modifiers, this,
         charOffset, initializerTokenForInference, hasInitializer);
     addBuilder(name, builder, charOffset);
-    loader.target.metadataCollector
-        ?.setDocumentationComment(builder.target, documentationComment);
+
+    var metadataCollector = loader.target.metadataCollector;
+    metadataCollector?.setDocumentationComment(
+        builder.target, documentationComment);
+    metadataCollector?.setCodeStartEnd(
+        builder.target, codeStartOffset, codeEndOffset);
   }
 
   void addConstructor(
@@ -578,6 +582,8 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
+      int codeStartOffset,
+      int codeEndOffset,
       String nativeMethodName) {
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     ProcedureBuilder procedure = new KernelConstructorBuilder(
@@ -596,6 +602,8 @@
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
     metadataCollector?.setConstructorNameOffset(procedure.target, name);
+    metadataCollector?.setCodeStartEnd(
+        procedure.target, codeStartOffset, codeEndOffset);
     checkTypeVariables(typeVariables, procedure);
     addBuilder(constructorName, procedure, charOffset);
     if (nativeMethodName != null) {
@@ -657,6 +665,8 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
+      int codeStartOffset,
+      int codeEndOffset,
       String nativeMethodName) {
     KernelTypeBuilder returnType = addNamedType(
         currentDeclaration.parent.name, <KernelTypeBuilder>[], charOffset);
@@ -715,6 +725,8 @@
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
     metadataCollector?.setConstructorNameOffset(procedure.target, name);
+    metadataCollector?.setCodeStartEnd(
+        procedure.target, codeStartOffset, codeEndOffset);
 
     DeclarationBuilder<TypeBuilder> savedDeclaration = currentDeclaration;
     currentDeclaration = factoryDeclaration;
@@ -789,9 +801,11 @@
       KernelTypeBuilder type,
       String name,
       bool hasThis,
-      int charOffset) {
-    return new KernelFormalParameterBuilder(
-        metadata, modifiers, type, name, hasThis, this, charOffset);
+      int charOffset,
+      int codeStartOffset,
+      int codeEndOffset) {
+    return new KernelFormalParameterBuilder(metadata, modifiers, type, name,
+        hasThis, this, charOffset, codeStartOffset, codeEndOffset);
   }
 
   KernelTypeVariableBuilder addTypeVariable(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index 70b1051..7dbbdb3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -16,10 +16,8 @@
         Expression,
         FunctionNode,
         Initializer,
-        LocalInitializer,
         Member,
         Name,
-        NamedExpression,
         Procedure,
         ProcedureKind,
         RedirectingInitializer,
@@ -30,7 +28,6 @@
         TypeParameter,
         TypeParameterType,
         VariableDeclaration,
-        VariableGet,
         VoidType,
         setParents;
 
@@ -39,22 +36,22 @@
 import '../../base/instrumentation.dart'
     show Instrumentation, InstrumentationValueForType;
 
-import '../type_inference/type_inferrer.dart' show TypeInferrer;
-
 import '../loader.dart' show Loader;
 
 import '../messages.dart'
     show
+        Message,
+        messageMoreThanOneSuperOrThisInitializer,
         messageNonInstanceTypeVariableUse,
         messagePatchDeclarationMismatch,
         messagePatchDeclarationOrigin,
         messagePatchNonExternal,
+        messageSuperInitializerNotLast,
+        messageThisInitializerNotAlone,
         noLength;
 
 import '../problems.dart' show unexpected;
 
-import '../deprecated_problems.dart' show deprecated_inputError;
-
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'kernel_builder.dart'
@@ -78,6 +75,8 @@
 
 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
 
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
 abstract class KernelFunctionBuilder
     extends ProcedureBuilder<KernelTypeBuilder> {
   final String nativeMethodName;
@@ -490,69 +489,54 @@
 
   Constructor get target => origin.constructor;
 
-  void checkSuperOrThisInitializer(Initializer initializer) {
-    if (superInitializer != null || redirectingInitializer != null) {
-      return deprecated_inputError(fileUri, initializer.fileOffset,
-          "Can't have more than one 'super' or 'this' initializer.");
-    }
+  void injectInvalidInitializer(
+      Message message, int charOffset, ExpressionGeneratorHelper helper) {
+    List<Initializer> initializers = constructor.initializers;
+    Initializer lastInitializer = initializers.removeLast();
+    assert(lastInitializer == superInitializer ||
+        lastInitializer == redirectingInitializer);
+    Initializer error = helper.buildInvalidInitializer(
+        helper.buildCompileTimeError(message, charOffset, noLength),
+        charOffset);
+    initializers.add(error..parent = constructor);
+    initializers.add(lastInitializer);
   }
 
-  void addInitializer(Initializer initializer, TypeInferrer typeInferrer) {
+  void addInitializer(
+      Initializer initializer, ExpressionGeneratorHelper helper) {
     List<Initializer> initializers = constructor.initializers;
     if (initializer is SuperInitializer) {
-      checkSuperOrThisInitializer(initializer);
-      superInitializer = initializer;
+      if (superInitializer != null || redirectingInitializer != null) {
+        injectInvalidInitializer(messageMoreThanOneSuperOrThisInitializer,
+            initializer.fileOffset, helper);
+      } else {
+        initializers.add(initializer..parent = constructor);
+        superInitializer = initializer;
+      }
     } else if (initializer is RedirectingInitializer) {
-      checkSuperOrThisInitializer(initializer);
-      redirectingInitializer = initializer;
-      if (constructor.initializers.isNotEmpty) {
-        deprecated_inputError(fileUri, initializer.fileOffset,
-            "'this' initializer must be the only initializer.");
+      if (superInitializer != null || redirectingInitializer != null) {
+        injectInvalidInitializer(messageMoreThanOneSuperOrThisInitializer,
+            initializer.fileOffset, helper);
+      } else if (constructor.initializers.isNotEmpty) {
+        Initializer first = constructor.initializers.first;
+        Initializer error = helper.buildInvalidInitializer(
+            helper.buildCompileTimeError(
+                messageThisInitializerNotAlone, first.fileOffset, noLength),
+            first.fileOffset);
+        initializers.add(error..parent = constructor);
+      } else {
+        initializers.add(initializer..parent = constructor);
+        redirectingInitializer = initializer;
       }
     } else if (redirectingInitializer != null) {
-      deprecated_inputError(fileUri, initializer.fileOffset,
-          "'this' initializer must be the only initializer.");
+      injectInvalidInitializer(
+          messageThisInitializerNotAlone, initializer.fileOffset, helper);
     } else if (superInitializer != null) {
-      // If there is a super initializer ([initializer] isn't it), we need to
-      // insert [initializer] before the super initializer (thus ensuring that
-      // the super initializer is always last).
-      assert(superInitializer != initializer);
-      assert(initializers.last == superInitializer);
-      initializers.removeLast();
-      if (!hasMovedSuperInitializer) {
-        // To preserve correct evaluation order, the arguments to super call
-        // must be evaluated before [initializer]. Once the super initializer
-        // has been moved once, the arguments are evaluated in the correct
-        // order.
-        hasMovedSuperInitializer = true;
-        Arguments arguments = superInitializer.arguments;
-        List<Expression> positional = arguments.positional;
-        for (int i = 0; i < positional.length; i++) {
-          var type = typeInferrer.typeSchemaEnvironment.strongMode
-              ? positional[i].getStaticType(typeInferrer.typeSchemaEnvironment)
-              : const DynamicType();
-          VariableDeclaration variable = new VariableDeclaration.forValue(
-              positional[i],
-              isFinal: true,
-              type: type);
-          initializers
-              .add(new LocalInitializer(variable)..parent = constructor);
-          positional[i] = new VariableGet(variable)..parent = arguments;
-        }
-        for (NamedExpression named in arguments.named) {
-          VariableDeclaration variable =
-              new VariableDeclaration.forValue(named.value, isFinal: true);
-          named.value = new VariableGet(variable)..parent = named;
-          initializers
-              .add(new LocalInitializer(variable)..parent = constructor);
-        }
-      }
+      injectInvalidInitializer(
+          messageSuperInitializerNotLast, superInitializer.fileOffset, helper);
+    } else {
       initializers.add(initializer..parent = constructor);
-      initializers.add(superInitializer);
-      return;
     }
-    initializers.add(initializer);
-    initializer.parent = constructor;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index f454c42..cd00ddb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -222,7 +222,8 @@
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer, DartType typeContext) {
-    inferrer.inferExpression(judgment, const UnknownType(), false);
+    inferrer.inferExpression(judgment, const UnknownType(), false,
+        isVoidAllowed: true);
     inferredType = type;
     inferrer.listener
         .asExpression(this, fileOffset, null, tokens, null, inferredType);
@@ -301,7 +302,7 @@
       typeContext = inferrer.wrapFutureOrType(typeContext);
     }
     var judgment = this.judgment;
-    inferrer.inferExpression(judgment, typeContext, true);
+    inferrer.inferExpression(judgment, typeContext, true, isVoidAllowed: true);
     inferredType =
         inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
     inferrer.listener
@@ -589,6 +590,11 @@
           DartType readType,
           DartType writeContext) {
     assert(writeContext != null);
+    if (readType is VoidType &&
+        (combiner != null || nullAwareCombiner != null)) {
+      inferrer.helper
+          ?.addProblem(messageVoidExpression, read.fileOffset, noLength);
+    }
     var writeOffset = write == null ? -1 : write.fileOffset;
     Procedure combinerMember;
     DartType combinedType;
@@ -643,10 +649,12 @@
       }
       _storeLetType(inferrer, replacedCombiner, combinedType);
     } else {
-      inferrer.inferExpression(rhs, writeContext ?? const UnknownType(), true);
+      inferrer.inferExpression(rhs, writeContext ?? const UnknownType(), true,
+          isVoidAllowed: true);
       var rhsType = rhs.inferredType;
-      var replacedRhs =
-          inferrer.ensureAssignable(writeContext, rhsType, rhs, writeOffset);
+      var replacedRhs = inferrer.ensureAssignable(
+          writeContext, rhsType, rhs, writeOffset,
+          isVoidAllowed: writeContext is VoidType);
       _storeLetType(inferrer, replacedRhs ?? rhs, rhsType);
       if (nullAwareCombiner != null) {
         MethodInvocation equalsInvocation = nullAwareCombiner.condition;
@@ -742,9 +750,11 @@
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
         condition, condition.fileOffset);
-    inferrer.inferExpression(thenJudgment, typeContext, true);
+    inferrer.inferExpression(thenJudgment, typeContext, true,
+        isVoidAllowed: true);
     bool useLub = _forceLub || typeContext == null;
-    inferrer.inferExpression(otherwiseJudgment, typeContext, useLub);
+    inferrer.inferExpression(otherwiseJudgment, typeContext, useLub,
+        isVoidAllowed: true);
     inferredType = useLub
         ? inferrer.typeSchemaEnvironment.getLeastUpperBound(
             thenJudgment.inferredType, otherwiseJudgment.inferredType)
@@ -861,7 +871,7 @@
     // Since the variable is not used in the body we don't need to type infer
     // it.  We can just type infer the body.
     var judgment = this.judgment;
-    inferrer.inferExpression(judgment, typeContext, true);
+    inferrer.inferExpression(judgment, typeContext, true, isVoidAllowed: true);
     inferredType = judgment.inferredType;
     inferrer.listener.deferredCheck(this, fileOffset, inferredType);
     return null;
@@ -948,7 +958,8 @@
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer) {
-    inferrer.inferExpression(judgment, const UnknownType(), false);
+    inferrer.inferExpression(judgment, const UnknownType(), false,
+        isVoidAllowed: true);
     inferrer.listener.expressionStatement(this, fileOffset, null, tokens);
   }
 }
@@ -1241,7 +1252,8 @@
       for (var initializer in initializers) {
         variables
             .add(new VariableDeclaration.forValue(initializer)..parent = this);
-        inferrer.inferExpression(initializer, const UnknownType(), false);
+        inferrer.inferExpression(initializer, const UnknownType(), false,
+            isVoidAllowed: true);
       }
     } else {
       for (var variable in variableJudgments) {
@@ -1256,7 +1268,8 @@
           condition, condition.fileOffset);
     }
     for (var update in updateJudgments) {
-      inferrer.inferExpression(update, const UnknownType(), false);
+      inferrer.inferExpression(update, const UnknownType(), false,
+          isVoidAllowed: true);
     }
     inferrer.inferStatement(bodyJudgment);
     inferrer.listener.forStatement(
@@ -1415,21 +1428,23 @@
     // - Infer e1 in context J to get T1
     bool useLub = _forceLub || typeContext is UnknownType;
     if (typeContext is UnknownType) {
-      inferrer.inferExpression(rightJudgment, lhsType, true);
+      inferrer.inferExpression(rightJudgment, lhsType, true,
+          isVoidAllowed: true);
     } else {
-      inferrer.inferExpression(rightJudgment, typeContext, _forceLub);
+      inferrer.inferExpression(rightJudgment, typeContext, _forceLub,
+          isVoidAllowed: true);
     }
     var rhsType = rightJudgment.inferredType;
-    if (rhsType is VoidType) {
-      inferrer.helper?.addProblem(
-          messageVoidExpression, rightJudgment.fileOffset, noLength);
-    }
     // - Let T = greatest closure of K with respect to `?` if K is not `_`, else
     //   UP(t0, t1)
     // - Then the inferred type is T.
-    inferredType = useLub
-        ? inferrer.typeSchemaEnvironment.getLeastUpperBound(lhsType, rhsType)
-        : greatestClosure(inferrer.coreTypes, typeContext);
+    if (rhsType is VoidType) {
+      inferredType = rhsType;
+    } else {
+      inferredType = useLub
+          ? inferrer.typeSchemaEnvironment.getLeastUpperBound(lhsType, rhsType)
+          : greatestClosure(inferrer.coreTypes, typeContext);
+    }
     if (inferrer.strongMode) {
       body.staticType = inferredType;
     }
@@ -1782,8 +1797,9 @@
     if (inferenceNeeded || typeChecksNeeded) {
       for (int i = 0; i < judgments.length; ++i) {
         ExpressionJudgment judgment = judgments[i];
-        inferrer.inferExpression(judgment, inferredTypeArgument,
-            inferenceNeeded || typeChecksNeeded);
+        inferrer.inferExpression(
+            judgment, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: true);
         if (inferenceNeeded) {
           formalTypes.add(listType.typeArguments[0]);
         }
@@ -1805,8 +1821,9 @@
     }
     if (typeChecksNeeded) {
       for (int i = 0; i < judgments.length; i++) {
-        inferrer.ensureAssignable(typeArgument, actualTypes[i], judgments[i],
-            judgments[i].fileOffset);
+        inferrer.ensureAssignable(
+            typeArgument, actualTypes[i], judgments[i], judgments[i].fileOffset,
+            isVoidAllowed: typeArgument is VoidType);
       }
     }
     var inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
@@ -1867,11 +1884,13 @@
       DartType keyTypeContext,
       DartType valueTypeContext) {
     ExpressionJudgment keyJudgment = this.keyJudgment;
-    inferrer.inferExpression(keyJudgment, keyTypeContext, true);
+    inferrer.inferExpression(keyJudgment, keyTypeContext, true,
+        isVoidAllowed: true);
     inferredKeyType = keyJudgment.inferredType;
 
     ExpressionJudgment valueJudgment = this.valueJudgment;
-    inferrer.inferExpression(valueJudgment, valueTypeContext, true);
+    inferrer.inferExpression(valueJudgment, valueTypeContext, true,
+        isVoidAllowed: true);
     inferredValueType = valueJudgment.inferredType;
 
     return null;
@@ -1962,11 +1981,13 @@
       for (int i = 0; i < judgments.length; ++i) {
         ExpressionJudgment keyJudgment = cachedKeyJudgments[i];
         inferrer.ensureAssignable(
-            keyType, actualTypes[2 * i], keyJudgment, keyJudgment.fileOffset);
+            keyType, actualTypes[2 * i], keyJudgment, keyJudgment.fileOffset,
+            isVoidAllowed: keyType is VoidType);
 
         ExpressionJudgment valueJudgment = cachedValueJudgments[i];
         inferrer.ensureAssignable(valueType, actualTypes[2 * i + 1],
-            valueJudgment, valueJudgment.fileOffset);
+            valueJudgment, valueJudgment.fileOffset,
+            isVoidAllowed: valueType is VoidType);
       }
     }
     inferredType =
@@ -2374,7 +2395,8 @@
         : const UnknownType();
     DartType inferredType;
     if (expression != null) {
-      inferrer.inferExpression(judgment, typeContext, true);
+      inferrer.inferExpression(judgment, typeContext, true,
+          isVoidAllowed: true);
       inferredType = judgment.inferredType;
     } else {
       inferredType = const VoidType();
@@ -2758,7 +2780,7 @@
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer, DartType typeContext) {
-    inferrer.listener.variableAssign(this, fileOffset, _variable.type,
+    inferrer.listener.variableAssign(this, fileOffset, false, _variable.type,
         _variable.createBinder(inferrer), null, _variable.type);
     return super.infer(inferrer, typeContext);
   }
@@ -3106,30 +3128,10 @@
       expression.infer(this, typeContext);
       DartType inferredType = expression.inferredType;
       if (inferredType is VoidType && !isVoidAllowed) {
-        TreeNode parent = expression.parent;
-        if (parent is ReturnStatement ||
-            parent is ExpressionStatement ||
-            parent is AsExpression) {
-          return inferredType;
-        } else if (parent is ForStatement &&
-            parent.updates.contains(expression)) {
-          return inferredType;
-        } else if (parent is VariableDeclaration) {
-          TreeNode grandParent = parent.parent;
-          if (grandParent is ForStatement &&
-              parent.name == null &&
-              grandParent.variables.contains(parent)) {
-            return inferredType;
-          }
-        } else if (parent is ConditionalExpression) {
-          if (parent.then == expression || parent.otherwise == expression) {
-            return inferredType;
-          }
-        } else if (parent is DeferredCheckJudgment) {
-          return inferredType;
+        if (expression.parent is! ArgumentsJudgment) {
+          helper?.addProblem(
+              messageVoidExpression, expression.fileOffset, noLength);
         }
-        helper?.addProblem(
-            messageVoidExpression, expression.fileOffset, noLength);
       }
       return inferredType;
     } else {
@@ -3298,6 +3300,7 @@
     inferrer.listener.variableAssign(
         this,
         write.fileOffset,
+        false,
         writeContext,
         write is VariableSet
             ? (write.variable as VariableDeclarationJudgment)
@@ -3403,7 +3406,8 @@
     DartType initializerType;
     if (initializerJudgment != null) {
       inferrer.inferExpression(initializerJudgment, declaredType,
-          !inferrer.isTopLevel || _implicitlyTyped);
+          !inferrer.isTopLevel || _implicitlyTyped,
+          isVoidAllowed: true);
       initializerType = initializerJudgment.inferredType;
       inferredType = inferrer.inferDeclarationType(initializerType);
     } else {
@@ -3416,7 +3420,8 @@
     }
     if (initializer != null) {
       var replacedInitializer = inferrer.ensureAssignable(
-          type, initializerType, initializer, fileOffset);
+          type, initializerType, initializer, fileOffset,
+          isVoidAllowed: type is VoidType);
       if (replacedInitializer != null) {
         initializer = replacedInitializer;
       }
@@ -3479,9 +3484,10 @@
 class UnresolvedVariableAssignmentJudgment extends SyntheticExpressionJudgment {
   final bool isCompound;
   final ExpressionJudgment rhs;
+  final bool isSyntheticLhs;
 
-  UnresolvedVariableAssignmentJudgment(
-      kernel.Expression desugared, this.isCompound, this.rhs)
+  UnresolvedVariableAssignmentJudgment(kernel.Expression desugared,
+      this.isCompound, this.rhs, this.isSyntheticLhs)
       : super(desugared);
 
   @override
@@ -3489,8 +3495,8 @@
       ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(rhs, const UnknownType(), true);
     inferredType = isCompound ? const DynamicType() : rhs.inferredType;
-    inferrer.listener.variableAssign(
-        this, fileOffset, const DynamicType(), null, null, inferredType);
+    inferrer.listener.variableAssign(this, fileOffset, isSyntheticLhs,
+        const DynamicType(), null, null, inferredType);
     return super.infer(inferrer, typeContext);
   }
 }
@@ -3511,7 +3517,7 @@
     inferrer.listener.variableGet(
         this, offset, isSynthetic, false, null, const DynamicType());
     inferrer.listener.variableAssign(
-        this, fileOffset, const DynamicType(), null, null, inferredType);
+        this, fileOffset, false, const DynamicType(), null, null, inferredType);
     return super.infer(inferrer, typeContext);
   }
 }
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 483f065..f128a30 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -12,9 +12,9 @@
         Block,
         CanonicalName,
         Class,
+        Component,
         Constructor,
         DartType,
-        Procedure,
         DynamicType,
         EmptyStatement,
         Expression,
@@ -29,8 +29,9 @@
         Name,
         NamedExpression,
         NullLiteral,
+        Procedure,
         ProcedureKind,
-        Component,
+        RedirectingInitializer,
         Source,
         Statement,
         StringLiteral,
@@ -59,6 +60,9 @@
         messageConstConstructorNonFinalField,
         messageConstConstructorNonFinalFieldCause,
         noLength,
+        templateFinalFieldNotInitialized,
+        templateFinalFieldNotInitializedByConstructor,
+        templateMissingImplementationCause,
         templateSuperclassHasNoDefaultConstructor;
 
 import '../problems.dart' show unhandled;
@@ -79,11 +83,11 @@
         Declaration,
         InvalidTypeBuilder,
         KernelClassBuilder,
+        KernelFieldBuilder,
         KernelLibraryBuilder,
         KernelNamedTypeBuilder,
         KernelProcedureBuilder,
         LibraryBuilder,
-        MemberBuilder,
         NamedTypeBuilder,
         TypeBuilder,
         TypeDeclarationBuilder,
@@ -292,9 +296,9 @@
           loader.finishDeferredLoadTearoffs();
           loader.finishNoSuchMethodForwarders();
           List<SourceClassBuilder> myClasses = collectMyClasses();
-          finishAllConstructors(myClasses);
           loader.finishNativeMethods();
           loader.finishPatchMethods();
+          finishAllConstructors(myClasses);
           runBuildTransformations();
 
           if (verify) this.verify();
@@ -392,8 +396,11 @@
     this.uriToSource.forEach(copySource);
     dillTarget.loader.uriToSource.forEach(copySource);
 
-    Component component = new Component(
-        nameRoot: nameRoot, libraries: libraries, uriToSource: uriToSource);
+    Component component = CompilerContext.current.options.target
+        .configureComponent(new Component(
+            nameRoot: nameRoot,
+            libraries: libraries,
+            uriToSource: uriToSource));
     if (loader.first != null) {
       // TODO(sigmund): do only for full program
       Declaration declaration =
@@ -459,7 +466,12 @@
   /// If [builder] doesn't have a constructors, install the defaults.
   void installDefaultConstructor(SourceClassBuilder builder) {
     if (builder.isMixinApplication && !builder.isNamedMixinApplication) return;
-    if (builder.constructors.local.isNotEmpty) return;
+    // TODO(askesc): Make this check light-weight in the absence of patches.
+    if (builder.target.constructors.isNotEmpty) return;
+    if (builder.target.redirectingFactoryConstructors.isNotEmpty) return;
+    for (Procedure proc in builder.target.procedures) {
+      if (proc.isFactory) return;
+    }
     if (builder.isPatch) return;
 
     /// Quotes below are from [Dart Programming Language Specification, 4th
@@ -601,7 +613,8 @@
         libraries.add(library.target);
       }
     }
-    Component plaformLibraries = new Component();
+    Component plaformLibraries = CompilerContext.current.options.target
+        .configureComponent(new Component());
     // Add libraries directly to prevent that their parents are changed.
     plaformLibraries.libraries.addAll(libraries);
     loader.computeCoreTypes(plaformLibraries);
@@ -636,14 +649,18 @@
         uninitializedFields.add(field);
       }
     }
-    Map<Constructor, List<FieldInitializer>> fieldInitializers =
-        <Constructor, List<FieldInitializer>>{};
+    Map<Constructor, Set<Field>> constructorInitializedFields =
+        <Constructor, Set<Field>>{};
     Constructor superTarget;
-    builder.constructors.forEach((String name, Declaration member) {
-      if (member.isFactory) return;
-      MemberBuilder constructorBuilder = member;
-      Constructor constructor = constructorBuilder.target;
-      if (!constructorBuilder.isRedirectingGenerativeConstructor) {
+    for (Constructor constructor in cls.constructors) {
+      bool isRedirecting = false;
+      for (Initializer initializer in constructor.initializers) {
+        if (initializer is RedirectingInitializer) {
+          isRedirecting = true;
+          break;
+        }
+      }
+      if (!isRedirecting) {
         /// >If no superinitializer is provided, an implicit superinitializer
         /// >of the form super() is added at the end of k’s initializer list,
         /// >unless the enclosing class is class Object.
@@ -672,13 +689,23 @@
           constructor.function.body = new EmptyStatement();
           constructor.function.body.parent = constructor.function;
         }
-        List<FieldInitializer> myFieldInitializers = <FieldInitializer>[];
+        Set<Field> myInitializedFields = new Set<Field>();
         for (Initializer initializer in constructor.initializers) {
           if (initializer is FieldInitializer) {
-            myFieldInitializers.add(initializer);
+            myInitializedFields.add(initializer.field);
           }
         }
-        fieldInitializers[constructor] = myFieldInitializers;
+        for (VariableDeclaration formal
+            in constructor.function.positionalParameters) {
+          if (formal.isFieldFormal) {
+            Declaration fieldBuilder = builder.scope.local[formal.name] ??
+                builder.origin.scope.local[formal.name];
+            if (fieldBuilder is KernelFieldBuilder) {
+              myInitializedFields.add(fieldBuilder.field);
+            }
+          }
+        }
+        constructorInitializedFields[constructor] = myInitializedFields;
         if (constructor.isConst && nonFinalFields.isNotEmpty) {
           builder.addCompileTimeError(messageConstConstructorNonFinalField,
               constructor.fileOffset, noLength,
@@ -689,36 +716,57 @@
           nonFinalFields.clear();
         }
       }
-    });
+    }
     Set<Field> initializedFields;
-    fieldInitializers.forEach(
-        (Constructor constructor, List<FieldInitializer> initializers) {
-      Iterable<Field> fields = initializers.map((i) => i.field);
+    constructorInitializedFields
+        .forEach((Constructor constructor, Set<Field> fields) {
       if (initializedFields == null) {
         initializedFields = new Set<Field>.from(fields);
       } else {
         initializedFields.addAll(fields);
       }
     });
+
     // Run through all fields that aren't initialized by any constructor, and
     // set their initializer to `null`.
     for (Field field in uninitializedFields) {
       if (initializedFields == null || !initializedFields.contains(field)) {
         field.initializer = new NullLiteral()..parent = field;
+        if (field.isFinal && cls.constructors.isNotEmpty) {
+          builder.library.addProblem(
+              templateFinalFieldNotInitialized.withArguments(field.name.name),
+              field.fileOffset,
+              field.name.name.length,
+              field.fileUri);
+        }
       }
     }
+
     // Run through all fields that are initialized by some constructor, and
     // make sure that all other constructors also initialize them.
-    fieldInitializers.forEach(
-        (Constructor constructor, List<FieldInitializer> initializers) {
-      Iterable<Field> fields = initializers.map((i) => i.field);
-      for (Field field in initializedFields.difference(fields.toSet())) {
+    constructorInitializedFields
+        .forEach((Constructor constructor, Set<Field> fields) {
+      for (Field field in initializedFields.difference(fields)) {
         if (field.initializer == null) {
           FieldInitializer initializer =
               new FieldInitializer(field, new NullLiteral())
                 ..isSynthetic = true;
           initializer.parent = constructor;
           constructor.initializers.insert(0, initializer);
+          if (field.isFinal) {
+            builder.library.addProblem(
+                templateFinalFieldNotInitializedByConstructor
+                    .withArguments(field.name.name),
+                constructor.fileOffset,
+                constructor.name.name.length,
+                constructor.fileUri,
+                context: [
+                  templateMissingImplementationCause
+                      .withArguments(field.name.name)
+                      .withLocation(field.fileUri, field.fileOffset,
+                          field.name.name.length)
+                ]);
+          }
         }
       }
     });
@@ -728,7 +776,7 @@
   /// libraries for the first time.
   void runBuildTransformations() {
     backendTarget.performModularTransformationsOnLibraries(
-        loader.coreTypes, loader.hierarchy, loader.libraries,
+        component, loader.coreTypes, loader.hierarchy, loader.libraries,
         logger: (String msg) => ticker.logMs(msg));
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 13409e2..dff7075 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -114,7 +114,9 @@
               formal.name,
               formal.hasThis,
               formal.parent,
-              formal.charOffset);
+              formal.charOffset,
+              formal.codeStartOffset,
+              formal.codeEndOffset);
           changed = true;
         } else {
           formals[i] = formal;
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index c799f7e..239709c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -92,6 +92,7 @@
     procedure.parent = fakeLibrary;
   }
 
+  // TODO(vegorov) find a way to preserve metadata.
   Component program = new Component(libraries: [fakeLibrary]);
   return serializeComponent(program);
 }
diff --git a/pkg/front_end/lib/src/fasta/messages.dart b/pkg/front_end/lib/src/fasta/messages.dart
index 397ce96..a689553 100644
--- a/pkg/front_end/lib/src/fasta/messages.dart
+++ b/pkg/front_end/lib/src/fasta/messages.dart
@@ -34,8 +34,9 @@
       parent = parent.parent;
     }
     if (parent is Library) {
-      Component component =
-          new Component(uriToSource: CompilerContext.current.uriToSource);
+      Component component = CompilerContext.current.options.target
+          .configureComponent(
+              new Component(uriToSource: CompilerContext.current.uriToSource));
       component.libraries.add(parent);
       parent.parent = component;
       Location result = node.location;
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index a7553fb..49bf6ab 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -61,8 +61,8 @@
   }
 
   @override
-  void beginClassBody(Token token) {
-    listener?.beginClassBody(token);
+  void beginClassOrMixinBody(Token token) {
+    listener?.beginClassOrMixinBody(token);
   }
 
   @override
@@ -172,10 +172,10 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
+  void beginFormalParameter(Token beginToken, MemberKind kind,
+      Token covariantToken, Token varFinalOrConst) {
     listener?.beginFormalParameter(
-        token, kind, covariantToken, varFinalOrConst);
+        beginToken, kind, covariantToken, varFinalOrConst);
   }
 
   @override
@@ -479,8 +479,8 @@
   }
 
   @override
-  void endClassBody(int memberCount, Token beginToken, Token endToken) {
-    listener?.endClassBody(memberCount, beginToken, endToken);
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    listener?.endClassOrMixinBody(memberCount, beginToken, endToken);
   }
 
   @override
@@ -602,10 +602,15 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     listener?.endFormalParameter(
-        thisKeyword, periodAfterThis, nameToken, kind, memberKind);
+        thisKeyword, periodAfterThis, nameToken, kind, memberKind, endToken);
   }
 
   @override
@@ -918,8 +923,9 @@
   }
 
   @override
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
-    listener?.handleClassImplements(implementsKeyword, interfacesCount);
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
+    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
   }
 
   @override
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 c064669..460fec9 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -95,10 +95,10 @@
   static const enumValueDeclaration =
       const EnumValueDeclarationIdentifierContext();
 
-  /// Identifier is the name being declared by a class declaration or a named
-  /// mixin application, for example, `Foo` in `class Foo = X with Y;`.
-  static const classOrNamedMixinDeclaration =
-      const ClassOrNamedMixinIdentifierContext();
+  /// Identifier is the name being declared by a class declaration, a mixin
+  /// declaration, or a named mixin application, for example,
+  /// `Foo` in `class Foo = X with Y;`.
+  static const classOrMixinDeclaration = const ClassOrMixinIdentifierContext();
 
   /// Identifier is the name of a type variable being declared (e.g. `Foo` in
   /// `class C<Foo extends num> {}`).
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 16cf689..9814c3b 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
@@ -43,10 +43,10 @@
   }
 }
 
-/// See [IdentifierContext.classOrNamedMixinDeclaration].
-class ClassOrNamedMixinIdentifierContext extends IdentifierContext {
-  const ClassOrNamedMixinIdentifierContext()
-      : super('classOrNamedMixinDeclaration',
+/// See [IdentifierContext.classOrMixinDeclaration].
+class ClassOrMixinIdentifierContext extends IdentifierContext {
+  const ClassOrMixinIdentifierContext()
+      : super('classOrMixinDeclaration',
             inDeclaration: true, isBuiltInIdentifierAllowed: false);
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 936b78e..d4fa7d9 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -76,19 +76,19 @@
     logEvent("CaseExpression");
   }
 
-  void beginClassBody(Token token) {}
+  void beginClassOrMixinBody(Token token) {}
 
-  /// Handle the end of the body of a class declaration.  The only substructures
-  /// are the class members.
-  void endClassBody(int memberCount, Token beginToken, Token endToken) {
-    logEvent("ClassBody");
+  /// Handle the end of the body of a class or mixin declaration.
+  /// The only substructures are the class or mixin members.
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    logEvent("ClassOrMixinBody");
   }
 
   /// Called before parsing a class or named mixin application.
   void beginClassOrNamedMixinApplication(Token token) {}
 
   /// Handle the beginning of a class declaration.
-  /// [beginToken] may be the same as [name], or may point to modifiers
+  /// [begin] may be the same as [name], or may point to modifiers
   /// (or extraneous modifiers in the case of recovery) preceding [name].
   void beginClassDeclaration(Token begin, Token abstractToken, Token name) {}
 
@@ -98,9 +98,11 @@
     logEvent("ClassExtends");
   }
 
-  /// Handle an implements clause in a class declaration. Substructures:
+  /// Handle an implements clause in a class or mixin declaration.
+  /// Substructures:
   /// - implemented types
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
     logEvent("ClassImplements");
   }
 
@@ -229,11 +231,19 @@
     logEvent("FactoryMethod");
   }
 
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {}
+  /// [beginToken] is the first token of the parameter, e.g. `int` in
+  /// `int a`, or `this` in `C(this.f)`.
+  void beginFormalParameter(Token beginToken, MemberKind kind,
+      Token covariantToken, Token varFinalOrConst) {}
 
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  /// [endToken] is the last token of the parameter, e.g. `1` in `{int a = 1}`.
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     logEvent("FormalParameter");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 3f2075a..40b3b4e 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -112,7 +112,7 @@
 /// Parse methods all have the prefix `parse`, generate events
 /// (by calling methods on [listener]), and return the next token to parse.
 /// Some exceptions to this last point are methods such as [parseFunctionBody]
-/// and [parseClassBody] which return the last token parsed
+/// and [parseClassOrMixinBody] which return the last token parsed
 /// rather than the next token to be parsed.
 /// Parse methods are generally named `parseGrammarProductionSuffix`.
 /// The suffix can be one of `opt`, or `star`.
@@ -383,18 +383,19 @@
         token = parseScript(token);
       } else {
         token = parseMetadataStar(token);
-        final String value = token.next.stringValue;
+        Token keyword = token.next;
+        final String value = keyword.stringValue;
         if (identical(value, 'import')) {
-          directiveState?.checkImport(this, token);
-          token = parseImport(token);
+          directiveState?.checkImport(this, keyword);
+          token = parseImport(keyword);
         } else if (identical(value, 'export')) {
-          directiveState?.checkExport(this, token);
-          token = parseExport(token);
+          directiveState?.checkExport(this, keyword);
+          token = parseExport(keyword);
         } else if (identical(value, 'library')) {
-          directiveState?.checkLibrary(this, token);
-          token = parseLibraryName(token);
+          directiveState?.checkLibrary(this, keyword);
+          token = parseLibraryName(keyword);
         } else if (identical(value, 'part')) {
-          token = parsePartOrPartOf(token, directiveState);
+          token = parsePartOrPartOf(keyword, directiveState);
         } else if (identical(value, ';')) {
           token = start;
         } else {
@@ -448,7 +449,7 @@
     token = parseMetadataStar(token);
     Token next = token.next;
     if (next.isTopLevelKeyword) {
-      return parseTopLevelKeywordDeclaration(token, null, directiveState);
+      return parseTopLevelKeywordDeclaration(token, next, directiveState);
     }
     Token start = token;
     // Skip modifiers to find a top level keyword or identifier
@@ -467,23 +468,7 @@
     }
     next = token.next;
     if (next.isTopLevelKeyword) {
-      Token beforeAbstractToken;
-      Token beforeModifier = start;
-      Token modifier = start.next;
-      while (modifier != next) {
-        if (optional('abstract', modifier) &&
-            optional('class', next) &&
-            beforeAbstractToken == null) {
-          beforeAbstractToken = beforeModifier;
-        } else {
-          // Recovery
-          reportTopLevelModifierError(modifier, next);
-        }
-        beforeModifier = modifier;
-        modifier = modifier.next;
-      }
-      return parseTopLevelKeywordDeclaration(
-          token, beforeAbstractToken, directiveState);
+      return parseTopLevelKeywordDeclaration(start, next, directiveState);
     } else if (next.isKeywordOrIdentifier) {
       // TODO(danrubel): improve parseTopLevelMember
       // so that we don't parse modifiers twice.
@@ -514,6 +499,33 @@
     return parseInvalidTopLevelDeclaration(token);
   }
 
+  /// Parse the modifiers before the `class` keyword.
+  /// Return the first `abstract` modifier or `null` if not found.
+  Token parseClassDeclarationModifiers(Token start, Token keyword) {
+    Token modifier = start.next;
+    while (modifier != keyword) {
+      if (optional('abstract', modifier)) {
+        parseTopLevelKeywordModifiers(modifier, keyword);
+        return modifier;
+      } else {
+        // Recovery
+        reportTopLevelModifierError(modifier, keyword);
+      }
+      modifier = modifier.next;
+    }
+    return null;
+  }
+
+  /// Report errors on any modifiers before the specified keyword.
+  void parseTopLevelKeywordModifiers(Token start, Token keyword) {
+    Token modifier = start.next;
+    while (modifier != keyword) {
+      // Recovery
+      reportTopLevelModifierError(modifier, keyword);
+      modifier = modifier.next;
+    }
+  }
+
   // Report an error for the given modifier preceding a top level keyword
   // such as `import` or `class`.
   void reportTopLevelModifierError(Token modifier, Token afterModifiers) {
@@ -537,50 +549,47 @@
   }
 
   /// Parse any top-level declaration that begins with a keyword.
+  /// [start] is the token before any modifiers preceding [keyword].
   Token parseTopLevelKeywordDeclaration(
-      Token token, Token beforeAbstractToken, DirectiveContext directiveState) {
-    Token previous = token;
-    token = token.next;
-    assert(token.isTopLevelKeyword);
-    final String value = token.stringValue;
+      Token start, Token keyword, DirectiveContext directiveState) {
+    assert(keyword.isTopLevelKeyword);
+    final String value = keyword.stringValue;
     if (identical(value, 'class')) {
       directiveState?.checkDeclaration();
-      return parseClassOrNamedMixinApplication(previous, beforeAbstractToken);
+      Token abstractToken = parseClassDeclarationModifiers(start, keyword);
+      return parseClassOrNamedMixinApplication(abstractToken, keyword);
     } else if (identical(value, 'enum')) {
       directiveState?.checkDeclaration();
-      return parseEnum(previous);
-    } else if (identical(value, 'typedef')) {
-      String nextValue = token.next.stringValue;
-      directiveState?.checkDeclaration();
-      if (identical('(', nextValue) ||
-          identical('<', nextValue) ||
-          identical('.', nextValue)) {
-        return parseTopLevelMemberImpl(previous);
-      } else {
-        return parseTypedef(previous);
-      }
+      parseTopLevelKeywordModifiers(start, keyword);
+      return parseEnum(keyword);
     } else {
       // The remaining top level keywords are built-in keywords
       // and can be used in a top level declaration
       // as an identifier such as "abstract<T>() => 0;"
       // or as a prefix such as "abstract.A b() => 0;".
-      String nextValue = token.next.stringValue;
+      String nextValue = keyword.next.stringValue;
       if (identical(nextValue, '(') ||
           identical(nextValue, '<') ||
           identical(nextValue, '.')) {
         directiveState?.checkDeclaration();
-        return parseTopLevelMemberImpl(previous);
-      } else if (identical(value, 'library')) {
-        directiveState?.checkLibrary(this, token);
-        return parseLibraryName(previous);
-      } else if (identical(value, 'import')) {
-        directiveState?.checkImport(this, token);
-        return parseImport(previous);
-      } else if (identical(value, 'export')) {
-        directiveState?.checkExport(this, token);
-        return parseExport(previous);
-      } else if (identical(value, 'part')) {
-        return parsePartOrPartOf(previous, directiveState);
+        return parseTopLevelMemberImpl(start);
+      } else {
+        parseTopLevelKeywordModifiers(start, keyword);
+        if (identical(value, 'typedef')) {
+          directiveState?.checkDeclaration();
+          return parseTypedef(keyword);
+        } else if (identical(value, 'library')) {
+          directiveState?.checkLibrary(this, keyword);
+          return parseLibraryName(keyword);
+        } else if (identical(value, 'import')) {
+          directiveState?.checkImport(this, keyword);
+          return parseImport(keyword);
+        } else if (identical(value, 'export')) {
+          directiveState?.checkExport(this, keyword);
+          return parseExport(keyword);
+        } else if (identical(value, 'part')) {
+          return parsePartOrPartOf(keyword, directiveState);
+        }
       }
     }
 
@@ -592,11 +601,10 @@
   ///   'library' qualified ';'
   /// ;
   /// ```
-  Token parseLibraryName(Token token) {
-    Token libraryKeyword = token.next;
+  Token parseLibraryName(Token libraryKeyword) {
     assert(optional('library', libraryKeyword));
     listener.beginLibraryName(libraryKeyword);
-    token = parseQualified(libraryKeyword, IdentifierContext.libraryName,
+    Token token = parseQualified(libraryKeyword, IdentifierContext.libraryName,
         IdentifierContext.libraryNameContinuation);
     token = ensureSemicolon(token);
     listener.endLibraryName(libraryKeyword, token);
@@ -631,11 +639,10 @@
   ///   'import' uri ('if' '(' test ')' uri)* importPrefix? combinator* ';'
   /// ;
   /// ```
-  Token parseImport(Token token) {
-    Token importKeyword = token.next;
+  Token parseImport(Token importKeyword) {
     assert(optional('import', importKeyword));
     listener.beginImport(importKeyword);
-    token = ensureLiteralString(importKeyword);
+    Token token = ensureLiteralString(importKeyword);
     Token uri = token;
     token = parseConditionalUriStar(token);
     token = parseImportPrefixOpt(token);
@@ -829,11 +836,10 @@
   ///   'export' uri conditional-uris* combinator* ';'
   /// ;
   /// ```
-  Token parseExport(Token token) {
-    Token exportKeyword = token.next;
+  Token parseExport(Token exportKeyword) {
     assert(optional('export', exportKeyword));
     listener.beginExport(exportKeyword);
-    token = ensureLiteralString(exportKeyword);
+    Token token = ensureLiteralString(exportKeyword);
     token = parseConditionalUriStar(token);
     token = parseCombinatorStar(token);
     token = ensureSemicolon(token);
@@ -927,15 +933,14 @@
     return token;
   }
 
-  Token parsePartOrPartOf(Token token, DirectiveContext directiveState) {
-    Token next = token.next;
-    assert(optional('part', next));
-    if (optional('of', next.next)) {
-      directiveState?.checkPartOf(this, next);
-      return parsePartOf(token);
+  Token parsePartOrPartOf(Token partKeyword, DirectiveContext directiveState) {
+    assert(optional('part', partKeyword));
+    if (optional('of', partKeyword.next)) {
+      directiveState?.checkPartOf(this, partKeyword);
+      return parsePartOf(partKeyword);
     } else {
-      directiveState?.checkPart(this, next);
-      return parsePart(token);
+      directiveState?.checkPart(this, partKeyword);
+      return parsePart(partKeyword);
     }
   }
 
@@ -944,11 +949,10 @@
   ///   'part' uri ';'
   /// ;
   /// ```
-  Token parsePart(Token token) {
-    Token partKeyword = token.next;
+  Token parsePart(Token partKeyword) {
     assert(optional('part', partKeyword));
     listener.beginPart(partKeyword);
-    token = ensureLiteralString(partKeyword);
+    Token token = ensureLiteralString(partKeyword);
     token = ensureSemicolon(token);
     listener.endPart(partKeyword, token);
     return token;
@@ -959,13 +963,13 @@
   ///   'part' 'of' (qualified | uri) ';'
   /// ;
   /// ```
-  Token parsePartOf(Token token) {
-    Token partKeyword = token.next;
+  Token parsePartOf(Token partKeyword) {
     Token ofKeyword = partKeyword.next;
     assert(optional('part', partKeyword));
     assert(optional('of', ofKeyword));
     listener.beginPartOf(partKeyword);
     bool hasName = ofKeyword.next.isIdentifier;
+    Token token;
     if (hasName) {
       token = parseQualified(ofKeyword, IdentifierContext.partName,
           IdentifierContext.partNameContinuation);
@@ -1053,12 +1057,11 @@
   ///   returnType? identifier
   /// ;
   /// ```
-  Token parseTypedef(Token token) {
-    Token typedefKeyword = token.next;
+  Token parseTypedef(Token typedefKeyword) {
     assert(optional('typedef', typedefKeyword));
     listener.beginFunctionTypeAlias(typedefKeyword);
     TypeInfo typeInfo = computeType(typedefKeyword, false);
-    token = typeInfo.skipType(typedefKeyword).next;
+    Token token = typeInfo.skipType(typedefKeyword).next;
     Token equals;
     TypeParamOrArgInfo typeParam = computeTypeParamOrArg(token, true);
     if (typeInfo == noType &&
@@ -1417,8 +1420,8 @@
     } else {
       listener.handleFormalParameterWithoutValue(next);
     }
-    listener.endFormalParameter(
-        thisKeyword, periodAfterThis, nameToken, parameterKind, memberKind);
+    listener.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
+        parameterKind, memberKind, token);
     return token;
   }
 
@@ -1575,11 +1578,11 @@
   ///   metadata 'enum' id '{' metadata id [',' metadata id]* [','] '}'
   /// ;
   /// ```
-  Token parseEnum(Token token) {
-    Token enumKeyword = token.next;
+  Token parseEnum(Token enumKeyword) {
     assert(optional('enum', enumKeyword));
     listener.beginEnum(enumKeyword);
-    token = ensureIdentifier(enumKeyword, IdentifierContext.enumDeclaration);
+    Token token =
+        ensureIdentifier(enumKeyword, IdentifierContext.enumDeclaration);
     Token leftBrace = token.next;
     int count = 0;
     if (optional('{', leftBrace)) {
@@ -1635,16 +1638,13 @@
   }
 
   Token parseClassOrNamedMixinApplication(
-      Token token, Token beforeAbstractToken) {
-    token = token.next;
-    listener.beginClassOrNamedMixinApplication(token);
-    Token abstractToken = beforeAbstractToken?.next;
-    Token begin = abstractToken ?? token;
-    Token classKeyword = token;
-    assert(optional('class', token));
-    Token name =
-        ensureIdentifier(token, IdentifierContext.classOrNamedMixinDeclaration);
-    token = computeTypeParamOrArg(name, true).parseVariables(name, this);
+      Token abstractToken, Token classKeyword) {
+    assert(optional('class', classKeyword));
+    Token begin = abstractToken ?? classKeyword;
+    listener.beginClassOrNamedMixinApplication(begin);
+    Token name = ensureIdentifier(
+        classKeyword, IdentifierContext.classOrMixinDeclaration);
+    Token token = computeTypeParamOrArg(name, true).parseVariables(name, this);
     if (optional('=', token.next)) {
       listener.beginNamedMixinApplication(begin, abstractToken, name);
       return parseNamedMixinApplication(token, begin, classKeyword);
@@ -1688,16 +1688,16 @@
     if (!optional('{', token.next)) {
       // Recovery
       token = parseClassHeaderRecovery(start, begin, classKeyword);
-      ensureBlock(token, fasta.templateExpectedClassBody);
+      ensureBlock(token, fasta.templateExpectedClassOrMixinBody);
     }
-    token = parseClassBody(token);
+    token = parseClassOrMixinBody(token);
     listener.endClassDeclaration(begin, token);
     return token;
   }
 
   Token parseClassHeaderOpt(Token token, Token begin, Token classKeyword) {
     token = parseClassExtendsOpt(token);
-    token = parseClassImplementsOpt(token);
+    token = parseClassOrMixinImplementsOpt(token);
     Token nativeToken;
     if (optional('native', token.next)) {
       nativeToken = token.next;
@@ -1783,7 +1783,7 @@
         }
       }
 
-      token = parseClassImplementsOpt(token);
+      token = parseClassOrMixinImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -1830,7 +1830,7 @@
   ///   'implements' typeName (',' typeName)*
   /// ;
   /// ```
-  Token parseClassImplementsOpt(Token token) {
+  Token parseClassOrMixinImplementsOpt(Token token) {
     Token implementsKeyword;
     int interfacesCount = 0;
     if (optional('implements', token.next)) {
@@ -1841,7 +1841,7 @@
         ++interfacesCount;
       } while (optional(',', token.next));
     }
-    listener.handleClassImplements(implementsKeyword, interfacesCount);
+    listener.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
     return token;
   }
 
@@ -2515,9 +2515,9 @@
     return token;
   }
 
-  Token skipClassBody(Token token) {
+  Token skipClassOrMixinBody(Token token) {
     // The scanner ensures that `{` always has a closing `}`.
-    return ensureBlock(token, fasta.templateExpectedClassBody);
+    return ensureBlock(token, fasta.templateExpectedClassOrMixinBody);
   }
 
   /// ```
@@ -2525,18 +2525,18 @@
   ///   '{' classMember* '}'
   /// ;
   /// ```
-  Token parseClassBody(Token token) {
+  Token parseClassOrMixinBody(Token token) {
     Token begin = token = token.next;
     assert(optional('{', token));
-    listener.beginClassBody(token);
+    listener.beginClassOrMixinBody(token);
     int count = 0;
     while (notEofOrValue('}', token.next)) {
-      token = parseClassMemberImpl(token);
+      token = parseClassOrMixinMemberImpl(token);
       ++count;
     }
     token = token.next;
     assert(optional('}', token));
-    listener.endClassBody(count, begin, token);
+    listener.endClassOrMixinBody(count, begin, token);
     return token;
   }
 
@@ -2545,14 +2545,14 @@
       token.lexeme == 'unary' &&
       optional('-', token.next);
 
-  /// Parse a class member.
+  /// Parse a class or mixin member.
   ///
   /// This method is only invoked from outside the parser. As a result, this
   /// method takes the next token to be consumed rather than the last consumed
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
-  Token parseClassMember(Token token) {
-    return parseClassMemberImpl(syntheticPreviousToken(token)).next;
+  Token parseClassOrMixinMember(Token token) {
+    return parseClassOrMixinMemberImpl(syntheticPreviousToken(token)).next;
   }
 
   /// ```
@@ -2561,8 +2561,13 @@
   ///   constructorDeclaration |
   ///   methodDeclaration
   /// ;
+  ///
+  /// mixinMember:
+  ///   fieldDeclaration |
+  ///   methodDeclaration
+  /// ;
   /// ```
-  Token parseClassMemberImpl(Token token) {
+  Token parseClassOrMixinMemberImpl(Token token) {
     Token beforeStart = token = parseMetadataStar(token);
 
     Token covariantToken;
diff --git a/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart b/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
index 05159cd..9ffcb3e 100644
--- a/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
+++ b/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
@@ -30,9 +30,10 @@
   }
 
   @override
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassImplements(implementsKeyword, interfacesCount);
+    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
index 98dc6fb..cf47b09 100644
--- a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
@@ -15,5 +15,5 @@
 class TopLevelParser extends ClassMemberParser {
   TopLevelParser(Listener listener) : super(listener);
 
-  Token parseClassBody(Token token) => skipClassBody(token);
+  Token parseClassOrMixinBody(Token token) => skipClassOrMixinBody(token);
 }
diff --git a/pkg/front_end/lib/src/fasta/rewrite_severity.dart b/pkg/front_end/lib/src/fasta/rewrite_severity.dart
index 3961294..6fc8581 100644
--- a/pkg/front_end/lib/src/fasta/rewrite_severity.dart
+++ b/pkg/front_end/lib/src/fasta/rewrite_severity.dart
@@ -8,7 +8,24 @@
 
 Severity rewriteSeverity(
     Severity severity, msg.Code<Object> code, Uri fileUri) {
-  if (severity != Severity.ignored) return severity;
+  if (severity != Severity.ignored) {
+    if (code == msg.codeFinalFieldNotInitialized) {
+      // TODO(johnniwinther): Use external getters instead of final fields.
+      // See https://github.com/dart-lang/sdk/issues/33762
+      for (String path in [
+        "/pkg/dev_compiler/tool/input_sdk/private/js_string.dart",
+        "/sdk/lib/html/dart2js/html_dart2js.dart",
+        "/sdk/lib/svg/dart2js/svg_dart2js.dart",
+        "/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart"
+      ]) {
+        if (fileUri.path.endsWith(path)) {
+          return Severity.ignored;
+        }
+      }
+    }
+    return severity;
+  }
+
   String path = fileUri.path;
   String fastaPath = "/pkg/front_end/lib/src/fasta/";
   int index = path.indexOf(fastaPath);
@@ -33,7 +50,6 @@
       case "kernel/expression_generator.dart":
       case "kernel/kernel_expression_generator.dart":
       case "kernel/kernel_expression_generator_impl.dart":
-      case "kernel/kernel_procedure_builder.dart":
       case "kernel/kernel_type_variable_builder.dart":
       case "source/diet_listener.dart":
       case "source/source_library_builder.dart":
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 54ac074..fcab286 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -653,7 +653,7 @@
   }
 
   @override
-  void beginClassBody(Token token) {
+  void beginClassOrMixinBody(Token token) {
     debugEvent("beginClassBody");
     String name = pop();
     Token metadata = pop();
@@ -668,8 +668,8 @@
   }
 
   @override
-  void endClassBody(int memberCount, Token beginToken, Token endToken) {
-    debugEvent("ClassBody");
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    debugEvent("ClassOrMixinBody");
     currentClass = null;
     memberScope = library.scope;
   }
@@ -785,7 +785,7 @@
     if (isTopLevel) {
       token = parser.parseTopLevelMember(metadata ?? token);
     } else {
-      token = parser.parseClassMember(metadata ?? token).next;
+      token = parser.parseClassOrMixinMember(metadata ?? token).next;
     }
     listenerFinishFields(listener, startToken, metadata, isTopLevel);
     listener.checkEmpty(token.charOffset);
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index cca9dae..d487929 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -442,7 +442,8 @@
   }
 
   @override
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
     debugEvent("handleClassImplements");
     push(popList(
             interfacesCount,
@@ -752,6 +753,11 @@
       }
       final int startCharOffset =
           metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+
+      int codeStartOffset =
+          _chooseCodeStartOffset(docComment, metadataToken, beginToken);
+      int codeEndOffset = endToken.end;
+
       library.addConstructor(
           docComment?.text,
           metadata,
@@ -765,6 +771,8 @@
           charOffset,
           formalsOffset,
           endToken.charOffset,
+          codeStartOffset,
+          codeEndOffset,
           nativeMethodName);
     } else {
       if (isConst) {
@@ -886,24 +894,36 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
+  void beginFormalParameter(Token beginToken, MemberKind kind,
+      Token covariantToken, Token varFinalOrConst) {
+    push(beginToken);
     push((covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     debugEvent("FormalParameter");
     int charOffset = pop();
     String name = pop();
     TypeBuilder type = pop();
     int modifiers = pop();
+    Token beginToken = pop();
     List<MetadataBuilder> metadata = pop();
-    pop(); // metadataToken
-    push(library.addFormalParameter(
-        metadata, modifiers, type, name, thisKeyword != null, charOffset));
+    Token metadataToken = pop();
+
+    int codeStartOffset =
+        _chooseCodeStartOffset(null, metadataToken, beginToken);
+    int codeEndOffset = endToken.end;
+
+    push(library.addFormalParameter(metadata, modifiers, type, name,
+        thisKeyword != null, charOffset, codeStartOffset, codeEndOffset));
   }
 
   @override
@@ -1142,7 +1162,10 @@
     List<MetadataBuilder> metadata = pop();
     Token metadataToken = pop();
     var docComment = documentationComment(beginToken, metadataToken);
-    library.addFields(docComment?.text, metadata, modifiers, type, fieldsInfo);
+    int firstFieldCodeStartOffset =
+        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
+    library.addFields(docComment?.text, metadata, modifiers, type, fieldsInfo,
+        firstFieldCodeStartOffset);
     checkEmpty(beginToken.charOffset);
   }
 
@@ -1159,7 +1182,10 @@
     List<MetadataBuilder> metadata = pop();
     Token metadataToken = pop();
     var docComment = documentationComment(beginToken, metadataToken);
-    library.addFields(docComment?.text, metadata, modifiers, type, fieldsInfo);
+    int firstFieldCodeStartOffset =
+        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
+    library.addFields(docComment?.text, metadata, modifiers, type, fieldsInfo,
+        firstFieldCodeStartOffset);
   }
 
   @override
@@ -1258,6 +1284,11 @@
     List<MetadataBuilder> metadata = pop();
     Token metadataToken = pop();
     var docComment = documentationComment(beginToken, metadataToken);
+
+    int codeStartOffset =
+        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
+    int codeEndOffset = endToken.end;
+
     library.addFactoryMethod(
         docComment?.text,
         metadata,
@@ -1269,6 +1300,8 @@
         charOffset,
         formalsOffset,
         endToken.charOffset,
+        codeStartOffset,
+        codeEndOffset,
         nativeMethodName);
     nativeMethodName = null;
     inConstructor = false;
@@ -1338,8 +1371,8 @@
   }
 
   @override
-  void endClassBody(int memberCount, Token beginToken, Token endToken) {
-    debugEvent("ClassBody");
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    debugEvent("ClassOrMixinBody");
   }
 
   @override
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 2376e21..e6a127e 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
@@ -367,23 +367,47 @@
       T type,
       String name,
       int charOffset,
+      int codeStartOffset,
+      int codeEndOffset,
       Token initializerTokenForInference,
       bool hasInitializer);
 
-  void addFields(String documentationComment, List<MetadataBuilder> metadata,
-      int modifiers, T type, List<Object> fieldsInfo) {
+  void addFields(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      T type,
+      List<Object> fieldsInfo,
+      int firstFieldCodeStartOffset) {
     for (int i = 0; i < fieldsInfo.length; i += 4) {
       String name = fieldsInfo[i];
       int charOffset = fieldsInfo[i + 1];
       bool hasInitializer = fieldsInfo[i + 2] != null;
       Token initializerTokenForInference =
           type == null ? fieldsInfo[i + 2] : null;
+      Token beforeLast = fieldsInfo[i + 3];
       if (initializerTokenForInference != null) {
-        Token beforeLast = fieldsInfo[i + 3];
         beforeLast.setNext(new Token.eof(beforeLast.next.offset));
       }
-      addField(documentationComment, metadata, modifiers, type, name,
-          charOffset, initializerTokenForInference, hasInitializer);
+
+      int codeEndOffset;
+      if (beforeLast != null) {
+        codeEndOffset = beforeLast.next.offset;
+      } else {
+        codeEndOffset = charOffset + name.length;
+      }
+
+      addField(
+          documentationComment,
+          metadata,
+          modifiers,
+          type,
+          name,
+          charOffset,
+          i == 0 ? firstFieldCodeStartOffset : charOffset,
+          codeEndOffset,
+          initializerTokenForInference,
+          hasInitializer);
     }
   }
 
@@ -400,6 +424,8 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
+      int codeStartOffset,
+      int codeEndOffset,
       String nativeMethodName);
 
   void addProcedure(
@@ -453,10 +479,19 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
+      int codeStartOffset,
+      int codeEndOffset,
       String nativeMethodName);
 
-  FormalParameterBuilder addFormalParameter(List<MetadataBuilder> metadata,
-      int modifiers, T type, String name, bool hasThis, int charOffset);
+  FormalParameterBuilder addFormalParameter(
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      T type,
+      String name,
+      bool hasThis,
+      int charOffset,
+      int codeStartOffset,
+      int codeEndOffset);
 
   TypeVariableBuilder addTypeVariable(String name, T bound, int charOffset);
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 4e6ed0c..638cd4d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -645,19 +645,6 @@
     return new Component()..libraries.addAll(libraries);
   }
 
-  List<Class> computeListOfLoaderClasses() {
-    List<Class> result = <Class>[];
-    builders.forEach((Uri uri, LibraryBuilder libraryBuilder) {
-      if (!libraryBuilder.isPart &&
-          !libraryBuilder.isPatch &&
-          (libraryBuilder.loader == this)) {
-        Library library = libraryBuilder.target;
-        result.addAll(library.classes);
-      }
-    });
-    return result;
-  }
-
   void computeHierarchy() {
     List<List> ambiguousTypesRecords = [];
     HandleAmbiguousSupertypes onAmbiguousSupertypes =
@@ -674,8 +661,9 @@
               : new LegacyModeMixinInferrer());
     } else {
       hierarchy.onAmbiguousSupertypes = onAmbiguousSupertypes;
-      hierarchy.applyTreeChanges(const [], computeListOfLoaderClasses(),
-          reissueAmbiguousSupertypesFor: computeFullComponent());
+      Component component = computeFullComponent();
+      hierarchy.applyTreeChanges(const [], component.libraries,
+          reissueAmbiguousSupertypesFor: component);
     }
     for (List record in ambiguousTypesRecords) {
       handleAmbiguousSupertypes(record[0], record[1], record[2]);
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index a6d853c..154b20a 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -205,7 +205,8 @@
   }
 
   @override
-  void handleClassImplements(Token implementsKeyword, int interfacesCount) {
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
     debugEvent("ClassImplements");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index 6e32a4b..3bd22e4 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -759,6 +759,7 @@
   void variableAssign(
       ExpressionJudgment judgment,
       Location location,
+      bool isSyntheticLhs,
       DartType writeContext,
       covariant Object writeVariableBinder,
       Reference combiner,
@@ -1183,6 +1184,7 @@
   void variableAssign(
       ExpressionJudgment judgment,
       location,
+      bool isSyntheticLhs,
       DartType writeContext,
       covariant void writeVariableBinder,
       combiner,
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 ec7b19c..c53cd10 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
@@ -1430,6 +1430,7 @@
               : arguments.named[i - numPositionalArgs].value;
           ensureAssignable(
               expectedType, actualType, expression, expression.fileOffset,
+              isVoidAllowed: expectedType is VoidType,
               template: templateArgumentTypeNotAssignable);
         }
       }
diff --git a/pkg/front_end/lib/src/incremental/kernel_driver.dart b/pkg/front_end/lib/src/incremental/kernel_driver.dart
index 3de52a2..c23eb4e 100644
--- a/pkg/front_end/lib/src/incremental/kernel_driver.dart
+++ b/pkg/front_end/lib/src/incremental/kernel_driver.dart
@@ -418,7 +418,8 @@
         List<int> bytes = _byteStore.get(kernelKey);
         if (bytes != null) {
           return _logger.runAsync('Read serialized libraries', () async {
-            var component = new Component(nameRoot: nameRoot);
+            var component = _options.target
+                .configureComponent(new Component(nameRoot: nameRoot));
             _readComponent(component, bytes);
             await appendNewDillLibraries(component);
 
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index ac71bab..2b6a9a5 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -49,7 +49,6 @@
 ConflictsWithTypeVariable/example: Fail
 ConstAfterFactory/script1: Fail
 ConstAndCovariant/script2: Fail
-ConstAndFinal/script1: Fail
 ConstAndVar/script1: Fail
 ConstConstructorInSubclassOfMixinApplication/example: Fail
 ConstConstructorNonFinalField/example: Fail
@@ -123,8 +122,8 @@
 ExpectedBlockToSkip/script: Fail
 ExpectedButGot/script1: Fail
 ExpectedButGot/script2: Fail
-ExpectedClassBody/example: Fail
 ExpectedClassMember/example: Fail
+ExpectedClassOrMixinBody/example: Fail
 ExpectedDeclaration/example: Fail
 ExpectedFunctionBody/example: Fail
 ExpectedNamedArgument/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 29f8aa0..e240cc0 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -310,12 +310,12 @@
   dart2jsCode: "GENERIC"
   script: "class A implements B implements C, D {}"
 
-ExpectedClassBody:
-  template: "Expected a class body, but got '#lexeme'."
+ExpectedClassOrMixinBody:
+  template: "Expected a class or mixin body, but got '#lexeme'."
   analyzerCode: MISSING_CLASS_BODY
   dart2jsCode: "*fatal*"
 
-ExpectedClassBodyToSkip: ExpectedClassBody
+ExpectedClassBodyToSkip: ExpectedClassOrMixinBody
 
 ExpectedDeclaration:
   template: "Expected a declaration, but got '#lexeme'."
@@ -481,8 +481,8 @@
   analyzerCode: CONST_AND_FINAL
   dart2jsCode: EXTRANEOUS_MODIFIER
   script:
-    - "class C { const final int x; }"
-    - "class C { final const int x; }"
+    - "class C { const final int x = 5; }"
+    - "class C { final const int x = 5; }"
 
 ConstAndVar:
   template: "Members can't be declared to be both 'const' and 'var'."
@@ -572,7 +572,7 @@
   script:
     - "class C { const const m; }"
     - "class C { external external f(); }"
-    - "class C { final final m; }"
+    - "class C { final final m = 5; }"
     - "class C { static static var m; }"
     - "class C { var var m; }"
 
@@ -640,6 +640,34 @@
   analyzerCode: INITIALIZER_OUTSIDE_CONSTRUCTOR
   dart2jsCode: "*fatal*"
 
+MoreThanOneSuperOrThisInitializer:
+  template: "Can't have more than one 'super' or 'this' initializer."
+  severity: ERROR
+  analyzerCode: SUPER_IN_REDIRECTING_CONSTRUCTOR
+  dart2jsCode: "*fatal*"
+  script:
+    - "class C { C.bad() : super(), super(); }"
+    - "class C { C(); C.bad() : super(), this(); }"
+    - "class C { C(); C.bad() : this(), super(); }"
+    - "class C { C(); C.bad() : this(), this(); }"
+
+ThisInitializerNotAlone:
+  template: "Can't have other initializers together with 'this'."
+  severity: ERROR
+  analyzerCode: FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
+  dart2jsCode: "*fatal*"
+  script:
+    - "class C { int x; C(); C.bad() : x = 5, this(); }"
+    - "class C { int x; C(); C.bad() : this(), x = 5; }"
+
+SuperInitializerNotLast:
+  template: "Can't have initializers after 'super'."
+  severity: ERROR
+  analyzerCode: INVALID_SUPER_INVOCATION
+  dart2jsCode: "*fatal*"
+  script:
+    - "class C { int x; C.bad() : super(), x = 5; }"
+
 ConstConstructorWithNonConstSuper:
   template: "Constant constructor can't call non-constant super constructors."
   analyzerCode: CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
@@ -684,8 +712,8 @@
   analyzerCode: FINAL_AND_COVARIANT
   dart2jsCode: "*ignored*"
   script:
-    - "class C { covariant final f; }"
-    - "class C { final covariant f; }"
+    - "class C { covariant final f = 5; }"
+    - "class C { final covariant f = 5; }"
 
 FinalAndVar:
   template: "Members can't be declared to be both 'final' and 'var'."
@@ -693,8 +721,8 @@
   analyzerCode: FINAL_AND_VAR
   dart2jsCode: EXTRANEOUS_MODIFIER
   script:
-    - "class C { final var x; }"
-    - "class C { var final x; }"
+    - "class C { final var x = 5; }"
+    - "class C { var final x = 5; }"
 
 StaticAfterConst:
   template: "The modifier 'static' should be before the modifier 'const'."
@@ -710,7 +738,7 @@
   analyzerCode: STATIC_AFTER_FINAL
   dart2jsCode: EXTRANEOUS_MODIFIER
   script:
-    - "class C { final static int f; }"
+    - "class C { final static int f = 5; }"
 
 StaticAfterVar:
   template: "The modifier 'static' should be before the modifier 'var'."
@@ -840,6 +868,30 @@
   analyzerCode: INVALID_INITIALIZER
   dart2jsCode: "*fatal*"
 
+FinalFieldNotInitialized:
+  template: "Final field '#name' is not initialized."
+  tip: "Try to initialize the field in the declaration or in every constructor."
+  severity: ERROR
+  analyzerCode: FINAL_NOT_INITIALIZED
+  dart2jsCode: "*fatal*"
+  script: >
+    class C {
+      final int x;
+    }
+
+FinalFieldNotInitializedByConstructor:
+  template: "Final field '#name' is not initialized by this constructor."
+  tip: "Try to initialize the field using an initializing formal or a field initializer."
+  severity: ERROR
+  analyzerCode: FINAL_NOT_INITIALIZED_CONSTRUCTOR_1
+  dart2jsCode: "*fatal*"
+  script: >
+    class C {
+      final int x;
+      C(this.x) {}
+      C.missing() {}
+    }
+
 MissingExponent:
   template: "Numbers in exponential notation should always contain an exponent (an integer number with an optional sign)."
   tip: "Make sure there is an exponent, and remove any whitespace before it."
@@ -1447,6 +1499,9 @@
       --dump-ir
         Print compiled libraries in Kernel source notation.
 
+      --bytecode
+        Generate bytecode. Supported only for SDK platform compilation.
+
       --exclude-source
         Do not include source code in the dill file.
 
@@ -2848,7 +2903,7 @@
   statement: |
     {
       void x;
-      var y = x;
+      int y = x;
     }
 
 ReturnFromVoidFunction:
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index ea5dfdc..73e592c 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -580,7 +580,7 @@
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
       'endFormalParameter null null ) FormalParameterKind.mandatory '
-          'MemberKind.GeneralizedFunctionType',
+          'MemberKind.GeneralizedFunctionType int',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function',
     ]);
@@ -606,7 +606,7 @@
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
       'endFormalParameter null null ) FormalParameterKind.mandatory'
-          ' MemberKind.GeneralizedFunctionType',
+          ' MemberKind.GeneralizedFunctionType int',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function',
     ]);
@@ -912,7 +912,7 @@
           'handleIdentifier x formalParameterDeclaration',
           'handleFormalParameterWithoutValue )',
           'endFormalParameter null null x FormalParameterKind.mandatory '
-              'MemberKind.GeneralizedFunctionType',
+              'MemberKind.GeneralizedFunctionType x',
           'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
           'endFunctionType Function',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
@@ -925,7 +925,7 @@
           'handleIdentifier x formalParameterDeclaration',
           'handleFormalParameterWithoutValue )',
           'endFormalParameter null null x FormalParameterKind.mandatory '
-              'MemberKind.GeneralizedFunctionType',
+              'MemberKind.GeneralizedFunctionType x',
           'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
           'endFunctionType Function',
         ]);
@@ -1654,7 +1654,7 @@
       'handleType T',
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
-      'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType',
+      'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType T',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function',
       'endTypeVariable > 0 extends',
@@ -1907,9 +1907,9 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
-    calls.add('beginFormalParameter $token $kind');
+  void beginFormalParameter(Token beginToken, MemberKind kind,
+      Token covariantToken, Token varFinalOrConst) {
+    calls.add('beginFormalParameter $beginToken $kind');
   }
 
   @override
@@ -1967,10 +1967,15 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      FormalParameterKind kind,
+      MemberKind memberKind,
+      Token endToken) {
     calls.add('endFormalParameter $thisKeyword $periodAfterThis '
-        '$nameToken $kind $memberKind');
+        '$nameToken $kind $memberKind $endToken');
   }
 
   @override
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index b23f998..26527d4 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -342,20 +342,14 @@
 
   String get name => "vm";
 
-  void performModularTransformationsOnLibraries(
+  @override
+  void performModularTransformationsOnLibraries(Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
       {void logger(String msg)}) {
     if (enabled) {
       super.performModularTransformationsOnLibraries(
-          coreTypes, hierarchy, libraries,
+          component, coreTypes, hierarchy, libraries,
           logger: logger);
     }
   }
-
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
-      {void logger(String msg)}) {
-    if (enabled) {
-      super.performGlobalTransformations(coreTypes, component, logger: logger);
-    }
-  }
 }
diff --git a/pkg/front_end/testcases/expression/main.dart b/pkg/front_end/testcases/expression/main.dart
index d946d39..66153cb 100644
--- a/pkg/front_end/testcases/expression/main.dart
+++ b/pkg/front_end/testcases/expression/main.dart
@@ -21,7 +21,7 @@
 
 class B {
   int x;
-  final int y;
+  final int y = 7;
   String get z {
     return "";
   }
diff --git a/pkg/front_end/testcases/incremental_bulk_compiler_full.status b/pkg/front_end/testcases/incremental_bulk_compiler_full.status
index 4240855..d5e7324 100644
--- a/pkg/front_end/testcases/incremental_bulk_compiler_full.status
+++ b/pkg/front_end/testcases/incremental_bulk_compiler_full.status
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE.md file.
 language_2/deferred_super_dependency_test: Crash # missing "#errors"
 language_2/missing_part_of_tag_test: Crash # missing empty library that shouldn't have been there in the first place
+language_2/part_of_multiple_libs_test: Crash # missing "#errors"
 language_2/regress_27957_test: Crash # isSynthetic becomes false on C1 SuperInitializer.
 language_2/script1_negative_test: Crash # missing "#errors", missing empty library that shouldn't have been there in the first place
 language_2/script2_negative_test: Crash # missing "#errors", missing empty library that shouldn't have been there in the first place
-
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml
new file mode 100644
index 0000000..e45af03
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml
@@ -0,0 +1,56 @@
+# 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.
+
+# Compile an application with a class in a file, then initializing from that
+# dill, compile a version that doesn't use the file, finally update it so it
+# does use the file (and Class). If the initially unused file is reused it
+# should not cause any problems at any point, including being handled properly
+# by the class hierarchy.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import "foo.dart";
+        main() {
+          Foo foo = new Foo();
+          foo.foo();
+        }
+      foo.dart: |
+        class Foo {
+          foo() {
+            print("Foo!");
+          }
+        }
+    expectedLibraryCount: 2
+  - entry: main.dart
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("hello from main");
+        }
+      foo.dart: |
+        class Foo {
+          foo() {
+            print("Foo!");
+          }
+        }
+    expectedLibraryCount: 1
+    expectInitializeFromDill: true
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import "foo.dart";
+        main() {
+          Foo foo = new Foo();
+          foo.foo();
+        }
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml
new file mode 100644
index 0000000..b6954ee
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml
@@ -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.md file.
+
+# Compile an application with a package, then initializing from that dill,
+# compile a version that doesn't use the package, finally update it so it does
+# use the package (and use the class in the package as a type).
+# If the initially unused package is reused it should not cause
+# any problems at any point, including being handled properly by the class
+# hierarchy.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import "package:mypackage/foo.dart";
+        main() {
+          Foo foo = new Foo();
+          foo.foo();
+        }
+      mypackage/foo.dart: |
+        class Foo {
+          foo() {
+            print("Foo!");
+          }
+        }
+      .packages: mypackage:${outDirUri}mypackage
+    expectedLibraryCount: 2
+  - entry: main.dart
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("hello from main");
+        }
+      mypackage/foo.dart: |
+        class Foo {
+          foo() {
+            print("Foo!");
+          }
+        }
+      .packages: mypackage:${outDirUri}mypackage
+    expectedLibraryCount: 1
+    expectInitializeFromDill: true
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import "package:mypackage/foo.dart";
+        main() {
+          Foo foo = new Foo();
+          foo.foo();
+        }
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.expect b/pkg/front_end/testcases/rasta/super.dart.direct.expect
index 9837936..6f3fd55 100644
--- a/pkg/front_end/testcases/rasta/super.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.direct.expect
@@ -9,6 +9,16 @@
 // Try removing '+'.
 //     use(+super);
 //         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
 
 library;
 import self as self;
@@ -63,14 +73,14 @@
     self::use(super.{self::A::~}());
     super.{self::A::unary-}();
     self::use(super.{self::A::unary-}());
-    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+    this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
     +super;
-     ^^^^^";
-    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+     ^^^^^");
+    self::use(this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
     use(+super);
-         ^^^^^");
+         ^^^^^"));
     super.{self::A::==}(87);
     self::use(super.{self::A::==}(87));
     !super.{self::A::==}(87);
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
new file mode 100644
index 0000000..6f3fd55
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
@@ -0,0 +1,290 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  field dynamic b = null;
+  field dynamic c = null;
+  field dynamic d = null;
+  final field dynamic f = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get e() → dynamic
+    return null;
+  set g(dynamic _) → dynamic {}
+  get h() → dynamic
+    return null;
+  set h(dynamic _) → dynamic {}
+  get i() → dynamic
+    return null;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic a, dynamic b) → dynamic {}
+  operator ~() → dynamic
+    return 117;
+  operator unary-() → dynamic
+    return 117;
+  operator ==(dynamic other) → dynamic
+    return true;
+  method m() → void {}
+  method n() → void {}
+  set n(dynamic _) → dynamic {}
+}
+class B extends self::A {
+  final field dynamic d = null;
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+  get b() → dynamic
+    return null;
+  set c(dynamic x) → dynamic {}
+  set i(dynamic x) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  method test() → dynamic {
+    super.{self::A::~}();
+    self::use(super.{self::A::~}());
+    super.{self::A::unary-}();
+    self::use(super.{self::A::unary-}());
+    this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    +super;
+     ^^^^^");
+    self::use(this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+    super.{self::A::==}(87);
+    self::use(super.{self::A::==}(87));
+    !super.{self::A::==}(87);
+    self::use(!super.{self::A::==}(87));
+    super.{self::A::a};
+    self::use(super.{self::A::a});
+    super.{self::B::b};
+    self::use(super.{self::B::b});
+    super.{self::A::c};
+    self::use(super.{self::A::c});
+    super.{self::B::d};
+    self::use(super.{self::B::d});
+    super.{self::A::e};
+    self::use(super.{self::A::e});
+    super.{self::A::f};
+    self::use(super.{self::A::f});
+    super.g;
+    self::use(super.g);
+    super.{self::A::h};
+    self::use(super.{self::A::h});
+    super.{self::A::i};
+    self::use(super.{self::A::i});
+    super.{self::A::[]}(87);
+    self::use(super.{self::A::[]}(87));
+    super.{self::A::m};
+    self::use(super.{self::A::m});
+    super.{self::A::n};
+    self::use(super.{self::A::n});
+    super.{self::A::a} = super.{self::A::a}.+(1);
+    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
+    super.{self::A::b} = super.{self::B::b}.+(1);
+    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
+    super.{self::B::c} = super.{self::A::c}.+(1);
+    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
+    super.{self::A::d} = super.{self::B::d}.+(1);
+    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
+    super.e = super.{self::A::e}.+(1);
+    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
+    super.f = super.{self::A::f}.+(1);
+    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
+    super.{self::A::g} = super.g.+(1);
+    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
+    super.{self::A::h} = super.{self::A::h}.+(1);
+    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
+    super.{self::B::i} = super.{self::A::i}.+(1);
+    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
+    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
+    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
+    super.m = super.{self::A::m}.+(1);
+    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
+    super.{self::A::n} = super.{self::A::n}.+(1);
+    self::use(let final dynamic #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = #t25.+(1) in #t25);
+    super.{self::A::a} = super.{self::A::a}.+(1);
+    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
+    super.{self::A::b} = super.{self::B::b}.+(1);
+    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
+    super.{self::B::c} = super.{self::A::c}.+(1);
+    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
+    super.{self::A::d} = super.{self::B::d}.+(1);
+    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
+    super.e = super.{self::A::e}.+(1);
+    self::use(super.e = super.{self::A::e}.+(1));
+    super.f = super.{self::A::f}.+(1);
+    self::use(super.f = super.{self::A::f}.+(1));
+    super.{self::A::g} = super.g.+(1);
+    self::use(super.{self::A::g} = super.g.+(1));
+    super.{self::A::h} = super.{self::A::h}.+(1);
+    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
+    super.{self::B::i} = super.{self::A::i}.+(1);
+    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
+    let final dynamic #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final dynamic #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
+    self::use(let final dynamic #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final dynamic #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
+    super.m = super.{self::A::m}.+(1);
+    self::use(super.m = super.{self::A::m}.+(1));
+    super.{self::A::n} = super.{self::A::n}.+(1);
+    self::use(super.{self::A::n} = super.{self::A::n}.+(1));
+    super.{self::A::a}.call();
+    self::use(super.{self::A::a}.call());
+    super.{self::B::b}.call();
+    self::use(super.{self::B::b}.call());
+    super.{self::A::c}.call();
+    self::use(super.{self::A::c}.call());
+    super.{self::B::d}.call();
+    self::use(super.{self::B::d}.call());
+    super.{self::A::e}.call();
+    self::use(super.{self::A::e}.call());
+    super.{self::A::f}.call();
+    self::use(super.{self::A::f}.call());
+    super.g();
+    self::use(super.g());
+    super.{self::A::h}.call();
+    self::use(super.{self::A::h}.call());
+    super.{self::A::i}.call();
+    self::use(super.{self::A::i}.call());
+    super.{self::A::[]}(87).call();
+    self::use(super.{self::A::[]}(87).call());
+    super.{self::A::m}();
+    self::use(super.{self::A::m}());
+    super.{self::A::m}(87);
+    self::use(super.{self::A::m}(87));
+    super.{self::A::n}(87);
+    self::use(super.{self::A::n}(87));
+    super.{self::A::a} = 42;
+    self::use(super.{self::A::a} = 42);
+    super.{self::A::b} = 42;
+    self::use(super.{self::A::b} = 42);
+    super.{self::B::c} = 42;
+    self::use(super.{self::B::c} = 42);
+    super.{self::A::d} = 42;
+    self::use(super.{self::A::d} = 42);
+    super.e = 42;
+    self::use(super.e = 42);
+    super.f = 42;
+    self::use(super.f = 42);
+    super.{self::A::g} = 42;
+    self::use(super.{self::A::g} = 42);
+    super.{self::A::h} = 42;
+    self::use(super.{self::A::h} = 42);
+    super.{self::B::i} = 42;
+    self::use(super.{self::B::i} = 42);
+    super.{self::A::[]=}(87, 42);
+    self::use(let final dynamic #t33 = 87 in let final dynamic #t34 = 42 in let final dynamic #t35 = super.{self::A::[]=}(#t33, #t34) in #t34);
+    super.m = 42;
+    self::use(super.m = 42);
+    super.{self::A::n} = 42;
+    self::use(super.{self::A::n} = 42);
+    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
+    self::use(let final dynamic #t36 = super.{self::A::a} in #t36.==(null) ? super.{self::A::a} = 42 : #t36);
+    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
+    self::use(let final dynamic #t37 = super.{self::B::b} in #t37.==(null) ? super.{self::A::b} = 42 : #t37);
+    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
+    self::use(let final dynamic #t38 = super.{self::A::c} in #t38.==(null) ? super.{self::B::c} = 42 : #t38);
+    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
+    self::use(let final dynamic #t39 = super.{self::B::d} in #t39.==(null) ? super.{self::A::d} = 42 : #t39);
+    super.{self::A::e}.==(null) ? super.e = 42 : null;
+    self::use(let final dynamic #t40 = super.{self::A::e} in #t40.==(null) ? super.e = 42 : #t40);
+    super.{self::A::f}.==(null) ? super.f = 42 : null;
+    self::use(let final dynamic #t41 = super.{self::A::f} in #t41.==(null) ? super.f = 42 : #t41);
+    super.g.==(null) ? super.{self::A::g} = 42 : null;
+    self::use(let final dynamic #t42 = super.g in #t42.==(null) ? super.{self::A::g} = 42 : #t42);
+    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
+    self::use(let final dynamic #t43 = super.{self::A::h} in #t43.==(null) ? super.{self::A::h} = 42 : #t43);
+    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
+    self::use(let final dynamic #t44 = super.{self::A::i} in #t44.==(null) ? super.{self::B::i} = 42 : #t44);
+    let final dynamic #t45 = 87 in super.{self::A::[]}(#t45).==(null) ? let final dynamic #t46 = 42 in let final dynamic #t47 = super.{self::A::[]=}(#t45, #t46) in #t46 : null;
+    self::use(let final dynamic #t48 = 87 in let final dynamic #t49 = super.{self::A::[]}(#t48) in #t49.==(null) ? let final dynamic #t50 = 42 in let final dynamic #t51 = super.{self::A::[]=}(#t48, #t50) in #t50 : #t49);
+    super.{self::A::m}.==(null) ? super.m = 42 : null;
+    self::use(let final dynamic #t52 = super.{self::A::m} in #t52.==(null) ? super.m = 42 : #t52);
+    super.{self::A::n}.==(null) ? super.{self::A::n} = 42 : null;
+    self::use(let final dynamic #t53 = super.{self::A::n} in #t53.==(null) ? super.{self::A::n} = 42 : #t53);
+    super.{self::A::a} = super.{self::A::a}.+(42);
+    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
+    super.{self::A::b} = super.{self::B::b}.+(42);
+    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
+    super.{self::B::c} = super.{self::A::c}.+(42);
+    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
+    super.{self::A::d} = super.{self::B::d}.+(42);
+    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
+    super.e = super.{self::A::e}.+(42);
+    self::use(super.e = super.{self::A::e}.+(42));
+    super.f = super.{self::A::f}.+(42);
+    self::use(super.f = super.{self::A::f}.+(42));
+    super.{self::A::g} = super.g.+(42);
+    self::use(super.{self::A::g} = super.g.+(42));
+    super.{self::A::h} = super.{self::A::h}.+(42);
+    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
+    super.{self::B::i} = super.{self::A::i}.+(42);
+    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
+    let final dynamic #t54 = 87 in super.{self::A::[]=}(#t54, super.{self::A::[]}(#t54).+(42));
+    self::use(let final dynamic #t55 = 87 in let final dynamic #t56 = super.{self::A::[]}(#t55).+(42) in let final dynamic #t57 = super.{self::A::[]=}(#t55, #t56) in #t56);
+    super.m = super.{self::A::m}.+(42);
+    self::use(super.m = super.{self::A::m}.+(42));
+    super.{self::A::n} = super.{self::A::n}.+(42);
+    self::use(super.{self::A::n} = super.{self::A::n}.+(42));
+    super.{self::A::a} = super.{self::A::a}.-(42);
+    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
+    super.{self::A::b} = super.{self::B::b}.-(42);
+    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
+    super.{self::B::c} = super.{self::A::c}.-(42);
+    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
+    super.{self::A::d} = super.{self::B::d}.-(42);
+    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
+    super.e = super.{self::A::e}.-(42);
+    self::use(super.e = super.{self::A::e}.-(42));
+    super.f = super.{self::A::f}.-(42);
+    self::use(super.f = super.{self::A::f}.-(42));
+    super.{self::A::g} = super.g.-(42);
+    self::use(super.{self::A::g} = super.g.-(42));
+    super.{self::A::h} = super.{self::A::h}.-(42);
+    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
+    super.{self::B::i} = super.{self::A::i}.-(42);
+    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
+    let final dynamic #t58 = 87 in super.{self::A::[]=}(#t58, super.{self::A::[]}(#t58).-(42));
+    self::use(let final dynamic #t59 = 87 in let final dynamic #t60 = super.{self::A::[]}(#t59).-(42) in let final dynamic #t61 = super.{self::A::[]=}(#t59, #t60) in #t60);
+    super.m = super.{self::A::m}.-(42);
+    self::use(super.m = super.{self::A::m}.-(42));
+    super.{self::A::n} = super.{self::A::n}.-(42);
+    self::use(super.{self::A::n} = super.{self::A::n}.-(42));
+  }
+}
+static method use(dynamic x) → dynamic {
+  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  new self::C::•().test();
+}
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index e165ea3..6e155d9 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -241,6 +241,16 @@
 // Try removing the extra positional arguments.
 //     use(super.n(87));
 //                ^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
index 3f4c856..a55281a 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
index 3f4c856..a55281a 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
index 3f4c856..a55281a 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
index 3f4c856..a55281a 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/reorder_super.dart b/pkg/front_end/testcases/reorder_super.dart
deleted file mode 100644
index 196c061..0000000
--- a/pkg/front_end/testcases/reorder_super.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This test verifies that super calls get reordered properly.  It exercises the
-// case where the arguments to super have a type other than `dynamic`.
-String events = '';
-
-int f(x) {
-  events += 'f($x)\n';
-  return 0;
-}
-
-String g(x) {
-  events += 'g($x)\n';
-  return 'foo';
-}
-
-class B {
-  num x;
-  String y;
-  B(this.x, this.y) {
-    events += 'super($x, $y)\n';
-  }
-}
-
-class C extends B {
-  final z;
-  C()
-      : super(f(1), g(2)),
-        z = f(3);
-}
-
-main() {
-  new C();
-  if (events != 'f(1)\ng(2)\nf(3)\nsuper(0, foo)\n') {
-    throw 'Unexpected sequence of events: $events';
-  }
-}
diff --git a/pkg/front_end/testcases/reorder_super.dart.direct.expect b/pkg/front_end/testcases/reorder_super.dart.direct.expect
deleted file mode 100644
index 4a2f96e..0000000
--- a/pkg/front_end/testcases/reorder_super.dart.direct.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  field core::num x;
-  field core::String y;
-  constructor •(core::num x, core::String y) → void
-    : self::B::x = x, self::B::y = y, super core::Object::•() {
-    self::events = self::events.+("super(${this.{self::B::x}}, ${this.{self::B::y}})
-");
-  }
-}
-class C extends self::B {
-  final field dynamic z;
-  constructor •() → void
-    : final dynamic #t1 = self::f(1), final dynamic #t2 = self::g(2), self::C::z = self::f(3), super self::B::•(#t1, #t2)
-    ;
-}
-static field core::String events = "";
-static method f(dynamic x) → core::int {
-  self::events = self::events.+("f(${x})
-");
-  return 0;
-}
-static method g(dynamic x) → core::String {
-  self::events = self::events.+("g(${x})
-");
-  return "foo";
-}
-static method main() → dynamic {
-  new self::C::•();
-  if(!self::events.==("f(1)
-g(2)
-f(3)
-super(0, foo)
-")) {
-    throw "Unexpected sequence of events: ${self::events}";
-  }
-}
diff --git a/pkg/front_end/testcases/reorder_super.dart.direct.transformed.expect b/pkg/front_end/testcases/reorder_super.dart.direct.transformed.expect
deleted file mode 100644
index 4a2f96e..0000000
--- a/pkg/front_end/testcases/reorder_super.dart.direct.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  field core::num x;
-  field core::String y;
-  constructor •(core::num x, core::String y) → void
-    : self::B::x = x, self::B::y = y, super core::Object::•() {
-    self::events = self::events.+("super(${this.{self::B::x}}, ${this.{self::B::y}})
-");
-  }
-}
-class C extends self::B {
-  final field dynamic z;
-  constructor •() → void
-    : final dynamic #t1 = self::f(1), final dynamic #t2 = self::g(2), self::C::z = self::f(3), super self::B::•(#t1, #t2)
-    ;
-}
-static field core::String events = "";
-static method f(dynamic x) → core::int {
-  self::events = self::events.+("f(${x})
-");
-  return 0;
-}
-static method g(dynamic x) → core::String {
-  self::events = self::events.+("g(${x})
-");
-  return "foo";
-}
-static method main() → dynamic {
-  new self::C::•();
-  if(!self::events.==("f(1)
-g(2)
-f(3)
-super(0, foo)
-")) {
-    throw "Unexpected sequence of events: ${self::events}";
-  }
-}
diff --git a/pkg/front_end/testcases/reorder_super.dart.outline.expect b/pkg/front_end/testcases/reorder_super.dart.outline.expect
deleted file mode 100644
index 947f8d2..0000000
--- a/pkg/front_end/testcases/reorder_super.dart.outline.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  field core::num x;
-  field core::String y;
-  constructor •(core::num x, core::String y) → void
-    ;
-}
-class C extends self::B {
-  final field dynamic z;
-  constructor •() → void
-    ;
-}
-static field core::String events;
-static method f(dynamic x) → core::int
-  ;
-static method g(dynamic x) → core::String
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/reorder_super.dart.strong.expect b/pkg/front_end/testcases/reorder_super.dart.strong.expect
deleted file mode 100644
index cdd2ae0..0000000
--- a/pkg/front_end/testcases/reorder_super.dart.strong.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  field core::num x;
-  field core::String y;
-  constructor •(core::num x, core::String y) → void
-    : self::B::x = x, self::B::y = y, super core::Object::•() {
-    self::events = self::events.{core::String::+}("super(${this.{self::B::x}}, ${this.{self::B::y}})
-");
-  }
-}
-class C extends self::B {
-  final field dynamic z;
-  constructor •() → void
-    : final core::int #t1 = self::f(1), final core::String #t2 = self::g(2), self::C::z = self::f(3), super self::B::•(#t1, #t2)
-    ;
-}
-static field core::String events = "";
-static method f(dynamic x) → core::int {
-  self::events = self::events.{core::String::+}("f(${x})
-");
-  return 0;
-}
-static method g(dynamic x) → core::String {
-  self::events = self::events.{core::String::+}("g(${x})
-");
-  return "foo";
-}
-static method main() → dynamic {
-  new self::C::•();
-  if(!self::events.{core::String::==}("f(1)
-g(2)
-f(3)
-super(0, foo)
-")) {
-    throw "Unexpected sequence of events: ${self::events}";
-  }
-}
diff --git a/pkg/front_end/testcases/reorder_super.dart.strong.transformed.expect b/pkg/front_end/testcases/reorder_super.dart.strong.transformed.expect
deleted file mode 100644
index cdd2ae0..0000000
--- a/pkg/front_end/testcases/reorder_super.dart.strong.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  field core::num x;
-  field core::String y;
-  constructor •(core::num x, core::String y) → void
-    : self::B::x = x, self::B::y = y, super core::Object::•() {
-    self::events = self::events.{core::String::+}("super(${this.{self::B::x}}, ${this.{self::B::y}})
-");
-  }
-}
-class C extends self::B {
-  final field dynamic z;
-  constructor •() → void
-    : final core::int #t1 = self::f(1), final core::String #t2 = self::g(2), self::C::z = self::f(3), super self::B::•(#t1, #t2)
-    ;
-}
-static field core::String events = "";
-static method f(dynamic x) → core::int {
-  self::events = self::events.{core::String::+}("f(${x})
-");
-  return 0;
-}
-static method g(dynamic x) → core::String {
-  self::events = self::events.{core::String::+}("g(${x})
-");
-  return "foo";
-}
-static method main() → dynamic {
-  new self::C::•();
-  if(!self::events.{core::String::==}("f(1)
-g(2)
-f(3)
-super(0, foo)
-")) {
-    throw "Unexpected sequence of events: ${self::events}";
-  }
-}
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
index eac205d..91b673f 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
index eac205d..91b673f 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index 6509c64..66896c4 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -209,6 +209,16 @@
 // Try removing the extra positional arguments.
 //     use(super.m(87));
 //                ^^^^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index dd1a044..f5a391f 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -236,6 +236,7 @@
   "--target": String,
   "--verbose": false,
   "--verify": false,
+  "--bytecode": false,
   "-h": "--help",
   "-o": "--output",
   "-t": "--target",
@@ -297,6 +298,8 @@
 
   final bool warningsAreFatal = fatal.contains("warnings");
 
+  final bool bytecode = options["--bytecode"];
+
   final bool compileSdk = options.containsKey("--compile-sdk");
 
   final String singleRootScheme = options["--single-root-scheme"];
@@ -346,7 +349,8 @@
           ..embedSourceText = !excludeSource
           ..debugDump = dumpIr
           ..verbose = verbose
-          ..verify = verify,
+          ..verify = verify
+          ..bytecode = bytecode,
         <Uri>[Uri.parse(arguments[0])],
         resolveInputUri(arguments[3], extraSchemes: extraSchemes));
   } else if (arguments.isEmpty) {
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 9c496d8..9eab27d 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -15,8 +15,7 @@
 
 import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
 
-import 'package:vm/bytecode/gen_bytecode.dart'
-    show generateBytecode, isKernelBytecodeEnabledForPlatform;
+import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions;
@@ -328,7 +327,7 @@
   new File.fromUri(outlineOutput).writeAsBytesSync(result.summary);
   c.options.ticker.logMs("Wrote outline to ${outlineOutput.toFilePath()}");
 
-  if (isKernelBytecodeEnabledForPlatform) {
+  if (c.options.bytecode) {
     generateBytecode(result.component, strongMode: c.options.strongMode);
   }
 
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index b25a5b6..b15dfa4 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -33,8 +33,7 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/summary/summarize_ast.dart';
-import 'package:front_end/src/scanner/reader.dart';
-import 'package:front_end/src/scanner/scanner.dart';
+import 'package:front_end/src/fasta/scanner.dart';
 import 'package:front_end/src/scanner/token.dart';
 import 'package:package_config/discovery.dart';
 import 'package:path/path.dart' as path;
@@ -284,8 +283,15 @@
   scanTimer.start();
   // TODO(sigmund): is there a way to scan from a random-access-file without
   // first converting to String?
-  var scanner = new _Scanner(source.contents.data);
-  var token = scanner.tokenize();
+  ScannerResult result =
+      scanString(source.contents.data, includeComments: false);
+  var token = result.tokens;
+  if (result.hasErrors) {
+    // Ignore errors.
+    while (token is ErrorToken) {
+      token = token.next;
+    }
+  }
   scanTimer.stop();
   return token;
 }
@@ -328,14 +334,3 @@
     return result;
   }
 }
-
-class _Scanner extends Scanner {
-  _Scanner(String contents) : super.create(new CharSequenceReader(contents)) {
-    preserveComments = false;
-  }
-
-  @override
-  void reportError(errorCode, int offset, List<Object> arguments) {
-    // ignore errors.
-  }
-}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 9a6b943..bd7286f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5353,11 +5353,15 @@
 
   void computeCanonicalNames() {
     for (var library in libraries) {
-      root.getChildFromUri(library.importUri).bindTo(library.reference);
-      library.computeCanonicalNames();
+      computeCanonicalNamesForLibrary(library);
     }
   }
 
+  void computeCanonicalNamesForLibrary(Library library) {
+    root.getChildFromUri(library.importUri).bindTo(library.reference);
+    library.computeCanonicalNames();
+  }
+
   void unbindCanonicalNames() {
     root.unbindAll();
   }
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 604208a..011e40c 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -173,7 +173,7 @@
       callback(Member declaredMember, Member interfaceMember, bool isSetter));
 
   /// This method is invoked by the client after a change: removal, addition,
-  /// or modification of classes.
+  /// or modification of classes (via libraries).
   ///
   /// For modified classes specify a class as both removed and added: Some of
   /// the information that this hierarchy might have cached, is not valid
@@ -181,8 +181,8 @@
   ///
   /// Note, that it is the clients responsibility to mark all subclasses as
   /// changed too.
-  ClassHierarchy applyTreeChanges(
-      Iterable<Class> removedClasses, Iterable<Class> addedClasses,
+  ClassHierarchy applyTreeChanges(Iterable<Library> removedLibraries,
+      Iterable<Library> ensureKnownLibraries,
       {Component reissueAmbiguousSupertypesFor});
 
   /// This method is invoked by the client after a member change on classes:
@@ -433,6 +433,7 @@
   /// The insert order is important.
   final Map<Class, _ClassInfo> _infoFor =
       new LinkedHashMap<Class, _ClassInfo>();
+  final Set<Library> knownLibraries = new Set<Library>();
 
   /// Recorded errors for classes we have already calculated the class hierarchy
   /// for, but will have to be reissued when re-using the calculation.
@@ -617,8 +618,7 @@
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) {
     Supertype castedType = getClassAsInstanceOf(type.classNode, superclass);
     if (castedType == null) return null;
-    return Substitution
-        .fromInterfaceType(type)
+    return Substitution.fromInterfaceType(type)
         .substituteType(castedType.asInterfaceType);
   }
 
@@ -725,24 +725,28 @@
   }
 
   @override
-  ClassHierarchy applyTreeChanges(
-      Iterable<Class> removedClasses, Iterable<Class> addedClasses,
+  ClassHierarchy applyTreeChanges(Iterable<Library> removedLibraries,
+      Iterable<Library> ensureKnownLibraries,
       {Component reissueAmbiguousSupertypesFor}) {
     // Remove all references to the removed classes.
-    for (Class class_ in removedClasses) {
-      _ClassInfo info = _infoFor[class_];
-      if (class_.supertype != null) {
-        _infoFor[class_.supertype.classNode]?.directExtenders?.remove(info);
-      }
-      if (class_.mixedInType != null) {
-        _infoFor[class_.mixedInType.classNode]?.directMixers?.remove(info);
-      }
-      for (var supertype in class_.implementedTypes) {
-        _infoFor[supertype.classNode]?.directImplementers?.remove(info);
-      }
+    for (Library lib in removedLibraries) {
+      if (!knownLibraries.contains(lib)) continue;
+      for (Class class_ in lib.classes) {
+        _ClassInfo info = _infoFor[class_];
+        if (class_.supertype != null) {
+          _infoFor[class_.supertype.classNode]?.directExtenders?.remove(info);
+        }
+        if (class_.mixedInType != null) {
+          _infoFor[class_.mixedInType.classNode]?.directMixers?.remove(info);
+        }
+        for (var supertype in class_.implementedTypes) {
+          _infoFor[supertype.classNode]?.directImplementers?.remove(info);
+        }
 
-      _infoFor.remove(class_);
-      _recordedAmbiguousSupertypes.remove(class_);
+        _infoFor.remove(class_);
+        _recordedAmbiguousSupertypes.remove(class_);
+      }
+      knownLibraries.remove(lib);
     }
 
     // If we have a cached computation of subtypes, invalidate it and stop
@@ -768,9 +772,13 @@
     // Add the new classes.
     List<Class> addedClassesSorted = new List<Class>();
     int expectedStartIndex = _topSortIndex;
-    for (Class class_ in addedClasses) {
-      _topologicalSortVisit(class_, new Set<Class>(),
-          orderedList: addedClassesSorted);
+    for (Library lib in ensureKnownLibraries) {
+      if (knownLibraries.contains(lib)) continue;
+      for (Class class_ in lib.classes) {
+        _topologicalSortVisit(class_, new Set<Class>(),
+            orderedList: addedClassesSorted);
+      }
+      knownLibraries.add(lib);
     }
     _initializeTopologicallySortedClasses(
         addedClassesSorted, expectedStartIndex);
@@ -845,6 +853,7 @@
       for (var classNode in library.classes) {
         _topologicalSortVisit(classNode, new Set<Class>());
       }
+      knownLibraries.add(library);
     }
 
     _initializeTopologicallySortedClasses(_infoFor.keys, 0);
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 9604ad8..38e7c2e 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -103,48 +103,11 @@
   /// slowing down compilation.
   void performOutlineTransformations(Component component) {}
 
-  /// Perform target-specific modular transformations on the given component.
-  ///
-  /// These transformations should not be whole-component transformations.  They
-  /// should expect that the component will contain external libraries.
-  void performModularTransformationsOnComponent(
-      CoreTypes coreTypes, ClassHierarchy hierarchy, Component component,
-      {void logger(String msg)}) {
-    performModularTransformationsOnLibraries(
-        coreTypes, hierarchy, component.libraries,
-        logger: logger);
-  }
-
   /// Perform target-specific modular transformations on the given libraries.
-  ///
-  /// The intent of this method is to perform the transformations only on some
-  /// subset of the component libraries and avoid packing them into a temporary
-  /// [Component] instance to pass into [performModularTransformationsOnComponent].
-  ///
-  /// Note that the following should be equivalent:
-  ///
-  ///     target.performModularTransformationsOnComponent(coreTypes, component);
-  ///
-  /// and
-  ///
-  ///     target.performModularTransformationsOnLibraries(
-  ///         coreTypes, component.libraries);
-  void performModularTransformationsOnLibraries(
+  void performModularTransformationsOnLibraries(Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
       {void logger(String msg)});
 
-  /// Perform target-specific whole-program transformations.
-  ///
-  /// These transformations should be optimizations and not required for
-  /// correctness.  Everything should work if a simple and fast linker chooses
-  /// not to apply these transformations.
-  ///
-  /// Note that [performGlobalTransformations] doesn't have -OnComponent and
-  /// -OnLibraries alternatives, because the global knowledge required by the
-  /// transformations is assumed to be retrieved from a [Component] instance.
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
-      {void logger(String msg)});
-
   /// Perform target-specific modular transformations on the given program.
   ///
   /// This is used when an individual expression is compiled, e.g. for debugging
@@ -226,6 +189,10 @@
     return new InvalidExpression(message)..fileOffset = offset;
   }
 
+  /// Configure the given [Component] in a target specific way.
+  /// Returns the configured component.
+  Component configureComponent(Component component) => component;
+
   String toString() => 'Target($name)';
 }
 
@@ -237,11 +204,9 @@
   bool get strongMode => flags.strongMode;
   String get name => 'none';
   List<String> get extraRequiredLibraries => <String>[];
-  void performModularTransformationsOnLibraries(
+  void performModularTransformationsOnLibraries(Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
       {void logger(String msg)}) {}
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
-      {void logger(String msg)}) {}
 
   @override
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 2327eca..0e01a2b 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -24,12 +24,23 @@
   }
 
   void test_applyTreeChanges() {
-    var a = addClass(new Class(name: 'A', supertype: objectSuper));
-    var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
-
-    _assertTestLibraryText('''
+    Class a = addClass(new Class(name: 'A', supertype: objectSuper));
+    _assertLibraryText(library, '''
 class A {}
-class B extends self::A {}
+''');
+
+    Class b = new Class(name: 'B', supertype: a.asThisSupertype);
+    Library libWithB =
+        new Library(Uri.parse('org-dartlang:///test_b.dart'), name: 'test_b');
+    libWithB.parent = component;
+    component.libraries.add(libWithB);
+    libWithB.addClass(b);
+    _assertLibraryText(libWithB, '''
+library test_b;
+import self as self;
+import "./test.dart" as test;
+
+class B extends test::A {}
 ''');
 
     // No updated classes, the same hierarchy.
@@ -39,13 +50,19 @@
     // Has updated classes, still the same hierarchy (instance). Can answer
     // queries about the new classes.
     var c = new Class(name: 'C', supertype: a.asThisSupertype);
-    expect(hierarchy.applyTreeChanges([b], [c]), same(hierarchy));
+    Library libWithC =
+        new Library(Uri.parse('org-dartlang:///test2.dart'), name: 'test2');
+    libWithC.parent = component;
+    component.libraries.add(libWithC);
+    libWithC.addClass(c);
+
+    expect(hierarchy.applyTreeChanges([libWithB], [libWithC]), same(hierarchy));
     expect(hierarchy.isSubclassOf(a, c), false);
     expect(hierarchy.isSubclassOf(c, a), true);
     expect(hierarchy.hasProperSubtypes(a), true);
 
     // Remove so A should no longer be a super of anything.
-    expect(hierarchy.applyTreeChanges([c], []), same(hierarchy));
+    expect(hierarchy.applyTreeChanges([libWithC], []), same(hierarchy));
     expect(hierarchy.hasProperSubtypes(a), false);
   }
 
@@ -654,12 +671,12 @@
       var T = new TypeParameter('T', objectClass.rawType);
       C1 = addClass(
           new Class(name: 'C1', typeParameters: [T], supertype: objectSuper));
-      DartType C1_T = Substitution
-          .fromMap({T: new TypeParameterType(T)}).substituteType(C1.thisType);
+      DartType C1_T = Substitution.fromMap({T: new TypeParameterType(T)})
+          .substituteType(C1.thisType);
       DartType N_C1_T =
           Substitution.fromMap({NT: C1_T}).substituteType(N.thisType);
-      Supertype N_N_C1_T = Substitution
-          .fromMap({NT: N_C1_T}).substituteSupertype(N.asThisSupertype);
+      Supertype N_N_C1_T = Substitution.fromMap({NT: N_C1_T})
+          .substituteSupertype(N.asThisSupertype);
       C1.supertype = N_N_C1_T;
     }
 
@@ -669,16 +686,16 @@
       var T = new TypeParameter('T', objectClass.rawType);
       C2 = addClass(
           new Class(name: 'C2', typeParameters: [T], supertype: objectSuper));
-      DartType C2_T = Substitution
-          .fromMap({T: new TypeParameterType(T)}).substituteType(C2.thisType);
+      DartType C2_T = Substitution.fromMap({T: new TypeParameterType(T)})
+          .substituteType(C2.thisType);
       DartType N_C2_T =
           Substitution.fromMap({NT: C2_T}).substituteType(N.thisType);
       DartType C2_N_C2_T =
           Substitution.fromMap({T: N_C2_T}).substituteType(C2.thisType);
       DartType N_C2_N_C2_T =
           Substitution.fromMap({NT: C2_N_C2_T}).substituteType(N.thisType);
-      Supertype N_N_C2_N_C2_T = Substitution
-          .fromMap({NT: N_C2_N_C2_T}).substituteSupertype(N.asThisSupertype);
+      Supertype N_N_C2_N_C2_T = Substitution.fromMap({NT: N_C2_N_C2_T})
+          .substituteSupertype(N.asThisSupertype);
       C2.supertype = N_N_C2_N_C2_T;
     }
 
@@ -1362,9 +1379,13 @@
   /// Assert that the test [library] has the [expectedText] presentation.
   /// The presentation is close, but not identical to the normal Kernel one.
   void _assertTestLibraryText(String expectedText) {
+    _assertLibraryText(library, expectedText);
+  }
+
+  void _assertLibraryText(Library lib, String expectedText) {
     StringBuffer sb = new StringBuffer();
     Printer printer = new Printer(sb);
-    printer.writeLibraryFile(library);
+    printer.writeLibraryFile(lib);
 
     String actualText = sb.toString();
 
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index 4eed5fe..284d9ba 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 1.1.7
+
+* Introduce `@sealed` to declare that a class or mixin is not allowed as a
+  super-type.
+
+  Only classes in the same package as a class or mixin annotated with `@sealed`
+  may extend, implement or mix-in the annotated class or mixin. (SDK issue
+  [27372](https://github.com/dart-lang/sdk/issues/27372)).
+
 ## 1.1.6
 
 * Set max SDK version to <3.0.0.
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index ea23c35..d59cc28 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -188,6 +188,20 @@
 ///   corresponding to a named parameter that has this annotation.
 const Required required = const Required();
 
+/// Annotation marking a class or mixin as not allowed as a super-type.
+///
+/// Classes in the same package as the marked class or mixin may extend,
+/// implement or mix-in the annotated class or mixin.
+///
+/// Given a class or mixin `c`, which is annotated with this, and a class or
+/// mixin `d`, which extends, implements, or mixes in `c`, then tools, such as
+/// the analyzer, may emit warnings if:
+///
+/// * `c` and `d` are declared in different packages, or
+/// * `c` and `d` are declared in the same package, and `d` is not also
+/// annotated with this.
+const _Sealed sealed = const _Sealed();
+
 /// Used to annotate a field that is allowed to be overridden in Strong Mode.
 const _Virtual virtual = const _Virtual();
 
@@ -284,6 +298,10 @@
   const _Protected();
 }
 
+class _Sealed {
+  const _Sealed();
+}
+
 class _Virtual {
   const _Virtual();
 }
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index e908e08..0d1b4f8 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 1.1.6
+version: 1.1.7
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/meta
 description: >
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
index e002d81..6fdc73d 100644
--- a/pkg/smith/lib/configuration.dart
+++ b/pkg/smith/lib/configuration.dart
@@ -256,6 +256,8 @@
         isHostChecked: boolOption("host-checked"),
         isMinified: boolOption("minified"),
         previewDart2: boolOption("preview-dart-2"),
+        useAnalyzerCfe: boolOption("use-cfe"),
+        useAnalyzerFastaParser: boolOption("analyzer-use-fasta-parser"),
         useBlobs: boolOption("use-blobs"),
         useDart2JSWithKernel: boolOption("dart2js-with-kernel"),
         useDart2JSOldFrontEnd: boolOption("dart2js-old-frontend"),
@@ -305,6 +307,10 @@
   // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
   final bool previewDart2;
 
+  // TODO(whesse): Remove these when only fasta front end is in analyzer.
+  final bool useAnalyzerCfe;
+  final bool useAnalyzerFastaParser;
+
   // TODO(rnystrom): What is this?
   final bool useBlobs;
 
@@ -330,6 +336,8 @@
       bool isHostChecked,
       bool isMinified,
       bool previewDart2,
+      bool useAnalyzerCfe,
+      bool useAnalyzerFastaParser,
       bool useBlobs,
       bool useDart2JSWithKernel,
       bool useDart2JSOldFrontEnd,
@@ -346,6 +354,8 @@
         isHostChecked = isHostChecked ?? false,
         isMinified = isMinified ?? false,
         previewDart2 = previewDart2 ?? true,
+        useAnalyzerCfe = useAnalyzerCfe ?? false,
+        useAnalyzerFastaParser = useAnalyzerFastaParser ?? false,
         useBlobs = useBlobs ?? false,
         useDart2JSWithKernel = useDart2JSWithKernel ?? false,
         useDart2JSOldFrontEnd = useDart2JSOldFrontEnd ?? false,
@@ -371,6 +381,8 @@
       isHostChecked == other.isHostChecked &&
       isMinified == other.isMinified &&
       previewDart2 == other.previewDart2 &&
+      useAnalyzerCfe == other.useAnalyzerCfe &&
+      useAnalyzerFastaParser == other.useAnalyzerFastaParser &&
       useBlobs == other.useBlobs &&
       useDart2JSWithKernel == other.useDart2JSWithKernel &&
       useDart2JSOldFrontEnd == other.useDart2JSOldFrontEnd &&
@@ -398,13 +410,15 @@
       (isHostChecked ? 8 : 0) ^
       (isMinified ? 16 : 0) ^
       (previewDart2 ? 32 : 0) ^
-      (useBlobs ? 64 : 0) ^
-      (useDart2JSWithKernel ? 128 : 0) ^
-      (useDart2JSOldFrontEnd ? 256 : 0) ^
-      (useFastStartup ? 512 : 0) ^
-      (useHotReload ? 1024 : 0) ^
-      (useHotReloadRollback ? 2048 : 0) ^
-      (useSdk ? 4096 : 0);
+      (useAnalyzerCfe ? 64 : 0) ^
+      (useAnalyzerFastaParser ? 128 : 0) ^
+      (useBlobs ? 256 : 0) ^
+      (useDart2JSWithKernel ? 512 : 0) ^
+      (useDart2JSOldFrontEnd ? 1024 : 0) ^
+      (useFastStartup ? 2048 : 0) ^
+      (useHotReload ? 4096 : 0) ^
+      (useHotReloadRollback ? 8192 : 0) ^
+      (useSdk ? 16384 : 0);
 
   String toString() {
     var buffer = new StringBuffer();
@@ -427,6 +441,8 @@
     if (isHostChecked) fields.add("host-checked");
     if (isMinified) fields.add("minified");
     if (previewDart2) fields.add("preview-dart-2");
+    if (useAnalyzerCfe) fields.add("use-cfe");
+    if (useAnalyzerFastaParser) fields.add("analyzer-use-fasta-parser");
     if (useBlobs) fields.add("use-blobs");
     if (useDart2JSWithKernel) fields.add("dart2js-with-kernel");
     if (useDart2JSOldFrontEnd) fields.add("dart2js-old-frontend");
@@ -439,6 +455,87 @@
     buffer.write(")");
     return buffer.toString();
   }
+
+  String visualCompare(Configuration other) {
+    var buffer = new StringBuffer();
+    buffer.writeln(name);
+    buffer.writeln(other.name);
+
+    var fields = <String>[];
+    fields.add("architecture: $architecture ${other.architecture}");
+    fields.add("compiler: $compiler ${other.compiler}");
+    fields.add("mode: $mode ${other.mode}");
+    fields.add("runtime: $runtime ${other.runtime}");
+    fields.add("system: $system ${other.system}");
+
+    if (builderTag != "" || other.builderTag != "") {
+      var tag = builderTag == "" ? "(none)" : builderTag;
+      var otherTag = other.builderTag == "" ? "(none)" : other.builderTag;
+      fields.add("builder-tag: $tag $otherTag");
+    }
+    if (vmOptions != "" || other.vmOptions != "") {
+      var tag = "[${vmOptions.join(", ")}]";
+      var otherTag = "[${other.vmOptions.join(", ")}]";
+      fields.add("vm-options: $tag $otherTag");
+    }
+    fields.add("timeout: $timeout ${other.timeout}");
+    if (enableAsserts || other.enableAsserts) {
+      fields.add("enable-asserts $enableAsserts ${other.enableAsserts}");
+    }
+    if (isChecked || other.isChecked) {
+      fields.add("checked $isChecked ${other.isChecked}");
+    }
+    if (isCsp || other.isCsp) {
+      fields.add("csp $isCsp ${other.isCsp}");
+    }
+    if (isHostChecked || other.isHostChecked) {
+      fields.add("isHostChecked $isHostChecked ${other.isHostChecked}");
+    }
+    if (isMinified || other.isMinified) {
+      fields.add("isMinified $isMinified ${other.isMinified}");
+    }
+    if (previewDart2 || other.previewDart2) {
+      fields.add("previewDart2 $previewDart2 ${other.previewDart2}");
+    }
+    if (useAnalyzerCfe || other.useAnalyzerCfe) {
+      fields.add("useAnalyzerCfe $useAnalyzerCfe ${other.useAnalyzerCfe}");
+    }
+    if (useAnalyzerFastaParser || other.useAnalyzerFastaParser) {
+      fields.add("useAnalyzerFastaParser "
+          "$useAnalyzerFastaParser ${other.useAnalyzerFastaParser}");
+    }
+    if (useBlobs || other.useBlobs) {
+      fields.add("useBlobs $useBlobs ${other.useBlobs}");
+    }
+    if (useDart2JSWithKernel || other.useDart2JSWithKernel) {
+      fields.add("useDart2JSWithKernel "
+          "$useDart2JSWithKernel ${other.useDart2JSWithKernel}");
+    }
+    if (useDart2JSOldFrontEnd || other.useDart2JSOldFrontEnd) {
+      fields.add("useDart2JSOldFrontEnd "
+          "$useDart2JSOldFrontEnd ${other.useDart2JSOldFrontEnd}");
+    }
+    if (useFastStartup || other.useFastStartup) {
+      fields.add("useFastStartup $useFastStartup ${other.useFastStartup}");
+    }
+    if (useHotReload || other.useHotReload) {
+      fields.add("useHotReload $useHotReload ${other.useHotReload}");
+    }
+    if (isHostChecked) {
+      fields.add("host-checked $isHostChecked ${other.isHostChecked}");
+    }
+    if (useHotReloadRollback || other.useHotReloadRollback) {
+      fields.add("useHotReloadRollback"
+          " $useHotReloadRollback ${other.useHotReloadRollback}");
+    }
+    if (useSdk || other.useSdk) {
+      fields.add("useSdk $useSdk ${other.useSdk}");
+    }
+
+    buffer.write(fields.join("\n   "));
+    buffer.write("\n");
+    return buffer.toString();
+  }
 }
 
 class Architecture extends NamedEnum {
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
index 2add763..f49a332 100644
--- a/pkg/vm/bin/dump_kernel.dart
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -17,6 +17,9 @@
 import 'package:vm/metadata/unreachable.dart'
     show UnreachableNodeMetadataRepository;
 
+import 'package:vm/metadata/call_site_attributes.dart'
+    show CallSiteAttributesMetadataRepository;
+
 final String _usage = '''
 Usage: dump_kernel input.dill output.txt
 Dumps kernel binary file with VM-specific metadata.
@@ -39,6 +42,7 @@
   component.addMetadataRepository(new ProcedureAttributesMetadataRepository());
   component.addMetadataRepository(new UnreachableNodeMetadataRepository());
   component.addMetadataRepository(new BytecodeMetadataRepository());
+  component.addMetadataRepository(new CallSiteAttributesMetadataRepository());
 
   final List<int> bytes = new File(input).readAsBytesSync();
   new BinaryBuilderWithMetadata(bytes).readComponent(component);
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index a655aeb..9e1581e 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -12,7 +12,6 @@
 import 'package:kernel/target/targets.dart' show TargetFlags;
 import 'package:kernel/text/ast_to_text.dart'
     show globalDebuggingNames, NameSystem;
-import 'package:vm/bytecode/gen_bytecode.dart' show isKernelBytecodeEnabled;
 import 'package:vm/kernel_front_end.dart'
     show compileToKernel, ErrorDetector, ErrorPrinter, parseCommandLineDefines;
 import 'package:vm/target/vm.dart' show VmTarget;
@@ -47,8 +46,7 @@
       defaultsTo: true)
   ..addMultiOption('entry-points',
       help: 'Path to JSON file with the list of entry points')
-  ..addFlag('gen-bytecode',
-      help: 'Generate bytecode', defaultsTo: isKernelBytecodeEnabled)
+  ..addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false)
   ..addFlag('drop-ast',
       help: 'Drop AST for members with bytecode', defaultsTo: false);
 
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 6814e1c..e3af637 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -260,8 +260,8 @@
   final SendPort port = request[1];
   final int isolateId = request[2];
   final String expression = request[3];
-  final List definitions = request[4];
-  final List typeDefinitions = request[5];
+  final List<String> definitions = request[4].cast<String>();
+  final List<String> typeDefinitions = request[5].cast<String>();
   final String libraryUri = request[6];
   final String klass = request[7]; // might be null
   final bool isStatic = request[8];
@@ -569,11 +569,11 @@
     scriptUri,
     platformKernelPath,
     false /* incremental */,
-    false /* strong */,
+    true /* strong */,
     1 /* isolateId chosen randomly */,
     [] /* source files */,
     false /* suppress warnings */,
-    false /* synchronous async */,
+    true /* synchronous async */,
     null /* package_config */,
     null /* multirootFilepaths */,
     null /* multirootScheme */,
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 1c543f5..cd7cc9a 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -30,12 +30,6 @@
 import '../constants_error_reporter.dart' show ForwardConstantEvaluationErrors;
 import '../metadata/bytecode.dart';
 
-/// Flag to toggle generation of bytecode in kernel files.
-const bool isKernelBytecodeEnabled = false;
-
-/// Flag to toggle generation of bytecode in platform kernel files.
-const bool isKernelBytecodeEnabledForPlatform = isKernelBytecodeEnabled;
-
 void generateBytecode(Component component,
     {bool strongMode: true,
     bool dropAST: false,
@@ -255,6 +249,10 @@
       _allocateInvocationMirror ??= libraryIndex.getMember(
           'dart:core', '_InvocationMirror', '_allocateInvocationMirror');
 
+  Procedure _unsafeCast;
+  Procedure get unsafeCast => _unsafeCast ??=
+      libraryIndex.getTopLevelMember('dart:_internal', 'unsafeCast');
+
   void _genConstructorInitializers(Constructor node) {
     bool isRedirecting =
         node.initializers.any((init) => init is RedirectingInitializer);
@@ -792,11 +790,14 @@
 
     if (locals.hasCapturedParameters) {
       // Copy captured parameters to their respective locations in the context.
-      if (locals.hasFactoryTypeArgsVar) {
-        _copyParamIfCaptured(locals.factoryTypeArgsVar);
-      }
-      if (locals.hasReceiver) {
-        _copyParamIfCaptured(locals.receiverVar);
+      final isClosure = parentFunction != null;
+      if (!isClosure) {
+        if (locals.hasFactoryTypeArgsVar) {
+          _copyParamIfCaptured(locals.factoryTypeArgsVar);
+        }
+        if (locals.hasReceiver) {
+          _copyParamIfCaptured(locals.receiverVar);
+        }
       }
       function.positionalParameters.forEach(_copyParamIfCaptured);
       function.namedParameters.forEach(_copyParamIfCaptured);
@@ -860,6 +861,13 @@
     asm = savedAssemblers.removeLast();
   }
 
+  void _evaluateDefaultParameterValue(VariableDeclaration param) {
+    if (param.initializer != null && param.initializer is! BasicLiteral) {
+      final constant = _evaluateConstantExpression(param.initializer);
+      param.initializer = new ConstantExpression(constant)..parent = param;
+    }
+  }
+
   int _genClosureBytecode(TreeNode node, String name, FunctionNode function) {
     _pushAssemblerState();
 
@@ -877,6 +885,12 @@
     List<Label> savedYieldPoints = yieldPoints;
     yieldPoints = locals.isSyncYieldingFrame ? <Label>[] : null;
 
+    // Replace default values of optional parameters with constants,
+    // as default value expressions could use local const variables which
+    // are not available in bytecode.
+    function.positionalParameters.forEach(_evaluateDefaultParameterValue);
+    function.namedParameters.forEach(_evaluateDefaultParameterValue);
+
     final int closureFunctionIndex =
         cp.add(new ConstantClosureFunction(name, function));
 
@@ -1076,15 +1090,12 @@
     }
   }
 
-  /// Generates non-local transfer from inner node [from] into the outer
-  /// node, executing finally blocks on the way out. [to] can be null,
-  /// in such case all enclosing finally blocks are executed.
+  /// Appends chained [FinallyBlock]s to each try-finally in the given
+  /// list [tryFinallyBlocks] (ordered from inner to outer).
   /// [continuation] is invoked to generate control transfer code following
   /// the last finally block.
-  void _generateNonLocalControlTransfer(
-      TreeNode from, TreeNode to, GenerateContinuation continuation) {
-    List<TryFinally> tryFinallyBlocks = _getEnclosingTryFinallyBlocks(from, to);
-
+  void _addFinallyBlocks(
+      List<TryFinally> tryFinallyBlocks, GenerateContinuation continuation) {
     // Add finally blocks to all try-finally from outer to inner.
     // The outermost finally block should generate continuation, each inner
     // finally block should proceed to a corresponding outer block.
@@ -1103,6 +1114,17 @@
     continuation();
   }
 
+  /// Generates non-local transfer from inner node [from] into the outer
+  /// node, executing finally blocks on the way out. [to] can be null,
+  /// in such case all enclosing finally blocks are executed.
+  /// [continuation] is invoked to generate control transfer code following
+  /// the last finally block.
+  void _generateNonLocalControlTransfer(
+      TreeNode from, TreeNode to, GenerateContinuation continuation) {
+    List<TryFinally> tryFinallyBlocks = _getEnclosingTryFinallyBlocks(from, to);
+    _addFinallyBlocks(tryFinallyBlocks, continuation);
+  }
+
   // For certain expressions wrapped into ExpressionStatement we can
   // omit pushing result on the stack.
   bool isExpressionWithoutResult(Expression expr) =>
@@ -1654,11 +1676,18 @@
   @override
   visitStaticInvocation(StaticInvocation node) {
     Arguments args = node.arguments;
-    if (node.target.isFactory) {
-      final constructedClass = node.target.enclosingClass;
+    final target = node.target;
+    if (target == unsafeCast) {
+      // The result of the unsafeCast() intrinsic method is its sole argument,
+      // without any additional checks or type casts.
+      assert(args.named.isEmpty);
+      args.positional.single.accept(this);
+      return;
+    }
+    if (target.isFactory) {
+      final constructedClass = target.enclosingClass;
       if (hasInstantiatorTypeArguments(constructedClass)) {
-        _genTypeArguments(args.types,
-            instantiatingClass: node.target.enclosingClass);
+        _genTypeArguments(args.types, instantiatingClass: constructedClass);
       } else {
         assert(args.types.isEmpty);
         // VM needs type arguments for every invocation of a factory
@@ -1669,7 +1698,7 @@
           new Arguments(node.arguments.positional, named: node.arguments.named);
     }
     _genArguments(null, args);
-    _genStaticCallWithArgs(node.target, args, isFactory: node.target.isFactory);
+    _genStaticCallWithArgs(target, args, isFactory: target.isFactory);
   }
 
   @override
@@ -2039,17 +2068,31 @@
 
   @override
   visitReturnStatement(ReturnStatement node) {
-    if (node.expression != null) {
-      node.expression.accept(this);
-    } else {
-      _genPushNull();
-    }
+    final expr = node.expression ?? new NullLiteral();
 
-    // TODO(alexmarkov): Do we need to save return value
-    // to a variable?
-    _generateNonLocalControlTransfer(node, null, () {
+    final List<TryFinally> tryFinallyBlocks =
+        _getEnclosingTryFinallyBlocks(node, null);
+    if (tryFinallyBlocks.isEmpty) {
+      expr.accept(this);
       asm.emitReturnTOS();
-    });
+    } else {
+      if (expr is BasicLiteral) {
+        _addFinallyBlocks(tryFinallyBlocks, () {
+          expr.accept(this);
+          asm.emitReturnTOS();
+        });
+      } else {
+        // Keep return value in a variable as try-catch statements
+        // inside finally can zap expression stack.
+        node.expression.accept(this);
+        asm.emitPopLocal(locals.returnVarIndexInFrame);
+
+        _addFinallyBlocks(tryFinallyBlocks, () {
+          asm.emitPush(locals.returnVarIndexInFrame);
+          asm.emitReturnTOS();
+        });
+      }
+    }
   }
 
   @override
@@ -2177,8 +2220,7 @@
     tryBlock.endPC = asm.offsetInWords;
     tryBlock.handlerPC = asm.offsetInWords;
 
-    // TODO(alexmarkov): Consider emitting SetFrame to cut expression stack.
-    // In such case, we need to save return value to a variable in visitReturn.
+    asm.emitSetFrame(locals.frameSize);
 
     _restoreContextForTryBlock(node);
 
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 04fd726..4154fdc 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -88,6 +88,9 @@
           .scratchVar ??
       (throw 'Scratch variable is not declared in ${_currentFrame.function}'));
 
+  int get returnVarIndexInFrame => getVarIndexInFrame(_currentFrame.returnVar ??
+      (throw 'Return variable is not declared in ${_currentFrame.function}'));
+
   int get functionTypeArgsVarIndexInFrame => getVarIndexInFrame(_currentFrame
           .functionTypeArgsVar ??
       (throw 'FunctionTypeArgs variable is not declared in ${_currentFrame.function}'));
@@ -189,18 +192,17 @@
   bool get isAllocated => index != null;
 
   void capture() {
-    if (!isCaptured) {
-      assert(!isAllocated);
-      // TODO(alexmarkov): Consider sharing context between scopes.
-      index = scope.contextSize++;
-      isCaptured = true;
-    }
+    assert(!isAllocated);
+    isCaptured = true;
   }
+
+  String toString() => 'var ${declaration.name}';
 }
 
 class Frame {
   final TreeNode function;
   final Frame parent;
+  Scope topScope;
 
   int numParameters = 0;
   int numTypeArguments = 0;
@@ -215,6 +217,7 @@
   VariableDeclaration closureVar;
   VariableDeclaration contextVar;
   VariableDeclaration scratchVar;
+  VariableDeclaration returnVar;
   Map<String, VariableDeclaration> syntheticVars;
   int frameSize = 0;
   List<int> temporaries = <int>[];
@@ -230,14 +233,18 @@
 class Scope {
   final Scope parent;
   final Frame frame;
+  final int loopDepth;
   final List<VarDesc> vars = <VarDesc>[];
 
   int localsUsed;
   int tempsUsed;
+
+  Scope contextOwner;
+  int contextUsed = 0;
   int contextSize = 0;
   int contextLevel;
 
-  Scope(this.parent, this.frame);
+  Scope(this.parent, this.frame, this.loopDepth);
 
   bool get hasContext => contextSize > 0;
 }
@@ -249,6 +256,7 @@
   Frame _currentFrame;
   List<TreeNode> _enclosingTryBlocks;
   List<TreeNode> _enclosingTryCatches;
+  int _loopDepth;
 
   _ScopeBuilder(this.locals);
 
@@ -259,12 +267,14 @@
   }
 
   void _visitFunction(TreeNode node) {
-    _enterFrame(node);
-
     final savedEnclosingTryBlocks = _enclosingTryBlocks;
     _enclosingTryBlocks = <TreeNode>[];
     final savedEnclosingTryCatches = _enclosingTryCatches;
     _enclosingTryCatches = <TreeNode>[];
+    final saveLoopDepth = _loopDepth;
+    _loopDepth = 0;
+
+    _enterFrame(node);
 
     if (node is Field) {
       node.initializer.accept(this);
@@ -351,15 +361,17 @@
       _declareVariable(_currentFrame.scratchVar);
     }
 
+    _leaveFrame();
+
     _enclosingTryBlocks = savedEnclosingTryBlocks;
     _enclosingTryCatches = savedEnclosingTryCatches;
-
-    _leaveFrame();
+    _loopDepth = saveLoopDepth;
   }
 
   _enterFrame(TreeNode node) {
     _currentFrame = new Frame(node, _currentFrame);
     _enterScope(node);
+    _currentFrame.topScope = _currentScope;
   }
 
   _leaveFrame() {
@@ -368,7 +380,7 @@
   }
 
   void _enterScope(TreeNode node) {
-    _currentScope = new Scope(_currentScope, _currentFrame);
+    _currentScope = new Scope(_currentScope, _currentFrame, _loopDepth);
     assert(locals._scopes[node] == null);
     locals._scopes[node] = _currentScope;
   }
@@ -377,8 +389,11 @@
     _currentScope = _currentScope.parent;
   }
 
-  void _declareVariable(VariableDeclaration variable) {
-    final VarDesc v = new VarDesc(variable, _currentScope);
+  void _declareVariable(VariableDeclaration variable, [Scope scope]) {
+    if (scope == null) {
+      scope = _currentScope;
+    }
+    final VarDesc v = new VarDesc(variable, scope);
     assert(locals._vars[variable] == null);
     locals._vars[variable] = v;
   }
@@ -408,6 +423,7 @@
         _currentFrame.closureVar,
         _currentFrame.contextVar,
         _currentFrame.scratchVar,
+        _currentFrame.returnVar,
       ]);
     transient.addAll((_currentFrame.function as FunctionDeclaration)
         .function
@@ -547,7 +563,9 @@
 
   @override
   visitForStatement(ForStatement node) {
+    ++_loopDepth;
     _visitWithScope(node);
+    --_loopDepth;
   }
 
   @override
@@ -557,15 +575,17 @@
     VariableDeclaration iteratorVar;
     if (_currentFrame.isSyncYielding) {
       // Declare a variable to hold 'iterator' so it could be captured.
-      iteratorVar = new VariableDeclaration(null);
+      iteratorVar = new VariableDeclaration(':iterator');
       _declareVariable(iteratorVar);
       locals._capturedIteratorVars[node] = iteratorVar;
     }
 
+    ++_loopDepth;
     _enterScope(node);
     node.variable.accept(this);
     node.body.accept(this);
     _leaveScope();
+    --_loopDepth;
 
     if (_currentFrame.isSyncYielding && !locals.isCaptured(iteratorVar)) {
       // Iterator variable was not captured, as there are no yield points
@@ -617,6 +637,36 @@
     node.finalizer?.accept(this);
     _enclosingTryCatches.removeLast();
   }
+
+  @override
+  visitReturnStatement(ReturnStatement node) {
+    // If returning from within a try-finally block, need to allocate
+    // an extra variable to hold a return value.
+    // Return value can't be kept on the stack as try-catch statements
+    // inside finally can zap expression stack.
+    // Literals (including implicit 'null' in 'return;') do not require
+    // an extra variable as they can be generated after all finally blocks.
+    if (_enclosingTryBlocks.isNotEmpty &&
+        (node.expression != null && node.expression is! BasicLiteral)) {
+      _currentFrame.returnVar = new VariableDeclaration(':return');
+      _declareVariable(_currentFrame.returnVar, _currentFrame.topScope);
+    }
+    node.visitChildren(this);
+  }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    ++_loopDepth;
+    node.visitChildren(this);
+    --_loopDepth;
+  }
+
+  @override
+  visitDoStatement(DoStatement node) {
+    ++_loopDepth;
+    node.visitChildren(this);
+    --_loopDepth;
+  }
 }
 
 class _Allocator extends RecursiveVisitor<Null> {
@@ -624,7 +674,6 @@
 
   Scope _currentScope;
   Frame _currentFrame;
-  int _contextLevel = 0;
 
   _Allocator(this.locals);
 
@@ -639,6 +688,20 @@
 
       if (_currentScope.parent != null) {
         _currentFrame.contextLevelAtEntry = _currentScope.parent.contextLevel;
+
+        if (_currentFrame.isSyncYielding) {
+          // _Closure._clone(), which is used to clone sync-yielding closures
+          // only clones 1 level of a context. So parent frame of a
+          // sync-yielding closure should have exactly 1 context level.
+          final parentFrame = _currentFrame.parent;
+          final currentLevel = _currentFrame.contextLevelAtEntry;
+          final parentLevel = parentFrame.contextLevelAtEntry ?? -1;
+          if (currentLevel != parentLevel + 1) {
+            throw 'Unexpected context allocation in ${parentFrame.function}\n'
+                ' - context level at parent entry: ${parentLevel}\n'
+                ' - context level at synthetic closure entry: ${currentLevel}\n';
+          }
+        }
       }
 
       _currentScope.localsUsed = 0;
@@ -648,17 +711,43 @@
       _currentScope.tempsUsed = _currentScope.parent.tempsUsed;
     }
 
-    if (_currentScope.parent == null || _currentScope.hasContext) {
-      _currentScope.contextLevel = _contextLevel++;
+    assert(_currentScope.contextOwner == null);
+    assert(_currentScope.contextLevel == null);
+
+    final int parentContextLevel =
+        _currentScope.parent != null ? _currentScope.parent.contextLevel : -1;
+
+    final int numCaptured =
+        _currentScope.vars.where((v) => v.isCaptured).length;
+    if (numCaptured > 0) {
+      // Share contexts between scopes which belong to the same frame and
+      // have the same loop depth.
+      _currentScope.contextOwner = _currentScope;
+      for (Scope contextOwner = _currentScope;
+          contextOwner != null &&
+              contextOwner.frame == _currentScope.frame &&
+              contextOwner.loopDepth == _currentScope.loopDepth;
+          contextOwner = contextOwner.parent) {
+        if (contextOwner.hasContext) {
+          _currentScope.contextOwner = contextOwner;
+          break;
+        }
+      }
+
+      _currentScope.contextOwner.contextSize += numCaptured;
+
+      if (_currentScope.contextOwner == _currentScope) {
+        _currentScope.contextLevel = parentContextLevel + 1;
+      } else {
+        _currentScope.contextLevel = _currentScope.contextOwner.contextLevel;
+      }
     } else {
-      _currentScope.contextLevel = _currentScope.parent.contextLevel;
+      _currentScope.contextLevel = parentContextLevel;
     }
   }
 
   void _leaveScope() {
-    if (_currentScope.hasContext) {
-      --_contextLevel;
-    }
+    assert(_currentScope.contextUsed == _currentScope.contextSize);
 
     _currentScope = _currentScope.parent;
     _currentFrame = _currentScope?.frame;
@@ -712,15 +801,16 @@
 
   void _allocateVariable(VariableDeclaration variable, {int paramSlotIndex}) {
     final VarDesc v = locals._getVarDesc(variable);
-    if (v.isCaptured) {
-      assert(v.isAllocated);
-      v.originalParamSlotIndex = paramSlotIndex;
-      return;
-    }
 
     assert(!v.isAllocated);
     assert(v.scope == _currentScope);
 
+    if (v.isCaptured) {
+      v.index = _currentScope.contextOwner.contextUsed++;
+      v.originalParamSlotIndex = paramSlotIndex;
+      return;
+    }
+
     if (paramSlotIndex != null) {
       assert(paramSlotIndex < 0 ||
           (_currentFrame.hasOptionalParameters &&
@@ -768,7 +858,8 @@
         function.namedParameters.isNotEmpty;
 
     _currentFrame.hasCapturedParameters =
-        (hasReceiver && locals.isCaptured(_currentFrame.receiverVar)) ||
+        (isFactory && locals.isCaptured(_currentFrame.factoryTypeArgsVar)) ||
+            (hasReceiver && locals.isCaptured(_currentFrame.receiverVar)) ||
             function.positionalParameters.any(locals.isCaptured) ||
             function.namedParameters.any(locals.isCaptured);
 
@@ -801,6 +892,7 @@
     _ensureVariableAllocated(_currentFrame.functionTypeArgsVar);
     _ensureVariableAllocated(_currentFrame.contextVar);
     _ensureVariableAllocated(_currentFrame.scratchVar);
+    _ensureVariableAllocated(_currentFrame.returnVar);
   }
 
   void _visitFunction(TreeNode node) {
@@ -898,6 +990,7 @@
   @override
   visitForInStatement(ForInStatement node) {
     _allocateTemp(node);
+    _ensureVariableAllocated(locals._capturedIteratorVars[node]);
 
     node.iterable.accept(this);
 
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index f52a72a..8238343 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -56,6 +56,8 @@
         combined[library.importUri] = library;
       }
     }
+
+    // TODO(vegorov) this needs to merge metadata repositories from deltas.
     return new Component(libraries: combined.values.toList())
       ..mainMethod = mainMethod;
   }
diff --git a/pkg/vm/lib/metadata/call_site_attributes.dart b/pkg/vm/lib/metadata/call_site_attributes.dart
new file mode 100644
index 0000000..2a9fc03
--- /dev/null
+++ b/pkg/vm/lib/metadata/call_site_attributes.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.metadata.call_site_attributes;
+
+import 'package:kernel/ast.dart';
+
+/// Metadata for annotating call sites with various attributes.
+class CallSiteAttributesMetadata {
+  final DartType receiverType;
+
+  const CallSiteAttributesMetadata({this.receiverType});
+
+  @override
+  String toString() => "receiverType:$receiverType";
+}
+
+/// Repository for [CallSiteAttributesMetadata].
+class CallSiteAttributesMetadataRepository
+    extends MetadataRepository<CallSiteAttributesMetadata> {
+  static final repositoryTag = 'vm.call-site-attributes.metadata';
+
+  @override
+  final String tag = repositoryTag;
+
+  @override
+  final Map<TreeNode, CallSiteAttributesMetadata> mapping =
+      <TreeNode, CallSiteAttributesMetadata>{};
+
+  @override
+  void writeToBinary(
+      CallSiteAttributesMetadata metadata, Node node, BinarySink sink) {
+    sink.writeDartType(metadata.receiverType);
+  }
+
+  @override
+  CallSiteAttributesMetadata readFromBinary(Node node, BinarySource source) {
+    final type = source.readDartType();
+    return new CallSiteAttributesMetadata(receiverType: type);
+  }
+}
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 71eb1caf..0889b46 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -14,6 +14,8 @@
 import 'package:kernel/transformations/continuation.dart' as transformAsync
     show transformLibraries, transformProcedure;
 
+import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
+
 /// Specializes the kernel IR to the Dart VM.
 class VmTarget extends Target {
   final TargetFlags flags;
@@ -56,7 +58,7 @@
       ];
 
   @override
-  void performModularTransformationsOnLibraries(
+  void performModularTransformationsOnLibraries(Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
       {void logger(String msg)}) {
     transformMixins.transformLibraries(this, coreTypes, hierarchy, libraries,
@@ -66,11 +68,11 @@
     // TODO(kmillikin): Make this run on a per-method basis.
     transformAsync.transformLibraries(coreTypes, libraries, flags.syncAsync);
     logger?.call("Transformed async methods");
-  }
 
-  @override
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
-      {void logger(String msg)}) {}
+    callSiteAnnotator.transformLibraries(
+        component, libraries, coreTypes, hierarchy);
+    logger?.call("Annotated call sites");
+  }
 
   @override
   void performTransformationsOnProcedure(
@@ -284,4 +286,10 @@
 
   @override
   bool get nativeExtensionExpectsString => true;
+
+  @override
+  Component configureComponent(Component component) {
+    callSiteAnnotator.addRepositoryTo(component);
+    return super.configureComponent(component);
+  }
 }
diff --git a/pkg/vm/lib/transformations/call_site_annotator.dart b/pkg/vm/lib/transformations/call_site_annotator.dart
new file mode 100644
index 0000000..dd87e57
--- /dev/null
+++ b/pkg/vm/lib/transformations/call_site_annotator.dart
@@ -0,0 +1,88 @@
+// 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.
+
+// This transformation annotates call sites with the receiver type.
+// This is done to avoid reimplementing [Expression.getStaticType] in
+// C++.
+// We don't annotate all call-sites, but only those where VM could benefit from
+// knowing static type of the receiver.
+library vm.transformations.call_site_annotator;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import '../metadata/call_site_attributes.dart';
+
+CallSiteAttributesMetadataRepository addRepositoryTo(Component component) {
+  return component.metadata.putIfAbsent(
+      CallSiteAttributesMetadataRepository.repositoryTag,
+      () => new CallSiteAttributesMetadataRepository());
+}
+
+void transformLibraries(Component component, List<Library> libraries,
+    CoreTypes coreTypes, ClassHierarchy hierarchy) {
+  final transformer =
+      new AnnotateWithStaticTypes(component, coreTypes, hierarchy);
+  libraries.forEach(transformer.visitLibrary);
+}
+
+class AnnotateWithStaticTypes extends RecursiveVisitor<Null> {
+  final CallSiteAttributesMetadataRepository _metadata;
+  final TypeEnvironment env;
+
+  AnnotateWithStaticTypes(
+      Component component, CoreTypes coreTypes, ClassHierarchy hierarchy)
+      : _metadata = addRepositoryTo(component),
+        env = new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
+
+  @override
+  visitProcedure(Procedure proc) {
+    if (!proc.isStatic) {
+      env.thisType = proc.enclosingClass?.thisType;
+    }
+    super.visitProcedure(proc);
+    env.thisType = null;
+  }
+
+  @override
+  visitConstructor(Constructor proc) {
+    env.thisType = proc.enclosingClass?.thisType;
+    super.visitConstructor(proc);
+    env.thisType = null;
+  }
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    super.visitMethodInvocation(node);
+
+    if (shouldAnnotate(node)) {
+      _metadata.mapping[node] = new CallSiteAttributesMetadata(
+          receiverType: node.receiver.getStaticType(env));
+    }
+  }
+
+  // TODO(vegorov) handle setters as well.
+  static bool shouldAnnotate(MethodInvocation node) =>
+      node.interfaceTarget != null &&
+      hasGenericCovariantParameters(node.interfaceTarget);
+
+  /// Return [true] if the given list of [VariableDeclaration] contains
+  /// any annotated with generic-covariant-impl.
+  static bool containsGenericCovariantImpl(List<VariableDeclaration> decls) =>
+      decls.any((p) => p.isGenericCovariantImpl);
+
+  /// Returns [true] if the given [member] has any parameters annotated with
+  /// generic-covariant-impl attribute.
+  static bool hasGenericCovariantParameters(Member member) {
+    if (member is Procedure) {
+      return containsGenericCovariantImpl(
+              member.function.positionalParameters) ||
+          containsGenericCovariantImpl(member.function.namedParameters);
+    }
+
+    return false;
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 86e50c6..c3bbf2d 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -31,6 +31,9 @@
 
 enum PragmaEntryPointType { Always, GetterOnly, SetterOnly }
 
+const kEntryPointPragmaName = "vm:entry-point";
+const kNativeMethodPragmaName = "vm:native-method";
+
 abstract class EntryPointsAnnotationMatcher {
   PragmaEntryPointType annotationsDefineRoot(List<Expression> annotations);
 }
@@ -47,7 +50,7 @@
     Constant name = constant.fieldValues[coreTypes.pragmaName.reference];
     assertx(name != null);
     if (name is! StringConstant ||
-        (name as StringConstant).value != "vm.entry-point") {
+        (name as StringConstant).value != kEntryPointPragmaName) {
       return null;
     }
 
@@ -63,7 +66,7 @@
       } else if (options.value == "set") {
         return PragmaEntryPointType.SetterOnly;
       } else {
-        throw "Error: string directive to @pragma('vm.entry-point', ...) must be either 'get' or 'set'.";
+        throw "Error: string directive to @pragma('$kEntryPointPragmaName', ...) must be either 'get' or 'set'.";
       }
     }
     return null;
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 16e6dad..5011141 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -15,12 +15,15 @@
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart';
+import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 import 'package:web_socket_channel/io.dart';
 
 import 'package:vm/incremental_compiler.dart';
 import 'package:vm/target/vm.dart';
 
+import 'common_test_utils.dart';
+
 main() {
   final platformKernel =
       computePlatformBinariesLocation().resolve('vm_platform_strong.dill');
@@ -56,6 +59,170 @@
     });
   });
 
+  group('multiple kernels', () {
+    Directory mytest;
+    File main;
+    File lib;
+    setUpAll(() {
+      mytest = Directory.systemTemp.createTempSync('incremental');
+      main = new File('${mytest.path}/main.dart')..createSync();
+      main.writeAsStringSync("import 'lib.dart'; main() => print(foo()); \n");
+      lib = new File('${mytest.path}/lib.dart')..createSync();
+      lib.writeAsStringSync("foo() => 'foo'; main() => print('bar');\n");
+    });
+
+    tearDownAll(() {
+      try {
+        mytest.deleteSync(recursive: true);
+      } catch (_) {
+        // Ignore errors;
+      }
+    });
+
+    compileAndSerialize(
+        File mainDill, File libDill, IncrementalCompiler compiler) async {
+      Component component = await compiler.compile();
+      new BinaryPrinter(new DevNullSink<List<int>>())
+          .writeComponentFile(component);
+      IOSink sink = mainDill.openWrite();
+      BinaryPrinter printer = new LimitedBinaryPrinter(
+          sink,
+          (lib) => lib.fileUri.path.endsWith("main.dart"),
+          false /* excludeUriToSource */);
+      printer.writeComponentFile(component);
+      await sink.flush();
+      await sink.close();
+      sink = libDill.openWrite();
+      printer = new LimitedBinaryPrinter(
+          sink,
+          (lib) => lib.fileUri.path.endsWith("lib.dart"),
+          false /* excludeUriToSource */);
+      printer.writeComponentFile(component);
+      await sink.flush();
+      await sink.close();
+    }
+
+    test('main first, lib second', () async {
+      Directory dir = mytest.createTempSync();
+      File mainDill = File(p.join(dir.path, p.basename(main.path + ".dill")));
+      File libDill = File(p.join(dir.path, p.basename(lib.path + ".dill")));
+      IncrementalCompiler compiler = new IncrementalCompiler(options, main.uri);
+      await compileAndSerialize(mainDill, libDill, compiler);
+
+      var list = new File(p.join(dir.path, 'myMain.dilllist'))..createSync();
+      list.writeAsStringSync("#@dill\n${mainDill.path}\n${libDill.path}\n");
+      var vm =
+          await Process.start(Platform.resolvedExecutable, <String>[list.path]);
+
+      final splitter = new LineSplitter();
+      Completer<String> portLineCompleter = new Completer<String>();
+      vm.stdout.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stdout: $s");
+        if (!portLineCompleter.isCompleted) {
+          portLineCompleter.complete(s);
+        }
+      });
+      vm.stderr.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stderr: $s");
+      });
+      expect(await portLineCompleter.future, equals('foo'));
+      print("Compiler terminated with ${await vm.exitCode} exit code");
+    });
+
+    test('main second, lib first', () async {
+      Directory dir = mytest.createTempSync();
+      File mainDill = File(p.join(dir.path, p.basename(main.path + ".dill")));
+      File libDill = File(p.join(dir.path, p.basename(lib.path + ".dill")));
+      IncrementalCompiler compiler = new IncrementalCompiler(options, lib.uri);
+      await compileAndSerialize(mainDill, libDill, compiler);
+
+      var list = new File(p.join(dir.path, 'myMain.dilllist'))..createSync();
+      list.writeAsStringSync("#@dill\n${libDill.path}\n${mainDill.path}\n");
+      var vm =
+          await Process.start(Platform.resolvedExecutable, <String>[list.path]);
+
+      final splitter = new LineSplitter();
+
+      Completer<String> portLineCompleter = new Completer<String>();
+      vm.stdout.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stdout: $s");
+        if (!portLineCompleter.isCompleted) {
+          portLineCompleter.complete(s);
+        }
+      });
+      vm.stderr.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stderr: $s");
+      });
+      expect(await portLineCompleter.future, equals('bar'));
+      print("Compiler terminated with ${await vm.exitCode} exit code");
+    });
+
+    test('empty list', () async {
+      var list = new File(p.join(mytest.path, 'myMain.dilllist'))..createSync();
+      list.writeAsStringSync("#@dill\n");
+      var vm =
+          await Process.start(Platform.resolvedExecutable, <String>[list.path]);
+
+      Completer<int> exitCodeCompleter = new Completer<int>();
+      vm.exitCode.then((exitCode) {
+        print("Compiler terminated with $exitCode exit code");
+        exitCodeCompleter.complete(exitCode);
+      });
+      expect(await exitCodeCompleter.future, equals(254));
+    });
+
+    test('fallback to source compilation if fail to load', () async {
+      var list = new File('${mytest.path}/myMain.dilllist')..createSync();
+      list.writeAsStringSync("main() => print('baz');\n");
+      var vm =
+          await Process.start(Platform.resolvedExecutable, <String>[list.path]);
+
+      final splitter = new LineSplitter();
+
+      Completer<String> portLineCompleter = new Completer<String>();
+      vm.stdout.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stdout: $s");
+        if (!portLineCompleter.isCompleted) {
+          portLineCompleter.complete(s);
+        }
+      });
+      vm.stderr.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stderr: $s");
+      });
+      expect(await portLineCompleter.future, equals('baz'));
+      print("Compiler terminated with ${await vm.exitCode} exit code");
+    });
+
+    test('relative paths', () async {
+      Directory dir = mytest.createTempSync();
+      File mainDill = File(p.join(dir.path, p.basename(main.path + ".dill")));
+      File libDill = File(p.join(dir.path, p.basename(lib.path + ".dill")));
+      IncrementalCompiler compiler = new IncrementalCompiler(options, main.uri);
+      await compileAndSerialize(mainDill, libDill, compiler);
+
+      var list = new File(p.join(dir.path, 'myMain.dilllist'))..createSync();
+      list.writeAsStringSync("#@dill\n../main.dart.dill\n../lib.dart.dill\n");
+      Directory runFrom = new Directory(dir.path + "/runFrom")..createSync();
+      var vm = await Process.start(
+          Platform.resolvedExecutable, <String>[list.path],
+          workingDirectory: runFrom.path);
+
+      final splitter = new LineSplitter();
+      Completer<String> portLineCompleter = new Completer<String>();
+      vm.stdout.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stdout: $s");
+        if (!portLineCompleter.isCompleted) {
+          portLineCompleter.complete(s);
+        }
+      });
+      vm.stderr.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stderr: $s");
+      });
+      expect(await portLineCompleter.future, equals('foo'));
+      print("Compiler terminated with ${await vm.exitCode} exit code");
+    });
+  });
+
   group('reload', () {
     test('picks up after rejected delta', () async {
       var systemTempDir = Directory.systemTemp;
@@ -87,7 +254,7 @@
         '--pause_isolates_on_start',
         outputFile.path
       ];
-      final vm = await Process.start(Platform.executable, vmArgs);
+      final vm = await Process.start(Platform.resolvedExecutable, vmArgs);
 
       final splitter = new LineSplitter();
 
@@ -154,6 +321,7 @@
   final BinaryPrinter printer = new LimitedBinaryPrinter(
       sink, (_) => true /* predicate */, false /* excludeUriToSource */);
   printer.writeComponentFile(component);
+  await sink.flush();
   await sink.close();
 }
 
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index 7e5c13b..354d191 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -39,7 +39,7 @@
     }
 
     var argument = annotation.arguments.positional[0];
-    return argument is StringLiteral && argument.value == "vm.entry-point";
+    return argument is StringLiteral && argument.value == kEntryPointPragmaName;
   }
 
   @override
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index b08838d..79176de 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -77,30 +77,29 @@
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       5
   StoreLocal           r5
   PushConstant         CP#10
   IfNeStrictNumTOS
   Jump                 L1
   Push                 r4
   Push                 r4
-  StoreContextVar      2
+  StoreContextVar      7
 Try #0 start:
   Push                 r4
   PushConstant         CP#12
-  StoreContextVar      0
+  StoreContextVar      5
   Push                 r4
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      6
   Push                 r4
-  LoadContextParent
   LoadContextVar       0
   Push                 r4
   LoadContextVar       3
   Push                 r4
   LoadContextVar       4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#14
   IndirectStaticCall   4, CP#13
   PopLocal             r8
@@ -116,9 +115,9 @@
   Push                 r1
   Drop1
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       1
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       2
   PushConstant         CP#16
   IndirectStaticCall   2, CP#15
   Drop1
@@ -127,11 +126,12 @@
   Jump                 L3
 Try #0 end:
 Try #0 handler:
+  SetFrame             10
   Push                 r0
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       7
   PopLocal             r4
   MoveSpecial          r6, exception
   MoveSpecial          r7, stackTrace
@@ -140,7 +140,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       1
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#19
@@ -151,7 +151,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       6
   PopLocal             r4
   Jump                 L4
 
@@ -163,11 +163,7 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
+  AllocateContext      9
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
@@ -179,20 +175,14 @@
   PushConstant         CP#5
   AssertAssignable     0, CP#6
   Drop1
-  AllocateContext      8
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#7
   PushConstant         CP#9
   IndirectStaticCall   1, CP#8
-  StoreContextVar      6
+  StoreContextVar      1
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      7
+  StoreContextVar      2
   PushConstant         CP#3
   PopLocal             r2
   Push                 r0
@@ -203,13 +193,13 @@
   StoreContextVar      4
   Push                 r0
   PushConstant         CP#10
-  StoreContextVar      0
+  StoreContextVar      5
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      1
+  StoreContextVar      6
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      2
+  StoreContextVar      7
   Push                 r0
   Allocate             CP#21
   StoreLocal           r3
@@ -228,37 +218,34 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
-  StoreContextVar      5
+  StoreContextVar      8
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#31
   IndirectStaticCall   1, CP#8
   PopLocal             r2
   Push                 r0
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#32
   IndirectStaticCall   1, CP#8
   StoreContextVar      3
   Push                 r0
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#33
   IndirectStaticCall   1, CP#8
   StoreContextVar      4
   PushConstant         CP#34
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#35
   IndirectStaticCall   2, CP#15
   Drop1
   Push                 r0
-  LoadContextVar       6
+  LoadContextVar       1
   InstanceCall         1, CP#36
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#3
   ReturnTOS
 
@@ -296,19 +283,15 @@
   Entry                7
   CheckStack
   AllocateContext      4
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
   PopLocal             r0
   Push                 r0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
-  StoreContextVar      3
+  StoreContextVar      0
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      2
+  StoreContextVar      1
   PushConstant         CP#3
   PopLocal             r2
   PushConstant         CP#3
@@ -317,10 +300,10 @@
   PopLocal             r4
   Push                 r0
   PushConstant         CP#4
-  StoreContextVar      0
+  StoreContextVar      2
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      1
+  StoreContextVar      3
   Allocate             CP#15
   StoreLocal           r6
   Push                 r6
@@ -357,7 +340,7 @@
   IndirectStaticCall   2, CP#9
   Drop1
   Push                 r0
-  LoadContextVar       3
+  LoadContextVar       0
   InstanceCall         1, CP#30
   ReturnTOS
   Push                 r0
@@ -410,7 +393,7 @@
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       2
   StoreLocal           r5
   PushConstant         CP#4
   IfNeStrictNumTOS
@@ -420,13 +403,13 @@
 Try #0 start:
   Push                 r4
   PushConstant         CP#8
-  StoreContextVar      2
+  StoreContextVar      1
   Jump                 L2
 L2:
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       0
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       1
   PushConstant         CP#10
   IndirectStaticCall   2, CP#9
   Drop1
@@ -435,6 +418,7 @@
   Jump                 L3
 Try #0 end:
 Try #0 handler:
+  SetFrame             10
   Push                 r6
   PopLocal             r4
   MoveSpecial          r6, exception
@@ -444,7 +428,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       0
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#13
@@ -488,7 +472,7 @@
 Bytecode {
   Entry                4
   CheckStack
-  AllocateContext      2
+  AllocateContext      11
   PopLocal             r0
   Push                 r0
   Push                 FP[-6]
@@ -496,41 +480,35 @@
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      1
-  AllocateContext      9
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
-  StoreContextVar      8
+  StoreContextVar      2
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      7
+  StoreContextVar      3
   PushConstant         CP#3
   PopLocal             r2
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      3
-  Push                 r0
-  PushConstant         CP#3
   StoreContextVar      4
   Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      5
+  Push                 r0
   PushConstant         CP#4
-  StoreContextVar      0
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      1
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      2
-  Push                 r0
-  PushConstant         CP#3
   StoreContextVar      6
   Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      7
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      8
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      9
+  Push                 r0
   Allocate             CP#20
   StoreLocal           r3
   Push                 r3
@@ -548,37 +526,34 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#6
-  StoreContextVar      5
+  StoreContextVar      10
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       10
   PushConstant         CP#30
   IndirectStaticCall   1, CP#1
   PopLocal             r2
   Push                 r0
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       10
   PushConstant         CP#31
   IndirectStaticCall   1, CP#1
-  StoreContextVar      3
+  StoreContextVar      4
   Push                 r0
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       10
   PushConstant         CP#32
   IndirectStaticCall   1, CP#1
-  StoreContextVar      4
+  StoreContextVar      5
   PushConstant         CP#33
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       10
   PushConstant         CP#34
   IndirectStaticCall   2, CP#13
   Drop1
   Push                 r0
-  LoadContextVar       8
+  LoadContextVar       2
   InstanceCall         1, CP#35
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -631,30 +606,29 @@
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       6
   StoreLocal           r5
   PushConstant         CP#4
   IfNeStrictNumTOS
   Jump                 L1
   Push                 r4
   Push                 r4
-  StoreContextVar      2
+  StoreContextVar      8
 Try #0 start:
   Push                 r4
   PushConstant         CP#8
-  StoreContextVar      0
+  StoreContextVar      6
   Push                 r4
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      7
   Push                 r4
-  LoadContextParent
   LoadContextVar       0
   Push                 r4
-  LoadContextVar       3
-  Push                 r4
   LoadContextVar       4
   Push                 r4
   LoadContextVar       5
+  Push                 r4
+  LoadContextVar       10
   PushConstant         CP#10
   IndirectStaticCall   4, CP#9
   PopLocal             r8
@@ -669,22 +643,21 @@
 L2:
   Push                 r4
   Push                 r1
-  StoreContextVar      6
+  StoreContextVar      9
   Push                 r4
   PushConstant         CP#11
-  StoreContextVar      0
+  StoreContextVar      6
   Push                 r4
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      7
   Push                 r4
-  LoadContextParent
   LoadContextVar       1
   Push                 r4
-  LoadContextVar       3
-  Push                 r4
   LoadContextVar       4
   Push                 r4
   LoadContextVar       5
+  Push                 r4
+  LoadContextVar       10
   PushConstant         CP#12
   IndirectStaticCall   4, CP#9
   PopLocal             r9
@@ -699,16 +672,16 @@
 L3:
   Push                 r4
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       9
   Push                 r1
   InstanceCall         2, CP#14
-  StoreContextVar      7
+  StoreContextVar      3
   Jump                 L4
 L4:
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       2
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       3
   PushConstant         CP#15
   IndirectStaticCall   2, CP#13
   Drop1
@@ -717,11 +690,12 @@
   Jump                 L5
 Try #0 end:
 Try #0 handler:
+  SetFrame             10
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       8
   PopLocal             r4
   MoveSpecial          r6, exception
   MoveSpecial          r7, stackTrace
@@ -730,7 +704,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       2
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#18
@@ -741,7 +715,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       7
   PopLocal             r4
   Push                 r5
   PushConstant         CP#8
@@ -786,48 +760,42 @@
 Bytecode {
   Entry                4
   CheckStack
-  AllocateContext      1
+  AllocateContext      11
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      0
-  AllocateContext      10
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
-  StoreContextVar      9
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      8
-  PushConstant         CP#3
-  PopLocal             r2
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      5
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      6
-  Push                 r0
-  PushConstant         CP#4
-  StoreContextVar      0
-  Push                 r0
-  PushConstant         CP#3
   StoreContextVar      1
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      4
+  StoreContextVar      2
+  PushConstant         CP#3
+  PopLocal             r2
   Push                 r0
   PushConstant         CP#3
   StoreContextVar      3
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      2
+  StoreContextVar      4
+  Push                 r0
+  PushConstant         CP#4
+  StoreContextVar      5
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      6
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      7
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      8
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      9
   Push                 r0
   Allocate             CP#32
   StoreLocal           r3
@@ -846,37 +814,34 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#6
-  StoreContextVar      7
+  StoreContextVar      10
   Push                 r0
-  LoadContextVar       7
+  LoadContextVar       10
   PushConstant         CP#42
   IndirectStaticCall   1, CP#1
   PopLocal             r2
   Push                 r0
   Push                 r0
-  LoadContextVar       7
+  LoadContextVar       10
   PushConstant         CP#43
   IndirectStaticCall   1, CP#1
-  StoreContextVar      5
+  StoreContextVar      3
   Push                 r0
   Push                 r0
-  LoadContextVar       7
+  LoadContextVar       10
   PushConstant         CP#44
   IndirectStaticCall   1, CP#1
-  StoreContextVar      6
+  StoreContextVar      4
   PushConstant         CP#45
   Push                 r0
-  LoadContextVar       7
+  LoadContextVar       10
   PushConstant         CP#46
   IndirectStaticCall   2, CP#9
   Drop1
   Push                 r0
-  LoadContextVar       9
+  LoadContextVar       1
   InstanceCall         1, CP#47
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -941,14 +906,14 @@
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       5
   StoreLocal           r5
   PushConstant         CP#4
   IfNeStrictNumTOS
   Jump                 L1
   Push                 r4
   Push                 r4
-  StoreContextVar      4
+  StoreContextVar      7
 Try #0 start:
   AllocateContext      1
   StoreLocal           r5
@@ -959,7 +924,7 @@
   Push                 r4
   PushConstant         CP#4
   StoreContextVar      0
-  AllocateContext      1
+  AllocateContext      2
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -978,15 +943,7 @@
   PushConstant         CP#11
   IfNeStrictTOS
   Jump                 L2
-  AllocateContext      1
-  StoreLocal           r5
-  Push                 r5
   Push                 r4
-  StoreContextParent
-  PopLocal             r4
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
   LoadContextParent
   LoadContextParent
   LoadContextVar       0
@@ -994,11 +951,11 @@
   PopLocal             r8
   Push                 r4
   Push                 r8
-  StoreContextVar      0
+  StoreContextVar      1
 L5:
   CheckStack
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       1
   StoreLocal           r8
   InstanceCall         1, CP#13
   PushConstant         CP#11
@@ -1018,60 +975,51 @@
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextParent
   LoadContextVar       0
-  StoreContextVar      2
+  StoreContextVar      9
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
   Push                 r4
   LoadContextParent
-  LoadContextParent
   LoadContextVar       0
   Push                 r4
   LoadContextVar       0
   InstanceCall         2, CP#15
-  StoreContextVar      3
+  StoreContextVar      8
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
   PushConstant         CP#16
-  StoreContextVar      0
+  StoreContextVar      5
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      6
   PushConstant         CP#18
   IndirectStaticCall   0, CP#17
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       3
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       4
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       7
+  LoadContextVar       10
   PushConstant         CP#20
   IndirectStaticCall   4, CP#19
   PopLocal             r10
@@ -1087,19 +1035,16 @@
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextParent
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       9
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       3
+  LoadContextVar       8
   Push                 r1
   InstanceCall         2, CP#21
   InstanceCall         2, CP#22
@@ -1110,9 +1055,6 @@
   Jump                 L5
 L3:
   Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Push                 r4
   CloneContext
   PopLocal             r4
   Push                 r4
@@ -1157,7 +1099,7 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      8
+  StoreContextVar      2
   Push                 r4
   LoadContextParent
   PopLocal             r4
@@ -1167,9 +1109,9 @@
   PopLocal             r4
 L9:
   Push                 r4
-  LoadContextVar       9
+  LoadContextVar       1
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       2
   PushConstant         CP#27
   IndirectStaticCall   2, CP#9
   Drop1
@@ -1178,11 +1120,12 @@
   Jump                 L10
 Try #0 end:
 Try #0 handler:
+  SetFrame             11
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       7
   PopLocal             r4
   MoveSpecial          r6, exception
   MoveSpecial          r7, stackTrace
@@ -1191,7 +1134,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       9
+  LoadContextVar       1
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#30
@@ -1202,7 +1145,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       6
   PopLocal             r4
   Jump                 L11
 
@@ -1253,7 +1196,7 @@
 Bytecode {
   Entry                4
   CheckStack
-  AllocateContext      3
+  AllocateContext      16
   PopLocal             r0
   Push                 r0
   Push                 FP[-7]
@@ -1264,52 +1207,46 @@
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      2
-  AllocateContext      13
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
-  StoreContextVar      12
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      9
-  PushConstant         CP#3
-  PopLocal             r2
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      6
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      7
-  Push                 r0
-  PushConstant         CP#4
-  StoreContextVar      0
-  Push                 r0
-  PushConstant         CP#3
-  StoreContextVar      1
-  Push                 r0
-  PushConstant         CP#3
   StoreContextVar      3
   Push                 r0
   PushConstant         CP#3
   StoreContextVar      4
+  PushConstant         CP#3
+  PopLocal             r2
   Push                 r0
   PushConstant         CP#3
   StoreContextVar      5
   Push                 r0
   PushConstant         CP#3
+  StoreContextVar      6
+  Push                 r0
+  PushConstant         CP#4
+  StoreContextVar      7
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      8
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      9
+  Push                 r0
+  PushConstant         CP#3
   StoreContextVar      10
   Push                 r0
   PushConstant         CP#3
   StoreContextVar      11
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      2
+  StoreContextVar      12
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      13
+  Push                 r0
+  PushConstant         CP#3
+  StoreContextVar      14
   Push                 r0
   Allocate             CP#38
   StoreLocal           r3
@@ -1328,37 +1265,34 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#6
-  StoreContextVar      8
+  StoreContextVar      15
   Push                 r0
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#48
   IndirectStaticCall   1, CP#1
   PopLocal             r2
   Push                 r0
   Push                 r0
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#49
   IndirectStaticCall   1, CP#1
-  StoreContextVar      6
+  StoreContextVar      5
   Push                 r0
   Push                 r0
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#50
   IndirectStaticCall   1, CP#1
-  StoreContextVar      7
+  StoreContextVar      6
   PushConstant         CP#51
   Push                 r0
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#52
   IndirectStaticCall   2, CP#11
   Drop1
   Push                 r0
-  LoadContextVar       12
+  LoadContextVar       3
   InstanceCall         1, CP#53
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -1429,16 +1363,16 @@
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       7
   StoreLocal           r5
   PushConstant         CP#4
   IfNeStrictNumTOS
   Jump                 L1
   Push                 r4
   Push                 r4
-  StoreContextVar      3
+  StoreContextVar      9
 Try #0 start:
-  AllocateContext      1
+  AllocateContext      2
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -1450,39 +1384,38 @@
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      4
+  StoreContextVar      10
 Try #1 start:
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      5
+  StoreContextVar      11
 Try #2 start:
   Push                 r4
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      2
+  StoreContextVar      14
   Push                 r4
   LoadContextParent
   PushConstant         CP#8
-  StoreContextVar      0
+  StoreContextVar      7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      8
   Push                 r4
   LoadContextParent
-  LoadContextParent
   LoadContextVar       0
   Push                 r4
   LoadContextParent
+  LoadContextVar       5
+  Push                 r4
+  LoadContextParent
   LoadContextVar       6
   Push                 r4
   LoadContextParent
-  LoadContextVar       7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#10
   IndirectStaticCall   4, CP#9
   PopLocal             r13
@@ -1498,40 +1431,35 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       14
   Push                 r1
   InstanceCall         2, CP#12
   StoreContextVar      0
   Jump                 L3
 Try #2 end:
 Try #2 handler:
+  SetFrame             14
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       11
   PopLocal             r4
   MoveSpecial          r10, exception
   MoveSpecial          r11, stackTrace
   Push                 r4
   LoadContextParent
   Push                 r10
-  StoreContextVar      10
+  StoreContextVar      12
   Push                 r4
   LoadContextParent
   Push                 r11
-  StoreContextVar      11
-  AllocateContext      1
-  StoreLocal           r5
-  Push                 r5
-  Push                 r4
-  StoreContextParent
-  PopLocal             r4
+  StoreContextVar      13
   Push                 r4
   Push                 r10
-  StoreContextVar      0
+  StoreContextVar      1
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#3
   PushConstant         CP#3
   PushConstant         CP#14
@@ -1542,45 +1470,35 @@
   Jump                 L4
   Push                 r4
   LoadContextParent
-  LoadContextParent
   PushConstant         CP#17
-  StoreContextVar      9
+  StoreContextVar      4
   Jump                 L5
 L4:
   Push                 r4
   LoadContextParent
-  LoadContextParent
   Push                 r4
-  LoadContextParent
   LoadContextVar       0
-  StoreContextVar      2
+  StoreContextVar      14
   Push                 r4
   LoadContextParent
-  LoadContextParent
   PushConstant         CP#18
-  StoreContextVar      0
+  StoreContextVar      7
   Push                 r4
   LoadContextParent
-  LoadContextParent
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      8
   Push                 r4
   LoadContextParent
-  LoadContextParent
-  LoadContextParent
   LoadContextVar       1
   Push                 r4
   LoadContextParent
+  LoadContextVar       5
+  Push                 r4
   LoadContextParent
   LoadContextVar       6
   Push                 r4
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       7
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#19
   IndirectStaticCall   4, CP#9
   PopLocal             r13
@@ -1594,48 +1512,42 @@
   Throw                1
 L6:
   Push                 r4
-  LoadContextParent
   Push                 r4
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       14
   Push                 r1
   InstanceCall         2, CP#20
   StoreContextVar      0
   Push                 r4
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       10
+  LoadContextVar       12
   Push                 r4
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       11
+  LoadContextVar       13
   Throw                1
   Drop1
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
   Jump                 L3
 L3:
   Jump                 L7
 Try #1 end:
 Try #1 handler:
+  SetFrame             14
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       10
   PopLocal             r4
   MoveSpecial          r8, exception
   MoveSpecial          r9, stackTrace
   Push                 r4
   LoadContextParent
   Push                 r8
-  StoreContextVar      10
+  StoreContextVar      12
   Push                 r4
   LoadContextParent
   Push                 r9
-  StoreContextVar      11
+  StoreContextVar      13
   PushConstant         CP#21
   PushConstant         CP#22
   IndirectStaticCall   1, CP#1
@@ -1644,28 +1556,27 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      2
+  StoreContextVar      14
   Push                 r4
   LoadContextParent
   PushConstant         CP#23
-  StoreContextVar      0
+  StoreContextVar      7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      8
   Push                 r4
   LoadContextParent
-  LoadContextParent
   LoadContextVar       2
   Push                 r4
   LoadContextParent
+  LoadContextVar       5
+  Push                 r4
+  LoadContextParent
   LoadContextVar       6
   Push                 r4
   LoadContextParent
-  LoadContextVar       7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#24
   IndirectStaticCall   4, CP#9
   PopLocal             r12
@@ -1681,7 +1592,7 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       14
   Push                 r1
   InstanceCall         2, CP#25
   StoreContextVar      0
@@ -1689,24 +1600,24 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      9
+  StoreContextVar      4
   Push                 r4
   LoadContextParent
   PopLocal             r4
   Jump                 L9
   Push                 r4
   LoadContextParent
-  LoadContextVar       10
+  LoadContextVar       12
   Push                 r4
   LoadContextParent
-  LoadContextVar       11
+  LoadContextVar       13
   Throw                1
 L5:
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       10
   PopLocal             r4
   PushConstant         CP#21
   PushConstant         CP#26
@@ -1716,28 +1627,27 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      2
+  StoreContextVar      14
   Push                 r4
   LoadContextParent
   PushConstant         CP#27
-  StoreContextVar      0
+  StoreContextVar      7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      8
   Push                 r4
   LoadContextParent
-  LoadContextParent
   LoadContextVar       2
   Push                 r4
   LoadContextParent
+  LoadContextVar       5
+  Push                 r4
+  LoadContextParent
   LoadContextVar       6
   Push                 r4
   LoadContextParent
-  LoadContextVar       7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#28
   IndirectStaticCall   4, CP#9
   PopLocal             r12
@@ -1753,7 +1663,7 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       14
   Push                 r1
   InstanceCall         2, CP#29
   StoreContextVar      0
@@ -1761,7 +1671,7 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      9
+  StoreContextVar      4
   Push                 r4
   LoadContextParent
   PopLocal             r4
@@ -1775,7 +1685,7 @@
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       10
   PopLocal             r4
   PushConstant         CP#21
   PushConstant         CP#30
@@ -1785,28 +1695,27 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      2
+  StoreContextVar      14
   Push                 r4
   LoadContextParent
   PushConstant         CP#31
-  StoreContextVar      0
+  StoreContextVar      7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      8
   Push                 r4
   LoadContextParent
-  LoadContextParent
   LoadContextVar       2
   Push                 r4
   LoadContextParent
+  LoadContextVar       5
+  Push                 r4
+  LoadContextParent
   LoadContextVar       6
   Push                 r4
   LoadContextParent
-  LoadContextVar       7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       8
+  LoadContextVar       15
   PushConstant         CP#32
   IndirectStaticCall   4, CP#9
   PopLocal             r12
@@ -1822,7 +1731,7 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       14
   Push                 r1
   InstanceCall         2, CP#33
   StoreContextVar      0
@@ -1830,7 +1739,7 @@
   LoadContextParent
   Push                 r4
   LoadContextVar       0
-  StoreContextVar      9
+  StoreContextVar      4
   Push                 r4
   LoadContextParent
   PopLocal             r4
@@ -1840,9 +1749,9 @@
   PopLocal             r4
 L9:
   Push                 r4
-  LoadContextVar       12
+  LoadContextVar       3
   Push                 r4
-  LoadContextVar       9
+  LoadContextVar       4
   PushConstant         CP#34
   IndirectStaticCall   2, CP#11
   Drop1
@@ -1851,11 +1760,12 @@
   Jump                 L12
 Try #0 end:
 Try #0 handler:
+  SetFrame             14
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       9
   PopLocal             r4
   MoveSpecial          r6, exception
   MoveSpecial          r7, stackTrace
@@ -1864,7 +1774,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       12
+  LoadContextVar       3
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#36
@@ -1875,7 +1785,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       8
   PopLocal             r4
   Push                 r5
   PushConstant         CP#8
@@ -1956,20 +1866,14 @@
 Bytecode {
   Entry                4
   CheckStack
-  AllocateContext      1
+  AllocateContext      2
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      0
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#0
-  StoreContextVar      0
+  StoreContextVar      1
   Allocate             CP#26
   StoreLocal           r3
   Push                 r3
@@ -1990,9 +1894,6 @@
   PopLocal             r2
   Push                 r2
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#7
   ReturnTOS
 }
@@ -2052,14 +1953,14 @@
   LoadFieldTOS         CP#2
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       4
   StoreLocal           r5
   PushConstant         CP#8
   IfNeStrictNumTOS
   Jump                 L1
   Push                 r4
   Push                 r4
-  StoreContextVar      2
+  StoreContextVar      6
 Try #0 start:
   AllocateContext      1
   StoreLocal           r5
@@ -2073,35 +1974,34 @@
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      3
+  StoreContextVar      7
 Try #1 start:
   Push                 r4
   LoadContextParent
   LoadContextParent
   PushConstant         CP#11
-  StoreContextVar      0
-  Push                 r4
-  LoadContextParent
-  PushConstant         CP#12
-  StoreContextVar      0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
   StoreContextVar      1
   Push                 r4
   LoadContextParent
+  PushConstant         CP#12
+  StoreContextVar      4
+  Push                 r4
+  LoadContextParent
+  Push                 r4
+  StoreContextVar      5
+  Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextVar       0
   Push                 r4
   LoadContextParent
-  LoadContextVar       4
+  LoadContextVar       2
   Push                 r4
   LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       3
   Push                 r4
   LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       8
   PushConstant         CP#14
   IndirectStaticCall   4, CP#13
   PopLocal             r11
@@ -2122,20 +2022,21 @@
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       1
   Push                 r4
   LoadContextVar       0
   InstanceCall         2, CP#16
-  StoreContextVar      7
+  StoreContextVar      1
   Jump                 L3
   Jump                 L4
 Try #1 end:
 Try #1 handler:
+  SetFrame             12
   Push                 r0
   LoadFieldTOS         CP#2
   PopLocal             r4
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       7
   PopLocal             r4
   MoveSpecial          r8, exception
   MoveSpecial          r9, stackTrace
@@ -2151,7 +2052,7 @@
   LoadFieldTOS         CP#2
   PopLocal             r4
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       7
   PopLocal             r4
   PushConstant         CP#18
   PushConstant         CP#20
@@ -2166,7 +2067,7 @@
   LoadFieldTOS         CP#2
   PopLocal             r4
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       7
   PopLocal             r4
   PushConstant         CP#18
   PushConstant         CP#21
@@ -2177,9 +2078,9 @@
   PopLocal             r4
 L5:
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       0
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       1
   PushConstant         CP#22
   IndirectStaticCall   2, CP#15
   Drop1
@@ -2188,11 +2089,12 @@
   Jump                 L6
 Try #0 end:
 Try #0 handler:
+  SetFrame             12
   Push                 r0
   LoadFieldTOS         CP#2
   PopLocal             r4
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       6
   PopLocal             r4
   MoveSpecial          r6, exception
   MoveSpecial          r7, stackTrace
@@ -2201,7 +2103,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       0
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#24
@@ -2212,7 +2114,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       5
   PopLocal             r4
   Jump                 L7
 
@@ -2234,24 +2136,12 @@
   PushConstant         CP#4
   PushConstant         CP#6
   IndirectStaticCall   1, CP#5
-  StoreContextVar      8
-  Push                 r0
-  PushConstant         CP#7
-  StoreContextVar      7
-  PushConstant         CP#7
-  PopLocal             r2
-  Push                 r0
-  PushConstant         CP#7
-  StoreContextVar      4
-  Push                 r0
-  PushConstant         CP#7
-  StoreContextVar      5
-  Push                 r0
-  PushConstant         CP#8
   StoreContextVar      0
   Push                 r0
   PushConstant         CP#7
   StoreContextVar      1
+  PushConstant         CP#7
+  PopLocal             r2
   Push                 r0
   PushConstant         CP#7
   StoreContextVar      2
@@ -2259,6 +2149,18 @@
   PushConstant         CP#7
   StoreContextVar      3
   Push                 r0
+  PushConstant         CP#8
+  StoreContextVar      4
+  Push                 r0
+  PushConstant         CP#7
+  StoreContextVar      5
+  Push                 r0
+  PushConstant         CP#7
+  StoreContextVar      6
+  Push                 r0
+  PushConstant         CP#7
+  StoreContextVar      7
+  Push                 r0
   Allocate             CP#26
   StoreLocal           r3
   Push                 r3
@@ -2276,32 +2178,32 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#2
-  StoreContextVar      6
+  StoreContextVar      8
   Push                 r0
-  LoadContextVar       6
+  LoadContextVar       8
   PushConstant         CP#36
   IndirectStaticCall   1, CP#5
   PopLocal             r2
   Push                 r0
   Push                 r0
-  LoadContextVar       6
+  LoadContextVar       8
   PushConstant         CP#37
   IndirectStaticCall   1, CP#5
-  StoreContextVar      4
+  StoreContextVar      2
   Push                 r0
   Push                 r0
-  LoadContextVar       6
+  LoadContextVar       8
   PushConstant         CP#38
   IndirectStaticCall   1, CP#5
-  StoreContextVar      5
+  StoreContextVar      3
   PushConstant         CP#39
   Push                 r0
-  LoadContextVar       6
+  LoadContextVar       8
   PushConstant         CP#40
   IndirectStaticCall   2, CP#15
   Drop1
   Push                 r0
-  LoadContextVar       8
+  LoadContextVar       0
   InstanceCall         1, CP#41
   ReturnTOS
   Push                 r0
@@ -2357,25 +2259,19 @@
 Bytecode {
   Entry                4
   CheckStack
-  AllocateContext      1
+  AllocateContext      9
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      0
-  AllocateContext      8
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
-  StoreContextVar      7
+  StoreContextVar      1
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      6
+  StoreContextVar      2
   PushConstant         CP#3
   PopLocal             r2
   Push                 r0
@@ -2386,13 +2282,13 @@
   StoreContextVar      4
   Push                 r0
   PushConstant         CP#4
-  StoreContextVar      0
+  StoreContextVar      5
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      1
+  StoreContextVar      6
   Push                 r0
   PushConstant         CP#3
-  StoreContextVar      2
+  StoreContextVar      7
   Push                 r0
   Allocate             CP#22
   StoreLocal           r3
@@ -2411,37 +2307,34 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#6
-  StoreContextVar      5
+  StoreContextVar      8
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#32
   IndirectStaticCall   1, CP#1
   PopLocal             r2
   Push                 r0
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#33
   IndirectStaticCall   1, CP#1
   StoreContextVar      3
   Push                 r0
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#34
   IndirectStaticCall   1, CP#1
   StoreContextVar      4
   PushConstant         CP#35
   Push                 r0
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#36
   IndirectStaticCall   2, CP#12
   Drop1
   Push                 r0
-  LoadContextVar       7
+  LoadContextVar       1
   InstanceCall         1, CP#37
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -2496,31 +2389,30 @@
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       5
   StoreLocal           r5
   PushConstant         CP#4
   IfNeStrictNumTOS
   Jump                 L1
   Push                 r4
   Push                 r4
-  StoreContextVar      2
+  StoreContextVar      7
 Try #0 start:
   JumpIfNoAsserts      L2
   Push                 r4
   PushConstant         CP#8
-  StoreContextVar      0
+  StoreContextVar      5
   Push                 r4
   Push                 r4
-  StoreContextVar      1
+  StoreContextVar      6
   Push                 r4
-  LoadContextParent
   LoadContextVar       0
   Push                 r4
   LoadContextVar       3
   Push                 r4
   LoadContextVar       4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       8
   PushConstant         CP#10
   IndirectStaticCall   4, CP#9
   PopLocal             r8
@@ -2550,13 +2442,13 @@
 L2:
   Push                 r4
   PushConstant         CP#17
-  StoreContextVar      6
+  StoreContextVar      2
   Jump                 L4
 L4:
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       1
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       2
   PushConstant         CP#18
   IndirectStaticCall   2, CP#12
   Drop1
@@ -2565,11 +2457,12 @@
   Jump                 L5
 Try #0 end:
 Try #0 handler:
+  SetFrame             10
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       7
   PopLocal             r4
   MoveSpecial          r6, exception
   MoveSpecial          r7, stackTrace
@@ -2578,7 +2471,7 @@
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       1
   Push                 r8
   Push                 r9
   InstanceCall         3, CP#20
@@ -2589,7 +2482,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       6
   PopLocal             r4
   Jump                 L6
 
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 9fe4926..7959152 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -508,31 +508,19 @@
 Bytecode {
   Entry                5
   CheckStack
-  AllocateContext      1
+  AllocateContext      4
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      0
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#0
-  StoreContextVar      0
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
+  StoreContextVar      1
   PushConstant         CP#1
   PopLocal             r2
   Push                 r0
   PushConstant         CP#2
-  StoreContextVar      0
+  StoreContextVar      2
   Allocate             CP#22
   StoreLocal           r4
   Push                 r4
@@ -564,30 +552,18 @@
   IndirectStaticCall   1, CP#18
   Drop1
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       2
   PushConstant         CP#40
   IndirectStaticCall   1, CP#18
   Drop1
   Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#41
   IndirectStaticCall   1, CP#18
   Drop1
   Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
-  Push                 r0
   PushConstant         CP#42
-  StoreContextVar      0
+  StoreContextVar      3
   Allocate             CP#22
   StoreLocal           r3
   Push                 r3
@@ -609,9 +585,6 @@
   Push                 r2
   InstanceCall         1, CP#46
   Drop1
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   PushConstant         CP#6
   ReturnTOS
 }
@@ -672,28 +645,21 @@
   PopLocal             r0
   Push                 r0
   LoadContextParent
-  LoadContextParent
   Push                 r0
   LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#1
   InstanceCall         2, CP#17
-  StoreContextVar      0
+  StoreContextVar      2
   Push                 r0
   Push                 r0
   LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
   LoadContextVar       0
   InstanceCall         1, CP#19
   Push                 r0
-  LoadContextParent
   LoadContextVar       0
   InstanceCall         2, CP#20
-  StoreContextVar      0
+  StoreContextVar      1
   PushConstant         CP#6
   ReturnTOS
 
@@ -705,19 +671,13 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#4
   PopLocal             r0
-  AllocateContext      1
+  AllocateContext      2
   StoreLocal           r1
   Push                 r1
   Push                 r0
   StoreContextParent
   PopLocal             r0
   Push                 r0
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  Push                 FP[-5]
-  StoreContextVar      0
-  Push                 r0
   Push                 FP[-5]
   StoreContextVar      0
   Push                 FP[-5]
@@ -729,31 +689,23 @@
   Drop1
   Push                 r0
   LoadContextParent
-  LoadContextParent
   Push                 r0
   LoadContextVar       0
   PushConstant         CP#0
   InstanceCall         2, CP#11
-  StoreContextVar      0
+  StoreContextVar      1
   Push                 r0
   LoadContextParent
-  LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#12
   InstanceCall         2, CP#13
   AssertBoolean        0
   PushConstant         CP#14
   IfNeStrictTOS
   Jump                 L1
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#15
-  StoreContextVar      0
+  StoreContextVar      1
   Allocate             CP#22
   StoreLocal           r2
   Push                 r2
@@ -776,13 +728,10 @@
   InstanceCall         1, CP#32
   Drop1
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#33
   IndirectStaticCall   1, CP#18
   Drop1
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
 L1:
   PushConstant         CP#6
   ReturnTOS
@@ -796,10 +745,9 @@
   LoadFieldTOS         CP#4
   PopLocal             r0
   Push                 r0
-  LoadContextParent
   LoadContextVar       0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       3
   InstanceCall         2, CP#44
   Drop1
   PushConstant         CP#6
@@ -865,10 +813,6 @@
   Entry                5
   CheckStack
   AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
   PopLocal             r0
   Push                 r0
   PushConstant         CP#0
@@ -1056,8 +1000,8 @@
     core::List<core::Function> getI = <core::Function>[];
     core::List<core::Function> setI = <core::Function>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
-      getI.{core::List::add}(() → core::int => i.{core::num::+}(delta));
-      setI.{core::List::add}((core::int ii) → core::Null {
+      [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function>] getI.{core::List::add}(() → core::int => i.{core::num::+}(delta));
+      [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function>] setI.{core::List::add}((core::int ii) → core::Null {
         i = ii.{core::num::+}(delta);
       });
     }
@@ -1084,10 +1028,6 @@
   IfNeStrictTOS
   Jump                 L1
   AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
   PopLocal             r0
   Push                 r0
   Push                 r2
@@ -1285,10 +1225,6 @@
   Entry                4
   CheckStack
   AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
   PopLocal             r0
   Push                 r0
   PushConstant         CP#0
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 58275a3..1917977 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -14,6 +14,7 @@
   Jump                 L1
 Try #0 end:
 Try #0 handler:
+  SetFrame             4
   MoveSpecial          r0, exception
   MoveSpecial          r1, stackTrace
   Push                 r0
@@ -76,6 +77,7 @@
   Jump                 L1
 Try #0 end:
 Try #0 handler:
+  SetFrame             5
   MoveSpecial          r0, exception
   MoveSpecial          r1, stackTrace
   Push                 r0
@@ -250,11 +252,7 @@
 Bytecode {
   Entry                7
   CheckStack
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
+  AllocateContext      3
   PopLocal             r0
   Push                 r0
   PushConstant         CP#0
@@ -262,15 +260,9 @@
   Push                 r0
   PopLocal             r2
 Try #0 start:
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r0
   PushConstant         CP#1
-  StoreContextVar      0
+  StoreContextVar      1
   Allocate             CP#13
   StoreLocal           r5
   Push                 r5
@@ -293,31 +285,23 @@
   InstanceCall         1, CP#23
   Drop1
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#24
   IndirectStaticCall   1, CP#6
   Drop1
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   Jump                 L1
 Try #0 end:
 Try #0 handler:
+  SetFrame             7
   Push                 r2
   PopLocal             r0
   MoveSpecial          r2, exception
   MoveSpecial          r3, stackTrace
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   Push                 r2
   PopLocal             r4
   Push                 r0
   Push                 r3
-  StoreContextVar      0
+  StoreContextVar      2
   PushConstant         CP#11
   PushConstant         CP#25
   CreateArrayTOS
@@ -337,7 +321,7 @@
   Push                 r5
   PushConstant         CP#10
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       2
   StoreIndexedTOS
   PushConstant         CP#29
   IndirectStaticCall   1, CP#6
@@ -364,9 +348,6 @@
   PopLocal             r6
   Push                 r6
   ReturnTOS
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   Jump                 L1
 L1:
   Push                 r0
@@ -376,7 +357,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 13, end 52, handler 52, needs-stack-trace, types [CP#8]
+  try-index 0, outer -1, start 9, end 39, handler 39, needs-stack-trace, types [CP#8]
 }
 ConstantPool {
   [0] = Int 1
@@ -439,6 +420,7 @@
   Jump                 L1
 Try #0 end:
 Try #0 handler:
+  SetFrame             6
   Push                 r2
   PopLocal             r0
   MoveSpecial          r2, exception
@@ -446,14 +428,13 @@
   Push                 r2
   PopLocal             r4
   Push                 r0
-  LoadContextParent
   LoadContextVar       0
   PushConstant         CP#9
   IndirectStaticCall   1, CP#6
   Drop1
   Push                 r0
   PushConstant         CP#10
-  StoreContextVar      0
+  StoreContextVar      1
   Jump                 L1
 L1:
   PushConstant         CP#11
@@ -477,6 +458,7 @@
   Jump                 L1
 Try #0 end:
 Try #0 handler:
+  SetFrame             6
   Push                 r2
   PopLocal             r0
   MoveSpecial          r2, exception
@@ -510,7 +492,7 @@
   Push                 r5
   PushConstant         CP#10
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       2
   StoreIndexedTOS
   PushConstant         CP#40
   IndirectStaticCall   1, CP#6
@@ -569,6 +551,7 @@
   Jump                 L1
 Try #1 end:
 Try #1 handler:
+  SetFrame             8
   MoveSpecial          r2, exception
   MoveSpecial          r3, stackTrace
   Push                 r2
@@ -591,6 +574,7 @@
   Jump                 L3
 Try #2 end:
 Try #2 handler:
+  SetFrame             8
   MoveSpecial          r5, exception
   MoveSpecial          r6, stackTrace
   Push                 r5
@@ -606,6 +590,7 @@
   Jump                 L4
 Try #0 end:
 Try #0 handler:
+  SetFrame             8
   MoveSpecial          r0, exception
   MoveSpecial          r1, stackTrace
   Push                 r0
@@ -626,9 +611,9 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 2, end 36, handler 36, needs-stack-trace, types [CP#3]
+  try-index 0, outer -1, start 2, end 38, handler 38, needs-stack-trace, types [CP#3]
   try-index 1, outer 0, start 2, end 7, handler 7, needs-stack-trace, types [CP#3]
-  try-index 2, outer 0, start 11, end 25, handler 25, types [CP#3]
+  try-index 2, outer 0, start 12, end 26, handler 26, types [CP#3]
 }
 ConstantPool {
   [0] = String 'try 1 > try 2'
@@ -695,6 +680,7 @@
   Jump                 L4
 Try #0 end:
 Try #0 handler:
+  SetFrame             3
   MoveSpecial          r1, exception
   MoveSpecial          r2, stackTrace
   Push                 r0
@@ -762,7 +748,7 @@
 Bytecode {
   Entry                9
   CheckStack
-  AllocateContext      1
+  AllocateContext      2
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
@@ -787,19 +773,13 @@
   Push                 r0
   PopLocal             r3
 Try #0 start:
-  AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
   PushConstant         CP#6
   PushConstant         CP#8
   IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
   PushConstant         CP#9
-  StoreContextVar      0
+  StoreContextVar      1
   Push                 r0
   PopLocal             r5
 Try #1 start:
@@ -832,6 +812,7 @@
   Jump                 L5
 Try #1 end:
 Try #1 handler:
+  SetFrame             9
   Push                 r5
   PopLocal             r0
   MoveSpecial          r5, exception
@@ -862,12 +843,10 @@
   PushConstant         CP#36
   IndirectStaticCall   1, CP#7
   Drop1
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
   Jump                 L7
 Try #0 end:
 Try #0 handler:
+  SetFrame             9
   Push                 r3
   PopLocal             r0
   MoveSpecial          r3, exception
@@ -906,8 +885,8 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 25, end 99, handler 99, needs-stack-trace, types [CP#30]
-  try-index 1, outer 0, start 40, end 67, handler 67, needs-stack-trace, types [CP#30]
+  try-index 0, outer -1, start 25, end 91, handler 91, needs-stack-trace, types [CP#30]
+  try-index 1, outer 0, start 34, end 61, handler 61, needs-stack-trace, types [CP#30]
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
@@ -961,13 +940,12 @@
   LoadFieldTOS         CP#13
   PopLocal             r0
   Push                 r0
-  LoadContextParent
   LoadContextVar       0
   PushConstant         CP#15
   IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1
   PushConstant         CP#16
   IndirectStaticCall   1, CP#7
   Drop1
@@ -1016,10 +994,6 @@
   Entry                6
   CheckStack
   AllocateContext      1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
   PopLocal             r0
   Push                 r0
   PushConstant         CP#0
@@ -1050,6 +1024,7 @@
   Jump                 L1
 Try #0 end:
 Try #0 handler:
+  SetFrame             6
   Push                 r3
   PopLocal             r0
   MoveSpecial          r3, exception
@@ -1083,7 +1058,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 15, end 34, handler 34, needs-stack-trace, types [CP#10]
+  try-index 0, outer -1, start 11, end 30, handler 30, needs-stack-trace, types [CP#9]
 }
 ConstantPool {
   [0] = Int 11
@@ -1095,18 +1070,18 @@
   [6] = StaticICData target 'dart.core::print', arg-desc CP#5
   [7] = String 'try 1'
   [8] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [9] = Int 42
-  [10] = Type dynamic
-  [11] = String 'try 2'
+  [9] = Type dynamic
+  [10] = String 'try 2'
+  [11] = StaticICData target 'dart.core::print', arg-desc CP#5
   [12] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [13] = Int 43
-  [14] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [13] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [14] = Int 43
   [15] = StaticICData target 'dart.core::print', arg-desc CP#5
   [16] = StaticICData target 'dart.core::print', arg-desc CP#5
   [17] = StaticICData target 'dart.core::print', arg-desc CP#5
   [18] = StaticICData target 'dart.core::print', arg-desc CP#5
   [19] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [20] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [20] = Int 42
   [21] = StaticICData target 'dart.core::print', arg-desc CP#5
   [22] = StaticICData target 'dart.core::print', arg-desc CP#5
   [23] = StaticICData target 'dart.core::print', arg-desc CP#5
@@ -1145,11 +1120,11 @@
   PushConstant         CP#8
   IndirectStaticCall   1, CP#5
   Drop1
-  PushConstant         CP#9
   Jump                 L1
   Jump                 L2
 Try #0 end:
 Try #0 handler:
+  SetFrame             6
   Push                 r2
   PopLocal             r0
   MoveSpecial          r2, exception
@@ -1157,22 +1132,22 @@
   Push                 r0
   PopLocal             r4
 Try #1 start:
+  PushConstant         CP#10
   PushConstant         CP#11
-  PushConstant         CP#12
   IndirectStaticCall   1, CP#5
   Drop1
-  PushConstant         CP#13
   Jump                 L3
   Jump                 L4
 Try #1 end:
 Try #1 handler:
+  SetFrame             6
   Push                 r4
   PopLocal             r0
   MoveSpecial          r4, exception
   MoveSpecial          r5, stackTrace
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#14
+  PushConstant         CP#12
   IndirectStaticCall   1, CP#5
   Drop1
   Push                 r4
@@ -1183,16 +1158,17 @@
   PopLocal             r0
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#15
+  PushConstant         CP#13
   IndirectStaticCall   1, CP#5
   Drop1
+  PushConstant         CP#14
   ReturnTOS
 L4:
   Push                 r4
   PopLocal             r0
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#16
+  PushConstant         CP#15
   IndirectStaticCall   1, CP#5
   Drop1
   Push                 r2
@@ -1204,22 +1180,22 @@
   Push                 r0
   PopLocal             r4
 Try #2 start:
-  PushConstant         CP#11
-  PushConstant         CP#17
+  PushConstant         CP#10
+  PushConstant         CP#16
   IndirectStaticCall   1, CP#5
   Drop1
-  PushConstant         CP#13
   Jump                 L5
   Jump                 L6
 Try #2 end:
 Try #2 handler:
+  SetFrame             6
   Push                 r4
   PopLocal             r0
   MoveSpecial          r4, exception
   MoveSpecial          r5, stackTrace
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#18
+  PushConstant         CP#17
   IndirectStaticCall   1, CP#5
   Drop1
   Push                 r4
@@ -1230,18 +1206,20 @@
   PopLocal             r0
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#19
+  PushConstant         CP#18
   IndirectStaticCall   1, CP#5
   Drop1
+  PushConstant         CP#14
   ReturnTOS
 L6:
   Push                 r4
   PopLocal             r0
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#20
+  PushConstant         CP#19
   IndirectStaticCall   1, CP#5
   Drop1
+  PushConstant         CP#20
   ReturnTOS
 L2:
   Push                 r2
@@ -1249,15 +1227,15 @@
   Push                 r0
   PopLocal             r4
 Try #3 start:
-  PushConstant         CP#11
+  PushConstant         CP#10
   PushConstant         CP#21
   IndirectStaticCall   1, CP#5
   Drop1
-  PushConstant         CP#13
   Jump                 L7
   Jump                 L8
 Try #3 end:
 Try #3 handler:
+  SetFrame             6
   Push                 r4
   PopLocal             r0
   MoveSpecial          r4, exception
@@ -1278,6 +1256,7 @@
   PushConstant         CP#23
   IndirectStaticCall   1, CP#5
   Drop1
+  PushConstant         CP#14
   ReturnTOS
 L8:
   Push                 r4
@@ -1330,6 +1309,7 @@
   Jump                 L1
 Try #1 end:
 Try #1 handler:
+  SetFrame             5
   MoveSpecial          r2, exception
   MoveSpecial          r3, stackTrace
   Push                 r2
@@ -1343,6 +1323,7 @@
   Jump                 L2
 Try #0 end:
 Try #0 handler:
+  SetFrame             5
   MoveSpecial          r0, exception
   MoveSpecial          r1, stackTrace
   PushConstant         CP#6
@@ -1361,7 +1342,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 2, end 17, handler 17, needs-stack-trace, types [CP#3]
+  try-index 0, outer -1, start 2, end 18, handler 18, needs-stack-trace, types [CP#3]
   try-index 1, outer 0, start 2, end 7, handler 7, types [CP#3]
 }
 ConstantPool {
diff --git a/pkg/vm/tool/test_bytecode b/pkg/vm/tool/test_bytecode
index 349e2fc..b939757 100755
--- a/pkg/vm/tool/test_bytecode
+++ b/pkg/vm/tool/test_bytecode
@@ -9,10 +9,6 @@
 # Usage
 # pkg/vm/tool/test_bytecode ~/foo.dart
 
-# Note: To generate bytecode in the platform dill file as well, change the value
-#       of the constant 'isKernelBytecodeEnabled' in file
-#       pkg/vm/lib/bytecode/gen_bytecode.dart from 'false' to 'true'.
-
 set -e
 
 # Pick the architecture and mode to build and test.
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index a4c50fb..3583691 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -1237,6 +1237,8 @@
 
   sources = [
               "builtin_nolib.cc",
+              "dfe.cc",
+              "dfe.h",
               "error_exit.cc",
               "error_exit.h",
               "run_vm_tests.cc",
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 5001cd7..1c33aeb 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -28,18 +28,18 @@
   _printString(arg.toString());
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _getPrintClosure() => _print;
 
 // Asynchronous loading of resources.
 // The embedder forwards loading requests to the service isolate.
 
 // A port for communicating with the service isolate for I/O.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 SendPort _loadPort;
 
 // The isolateId used to communicate with the service isolate for I/O.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 int _isolateId;
 
 // Requests made to the service isolate over the load port.
@@ -140,7 +140,7 @@
 
 // Embedder Entrypoint:
 // The embedder calls this method with the current working directory.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _setWorkingDirectory(String cwd) {
   if (!_setupCompleted) {
     _setupHooks();
@@ -156,7 +156,7 @@
 
 // Embedder Entrypoint:
 // The embedder calls this method with a custom package root.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 String _setPackageRoot(String packageRoot) {
   if (!_setupCompleted) {
     _setupHooks();
@@ -187,7 +187,7 @@
 }
 
 // Embedder Entrypoint:
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 String _setPackagesMap(String packagesParam) {
   if (!_setupCompleted) {
     _setupHooks();
@@ -219,7 +219,7 @@
 
 // Resolves the script uri in the current working directory iff the given uri
 // did not specify a scheme (e.g. a path to a script file on the command line).
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 String _resolveScriptUri(String scriptName) {
   if (_traceLoading) {
     _log("Resolving script: $scriptName");
@@ -248,7 +248,7 @@
 
 // Embedder Entrypoint (gen_snapshot):
 // Resolve relative paths relative to working directory.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 String _resolveInWorkingDirectory(String fileName) {
   if (!_setupCompleted) {
     _setupHooks();
@@ -305,7 +305,7 @@
 }
 
 // Embedder Entrypoint.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _libraryFilePath(String libraryUri) {
   if (!_setupCompleted) {
     _setupHooks();
@@ -321,7 +321,7 @@
 }
 
 // Register callbacks and hooks with the rest of the core libraries.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _setupHooks() {
   _setupCompleted = true;
   VMLibraryHooks.resourceReadAsBytes = _resourceReadAsBytes;
diff --git a/runtime/bin/common_patch.dart b/runtime/bin/common_patch.dart
index 2f83baf..8df0749 100644
--- a/runtime/bin/common_patch.dart
+++ b/runtime/bin/common_patch.dart
@@ -55,7 +55,7 @@
   static Uint8List getRandomBytes(int count) native "Crypto_GetRandomBytes";
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _setupHooks() {
   VMLibraryHooks.eventHandlerSendData = _EventHandler._sendData;
   VMLibraryHooks.timerMillisecondClock = _EventHandler._timerMillisecondClock;
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 6bba557..9270003 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -55,6 +55,9 @@
 MagicNumberData appjit_magic_number = {8, {0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0}};
 MagicNumberData snapshot_magic_number = {4, {0xf5, 0xf5, 0xdc, 0xdc}};
 MagicNumberData kernel_magic_number = {4, {0x90, 0xab, 0xcd, 0xef}};
+MagicNumberData kernel_list_magic_number = {
+    7,
+    {0x23, 0x40, 0x64, 0x69, 0x6c, 0x6c, 0x0a}};  // #@dill\n
 MagicNumberData gzip_magic_number = {2, {0x1f, 0x8b, 0, 0}};
 
 static bool IsWindowsHost() {
@@ -438,6 +441,8 @@
       max_magic_length =
           Utils::Maximum(max_magic_length, kernel_magic_number.length);
       max_magic_length =
+          Utils::Maximum(max_magic_length, kernel_list_magic_number.length);
+      max_magic_length =
           Utils::Maximum(max_magic_length, gzip_magic_number.length);
       ASSERT(max_magic_length <= 8);
       uint8_t header[8];
@@ -463,6 +468,10 @@
     return kKernelMagicNumber;
   }
 
+  if (CheckMagicNumber(buffer, buffer_length, kernel_list_magic_number)) {
+    return kKernelListMagicNumber;
+  }
+
   if (CheckMagicNumber(buffer, buffer_length, gzip_magic_number)) {
     return kGzipMagicNumber;
   }
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 68cd47f..c6a9b23 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -220,6 +220,7 @@
     kSnapshotMagicNumber,
     kAppJITMagicNumber,
     kKernelMagicNumber,
+    kKernelListMagicNumber,
     kGzipMagicNumber,
     kUnknownMagicNumber
   };
@@ -640,6 +641,7 @@
 extern MagicNumberData appjit_magic_number;
 extern MagicNumberData snapshot_magic_number;
 extern MagicNumberData kernel_magic_number;
+extern MagicNumberData kernel_list_magic_number;
 extern MagicNumberData gzip_magic_number;
 
 }  // namespace bin
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 6c0dafb..b6de97c 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -260,34 +260,171 @@
                      Dart_Timeline_Event_Duration, 0, NULL, NULL);
 }
 
+// Attempts to treat [buffer] as a in-memory kernel byte representation.
+// If successful, returns [true] and places [buffer] into [kernel_ir], byte size
+// into [kernel_ir_size].
+// If unsuccessful, returns [false], puts [NULL] into [kernel_ir], -1 into
+// [kernel_ir_size].
+static bool TryReadSimpleKernelBuffer(uint8_t* buffer,
+                                      uint8_t** p_kernel_ir,
+                                      intptr_t* p_kernel_ir_size) {
+  DartUtils::MagicNumber magic_number =
+      DartUtils::SniffForMagicNumber(buffer, *p_kernel_ir_size);
+  if (magic_number == DartUtils::kKernelMagicNumber) {
+    // Do not free buffer if this is a kernel file - kernel_file will be
+    // backed by the same memory as the buffer and caller will own it.
+    // Caller is responsible for freeing the buffer when this function
+    // returns true.
+    *p_kernel_ir = buffer;
+    return true;
+  }
+  free(buffer);
+  *p_kernel_ir = NULL;
+  *p_kernel_ir_size = -1;
+  return false;
+}
+
+/// Reads [script_uri] file, returns [true] if successful, [false] otherwise.
+///
+/// If successful, newly allocated buffer with file contents is returned in
+/// [buffer], file contents byte count - in [size].
+static bool TryReadFile(const char* script_uri, uint8_t** buffer,
+                        intptr_t* size) {
+  void* script_file = DartUtils::OpenFileUri(script_uri, false);
+  if (script_file == NULL) {
+    return false;
+  }
+  DartUtils::ReadFile(buffer, size, script_file);
+  DartUtils::CloseFile(script_file);
+  if (*size <= 0 || buffer == NULL) {
+    return false;
+  }
+  return true;
+}
+
+class KernelIRNode {
+ public:
+  KernelIRNode(uint8_t* kernel_ir, intptr_t kernel_size)
+      : kernel_ir_(kernel_ir), kernel_size_(kernel_size) {}
+
+  ~KernelIRNode() {
+    free(kernel_ir_);
+  }
+
+  static void Add(KernelIRNode** p_head, KernelIRNode** p_tail,
+                  KernelIRNode* node) {
+    if (*p_head == NULL) {
+      *p_head = node;
+    } else {
+      (*p_tail)->next_ = node;
+    }
+    *p_tail = node;
+  }
+
+  static void Merge(KernelIRNode* head, uint8_t** p_bytes,
+                             intptr_t* p_size) {
+    intptr_t size = 0;
+    for (KernelIRNode* node = head; node != NULL; node = node->next_) {
+      size = size + node->kernel_size_;
+    }
+
+    *p_bytes = reinterpret_cast<uint8_t*>(malloc(size));
+    if (*p_bytes == NULL) {
+      OUT_OF_MEMORY();
+    }
+    uint8_t* p = *p_bytes;
+    KernelIRNode* node = head;
+    while (node != NULL) {
+      memmove(p, node->kernel_ir_, node->kernel_size_);
+      p += node->kernel_size_;
+      KernelIRNode* next = node->next_;
+      node = next;
+    }
+    *p_size = size;
+  }
+
+  static void Delete(KernelIRNode* head) {
+    KernelIRNode* node = head;
+    while (node != NULL) {
+      KernelIRNode* next = node->next_;
+      delete (node);
+      node = next;
+    }
+  }
+
+ private:
+  uint8_t* kernel_ir_;
+  intptr_t kernel_size_;
+
+  KernelIRNode* next_ = NULL;
+
+  DISALLOW_COPY_AND_ASSIGN(KernelIRNode);
+};
+
+// Supports "kernel list" files as input.
+// Those are text files that start with '#@dill' on new line, followed
+// by absolute paths to kernel files or relative paths, that are relative
+// to dart process working directory.
+// Below is an example of valid kernel list file:
+// ```
+// #@dill
+// /projects/mytest/build/bin/main.vm.dill
+// /projects/mytest/build/packages/mytest/lib.vm.dill
+// ```
+static bool TryReadKernelListBuffer(uint8_t* buffer, uint8_t** kernel_ir,
+                                    intptr_t* kernel_ir_size) {
+  KernelIRNode* kernel_ir_head = NULL;
+  KernelIRNode* kernel_ir_tail = NULL;
+  // Add all kernels to the linked list
+  char* filename =
+      reinterpret_cast<char*>(buffer + kernel_list_magic_number.length);
+  char* tail = strstr(filename, "\n");
+  while (tail != NULL) {
+    *tail = '\0';
+    intptr_t this_kernel_size;
+    uint8_t* this_buffer;
+    if (!TryReadFile(filename, &this_buffer, &this_kernel_size)) {
+      return false;
+    }
+
+    uint8_t* this_kernel_ir;
+    if (!TryReadSimpleKernelBuffer(this_buffer, &this_kernel_ir,
+                                   &this_kernel_size)) {
+      // Abandon read if any of the files in the list are invalid.
+      KernelIRNode::Delete(kernel_ir_head);
+      *kernel_ir = NULL;
+      *kernel_ir_size = -1;
+      return false;
+    }
+    KernelIRNode::Add(&kernel_ir_head, &kernel_ir_tail,
+                      new KernelIRNode(this_kernel_ir, this_kernel_size));
+    filename = tail + 1;
+    tail = strstr(filename, "\n");
+  }
+  free(buffer);
+
+  KernelIRNode::Merge(kernel_ir_head, kernel_ir, kernel_ir_size);
+  KernelIRNode::Delete(kernel_ir_head);
+  return true;
+}
+
 bool DFE::TryReadKernelFile(const char* script_uri,
                             uint8_t** kernel_ir,
                             intptr_t* kernel_ir_size) {
   *kernel_ir = NULL;
   *kernel_ir_size = -1;
-  void* script_file = DartUtils::OpenFileUri(script_uri, false);
-  if (script_file == NULL) {
+
+  uint8_t* buffer;
+  if (!TryReadFile(script_uri, &buffer, kernel_ir_size)) {
     return false;
   }
-  uint8_t* buffer = NULL;
-  DartUtils::ReadFile(&buffer, kernel_ir_size, script_file);
-  DartUtils::CloseFile(script_file);
-  if (*kernel_ir_size == 0 || buffer == NULL) {
-    return false;
+
+  DartUtils::MagicNumber magic_number =
+      DartUtils::SniffForMagicNumber(buffer, *kernel_ir_size);
+  if (magic_number == DartUtils::kKernelListMagicNumber) {
+    return TryReadKernelListBuffer(buffer, kernel_ir, kernel_ir_size);
   }
-  if (DartUtils::SniffForMagicNumber(buffer, *kernel_ir_size) !=
-      DartUtils::kKernelMagicNumber) {
-    free(buffer);
-    *kernel_ir = NULL;
-    *kernel_ir_size = -1;
-    return false;
-  }
-  // Do not free buffer if this is a kernel file - kernel_file will be
-  // backed by the same memory as the buffer and caller will own it.
-  // Caller is responsible for freeing the buffer when this function
-  // returns true.
-  *kernel_ir = buffer;
-  return true;
+  return TryReadSimpleKernelBuffer(buffer, kernel_ir, kernel_ir_size);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/directory_patch.dart b/runtime/bin/directory_patch.dart
index c65356f..8249bbd 100644
--- a/runtime/bin/directory_patch.dart
+++ b/runtime/bin/directory_patch.dart
@@ -67,5 +67,5 @@
   return new Uri.directory(result);
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _getUriBaseClosure() => _uriBaseClosure;
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index 534e221..7141c73 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -414,7 +414,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 Uint8List _makeUint8ListView(Uint8List source, int offsetInBytes, int length) {
   return new Uint8List.view(source.buffer, offsetInBytes, length);
 }
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index 4e4bf65..95bf352 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -682,12 +682,15 @@
     const char* path = DartUtils::RemoveScheme(url_string);
 
     const char* lib_uri = NULL;
-    result = Dart_StringToCString(Dart_LibraryUrl(library), &lib_uri);
+    result = Dart_StringToCString(Dart_LibraryResolvedUrl(library), &lib_uri);
     RETURN_ERROR(result);
 
+    UriDecoder decoder(lib_uri);
+    lib_uri = decoder.decoded();
+
     char* lib_path = NULL;
     if (strncmp(lib_uri, "file://", 7) == 0) {
-      lib_path = DartUtils::DirName(DartUtils::RemoveScheme(lib_uri));
+      lib_path = DartUtils::DirName(lib_uri + 7);
     } else {
       lib_path = strdup(lib_uri);
     }
@@ -699,7 +702,10 @@
           path);
     }
 
-    return Extensions::LoadExtension(lib_path, path, library);
+    Dart_Handle result =
+        Extensions::LoadExtension(decoder.decoded(), path, library);
+    free(lib_path);
+    return result;
   }
   if (tag != Dart_kScriptTag) {
     // Special case for handling dart: imports and parts.
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index e67c277..caf82ee 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -88,6 +88,7 @@
 static const uint8_t* app_isolate_snapshot_instructions = NULL;
 static const uint8_t* app_isolate_shared_data = NULL;
 static const uint8_t* app_isolate_shared_instructions = NULL;
+static bool kernel_isolate_is_running = false;
 
 static Dart_Isolate main_isolate = NULL;
 
@@ -199,15 +200,17 @@
     free(dep);
   }
   if (Options::preview_dart_2()) {
-    Dart_KernelCompilationResult result = Dart_KernelListDependencies();
-    if (result.status != Dart_KernelCompilationStatus_Ok) {
-      ErrorExit(
-          kErrorExitCode,
-          "Error: Failed to fetch dependencies from kernel service: %s\n\n",
-          result.error);
+    if (kernel_isolate_is_running) {
+      Dart_KernelCompilationResult result = Dart_KernelListDependencies();
+      if (result.status != Dart_KernelCompilationStatus_Ok) {
+        ErrorExit(
+            kErrorExitCode,
+            "Error: Failed to fetch dependencies from kernel service: %s\n\n",
+            result.error);
+      }
+      success &= file->WriteFully(result.kernel, result.kernel_size);
+      free(result.kernel);
     }
-    success &= file->WriteFully(result.kernel, result.kernel_size);
-    free(result.kernel);
   }
   success &= file->Print("\n");
   if (!success) {
@@ -459,10 +462,19 @@
                                                 Dart_IsolateFlags* flags,
                                                 char** error,
                                                 int* exit_code) {
-  const char* kernel_snapshot_uri = NULL;
-  if (Options::gen_snapshot_kind() != kAppJIT) {
-    kernel_snapshot_uri = dfe.frontend_filename();
+  // Do not start a kernel isolate if we are doing a training run
+  // to create an app JIT snapshot and a kernel file is specified
+  // as the application to run.
+  if (Options::gen_snapshot_kind() == kAppJIT) {
+    const uint8_t* kernel_buffer = NULL;
+    intptr_t kernel_buffer_size = 0;
+    dfe.application_kernel_buffer(&kernel_buffer, &kernel_buffer_size);
+    if (kernel_buffer_size != 0) {
+      return NULL;
+    }
   }
+  // Create and Start the kernel isolate.
+  const char* kernel_snapshot_uri = dfe.frontend_filename();
   const char* uri =
       kernel_snapshot_uri != NULL ? kernel_snapshot_uri : script_uri;
 
@@ -473,20 +485,19 @@
   Dart_Isolate isolate;
   IsolateData* isolate_data = NULL;
   bool isolate_run_app_snapshot = false;
-  if (kernel_snapshot_uri != NULL) {
-    // Kernel isolate uses an app snapshot or the core libraries snapshot.
-    const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
-    const uint8_t* isolate_snapshot_instructions =
-        core_isolate_snapshot_instructions;
-    AppSnapshot* app_snapshot = Snapshot::TryReadAppSnapshot(uri);
-    if (app_snapshot != NULL) {
-      isolate_run_app_snapshot = true;
-      const uint8_t* ignore_vm_snapshot_data;
-      const uint8_t* ignore_vm_snapshot_instructions;
-      app_snapshot->SetBuffers(
-          &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
-          &isolate_snapshot_data, &isolate_snapshot_instructions);
-    }
+  AppSnapshot* app_snapshot = NULL;
+  // Kernel isolate uses an app snapshot or uses the dill file.
+  if ((kernel_snapshot_uri != NULL) &&
+      (app_snapshot = Snapshot::TryReadAppSnapshot(kernel_snapshot_uri)) !=
+          NULL) {
+    const uint8_t* isolate_snapshot_data = NULL;
+    const uint8_t* isolate_snapshot_instructions = NULL;
+    const uint8_t* ignore_vm_snapshot_data;
+    const uint8_t* ignore_vm_snapshot_instructions;
+    isolate_run_app_snapshot = true;
+    app_snapshot->SetBuffers(
+        &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
+        &isolate_snapshot_data, &isolate_snapshot_instructions);
     IsolateData* isolate_data =
         new IsolateData(uri, package_root, packages_config, app_snapshot);
     isolate = Dart_CreateIsolate(
@@ -503,9 +514,9 @@
     isolate_data->set_kernel_buffer(const_cast<uint8_t*>(kernel_service_buffer),
                                     kernel_service_buffer_size,
                                     false /* take_ownership */);
-    isolate = Dart_CreateIsolateFromKernel(uri, main, kernel_service_buffer,
-                                           kernel_service_buffer_size, flags,
-                                           isolate_data, error);
+    isolate = Dart_CreateIsolateFromKernel(
+        DART_KERNEL_ISOLATE_NAME, main, kernel_service_buffer,
+        kernel_service_buffer_size, flags, isolate_data, error);
   }
 
   if (isolate == NULL) {
@@ -513,6 +524,7 @@
     delete isolate_data;
     return NULL;
   }
+  kernel_isolate_is_running = true;
 
   return IsolateSetupHelper(isolate, false, uri, package_root, packages_config,
                             true, isolate_run_app_snapshot, flags, error,
@@ -1258,7 +1270,13 @@
                                       application_kernel_buffer_size);
     // Since we saw a dill file, it means we have to turn on all the
     // preview_dart_2 options.
-    Options::SetDart2Options(&vm_options);
+    if (Options::no_preview_dart_2()) {
+      Log::PrintErr(
+          "A kernel file is specified as the input, "
+          "--no-preview-dart-2 option is incompatible with it\n");
+      Platform::Exit(kErrorExitCode);
+    }
+    Options::dfe()->set_use_dfe();
   }
 #endif
 
diff --git a/runtime/bin/namespace_patch.dart b/runtime/bin/namespace_patch.dart
index 5e486c2..0b85a14 100644
--- a/runtime/bin/namespace_patch.dart
+++ b/runtime/bin/namespace_patch.dart
@@ -33,7 +33,7 @@
 @patch
 class _Namespace {
   @patch
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static void _setupNamespace(var namespace) {
     _NamespaceImpl._setupNamespace(namespace);
   }
diff --git a/runtime/bin/platform_patch.dart b/runtime/bin/platform_patch.dart
index 5f3ee4c..dd7d88a 100644
--- a/runtime/bin/platform_patch.dart
+++ b/runtime/bin/platform_patch.dart
@@ -40,7 +40,7 @@
   static Uri _script() => VMLibraryHooks.platformScript;
 
   // This script singleton is written to by the embedder if applicable.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static void set _nativeScript(String path) {
     VMLibraryHooks.platformScript = (() {
       if (path.startsWith('http:') ||
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 5b22ae3..375fb93 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -129,7 +129,7 @@
       native "Process_ClearSignalHandler";
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 Function _getWatchSignalInternal() => _ProcessUtils._watchSignalInternal;
 
 @patch
@@ -193,9 +193,9 @@
 }
 
 class _ProcessStartStatus {
-  @pragma("vm.entry-point", "set")
+  @pragma("vm:entry-point", "set")
   int _errorCode; // Set to OS error code if process start failed.
-  @pragma("vm.entry-point", "set")
+  @pragma("vm:entry-point", "set")
   String _errorMessage; // Set to OS error message if process start failed.
 }
 
@@ -578,8 +578,7 @@
     Encoding stdoutEncoding,
     Encoding stderrEncoding) {
   // Start the underlying process.
-  return Process
-      .start(path, arguments,
+  return Process.start(path, arguments,
           workingDirectory: workingDirectory,
           environment: environment,
           includeParentEnvironment: includeParentEnvironment,
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index e2f792d..ebd050e 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -125,43 +125,45 @@
         strdup("Spawning of only Kernel isolate is supported in run_vm_tests.");
     return NULL;
   }
-  if (kernel_snapshot == NULL) {
-    *error =
-        strdup("Kernel snapshot location has to be specified via --dfe option");
-    return NULL;
-  }
-  script_uri = kernel_snapshot;
+  Dart_Isolate isolate = NULL;
+  bin::IsolateData* isolate_data = NULL;
+  const uint8_t* kernel_service_buffer = NULL;
+  intptr_t kernel_service_buffer_size = 0;
 
-  // Kernel isolate uses an app snapshot or the core libraries snapshot.
-  bool isolate_run_script_snapshot = false;
-  const uint8_t* isolate_snapshot_data = bin::core_isolate_snapshot_data;
-  const uint8_t* isolate_snapshot_instructions =
-      bin::core_isolate_snapshot_instructions;
-  bin::AppSnapshot* app_snapshot = NULL;
-  switch (bin::DartUtils::SniffForMagicNumber(script_uri)) {
-    case bin::DartUtils::kAppJITMagicNumber: {
-      app_snapshot = bin::Snapshot::TryReadAppSnapshot(script_uri);
-      ASSERT(app_snapshot != NULL);
-
-      const uint8_t* ignore_vm_snapshot_data;
-      const uint8_t* ignore_vm_snapshot_instructions;
-      app_snapshot->SetBuffers(
-          &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
-          &isolate_snapshot_data, &isolate_snapshot_instructions);
-      break;
-    }
-    case bin::DartUtils::kSnapshotMagicNumber: {
-      isolate_run_script_snapshot = true;
-      break;
-    }
-    default:
-      return NULL;
+  // Kernel isolate uses an app snapshot or the kernel service dill file.
+  if (kernel_snapshot != NULL &&
+      (bin::DartUtils::SniffForMagicNumber(kernel_snapshot) ==
+       bin::DartUtils::kAppJITMagicNumber)) {
+    script_uri = kernel_snapshot;
+    bin::AppSnapshot* app_snapshot =
+        bin::Snapshot::TryReadAppSnapshot(script_uri);
+    ASSERT(app_snapshot != NULL);
+    const uint8_t* ignore_vm_snapshot_data;
+    const uint8_t* ignore_vm_snapshot_instructions;
+    const uint8_t* isolate_snapshot_data;
+    const uint8_t* isolate_snapshot_instructions;
+    app_snapshot->SetBuffers(
+        &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
+        &isolate_snapshot_data, &isolate_snapshot_instructions);
+    isolate_data = new bin::IsolateData(script_uri, package_root,
+                                        packages_config, app_snapshot);
+    isolate = Dart_CreateIsolate(
+        DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
+        isolate_snapshot_instructions, NULL, NULL, flags, isolate_data, error);
+  } else {
+    bin::dfe.Init();
+    bin::dfe.LoadKernelService(&kernel_service_buffer,
+                               &kernel_service_buffer_size);
+    ASSERT(kernel_service_buffer != NULL);
+    isolate_data =
+        new bin::IsolateData(script_uri, package_root, packages_config, NULL);
+    isolate_data->set_kernel_buffer(const_cast<uint8_t*>(kernel_service_buffer),
+                                    kernel_service_buffer_size,
+                                    false /* take_ownership */);
+    isolate = Dart_CreateIsolateFromKernel(
+        script_uri, main, kernel_service_buffer, kernel_service_buffer_size,
+        flags, isolate_data, error);
   }
-  bin::IsolateData* isolate_data = new bin::IsolateData(
-      script_uri, package_root, packages_config, app_snapshot);
-  Dart_Isolate isolate = Dart_CreateIsolate(
-      DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
-      isolate_snapshot_instructions, NULL, NULL, flags, isolate_data, error);
   if (isolate == NULL) {
     delete isolate_data;
     return NULL;
@@ -169,22 +171,18 @@
 
   Dart_EnterScope();
 
-  if (isolate_run_script_snapshot) {
-    uint8_t* payload;
-    intptr_t payload_length;
-    void* file = bin::DartUtils::OpenFile(script_uri, false);
-    bin::DartUtils::ReadFile(&payload, &payload_length, file);
-    bin::DartUtils::CloseFile(file);
-
-    Dart_Handle result = Dart_LoadScriptFromSnapshot(payload, payload_length);
-    CHECK_RESULT(result);
-  }
-
   bin::DartUtils::SetOriginalWorkingDirectory();
   Dart_Handle result = bin::DartUtils::PrepareForScriptLoading(
       false /* is_service_isolate */, false /* trace_loading */);
   CHECK_RESULT(result);
 
+  // Setup kernel service as the main script for this isolate.
+  if (kernel_service_buffer) {
+    result = Dart_LoadScriptFromKernel(kernel_service_buffer,
+                                       kernel_service_buffer_size);
+    CHECK_RESULT(result);
+  }
+
   Dart_ExitScope();
   Dart_ExitIsolate();
   *error = Dart_IsolateMakeRunnable(isolate);
@@ -217,6 +215,9 @@
   // Save the console state so we can restore it later.
   dart::bin::Console::SaveConfig();
 
+  // Store the executable name.
+  dart::bin::Platform::SetExecutableName(argv[0]);
+
   if (argc < 2) {
     // Bad parameter count.
     PrintUsage();
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index 66a5e74..432b42c 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -20,7 +20,7 @@
 @patch
 class X509Certificate {
   @patch
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory X509Certificate._() => new _X509CertificateImpl();
 }
 
@@ -68,9 +68,9 @@
   // Performance is improved if a full buffer of plaintext fits
   // in the encrypted buffer, when encrypted.
   // SIZE and ENCRYPTED_SIZE are referenced from C++.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static final int SIZE = 8 * 1024;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static final int ENCRYPTED_SIZE = 10 * 1024;
 
   _SecureFilterImpl() {
@@ -120,7 +120,7 @@
   // This is a security issue, as it exposes a raw pointer to Dart code.
   int _pointer() native "SecureSocket_FilterPointer";
 
-  @pragma("vm.entry-point", "get")
+  @pragma("vm:entry-point", "get")
   List<_ExternalBuffer> buffers;
 }
 
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index c5db6b9..7f11ffa 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -337,12 +337,19 @@
                               bool strong,
                               const char* package_config) {
 #if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
-  Dart_KernelCompilationResult result =
-      dfe.CompileScript(script_name, strong, false, package_config);
-  if (result.status != Dart_KernelCompilationStatus_Ok) {
-    ErrorExit(kErrorExitCode, "%s\n", result.error);
+  uint8_t* kernel_buffer = NULL;
+  intptr_t kernel_buffer_size = 0;
+  dfe.ReadScript(script_name, &kernel_buffer, &kernel_buffer_size);
+  if (kernel_buffer != NULL) {
+    WriteSnapshotFile(snapshot_filename, kernel_buffer, kernel_buffer_size);
+  } else {
+    Dart_KernelCompilationResult result =
+        dfe.CompileScript(script_name, strong, false, package_config);
+    if (result.status != Dart_KernelCompilationStatus_Ok) {
+      ErrorExit(kErrorExitCode, "%s\n", result.error);
+    }
+    WriteSnapshotFile(snapshot_filename, result.kernel, result.kernel_size);
   }
-  WriteSnapshotFile(snapshot_filename, result.kernel, result.kernel_size);
 #else
   UNREACHABLE();
 #endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 737a355..b3593cb 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -1905,7 +1905,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 Datagram _makeDatagram(
     List<int> data, String address, List<int> in_addr, int port) {
   return new Datagram(data, new _InternetAddress(address, null, in_addr), port);
diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart
index d71b434..de7f452 100644
--- a/runtime/bin/vmservice/loader.dart
+++ b/runtime/bin/vmservice/loader.dart
@@ -62,9 +62,9 @@
   FileRequest(this.sp, this.tag, this.uri, this.resolvedUri, this.libraryUrl);
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _traceLoading = false;
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _deterministic = false;
 
 // State associated with the isolate that is used for loading.
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index 54d6c23..10da851 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -16,21 +16,21 @@
 part 'server.dart';
 
 // The TCP ip/port that the HTTP server listens on.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 int _port;
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 String _ip;
 // Should the HTTP server auto start?
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _autoStart;
 // Should the HTTP server run in devmode?
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _originCheckDisabled;
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _isWindows = false;
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _isFuchsia = false;
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 var _signalWatch;
 var _signalSubscription;
 
@@ -227,7 +227,7 @@
   _signalSubscription = _signalWatch(ProcessSignal.SIGQUIT).listen(_onSignal);
 }
 
-@pragma("vm.entry-point", !const bool.fromEnvironment("dart.vm.product"))
+@pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
 main() {
   // Set embedder hooks.
   VMServiceEmbedderHooks.cleanup = cleanupCallback;
diff --git a/runtime/docs/pragmas.md b/runtime/docs/pragmas.md
new file mode 100644
index 0000000..0cc036c
--- /dev/null
+++ b/runtime/docs/pragmas.md
@@ -0,0 +1,19 @@
+# VM-Specific Pragma Annotations
+
+## Pragmas for general use
+
+These pragmas are part of the VM's API and are safe for use in external code.
+
+- **vm:entry-point**
+
+  [Defining entry-points into Dart code for an embedder or native methods]
+  (file://../vm/compiler/aot/entry_points_pragma.md)
+
+## Pragmas for internal testing
+
+These pragmas are used for inspecting or modifying internal VM state and should be used exclusively by SDK tests. They must be enabled with the `--enable-testing-pragmas` flag. The names of these pragmas are prefixed with "testing". Additionally, they are categorized into "safe" and "unsafe" forms: "safe" pragmas should not affect the behavior of the program and can be safely added anywhere. "unsafe" pragmas may change the code's behavior or may cause the VM to crash if used improperly.
+
+- **vm:testing.unsafe.trace-entrypoints-fn**
+
+  [Observing which flow-graph-level entry-point was used when a function was called]
+  (file://../vm/compiler/frontend/entrypoints_pragma.md)
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 1954394..1a9b3d9 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3053,11 +3053,17 @@
  * of it are removed from the embedder code. */
 
 /**
- * Returns the url from which a library was loaded.
+ * Returns an import path to a Library, such as "file:///test.dart" or
+ * "dart:core".
  */
 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library);
 
 /**
+ * Returns a URL from which a Library was loaded.
+ */
+DART_EXPORT Dart_Handle Dart_LibraryResolvedUrl(Dart_Handle library);
+
+/**
  * \return An array of libraries.
  */
 DART_EXPORT Dart_Handle Dart_GetLoadedLibraries();
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 66aab66..304877f 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -4,7 +4,7 @@
 
 // part of "core_patch.dart";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _List<E> extends FixedLengthListBase<E> {
   factory _List(length) native "List_allocate";
 
@@ -122,7 +122,7 @@
 // classes (and inline cache misses) versus a field in the native
 // implementation (checks when modifying). We should keep watching
 // the inline cache misses.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ImmutableList<E> extends UnmodifiableListBase<E> {
   factory _ImmutableList._uninstantiable() {
     throw new UnsupportedError(
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index a072598..1ec264d 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -52,7 +52,7 @@
 
   // Factory constructing a mutable List from a parser generated List literal.
   // [elements] contains elements that are already type checked.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory List._fromLiteral(List elements) {
     if (elements.isEmpty) {
       return new _GrowableList<E>(0);
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index ec67765..0cd4bd8 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -120,7 +120,7 @@
   object._awaiter = awaiter;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _asyncStarMoveNextHelper(var stream) {
   if (stream is! _StreamImpl) {
     return;
@@ -135,7 +135,7 @@
 
 // _AsyncStarStreamController is used by the compiler to implement
 // async* generator functions.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _AsyncStarStreamController<T> {
   StreamController<T> controller;
   Function asyncStarBody;
@@ -290,7 +290,7 @@
   Function _generator;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _completeOnAsyncReturn(Completer completer, Object value) {
   completer.complete(value);
 }
@@ -300,11 +300,11 @@
 Object _asyncStackTraceHelper(Function async_op)
     native "StackTrace_asyncStackTraceHelper";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _clearAsyncThreadStackTrace()
     native "StackTrace_clearAsyncThreadStackTrace";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _setAsyncThreadStackTrace(StackTrace stackTrace)
     native "StackTrace_setAsyncThreadStackTrace";
 
diff --git a/runtime/lib/bool_patch.dart b/runtime/lib/bool_patch.dart
index aded25c..8fffd63 100644
--- a/runtime/lib/bool_patch.dart
+++ b/runtime/lib/bool_patch.dart
@@ -5,7 +5,7 @@
 // part of "core_patch.dart";
 
 @patch
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class bool {
   @patch
   const factory bool.fromEnvironment(String name, {bool defaultValue: false})
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index 8ed8af6..f05df0d 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -8,7 +8,7 @@
 
 // This function takes care of rehashing of the linked hashmaps in [objects]. We
 // do this eagerly after snapshot deserialization.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _rehashObjects(List objects) {
   final int length = objects.length;
   for (int i = 0; i < length; ++i) {
@@ -131,7 +131,7 @@
 }
 
 // VM-internalized implementation of a default-constructed LinkedHashMap.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _InternalLinkedHashMap<K, V> extends _HashVMBase
     with
         MapMixin<K, V>,
@@ -344,7 +344,7 @@
 
   V operator [](Object key) {
     var v = _getValueOrData(key);
-    return identical(_data, v) ? null : v;
+    return identical(_data, v) ? null : internal.unsafeCast<V>(v);
   }
 
   bool containsValue(Object value) {
diff --git a/runtime/lib/developer.dart b/runtime/lib/developer.dart
index 9a3030a..96577e1 100644
--- a/runtime/lib/developer.dart
+++ b/runtime/lib/developer.dart
@@ -68,7 +68,7 @@
     native "Developer_registerExtension";
 
 // This code is only invoked when there is no other Dart code on the stack.
-@pragma("vm.entry-point", !const bool.fromEnvironment("dart.vm.product"))
+@pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
 _runExtension(
     ServiceExtensionHandler handler,
     String method,
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index aa2da6b..1a69396 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -4,7 +4,7 @@
 
 // part of "core_patch.dart";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Double implements double {
   factory _Double.fromInteger(int value) native "Double_doubleFromInteger";
 
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 2363831..fb6aa86 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -19,19 +19,19 @@
   @patch
   StackTrace get stackTrace => _stackTrace;
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   StackTrace _stackTrace;
 }
 
 class _AssertionError extends Error implements AssertionError {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   _AssertionError._create(
       this._failedAssertion, this._url, this._line, this._column, this.message);
 
   // AssertionError_throwNew in errors.cc fishes the assertion source code
   // out of the script. It expects a Dart stack frame from class
   // _AssertionError. Thus we need a Dart stub that calls the native code.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static _throwNew(int assertionStart, int assertionEnd, Object message) {
     _doThrowNew(assertionStart, assertionEnd, message);
   }
@@ -39,7 +39,7 @@
   static _doThrowNew(int assertionStart, int assertionEnd, Object message)
       native "AssertionError_throwNew";
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static _evaluateAssertion(condition) {
     if (identical(condition, true) || identical(condition, false)) {
       return condition;
@@ -81,7 +81,7 @@
 }
 
 class _TypeError extends _AssertionError implements TypeError {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   _TypeError._create(String url, int line, int column, String errorMsg)
       : super._create("is assignable", url, line, column, errorMsg);
 
@@ -104,7 +104,7 @@
 }
 
 class _CastError extends Error implements CastError {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   _CastError._create(this._url, this._line, this._column, this._errorMsg);
 
   // A CastError is allocated by TypeError._throwNew() when dst_name equals
@@ -122,7 +122,7 @@
 @patch
 class FallThroughError {
   @patch
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   FallThroughError._create(String url, int line)
       : _url = url,
         _line = line;
@@ -141,7 +141,7 @@
 }
 
 class _InternalError {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const _InternalError(this._msg);
   String toString() => "InternalError: '${_msg}'";
   final String _msg;
@@ -163,7 +163,7 @@
 
 @patch
 class AbstractClassInstantiationError {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   AbstractClassInstantiationError._create(
       this._className, this._url, this._line);
 
@@ -185,14 +185,12 @@
 @patch
 class NoSuchMethodError {
   // Deprecated members to be removed.
-  final Object _receiver;
-  final Symbol _memberName;
-  final List _arguments;
-  final Map<Symbol, dynamic> _namedArguments;
-  final List _existingArgumentNames;
+  Symbol _memberName;
+  List _arguments;
+  Map<Symbol, dynamic> _namedArguments;
+  List _existingArgumentNames;
 
-  // TODO(regis): Move _receiver declaration here:
-  // final Object _receiver;
+  final Object _receiver;
   final _InvocationMirror _invocation;
 
   @patch
@@ -231,7 +229,7 @@
   // Remember the type from the invocation mirror or static compilation
   // analysis when thrown directly with _throwNew. A negative value means
   // that no information is available.
-  final int _invocation_type;
+  int _invocation_type;
 
   // TODO(regis): Deprecated constructor still used by dart2js to be removed.
   @patch
@@ -239,6 +237,7 @@
       List positionalArguments, Map<Symbol, dynamic> namedArguments,
       [List existingArgumentNames = null])
       : _receiver = receiver,
+        _invocation = null,
         _memberName = memberName,
         _arguments = positionalArguments,
         _namedArguments = namedArguments,
@@ -261,7 +260,7 @@
   // _throwNew above, taking a TypeArguments object rather than an unpacked list
   // of types, as well as a list of all arguments and a list of names, rather
   // than a separate list of positional arguments and a map of named arguments.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   NoSuchMethodError._withType(
       this._receiver,
       String memberName,
@@ -580,14 +579,14 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _CompileTimeError extends Error {
   final String _errorMsg;
   _CompileTimeError(this._errorMsg);
   String toString() => _errorMsg;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 dynamic _classRangeAssert(int position, dynamic instance, _Type type, int cid,
     int lowerLimit, int upperLimit) {
   if ((cid < lowerLimit || cid > upperLimit) && instance != null) {
@@ -597,7 +596,7 @@
   return instance;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 dynamic _classIdEqualsAssert(
     int position, dynamic instance, _Type type, int cid, int otherCid) {
   if (cid != otherCid && instance != null) {
diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
index 2707cf7..8a47f00 100644
--- a/runtime/lib/function.dart
+++ b/runtime/lib/function.dart
@@ -4,7 +4,7 @@
 
 // part of "core_patch.dart";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Closure implements Function {
   bool operator ==(Object other) native "Closure_equals";
 
@@ -29,15 +29,15 @@
   // deferred objects is properly initialized.
   // Caution: These fields are not Dart instances, but VM objects. Their Dart
   // names do not need to match the C++ names, but they must be private.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   var _instantiator_type_arguments;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   var _function_type_arguments;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   var _delayed_type_arguments;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   var _function;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   var _context;
 
   // Note: _Closure objects are created by VM "magically", without invoking
@@ -47,6 +47,6 @@
   // nullable and may incorrectly remove 'if (_hash == null)' in get:hashCode.
   // This initializer makes _hash field nullable even without constructor
   // compilation.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   var _hash = null;
 }
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index c38af29..68dac2c 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -4,7 +4,7 @@
 
 // part of "core_patch.dart";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _GrowableList<T> extends ListBase<T> {
   void insert(int index, T element) {
     if ((index < 0) || (index > length)) {
diff --git a/runtime/lib/identical_patch.dart b/runtime/lib/identical_patch.dart
index c414789..b229c20 100644
--- a/runtime/lib/identical_patch.dart
+++ b/runtime/lib/identical_patch.dart
@@ -8,5 +8,5 @@
 bool identical(Object a, Object b) native "Identical_comparison";
 
 @patch
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 int identityHashCode(Object object) => object._identityHashCode;
diff --git a/runtime/lib/immutable_map.dart b/runtime/lib/immutable_map.dart
index 8917dd1..8fbe3d9 100644
--- a/runtime/lib/immutable_map.dart
+++ b/runtime/lib/immutable_map.dart
@@ -7,11 +7,11 @@
 /// Immutable map class for compiler generated map literals.
 // TODO(lrn): Extend MapBase with UnmodifiableMapMixin when mixins
 // support forwarding const constructors.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ImmutableMap<K, V> implements Map<K, V> {
   final _ImmutableList _kvPairs;
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const _ImmutableMap._create(_ImmutableList keyValuePairs)
       : _kvPairs = keyValuePairs;
 
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 457c834..fb20195 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -451,7 +451,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Smi extends _IntegerImplementation implements _int64 {
   factory _Smi._uninstantiable() {
     throw new UnsupportedError("_Smi can only be allocated by the VM");
@@ -650,7 +650,7 @@
 }
 
 // Represents integers that cannot be represented by Smi but fit into 64bits.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Mint extends _IntegerImplementation implements _int64 {
   factory _Mint._uninstantiable() {
     throw new UnsupportedError("_Mint can only be allocated by the VM");
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index af8b089..38e7250 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -68,7 +68,7 @@
 
 bool _inquireIs64Bit() native "Internal_inquireIs64Bit";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 bool _classRangeCheck(int cid, int lowerLimit, int upperLimit) {
   return cid >= lowerLimit && cid <= upperLimit;
 }
@@ -98,7 +98,7 @@
 // function type arguments (may be null). The result is null if both input
 // vectors are null or is a newly allocated and canonicalized vector of length
 // 'totalLen'.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _prependTypeArguments(functionTypeArguments, parentTypeArguments, parentLen,
     totalLen) native "Internal_prependTypeArguments";
 
@@ -110,3 +110,10 @@
   }
   return newStack;
 }
+
+// This function can be used to skip implicit or explicit checked down casts in
+// the parts of the core library implementation where we know by construction the
+// type of a value.
+//
+// Important: this is unsafe and must be used with care.
+T unsafeCast<T>(Object v) native "Internal_unsafeCast";
diff --git a/runtime/lib/invocation_mirror_patch.dart b/runtime/lib/invocation_mirror_patch.dart
index 00ceea2..f982d3a 100644
--- a/runtime/lib/invocation_mirror_patch.dart
+++ b/runtime/lib/invocation_mirror_patch.dart
@@ -37,11 +37,11 @@
   static const int _FIRST_NAMED_ENTRY = 3;
 
   // Internal representation of the invocation mirror.
-  final String _functionName;
-  final List _argumentsDescriptor;
-  final List _arguments;
-  final bool _isSuperInvocation;
-  final int _delayedTypeArgumentsLen;
+  String _functionName;
+  List _argumentsDescriptor;
+  List _arguments;
+  bool _isSuperInvocation;
+  int _delayedTypeArgumentsLen;
 
   // External representation of the invocation mirror; populated on demand.
   Symbol _memberName;
@@ -176,7 +176,7 @@
       this._positionalArguments, this._namedArguments, this._isSuperInvocation,
       [this._delayedTypeArgumentsLen = 0]);
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static _allocateInvocationMirror(String functionName,
       List argumentsDescriptor, List arguments, bool isSuperInvocation,
       [int type = null]) {
@@ -189,7 +189,7 @@
   // indicate 0 type arguments, but the actual number of type arguments are
   // passed in `delayedTypeArgumentsLen`. If any type arguments are available,
   // the type arguments vector will be the first entry in `arguments`.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static _allocateInvocationMirrorForClosure(
       String functionName,
       List argumentsDescriptor,
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 7ee29d8..0767bb6 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -34,7 +34,7 @@
   factory Capability() => new _CapabilityImpl();
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _CapabilityImpl implements Capability {
   factory _CapabilityImpl() native "CapabilityImpl_factory";
 
@@ -107,7 +107,7 @@
   _pendingImmediateCallback = callback;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _runPendingImmediateCallback() {
   if (_pendingImmediateCallback != null) {
     var callback = _pendingImmediateCallback;
@@ -124,12 +124,12 @@
 
 /// The embedder can execute this function to get hold of
 /// [_isolateScheduleImmediate] above.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 Function _getIsolateScheduleImmediateClosure() {
   return _isolateScheduleImmediate;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _RawReceivePortImpl implements RawReceivePort {
   factory _RawReceivePortImpl() native "RawReceivePortImpl_factory";
 
@@ -156,14 +156,14 @@
   _get_sendport() native "RawReceivePortImpl_get_sendport";
 
   // Called from the VM to retrieve the handler for a message.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static _lookupHandler(int id) {
     var result = _handlerMap[id];
     return result;
   }
 
   // Called from the VM to dispatch to the handler.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static void _handleMessage(Function handler, var message) {
     // TODO(floitsch): this relies on the fact that any exception aborts the
     // VM. Once we have non-fatal global exceptions we need to catch errors
@@ -194,10 +194,10 @@
   static final Map _handlerMap = _initHandlerMap();
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _SendPortImpl implements SendPort {
   /*--- public interface ---*/
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   void send(var message) {
     _sendInternal(message);
   }
@@ -227,7 +227,7 @@
  * initial message.  Defers execution of the entry point until the
  * isolate is in the message loop.
  */
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _startMainIsolate(Function entryPoint, List<String> args) {
   _startIsolate(
       null, // no parent port
@@ -243,7 +243,7 @@
  * Takes the real entry point as argument and invokes it with the initial
  * message.
  */
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _startIsolate(
     SendPort parentPort,
     Function entryPoint,
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index de00fcd..8b1fed1 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -5,7 +5,7 @@
 // part of "core_patch.dart";
 
 // This type corresponds to the VM-internal class LibraryPrefix.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _LibraryPrefix {
   bool _load() native "LibraryPrefix_load";
   Object _loadError() native "LibraryPrefix_loadError";
@@ -47,7 +47,7 @@
 var _outstandingLoadRequests = new List<List>();
 
 // Called from the VM when an outstanding load request has finished.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _completeDeferredLoads() {
   // Determine which outstanding load requests have completed and complete
   // their completer (with an error or true). For outstanding load requests
diff --git a/runtime/lib/map_patch.dart b/runtime/lib/map_patch.dart
index f1a03a0..a604206 100644
--- a/runtime/lib/map_patch.dart
+++ b/runtime/lib/map_patch.dart
@@ -11,7 +11,7 @@
   // The keys are at position 2*n and are already type checked by the parser
   // in checked mode.
   // The values are at position 2*n+1 and are not yet type checked.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory Map._fromLiteral(List elements) {
     var map = new LinkedHashMap<K, V>();
     var len = elements.length;
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 1c5b327..ff9b2fa 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -178,7 +178,7 @@
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   final Uint32List _state;
   static const _kSTATE_LO = 0;
   static const _kSTATE_HI = 1; // Unused in Dart code.
diff --git a/runtime/lib/mirror_reference.dart b/runtime/lib/mirror_reference.dart
index 8b31670..ca21b5b 100644
--- a/runtime/lib/mirror_reference.dart
+++ b/runtime/lib/mirror_reference.dart
@@ -4,7 +4,7 @@
 
 // part of "mirrors_patch.dart";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _MirrorReference {
   factory _MirrorReference._uninstantiable() {
     throw new UnsupportedError("class _MirrorReference cannot be instantiated");
diff --git a/runtime/lib/null_patch.dart b/runtime/lib/null_patch.dart
index 08b55bb..01bb5aa 100644
--- a/runtime/lib/null_patch.dart
+++ b/runtime/lib/null_patch.dart
@@ -5,7 +5,7 @@
 // part of "core_patch.dart";
 
 @patch
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class Null {
   static const _HASH_CODE = 2011; // The year Dart was announced and a prime.
 
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index a9a0550..3e01f83 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -319,6 +319,11 @@
 #endif  // defined(ARCH_IS_64_BIT)
 }
 
+DEFINE_NATIVE_ENTRY(Internal_unsafeCast, 1) {
+  UNREACHABLE();  // Should be erased at Kernel translation time.
+  return arguments->NativeArgAt(0);
+}
+
 static bool ExtractInterfaceTypeArgs(Zone* zone,
                                      const Class& instance_cls,
                                      const TypeArguments& instance_type_args,
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index 8a743ba..c63d3e4 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -8,7 +8,7 @@
 void _setHash(obj, hash) native "Object_setHash";
 
 @patch
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class Object {
   // The VM has its own implementation of equals.
   @patch
@@ -42,7 +42,7 @@
   static String _toString(obj) native "Object_toString";
 
   @patch
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   dynamic noSuchMethod(Invocation invocation) {
     // TODO(regis): Remove temp constructor identifier 'withInvocation'.
     throw new NoSuchMethodError.withInvocation(this, invocation);
@@ -51,21 +51,21 @@
   @patch
   Type get runtimeType native "Object_runtimeType";
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static bool _haveSameRuntimeType(a, b) native "Object_haveSameRuntimeType";
 
   // Call this function instead of inlining instanceof, thus collecting
   // type feedback and reducing code size of unoptimized code.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   bool _instanceOf(instantiatorTypeArguments, functionTypeArguments, type)
       native "Object_instanceOf";
 
   // Group of functions for implementing fast simple instance of.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   bool _simpleInstanceOf(type) native "Object_simpleInstanceOf";
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   bool _simpleInstanceOfTrue(type) => true;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   bool _simpleInstanceOfFalse(type) => false;
 
   // Call this function instead of inlining 'as', thus collecting type
diff --git a/runtime/lib/print_patch.dart b/runtime/lib/print_patch.dart
index 3d390fa..f0e7d91 100644
--- a/runtime/lib/print_patch.dart
+++ b/runtime/lib/print_patch.dart
@@ -19,5 +19,5 @@
 
 // _printClosure can be overwritten by the embedder to supply a different
 // print implementation.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _PrintClosure _printClosure = _unsupportedPrint;
diff --git a/runtime/lib/profiler.dart b/runtime/lib/profiler.dart
index 7814d69..745eaa5 100644
--- a/runtime/lib/profiler.dart
+++ b/runtime/lib/profiler.dart
@@ -14,7 +14,7 @@
   static UserTag get defaultTag => _getDefaultTag();
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _UserTag implements UserTag {
   factory _UserTag(String label) native "UserTag_new";
   String get label native "UserTag_label";
diff --git a/runtime/lib/regexp_patch.dart b/runtime/lib/regexp_patch.dart
index f24cdeb..de20a72 100644
--- a/runtime/lib/regexp_patch.dart
+++ b/runtime/lib/regexp_patch.dart
@@ -182,7 +182,7 @@
   static const int _MATCH_PAIR = 2;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _RegExp implements RegExp {
   factory _RegExp(String pattern,
       {bool multiLine: false,
diff --git a/runtime/lib/schedule_microtask_patch.dart b/runtime/lib/schedule_microtask_patch.dart
index 4efde2d..58e30e7 100644
--- a/runtime/lib/schedule_microtask_patch.dart
+++ b/runtime/lib/schedule_microtask_patch.dart
@@ -21,12 +21,12 @@
   static _ScheduleImmediateClosure _closure;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _setScheduleImmediateClosure(_ScheduleImmediateClosure closure) {
   _ScheduleImmediate._closure = closure;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void _ensureScheduleImmediate() {
   _AsyncRun._scheduleImmediate(_startMicrotaskLoop);
 }
diff --git a/runtime/lib/stacktrace.dart b/runtime/lib/stacktrace.dart
index ca29353..719d55a 100644
--- a/runtime/lib/stacktrace.dart
+++ b/runtime/lib/stacktrace.dart
@@ -5,7 +5,7 @@
 // part of "core_patch.dart";
 
 /// VM internal StackTrace implementation.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _StackTrace implements StackTrace {
   // toString() is overridden on the C++ side.
 }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 2757b76..d7dfc1c 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -795,7 +795,7 @@
   }
 
   // Convert single object to string.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static String _interpolateSingle(Object o) {
     if (o is String) return o;
     final s = o.toString();
@@ -810,7 +810,7 @@
    * into a result string.
    * Modifies the input list if it contains non-`String` values.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static String _interpolate(final List values) {
     final numValues = values.length;
     int totalLength = 0;
@@ -923,7 +923,7 @@
       native "String_concatRange";
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _OneByteString extends _StringBase {
   factory _OneByteString._uninstantiable() {
     throw new UnsupportedError(
@@ -1227,7 +1227,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _TwoByteString extends _StringBase {
   factory _TwoByteString._uninstantiable() {
     throw new UnsupportedError(
@@ -1248,7 +1248,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalOneByteString extends _StringBase {
   factory _ExternalOneByteString._uninstantiable() {
     throw new UnsupportedError(
@@ -1266,7 +1266,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalTwoByteString extends _StringBase {
   factory _ExternalTwoByteString._uninstantiable() {
     throw new UnsupportedError(
diff --git a/runtime/lib/timer_impl.dart b/runtime/lib/timer_impl.dart
index 1f85aa2..89cb6cd 100644
--- a/runtime/lib/timer_impl.dart
+++ b/runtime/lib/timer_impl.dart
@@ -462,7 +462,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _setupHooks() {
   VMLibraryHooks.timerFactory = _Timer._factory;
 }
diff --git a/runtime/lib/type_patch.dart b/runtime/lib/type_patch.dart
index 95defc8..82aa34e 100644
--- a/runtime/lib/type_patch.dart
+++ b/runtime/lib/type_patch.dart
@@ -12,23 +12,23 @@
 }
 
 // Equivalent of RawType.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Type extends _AbstractType {
   int get hashCode native "Type_getHashCode";
 }
 
 // Equivalent of RawTypeRef.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _TypeRef extends _AbstractType {}
 
 // Equivalent of RawTypeParameter.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _TypeParameter extends _AbstractType {}
 
 // Equivalent of RawBoundedType.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _BoundedType extends _AbstractType {}
 
 // Equivalent of RawMixinAppType.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _MixinAppType extends _AbstractType {}
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index 8c7a1e5..4dbf16b 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -36,14 +36,14 @@
 @patch
 class ByteData implements TypedData {
   @patch
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory ByteData(int length) {
     final list = new Uint8List(length) as _TypedList;
     return new _ByteDataView(list, 0, length);
   }
 
   // Called directly from C code.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory ByteData._view(_TypedList typedData, int offsetInBytes, int length) {
     return new _ByteDataView(typedData, offsetInBytes, length);
   }
@@ -1897,13 +1897,13 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ByteBuffer implements ByteBuffer {
   final _TypedList _data;
 
   _ByteBuffer(this._data);
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory _ByteBuffer._New(data) => new _ByteBuffer(data);
 
   // Forward calls to _data.
@@ -2123,7 +2123,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int8List extends _TypedList with _IntListMixin implements Int8List {
   // Method(s) implementing List interface.
   int operator [](int index) {
@@ -2163,7 +2163,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint8List extends _TypedList with _IntListMixin implements Uint8List {
   // Methods implementing List interface.
   int operator [](int index) {
@@ -2203,7 +2203,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint8ClampedList extends _TypedList
     with _IntListMixin
     implements Uint8ClampedList {
@@ -2245,7 +2245,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int16List extends _TypedList with _IntListMixin implements Int16List {
   // Method(s) implementing List interface.
   int operator [](int index) {
@@ -2304,7 +2304,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint16List extends _TypedList with _IntListMixin implements Uint16List {
   // Method(s) implementing the List interface.
   int operator [](int index) {
@@ -2363,7 +2363,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int32List extends _TypedList with _IntListMixin implements Int32List {
   // Method(s) implementing the List interface.
   int operator [](int index) {
@@ -2411,7 +2411,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint32List extends _TypedList with _IntListMixin implements Uint32List {
   // Method(s) implementing the List interface.
   int operator [](int index) {
@@ -2459,7 +2459,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int64List extends _TypedList with _IntListMixin implements Int64List {
   // Method(s) implementing the List interface.
   int operator [](int index) {
@@ -2507,7 +2507,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint64List extends _TypedList with _IntListMixin implements Uint64List {
   // Method(s) implementing the List interface.
   int operator [](int index) {
@@ -2555,7 +2555,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float32List extends _TypedList
     with _DoubleListMixin
     implements Float32List {
@@ -2605,7 +2605,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float64List extends _TypedList
     with _DoubleListMixin
     implements Float64List {
@@ -2655,7 +2655,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float32x4List extends _TypedList
     with _Float32x4ListMixin
     implements Float32x4List {
@@ -2704,7 +2704,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int32x4List extends _TypedList
     with _Int32x4ListMixin
     implements Int32x4List {
@@ -2753,7 +2753,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float64x2List extends _TypedList
     with _Float64x2ListMixin
     implements Float64x2List {
@@ -2790,7 +2790,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalInt8Array extends _TypedList
     with _IntListMixin
     implements Int8List {
@@ -2820,7 +2820,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalUint8Array extends _TypedList
     with _IntListMixin
     implements Uint8List {
@@ -2850,7 +2850,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalUint8ClampedArray extends _TypedList
     with _IntListMixin
     implements Uint8ClampedList {
@@ -2880,7 +2880,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalInt16Array extends _TypedList
     with _IntListMixin
     implements Int16List {
@@ -2919,7 +2919,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalUint16Array extends _TypedList
     with _IntListMixin
     implements Uint16List {
@@ -2958,7 +2958,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalInt32Array extends _TypedList
     with _IntListMixin
     implements Int32List {
@@ -2996,7 +2996,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalUint32Array extends _TypedList
     with _IntListMixin
     implements Uint32List {
@@ -3035,7 +3035,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalInt64Array extends _TypedList
     with _IntListMixin
     implements Int64List {
@@ -3074,7 +3074,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalUint64Array extends _TypedList
     with _IntListMixin
     implements Uint64List {
@@ -3113,7 +3113,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalFloat32Array extends _TypedList
     with _DoubleListMixin
     implements Float32List {
@@ -3152,7 +3152,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalFloat64Array extends _TypedList
     with _DoubleListMixin
     implements Float64List {
@@ -3191,7 +3191,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalFloat32x4Array extends _TypedList
     with _Float32x4ListMixin
     implements Float32x4List {
@@ -3230,7 +3230,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalInt32x4Array extends _TypedList
     with _Int32x4ListMixin
     implements Int32x4List {
@@ -3269,7 +3269,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ExternalFloat64x2Array extends _TypedList
     with _Float64x2ListMixin
     implements Float64x2List {
@@ -3327,7 +3327,7 @@
   factory Float32x4.fromFloat64x2(Float64x2 v) native "Float32x4_fromFloat64x2";
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float32x4 implements Float32x4 {
   Float32x4 operator +(Float32x4 other) native "Float32x4_add";
   Float32x4 operator -() native "Float32x4_negate";
@@ -3378,7 +3378,7 @@
       native "Int32x4_fromFloat32x4Bits";
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int32x4 implements Int32x4 {
   Int32x4 operator |(Int32x4 other) native "Int32x4_or";
   Int32x4 operator &(Int32x4 other) native "Int32x4_and";
@@ -3423,7 +3423,7 @@
   factory Float64x2.fromFloat32x4(Float32x4 v) native "Float64x2_fromFloat32x4";
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float64x2 implements Float64x2 {
   Float64x2 operator +(Float64x2 other) native "Float64x2_add";
   Float64x2 operator -() native "Float64x2_negate";
@@ -3493,7 +3493,7 @@
   final int length;
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int8ArrayView extends _TypedListView
     with _IntListMixin
     implements Int8List {
@@ -3538,7 +3538,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint8ArrayView extends _TypedListView
     with _IntListMixin
     implements Uint8List {
@@ -3583,7 +3583,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint8ClampedArrayView extends _TypedListView
     with _IntListMixin
     implements Uint8ClampedList {
@@ -3629,7 +3629,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int16ArrayView extends _TypedListView
     with _IntListMixin
     implements Int16List {
@@ -3687,7 +3687,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint16ArrayView extends _TypedListView
     with _IntListMixin
     implements Uint16List {
@@ -3746,7 +3746,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int32ArrayView extends _TypedListView
     with _IntListMixin
     implements Int32List {
@@ -3792,7 +3792,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint32ArrayView extends _TypedListView
     with _IntListMixin
     implements Uint32List {
@@ -3838,7 +3838,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int64ArrayView extends _TypedListView
     with _IntListMixin
     implements Int64List {
@@ -3884,7 +3884,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Uint64ArrayView extends _TypedListView
     with _IntListMixin
     implements Uint64List {
@@ -3930,7 +3930,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float32ArrayView extends _TypedListView
     with _DoubleListMixin
     implements Float32List {
@@ -3976,7 +3976,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float64ArrayView extends _TypedListView
     with _DoubleListMixin
     implements Float64List {
@@ -4022,7 +4022,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float32x4ArrayView extends _TypedListView
     with _Float32x4ListMixin
     implements Float32x4List {
@@ -4068,7 +4068,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Int32x4ArrayView extends _TypedListView
     with _Int32x4ListMixin
     implements Int32x4List {
@@ -4114,7 +4114,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _Float64x2ArrayView extends _TypedListView
     with _Float64x2ListMixin
     implements Float64x2List {
@@ -4160,7 +4160,7 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _ByteDataView implements ByteData {
   _ByteDataView(_TypedList typedData, int _offsetInBytes, int _lengthInBytes)
       : _typedData = typedData,
diff --git a/runtime/lib/uri_patch.dart b/runtime/lib/uri_patch.dart
index 161e6fa..de10c9e 100644
--- a/runtime/lib/uri_patch.dart
+++ b/runtime/lib/uri_patch.dart
@@ -12,7 +12,7 @@
 
 // _uriBaseClosure can be overwritten by the embedder to supply a different
 // value for Uri.base.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 _UriBaseClosure _uriBaseClosure = _unsupportedUriBase;
 
 @patch
diff --git a/runtime/lib/weak_property.dart b/runtime/lib/weak_property.dart
index 28a4352..bc903e9 100644
--- a/runtime/lib/weak_property.dart
+++ b/runtime/lib/weak_property.dart
@@ -4,7 +4,7 @@
 
 // part of "core_patch.dart";
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class _WeakProperty {
   factory _WeakProperty(key, value) => _new(key, value);
 
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index 3ccc6c3..cb98b6e 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -448,18 +448,41 @@
   int getOwnedByCid(int cid) => _ownedSizesByCid[cid];
 
   Iterable<ObjectVertex> getMostRetained({int classId, int limit}) {
-    List<ObjectVertex> _mostRetained =
-        new List<ObjectVertex>.from(vertices.where((u) => !u.isRoot));
-    _mostRetained.sort((u, v) => v.retainedSize - u.retainedSize);
+    if (limit != null && limit < 20) {
+      SplayTreeSet<int> workingSet = new SplayTreeSet<int>((int e1, int e2) {
+        int result = _retainedSizes[e2] - _retainedSizes[e1];
+        if (result != 0) return result;
+        return e2 - e1;
+      });
 
-    var result = _mostRetained;
-    if (classId != null) {
-      result = result.where((u) => u.vmCid == classId);
+      for (int i = ROOT + 1; i < _N; i++) {
+        if (classId != null && _cids[i] != classId) continue;
+        workingSet.add(i);
+        if (workingSet.length > limit) {
+          int smallest = workingSet.last;
+          workingSet.remove(smallest);
+        }
+      }
+
+      List<ObjectVertex> result = new List<ObjectVertex>();
+      for (int id in workingSet) {
+        result.add(new ObjectVertex._(id, this));
+      }
+      return result;
+    } else {
+      List<ObjectVertex> _mostRetained =
+          new List<ObjectVertex>.from(vertices.where((u) => !u.isRoot));
+      _mostRetained.sort((u, v) => v.retainedSize - u.retainedSize);
+
+      Iterable<ObjectVertex> result = _mostRetained;
+      if (classId != null) {
+        result = result.where((u) => u.vmCid == classId);
+      }
+      if (limit != null) {
+        result = result.take(limit);
+      }
+      return result;
     }
-    if (limit != null) {
-      result = result.take(limit);
-    }
-    return result;
   }
 
   Stream<List> process() {
diff --git a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
index 9b90eaa..130d56c 100644
--- a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
@@ -116,7 +116,7 @@
 
   List<Future<S.ServiceObject>> getMostRetained(S.Isolate isolate,
       {int classId, int limit}) {
-    var result = [];
+    List<Future<S.ServiceObject>> result = <Future<S.ServiceObject>>[];
     for (ObjectVertex v
         in graph.getMostRetained(classId: classId, limit: limit)) {
       result.add(
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index bb53a09..6500551 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1180,7 +1180,7 @@
 
 class InboundReference implements M.InboundReference {
   final ServiceObject /*HeapObject*/ source;
-  final Instance parentField;
+  final HeapObject parentField;
   final int parentListIndex;
   final int parentWordOffset;
 
@@ -1202,7 +1202,7 @@
 
 class RetainingPathItem implements M.RetainingPathItem {
   final ServiceObject /*HeapObject*/ source;
-  final Instance parentField;
+  final HeapObject parentField;
   final int parentListIndex;
   final int parentWordOffset;
 
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index daee1cb..07a03d9 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -33,6 +33,7 @@
 pause_on_unhandled_async_exceptions2_test: Pass, RuntimeError, Timeout, Crash # Issue 29178
 process_service_test: RuntimeError # Spawned process runs in Dart2 mode
 set_name_rpc_test: RuntimeError # Issue 27806
+simple_reload_test: RuntimeError # Issue 27806
 step_through_constructor_calls_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 step_through_function_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 step_through_switch_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 62a65e9..e90e5a5 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -95,6 +95,7 @@
 set_library_debuggable_test: RuntimeError
 set_name_rpc_test: RuntimeError
 set_vm_name_rpc_test: RuntimeError
+simple_reload_test: RuntimeError
 steal_breakpoint_test: RuntimeError
 step_into_async_no_await_test: RuntimeError
 step_over_await_test: RuntimeError
@@ -133,6 +134,9 @@
 developer_extension_test: CompileTimeError
 get_isolate_after_language_error_test: CompileTimeError
 
+[ $arch == arm64 && $compiler == dartk ]
+coverage_optimized_function_test: Pass, Slow
+
 [ $arch != simarm && $arch != simarm64 && $arch != simdbc && $compiler == dartk ]
 complex_reload_test: RuntimeError
 
@@ -252,5 +256,6 @@
 rewind_optimized_out_test: RuntimeError # Issue #33087
 rewind_test: Pass, RuntimeError
 set_name_rpc_test: RuntimeError # Please triage.
+simple_reload_test: RuntimeError, Timeout
 unused_changes_in_last_reload_test: Skip # Times out on sim architectures.
 valid_source_locations_test: Pass, Slow, Timeout # Issue 33087
diff --git a/runtime/observatory/tests/service/simple_reload/v1/main.dart b/runtime/observatory/tests/service/simple_reload/v1/main.dart
new file mode 100644
index 0000000..887ded3
--- /dev/null
+++ b/runtime/observatory/tests/service/simple_reload/v1/main.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.
+
+import 'dart:isolate';
+
+test() => 'apple';
+
+class Foo<T> {}
+
+main() {
+  RawReceivePort keepAlive = new RawReceivePort();
+  new Foo<String>();
+  print('spawned isolate running');
+}
diff --git a/runtime/observatory/tests/service/simple_reload/v2/main.dart b/runtime/observatory/tests/service/simple_reload/v2/main.dart
new file mode 100644
index 0000000..0be97ce
--- /dev/null
+++ b/runtime/observatory/tests/service/simple_reload/v2/main.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+
+test() => 'orange';
+
+class Foo<T> {}
+
+main() {
+  RawReceivePort keepAlive = new RawReceivePort();
+  print('spawned isolate running');
+}
diff --git a/runtime/observatory/tests/service/simple_reload_test.dart b/runtime/observatory/tests/service/simple_reload_test.dart
new file mode 100644
index 0000000..9a41817
--- /dev/null
+++ b/runtime/observatory/tests/service/simple_reload_test.dart
@@ -0,0 +1,74 @@
+// 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 'test_helper.dart';
+import 'dart:async';
+import 'dart:developer';
+import 'dart:isolate' as I;
+import 'dart:io';
+import 'service_test_common.dart';
+import 'package:observatory/service.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+// Chop off the file name.
+String baseDirectory = path.dirname(Platform.script.path) + '/';
+
+Uri baseUri = Platform.script.replace(path: baseDirectory);
+Uri spawnUri = baseUri.resolveUri(Uri.parse('simple_reload/v1/main.dart'));
+Uri v2Uri = baseUri.resolveUri(Uri.parse('simple_reload/v2/main.dart'));
+
+testMain() async {
+  print(baseUri);
+  debugger(); // Stop here.
+  // Spawn the child isolate.
+  I.Isolate isolate = await I.Isolate.spawnUri(spawnUri, [], null);
+  print(isolate);
+  debugger();
+}
+
+Future<String> invokeTest(Isolate isolate) async {
+  await isolate.reload();
+  Library lib = isolate.rootLibrary;
+  await lib.load();
+  Instance result = await lib.evaluate('test()');
+  expect(result.isString, isTrue);
+  return result.valueAsString;
+}
+
+var tests = <IsolateTest>[
+  // Stopped at 'debugger' statement.
+  hasStoppedAtBreakpoint,
+  // Resume the isolate into the while loop.
+  resumeIsolate,
+  // Stop at 'debugger' statement.
+  hasStoppedAtBreakpoint,
+  (Isolate mainIsolate) async {
+    // Grab the VM.
+    VM vm = mainIsolate.vm;
+    await vm.reloadIsolates();
+    expect(vm.isolates.length, 2);
+
+    // Find the spawned isolate.
+    Isolate spawnedIsolate =
+        vm.isolates.firstWhere((Isolate i) => i != mainIsolate);
+    expect(spawnedIsolate, isNotNull);
+
+    // Invoke test in v1.
+    String v1 = await invokeTest(spawnedIsolate);
+    expect(v1, 'apple');
+
+    // Reload to v2.
+    var response = await spawnedIsolate.reloadSources(
+      rootLibUri: v2Uri.toString(),
+    );
+    // Observe that it succeed.
+    expect(response['success'], isTrue);
+
+    String v2 = await invokeTest(spawnedIsolate);
+    expect(v2, 'orange');
+  }
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index cfff1af..91cb9cd 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -86,3 +86,14 @@
   # product).
   exclude_kernel_service = false
 }
+
+declare_args() {
+  # We create a kernel service app-jit snapshot only for when the target
+  # architecture is x64 for other cases we will use the '.dill' file
+  # which is already linked in the VM.
+  if (dart_target_arch == "x64") {
+    create_kernel_service_snapshot = true
+  } else {
+    create_kernel_service_snapshot = false
+  }
+}
diff --git a/runtime/tests/vm/dart/entrypoints/common.dart b/runtime/tests/vm/dart/entrypoints/common.dart
new file mode 100644
index 0000000..37a6aa5
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/common.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// We want to run each test with and without inlining of the target functions.
+// We accomplish this by using VM options in the yes-inlining variant to set the
+// "enable_inlining" constant variable to true. This maximizes code sharing
+// between the two variants, which are otherwise identical.
+const String NeverInline =
+    const bool.fromEnvironment("enable_inlining") ? "" : "NeverInline";
+
+// All these tests can be run in test mode or in benchmark mode. In benchmark
+// mode, there is introspection is omitted and the tests runs for many more
+// iterations.
+const bool benchmarkMode = const bool.fromEnvironment("benchmark_mode");
+
+int expectedEntryPoint = -1;
+int expectedTearoffEntryPoint = -1;
+
+// We check that this is true at the end of the test to ensure that the
+// introspection machinery is operational.
+bool validateRan = false;
+
+_validateHelper(int expected, int ep) {
+  validateRan = true;
+  if (ep < 0 || ep > 2) {
+    Expect.fail("ERROR: invalid entry-point ($ep) passed by VM.");
+  }
+  if (expected < -1 || expected > 2) {
+    Expect.fail("ERROR: invalid expected entry-point set ($expected)");
+  }
+  if (expected == -1) return;
+  Expect.equals(expected, ep);
+}
+
+void _validateFn(String _, int ep) => _validateHelper(expectedEntryPoint, ep);
+
+// Invocation of tearoffs go through a tearoff wrapper. We want to independently
+// test which entrypoint was used for the tearoff wrapper vs. which was used for
+// actual target.
+_validateTearoffFn(String name, int entryPoint) {
+  _validateHelper(
+      name.endsWith("#tearoff")
+          ? expectedTearoffEntryPoint
+          : expectedEntryPoint,
+      entryPoint);
+}
+
+const validate = benchmarkMode ? null : _validateFn;
+const validateTearoff = benchmarkMode ? null : _validateTearoffFn;
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this.dart
new file mode 100644
index 0000000..6099194
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
+// entrypoint. The use of optional arguments here encourages prologue sharing
+// between the entrypoints.
+
+import "common.dart";
+import "package:expect/expect.dart";
+
+abstract class C<T> {
+  @NeverInline
+  void samir1(T x) {
+    samir2(x, y: "hi");
+  }
+
+  void samir2(T x, {String y});
+}
+
+class D<T> extends C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  void samir2(T x, {String y}) {
+    Expect.notEquals(x, -1);
+    Expect.equals(y, "hi");
+  }
+}
+
+class E<T> extends C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  void samir2(T x, {String y}) {
+    Expect.notEquals(x, -1);
+    Expect.equals(y, "hi");
+  }
+}
+
+int j = 0;
+
+C getC() {
+  if (j % 2 == 0) {
+    ++j;
+    return new D<int>();
+  } else {
+    ++j;
+    return new E<int>();
+  }
+}
+
+test(List<String> args) {
+  // Warmup.
+  expectedEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    getC().samir1(i);
+  }
+
+  expectedEntryPoint = 2;
+  const int iterations = benchmarkMode ? 100000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    getC().samir1(i);
+  }
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_inline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_inline_test.dart
new file mode 100644
index 0000000..7d01f34
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_inline_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+
+import "polymorphic_optional_this.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_noinline_test.dart
new file mode 100644
index 0000000..5dbf571
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_noinline_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+
+import "polymorphic_optional_this.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_this.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_this.dart
new file mode 100644
index 0000000..5d4aac9
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/polymorphic_this.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
+// entrypoint.
+
+import "common.dart";
+import "package:expect/expect.dart";
+
+abstract class C<T> {
+  @NeverInline
+  void target1(T x) {
+    target2(x);
+  }
+
+  void target2(T x);
+}
+
+class D<T> extends C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  void target2(T x) {
+    Expect.notEquals(x, -1);
+  }
+}
+
+class E<T> extends C<T> {
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  @NeverInline
+  void target2(T x) {
+    Expect.notEquals(x, -1);
+  }
+}
+
+int j = 0;
+
+C getC() {
+  if (j % 2 == 0) {
+    ++j;
+    return new D<int>();
+  } else {
+    ++j;
+    return new E<int>();
+  }
+}
+
+test(List<String> args) {
+  // Warmup.
+  expectedEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    getC().target1(0);
+  }
+
+  expectedEntryPoint = 1;
+  const int iterations = benchmarkMode ? 200000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    getC().target1(i);
+  }
+
+  // Once for D and once for E.
+  expectedEntryPoint = 0;
+  dynamic f = getC().target2;
+  f(0);
+  f = getC().target2;
+  f(0);
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_this_inline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_this_inline_test.dart
new file mode 100644
index 0000000..99617e7
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/polymorphic_this_inline_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+
+import "polymorphic_this.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_this_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_this_noinline_test.dart
new file mode 100644
index 0000000..7e2e1f0
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/polymorphic_this_noinline_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+
+import "polymorphic_this.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/static_this.dart b/runtime/tests/vm/dart/entrypoints/static_this.dart
new file mode 100644
index 0000000..d64f6be
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/static_this.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that 'StaticCall's against "this" go through the unchecked entry-point.
+
+import "common.dart";
+import "package:expect/expect.dart";
+
+class C<T> {
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  @NeverInline
+  void target2(T x) {
+    Expect.notEquals(x, -1);
+  }
+
+  @NeverInline
+  void target1(T x) {
+    target2(x);
+  }
+}
+
+test(List<String> args) {
+  // Make sure the precise runtime-type of C is not known below.
+  C c = args.length == 0 ? C<int>() : C<String>();
+
+  // Warmup.
+  expectedEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    c.target1(i);
+  }
+
+  expectedEntryPoint = 1;
+  const int iterations = benchmarkMode ? 400000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    c.target1(i);
+  }
+
+  expectedEntryPoint = 0;
+  dynamic f = c.target2;
+  f(0);
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/static_this_inline_test.dart b/runtime/tests/vm/dart/entrypoints/static_this_inline_test.dart
new file mode 100644
index 0000000..ea7391e
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/static_this_inline_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+
+import "static_this.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/static_this_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/static_this_noinline_test.dart
new file mode 100644
index 0000000..453677b
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/static_this_noinline_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+
+import "static_this.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 854f28c..48294f4 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -53,6 +53,9 @@
 dart/truncating_ints_test: SkipByDesign # The test requires int64.
 dart/wrap_around_in_range_analysis_test: SkipByDesign # The test requires int64.
 
+[ $compiler != dartk || ($arch != x64 && $arch != simarm && $arch != arm) || $hot_reload || $hot_reload_rollback ]
+dart/entrypoints/*: Skip  # Only supported in Dart 2 JIT (hot-reload -> issue 34199).
+
 [ ($compiler == dartk || $compiler == dartkb) ]
 cc/DartAPI_New: Fail # Issue #33041
 dart/redirection_type_shuffling_test/00: RuntimeError, Pass
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 458ad3e..b47ed54 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -328,10 +328,13 @@
     "$root_out_dir/vm_outline_strong.dill",
   ]
 
-  args = [
-    "--strong-mode",
-    "dart:core",
-  ]
+  args = [ "--strong-mode" ]
+
+  if (dart_use_interpreter) {
+    args += [ "--bytecode" ]
+  }
+
+  args += [ "dart:core" ]
 }
 
 group("kernel_platform_files") {
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 30360b7..1fc543f 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -307,6 +307,7 @@
   V(GrowableList_getCapacity, 1)                                               \
   V(GrowableList_setLength, 2)                                                 \
   V(GrowableList_setData, 2)                                                   \
+  V(Internal_unsafeCast, 1)                                                    \
   V(Internal_makeListFixedLength, 1)                                           \
   V(Internal_makeFixedListUnmodifiable, 1)                                     \
   V(Internal_inquireIs64Bit, 0)                                                \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 6ad3188..c52f150 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1582,6 +1582,25 @@
   }
 }
 
+#if defined(TARGET_ARCH_X64)
+static bool IsPotentialExactGeneric(const AbstractType& type) {
+  // TODO(dartbug.com/34170) Investigate supporting this for fields with types
+  // that depend on type parameters of the enclosing class.
+  if (type.IsType() && !type.IsFunctionType() && !type.IsDartFunctionType() &&
+      type.IsInstantiated()) {
+    const Class& cls = Class::Handle(type.type_class());
+    return cls.IsGeneric();
+  }
+
+  return false;
+}
+#else
+// TODO(dartbug.com/34170) Support other architectures.
+static bool IsPotentialExactGeneric(const AbstractType& type) {
+  return false;
+}
+#endif
+
 void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
   // Note that getters and setters are explicitly listed as such in the list of
   // functions of a class, so we do not need to consider fields as implicitly
@@ -1605,6 +1624,7 @@
   //   instance method.
 
   // Resolve type of fields and check for conflicts in super classes.
+  Isolate* isolate = Isolate::Current();
   Zone* zone = Thread::Current()->zone();
   Array& array = Array::Handle(zone, cls.fields());
   Field& field = Field::Handle(zone);
@@ -1614,11 +1634,16 @@
   String& other_name = String::Handle(zone);
   Class& super_class = Class::Handle(zone);
   const intptr_t num_fields = array.Length();
+  const bool track_exactness = isolate->strong() && isolate->use_field_guards();
   for (intptr_t i = 0; i < num_fields; i++) {
     field ^= array.At(i);
     type = field.type();
     type = FinalizeType(cls, type);
     field.SetFieldType(type);
+    if (track_exactness && IsPotentialExactGeneric(type)) {
+      field.set_static_type_exactness_state(
+          StaticTypeExactnessState::Unitialized());
+    }
     name = field.name();
     if (field.is_static()) {
       getter_name = Field::GetterSymbol(name);
@@ -1676,7 +1701,7 @@
           (!type.IsDynamicType() &&
            !const_value.IsInstanceOf(type, Object::null_type_arguments(),
                                      Object::null_type_arguments(), &error))) {
-        if (Isolate::Current()->error_on_bad_type()) {
+        if (isolate->error_on_bad_type()) {
           const AbstractType& const_value_type =
               AbstractType::Handle(zone, const_value.GetType(Heap::kNew));
           const String& const_value_type_name =
@@ -1718,7 +1743,6 @@
   // If we check for bad overrides, collect interfaces, super interfaces, and
   // super classes of this class.
   GrowableArray<const Class*> interfaces(zone, 4);
-  Isolate* isolate = Isolate::Current();
   if (isolate->error_on_bad_override() && !isolate->strong()) {
     CollectInterfaces(cls, &interfaces);
     // Include superclasses in list of interfaces and super interfaces.
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index df462d3..9b5a4be 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -648,6 +648,7 @@
 
 #if defined(DEBUG)
       func->ptr()->entry_point_ = 0;
+      func->ptr()->unchecked_entry_point_ = 0;
 #endif
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -686,6 +687,10 @@
         uword entry_point = func.raw()->ptr()->code_->ptr()->entry_point_;
         ASSERT(entry_point != 0);
         func.raw()->ptr()->entry_point_ = entry_point;
+        uword unchecked_entry_point =
+            func.raw()->ptr()->code_->ptr()->unchecked_entry_point_;
+        ASSERT(unchecked_entry_point != 0);
+        func.raw()->ptr()->unchecked_entry_point_ = unchecked_entry_point;
       }
     } else if (kind == Snapshot::kFullJIT) {
       Function& func = Function::Handle(zone);
@@ -1047,6 +1052,7 @@
         s->WriteTokenPosition(field->ptr()->end_token_pos_);
         s->WriteCid(field->ptr()->guarded_cid_);
         s->WriteCid(field->ptr()->is_nullable_);
+        s->Write<int8_t>(field->ptr()->static_type_exactness_state_);
 #if !defined(DART_PRECOMPILED_RUNTIME)
         s->Write<int32_t>(field->ptr()->kernel_offset_);
 #endif
@@ -1098,6 +1104,7 @@
         field->ptr()->end_token_pos_ = d->ReadTokenPosition();
         field->ptr()->guarded_cid_ = d->ReadCid();
         field->ptr()->is_nullable_ = d->ReadCid();
+        field->ptr()->static_type_exactness_state_ = d->Read<int8_t>();
 #if !defined(DART_PRECOMPILED_RUNTIME)
         field->ptr()->kernel_offset_ = d->Read<int32_t>();
 #endif
@@ -1119,6 +1126,8 @@
         field.set_guarded_list_length(Field::kNoFixedLength);
         field.set_guarded_list_length_in_object_offset(
             Field::kUnknownLengthOffset);
+        field.set_static_type_exactness_state(
+            StaticTypeExactnessState::NotTracking());
       }
     } else {
       for (intptr_t i = start_index_; i < stop_index_; i++) {
@@ -1774,6 +1783,8 @@
           Instructions::MonomorphicEntryPoint(instr);
       NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr);
       code->ptr()->instructions_ = instr;
+      code->ptr()->unchecked_entry_point_ =
+          Instructions::UncheckedEntryPoint(instr);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() == Snapshot::kFullJIT) {
@@ -1782,6 +1793,8 @@
         code->ptr()->entry_point_ = Instructions::EntryPoint(instr);
         code->ptr()->monomorphic_entry_point_ =
             Instructions::MonomorphicEntryPoint(instr);
+        code->ptr()->unchecked_entry_point_ =
+            Instructions::UncheckedEntryPoint(instr);
       }
 #endif  // !DART_PRECOMPILED_RUNTIME
 
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index 4c99d91..50d2b61 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -39,10 +39,10 @@
 
   bool IsValid() const {
     static int16_t pattern[kCallPatternSize] = {
-        0x49, 0x8b, 0x9f, -1,   -1,   -1, -1,  // movq RBX, [PP + offs]
-        0x4d, 0x8b, 0xa7, -1,   -1,   -1, -1,  // movq CR, [PP + offs]
-        0x4d, 0x8b, 0x5c, 0x24, 0x07,  // movq TMP, [CR + entry_point_offs]
-        0x41, 0xff, 0xd3               // callq TMP
+        0x49, 0x8b, 0x9f, -1,   -1, -1, -1,  // movq RBX, [PP + offs]
+        0x4d, 0x8b, 0xa7, -1,   -1, -1, -1,  // movq CR, [PP + offs]
+        0x4d, 0x8b, 0x5c, 0x24, -1,  // movq TMP, [CR + entry_point_offs]
+        0x41, 0xff, 0xd3             // callq TMP
     };
     return MatchesPattern(start_, pattern, kCallPatternSize);
   }
@@ -134,9 +134,9 @@
 
   bool IsValid() const {
     static int16_t pattern[kCallPatternSize] = {
-        0x4d, 0x8b, 0xa7, -1,   -1,   -1, -1,  // movq CR, [PP + offs]
-        0x4d, 0x8b, 0x5c, 0x24, 0x07,  // movq TMP, [CR + entry_point_off]
-        0x41, 0xff, 0xd3               // callq TMP
+        0x4d, 0x8b, 0xa7, -1,   -1, -1, -1,  // movq CR, [PP + offs]
+        0x4d, 0x8b, 0x5c, 0x24, -1,          // movq TMP, [CR + entry_point_off]
+        0x41, 0xff, 0xd3                     // callq TMP
     };
     return MatchesPattern(start_, pattern, kCallPatternSize);
   }
diff --git a/runtime/vm/compiler/aot/entry_points_pragma.md b/runtime/vm/compiler/aot/entry_points_pragma.md
index 8748257..363bea3 100644
--- a/runtime/vm/compiler/aot/entry_points_pragma.md
+++ b/runtime/vm/compiler/aot/entry_points_pragma.md
@@ -17,7 +17,7 @@
 
 # Pragma annotation
 
-The annotation `@pragma("vm.entry-point", ...)` can be placed on a class or
+The annotation `@pragma("vm:entry-point", ...)` can be placed on a class or
 member to indicate that it may be allocated or invoked directly from native or
 VM code. The allowed uses of the annotation are as follows.
 
@@ -26,9 +26,9 @@
 Any one of the following forms may be attached to a class:
 
 ```dart
-@pragma("vm.entry-point")
-@pragma("vm.entry-point", true/false)
-@pragma("vm.entry-point", !const bool.formEnvironment("dart.vm.product"))
+@pragma("vm:entry-point")
+@pragma("vm:entry-point", true/false)
+@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
 class C { ... }
 ```
 
@@ -41,9 +41,9 @@
 getters, setters and constructors):
 
 ```dart
-@pragma("vm.entry-point")
-@pragma("vm.entry-point", true/false)
-@pragma("vm.entry-point", !const bool.formEnvironment("dart.vm.product"))
+@pragma("vm:entry-point")
+@pragma("vm:entry-point", true/false)
+@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
 void foo() { ... }
 ```
 
@@ -58,11 +58,11 @@
 three forms may be attached to static fields.
 
 ```dart
-@pragma("vm.entry-point")
-@pragma("vm.entry-point", null)
-@pragma("vm.entry-point", true/false)
-@pragma("vm.entry-point", !const bool.formEnvironment("dart.vm.product"))
-@pragma("vm.entry-point", "get"/"set")
+@pragma("vm:entry-point")
+@pragma("vm:entry-point", null)
+@pragma("vm:entry-point", true/false)
+@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
+@pragma("vm:entry-point", "get"/"set")
 void foo() { ... }
 ```
 
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 841c1b8..71c6410 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -482,6 +482,9 @@
     const intptr_t cid = current->cid_;
     current->field_->set_guarded_cid(cid);
     current->field_->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
+    // TODO(vegorov) we can actually compute the length in the same way we
+    // compute cids.
+    current->field_->set_guarded_list_length(Field::kNoFixedLength);
     if (FLAG_trace_precompiler) {
       THR_Print(
           "Field %s <- Type %s\n", current->field_->ToCString(),
@@ -1450,7 +1453,7 @@
 
 enum class EntryPointPragma { kAlways, kNever, kGetterOnly, kSetterOnly };
 
-// Adds all values annotated with @pragma('vm.entry-point') as roots.
+// Adds all values annotated with @pragma('vm:entry-point') as roots.
 void Precompiler::AddAnnotatedRoots() {
   auto& lib = Library::Handle(Z);
   auto& cls = Class::Handle(isolate()->object_store()->pragma_class());
@@ -2765,8 +2768,8 @@
            deopt_info_array.Length() * sizeof(uword));
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(function, assembler, optimized(), stats));
+  const Code& code = Code::Handle(Code::FinalizeCode(
+      function, graph_compiler, assembler, optimized(), stats));
   code.set_is_optimized(optimized());
   code.set_owner(function);
   if (!function.IsOptimizable()) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 5d079b7..1893e92 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -85,6 +85,7 @@
   ASSERT(cond != kNoCondition);
   int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
                      5 << kTypeShift | (link ? 1 : 0) << kLinkShift;
+  BailoutIfInvalidBranchOffset(offset);
   Emit(Assembler::EncodeBranchOffset(offset, encoding));
 }
 
@@ -1433,7 +1434,7 @@
 }
 
 void Assembler::RestoreCodePointer() {
-  ldr(CODE_REG, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  ldr(CODE_REG, Address(FP, compiler_frame_layout.code_from_fp * kWordSize));
   CheckCodePointer();
 }
 
@@ -1548,6 +1549,12 @@
     // And the result with the negated space bit of the object.
     bic(IP, IP, Operand(object));
   } else {
+#if defined(DEBUG)
+    Label okay;
+    BranchIfNotSmi(value, &okay);
+    Stop("Unexpected Smi!");
+    Bind(&okay);
+#endif
     bic(IP, value, Operand(object));
   }
   tst(IP, Operand(kNewObjectAlignmentOffset));
@@ -1784,20 +1791,17 @@
   SmiTag(result);
 }
 
-static bool CanEncodeBranchOffset(int32_t offset) {
-  ASSERT(Utils::IsAligned(offset, 4));
-  return Utils::IsInt(Utils::CountOneBits32(kBranchOffsetMask), offset);
+void Assembler::BailoutIfInvalidBranchOffset(int32_t offset) {
+  if (!CanEncodeBranchDistance(offset)) {
+    ASSERT(!use_far_branches());
+    Thread::Current()->long_jump_base()->Jump(1, Object::branch_offset_error());
+  }
 }
 
 int32_t Assembler::EncodeBranchOffset(int32_t offset, int32_t inst) {
   // The offset is off by 8 due to the way the ARM CPUs read PC.
   offset -= Instr::kPCReadOffset;
 
-  if (!CanEncodeBranchOffset(offset)) {
-    ASSERT(!use_far_branches());
-    Thread::Current()->long_jump_base()->Jump(1, Object::branch_offset_error());
-  }
-
   // Properly preserve only the bits supported in the instruction.
   offset >>= 2;
   offset &= kBranchOffsetMask;
@@ -1924,7 +1928,7 @@
 void Assembler::EmitBranch(Condition cond, Label* label, bool link) {
   if (label->IsBound()) {
     const int32_t dest = label->Position() - buffer_.Size();
-    if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
+    if (use_far_branches() && !CanEncodeBranchDistance(dest)) {
       EmitFarBranch(cond, label->Position(), link);
     } else {
       EmitType5(cond, dest, link);
@@ -1948,7 +1952,7 @@
   while (label->IsLinked()) {
     const int32_t position = label->Position();
     int32_t dest = bound_pc - position;
-    if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
+    if (use_far_branches() && !CanEncodeBranchDistance(dest)) {
       // Far branches are enabled and we can't encode the branch offset.
 
       // Grab instructions that load the offset.
@@ -1978,7 +1982,7 @@
       buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize, patched_or2);
       buffer_.Store<int32_t>(position + 3 * Instr::kInstrSize, patched_or3);
       label->position_ = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
-    } else if (use_far_branches() && CanEncodeBranchOffset(dest)) {
+    } else if (use_far_branches() && CanEncodeBranchDistance(dest)) {
       // Grab instructions that load the offset, and the branch.
       const int32_t mov = buffer_.Load<int32_t>(position);
       const int32_t or1 =
@@ -2011,6 +2015,7 @@
 
       label->position_ = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
     } else {
+      BailoutIfInvalidBranchOffset(dest);
       int32_t next = buffer_.Load<int32_t>(position);
       int32_t encoded = Assembler::EncodeBranchOffset(dest, next);
       buffer_.Store<int32_t>(position, encoded);
@@ -2026,7 +2031,7 @@
   while (label->IsLinked()) {
     const int32_t position = label->Position();
     int32_t dest = bound_pc - position;
-    if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
+    if (use_far_branches() && !CanEncodeBranchDistance(dest)) {
       // Far branches are enabled and we can't encode the branch offset.
 
       // Grab instructions that load the offset.
@@ -2049,7 +2054,7 @@
       buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize, patched_movw);
       buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize, patched_movt);
       label->position_ = DecodeARMv7LoadImmediate(movt, movw);
-    } else if (use_far_branches() && CanEncodeBranchOffset(dest)) {
+    } else if (use_far_branches() && CanEncodeBranchDistance(dest)) {
       // Far branches are enabled, but we can encode the branch offset.
 
       // Grab instructions that load the offset, and the branch.
@@ -2077,6 +2082,7 @@
 
       label->position_ = DecodeARMv7LoadImmediate(movt, movw);
     } else {
+      BailoutIfInvalidBranchOffset(dest);
       int32_t next = buffer_.Load<int32_t>(position);
       int32_t encoded = Assembler::EncodeBranchOffset(dest, next);
       buffer_.Store<int32_t>(position, encoded);
@@ -2454,7 +2460,9 @@
   bx(IP, cond);
 }
 
-void Assembler::BranchLink(const Code& target, Patchability patchable) {
+void Assembler::BranchLink(const Code& target,
+                           Patchability patchable,
+                           Code::EntryKind entry_kind) {
   // Make sure that class CallPattern is able to patch the label referred
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
@@ -2462,7 +2470,7 @@
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper_.FindObject(target, patchable));
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
-  ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(entry_kind)));
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
 
@@ -2472,8 +2480,9 @@
   BranchLink(code, patchable);
 }
 
-void Assembler::BranchLinkPatchable(const Code& target) {
-  BranchLink(target, kPatchable);
+void Assembler::BranchLinkPatchable(const Code& target,
+                                    Code::EntryKind entry_kind) {
+  BranchLink(target, kPatchable, entry_kind);
 }
 
 void Assembler::BranchLinkToRuntime() {
@@ -2492,7 +2501,8 @@
 }
 
 void Assembler::BranchLinkWithEquivalence(const StubEntry& stub_entry,
-                                          const Object& equivalence) {
+                                          const Object& equivalence,
+                                          Code::EntryKind entry_kind) {
   const Code& target = Code::ZoneHandle(stub_entry.code());
   // Make sure that class CallPattern is able to patch the label referred
   // to by this code sequence.
@@ -2501,7 +2511,7 @@
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper_.FindObject(target, equivalence));
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
-  ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(entry_kind)));
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
 
@@ -2510,8 +2520,9 @@
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
 
-void Assembler::BranchLinkPatchable(const StubEntry& stub_entry) {
-  BranchLinkPatchable(Code::ZoneHandle(stub_entry.code()));
+void Assembler::BranchLinkPatchable(const StubEntry& stub_entry,
+                                    Code::EntryKind entry_kind) {
+  BranchLinkPatchable(Code::ZoneHandle(stub_entry.code()), entry_kind);
 }
 
 void Assembler::BranchLinkOffset(Register base, int32_t offset) {
@@ -3113,7 +3124,8 @@
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   if (restore_pp == kRestoreCallerPP) {
-    ldr(PP, Address(FP, kSavedCallerPpSlotFromFp * kWordSize));
+    ldr(PP,
+        Address(FP, compiler_frame_layout.saved_caller_pp_from_fp * kWordSize));
     set_constant_pool_allowed(false);
   }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 5dd4340..de2fa1f 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -696,19 +696,28 @@
 
   void BranchLink(const StubEntry& stub_entry,
                   Patchability patchable = kNotPatchable);
-  void BranchLink(const Code& code, Patchability patchable);
+  void BranchLink(const Code& code,
+                  Patchability patchable,
+                  Code::EntryKind entry_kind = Code::EntryKind::kNormal);
   void BranchLinkToRuntime();
 
   void CallNullErrorShared(bool save_fpu_registers);
 
   // Branch and link to an entry address. Call sequence can be patched.
-  void BranchLinkPatchable(const StubEntry& stub_entry);
-  void BranchLinkPatchable(const Code& code);
+  void BranchLinkPatchable(
+      const StubEntry& stub_entry,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
+
+  void BranchLinkPatchable(
+      const Code& code,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
-  void BranchLinkWithEquivalence(const StubEntry& stub_entry,
-                                 const Object& equivalence);
+  void BranchLinkWithEquivalence(
+      const StubEntry& stub_entry,
+      const Object& equivalence,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   // Branch and link to [base + offset]. Call sequence is never patched.
   void BranchLinkOffset(Register base, int32_t offset);
@@ -1110,6 +1119,22 @@
   bool constant_pool_allowed() const { return constant_pool_allowed_; }
   void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
 
+  // Whether we can branch to a target which is [distance] bytes away from the
+  // beginning of the branch instruction.
+  //
+  // Use this function for testing whether [distance] can be encoded using the
+  // 24-bit offets in the branch instructions, which are multiples of 4.
+  static bool CanEncodeBranchDistance(int32_t distance) {
+    ASSERT(Utils::IsAligned(distance, 4));
+    // The distance is off by 8 due to the way the ARM CPUs read PC.
+    distance -= Instr::kPCReadOffset;
+    distance >>= 2;
+    return Utils::IsInt(24, distance);
+  }
+
+  static int32_t EncodeBranchOffset(int32_t offset, int32_t inst);
+  static int32_t DecodeBranchOffset(int32_t inst);
+
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
   ObjectPoolWrapper object_pool_wrapper_;
@@ -1244,8 +1269,7 @@
 
   void EmitFarBranch(Condition cond, int32_t offset, bool link);
   void EmitBranch(Condition cond, Label* label, bool link);
-  int32_t EncodeBranchOffset(int32_t offset, int32_t inst);
-  static int32_t DecodeBranchOffset(int32_t inst);
+  void BailoutIfInvalidBranchOffset(int32_t offset);
   int32_t EncodeTstOffset(int32_t offset, int32_t inst);
   int32_t DecodeTstOffset(int32_t inst);
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 2199fd6..cd2b856 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -431,9 +431,11 @@
   return true;
 }
 
-void Assembler::LoadNativeEntry(Register dst, const ExternalLabel* label) {
+void Assembler::LoadNativeEntry(Register dst,
+                                const ExternalLabel* label,
+                                Patchability patchable) {
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindNativeFunction(label, kNotPatchable));
+      object_pool_wrapper_.FindNativeFunction(label, patchable));
   LoadWordFromPoolOffset(dst, offset);
 }
 
@@ -915,6 +917,12 @@
   // Write-barrier triggers if the value is in the new space (has bit set) and
   // the object is in the old space (has bit cleared).
   if (value_can_be_smi == kValueIsNotSmi) {
+#if defined(DEBUG)
+    Label okay;
+    BranchIfNotSmi(value, &okay);
+    Stop("Unexpected Smi!");
+    Bind(&okay);
+#endif
     // To check that, we compute value & ~object and skip the write barrier
     // if the bit is not set. We can't destroy the object.
     bic(TMP, value, Operand(object));
@@ -954,7 +962,7 @@
   ASSERT(object != value);
   str(value, dest);
   Label done;
-  StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
+  StoreIntoObjectFilter(object, value, &done, can_be_smi, kJumpToNoUpdate);
   if (!lr_reserved) Push(LR);
   ldr(LR, Address(THR, Thread::update_store_buffer_wrappers_offset(object)));
   blr(LR);
@@ -1071,7 +1079,7 @@
 }
 
 void Assembler::RestoreCodePointer() {
-  ldr(CODE_REG, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  ldr(CODE_REG, Address(FP, compiler_frame_layout.code_from_fp * kWordSize));
   CheckCodePointer();
 }
 
@@ -1178,7 +1186,8 @@
   if (restore_pp == kRestoreCallerPP) {
     set_constant_pool_allowed(false);
     // Restore and untag PP.
-    LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize);
+    LoadFromOffset(PP, FP,
+                   compiler_frame_layout.saved_caller_pp_from_fp * kWordSize);
     sub(PP, PP, Operand(kHeapObjectTag));
   }
   LeaveFrame();
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index dfe29cb..bd5bb86 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -1488,7 +1488,9 @@
 
   intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
-  void LoadNativeEntry(Register dst, const ExternalLabel* label);
+  void LoadNativeEntry(Register dst,
+                       const ExternalLabel* label,
+                       Patchability patchable);
   void LoadFunctionFromCalleePool(Register dst,
                                   const Function& function,
                                   Register new_pp);
diff --git a/runtime/vm/compiler/assembler/assembler_dbc_test.cc b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
index 3f6c5e7..ef3d7c6 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
@@ -70,8 +70,8 @@
   const char* dummy_function_name = "dummy_instance_function";
   const Function& dummy_instance_function =
       Function::Handle(CreateFunction(dummy_function_name));
-  Code& code =
-      Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_));
+  Code& code = Code::Handle(
+      Code::FinalizeCode(dummy_instance_function, nullptr, &_assembler_));
   dummy_instance_function.AttachCode(code);
 
   // Make a dummy ICData.
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index b566572..88d0063 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -1840,6 +1840,12 @@
                                       CanBeSmi can_be_smi,
                                       BarrierFilterMode how_to_jump) {
   if (can_be_smi == kValueIsNotSmi) {
+#if defined(DEBUG)
+    Label okay;
+    BranchIfNotSmi(value, &okay);
+    Stop("Unexpected Smi!");
+    Bind(&okay);
+#endif
     COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
                    (kOldObjectAlignmentOffset == 0));
     // Write-barrier triggers if the value is in the new space (has bit set) and
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 353b8ed..bee1638 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -61,26 +61,28 @@
   call(TMP);
 }
 
-void Assembler::CallPatchable(const StubEntry& stub_entry) {
+void Assembler::CallPatchable(const StubEntry& stub_entry,
+                              Code::EntryKind entry_kind) {
   ASSERT(constant_pool_allowed());
   const Code& target = Code::ZoneHandle(stub_entry.code());
   intptr_t call_start = buffer_.GetPosition();
   const intptr_t idx = object_pool_wrapper_.AddObject(target, kPatchable);
   const int32_t offset = ObjectPool::element_offset(idx);
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
-  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset(entry_kind)));
   call(TMP);
   ASSERT((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
 }
 
 void Assembler::CallWithEquivalence(const StubEntry& stub_entry,
-                                    const Object& equivalence) {
+                                    const Object& equivalence,
+                                    Code::EntryKind entry_kind) {
   ASSERT(constant_pool_allowed());
   const Code& target = Code::ZoneHandle(stub_entry.code());
   const intptr_t idx = object_pool_wrapper_.FindObject(target, equivalence);
   const int32_t offset = ObjectPool::element_offset(idx);
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
-  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset(entry_kind)));
   call(TMP);
 }
 
@@ -1224,6 +1226,12 @@
                  (kOldObjectAlignmentOffset == 0));
 
   if (can_be_smi == kValueIsNotSmi) {
+#if defined(DEBUG)
+    Label okay;
+    BranchIfNotSmi(value, &okay);
+    Stop("Unexpected Smi!");
+    Bind(&okay);
+#endif
     // Write-barrier triggers if the value is in the new space (has bit set) and
     // the object is in the old space (has bit cleared).
     // To check that we could compute value & ~object and skip the write barrier
@@ -1478,7 +1486,7 @@
 }
 
 void Assembler::RestoreCodePointer() {
-  movq(CODE_REG, Address(RBP, kPcMarkerSlotFromFp * kWordSize));
+  movq(CODE_REG, Address(RBP, compiler_frame_layout.code_from_fp * kWordSize));
 }
 
 void Assembler::LoadPoolPointer(Register pp) {
@@ -1507,7 +1515,8 @@
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   // Restore caller's PP register that was pushed in EnterDartFrame.
   if (restore_pp == kRestoreCallerPP) {
-    movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize)));
+    movq(PP, Address(RBP, (compiler_frame_layout.saved_caller_pp_from_fp *
+                           kWordSize)));
     set_constant_pool_allowed(false);
   }
   LeaveFrame();
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 3fb956f..5b86aca 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -692,7 +692,8 @@
   void JmpPatchable(const StubEntry& stub_entry, Register pp);
   void Jmp(const StubEntry& stub_entry, Register pp = PP);
   void J(Condition condition, const StubEntry& stub_entry, Register pp);
-  void CallPatchable(const StubEntry& stub_entry);
+  void CallPatchable(const StubEntry& stub_entry,
+                     Code::EntryKind entry_kind = Code::EntryKind::kNormal);
   void Call(const StubEntry& stub_entry);
   void CallToRuntime();
 
@@ -700,8 +701,11 @@
 
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
-  void CallWithEquivalence(const StubEntry& stub_entry,
-                           const Object& equivalence);
+  void CallWithEquivalence(
+      const StubEntry& stub_entry,
+      const Object& equivalence,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
+
   // Unaware of write barrier (use StoreInto* methods for storing to objects).
   // TODO(koda): Add StackAddress/HeapAddress types to prevent misuse.
   void StoreObject(const Address& dst, const Object& obj);
diff --git a/runtime/vm/compiler/assembler/assembler_x64_test.cc b/runtime/vm/compiler/assembler/assembler_x64_test.cc
index 202a3e1..e478f97 100644
--- a/runtime/vm/compiler/assembler/assembler_x64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64_test.cc
@@ -3903,7 +3903,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x17]\n"
+      "movq pp,[r12+0x1f]\n"
       "movl rax,0x........\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -3940,7 +3940,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x17]\n"
+      "movq pp,[r12+0x1f]\n"
       "movl rax,-0x........\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -3975,7 +3975,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x17]\n"
+      "movq pp,[r12+0x1f]\n"
       "movl rax,0x........\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -4820,7 +4820,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x17]\n"
+      "movq pp,[r12+0x1f]\n"
       "movq rax,[pp+0xf]\n"
       "cmpq rax,[pp+0xf]\n"
       "jnz 0x................\n"
@@ -5258,7 +5258,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x17]\n"
+      "movq pp,[r12+0x1f]\n"
       "movq r11,[thr+0x...]\n"
       "andpd xmm0,[r11]\n"
       "pop thr\n"
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index c1b4c4d..3037952 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -251,7 +251,8 @@
       PcDescriptors::Handle(zone, code.pc_descriptors());
   THR_Print("%s}\n", descriptors.ToCString());
 
-  uword start = Instructions::Handle(zone, code.instructions()).PayloadStart();
+  const auto& instructions = Instructions::Handle(code.instructions());
+  const uword start = instructions.PayloadStart();
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   const Array& deopt_table = Array::Handle(zone, code.deopt_info_array());
@@ -322,6 +323,13 @@
       ExceptionHandlers::Handle(zone, code.exception_handlers());
   THR_Print("%s}\n", handlers.ToCString());
 
+  if (instructions.unchecked_entrypoint_pc_offset() != 0) {
+    THR_Print("Unchecked entrypoint at offset 0x%" Px "\n",
+              Instructions::UncheckedEntryPoint(instructions.raw()));
+  } else {
+    THR_Print("No unchecked entrypoint.\n");
+  }
+
   {
     THR_Print("Static call target functions {\n");
     const Array& table = Array::Handle(zone, code.static_calls_target_table());
diff --git a/runtime/vm/compiler/backend/branch_optimizer.cc b/runtime/vm/compiler/backend/branch_optimizer.cc
index 47ca82a..78615fc 100644
--- a/runtime/vm/compiler/backend/branch_optimizer.cc
+++ b/runtime/vm/compiler/backend/branch_optimizer.cc
@@ -284,6 +284,13 @@
           (pred1->PredecessorAt(0) == pred2->PredecessorAt(0))) {
         BlockEntryInstr* pred = pred1->PredecessorAt(0);
         BranchInstr* branch = pred->last_instruction()->AsBranch();
+
+        if (branch == nullptr) {
+          // There is no "B_pred" block.
+          ASSERT(pred->last_instruction()->IsGraphEntry());
+          continue;
+        }
+
         ComparisonInstr* comparison = branch->comparison();
 
         // Check if the platform supports efficient branchless IfThenElseInstr
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index e7db5aa..7850d4e 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -243,6 +243,8 @@
 
 void ConstantPropagator::VisitGuardFieldLength(GuardFieldLengthInstr* instr) {}
 
+void ConstantPropagator::VisitGuardFieldType(GuardFieldTypeInstr* instr) {}
+
 void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) {}
 
 void ConstantPropagator::VisitTailCall(TailCallInstr* instr) {}
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index bdf8ee9..dc2d982 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -407,7 +407,9 @@
 bool FlowGraph::IsReceiver(Definition* def) const {
   def = def->OriginalDefinition();  // Could be redefined.
   if (def->IsParameter()) return (def->AsParameter()->index() == 0);
-  if (!def->IsPhi() || graph_entry()->catch_entries().is_empty()) return false;
+  if (!def->IsPhi() || graph_entry()->HasSingleEntryPoint()) {
+    return false;
+  }
   PhiInstr* phi = def->AsPhi();
   if (phi->is_receiver() != PhiInstr::kUnknownReceiver) {
     return (phi->is_receiver() == PhiInstr::kReceiver);
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 4a8e86c..a587613 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -144,6 +144,10 @@
     return num_direct_parameters_ - variable->index().value();
   }
 
+  bool IsEntryPoint(BlockEntryInstr* target) const {
+    return graph_entry()->IsEntryPoint(target);
+  }
+
   // Flow graph orders.
   const GrowableArray<BlockEntryInstr*>& preorder() const { return preorder_; }
   const GrowableArray<BlockEntryInstr*>& postorder() const {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index ac70c7c..6574c5e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -78,8 +78,8 @@
   for (Environment::ShallowIterator it(env); !it.Done(); it.Advance()) {
     if (it.CurrentLocation().IsInvalid() &&
         it.CurrentValue()->definition()->IsPushArgument()) {
-      it.SetCurrentLocation(
-          Location::StackSlot(FrameSlotForVariableIndex(-*stack_height)));
+      it.SetCurrentLocation(Location::StackSlot(
+          compiler_frame_layout.FrameSlotForVariableIndex(-*stack_height)));
       (*stack_height)++;
     }
   }
@@ -265,11 +265,13 @@
   return false;
 }
 
-static bool IsEmptyBlock(BlockEntryInstr* block) {
+bool FlowGraphCompiler::IsEmptyBlock(BlockEntryInstr* block) const {
+  // Entry-points cannot be merged because they must have assembly
+  // prologue emitted which should not be included in any block they jump to.
   return !block->IsCatchBlockEntry() && !block->HasNonRedundantParallelMove() &&
          block->next()->IsGoto() &&
          !block->next()->AsGoto()->HasNonRedundantParallelMove() &&
-         !block->IsIndirectEntry();
+         !block->IsIndirectEntry() && !flow_graph().IsEntryPoint(block);
 }
 
 void FlowGraphCompiler::CompactBlock(BlockEntryInstr* block) {
@@ -318,6 +320,26 @@
   block_info->set_next_nonempty_label(nonempty_label);
 }
 
+intptr_t FlowGraphCompiler::UncheckedEntryOffset() const {
+  TargetEntryInstr* entry = flow_graph().graph_entry()->unchecked_entry();
+  if (entry == nullptr) {
+    entry = flow_graph().graph_entry()->normal_entry();
+  }
+  Label* target = GetJumpLabel(entry);
+
+  if (target->IsBound()) {
+    return target->Position();
+  }
+
+  // Intrinsification happened.
+#ifdef DART_PRECOMPILER
+  if (parsed_function().function().IsDynamicFunction()) {
+    return Instructions::kUncheckedEntryOffset;
+  }
+#endif
+  return 0;
+}
+
 void FlowGraphCompiler::EmitCatchEntryState(Environment* env,
                                             intptr_t try_index) {
 #if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
@@ -354,7 +376,8 @@
         catch_entry_state_maps_builder_->AppendConstant(id, dest_index);
         continue;
       }
-      const intptr_t src_index = -VariableIndexForFrameSlot(src.stack_index());
+      const intptr_t src_index =
+          -compiler_frame_layout.VariableIndexForFrameSlot(src.stack_index());
       if (src_index != dest_index) {
         catch_entry_state_maps_builder_->AppendMove(src_index, dest_index);
       }
@@ -384,7 +407,8 @@
         catch_entry_state_maps_builder_->AppendConstant(id, dest_index);
         continue;
       }
-      const intptr_t src_index = -VariableIndexForFrameSlot(src.stack_index());
+      const intptr_t src_index =
+          -compiler_frame_layout.VariableIndexForFrameSlot(src.stack_index());
       if (src_index != dest_index) {
         catch_entry_state_maps_builder_->AppendMove(src_index, dest_index);
       }
@@ -865,7 +889,7 @@
                                        ICData::DeoptReasonId reason,
                                        uint32_t flags) {
   if (intrinsic_mode()) {
-    return &intrinsic_slow_path_label_;
+    return intrinsic_slow_path_label_;
   }
 
   // No deoptimization allowed when 'FLAG_precompiled_mode' is set.
@@ -988,8 +1012,8 @@
     info.scope_id = 0;
     info.begin_pos = TokenPosition::kMinSource;
     info.end_pos = TokenPosition::kMinSource;
-    info.set_index(
-        FrameSlotForVariable(parsed_function().current_context_var()));
+    info.set_index(compiler_frame_layout.FrameSlotForVariable(
+        parsed_function().current_context_var()));
     var_descs.SetVar(0, Symbols::CurrentContextVar(), &info);
   }
   code.set_var_descriptors(var_descs);
@@ -1054,6 +1078,9 @@
 
 // Returns 'true' if regular code generation should be skipped.
 bool FlowGraphCompiler::TryIntrinsify() {
+  Label exit;
+  set_intrinsic_slow_path_label(&exit);
+
   if (FLAG_intrinsify) {
     // Intrinsification skips arguments checks, therefore disable if in checked
     // mode or strong mode.
@@ -1106,8 +1133,8 @@
   // (normal function body) starts.
   // This means that there must not be any side-effects in intrinsic code
   // before any deoptimization point.
-  ASSERT(!intrinsic_slow_path_label_.IsBound());
-  assembler()->Bind(&intrinsic_slow_path_label_);
+  assembler()->Bind(intrinsic_slow_path_label());
+  set_intrinsic_slow_path_label(nullptr);
   return complete;
 }
 
@@ -1133,9 +1160,11 @@
 void FlowGraphCompiler::GenerateInstanceCall(intptr_t deopt_id,
                                              TokenPosition token_pos,
                                              LocationSummary* locs,
-                                             const ICData& ic_data_in) {
+                                             const ICData& ic_data_in,
+                                             Code::EntryKind entry_kind) {
   ICData& ic_data = ICData::ZoneHandle(ic_data_in.Original());
   if (FLAG_precompiled_mode) {
+    // TODO(#34162): Support unchecked entry-points in precompiled mode.
     ic_data = ic_data.AsUnaryClassChecks();
     EmitSwitchableInstanceCall(ic_data, deopt_id, token_pos, locs);
     return;
@@ -1149,12 +1178,12 @@
       case 1:
         EmitOptimizedInstanceCall(
             *StubCode::OneArgOptimizedCheckInlineCache_entry(), ic_data,
-            deopt_id, token_pos, locs);
+            deopt_id, token_pos, locs, entry_kind);
         return;
       case 2:
         EmitOptimizedInstanceCall(
             *StubCode::TwoArgsOptimizedCheckInlineCache_entry(), ic_data,
-            deopt_id, token_pos, locs);
+            deopt_id, token_pos, locs, entry_kind);
         return;
       default:
         UNIMPLEMENTED();
@@ -1191,7 +1220,8 @@
                                            ArgumentsInfo args_info,
                                            LocationSummary* locs,
                                            const ICData& ic_data_in,
-                                           ICData::RebindRule rebind_rule) {
+                                           ICData::RebindRule rebind_rule,
+                                           Code::EntryKind entry_kind) {
   const ICData& ic_data = ICData::ZoneHandle(ic_data_in.Original());
   const Array& arguments_descriptor = Array::ZoneHandle(
       zone(), ic_data.IsNull() ? args_info.ToArgumentsDescriptor()
@@ -1201,7 +1231,7 @@
   if (is_optimizing()) {
     EmitOptimizedStaticCall(function, arguments_descriptor,
                             args_info.count_with_type_args, deopt_id, token_pos,
-                            locs);
+                            locs, entry_kind);
   } else {
     ICData& call_ic_data = ICData::ZoneHandle(zone(), ic_data.raw());
     if (call_ic_data.IsNull()) {
@@ -1276,9 +1306,8 @@
 bool FlowGraphCompiler::NeedsEdgeCounter(TargetEntryInstr* block) {
   // Only emit an edge counter if there is not goto at the end of the block,
   // except for the entry block.
-  return (FLAG_reorder_basic_blocks &&
-          (!block->last_instruction()->IsGoto() ||
-           (block == flow_graph().graph_entry()->normal_entry())));
+  return FLAG_reorder_basic_blocks && (!block->last_instruction()->IsGoto() ||
+                                       flow_graph().IsEntryPoint(block));
 }
 
 // Allocate a register that is not explictly blocked.
@@ -1296,7 +1325,8 @@
 
 void FlowGraphCompiler::AllocateRegistersLocally(Instruction* instr) {
   ASSERT(!is_optimizing());
-  instr->InitializeLocationSummary(zone(), false);  // Not optimizing.
+  instr->InitializeLocationSummary(zone(),
+                                   false);  // Not optimizing.
 
 // No need to allocate registers based on LocationSummary on DBC as in
 // unoptimized mode it's a stack based bytecode just like IR itself.
@@ -1785,7 +1815,8 @@
     EmitTestAndCall(targets, original_call.function_name(), args_info,
                     deopt,  // No cid match.
                     &ok,    // Found cid.
-                    deopt_id, token_pos, locs, complete, total_ic_calls);
+                    deopt_id, token_pos, locs, complete, total_ic_calls,
+                    original_call.entry_kind());
     assembler()->Bind(&ok);
   } else {
     if (complete) {
@@ -1793,11 +1824,14 @@
       EmitTestAndCall(targets, original_call.function_name(), args_info,
                       NULL,  // No cid match.
                       &ok,   // Found cid.
-                      deopt_id, token_pos, locs, true, total_ic_calls);
+                      deopt_id, token_pos, locs, true, total_ic_calls,
+                      original_call.entry_kind());
       assembler()->Bind(&ok);
     } else {
       const ICData& unary_checks = ICData::ZoneHandle(
           zone(), original_call.ic_data()->AsUnaryClassChecks());
+      // TODO(sjindel/entrypoints): Support skiping type checks on switchable
+      // calls.
       EmitSwitchableInstanceCall(unary_checks, deopt_id, token_pos, locs);
     }
   }
@@ -1813,7 +1847,8 @@
                                         TokenPosition token_index,
                                         LocationSummary* locs,
                                         bool complete,
-                                        intptr_t total_ic_calls) {
+                                        intptr_t total_ic_calls,
+                                        Code::EntryKind entry_kind) {
   ASSERT(is_optimizing());
 
   const Array& arguments_descriptor =
@@ -1855,9 +1890,9 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *targets.TargetAt(smi_case)->target;
-    GenerateStaticDartCall(deopt_id, token_index,
-                           *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther, locs, function);
+    GenerateStaticDartCall(
+        deopt_id, token_index, *StubCode::CallStaticFunction_entry(),
+        RawPcDescriptors::kOther, locs, function, entry_kind);
     __ Drop(args_info.count_with_type_args);
     if (match_found != NULL) {
       __ Jump(match_found);
@@ -1906,9 +1941,9 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *targets.TargetAt(i)->target;
-    GenerateStaticDartCall(deopt_id, token_index,
-                           *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther, locs, function);
+    GenerateStaticDartCall(
+        deopt_id, token_index, *StubCode::CallStaticFunction_entry(),
+        RawPcDescriptors::kOther, locs, function, entry_kind);
     __ Drop(args_info.count_with_type_args);
     if (!is_last_check || add_megamorphic_call) {
       __ Jump(match_found);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 353b549..71d04b0 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -357,7 +357,14 @@
   void ExitIntrinsicMode();
   bool intrinsic_mode() const { return intrinsic_mode_; }
 
-  Label* intrinsic_slow_path_label() { return &intrinsic_slow_path_label_; }
+  void set_intrinsic_slow_path_label(Label* label) {
+    ASSERT(intrinsic_slow_path_label_ == nullptr || label == nullptr);
+    intrinsic_slow_path_label_ = label;
+  }
+  Label* intrinsic_slow_path_label() const {
+    ASSERT(intrinsic_slow_path_label_ != nullptr);
+    return intrinsic_slow_path_label_;
+  }
 
   bool ForceSlowPathForStackOverflow() const;
 
@@ -388,6 +395,8 @@
 
   void CompileGraph();
 
+  void EmitPrologue();
+
   void VisitBlocks();
 
   // Bail out of the flow graph compiler. Does not return to the caller.
@@ -453,31 +462,39 @@
                         TokenPosition token_pos,
                         const StubEntry& stub_entry,
                         RawPcDescriptors::Kind kind,
-                        LocationSummary* locs);
-  void GenerateStaticDartCall(intptr_t deopt_id,
-                              TokenPosition token_pos,
-                              const StubEntry& stub_entry,
-                              RawPcDescriptors::Kind kind,
-                              LocationSummary* locs,
-                              const Function& target);
+                        LocationSummary* locs,
+                        Code::EntryKind entry_kind = Code::EntryKind::kNormal);
+
+  void GenerateStaticDartCall(
+      intptr_t deopt_id,
+      TokenPosition token_pos,
+      const StubEntry& stub_entry,
+      RawPcDescriptors::Kind kind,
+      LocationSummary* locs,
+      const Function& target,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void GenerateInstanceOf(TokenPosition token_pos,
                           intptr_t deopt_id,
                           const AbstractType& type,
                           LocationSummary* locs);
 
-  void GenerateInstanceCall(intptr_t deopt_id,
-                            TokenPosition token_pos,
-                            LocationSummary* locs,
-                            const ICData& ic_data);
+  void GenerateInstanceCall(
+      intptr_t deopt_id,
+      TokenPosition token_pos,
+      LocationSummary* locs,
+      const ICData& ic_data,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
-  void GenerateStaticCall(intptr_t deopt_id,
-                          TokenPosition token_pos,
-                          const Function& function,
-                          ArgumentsInfo args_info,
-                          LocationSummary* locs,
-                          const ICData& ic_data_in,
-                          ICData::RebindRule rebind_rule);
+  void GenerateStaticCall(
+      intptr_t deopt_id,
+      TokenPosition token_pos,
+      const Function& function,
+      ArgumentsInfo args_info,
+      LocationSummary* locs,
+      const ICData& ic_data_in,
+      ICData::RebindRule rebind_rule,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void GenerateNumberTypeCheck(Register kClassIdReg,
                                const AbstractType& type,
@@ -510,11 +527,13 @@
                                      Label* outside_range_lbl = NULL,
                                      bool fall_through_if_inside = false);
 
-  void EmitOptimizedInstanceCall(const StubEntry& stub_entry,
-                                 const ICData& ic_data,
-                                 intptr_t deopt_id,
-                                 TokenPosition token_pos,
-                                 LocationSummary* locs);
+  void EmitOptimizedInstanceCall(
+      const StubEntry& stub_entry,
+      const ICData& ic_data,
+      intptr_t deopt_id,
+      TokenPosition token_pos,
+      LocationSummary* locs,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void EmitInstanceCall(const StubEntry& stub_entry,
                         const ICData& ic_data,
@@ -555,7 +574,8 @@
                        TokenPosition token_index,
                        LocationSummary* locs,
                        bool complete,
-                       intptr_t total_ic_calls);
+                       intptr_t total_ic_calls,
+                       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   Condition EmitEqualityRegConstCompare(Register reg,
                                         const Object& obj,
@@ -738,6 +758,12 @@
                                      int bias,
                                      bool jump_on_miss = true);
 
+  // Returns the offset (from the very beginning of the instructions) to the
+  // unchecked entry point (incl. prologue/frame setup, etc.).
+  intptr_t UncheckedEntryOffset() const;
+
+  bool IsEmptyBlock(BlockEntryInstr* block) const;
+
  private:
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
   friend class CheckedSmiSlowPath;          // Same.
@@ -755,12 +781,14 @@
   // Emit code to load a Value into register 'dst'.
   void LoadValue(Register dst, Value* value);
 
-  void EmitOptimizedStaticCall(const Function& function,
-                               const Array& arguments_descriptor,
-                               intptr_t count_with_type_args,
-                               intptr_t deopt_id,
-                               TokenPosition token_pos,
-                               LocationSummary* locs);
+  void EmitOptimizedStaticCall(
+      const Function& function,
+      const Array& arguments_descriptor,
+      intptr_t count_with_type_args,
+      intptr_t deopt_id,
+      TokenPosition token_pos,
+      LocationSummary* locs,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void EmitUnoptimizedStaticCall(intptr_t count_with_type_args,
                                  intptr_t deopt_id,
@@ -938,7 +966,7 @@
   bool may_reoptimize_;
   // True while emitting intrinsic code.
   bool intrinsic_mode_;
-  Label intrinsic_slow_path_label_;
+  Label* intrinsic_slow_path_label_ = nullptr;
   CodeStatistics* stats_;
 
   const Class& double_class_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 1fdbcc1..d79134d 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -852,6 +852,35 @@
   }
 }
 
+void FlowGraphCompiler::EmitPrologue() {
+  EmitFrameEntry();
+  ASSERT(assembler()->constant_pool_allowed());
+
+  // In unoptimized code, initialize (non-argument) stack allocated slots.
+  if (!is_optimizing()) {
+    const int num_locals = parsed_function().num_stack_locals();
+
+    intptr_t args_desc_slot = -1;
+    if (parsed_function().has_arg_desc_var()) {
+      args_desc_slot = compiler_frame_layout.FrameSlotForVariable(
+          parsed_function().arg_desc_var());
+    }
+
+    __ Comment("Initialize spill slots");
+    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
+      __ LoadObject(R0, Object::null_object());
+    }
+    for (intptr_t i = 0; i < num_locals; ++i) {
+      const intptr_t slot_index =
+          compiler_frame_layout.FrameSlotForVariableIndex(-i);
+      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
+      __ StoreToOffset(kWord, value_reg, FP, slot_index * kWordSize);
+    }
+  }
+
+  EndCodeSourceRange(TokenPosition::kDartCodePrologue);
+}
+
 // Input parameters:
 //   LR: return address.
 //   SP: address of last argument.
@@ -869,35 +898,7 @@
   }
 #endif  // DART_PRECOMPILER
 
-  if (TryIntrinsify()) {
-    // Skip regular code generation.
-    return;
-  }
-
-  EmitFrameEntry();
-  ASSERT(assembler()->constant_pool_allowed());
-
-  // In unoptimized code, initialize (non-argument) stack allocated slots.
-  if (!is_optimizing()) {
-    const int num_locals = parsed_function().num_stack_locals();
-
-    intptr_t args_desc_slot = -1;
-    if (parsed_function().has_arg_desc_var()) {
-      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
-    }
-
-    __ Comment("Initialize spill slots");
-    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
-      __ LoadObject(R0, Object::null_object());
-    }
-    for (intptr_t i = 0; i < num_locals; ++i) {
-      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
-      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
-      __ StoreToOffset(kWord, value_reg, FP, slot_index * kWordSize);
-    }
-  }
-
-  EndCodeSourceRange(TokenPosition::kDartCodePrologue);
+  __ set_constant_pool_allowed(true);
   VisitBlocks();
 
   __ bkpt(0);
@@ -925,8 +926,9 @@
                                          TokenPosition token_pos,
                                          const StubEntry& stub_entry,
                                          RawPcDescriptors::Kind kind,
-                                         LocationSummary* locs) {
-  __ BranchLinkPatchable(stub_entry);
+                                         LocationSummary* locs,
+                                         Code::EntryKind entry_kind) {
+  __ BranchLinkPatchable(stub_entry, entry_kind);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
 
@@ -935,12 +937,13 @@
                                                const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
-                                               const Function& target) {
+                                               const Function& target,
+                                               Code::EntryKind entry_kind) {
   // Call sites to the same target can share object pool entries. These
   // call sites are never patched for breakpoints: the function is deoptimized
   // and the unoptimized code with IC calls for static calls is patched instead.
   ASSERT(is_optimizing());
-  __ BranchLinkWithEquivalence(stub_entry, target);
+  __ BranchLinkWithEquivalence(stub_entry, target, entry_kind);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
   AddStaticCallTarget(target);
 }
@@ -980,7 +983,8 @@
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
-                                                  LocationSummary* locs) {
+                                                  LocationSummary* locs,
+                                                  Code::EntryKind entry_kind) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -992,7 +996,7 @@
   __ LoadObject(R8, parsed_function().function());
   __ LoadUniqueObject(R9, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+                   locs, entry_kind);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
@@ -1066,7 +1070,8 @@
   __ LoadFromOffset(kWord, R0, SP,
                     (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(CODE_REG, initial_stub);
-  __ ldr(LR, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ LoadUniqueObject(R9, ic_data);
   __ blx(LR);
 
@@ -1094,7 +1099,8 @@
     intptr_t count_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
-    LocationSummary* locs) {
+    LocationSummary* locs,
+    Code::EntryKind entry_kind) {
   ASSERT(!function.IsClosureFunction());
   if (function.HasOptionalParameters() ||
       (isolate()->reify_generic_functions() && function.IsGeneric())) {
@@ -1106,7 +1112,7 @@
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos,
                          *StubCode::CallStaticFunction_entry(),
-                         RawPcDescriptors::kOther, locs, function);
+                         RawPcDescriptors::kOther, locs, function, entry_kind);
   __ Drop(count_with_type_args);
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 3b03a79..ddd491f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -863,7 +863,8 @@
 
     intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
+      args_desc_slot = compiler_frame_layout.FrameSlotForVariable(
+          parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
@@ -871,7 +872,8 @@
       __ LoadObject(R0, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      const intptr_t slot_index =
+          compiler_frame_layout.FrameSlotForVariableIndex(-i);
       Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
       __ StoreToOffset(value_reg, FP, slot_index * kWordSize);
     }
@@ -905,7 +907,9 @@
                                          TokenPosition token_pos,
                                          const StubEntry& stub_entry,
                                          RawPcDescriptors::Kind kind,
-                                         LocationSummary* locs) {
+                                         LocationSummary* locs,
+                                         Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
   __ BranchLinkPatchable(stub_entry);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
@@ -915,7 +919,9 @@
                                                const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
-                                               const Function& target) {
+                                               const Function& target,
+                                               Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
   // Call sites to the same target can share object pool entries. These
   // call sites are never patched for breakpoints: the function is deoptimized
   // and the unoptimized code with IC calls for static calls is patched instead.
@@ -953,7 +959,9 @@
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
-                                                  LocationSummary* locs) {
+                                                  LocationSummary* locs,
+                                                  Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -1039,7 +1047,8 @@
   __ Comment("SwitchableCall");
   __ LoadFromOffset(R0, SP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(CODE_REG, initial_stub);
-  __ ldr(TMP, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(TMP, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                         Code::EntryKind::kMonomorphic)));
   __ LoadUniqueObject(R5, ic_data);
   __ blr(TMP);
 
@@ -1067,7 +1076,9 @@
     intptr_t count_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
-    LocationSummary* locs) {
+    LocationSummary* locs,
+    Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
   ASSERT(!function.IsClosureFunction());
   if (function.HasOptionalParameters() ||
       (isolate()->reify_generic_functions() && function.IsGeneric())) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index 1d6c20e..9a9e90f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -109,7 +109,9 @@
   if (lazy_deopt_with_result_) {
     ASSERT(reason() == ICData::kDeoptAtCall);
     builder->AddCopy(
-        NULL, Location::StackSlot(FrameSlotForVariableIndex(-stack_height)),
+        NULL,
+        Location::StackSlot(
+            compiler_frame_layout.FrameSlotForVariableIndex(-stack_height)),
         slot_ix++);
   }
 
@@ -283,7 +285,7 @@
 }
 
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
-  __ Move(0, -(1 + kParamEndSlotFromFp));
+  __ Move(0, -(1 + compiler_frame_layout.param_end_from_fp));
   ASSERT(offset % kWordSize == 0);
   if (Utils::IsInt(8, offset / kWordSize)) {
     __ LoadField(0, 0, offset / kWordSize);
@@ -295,8 +297,8 @@
 }
 
 void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
-  __ Move(0, -(2 + kParamEndSlotFromFp));
-  __ Move(1, -(1 + kParamEndSlotFromFp));
+  __ Move(0, -(2 + compiler_frame_layout.param_end_from_fp));
+  __ Move(1, -(1 + compiler_frame_layout.param_end_from_fp));
   ASSERT(offset % kWordSize == 0);
   if (Utils::IsInt(8, offset / kWordSize)) {
     __ StoreField(0, offset / kWordSize, 1);
@@ -329,8 +331,8 @@
     if (parsed_function().has_arg_desc_var()) {
       // TODO(kustermann): If dbc simulator put the args_desc_ into the
       // _special_regs, we could replace these 3 with the MoveSpecial bytecode.
-      const intptr_t slot_index =
-          FrameSlotForVariable(parsed_function().arg_desc_var());
+      const intptr_t slot_index = compiler_frame_layout.FrameSlotForVariable(
+          parsed_function().arg_desc_var());
       __ LoadArgDescriptor();
       __ StoreLocal(LocalVarIndex(0, slot_index));
       __ Drop(1);
@@ -370,7 +372,7 @@
     // Only allow access to the arguments (which have in the non-inverted stack
     // positive indices).
     ASSERT(source.base_reg() == FPREG);
-    ASSERT(source.stack_index() > kParamEndSlotFromFp);
+    ASSERT(source.stack_index() > compiler_frame_layout.param_end_from_fp);
     __ Move(destination.reg(), -source.stack_index());
   } else if (source.IsRegister() && destination.IsRegister()) {
     __ Move(destination.reg(), source.reg());
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 77e3d0a..821d8c3 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -820,7 +820,8 @@
 
     intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
+      args_desc_slot = compiler_frame_layout.FrameSlotForVariable(
+          parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
@@ -830,7 +831,8 @@
       __ movl(EAX, raw_null);
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      const intptr_t slot_index =
+          compiler_frame_layout.FrameSlotForVariableIndex(-i);
       Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : EAX;
       __ movl(Address(EBP, slot_index * kWordSize), value_reg);
     }
@@ -856,7 +858,9 @@
                                          TokenPosition token_pos,
                                          const StubEntry& stub_entry,
                                          RawPcDescriptors::Kind kind,
-                                         LocationSummary* locs) {
+                                         LocationSummary* locs,
+                                         Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
   __ Call(stub_entry);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
@@ -866,7 +870,9 @@
                                                const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
-                                               const Function& target) {
+                                               const Function& target,
+                                               Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
   __ Call(stub_entry, true /* movable_target */);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
   AddStaticCallTarget(target);
@@ -910,7 +916,9 @@
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
-                                                  LocationSummary* locs) {
+                                                  LocationSummary* locs,
+                                                  Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -988,7 +996,9 @@
     intptr_t count_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
-    LocationSummary* locs) {
+    LocationSummary* locs,
+    Code::EntryKind entry_kind) {
+  // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
   if (function.HasOptionalParameters() ||
       (isolate()->reify_generic_functions() && function.IsGeneric())) {
     __ LoadObject(EDX, arguments_descriptor);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index bac9b48..c96b0a1 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -847,19 +847,8 @@
   }
 }
 
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-#ifdef DART_PRECOMPILER
-  const Function& function = parsed_function().function();
-  if (function.IsDynamicFunction()) {
-    __ MonomorphicCheckedEntry();
-  }
-#endif  // DART_PRECOMPILER
-
-  if (TryIntrinsify()) {
-    // Skip regular code generation.
-    return;
-  }
+void FlowGraphCompiler::EmitPrologue() {
+  BeginCodeSourceRange();
 
   EmitFrameEntry();
   ASSERT(assembler()->constant_pool_allowed());
@@ -870,7 +859,8 @@
 
     intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
+      args_desc_slot = compiler_frame_layout.FrameSlotForVariable(
+          parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
@@ -878,13 +868,26 @@
       __ LoadObject(RAX, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      const intptr_t slot_index =
+          compiler_frame_layout.FrameSlotForVariableIndex(-i);
       Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : RAX;
       __ movq(Address(RBP, slot_index * kWordSize), value_reg);
     }
   }
 
   EndCodeSourceRange(TokenPosition::kDartCodePrologue);
+}
+
+void FlowGraphCompiler::CompileGraph() {
+  InitCompiler();
+#ifdef DART_PRECOMPILER
+  const Function& function = parsed_function().function();
+  if (function.IsDynamicFunction()) {
+    __ MonomorphicCheckedEntry();
+  }
+#endif  // DART_PRECOMPILER
+
+  __ set_constant_pool_allowed(true);
   ASSERT(!block_order().is_empty());
   VisitBlocks();
 
@@ -913,8 +916,9 @@
                                          TokenPosition token_pos,
                                          const StubEntry& stub_entry,
                                          RawPcDescriptors::Kind kind,
-                                         LocationSummary* locs) {
-  __ CallPatchable(stub_entry);
+                                         LocationSummary* locs,
+                                         Code::EntryKind entry_kind) {
+  __ CallPatchable(stub_entry, entry_kind);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
 
@@ -923,12 +927,13 @@
                                                const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
-                                               const Function& target) {
+                                               const Function& target,
+                                               Code::EntryKind entry_kind) {
   // Call sites to the same target can share object pool entries. These
   // call sites are never patched for breakpoints: the function is deoptimized
   // and the unoptimized code with IC calls for static calls is patched instead.
   ASSERT(is_optimizing());
-  __ CallWithEquivalence(stub_entry, target);
+  __ CallWithEquivalence(stub_entry, target, entry_kind);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
   AddStaticCallTarget(target);
 }
@@ -972,7 +977,8 @@
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
-                                                  LocationSummary* locs) {
+                                                  LocationSummary* locs,
+                                                  Code::EntryKind entry_kind) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -983,7 +989,7 @@
   __ LoadObject(RDI, parsed_function().function());
   __ LoadUniqueObject(RBX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+                   locs, entry_kind);
   __ Drop(ic_data.CountWithTypeArgs(), RCX);
 }
 
@@ -1054,7 +1060,8 @@
   __ Comment("SwitchableCall");
   __ movq(RDI, Address(RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
   __ LoadUniqueObject(CODE_REG, initial_stub);
-  __ movq(RCX, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ movq(RCX, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                          Code::EntryKind::kMonomorphic)));
   __ LoadUniqueObject(RBX, ic_data);
   __ call(RCX);
 
@@ -1068,7 +1075,8 @@
     intptr_t count_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
-    LocationSummary* locs) {
+    LocationSummary* locs,
+    Code::EntryKind entry_kind) {
   ASSERT(!function.IsClosureFunction());
   if (function.HasOptionalParameters() ||
       (isolate()->reify_generic_functions() && function.IsGeneric())) {
@@ -1080,7 +1088,7 @@
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos,
                          *StubCode::CallStaticFunction_entry(),
-                         RawPcDescriptors::kOther, locs, function);
+                         RawPcDescriptors::kOther, locs, function, entry_kind);
   __ Drop(count_with_type_args, RCX);
 }
 
@@ -1234,14 +1242,14 @@
     } else {
       ASSERT(destination.IsStackSlot());
       ASSERT((destination.base_reg() != FPREG) ||
-             ((-VariableIndexForFrameSlot(destination.stack_index())) <
-              compiler_->StackSize()));
+             ((-compiler_frame_layout.VariableIndexForFrameSlot(
+                  destination.stack_index())) < compiler_->StackSize()));
       __ movq(destination.ToStackSlotAddress(), source.reg());
     }
   } else if (source.IsStackSlot()) {
     ASSERT((source.base_reg() != FPREG) ||
-           ((-VariableIndexForFrameSlot(source.stack_index())) <
-            compiler_->StackSize()));
+           ((-compiler_frame_layout.VariableIndexForFrameSlot(
+                source.stack_index())) < compiler_->StackSize()));
     if (destination.IsRegister()) {
       __ movq(destination.reg(), source.ToStackSlotAddress());
     } else {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 3c6a665..2efd036 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -879,6 +879,10 @@
   return field().raw() == other->AsGuardFieldLength()->field().raw();
 }
 
+bool GuardFieldTypeInstr::AttributesEqual(Instruction* other) const {
+  return field().raw() == other->AsGuardFieldType()->field().raw();
+}
+
 bool AssertAssignableInstr::AttributesEqual(Instruction* other) const {
   AssertAssignableInstr* other_assert = other->AsAssertAssignable();
   ASSERT(other_assert != NULL);
@@ -1716,11 +1720,15 @@
 }
 
 intptr_t GraphEntryInstr::SuccessorCount() const {
-  return 1 + catch_entries_.length();
+  return 1 + (unchecked_entry() == nullptr ? 0 : 1) + catch_entries_.length();
 }
 
 BlockEntryInstr* GraphEntryInstr::SuccessorAt(intptr_t index) const {
   if (index == 0) return normal_entry_;
+  if (unchecked_entry() != nullptr) {
+    if (index == 1) return unchecked_entry();
+    return catch_entries_[index - 2];
+  }
   return catch_entries_[index - 1];
 }
 
@@ -2643,6 +2651,15 @@
       }
     } else if (CreateArrayInstr* create_array = array->AsCreateArray()) {
       return create_array->element_type()->definition();
+    } else if (LoadFieldInstr* load_array = array->AsLoadField()) {
+      const Field* field = load_array->field();
+      // For trivially exact fields we know that type arguments match
+      // static type arguments exactly.
+      if ((field != nullptr) &&
+          field->static_type_exactness_state().IsTriviallyExact()) {
+        return flow_graph->GetConstant(TypeArguments::Handle(
+            AbstractType::Handle(field->type()).arguments()));
+      }
     }
   }
 
@@ -2689,31 +2706,64 @@
   // be located in the unreachable part of the graph (e.g.
   // it might be dominated by CheckClass that always fails).
   // This means that the code below must guard against such possibility.
-  ConstantInstr* constant_instantiator_type_args =
-      instantiator_type_arguments()->definition()->AsConstant();
-  ConstantInstr* constant_function_type_args =
-      function_type_arguments()->definition()->AsConstant();
-  if ((constant_instantiator_type_args != NULL) &&
-      (constant_function_type_args != NULL)) {
-    ASSERT(constant_instantiator_type_args->value().IsNull() ||
-           constant_instantiator_type_args->value().IsTypeArguments());
-    ASSERT(constant_function_type_args->value().IsNull() ||
-           constant_function_type_args->value().IsTypeArguments());
+  Zone* Z = Thread::Current()->zone();
 
-    Zone* Z = Thread::Current()->zone();
-    const TypeArguments& instantiator_type_args = TypeArguments::Handle(
-        Z,
-        TypeArguments::RawCast(constant_instantiator_type_args->value().raw()));
+  const TypeArguments* instantiator_type_args = nullptr;
+  const TypeArguments* function_type_args = nullptr;
 
-    const TypeArguments& function_type_args = TypeArguments::Handle(
-        Z, TypeArguments::RawCast(constant_function_type_args->value().raw()));
+  if (instantiator_type_arguments()->BindsToConstant()) {
+    const Object& val = instantiator_type_arguments()->BoundConstant();
+    instantiator_type_args = (val.raw() == TypeArguments::null())
+                                 ? &TypeArguments::null_type_arguments()
+                                 : &TypeArguments::Cast(val);
+  }
 
+  if (function_type_arguments()->BindsToConstant()) {
+    const Object& val = function_type_arguments()->BoundConstant();
+    function_type_args =
+        (val.raw() == TypeArguments::null())
+            ? &TypeArguments::null_type_arguments()
+            : &TypeArguments::Cast(function_type_arguments()->BoundConstant());
+  }
+
+  // If instantiator_type_args are not constant try to match the pattern
+  // obj.field.:type_arguments where field's static type exactness state
+  // tells us that all values stored in the field have exact superclass.
+  // In this case we know the prefix of the actual type arguments vector
+  // and can try to instantiate the type using just the prefix.
+  //
+  // Note: TypeParameter::InstantiateFrom returns an error if we try
+  // to instantiate it from a vector that is too short.
+  if (instantiator_type_args == nullptr) {
+    if (LoadFieldInstr* load_type_args =
+            instantiator_type_arguments()->definition()->AsLoadField()) {
+      if (load_type_args->native_field() != nullptr &&
+          load_type_args->native_field()->kind() ==
+              NativeFieldDesc::kTypeArguments) {
+        if (LoadFieldInstr* load_field = load_type_args->instance()
+                                             ->definition()
+                                             ->OriginalDefinition()
+                                             ->AsLoadField()) {
+          if (load_field->field() != nullptr &&
+              load_field->field()
+                  ->static_type_exactness_state()
+                  .IsHasExactSuperClass()) {
+            instantiator_type_args = &TypeArguments::Handle(
+                Z, AbstractType::Handle(Z, load_field->field()->type())
+                       .arguments());
+          }
+        }
+      }
+    }
+  }
+
+  if ((instantiator_type_args != nullptr) && (function_type_args != nullptr)) {
     Error& bound_error = Error::Handle(Z);
 
     AbstractType& new_dst_type = AbstractType::Handle(
-        Z, dst_type().InstantiateFrom(instantiator_type_args,
-                                      function_type_args, kAllFree,
-                                      &bound_error, NULL, NULL, Heap::kOld));
+        Z, dst_type().InstantiateFrom(
+               *instantiator_type_args, *function_type_args, kAllFree,
+               &bound_error, nullptr, nullptr, Heap::kOld));
     if (new_dst_type.IsMalformedOrMalbounded() || !bound_error.IsNull()) {
       return this;
     }
@@ -3314,6 +3364,11 @@
   return this;
 }
 
+Instruction* GuardFieldTypeInstr::Canonicalize(FlowGraph* flow_graph) {
+  return field().static_type_exactness_state().NeedsFieldGuard() ? this
+                                                                 : nullptr;
+}
+
 Instruction* CheckSmiInstr::Canonicalize(FlowGraph* flow_graph) {
   return (value()->Type()->ToCid() == kSmiCid) ? NULL : this;
 }
@@ -3547,6 +3602,18 @@
 
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
+
+#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM)
+  if (compiler->flow_graph().IsEntryPoint(this)) {
+    __ set_constant_pool_allowed(false);
+    // TODO(#34162): Don't emit more code if 'TryIntrinsify' returns 'true'
+    // (meaning the function was fully intrinsified).
+    compiler->TryIntrinsify();
+    compiler->EmitPrologue();
+    ASSERT(__ constant_pool_allowed());
+  }
+#endif
+
   if (!compiler->is_optimizing()) {
 #if !defined(TARGET_ARCH_DBC)
     // TODO(vegorov) re-enable edge counters on DBC if we consider them
@@ -3861,11 +3928,11 @@
       const ICData& unary_ic_data =
           ICData::ZoneHandle(zone, ic_data()->AsUnaryClassChecks());
       compiler->GenerateInstanceCall(deopt_id(), token_pos(), locs(),
-                                     unary_ic_data);
+                                     unary_ic_data, entry_kind());
     } else {
       // Call was not visited yet, use original ICData in order to populate it.
       compiler->GenerateInstanceCall(deopt_id(), token_pos(), locs(),
-                                     *call_ic_data);
+                                     *call_ic_data, entry_kind());
     }
   } else {
     // Unoptimized code.
@@ -4131,7 +4198,8 @@
 #if !defined(TARGET_ARCH_DBC)
   ArgumentsInfo args_info(type_args_len(), ArgumentCount(), argument_names());
   compiler->GenerateStaticCall(deopt_id(), token_pos(), function(), args_info,
-                               locs(), *call_ic_data, rebind_rule_);
+                               locs(), *call_ic_data, rebind_rule_,
+                               entry_kind());
   if (function().IsFactory()) {
     TypeUsageInfo* type_usage_info = compiler->thread()->type_usage_info();
     if (type_usage_info != nullptr) {
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index ff8df89..e4fc014 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -580,6 +580,7 @@
   /*We could be more precise about when these 2 instructions can trigger GC.*/ \
   M(GuardFieldClass, _)                                                        \
   M(GuardFieldLength, _)                                                       \
+  M(GuardFieldType, _)                                                         \
   M(IfThenElse, kNoGC)                                                         \
   M(MaterializeObject, _)                                                      \
   M(TestSmi, kNoGC)                                                            \
@@ -1520,6 +1521,11 @@
     fixed_slot_count_ = count;
   }
   TargetEntryInstr* normal_entry() const { return normal_entry_; }
+  TargetEntryInstr* unchecked_entry() const { return unchecked_entry_; }
+  void set_normal_entry(TargetEntryInstr* entry) { normal_entry_ = entry; }
+  void set_unchecked_entry(TargetEntryInstr* target) {
+    unchecked_entry_ = target;
+  }
 
   const ParsedFunction& parsed_function() const { return parsed_function_; }
 
@@ -1531,6 +1537,17 @@
     return indirect_entries_;
   }
 
+  bool IsEntryPoint(BlockEntryInstr* entry) const {
+    if (TargetEntryInstr* target = entry->AsTargetEntry()) {
+      return target == normal_entry_ || target == unchecked_entry_;
+    }
+    return false;
+  }
+
+  bool HasSingleEntryPoint() const {
+    return catch_entries().is_empty() && unchecked_entry() == nullptr;
+  }
+
   PRINT_TO_SUPPORT
 
  private:
@@ -1539,6 +1556,7 @@
 
   const ParsedFunction& parsed_function_;
   TargetEntryInstr* normal_entry_;
+  TargetEntryInstr* unchecked_entry_ = nullptr;
   GrowableArray<CatchBlockEntryInstr*> catch_entries_;
   // Indirect targets are blocks reachable only through indirect gotos.
   GrowableArray<IndirectEntryInstr*> indirect_entries_;
@@ -3342,6 +3360,10 @@
 
   RawFunction* ResolveForReceiverClass(const Class& cls, bool allow_add = true);
 
+  Code::EntryKind entry_kind() const { return entry_kind_; }
+
+  void set_entry_kind(Code::EntryKind value) { entry_kind_ = value; }
+
  protected:
   friend class CallSpecializer;
   void set_ic_data(ICData* value) { ic_data_ = value; }
@@ -3354,6 +3376,7 @@
   const Function& interface_target_;
   CompileType* result_type_;  // Inferred result type.
   bool has_unique_selector_;
+  Code::EntryKind entry_kind_ = Code::EntryKind::kNormal;
 
   DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr);
 };
@@ -3842,6 +3865,10 @@
     is_known_list_constructor_ = value;
   }
 
+  Code::EntryKind entry_kind() const { return entry_kind_; }
+
+  void set_entry_kind(Code::EntryKind value) { entry_kind_ = value; }
+
   bool IsRecognizedFactory() const { return is_known_list_constructor(); }
 
   virtual AliasIdentity Identity() const { return identity_; }
@@ -3859,6 +3886,8 @@
   // 'True' for recognized list constructors.
   bool is_known_list_constructor_;
 
+  Code::EntryKind entry_kind_ = Code::EntryKind::kNormal;
+
   AliasIdentity identity_;
 
   DISALLOW_COPY_AND_ASSIGN(StaticCallInstr);
@@ -4196,6 +4225,13 @@
   friend class JitCallSpecializer;  // For ASSERT(initialization_).
 
   Assembler::CanBeSmi CanValueBeSmi() const {
+    Isolate* isolate = Isolate::Current();
+    if (isolate->type_checks() && !isolate->strong()) {
+      // Dart 1 sometimes places a store into a context before a parameter
+      // type check.
+      return Assembler::kValueCanBeSmi;
+    }
+
     const intptr_t cid = value()->Type()->ToNullableCid();
     // Write barrier is skipped for nullable and non-nullable smis.
     ASSERT(cid != kSmiCid);
@@ -4273,6 +4309,29 @@
   DISALLOW_COPY_AND_ASSIGN(GuardFieldLengthInstr);
 };
 
+// For a field of static type G<T0, ..., Tn> and a stored value of runtime
+// type T checks that type arguments of T at G exactly match <T0, ..., Tn>
+// and updates guarded state (RawField::static_type_exactness_state_)
+// accordingly.
+//
+// See StaticTypeExactnessState for more information.
+class GuardFieldTypeInstr : public GuardFieldInstr {
+ public:
+  GuardFieldTypeInstr(Value* value, const Field& field, intptr_t deopt_id)
+      : GuardFieldInstr(value, field, deopt_id) {
+    CheckField(field);
+  }
+
+  DECLARE_INSTRUCTION(GuardFieldType)
+
+  virtual Instruction* Canonicalize(FlowGraph* flow_graph);
+
+  virtual bool AttributesEqual(Instruction* other) const;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GuardFieldTypeInstr);
+};
+
 class LoadStaticFieldInstr : public TemplateDefinition<1, NoThrow> {
  public:
   LoadStaticFieldInstr(Value* field_value, TokenPosition token_pos)
@@ -4339,6 +4398,13 @@
 
  private:
   Assembler::CanBeSmi CanValueBeSmi() const {
+    Isolate* isolate = Isolate::Current();
+    if (isolate->type_checks() && !isolate->strong()) {
+      // Dart 1 sometimes places a store into a context before a parameter
+      // type check.
+      return Assembler::kValueCanBeSmi;
+    }
+
     const intptr_t cid = value()->Type()->ToNullableCid();
     // Write barrier is skipped for nullable and non-nullable smis.
     ASSERT(cid != kSmiCid);
@@ -5109,6 +5175,7 @@
         native_field_(nullptr),
         field_(field),
         token_pos_(token_pos) {
+    ASSERT(Class::Handle(field->Owner()).is_finalized());
     ASSERT(field->IsZoneHandle());
     // May be null if field is not an instance.
     ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index a186bfa..3d550e2 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -128,7 +128,8 @@
   Label stack_ok;
   __ Comment("Stack Check");
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ sub(R2, SP, Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist);
@@ -294,7 +295,9 @@
 
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result = locs()->out(0).reg();
-  __ LoadFromOffset(kWord, result, FP, FrameOffsetInBytesForVariable(&local()));
+  __ LoadFromOffset(
+      kWord, result, FP,
+      compiler_frame_layout.FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
@@ -307,7 +310,9 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ StoreToOffset(kWord, value, FP, FrameOffsetInBytesForVariable(&local()));
+  __ StoreToOffset(
+      kWord, value, FP,
+      compiler_frame_layout.FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -2013,6 +2018,16 @@
   }
 }
 
+LocationSummary* GuardFieldTypeInstr::MakeLocationSummary(Zone* zone,
+                                                          bool opt) const {
+  UNREACHABLE();
+  return nullptr;
+}
+
+void GuardFieldTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNREACHABLE();
+}
+
 class BoxAllocationSlowPath : public TemplateSlowPathCode<Instruction> {
  public:
   BoxAllocationSlowPath(Instruction* instruction,
@@ -2980,18 +2995,21 @@
   // Restore SP from FP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ AddImmediate(SP, FP, fp_sp_dist);
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
       __ StoreToOffset(kWord, kExceptionObjectReg, FP,
-                       FrameOffsetInBytesForVariable(raw_exception_var_));
+                       compiler_frame_layout.FrameOffsetInBytesForVariable(
+                           raw_exception_var_));
     }
     if (raw_stacktrace_var_ != nullptr) {
       __ StoreToOffset(kWord, kStackTraceObjectReg, FP,
-                       FrameOffsetInBytesForVariable(raw_stacktrace_var_));
+                       compiler_frame_layout.FrameOffsetInBytesForVariable(
+                           raw_stacktrace_var_));
     }
   }
 }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 99f9646..dfe94b4 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -127,7 +127,8 @@
   Label stack_ok;
   __ Comment("Stack Check");
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ sub(R2, SP, Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist);
@@ -291,7 +292,9 @@
 
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result = locs()->out(0).reg();
-  __ LoadFromOffset(result, FP, FrameOffsetInBytesForVariable(&local()));
+  __ LoadFromOffset(
+      result, FP,
+      compiler_frame_layout.FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
@@ -304,7 +307,8 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ StoreToOffset(value, FP, FrameOffsetInBytesForVariable(&local()));
+  __ StoreToOffset(
+      value, FP, compiler_frame_layout.FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -874,7 +878,7 @@
   }
   __ LoadImmediate(R1, argc_tag);
   ExternalLabel label(entry);
-  __ LoadNativeEntry(R5, &label);
+  __ LoadNativeEntry(R5, &label, link_lazily() ? kPatchable : kNotPatchable);
   if (link_lazily()) {
     compiler->GeneratePatchableCall(token_pos(), *stub_entry,
                                     RawPcDescriptors::kOther, locs());
@@ -1572,6 +1576,16 @@
   __ Bind(&done);
 }
 
+LocationSummary* GuardFieldTypeInstr::MakeLocationSummary(Zone* zone,
+                                                          bool opt) const {
+  UNREACHABLE();
+  return nullptr;
+}
+
+void GuardFieldTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNREACHABLE();
+}
+
 LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -2675,18 +2689,21 @@
   // Restore SP from FP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ AddImmediate(SP, FP, fp_sp_dist);
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
       __ StoreToOffset(kExceptionObjectReg, FP,
-                       FrameOffsetInBytesForVariable(raw_exception_var_));
+                       compiler_frame_layout.FrameOffsetInBytesForVariable(
+                           raw_exception_var_));
     }
     if (raw_stacktrace_var_ != nullptr) {
       __ StoreToOffset(kStackTraceObjectReg, FP,
-                       FrameOffsetInBytesForVariable(raw_stacktrace_var_));
+                       compiler_frame_layout.FrameOffsetInBytesForVariable(
+                           raw_stacktrace_var_));
     }
   }
 }
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index dae7f80..848346f 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -38,6 +38,7 @@
   M(TruncDivMod)                                                               \
   M(GuardFieldClass)                                                           \
   M(GuardFieldLength)                                                          \
+  M(GuardFieldType)                                                            \
   M(IfThenElse)                                                                \
   M(ExtractNthOutput)                                                          \
   M(BinaryUint32Op)                                                            \
@@ -330,13 +331,15 @@
 
 EMIT_NATIVE_CODE(LoadLocal, 0) {
   ASSERT(!compiler->is_optimizing());
-  const intptr_t slot_index = FrameSlotForVariable(&local());
+  const intptr_t slot_index =
+      compiler_frame_layout.FrameSlotForVariable(&local());
   __ Push(LocalVarIndex(0, slot_index));
 }
 
 EMIT_NATIVE_CODE(StoreLocal, 0) {
   ASSERT(!compiler->is_optimizing());
-  const intptr_t slot_index = FrameSlotForVariable(&local());
+  const intptr_t slot_index =
+      compiler_frame_layout.FrameSlotForVariable(&local());
   if (HasTemp()) {
     __ StoreLocal(LocalVarIndex(0, slot_index));
   } else {
@@ -388,8 +391,10 @@
   }
 }
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
-                                                            bool opt) const {
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(
+
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
   LocationSummary* locs = new (zone)
@@ -598,7 +603,10 @@
   }
 }
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(
+
+    Zone* zone,
+    bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   if (!comparison()->HasLocs()) {
     return NULL;
@@ -1188,12 +1196,15 @@
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ MoveSpecial(LocalVarIndex(0, FrameSlotForVariable(raw_exception_var_)),
-                     Simulator::kExceptionSpecialIndex);
+      __ MoveSpecial(
+          LocalVarIndex(0, compiler_frame_layout.FrameSlotForVariable(
+                               raw_exception_var_)),
+          Simulator::kExceptionSpecialIndex);
     }
     if (raw_stacktrace_var_ != nullptr) {
       __ MoveSpecial(
-          LocalVarIndex(0, FrameSlotForVariable(raw_stacktrace_var_)),
+          LocalVarIndex(0, compiler_frame_layout.FrameSlotForVariable(
+                               raw_stacktrace_var_)),
           Simulator::kStackTraceSpecialIndex);
     }
   }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index b75054d..b6d4586 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -118,7 +118,8 @@
   __ Comment("Stack Check");
   Label done;
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ movl(EDI, ESP);
   __ subl(EDI, EBP);
@@ -134,7 +135,8 @@
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t stack_index = FrameSlotForVariable(&local());
+  const intptr_t stack_index =
+      compiler_frame_layout.FrameSlotForVariable(&local());
   return LocationSummary::Make(zone, kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
@@ -156,7 +158,9 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ movl(Address(EBP, FrameOffsetInBytesForVariable(&local())), value);
+  __ movl(Address(EBP, compiler_frame_layout.FrameOffsetInBytesForVariable(
+                           &local())),
+          value);
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -1438,6 +1442,16 @@
   }
 }
 
+LocationSummary* GuardFieldTypeInstr::MakeLocationSummary(Zone* zone,
+                                                          bool opt) const {
+  UNREACHABLE();
+  return nullptr;
+}
+
+void GuardFieldTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNREACHABLE();
+}
+
 LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -2548,17 +2562,20 @@
   // Restore ESP from EBP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ leal(ESP, Address(EBP, fp_sp_dist));
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ movl(Address(EBP, FrameOffsetInBytesForVariable(raw_exception_var_)),
+      __ movl(Address(EBP, compiler_frame_layout.FrameOffsetInBytesForVariable(
+                               raw_exception_var_)),
               kExceptionObjectReg);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ movl(Address(EBP, FrameOffsetInBytesForVariable(raw_stacktrace_var_)),
+      __ movl(Address(EBP, compiler_frame_layout.FrameOffsetInBytesForVariable(
+                               raw_stacktrace_var_)),
               kStackTraceObjectReg);
     }
   }
@@ -5969,7 +5986,8 @@
   Register target_reg = locs()->temp_slot(0)->reg();
 
   // Load code object from frame.
-  __ movl(target_reg, Address(EBP, kPcMarkerSlotFromFp * kWordSize));
+  __ movl(target_reg,
+          Address(EBP, compiler_frame_layout.code_from_fp * kWordSize));
   // Load instructions object (active_instructions and Code::entry_point() may
   // not point to this instruction object any more; see Code::DisableDartCode).
   __ movl(target_reg,
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index be25c2b..b1570d7 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -517,6 +517,9 @@
   if (complete()) {
     f->Print(" COMPLETE");
   }
+  if (instance_call()->entry_kind() == Code::EntryKind::kUnchecked) {
+    f->Print(" using unchecked entrypoint");
+  }
 }
 
 void StrictCompareInstr::PrintOperandsTo(BufferFormatter* f) const {
@@ -560,6 +563,9 @@
     if (i > 0) f->Print(", ");
     PushArgumentAt(i)->value()->PrintTo(f);
   }
+  if (entry_kind() == Code::EntryKind::kUnchecked) {
+    f->Print(", using unchecked entrypoint");
+  }
 }
 
 void LoadLocalInstr::PrintOperandsTo(BufferFormatter* f) const {
@@ -651,16 +657,8 @@
   f->Print(", %" Pd, offset_in_bytes());
 
   if (field() != nullptr) {
-    f->Print(" {%s}", String::Handle(field()->name()).ToCString());
-    const char* expected = "?";
-    if (field()->guarded_cid() != kIllegalCid) {
-      const Class& cls = Class::Handle(
-          Isolate::Current()->class_table()->At(field()->guarded_cid()));
-      expected = String::Handle(cls.Name()).ToCString();
-    }
-
-    f->Print(" [%s %s]", field()->is_nullable() ? "nullable" : "non-nullable",
-             expected);
+    f->Print(" {%s} %s", String::Handle(field()->name()).ToCString(),
+             field()->GuardedPropertiesAsCString());
   }
 
   if (native_field() != nullptr) {
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 6d0a489..d214aef 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -118,7 +118,8 @@
   __ Comment("Stack Check");
   Label done;
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ movq(RDI, RSP);
   __ subq(RDI, RBP);
@@ -236,7 +237,8 @@
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t stack_index = FrameSlotForVariable(&local());
+  const intptr_t stack_index =
+      compiler_frame_layout.FrameSlotForVariable(&local());
   return LocationSummary::Make(zone, kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
@@ -258,7 +260,9 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ movq(Address(RBP, FrameOffsetInBytesForVariable(&local())), value);
+  __ movq(Address(RBP, compiler_frame_layout.FrameOffsetInBytesForVariable(
+                           &local())),
+          value);
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -1646,10 +1650,14 @@
     __ j(EQUAL, &ok);
 
     // Check if the tracked state of the guarded field can be initialized
-    // inline. If the field needs length check we fall through to runtime
-    // which is responsible for computing offset of the length field
-    // based on the class id.
-    if (!field().needs_length_check()) {
+    // inline. If the field needs length check or requires type arguments and
+    // class hierarchy processing for exactness tracking then we fall through
+    // into runtime which is responsible for computing offset of the length
+    // field based on the class id.
+    const bool is_complicated_field =
+        field().needs_length_check() ||
+        field().static_type_exactness_state().IsUninitialized();
+    if (!is_complicated_field) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
       __ cmpw(field_cid_operand, Immediate(kIllegalCid));
@@ -1805,6 +1813,88 @@
   }
 }
 
+LocationSummary* GuardFieldTypeInstr::MakeLocationSummary(Zone* zone,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_temp(0, Location::RequiresRegister());
+  return summary;
+}
+
+void GuardFieldTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Should never emit GuardFieldType for fields that are marked as NotTracking.
+  ASSERT(field().static_type_exactness_state().IsTracking());
+  if (!field().static_type_exactness_state().NeedsFieldGuard()) {
+    // Nothing to do: we only need to perform checks for trivially invariant
+    // fields. If optimizing Canonicalize pass should have removed
+    // this instruction.
+    if (Compiler::IsBackgroundCompilation()) {
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
+          "GuardFieldTypeInstr: field state changed during compilation");
+    }
+    ASSERT(!compiler->is_optimizing());
+    return;
+  }
+
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
+
+  Label ok;
+
+  const Register value_reg = locs()->in(0).reg();
+  const Register temp = locs()->temp(0).reg();
+
+  // Skip null values for nullable fields.
+  if (!compiler->is_optimizing() || field().is_nullable()) {
+    __ CompareObject(value_reg, Object::Handle());
+    __ j(EQUAL, &ok);
+  }
+
+  // Get the state.
+  __ LoadObject(temp, Field::ZoneHandle(compiler->zone(), field().Original()));
+  __ movsxb(temp,
+            FieldAddress(temp, Field::static_type_exactness_state_offset()));
+
+  if (!compiler->is_optimizing()) {
+    // Check if field requires checking (it is in unitialized or trivially
+    // exact state).
+    __ cmpq(temp, Immediate(StaticTypeExactnessState::kUninitialized));
+    __ j(LESS, &ok);
+  }
+
+  Label call_runtime;
+  if (field().static_type_exactness_state().IsUninitialized()) {
+    // Can't initialize the field state inline in optimized code.
+    __ cmpq(temp, Immediate(StaticTypeExactnessState::kUninitialized));
+    __ j(EQUAL, compiler->is_optimizing() ? deopt : &call_runtime);
+  }
+
+  // At this point temp is known to be type arguments offset in words.
+  __ movq(temp, FieldAddress(value_reg, temp, TIMES_8, 0));
+  __ CompareObject(temp, TypeArguments::ZoneHandle(
+                             compiler->zone(),
+                             AbstractType::Handle(field().type()).arguments()));
+  if (deopt != nullptr) {
+    __ j(NOT_EQUAL, deopt);
+  } else {
+    __ j(EQUAL, &ok);
+
+    __ Bind(&call_runtime);
+    __ PushObject(field());
+    __ pushq(value_reg);
+    __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
+    __ Drop(2);
+  }
+
+  __ Bind(&ok);
+}
+
 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -2588,17 +2678,20 @@
   // Restore RSP from RBP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
-      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+      (compiler_frame_layout.first_local_from_fp + 1 - compiler->StackSize()) *
+      kWordSize;
   ASSERT(fp_sp_dist <= 0);
   __ leaq(RSP, Address(RBP, fp_sp_dist));
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ movq(Address(RBP, FrameOffsetInBytesForVariable(raw_exception_var_)),
+      __ movq(Address(RBP, compiler_frame_layout.FrameOffsetInBytesForVariable(
+                               raw_exception_var_)),
               kExceptionObjectReg);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ movq(Address(RBP, FrameOffsetInBytesForVariable(raw_stacktrace_var_)),
+      __ movq(Address(RBP, compiler_frame_layout.FrameOffsetInBytesForVariable(
+                               raw_stacktrace_var_)),
               kStackTraceObjectReg);
     }
   }
@@ -6063,7 +6156,7 @@
     ASSERT(__ CodeSize() == entry_to_rip_offset);
   }
 
-  // Load from [current frame pointer] + kPcMarkerSlotFromFp.
+  // Load from [current frame pointer] + compiler_frame_layout.code_from_fp.
 
   // Calculate the final absolute address.
   if (offset()->definition()->representation() == kTagged) {
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 9ca2177..0752327 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -13,6 +13,7 @@
 #include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/type_propagator.h"
+#include "vm/compiler/compiler_pass.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/compiler.h"
@@ -542,9 +543,12 @@
 static bool HasAnnotation(const Function& function, const char* annotation) {
   const Class& owner = Class::Handle(function.Owner());
   const Library& library = Library::Handle(owner.library());
-  const Array& metadata =
-      Array::Cast(Object::Handle(library.GetMetadata(function)));
 
+  auto& metadata_or_error = Object::Handle(library.GetMetadata(function));
+  if (metadata_or_error.IsError()) {
+    Exceptions::PropagateError(Error::Cast(metadata_or_error));
+  }
+  const Array& metadata = Array::Cast(metadata_or_error);
   if (metadata.Length() > 0) {
     Object& val = Object::Handle();
     for (intptr_t i = 0; i < metadata.Length(); i++) {
@@ -958,11 +962,22 @@
             new (Z) InlineExitCollector(caller_graph_, call);
         FlowGraph* callee_graph;
         if (UseKernelFrontEndFor(parsed_function)) {
+          Code::EntryKind entry_kind = Code::EntryKind::kNormal;
+          if (StaticCallInstr* instr = call_data->call->AsStaticCall()) {
+            entry_kind = instr->entry_kind();
+          } else if (InstanceCallInstr* instr =
+                         call_data->call->AsInstanceCall()) {
+            entry_kind = instr->entry_kind();
+          } else if (PolymorphicInstanceCallInstr* instr =
+                         call_data->call->AsPolymorphicInstanceCall()) {
+            entry_kind = instr->instance_call()->entry_kind();
+          }
           kernel::FlowGraphBuilder builder(
               parsed_function, *ic_data_array, /* not building var desc */ NULL,
               exit_collector,
               /* optimized = */ true, Compiler::kNoOSRDeoptId,
-              caller_graph_->max_block_id() + 1);
+              caller_graph_->max_block_id() + 1,
+              entry_kind == Code::EntryKind::kUnchecked);
           {
             CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
             callee_graph = builder.BuildGraph();
@@ -1106,6 +1121,11 @@
             callee_graph->TryOptimizePatterns();
             DEBUG_ASSERT(callee_graph->VerifyUseLists());
 
+            // This optimization must be performed before inlining to ensure
+            // that the receiver of the function is detected (since it will just
+            // be some regular variable after inlining).
+            MarkCallsOnReceiverUnchecked(callee_graph);
+
             callee_graph->Canonicalize();
           }
         }
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index 6ddddb9..46644a7 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -449,7 +449,8 @@
   assigned_location().Print();
   if (spill_slot_.HasStackIndex()) {
     const intptr_t stack_slot =
-        -VariableIndexForFrameSlot(spill_slot_.stack_index());
+        -compiler_frame_layout.VariableIndexForFrameSlot(
+            spill_slot_.stack_index());
     THR_Print(" allocated spill slot: %" Pd "", stack_slot);
   }
   THR_Print("\n");
@@ -711,7 +712,7 @@
     }
 #endif  // defined(TARGET_ARCH_DBC)
     if (param->base_reg() == FPREG) {
-      slot_index = FrameSlotForVariableIndex(-slot_index);
+      slot_index = compiler_frame_layout.FrameSlotForVariableIndex(-slot_index);
     }
     range->set_assigned_location(
         Location::StackSlot(slot_index, param->base_reg()));
@@ -752,7 +753,7 @@
   ConvertAllUses(range);
   Location spill_slot = range->spill_slot();
   if (spill_slot.IsStackSlot() && spill_slot.base_reg() == FPREG &&
-      spill_slot.stack_index() <= kFirstLocalSlotFromFp) {
+      spill_slot.stack_index() <= compiler_frame_layout.first_local_from_fp) {
     // On entry to the function, range is stored on the stack above the FP in
     // the same space which is used for spill slots. Update spill slot state to
     // reflect that and prevent register allocator from reusing this space as a
@@ -2011,13 +2012,14 @@
 
   // Assign spill slot to the range.
   if (register_kind_ == Location::kRegister) {
-    const intptr_t slot_index = FrameSlotForVariableIndex(-idx);
+    const intptr_t slot_index =
+        compiler_frame_layout.FrameSlotForVariableIndex(-idx);
     range->set_spill_slot(Location::StackSlot(slot_index));
   } else {
     // We use the index of the slot with the lowest address as an index for the
     // FPU register spill slot. In terms of indexes this relation is inverted:
     // so we have to take the highest index.
-    const intptr_t slot_idx = FrameSlotForVariableIndex(
+    const intptr_t slot_idx = compiler_frame_layout.FrameSlotForVariableIndex(
         -(cpu_spill_slot_count_ + idx * kDoubleSpillFactor +
           (kDoubleSpillFactor - 1)));
 
@@ -2041,7 +2043,8 @@
   Location spill_slot = range->spill_slot();
   intptr_t stack_index = spill_slot.stack_index();
   if (spill_slot.base_reg() == FPREG) {
-    stack_index = -VariableIndexForFrameSlot(spill_slot.stack_index());
+    stack_index = -compiler_frame_layout.VariableIndexForFrameSlot(
+        spill_slot.stack_index());
   }
   ASSERT(stack_index >= 0);
   while (range != NULL) {
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index 76fb649..22ea322 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -244,18 +244,21 @@
   if (IsRegister()) {
     intptr_t index = cpu_reg_slots[reg()];
     ASSERT(index >= 0);
-    return Location::StackSlot(FrameSlotForVariableIndex(-index));
+    return Location::StackSlot(
+        compiler_frame_layout.FrameSlotForVariableIndex(-index));
   } else if (IsFpuRegister()) {
     intptr_t index = fpu_reg_slots[fpu_reg()];
     ASSERT(index >= 0);
     switch (def->representation()) {
       case kUnboxedDouble:
-        return Location::DoubleStackSlot(FrameSlotForVariableIndex(-index));
+        return Location::DoubleStackSlot(
+            compiler_frame_layout.FrameSlotForVariableIndex(-index));
 
       case kUnboxedFloat32x4:
       case kUnboxedInt32x4:
       case kUnboxedFloat64x2:
-        return Location::QuadStackSlot(FrameSlotForVariableIndex(-index));
+        return Location::QuadStackSlot(
+            compiler_frame_layout.FrameSlotForVariableIndex(-index));
 
       default:
         UNREACHABLE();
@@ -267,16 +270,16 @@
     intptr_t index_hi;
 
     if (value_pair->At(0).IsRegister()) {
-      index_lo =
-          FrameSlotForVariableIndex(-cpu_reg_slots[value_pair->At(0).reg()]);
+      index_lo = compiler_frame_layout.FrameSlotForVariableIndex(
+          -cpu_reg_slots[value_pair->At(0).reg()]);
     } else {
       ASSERT(value_pair->At(0).IsStackSlot());
       index_lo = value_pair->At(0).stack_index();
     }
 
     if (value_pair->At(1).IsRegister()) {
-      index_hi =
-          FrameSlotForVariableIndex(-cpu_reg_slots[value_pair->At(1).reg()]);
+      index_hi = compiler_frame_layout.FrameSlotForVariableIndex(
+          -cpu_reg_slots[value_pair->At(1).reg()]);
     } else {
       ASSERT(value_pair->At(1).IsStackSlot());
       index_hi = value_pair->At(1).stack_index();
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 0c12d62..8da9934 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -17,6 +17,7 @@
 class Definition;
 class PairLocation;
 class Value;
+struct FrameLayout;
 
 enum Representation {
   kNoRepresentation,
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index c1d4f2b..4b58b36 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -192,7 +192,7 @@
 void FlowGraphTypePropagator::SetCid(Definition* def, intptr_t cid) {
   CompileType* current = TypeOf(def);
   if (current->IsNone() || (current->ToCid() != cid)) {
-    SetTypeOf(def, new CompileType(CompileType::FromCid(cid)));
+    SetTypeOf(def, new (zone()) CompileType(CompileType::FromCid(cid)));
   }
 }
 
@@ -248,11 +248,28 @@
 }
 
 void FlowGraphTypePropagator::VisitCheckClass(CheckClassInstr* check) {
-  if (!check->cids().IsMonomorphic()) {
+  // Use a monomorphic cid directly.
+  const Cids& cids = check->cids();
+  if (cids.IsMonomorphic()) {
+    SetCid(check->value()->definition(), cids.MonomorphicReceiverCid());
     return;
   }
-
-  SetCid(check->value()->definition(), check->cids().MonomorphicReceiverCid());
+  // Take the union of polymorphic cids.
+  CompileType result = CompileType::None();
+  for (intptr_t i = 0, n = cids.length(); i < n; i++) {
+    CidRange* cid_range = cids.At(i);
+    if (cid_range->IsIllegalRange()) {
+      return;
+    }
+    for (intptr_t cid = cid_range->cid_start; cid <= cid_range->cid_end;
+         cid++) {
+      CompileType tp = CompileType::FromCid(cid);
+      result.Union(&tp);
+    }
+  }
+  if (!result.IsNone()) {
+    SetTypeOf(check->value()->definition(), new (zone()) CompileType(result));
+  }
 }
 
 void FlowGraphTypePropagator::VisitCheckClassId(CheckClassIdInstr* check) {
@@ -330,14 +347,14 @@
       (current->is_nullable() && !guard->field().is_nullable())) {
     const bool is_nullable =
         guard->field().is_nullable() && current->is_nullable();
-    SetTypeOf(def, new CompileType(is_nullable, cid, NULL));
+    SetTypeOf(def, new (zone()) CompileType(is_nullable, cid, NULL));
   }
 }
 
 void FlowGraphTypePropagator::VisitAssertAssignable(
     AssertAssignableInstr* instr) {
   SetTypeOf(instr->value()->definition(),
-            new CompileType(instr->ComputeType()));
+            new (zone()) CompileType(instr->ComputeType()));
 }
 
 void FlowGraphTypePropagator::VisitAssertSubtype(AssertSubtypeInstr* instr) {}
@@ -519,23 +536,38 @@
     return;
   }
 
+  const AbstractType* abstract_type = ToAbstractType();
   if (ToNullableCid() != other->ToNullableCid()) {
     ASSERT(cid_ != kNullCid);
     cid_ = kDynamicCid;
   }
 
-  const AbstractType* abstract_type = ToAbstractType();
   const AbstractType* other_abstract_type = other->ToAbstractType();
   if (abstract_type->IsMoreSpecificThan(*other_abstract_type, NULL, NULL,
                                         Heap::kOld)) {
     type_ = other_abstract_type;
+    return;
   } else if (other_abstract_type->IsMoreSpecificThan(*abstract_type, NULL, NULL,
                                                      Heap::kOld)) {
-    // Nothing to do.
-  } else {
-    // Can't unify.
-    type_ = &Object::dynamic_type();
+    return;  // Nothing to do.
   }
+
+  // Climb up the hierarchy to find a suitable supertype. Note that interface
+  // types are not considered, making the union potentially non-commutative
+  if (abstract_type->IsInstantiated() && !abstract_type->IsDynamicType()) {
+    Class& cls = Class::Handle(abstract_type->type_class());
+    for (; !cls.IsNull() && !cls.IsGeneric(); cls = cls.SuperClass()) {
+      type_ = &AbstractType::ZoneHandle(cls.RareType());
+      if (other_abstract_type->IsSubtypeOf(*type_, NULL, NULL, Heap::kOld)) {
+        // Found suitable supertype: keep type_ only.
+        cid_ = kDynamicCid;
+        return;
+      }
+    }
+  }
+
+  // Can't unify.
+  type_ = &Object::dynamic_type();
 }
 
 CompileType* CompileType::ComputeRefinedType(CompileType* old_type,
@@ -666,7 +698,8 @@
       CHA* cha = thread->cha();
       // Don't infer a cid from an abstract type since there can be multiple
       // compatible classes with different cids.
-      if (!CHA::IsImplemented(type_class) && !CHA::HasSubclasses(type_class)) {
+      if (!type_class.is_abstract() && !CHA::IsImplemented(type_class) &&
+          !CHA::HasSubclasses(type_class)) {
         if (type_class.IsPrivate()) {
           // Type of a private class cannot change through later loaded libs.
           cid_ = type_class.id();
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index f0f4fd4..aff0b3a 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -960,7 +960,6 @@
 
   if (I->use_field_guards()) {
     if (field.guarded_cid() != kDynamicCid) {
-      ASSERT(I->use_field_guards());
       InsertBefore(instr,
                    new (Z)
                        GuardFieldClassInstr(new (Z) Value(instr->ArgumentAt(1)),
@@ -969,13 +968,20 @@
     }
 
     if (field.needs_length_check()) {
-      ASSERT(I->use_field_guards());
       InsertBefore(
           instr,
           new (Z) GuardFieldLengthInstr(new (Z) Value(instr->ArgumentAt(1)),
                                         field, instr->deopt_id()),
           instr->env(), FlowGraph::kEffect);
     }
+
+    if (field.static_type_exactness_state().NeedsFieldGuard()) {
+      InsertBefore(instr,
+                   new (Z)
+                       GuardFieldTypeInstr(new (Z) Value(instr->ArgumentAt(1)),
+                                           field, instr->deopt_id()),
+                   instr->env(), FlowGraph::kEffect);
+    }
   }
 
   // Build an AssertAssignable if necessary.
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index dc2c77b..b81e5c6 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -219,6 +219,9 @@
   INVOKE_PASS(SetOuterInliningId);
   INVOKE_PASS(TypePropagation);
   INVOKE_PASS(ApplyClassIds);
+  if (mode == kJIT) {
+    INVOKE_PASS(MarkCallsOnReceiverUnchecked);
+  }
   INVOKE_PASS(Inlining);
   INVOKE_PASS(TypePropagation);
   INVOKE_PASS(ApplyClassIds);
@@ -431,6 +434,48 @@
 COMPILER_PASS(WriteBarrierElimination,
               { WriteBarrierElimination(flow_graph); });
 
+void MarkCallsOnReceiverUnchecked(FlowGraph* flow_graph) {
+  if (flow_graph->function().is_static() ||
+      !flow_graph->function().IsDynamicFunction() ||
+      flow_graph->function().kind() ==
+          RawFunction::kDynamicInvocationForwarder) {
+    return;
+  }
+  for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
+       !block_it.Done(); block_it.Advance()) {
+    BlockEntryInstr* block = block_it.Current();
+    for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
+      Instruction* current = it.Current();
+      if (StaticCallInstr* instr = current->AsStaticCall()) {
+        if (instr->FirstArgIndex() < instr->ArgumentCount()) {
+          Value* receiver = instr->Receiver();
+          if (flow_graph->IsReceiver(receiver->definition())) {
+            auto& target = instr->function();
+            ASSERT(target.kind() != RawFunction::kDynamicInvocationForwarder);
+            if (!target.is_static() && target.IsDynamicFunction()) {
+              instr->set_entry_kind(Code::EntryKind::kUnchecked);
+            }
+          }
+        }
+      } else if (InstanceCallInstr* instr = current->AsInstanceCall()) {
+        Value* receiver = instr->Receiver();
+        if (flow_graph->IsReceiver(receiver->definition())) {
+          instr->set_entry_kind(Code::EntryKind::kUnchecked);
+        }
+      } else if (PolymorphicInstanceCallInstr* instr =
+                     current->AsPolymorphicInstanceCall()) {
+        Value* receiver = instr->Receiver();
+        if (flow_graph->IsReceiver(receiver->definition())) {
+          instr->instance_call()->set_entry_kind(Code::EntryKind::kUnchecked);
+        }
+      }
+    }
+  }
+}
+
+COMPILER_PASS(MarkCallsOnReceiverUnchecked,
+              { MarkCallsOnReceiverUnchecked(flow_graph); });
+
 COMPILER_PASS(FinalizeGraph, {
   // Compute and store graph informations (call & instruction counts)
   // to be later used by the inliner.
diff --git a/runtime/vm/compiler/compiler_pass.h b/runtime/vm/compiler/compiler_pass.h
index 92c2bfc..e9301be 100644
--- a/runtime/vm/compiler/compiler_pass.h
+++ b/runtime/vm/compiler/compiler_pass.h
@@ -43,7 +43,8 @@
   V(TryOptimizePatterns)                                                       \
   V(TypePropagation)                                                           \
   V(WidenSmiToInt32)                                                           \
-  V(WriteBarrierElimination)
+  V(WriteBarrierElimination)                                                   \
+  V(MarkCallsOnReceiverUnchecked)
 
 class AllocationSinking;
 class BlockScheduler;
@@ -169,6 +170,8 @@
   intptr_t flags_;
 };
 
+void MarkCallsOnReceiverUnchecked(FlowGraph* flow_graph);
+
 }  // namespace dart
 
 #endif
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index d8f9e1a..30432db 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -411,6 +411,14 @@
     instructions += GuardFieldClass(field_clone, GetNextDeoptId());
     instructions += LoadLocal(store_expression);
     instructions += GuardFieldLength(field_clone, GetNextDeoptId());
+
+    // If we are tracking exactness of the static type of the field then
+    // emit appropriate guard.
+    if (field_clone.static_type_exactness_state().IsTracking()) {
+      instructions += LoadLocal(store_expression);
+      instructions <<=
+          new (Z) GuardFieldTypeInstr(Pop(), field_clone, GetNextDeoptId());
+    }
   }
   instructions += StoreInstanceField(field_clone, is_initialization_store);
   return instructions;
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 32b3d24..c1418a7 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -35,8 +35,10 @@
   Fragment(Instruction* entry, Instruction* current)
       : entry(entry), current(current) {}
 
-  bool is_open() { return entry == nullptr || current != nullptr; }
-  bool is_closed() { return !is_open(); }
+  bool is_open() const { return entry == nullptr || current != nullptr; }
+  bool is_closed() const { return !is_open(); }
+
+  bool is_empty() const { return entry == nullptr && current == nullptr; }
 
   void Prepend(Instruction* start);
 
@@ -112,7 +114,8 @@
       const ParsedFunction* parsed_function,
       intptr_t last_used_block_id,
       ZoneGrowableArray<intptr_t>* context_level_array = nullptr,
-      InlineExitCollector* exit_collector = nullptr)
+      InlineExitCollector* exit_collector = nullptr,
+      bool inlining_unchecked_entry = false)
       : parsed_function_(parsed_function),
         function_(parsed_function_->function()),
         thread_(Thread::Current()),
@@ -125,7 +128,8 @@
         stack_(NULL),
         pending_argument_count_(0),
         loop_depth_(0),
-        exit_collector_(exit_collector) {}
+        exit_collector_(exit_collector),
+        inlining_unchecked_entry_(inlining_unchecked_entry) {}
 
   Fragment LoadField(intptr_t offset, intptr_t class_id = kDynamicCid);
   Fragment LoadNativeField(const NativeFieldDesc* native_field);
@@ -253,6 +257,10 @@
   Fragment InstantiateType(const AbstractType& type);
   Fragment InstantiateTypeArguments(const TypeArguments& type_arguments);
 
+  // Returns true if we are building a graph for inlining of a call site that
+  // enters the function through the unchecked entry.
+  bool InliningUncheckedEntry() const { return inlining_unchecked_entry_; }
+
  protected:
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
   intptr_t CurrentTryIndex();
@@ -276,6 +284,8 @@
   intptr_t loop_depth_;
   InlineExitCollector* exit_collector_;
 
+  const bool inlining_unchecked_entry_;
+
   friend class TryCatchBlock;
   friend class StreamingFlowGraphBuilder;
 
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 1f6e9e6..d92b3df 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -316,6 +316,7 @@
           elem = pool.ObjectAt(elem_index);
           array.SetAt(j, elem);
         }
+        array.MakeImmutable();
         obj = H.Canonicalize(Array::Cast(array));
         ASSERT(!obj.IsNull());
       } break;
diff --git a/runtime/vm/compiler/frontend/entrypoitns_pragma.md b/runtime/vm/compiler/frontend/entrypoitns_pragma.md
new file mode 100644
index 0000000..3fcb451
--- /dev/null
+++ b/runtime/vm/compiler/frontend/entrypoitns_pragma.md
@@ -0,0 +1,28 @@
+# Pragma for testing multiple entrypoints
+
+Example:
+
+```dart
+void hook(String functionName, int entryPointId) {
+  // ...
+}
+
+class C<T> {
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", hook)
+  void foo(T x) {
+    // ...
+  }
+}
+```
+
+When `foo` is invoked, `hook` will be called in `foo`'s prologue if `foo` was
+compiled with multiple entrypoints. `hook` will be passed the name of the
+function it was called for and the ID of the entrypoint used for the invocation:
+
+- 0: Normal entry.
+
+- 1: Unchecked entry: prologue was short so separate prologues for normal and
+  unchecked entry were compiled.
+
+- 2: Unchecked shared entry: prologue was long, so normal and unchecked entry
+  set a temporary and type-checks are predicated on the temporary.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 35b4faf..b7124b2 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -459,6 +459,15 @@
   return Fragment();
 }
 
+void StreamingFlowGraphBuilder::RecordUncheckedEntryPoint(
+    TargetEntryInstr* extra_entry) {
+  if (!B->IsInlining()) {
+    B->graph_entry_->set_unchecked_entry(extra_entry);
+  } else if (B->InliningUncheckedEntry()) {
+    B->graph_entry_->set_normal_entry(extra_entry);
+  }
+}
+
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
     const Function& function) {
   const Function& parent = Function::ZoneHandle(Z, function.parent_function());
@@ -491,29 +500,26 @@
   flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr(
       *parsed_function(), normal_entry, Compiler::kNoOSRDeoptId);
 
-  Fragment body(instruction_cursor);
-  body +=
+  const Fragment prologue =
       flow_graph_builder_->CheckStackOverflowInPrologue(function.token_pos());
 
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
 
-  body += BuildDefaultTypeHandling(function, ReaderOffset());
+  const Fragment default_type_handling =
+      BuildDefaultTypeHandling(function, ReaderOffset());
 
-  intptr_t type_args_len = 0;
-  if (I->reify_generic_functions() && function.IsGeneric()) {
-    type_args_len = function.NumTypeParameters();
-    ASSERT(parsed_function()->function_type_arguments() != NULL);
-    body += LoadLocal(parsed_function()->function_type_arguments());
-    body += PushArgument();
-  }
-
-  if (I->argument_type_checks()) {
-    if (!target.NeedsArgumentTypeChecks(I)) {
+  // We're going to throw away the explicit checks because the target will
+  // always check them.
+  Fragment implicit_checks;
+  if (function.NeedsArgumentTypeChecks(I)) {
+    Fragment explicit_checks_unused;
+    if (target.is_static()) {
       // Tearoffs of static methods needs to perform arguments checks since
       // static methods they forward to don't do it themselves.
       AlternativeReadingScope _(&reader_);
-      body += BuildArgumentTypeChecks(kCheckAllTypeParameterBounds);
+      BuildArgumentTypeChecks(kCheckAllTypeParameterBounds,
+                              &explicit_checks_unused, &implicit_checks);
     } else {
       // Check if parent function was annotated with no-dynamic-invocations.
       const ProcedureAttributesMetadata attrs =
@@ -523,19 +529,32 @@
         // If it was then we might need to build some checks in the
         // tear-off.
         AlternativeReadingScope _(&reader_);
-        body += BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds);
+        BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds,
+                                &explicit_checks_unused, &implicit_checks);
       }
     }
   }
 
+  Fragment body;
+
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
 
+  intptr_t type_args_len = 0;
+  if (I->reify_generic_functions() && function.IsGeneric()) {
+    type_args_len = function.NumTypeParameters();
+    ASSERT(parsed_function()->function_type_arguments() != NULL);
+    body += LoadLocal(parsed_function()->function_type_arguments());
+    body += PushArgument();
+  }
+
   // Load all the arguments.
   if (!target.is_static()) {
     // The context has a fixed shape: a single variable which is the
     // closed-over receiver.
-    body += LoadLocal(parsed_function()->current_context_var());
+    body +=
+        LoadLocal(parsed_function()->node_sequence()->scope()->VariableAt(0));
+    body += LoadField(Closure::context_offset());
     body += flow_graph_builder_->LoadField(Context::variable_offset(0));
     body += PushArgument();
   }
@@ -579,6 +598,41 @@
   // Return the result.
   body += Return(function_node_helper.end_position_);
 
+  // Setup multiple entrypoints if useful.
+  TargetEntryInstr* extra_entry = nullptr;
+  if (function.MayHaveUncheckedEntryPoint(I)) {
+    // The prologue for a closure will always have context handling (e.g.
+    // setting up the 'this_variable'), but we don't need it on the unchecked
+    // entry because the only time we reference this is for loading the
+    // receiver, which we fetch directly from the context.
+    if (PrologueBuilder::PrologueSkippableOnUncheckedEntry(function)) {
+      // Use separate entry points since we can skip almost everything on the
+      // static entry.
+      extra_entry = BuildSeparateUncheckedEntryPoint(
+          /*normal_entry=*/instruction_cursor,
+          /*normal_prologue=*/prologue + default_type_handling +
+              implicit_checks,
+          /*extra_prologue=*/
+          B->CheckStackOverflowInPrologue(function.token_pos()),
+          /*shared_prologue=*/Fragment(),
+          /*body=*/body);
+    } else {
+      Fragment shared_prologue(normal_entry, instruction_cursor);
+      shared_prologue += prologue;
+      extra_entry = BuildSharedUncheckedEntryPoint(
+          /*shared_prologue_linked_in=*/shared_prologue,
+          /*skippable_checks=*/default_type_handling + implicit_checks,
+          /*body=*/body);
+    }
+    RecordUncheckedEntryPoint(extra_entry);
+  } else {
+    Fragment function(instruction_cursor);
+    function += prologue;
+    function += default_type_handling;
+    function += implicit_checks;
+    function += body;
+  }
+
   return new (Z)
       FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_,
                 flow_graph_builder_->last_used_block_id_, prologue_info);
@@ -614,13 +668,15 @@
       body += LoadField(ArgumentsDescriptor::count_offset());
       body += LoadLocal(parsed_function()->current_context_var());
       body += B->LoadField(Context::variable_offset(0));
-      body += B->StoreFpRelativeSlot(kWordSize * kParamEndSlotFromFp);
+      body += B->StoreFpRelativeSlot(kWordSize *
+                                     compiler_frame_layout.param_end_from_fp);
       body += Drop();
     } else {
       body += LoadLocal(parsed_function()->current_context_var());
       body += B->LoadField(Context::variable_offset(0));
       body += B->StoreFpRelativeSlot(
-          kWordSize * (kParamEndSlotFromFp + function.NumParameters()));
+          kWordSize *
+          (compiler_frame_layout.param_end_from_fp + function.NumParameters()));
       body += Drop();
     }
   }
@@ -630,7 +686,7 @@
 
   if (function.NeedsArgumentTypeChecks(I)) {
     AlternativeReadingScope _(&reader_);
-    body += BuildArgumentTypeChecks(kCheckAllTypeParameterBounds);
+    BuildArgumentTypeChecks(kCheckAllTypeParameterBounds, &body, &body);
   }
 
   function_node_helper.ReadUntilExcluding(
@@ -675,7 +731,7 @@
   //
   // for (; i < argument_count; ++i) {
   //   arguments[i] = LoadFpRelativeSlot(
-  //       kWordSize * (kParamEndSlotFromFp + argument_count - i));
+  //       kWordSize * (frame_layout.param_end_from_fp + argument_count - i));
   // }
   body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null()));
   body += LoadLocal(argument_count);
@@ -719,13 +775,14 @@
     Fragment loop_body(body_entry);
 
     // arguments[i] = LoadFpRelativeSlot(
-    //     kWordSize * (kParamEndSlotFromFp + argument_count - i));
+    //     kWordSize * (frame_layout.param_end_from_fp + argument_count - i));
     loop_body += LoadLocal(arguments);
     loop_body += LoadLocal(index);
     loop_body += LoadLocal(argument_count);
     loop_body += LoadLocal(index);
     loop_body += B->SmiBinaryOp(Token::kSUB, /*truncate=*/true);
-    loop_body += B->LoadFpRelativeSlot(kWordSize * kParamEndSlotFromFp);
+    loop_body += B->LoadFpRelativeSlot(kWordSize *
+                                       compiler_frame_layout.param_end_from_fp);
     loop_body += StoreIndexed(kArrayCid);
     loop_body += Drop();
 
@@ -876,18 +933,16 @@
                            B->last_used_block_id_, prologue_info);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
-    TypeChecksToBuild mode) {
-  if (FLAG_omit_strong_type_checks) {
-    return Fragment();
-  }
+void StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
+    TypeChecksToBuild mode,
+    Fragment* explicit_checks,
+    Fragment* implicit_checks) {
+  if (FLAG_omit_strong_type_checks) return;
 
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
   const Function& dart_function = parsed_function()->function();
 
-  Fragment body;
-
   const Function* forwarding_target = NULL;
   if (parsed_function()->is_forwarding_stub()) {
     NameIndex target_name = parsed_function()->forwarding_stub_super_target();
@@ -954,7 +1009,7 @@
       param ^= TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
     }
     ASSERT(param.IsFinalized());
-    body += CheckTypeArgumentBound(param, bound, name);
+    *implicit_checks += CheckTypeArgumentBound(param, bound, name);
   }
 
   function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
@@ -967,7 +1022,8 @@
   for (intptr_t i = 0; i < num_positional_params; ++i) {
     // ith variable offset.
     const intptr_t offset = ReaderOffset();
-    SkipVariableDeclaration();
+    VariableDeclarationHelper helper(this);
+    helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
 
     LocalVariable* param = LookupVariable(offset + data_program_offset_);
     if (!param->needs_type_check()) {
@@ -980,9 +1036,14 @@
       target_type = &AbstractType::ZoneHandle(
           Z, forwarding_target->ParameterTypeAt(kFirstParameterOffset + i));
     }
-    body += LoadLocal(param);
-    body += CheckArgumentType(param, *target_type);
-    body += Drop();
+
+    if (target_type->IsTopType()) continue;
+
+    Fragment* checks = helper.IsCovariant() ? explicit_checks : implicit_checks;
+
+    *checks += LoadLocal(param);
+    *checks += CheckArgumentType(param, *target_type);
+    *checks += Drop();
   }
 
   // Named.
@@ -990,7 +1051,8 @@
   for (intptr_t i = 0; i < num_named_params; ++i) {
     // ith variable offset.
     const intptr_t offset = ReaderOffset();
-    SkipVariableDeclaration();
+    VariableDeclarationHelper helper(this);
+    helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
 
     LocalVariable* param = LookupVariable(offset + data_program_offset_);
     if (!param->needs_type_check()) {
@@ -1003,12 +1065,15 @@
       target_type = &AbstractType::ZoneHandle(
           Z, forwarding_target->ParameterTypeAt(num_positional_params + i + 1));
     }
-    body += LoadLocal(param);
-    body += CheckArgumentType(param, *target_type);
-    body += Drop();
-  }
 
-  return body;
+    if (target_type->IsTopType()) continue;
+
+    Fragment* checks = helper.IsCovariant() ? explicit_checks : implicit_checks;
+
+    *checks += LoadLocal(param);
+    *checks += CheckArgumentType(param, *target_type);
+    *checks += Drop();
+  }
 }
 
 Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) {
@@ -1129,7 +1194,8 @@
   {
     AlternativeReadingScope alt(&reader_);
     SetOffset(type_parameters_offset);
-    body += BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds);
+    BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds, &body,
+                            &body);
   }
 
   // Push all arguments and invoke the original method.
@@ -1163,9 +1229,8 @@
     graph_entry->RelinkToOsrEntry(Z,
                                   flow_graph_builder_->last_used_block_id_ + 1);
   }
-  return new (Z)
-      FlowGraph(*parsed_function(), graph_entry,
-                flow_graph_builder_->last_used_block_id_, prologue_info);
+  return new (Z) FlowGraph(*parsed_function(), graph_entry,
+                           B->last_used_block_id_, prologue_info);
 }
 
 Fragment StreamingFlowGraphBuilder::DebugStepCheckInPrologue(
@@ -1399,10 +1464,16 @@
 
 // If we run in checked mode or strong mode, we have to check the type of the
 // passed arguments.
-Fragment StreamingFlowGraphBuilder::CheckArgumentTypesAsNecessary(
+//
+// TODO(#34162): If we're building an extra entry-point to skip
+// type checks, we should substitute Redefinition nodes for the AssertAssignable
+// instructions to ensure that the argument types are known.
+void StreamingFlowGraphBuilder::CheckArgumentTypesAsNecessary(
     const Function& dart_function,
-    intptr_t type_parameters_offset) {
-  if (!dart_function.NeedsArgumentTypeChecks(I)) return {};
+    intptr_t type_parameters_offset,
+    Fragment* explicit_checks,
+    Fragment* implicit_checks) {
+  if (!dart_function.NeedsArgumentTypeChecks(I)) return;
 
   // Check if parent function was annotated with no-dynamic-invocations.
   const ProcedureAttributesMetadata attrs =
@@ -1411,10 +1482,11 @@
 
   AlternativeReadingScope _(&reader_);
   SetOffset(type_parameters_offset);
-  return BuildArgumentTypeChecks(
+  BuildArgumentTypeChecks(
       MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
           ? kCheckCovariantTypeParameterBounds
-          : kCheckAllTypeParameterBounds);
+          : kCheckAllTypeParameterBounds,
+      explicit_checks, implicit_checks);
 }
 
 Fragment StreamingFlowGraphBuilder::ShortcutForUserDefinedEquals(
@@ -1495,6 +1567,9 @@
   F += CheckStackOverflowInPrologue(dart_function);
   F += DebugStepCheckInPrologue(dart_function, token_position);
   F += SetAsyncStackTrace(dart_function);
+  // TODO(#34162): We can remove the default type handling (and
+  // shorten the prologue type handling sequence) for non-dynamic invocations of
+  // regular methods.
   F += TypeArgumentsHandling(dart_function, type_parameters_offset);
   return F;
 }
@@ -1506,11 +1581,164 @@
   Fragment F;
   F += SetupCapturedParameters(dart_function);
   F += ShortcutForUserDefinedEquals(dart_function, first_parameter);
-  F += CheckArgumentTypesAsNecessary(dart_function, type_parameters_offset);
   return F;
 }
 
-FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) {
+// Pop the index of the current entry-point off the stack. If there is any
+// entrypoint-tracing hook registered in a pragma for the function, it is called
+// with the name of the current function and the current entry-point index.
+Fragment StreamingFlowGraphBuilder::BuildEntryPointsIntrospection() {
+  if (!FLAG_enable_testing_pragmas) return Drop();
+
+  Function& function = Function::Handle(parsed_function()->function().raw());
+
+  if (function.IsImplicitClosureFunction()) {
+    const Function& parent =
+        Function::ZoneHandle(Z, function.parent_function());
+    const String& func_name = String::ZoneHandle(Z, parent.name());
+    const Class& owner = Class::ZoneHandle(Z, parent.Owner());
+    function = owner.LookupFunction(func_name);
+  }
+
+  Object& options = Object::Handle();
+  if (!function.FindPragma(I, Symbols::vm_trace_entrypoints(), &options) ||
+      options.IsNull() || !options.IsClosure()) {
+    return Drop();
+  }
+  Closure& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
+  LocalVariable* entry_point_num = MakeTemporary();
+
+  String& function_name = String::ZoneHandle(
+      Z, String::New(function.ToLibNamePrefixedQualifiedCString(), Heap::kOld));
+  if (parsed_function()->function().IsImplicitClosureFunction()) {
+    function_name = String::Concat(
+        function_name, String::Handle(Z, String::New("#tearoff", Heap::kNew)),
+        Heap::kOld);
+  }
+
+  Fragment call_hook;
+  call_hook += Constant(closure);
+  call_hook += PushArgument();
+  call_hook += Constant(function_name);
+  call_hook += PushArgument();
+  call_hook += LoadLocal(entry_point_num);
+  call_hook += PushArgument();
+  call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
+  call_hook += B->ClosureCall(/*type_args_len=*/0, /*argument_count=*/3,
+                              /*argument_names=*/Array::Handle());
+  call_hook += Drop();  // result of closure call
+  call_hook += Drop();  // entrypoint number
+  return call_hook;
+}
+
+TargetEntryInstr* StreamingFlowGraphBuilder::BuildSharedUncheckedEntryPoint(
+    Fragment shared_prologue_linked_in,
+    Fragment skippable_checks,
+    Fragment body) {
+  ASSERT(shared_prologue_linked_in.entry == B->graph_entry_->normal_entry());
+  ASSERT(parsed_function()->has_entry_points_temp_var());
+  Instruction* prologue_start = shared_prologue_linked_in.entry->next();
+
+  auto* join_entry = B->BuildJoinEntry();
+
+  Fragment normal_entry(shared_prologue_linked_in.entry);
+  normal_entry += IntConstant(UncheckedEntryPointStyle::kNone);
+  normal_entry += StoreLocal(TokenPosition::kNoSource,
+                             parsed_function()->entry_points_temp_var());
+  normal_entry += Drop();
+  normal_entry += Goto(join_entry);
+
+  auto* extra_target_entry = B->BuildTargetEntry();
+  Fragment extra_entry(extra_target_entry);
+  extra_entry += IntConstant(UncheckedEntryPointStyle::kSharedWithVariable);
+  extra_entry += StoreLocal(TokenPosition::kNoSource,
+                            parsed_function()->entry_points_temp_var());
+  extra_entry += Drop();
+  extra_entry += Goto(join_entry);
+
+  join_entry->LinkTo(prologue_start);
+
+  TargetEntryInstr *do_checks, *skip_checks;
+  shared_prologue_linked_in +=
+      LoadLocal(parsed_function()->entry_points_temp_var());
+  shared_prologue_linked_in += BuildEntryPointsIntrospection();
+  shared_prologue_linked_in +=
+      LoadLocal(parsed_function()->entry_points_temp_var());
+  shared_prologue_linked_in +=
+      IntConstant(UncheckedEntryPointStyle::kSharedWithVariable);
+  shared_prologue_linked_in +=
+      BranchIfEqual(&skip_checks, &do_checks, /*negate=*/false);
+
+  JoinEntryInstr* rest_entry = B->BuildJoinEntry();
+
+  Fragment(do_checks) + skippable_checks + Goto(rest_entry);
+  Fragment(skip_checks) + Goto(rest_entry);
+  Fragment(rest_entry) + body;
+
+  return extra_target_entry;
+}
+
+TargetEntryInstr* StreamingFlowGraphBuilder::BuildSeparateUncheckedEntryPoint(
+    BlockEntryInstr* normal_entry,
+    Fragment normal_prologue,
+    Fragment extra_prologue,
+    Fragment shared_prologue,
+    Fragment body) {
+  auto* join_entry = BuildJoinEntry();
+  auto* extra_entry = B->BuildTargetEntry();
+
+  Fragment normal(normal_entry);
+  normal += IntConstant(UncheckedEntryPointStyle::kNone);
+  normal += BuildEntryPointsIntrospection();
+  normal += normal_prologue;
+  normal += Goto(join_entry);
+
+  Fragment extra(extra_entry);
+  extra += IntConstant(UncheckedEntryPointStyle::kSeparate);
+  extra += BuildEntryPointsIntrospection();
+  extra += extra_prologue;
+  extra += Goto(join_entry);
+
+  Fragment(join_entry) + shared_prologue + body;
+  return extra_entry;
+}
+
+StreamingFlowGraphBuilder::UncheckedEntryPointStyle
+StreamingFlowGraphBuilder::ChooseEntryPointStyle(
+    const Function& dart_function,
+    const Fragment& implicit_type_checks,
+    const Fragment& first_time_prologue,
+    const Fragment& every_time_prologue) {
+  ASSERT(!dart_function.IsImplicitClosureFunction());
+  if (!dart_function.MayHaveUncheckedEntryPoint(I) ||
+      implicit_type_checks.is_empty()) {
+    return UncheckedEntryPointStyle::kNone;
+  }
+
+  // Record which entry-point was taken into a variable and test it later if
+  // either:
+  //
+  // 1. There is a non-empty PrologueBuilder-prologue.
+  //
+  // 2. There is a non-empty "first-time" prologue.
+  //
+  // 3. The "every-time" prologue has more than two instructions (DebugStepCheck
+  //    and CheckStackOverflow).
+  //
+  // TODO(#34162): For regular closures we can often avoid the
+  // PrologueBuilder-prologue on non-dynamic invocations.
+  if (!PrologueBuilder::HasEmptyPrologue(dart_function) ||
+      !first_time_prologue.is_empty() ||
+      !(every_time_prologue.entry == every_time_prologue.current ||
+        every_time_prologue.current->previous() == every_time_prologue.entry)) {
+    return UncheckedEntryPointStyle::kSharedWithVariable;
+  }
+
+  return UncheckedEntryPointStyle::kSeparate;
+}
+
+FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(
+    bool is_constructor) {
   // The prologue builder needs the default parameter values.
   SetupDefaultParameterValues();
 
@@ -1553,18 +1781,67 @@
   const Fragment first_time_prologue = BuildFirstTimePrologue(
       dart_function, first_parameter, type_parameters_offset);
 
+  Fragment explicit_type_checks;
+  Fragment implicit_type_checks;
+  CheckArgumentTypesAsNecessary(dart_function, type_parameters_offset,
+                                &explicit_type_checks, &implicit_type_checks);
+
   const Fragment body =
-      BuildFunctionBody(dart_function, first_parameter, constructor);
+      BuildFunctionBody(dart_function, first_parameter, is_constructor);
 
-  // If the function's body contains any yield points, build switch statement
-  // that selects a continuation point based on the value of :await_jump_var.
-  const Fragment function =
-      yield_continuations().is_empty()
-          ? every_time_prologue + first_time_prologue + body
-          : every_time_prologue +
-                CompleteBodyWithYieldContinuations(first_time_prologue + body);
+  auto extra_entry_point_style =
+      ChooseEntryPointStyle(dart_function, implicit_type_checks,
+                            first_time_prologue, every_time_prologue);
 
-  instruction_cursor->LinkTo(function.entry);
+  Fragment function(instruction_cursor);
+  if (yield_continuations().is_empty()) {
+    TargetEntryInstr* extra_entry = nullptr;
+    switch (extra_entry_point_style) {
+      case UncheckedEntryPointStyle::kNone: {
+        function += every_time_prologue + first_time_prologue +
+                    implicit_type_checks + explicit_type_checks + body;
+        break;
+      }
+      case UncheckedEntryPointStyle::kSeparate: {
+        ASSERT(instruction_cursor == normal_entry);
+        ASSERT(first_time_prologue.is_empty());
+
+        const Fragment prologue_copy = BuildEveryTimePrologue(
+            dart_function, token_position, type_parameters_offset);
+
+        extra_entry = BuildSeparateUncheckedEntryPoint(
+            normal_entry,
+            /*normal_prologue=*/every_time_prologue + implicit_type_checks,
+            /*extra_prologue=*/prologue_copy,
+            /*shared_prologue=*/explicit_type_checks,
+            /*body=*/body);
+        break;
+      }
+      case UncheckedEntryPointStyle::kSharedWithVariable: {
+        Fragment prologue(normal_entry, instruction_cursor);
+        prologue += every_time_prologue;
+        prologue += first_time_prologue;
+        prologue += explicit_type_checks;
+        extra_entry = BuildSharedUncheckedEntryPoint(
+            /*shared_prologue_linked_in=*/prologue,
+            /*skippable_checks=*/implicit_type_checks,
+            /*body=*/body);
+        break;
+      }
+    }
+    if (extra_entry != nullptr) {
+      RecordUncheckedEntryPoint(extra_entry);
+    }
+  } else {
+    // If the function's body contains any yield points, build switch statement
+    // that selects a continuation point based on the value of :await_jump_var.
+    ASSERT(explicit_type_checks.is_empty());
+    // TODO(#34162): We can probably ignore the implicit checks
+    // here as well since the arguments are passed from generated code.
+    function += every_time_prologue +
+                CompleteBodyWithYieldContinuations(first_time_prologue +
+                                                   implicit_type_checks + body);
+  }
 
   // When compiling for OSR, use a depth first search to find the OSR
   // entry and make graph entry jump to it instead of normal entry.
@@ -3592,9 +3869,16 @@
   Fragment instructions;
   LocalVariable* instance_variable = NULL;
 
-  bool special_case_identical = klass.IsTopLevel() &&
-                                (klass.library() == Library::CoreLibrary()) &&
-                                (target.name() == Symbols::Identical().raw());
+  const bool special_case_unchecked_cast =
+      klass.IsTopLevel() && (klass.library() == Library::InternalLibrary()) &&
+      (target.name() == Symbols::UnsafeCast().raw());
+
+  const bool special_case_identical =
+      klass.IsTopLevel() && (klass.library() == Library::CoreLibrary()) &&
+      (target.name() == Symbols::Identical().raw());
+
+  const bool special_case =
+      special_case_identical || special_case_unchecked_cast;
 
   // If we cross the Kernel -> VM core library boundary, a [StaticInvocation]
   // can appear, but the thing we're calling is not a static method, but a
@@ -3630,7 +3914,7 @@
     const TypeArguments& type_arguments = PeekArgumentsInstantiatedType(klass);
     instructions += TranslateInstantiatedTypeArguments(type_arguments);
     instructions += PushArgument();
-  } else if (!special_case_identical && I->reify_generic_functions()) {
+  } else if (!special_case && I->reify_generic_functions()) {
     AlternativeReadingScope alt(&reader_);
     ReadUInt();                               // read argument count.
     intptr_t list_length = ReadListLength();  // read types list length.
@@ -3646,7 +3930,7 @@
   Array& argument_names = Array::ZoneHandle(Z);
   instructions += BuildArguments(&argument_names, NULL /* arg count */,
                                  NULL /* positional arg count */,
-                                 special_case_identical);  // read arguments.
+                                 special_case);  // read arguments.
   ASSERT(target.AreValidArguments(type_args_len, argument_count, argument_names,
                                   NULL));
 
@@ -3656,6 +3940,8 @@
   if (special_case_identical) {
     ASSERT(argument_count == 2);
     instructions += StrictCompare(Token::kEQ_STRICT, /*number_check=*/true);
+  } else if (special_case_unchecked_cast) {
+    // Simply do nothing: the result value is already pushed on the stack.
   } else {
     instructions += StaticCall(position, target, argument_count, argument_names,
                                ICData::kStatic, &result_type, type_args_len);
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 50bc693..ebdf3a0 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -44,7 +44,8 @@
 #endif  // defined(DART_USE_INTERPRETER)
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this),
-        procedure_attributes_metadata_helper_(this) {
+        procedure_attributes_metadata_helper_(this),
+        call_site_attributes_metadata_helper_(this, &type_translator_) {
   }
 
   virtual ~StreamingFlowGraphBuilder() {}
@@ -74,6 +75,35 @@
   Fragment BuildExpression(TokenPosition* position = NULL);
   Fragment BuildStatement();
 
+  // Indicates which form of the unchecked entrypoint we are compiling.
+  //
+  // kNone:
+  //
+  //   There is no unchecked entrypoint: the unchecked entry is set to NULL in
+  //   the 'GraphEntryInstr'.
+  //
+  // kSeparate:
+  //
+  //   The normal and unchecked entrypoint each point to their own versions of
+  //   the prologue, containing exactly those checks which need to be performed
+  //   on either side. Both sides jump directly to the body after performing
+  //   their prologue.
+  //
+  // kSharedWithVariable:
+  //
+  //   A temporary variable is allocated and initialized to 0 on normal entry
+  //   and 2 on unchecked entry. Code which should be ommitted on the unchecked
+  //   entrypoint is made conditional on this variable being equal to 0.
+  //
+  struct UncheckedEntryPointStyle_ {
+    enum Style {
+      kNone = 0,
+      kSeparate = 1,
+      kSharedWithVariable = 2,
+    };
+  };
+  typedef UncheckedEntryPointStyle_::Style UncheckedEntryPointStyle;
+
   // Kernel offset:
   //   start of function expression -> end of function body statement
   Fragment BuildFunctionBody(const Function& dart_function,
@@ -96,9 +126,31 @@
                                         LocalVariable* first_parameter);
   Fragment TypeArgumentsHandling(const Function& dart_function,
                                  intptr_t type_parameters_offset);
-  Fragment CheckArgumentTypesAsNecessary(const Function& dart_function,
-                                         intptr_t type_parameters_offset);
+  void CheckArgumentTypesAsNecessary(const Function& dart_function,
+                                     intptr_t type_parameters_offset,
+                                     Fragment* explicit_checks,
+                                     Fragment* implicit_checks);
   Fragment CompleteBodyWithYieldContinuations(Fragment body);
+  TargetEntryInstr* BuildSeparateUncheckedEntryPoint(
+      BlockEntryInstr* normal_entry,
+      Fragment normal_prologue,
+      Fragment extra_prologue,
+      Fragment shared_prologue,
+      Fragment body);
+  TargetEntryInstr* BuildSharedUncheckedEntryPoint(
+      Fragment prologue_from_normal_entry,
+      Fragment skippable_checks,
+      Fragment body);
+
+  Fragment BuildEntryPointsIntrospection();
+
+  static UncheckedEntryPointStyle ChooseEntryPointStyle(
+      const Function& dart_function,
+      const Fragment& implicit_type_checks,
+      const Fragment& first_time_prologue,
+      const Fragment& every_time_prologue);
+
+  void RecordUncheckedEntryPoint(TargetEntryInstr* extra_entry);
 
   void loop_depth_inc();
   void loop_depth_dec();
@@ -201,7 +253,9 @@
   };
   Fragment PushAllArguments(PushedArguments* pushed);
 
-  Fragment BuildArgumentTypeChecks(TypeChecksToBuild mode);
+  void BuildArgumentTypeChecks(TypeChecksToBuild mode,
+                               Fragment* explicit_checks,
+                               Fragment* implicit_checks);
 
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
@@ -366,6 +420,7 @@
   DirectCallMetadataHelper direct_call_metadata_helper_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
+  CallSiteAttributesMetadataHelper call_site_attributes_metadata_helper_;
 
   friend class KernelLoader;
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index bda808c..769f2a9 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -35,11 +35,13 @@
     InlineExitCollector* exit_collector,
     bool optimizing,
     intptr_t osr_id,
-    intptr_t first_block_id)
+    intptr_t first_block_id,
+    bool inlining_unchecked_entry)
     : BaseFlowGraphBuilder(parsed_function,
                            first_block_id - 1,
                            context_level_array,
-                           exit_collector),
+                           exit_collector,
+                           inlining_unchecked_entry),
       translation_helper_(Thread::Current()),
       thread_(translation_helper_.thread()),
       zone_(translation_helper_.zone()),
@@ -447,13 +449,15 @@
   return Fragment(call);
 }
 
-Fragment FlowGraphBuilder::Return(TokenPosition position) {
+Fragment FlowGraphBuilder::Return(TokenPosition position,
+                                  bool omit_result_type_check /* = false */) {
   Fragment instructions;
   const Function& function = parsed_function_->function();
 
   // Emit a type check of the return type in checked mode for all functions
   // and in strong mode for native functions.
-  if (I->type_checks() || (function.is_native() && I->strong())) {
+  if (!omit_result_type_check &&
+      (I->type_checks() || (function.is_native() && I->strong()))) {
     const AbstractType& return_type =
         AbstractType::Handle(Z, function.result_type());
     instructions += CheckAssignable(return_type, Symbols::FunctionResult());
@@ -739,7 +743,8 @@
   // to build these graphs so that this code is not duplicated.
 
   Fragment body;
-  MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
+  const MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
+  bool omit_result_type_check = true;
   switch (kind) {
     case MethodRecognizer::kObjectEquals:
       body += LoadLocal(scopes_->this_variable);
@@ -917,10 +922,12 @@
         body += PushArgument();
       }
       body += NativeCall(&name, &function);
+      // We typecheck results of native calls for type safety.
+      omit_result_type_check = false;
       break;
     }
   }
-  return body + Return(TokenPosition::kNoSource);
+  return body + Return(TokenPosition::kNoSource, omit_result_type_check);
 }
 
 Fragment FlowGraphBuilder::BuildImplicitClosureCreation(
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index f4f84de..ee8efe8 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -50,7 +50,8 @@
                    InlineExitCollector* exit_collector,
                    bool optimizing,
                    intptr_t osr_id,
-                   intptr_t first_block_id = 1);
+                   intptr_t first_block_id = 1,
+                   bool inlining_unchecked_entry = false);
   virtual ~FlowGraphBuilder();
 
   FlowGraph* BuildGraph();
@@ -110,7 +111,7 @@
   Fragment LoadLocal(LocalVariable* variable);
   Fragment InitStaticField(const Field& field);
   Fragment NativeCall(const String* name, const Function* function);
-  Fragment Return(TokenPosition position);
+  Fragment Return(TokenPosition position, bool omit_result_type_check = false);
   Fragment CheckNull(TokenPosition position,
                      LocalVariable* receiver,
                      const String& function_name);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 02047bd..14a60fe 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1670,6 +1670,34 @@
   return metadata;
 }
 
+CallSiteAttributesMetadataHelper::CallSiteAttributesMetadataHelper(
+    KernelReaderHelper* helper,
+    TypeTranslator* type_translator)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ false),
+      type_translator_(*type_translator) {}
+
+bool CallSiteAttributesMetadataHelper::ReadMetadata(
+    intptr_t node_offset,
+    CallSiteAttributesMetadata* metadata) {
+  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    return false;
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+
+  metadata->receiver_type = &type_translator_.BuildType();
+  return true;
+}
+
+CallSiteAttributesMetadata
+CallSiteAttributesMetadataHelper::GetCallSiteAttributes(intptr_t node_offset) {
+  CallSiteAttributesMetadata metadata;
+  ReadMetadata(node_offset, &metadata);
+  return metadata;
+}
+
 intptr_t KernelReaderHelper::ReaderOffset() const {
   return reader_.offset();
 }
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index ea2f79b..cac95bc 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -16,6 +16,7 @@
 namespace kernel {
 
 class KernelReaderHelper;
+class TypeTranslator;
 
 class TranslationHelper {
  public:
@@ -900,6 +901,28 @@
   DISALLOW_COPY_AND_ASSIGN(ProcedureAttributesMetadataHelper);
 };
 
+struct CallSiteAttributesMetadata {
+  const AbstractType* receiver_type = nullptr;
+};
+
+// Helper class which provides access to direct call metadata.
+class CallSiteAttributesMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.call-site-attributes.metadata"; }
+
+  CallSiteAttributesMetadataHelper(KernelReaderHelper* helper,
+                                   TypeTranslator* type_translator);
+
+  CallSiteAttributesMetadata GetCallSiteAttributes(intptr_t node_offset);
+
+ private:
+  bool ReadMetadata(intptr_t node_offset, CallSiteAttributesMetadata* metadata);
+
+  TypeTranslator& type_translator_;
+
+  DISALLOW_COPY_AND_ASSIGN(CallSiteAttributesMetadataHelper);
+};
+
 class KernelReaderHelper {
  public:
   KernelReaderHelper(Zone* zone,
@@ -1019,6 +1042,7 @@
   intptr_t data_program_offset_;
 
   friend class ClassHelper;
+  friend class CallSiteAttributesMetadataHelper;
   friend class ConstantEvaluator;
   friend class ConstantHelper;
   friend class ConstructorHelper;
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index b4429c1..0ab2315 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -21,6 +21,17 @@
 
 #define Z (zone_)
 
+bool PrologueBuilder::PrologueSkippableOnUncheckedEntry(
+    const Function& function) {
+  return !function.HasOptionalParameters() &&
+         !function.IsNonImplicitClosureFunction() && !function.IsGeneric();
+}
+
+bool PrologueBuilder::HasEmptyPrologue(const Function& function) {
+  return !function.HasOptionalParameters() && !function.IsGeneric() &&
+         !function.IsClosureFunction();
+}
+
 BlockEntryInstr* PrologueBuilder::BuildPrologue(BlockEntryInstr* entry,
                                                 PrologueInfo* prologue_info) {
   Isolate* isolate = Isolate::Current();
@@ -174,7 +185,8 @@
   for (; param < num_fixed_params; ++param) {
     copy_args_prologue += LoadLocal(optional_count_var);
     copy_args_prologue += LoadFpRelativeSlot(
-        kWordSize * (kParamEndSlotFromFp + num_fixed_params - param));
+        kWordSize *
+        (compiler_frame_layout.param_end_from_fp + num_fixed_params - param));
     copy_args_prologue +=
         StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
     copy_args_prologue += Drop();
@@ -193,7 +205,8 @@
       Fragment good(supplied);
       good += LoadLocal(optional_count_var);
       good += LoadFpRelativeSlot(
-          kWordSize * (kParamEndSlotFromFp + num_fixed_params - param));
+          kWordSize *
+          (compiler_frame_layout.param_end_from_fp + num_fixed_params - param));
       good += StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
       good += Drop();
 
@@ -276,7 +289,7 @@
       Fragment good(supplied);
 
       {
-        // fp[kParamEndSlotFromFp + (count_var - pos)]
+        // fp[compiler_frame_layout.param_end_from_fp + (count_var - pos)]
         good += LoadLocal(count_var);
         {
           // pos = arg_desc[names_offset + arg_desc_name_index + positionOffset]
@@ -289,7 +302,8 @@
           good += LoadIndexed(/* index_scale = */ kWordSize);
         }
         good += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
-        good += LoadFpRelativeSlot(kWordSize * kParamEndSlotFromFp);
+        good += LoadFpRelativeSlot(kWordSize *
+                                   compiler_frame_layout.param_end_from_fp);
 
         // Copy down.
         good += StoreLocalRaw(TokenPosition::kNoSource,
@@ -399,7 +413,8 @@
   Fragment store_type_args;
   store_type_args += LoadArgDescriptor();
   store_type_args += LoadField(ArgumentsDescriptor::count_offset());
-  store_type_args += LoadFpRelativeSlot(kWordSize * (1 + kParamEndSlotFromFp));
+  store_type_args += LoadFpRelativeSlot(
+      kWordSize * (1 + compiler_frame_layout.param_end_from_fp));
   store_type_args += StoreLocal(TokenPosition::kNoSource, type_args_var);
   store_type_args += Drop();
 
diff --git a/runtime/vm/compiler/frontend/prologue_builder.h b/runtime/vm/compiler/frontend/prologue_builder.h
index ca762c7..30623d8 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.h
+++ b/runtime/vm/compiler/frontend/prologue_builder.h
@@ -47,6 +47,9 @@
   BlockEntryInstr* BuildPrologue(BlockEntryInstr* entry,
                                  PrologueInfo* prologue_info);
 
+  static bool HasEmptyPrologue(const Function& function);
+  static bool PrologueSkippableOnUncheckedEntry(const Function& function);
+
   intptr_t last_used_block_id() const { return last_used_block_id_; }
 
  private:
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index d78f149..4baa72b 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -384,6 +384,9 @@
   if (needs_expr_temp_) {
     scope_->AddVariable(parsed_function_->EnsureExpressionTemp());
   }
+  if (parsed_function_->function().MayHaveUncheckedEntryPoint(I)) {
+    scope_->AddVariable(parsed_function_->EnsureEntryPointsTemp());
+  }
   parsed_function_->AllocateVariables();
 
   return result_;
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 2289ba7..e14578b 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -603,8 +603,8 @@
            deopt_info_array.Length() * sizeof(uword));
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
-  Code& code =
-      Code::Handle(Code::FinalizeCode(function, assembler, optimized()));
+  Code& code = Code::Handle(Code::FinalizeCode(
+      function, graph_compiler, assembler, optimized(), /*stats=*/nullptr));
   code.set_is_optimized(optimized());
   code.set_owner(function);
 #if !defined(PRODUCT)
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index fb579c2..a133085 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -29,6 +29,7 @@
 #include "vm/service_isolate.h"
 #include "vm/simulator.h"
 #include "vm/snapshot.h"
+#include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
 #include "vm/thread_interrupter.h"
@@ -134,6 +135,8 @@
     FLAG_verify_gc_contains = true;
   }
 #endif
+  FrameLayout::InitOnce();
+
   set_thread_exit_callback(thread_exit);
   SetFileCallbacks(file_open, file_read, file_write, file_close);
   set_entropy_source_callback(entropy_source);
@@ -619,18 +622,11 @@
   if (FLAG_print_class_table) {
     I->class_table()->Print();
   }
-
-  bool is_kernel_isolate = false;
-  USE(is_kernel_isolate);
-
-#ifndef DART_PRECOMPILED_RUNTIME
-  KernelIsolate::InitCallback(I);
-  is_kernel_isolate = KernelIsolate::IsKernelIsolate(I);
-#endif
-
   ServiceIsolate::MaybeMakeServiceIsolate(I);
+
 #if !defined(PRODUCT)
-  if (!ServiceIsolate::IsServiceIsolate(I) && !is_kernel_isolate) {
+  if (!ServiceIsolate::IsServiceIsolate(I) &&
+      !KernelIsolate::IsKernelIsolate(I)) {
     I->message_handler()->set_should_pause_on_start(
         FLAG_pause_isolates_on_start);
     I->message_handler()->set_should_pause_on_exit(FLAG_pause_isolates_on_exit);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index eabfc03..5cf89d7 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5301,6 +5301,21 @@
   return Api::NewHandle(T, url.raw());
 }
 
+DART_EXPORT Dart_Handle Dart_LibraryResolvedUrl(Dart_Handle library) {
+  DARTSCOPE(Thread::Current());
+  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
+  if (lib.IsNull()) {
+    RETURN_TYPE_ERROR(Z, library, Library);
+  }
+  const Class& toplevel = Class::Handle(lib.toplevel_class());
+  ASSERT(!toplevel.IsNull());
+  const Script& script = Script::Handle(toplevel.script());
+  ASSERT(!script.IsNull());
+  const String& url = String::Handle(script.resolved_url());
+  ASSERT(!url.IsNull());
+  return Api::NewHandle(T, url.raw());
+}
+
 DART_EXPORT Dart_Handle Dart_GetLoadedLibraries() {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 15088a0..f1cdf09 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -324,14 +324,12 @@
 }
 
 bool Debugger::NeedsIsolateEvents() {
-  return ((isolate_ != Dart::vm_isolate()) &&
-          !ServiceIsolate::IsServiceIsolateDescendant(isolate_) &&
+  return (!Isolate::IsVMInternalIsolate(isolate_) &&
           ((event_handler_ != NULL) || Service::isolate_stream.enabled()));
 }
 
 bool Debugger::NeedsDebugEvents() {
-  ASSERT(isolate_ != Dart::vm_isolate() &&
-         !ServiceIsolate::IsServiceIsolateDescendant(isolate_));
+  ASSERT(!Isolate::IsVMInternalIsolate(isolate_));
   return (FLAG_warn_on_pause_with_no_debugger || (event_handler_ != NULL) ||
           Service::debug_stream.enabled());
 }
@@ -1133,8 +1131,8 @@
     // were actually supplied at the call site, but they are copied to a fixed
     // place in the callee's frame.
 
-    return GetVariableValue(
-        LocalVarAddress(fp(), FrameSlotForVariableIndex(-index)));
+    return GetVariableValue(LocalVarAddress(
+        fp(), runtime_frame_layout.FrameSlotForVariableIndex(-index)));
   } else {
     intptr_t reverse_index = num_parameters - index;
     return GetVariableValue(ParamAddress(fp(), reverse_index));
@@ -1147,7 +1145,8 @@
 }
 
 RawObject* ActivationFrame::GetStackVar(VariableIndex variable_index) {
-  const intptr_t slot_index = FrameSlotForVariableIndex(variable_index.value());
+  const intptr_t slot_index =
+      runtime_frame_layout.FrameSlotForVariableIndex(variable_index.value());
   if (deopt_frame_.IsNull()) {
     return GetVariableValue(LocalVarAddress(fp(), slot_index));
   } else {
@@ -1735,8 +1734,7 @@
 void Debugger::Shutdown() {
   // TODO(johnmccutchan): Do not create a debugger for isolates that don't need
   // them. Then, assert here that isolate_ is not one of those isolates.
-  if ((isolate_ == Dart::vm_isolate()) ||
-      ServiceIsolate::IsServiceIsolateDescendant(isolate_)) {
+  if (Isolate::IsVMInternalIsolate(isolate_)) {
     return;
   }
   while (breakpoint_locations_ != NULL) {
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 1694109..06641ab 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -357,8 +357,9 @@
     intptr_t dest_index = kNumberOfCpuRegisters - 1 - i;
 #else
     const intptr_t len = deopt_instructions.length();
-    intptr_t slot =
-        i < params ? i : i + kParamEndSlotFromFp - kFirstLocalSlotFromFp;
+    intptr_t slot = i < params ? i
+                               : i + kParamEndSlotFromFp -
+                                     runtime_frame_layout.first_local_from_fp;
     DeoptInstr* instr = deopt_instructions[len - 1 - slot];
     intptr_t dest_index = i - params;
 #endif
@@ -1016,7 +1017,8 @@
 
 intptr_t DeoptInfoBuilder::CalculateStackIndex(
     const Location& source_loc) const {
-  intptr_t index = -VariableIndexForFrameSlot(source_loc.stack_index());
+  intptr_t index = -compiler_frame_layout.VariableIndexForFrameSlot(
+      source_loc.stack_index());
   return index < 0 ? index + num_args_
                    : index + num_args_ + kDartFrameFixedSize;
 }
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 2c19a5f..28520f9 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -144,12 +144,9 @@
 #if defined(TARGET_ARCH_DBC)
   return reinterpret_cast<RawObject**>(fp + stack_slot * kWordSize);
 #else
-  if (stack_slot < 0) {
-    return reinterpret_cast<RawObject**>(ParamAddress(fp, -stack_slot));
-  } else {
-    return reinterpret_cast<RawObject**>(
-        LocalVarAddress(fp, kFirstLocalSlotFromFp - stack_slot));
-  }
+  const intptr_t frame_slot =
+      runtime_frame_layout.FrameSlotForVariableIndex(-stack_slot);
+  return reinterpret_cast<RawObject**>(fp + frame_slot * kWordSize);
 #endif
 }
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index b2493cc..440bbe8 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -176,7 +176,7 @@
   R(support_service, false, bool, true, "Support the service protocol.")       \
   R(support_timeline, false, bool, true, "Support timeline.")                  \
   D(trace_cha, bool, false, "Trace CHA operations")                            \
-  D(trace_field_guards, bool, false, "Trace changes in field's cids.")         \
+  R(trace_field_guards, false, bool, false, "Trace changes in field's cids.")  \
   C(trace_irregexp, false, false, bool, false, "Trace irregexps.")             \
   D(trace_isolates, bool, false, "Trace isolate creation and shut down.")      \
   D(trace_handles, bool, false, "Traces allocation of handles.")               \
@@ -208,6 +208,10 @@
   D(verify_on_transition, bool, false, "Verify on dart <==> VM.")              \
   P(enable_slow_path_sharing, bool, true, "Enable sharing of slow-path code.") \
   P(shared_slow_path_triggers_gc, bool, false,                                 \
-    "TESTING: slow-path triggers a GC.")
+    "TESTING: slow-path triggers a GC.")                                       \
+  P(enable_multiple_entrypoints, bool, true,                                   \
+    "Enable multiple entrypoints per-function and related optimizations.")     \
+  R(enable_testing_pragmas, false, bool, false,                                \
+    "Enable magical pragmas for testing purposes. Use at your own risk!")
 
 #endif  // RUNTIME_VM_FLAG_LIST_H_
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index d871b08..44012b8 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -44,6 +44,7 @@
                            StubCode::LazyCompile_entry()->code());
         uword entry_point = StubCode::LazyCompile_entry()->EntryPoint();
         func->ptr()->entry_point_ = entry_point;
+        func->ptr()->unchecked_entry_point_ = entry_point;
         if (FLAG_log_code_drop) {
           // NOTE: This code runs while GC is in progress and runs within
           // a NoHandleScope block. Hence it is not okay to use a regular Zone
diff --git a/runtime/vm/heap/safepoint.cc b/runtime/vm/heap/safepoint.cc
index 2dbde70..a80b802 100644
--- a/runtime/vm/heap/safepoint.cc
+++ b/runtime/vm/heap/safepoint.cc
@@ -81,20 +81,22 @@
     Thread* current = isolate()->thread_registry()->active_list();
     while (current != NULL) {
       MonitorLocker tl(current->thread_lock());
-      if (current != T) {
-        uint32_t state = current->SetSafepointRequested(true);
-        if (!Thread::IsAtSafepoint(state)) {
-          // Thread is not already at a safepoint so try to
-          // get it to a safepoint and wait for it to check in.
-          if (current->IsMutatorThread()) {
-            ASSERT(T->isolate() != NULL);
-            current->ScheduleInterruptsLocked(Thread::kVMInterrupt);
+      if (!current->BypassSafepoints()) {
+        if (current == T) {
+          current->SetAtSafepoint(true);
+        } else {
+          uint32_t state = current->SetSafepointRequested(true);
+          if (!Thread::IsAtSafepoint(state)) {
+            // Thread is not already at a safepoint so try to
+            // get it to a safepoint and wait for it to check in.
+            if (current->IsMutatorThread()) {
+              ASSERT(T->isolate() != NULL);
+              current->ScheduleInterruptsLocked(Thread::kVMInterrupt);
+            }
+            MonitorLocker sl(safepoint_lock_);
+            ++number_threads_not_at_safepoint_;
           }
-          MonitorLocker sl(safepoint_lock_);
-          ++number_threads_not_at_safepoint_;
         }
-      } else {
-        current->SetAtSafepoint(true);
       }
       current = current->next();
     }
@@ -133,13 +135,15 @@
   Thread* current = isolate()->thread_registry()->active_list();
   while (current != NULL) {
     MonitorLocker tl(current->thread_lock());
-    if (current != T) {
-      uint32_t state = current->SetSafepointRequested(false);
-      if (Thread::IsBlockedForSafepoint(state)) {
-        tl.Notify();
+    if (!current->BypassSafepoints()) {
+      if (current == T) {
+        current->SetAtSafepoint(false);
+      } else {
+        uint32_t state = current->SetSafepointRequested(false);
+        if (Thread::IsBlockedForSafepoint(state)) {
+          tl.Notify();
+        }
       }
-    } else {
-      current->SetAtSafepoint(false);
     }
     current = current->next();
   }
@@ -173,6 +177,7 @@
 }
 
 void SafepointHandler::BlockForSafepoint(Thread* T) {
+  ASSERT(!T->BypassSafepoints());
   MonitorLocker tl(T->thread_lock());
   if (T->IsSafepointRequested()) {
     T->SetAtSafepoint(true);
diff --git a/runtime/vm/heap/sweeper.cc b/runtime/vm/heap/sweeper.cc
index 092ba69..591cf35 100644
--- a/runtime/vm/heap/sweeper.cc
+++ b/runtime/vm/heap/sweeper.cc
@@ -120,7 +120,7 @@
 
   virtual void Run() {
     bool result =
-        Thread::EnterIsolateAsHelper(task_isolate_, Thread::kSweeperTask);
+        Thread::EnterIsolateAsHelper(task_isolate_, Thread::kSweeperTask, true);
     ASSERT(result);
     {
       Thread* thread = Thread::Current();
@@ -131,7 +131,7 @@
       HeapPage* prev_page = NULL;
 
       while (page != NULL) {
-        thread->CheckForSafepoint();
+        ASSERT(thread->BypassSafepoints());  // Or we should be checking in.
         HeapPage* next_page = page->next();
         ASSERT(page->type() == HeapPage::kData);
         bool page_in_use = sweeper.SweepPage(page, freelist_, false);
@@ -151,7 +151,7 @@
       }
     }
     // Exit isolate cleanly *before* notifying it, to avoid shutdown race.
-    Thread::ExitIsolateAsHelper();
+    Thread::ExitIsolateAsHelper(true);
     // This sweeper task is done. Notify the original isolate.
     {
       MonitorLocker ml(old_space_->tasks_lock());
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index a1ba31b..1c2c099 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -556,7 +556,6 @@
   stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
 
   last_setjmp_buffer_ = NULL;
-  top_exit_frame_info_ = 0;
 
   DEBUG_ONLY(icount_ = 1);  // So that tracing after 0 traces first bytecode.
 }
@@ -1521,7 +1520,6 @@
       ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());                    \
       return special_[kExceptionSpecialIndex];                                 \
     }                                                                          \
-    pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;              \
     goto DispatchAfterException;                                               \
   } while (0)
 
@@ -1542,7 +1540,6 @@
       thread->set_vm_tag(vm_tag);                                              \
       return special_[kExceptionSpecialIndex];                                 \
     }                                                                          \
-    pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;              \
     goto DispatchAfterException;                                               \
   } while (0)
 
@@ -2523,14 +2520,17 @@
           INVOKE_RUNTIME(DRT_AllocateArray, native_args);
           SP -= 1;  // Result is in SP - 1.
         } else {
-          // SP[0] is type.
-          *++SP = Smi::New(0);  // len
-          *++SP = thread->isolate()->object_store()->growable_list_factory();
+          ASSERT(InterpreterHelpers::ArgDescPosCount(argdesc_) == 1);
+          // SP[-1] is type.
+          // The native wrapper pushed null as the optional length argument.
+          ASSERT(SP[0] == null_value);
+          SP[0] = Smi::New(0);  // Patch null length with zero length.
+          SP[1] = thread->isolate()->object_store()->growable_list_factory();
           // Change the ArgumentsDescriptor of the call with a new cached one.
           argdesc_ = ArgumentsDescriptor::New(
               0, KernelBytecode::kNativeCallToGrowableListArgc);
           // Note the special handling of the return of this call in DecodeArgc.
-          if (!Invoke(thread, SP - 2, SP, &pc, &FP, &SP)) {
+          if (!Invoke(thread, SP - 1, SP + 1, &pc, &FP, &SP)) {
             HANDLE_EXCEPTION;
           }
         }
@@ -4764,6 +4764,7 @@
   // Single dispatch point used by exception handling macros.
   {
   DispatchAfterException:
+    pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;
     DISPATCH();
   }
 
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 80621a4..2005f9a 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -110,7 +110,6 @@
   DEBUG_ONLY(uint64_t icount_;)
 
   InterpreterSetjmpBuffer* last_setjmp_buffer_;
-  uword top_exit_frame_info_;
 
   RawObjectPool* pp_;  // Pool Pointer.
   RawArray* argdesc_;  // Arguments Descriptor: used to pass information between
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 1474909..e31589f 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -643,7 +643,7 @@
 
 #ifndef PRODUCT
 void IsolateMessageHandler::NotifyPauseOnStart() {
-  if (!FLAG_support_service) {
+  if (!FLAG_support_service || Isolate::IsVMInternalIsolate(I)) {
     return;
   }
   if (Service::debug_stream.enabled() || FLAG_warn_on_pause_with_no_debugger) {
@@ -659,7 +659,7 @@
 }
 
 void IsolateMessageHandler::NotifyPauseOnExit() {
-  if (!FLAG_support_service) {
+  if (!FLAG_support_service || Isolate::IsVMInternalIsolate(I)) {
     return;
   }
   if (Service::debug_stream.enabled() || FLAG_warn_on_pause_with_no_debugger) {
@@ -1055,10 +1055,17 @@
 #undef ISOLATE_METRIC_INIT
 #endif  // !defined(PRODUCT)
 
-  bool is_service_or_kernel_isolate = ServiceIsolate::NameEquals(name_prefix);
+  bool is_service_or_kernel_isolate = false;
+  if (ServiceIsolate::NameEquals(name_prefix)) {
+    ASSERT(!ServiceIsolate::Exists());
+    is_service_or_kernel_isolate = true;
+  }
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  is_service_or_kernel_isolate =
-      is_service_or_kernel_isolate || KernelIsolate::NameEquals(name_prefix);
+  if (KernelIsolate::NameEquals(name_prefix)) {
+    ASSERT(!KernelIsolate::Exists());
+    KernelIsolate::SetKernelIsolate(result);
+    is_service_or_kernel_isolate = true;
+  }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   Heap::Init(result,
@@ -1122,6 +1129,12 @@
   if (!AddIsolateToList(result)) {
     result->LowLevelShutdown();
     Thread::ExitIsolate();
+    if (KernelIsolate::IsKernelIsolate(result)) {
+      KernelIsolate::SetKernelIsolate(NULL);
+    }
+    if (ServiceIsolate::IsServiceIsolate(result)) {
+      ServiceIsolate::SetServiceIsolate(NULL);
+    }
     delete result;
     return NULL;
   }
@@ -1221,7 +1234,7 @@
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 bool Isolate::CanReload() const {
-  return !ServiceIsolate::IsServiceIsolateDescendant(this) && is_runnable() &&
+  return !Isolate::IsVMInternalIsolate(this) && is_runnable() &&
          !IsReloading() &&
          (AtomicOperations::LoadRelaxed(&no_reload_scope_depth_) == 0) &&
          IsolateCreationEnabled() &&
@@ -1275,7 +1288,7 @@
   ASSERT(object_store()->root_library() != Library::null());
   set_is_runnable(true);
 #ifndef PRODUCT
-  if (!ServiceIsolate::IsServiceIsolate(this)) {
+  if (!Isolate::IsVMInternalIsolate(this)) {
     debugger()->OnIsolateRunnable();
     if (FLAG_pause_isolates_on_unhandled_exceptions) {
       debugger()->SetExceptionPauseInfo(kPauseOnUnhandledExceptions);
@@ -1297,7 +1310,8 @@
       event->Complete();
     }
   }
-  if (FLAG_support_service && Service::isolate_stream.enabled()) {
+  if (FLAG_support_service && !Isolate::IsVMInternalIsolate(this) &&
+      Service::isolate_stream.enabled()) {
     ServiceEvent runnableEvent(this, ServiceEvent::kIsolateRunnable);
     Service::HandleEvent(&runnableEvent);
   }
@@ -1833,8 +1847,7 @@
 
     // Write compiler stats data if enabled.
     if (FLAG_support_compiler_stats && FLAG_compiler_stats &&
-        !ServiceIsolate::IsServiceIsolateDescendant(this) &&
-        (this != Dart::vm_isolate())) {
+        !Isolate::IsVMInternalIsolate(this)) {
       OS::PrintErr("%s", aggregate_compiler_stats()->PrintToZone());
     }
   }
@@ -1862,9 +1875,8 @@
   }
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_check_reloaded && is_runnable() && (this != Dart::vm_isolate()) &&
-      !KernelIsolate::IsKernelIsolate(this) &&
-      !ServiceIsolate::IsServiceIsolateDescendant(this)) {
+  if (FLAG_check_reloaded && is_runnable() &&
+      !Isolate::IsVMInternalIsolate(this)) {
     if (!HasAttemptedReload()) {
       FATAL(
           "Isolate did not reload before exiting and "
@@ -2427,7 +2439,7 @@
 // done atomically.
 void Isolate::RegisterServiceExtensionHandler(const String& name,
                                               const Instance& closure) {
-  if (!FLAG_support_service) {
+  if (!FLAG_support_service || Isolate::IsVMInternalIsolate(this)) {
     return;
   }
   GrowableObjectArray& handlers =
@@ -2620,7 +2632,7 @@
   return creation_enabled_;
 }
 
-bool Isolate::IsVMInternalIsolate(Isolate* isolate) {
+bool Isolate::IsVMInternalIsolate(const Isolate* isolate) {
   return (isolate == Dart::vm_isolate()) ||
          ServiceIsolate::IsServiceIsolateDescendant(isolate) ||
          KernelIsolate::IsKernelIsolate(isolate);
@@ -2758,7 +2770,8 @@
     thread->set_os_thread(os_thread);
     ASSERT(thread->execution_state() == Thread::kThreadInNative);
     thread->set_execution_state(Thread::kThreadInVM);
-    thread->set_safepoint_state(0);
+    thread->set_safepoint_state(
+        Thread::SetBypassSafepoints(bypass_safepoint, 0));
     thread->set_vm_tag(VMTag::kVMTagId);
     ASSERT(thread->no_safepoint_scope_depth() == 0);
     os_thread->set_thread(thread);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index ad836a7..5614bdd9 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -762,7 +762,7 @@
   static void DisableIsolateCreation();
   static void EnableIsolateCreation();
   static bool IsolateCreationEnabled();
-  static bool IsVMInternalIsolate(Isolate* isolate);
+  static bool IsVMInternalIsolate(const Isolate* isolate);
 
 #if !defined(PRODUCT)
   intptr_t reload_every_n_stack_overflow_checks() const {
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 658a3f3..d138b12 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -469,6 +469,9 @@
 }
 
 void IsolateReloadContext::ReportError(const Error& error) {
+  if (!FLAG_support_service || Isolate::IsVMInternalIsolate(I)) {
+    return;
+  }
   if (FLAG_trace_reload) {
     THR_Print("ISO-RELOAD: Error: %s\n", error.ToErrorCString());
   }
@@ -478,6 +481,9 @@
 }
 
 void IsolateReloadContext::ReportSuccess() {
+  if (!FLAG_support_service || Isolate::IsVMInternalIsolate(I)) {
+    return;
+  }
   ServiceEvent service_event(I, ServiceEvent::kIsolateReload);
   Service::HandleEvent(&service_event);
 }
@@ -577,6 +583,7 @@
   }
 
   bool did_kernel_compilation = false;
+  bool skip_reload = false;
   if (isolate()->use_dart_frontend()) {
     // Load the kernel program and figure out the modified libraries.
     const GrowableObjectArray& libs =
@@ -637,13 +644,14 @@
       kernel_program.set(kernel::Program::ReadFromTypedData(typed_data));
     }
 
-    kernel::KernelLoader::FindModifiedLibraries(kernel_program.get(), I,
-                                                modified_libs_, force_reload);
+    kernel::KernelLoader::FindModifiedLibraries(
+        kernel_program.get(), I, modified_libs_, force_reload, &skip_reload);
   } else {
     // Check to see which libraries have been modified.
     modified_libs_ = FindModifiedLibraries(force_reload, root_lib_modified);
+    skip_reload = !modified_libs_->Contains(old_root_lib.index());
   }
-  if (!modified_libs_->Contains(old_root_lib.index())) {
+  if (skip_reload) {
     ASSERT(modified_libs_->IsEmpty());
     reload_skipped_ = true;
     // Inform GetUnusedChangesInLastReload that a reload has happened.
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c11ad21..ea23d2c 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -92,9 +92,10 @@
     api_flags.enable_asserts = false;
     api_flags.enable_error_on_bad_type = false;
     api_flags.enable_error_on_bad_override = false;
-    api_flags.reify_generic_functions = false;
-    api_flags.strong = false;
-    api_flags.sync_async = false;
+    api_flags.use_dart_frontend = true;
+    api_flags.reify_generic_functions = true;
+    api_flags.strong = true;
+    api_flags.sync_async = true;
 #if !defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                 \
     !defined(DART_USE_INTERPRETER)
     api_flags.use_field_guards = true;
@@ -233,12 +234,10 @@
 }
 
 void KernelIsolate::Shutdown() {
-  Isolate::KillIfExists(isolate_, Isolate::kInternalKillMsg);
-  {
-    MonitorLocker ml(monitor_);
-    while (isolate_ != NULL) {
-      ml.Wait();
-    }
+  MonitorLocker ml(monitor_);
+  while (isolate_ != NULL) {
+    Isolate::KillIfExists(isolate_, Isolate::kInternalKillMsg);
+    ml.Wait();
   }
 }
 
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index aaadeaf..a271351 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -83,6 +83,7 @@
   }
 
   friend class Dart;
+  friend class Isolate;
   friend class RunKernelTask;
 };
 
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 61947f5..17f062d 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -667,7 +667,8 @@
 void KernelLoader::FindModifiedLibraries(Program* program,
                                          Isolate* isolate,
                                          BitVector* modified_libs,
-                                         bool force_reload) {
+                                         bool force_reload,
+                                         bool* is_empty_program) {
   LongJumpScope jump;
   Zone* zone = Thread::Current()->zone();
   if (setjmp(*jump.Set()) == 0) {
@@ -689,9 +690,10 @@
 
     // Now go through all the libraries that are present in the incremental
     // kernel files, these will constitute the modified libraries.
+    *is_empty_program = true;
     if (program->is_single_program()) {
       KernelLoader loader(program);
-      return loader.walk_incremental_kernel(modified_libs);
+      return loader.walk_incremental_kernel(modified_libs, is_empty_program);
     } else {
       kernel::Reader reader(program->kernel_data(),
                             program->kernel_data_size());
@@ -709,15 +711,17 @@
         Program* subprogram = Program::ReadFrom(&reader);
         ASSERT(subprogram->is_single_program());
         KernelLoader loader(subprogram);
-        loader.walk_incremental_kernel(modified_libs);
+        loader.walk_incremental_kernel(modified_libs, is_empty_program);
         delete subprogram;
       }
     }
   }
 }
 
-void KernelLoader::walk_incremental_kernel(BitVector* modified_libs) {
+void KernelLoader::walk_incremental_kernel(BitVector* modified_libs,
+                                           bool* is_empty_program) {
   intptr_t length = program_->library_count();
+  *is_empty_program = *is_empty_program && (length == 0);
   for (intptr_t i = 0; i < length; i++) {
     intptr_t kernel_offset = library_offset(i);
     helper_.SetOffset(kernel_offset);
@@ -1599,6 +1603,8 @@
     expression_evaluation_function_ = function.raw();
   }
   function.set_kernel_offset(procedure_offset);
+  function.set_is_reflectable(function.is_reflectable() &&
+                              library.raw() != Library::InternalLibrary());
 
   ActiveMemberScope active_member(&active_class_, &function);
 
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 6aa798d..4f573f8 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -143,7 +143,8 @@
   static void FindModifiedLibraries(Program* program,
                                     Isolate* isolate,
                                     BitVector* modified_libs,
-                                    bool force_reload);
+                                    bool force_reload,
+                                    bool* is_empty_kernel);
 
   RawLibrary* LoadLibrary(intptr_t index);
 
@@ -213,7 +214,8 @@
   void InitializeFields();
   static void index_programs(kernel::Reader* reader,
                              GrowableArray<intptr_t>* subprogram_file_starts);
-  void walk_incremental_kernel(BitVector* modified_libs);
+  void walk_incremental_kernel(BitVector* modified_libs,
+                               bool* is_empty_program);
 
   void LoadPreliminaryClass(ClassHelper* class_helper,
                             intptr_t type_parameter_count);
diff --git a/runtime/vm/log.cc b/runtime/vm/log.cc
index 83b99b2..c7c4c2f 100644
--- a/runtime/vm/log.cc
+++ b/runtime/vm/log.cc
@@ -12,6 +12,15 @@
 
 DEFINE_FLAG(bool, force_log_flush, false, "Always flush log messages.");
 
+// The following flag is useful when debugging on Android, since
+// adb logcat truncates messages that are "too long" (and always
+// flushing would result in too many short messages).
+DEFINE_FLAG(
+    int,
+    force_log_flush_at_size,
+    0,
+    "Flush log messages when buffer exceeds given size (disabled when 0).");
+
 DEFINE_FLAG(charp,
             isolate_log_filter,
             NULL,
@@ -80,7 +89,7 @@
   }
   free(buffer);
 
-  if ((manual_flush_ == 0) || FLAG_force_log_flush) {
+  if (ShouldFlush()) {
     Flush();
   }
 }
@@ -161,6 +170,12 @@
   }
 }
 
+bool Log::ShouldFlush() const {
+  return ((manual_flush_ == 0) || FLAG_force_log_flush ||
+          ((FLAG_force_log_flush_at_size > 0) &&
+           (cursor() > FLAG_force_log_flush_at_size)));
+}
+
 void LogBlock::Initialize() {
   log_->EnableManualFlush();
 }
diff --git a/runtime/vm/log.h b/runtime/vm/log.h
index 8c851a4..c18d6f5 100644
--- a/runtime/vm/log.h
+++ b/runtime/vm/log.h
@@ -54,6 +54,9 @@
   void EnableManualFlush();
   void DisableManualFlush(const intptr_t cursor);
 
+  // Returns true when flush is required.
+  bool ShouldFlush() const;
+
   // Returns false if we should drop log messages related to 'isolate'.
   static bool ShouldLogForIsolate(const Isolate* isolate);
 
diff --git a/runtime/vm/longjump.cc b/runtime/vm/longjump.cc
index 36d5031..f5238c1 100644
--- a/runtime/vm/longjump.cc
+++ b/runtime/vm/longjump.cc
@@ -7,12 +7,10 @@
 #include "include/dart_api.h"
 
 #include "vm/dart_api_impl.h"
-#include "vm/interpreter.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
-#include "vm/simulator.h"
 
 namespace dart {
 
@@ -22,38 +20,10 @@
   return &environment_;
 }
 
-bool LongJumpScope::IsSafeToJump() {
-  // We do not want to jump past Dart frames.  Note that this code
-  // assumes the stack grows from high to low.
-  Thread* thread = Thread::Current();
-  uword jumpbuf_addr = OSThread::GetCurrentStackPointer();
-
-#if defined(USING_SIMULATOR) && defined(DART_USE_INTERPRETER)
-#error "Simultaneous usage of simulator and interpreter not yet supported."
-#endif  // defined(USING_SIMULATOR) && defined(DART_USE_INTERPRETER)
-
-#if defined(USING_SIMULATOR)
-  Simulator* sim = Simulator::Current();
-  // When using simulator, only mutator thread should refer to Simulator
-  // since there can be only one per isolate.
-  uword top_exit_frame_info =
-      thread->IsMutatorThread() ? sim->top_exit_frame_info() : 0;
-#else
-  uword top_exit_frame_info = thread->top_exit_frame_info();
-#endif
-  if (!thread->IsMutatorThread()) {
-    // A helper thread does not execute Dart code, so it's safe to jump.
-    ASSERT(top_exit_frame_info == 0);
-    return true;
-  }
-  return ((top_exit_frame_info == 0) || (jumpbuf_addr < top_exit_frame_info));
-}
-
 void LongJumpScope::Jump(int value, const Error& error) {
   // A zero is the default return value from setting up a LongJumpScope
   // using Set.
   ASSERT(value != 0);
-  ASSERT(IsSafeToJump());
 
   Thread* thread = Thread::Current();
 
diff --git a/runtime/vm/longjump.h b/runtime/vm/longjump.h
index 7fbe9eb..bb6a79c 100644
--- a/runtime/vm/longjump.h
+++ b/runtime/vm/longjump.h
@@ -28,11 +28,6 @@
   jmp_buf* Set();
   void Jump(int value, const Error& error);
 
-  // Would it be safe to use this longjump?
-  //
-  // Checks to make sure that the jump would not cross Dart frames.
-  bool IsSafeToJump();
-
  private:
   jmp_buf environment_;
   StackResource* top_;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0d14fc2..38fdde9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -2900,6 +2900,41 @@
   return result.raw();
 }
 
+bool Function::FindPragma(Isolate* I,
+                          const String& pragma_name,
+                          Object* options) const {
+  if (!has_pragma()) return false;
+
+  auto& klass = Class::Handle(Owner());
+  auto& lib = Library::Handle(klass.library());
+
+  auto& pragma_class =
+      Class::Handle(Isolate::Current()->object_store()->pragma_class());
+  auto& pragma_name_field =
+      Field::Handle(pragma_class.LookupField(Symbols::name()));
+  auto& pragma_options_field =
+      Field::Handle(pragma_class.LookupField(Symbols::options()));
+
+  Array& metadata = Array::Handle();
+  metadata ^= lib.GetMetadata(Function::Handle(raw()));
+
+  if (metadata.IsNull()) return false;
+
+  auto& pragma = Object::Handle();
+  for (intptr_t i = 0; i < metadata.Length(); ++i) {
+    pragma = metadata.At(i);
+    if (pragma.clazz() != pragma_class.raw() ||
+        Instance::Cast(pragma).GetField(pragma_name_field) !=
+            pragma_name.raw()) {
+      continue;
+    }
+    *options = Instance::Cast(pragma).GetField(pragma_options_field);
+    return true;
+  }
+
+  return false;
+}
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
 RawFunction* Function::CreateDynamicInvocationForwarder(
     const String& mangled_name) const {
@@ -5923,6 +5958,8 @@
 void Function::SetInstructionsSafe(const Code& value) const {
   StorePointer(&raw_ptr()->code_, value.raw());
   StoreNonPointer(&raw_ptr()->entry_point_, value.EntryPoint());
+  StoreNonPointer(&raw_ptr()->unchecked_entry_point_,
+                  value.unchecked_entry_point());
 }
 
 void Function::AttachCode(const Code& value) const {
@@ -6016,8 +6053,8 @@
     Exceptions::PropagateError(error);
   }
   const Code& unopt_code = Code::Handle(zone, unoptimized_code());
-  AttachCode(unopt_code);
   unopt_code.Enable();
+  AttachCode(unopt_code);
   isolate->TrackDeoptimizedCode(current_code);
 }
 
@@ -8257,6 +8294,18 @@
   return CurrentCode();
 }
 
+bool Function::MayHaveUncheckedEntryPoint(Isolate* I) const {
+// TODO(#34162): Support the other architectures.
+// TODO(#34162): Enable multiple-entrypoints for AOT if we
+// consider them beneficial.
+#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM)
+  return !FLAG_precompiled_mode && FLAG_enable_multiple_entrypoints &&
+         (NeedsArgumentTypeChecks(I) || IsImplicitClosureFunction());
+#else
+  return false;
+#endif
+}
+
 const char* Function::ToCString() const {
   if (IsNull()) {
     return "Function: null";
@@ -8621,11 +8670,13 @@
   result.set_is_unboxing_candidate(true);
   result.set_initializer_changed_after_initialization(false);
   result.set_kernel_offset(0);
+  result.set_static_type_exactness_state(
+      StaticTypeExactnessState::NotTracking());
   Isolate* isolate = Isolate::Current();
 
-  // Use field guards if they are enabled and the isolate has never reloaded.
-  // TODO(johnmccutchan): The reload case assumes the worst case (everything is
-  // dynamic and possibly null). Attempt to relax this later.
+// Use field guards if they are enabled and the isolate has never reloaded.
+// TODO(johnmccutchan): The reload case assumes the worst case (everything is
+// dynamic and possibly null). Attempt to relax this later.
 #if defined(PRODUCT)
   const bool use_guarded_cid =
       FLAG_precompiled_mode || isolate->use_field_guards();
@@ -8921,7 +8972,9 @@
          (raw_ptr()->is_nullable_ == other.raw_ptr()->is_nullable_) &&
          (raw_ptr()->guarded_list_length_ ==
           other.raw_ptr()->guarded_list_length_) &&
-         (is_unboxing_candidate() == other.is_unboxing_candidate());
+         (is_unboxing_candidate() == other.is_unboxing_candidate()) &&
+         (static_type_exactness_state().Encode() ==
+          other.static_type_exactness_state().Encode());
 }
 
 bool Field::IsUninitialized() const {
@@ -9009,9 +9062,26 @@
   if (guarded_cid() == kIllegalCid) {
     return "<?>";
   } else if (guarded_cid() == kDynamicCid) {
+    ASSERT(!static_type_exactness_state().IsExactOrUninitialized());
     return "<*>";
   }
 
+  const char* exactness = "";
+  if (static_type_exactness_state().IsTracking()) {
+    if (!static_type_exactness_state().IsExactOrUninitialized()) {
+      exactness = " {!exact}";
+    } else if (static_type_exactness_state().IsTriviallyExact()) {
+      exactness = " {trivially-exact}";
+    } else if (static_type_exactness_state().IsHasExactSuperType()) {
+      exactness = " {has-exact-super-type}";
+    } else if (static_type_exactness_state().IsHasExactSuperClass()) {
+      exactness = " {has-exact-super-class}";
+    } else {
+      ASSERT(static_type_exactness_state().IsUninitialized());
+      exactness = " {unknown exactness}";
+    }
+  }
+
   const Class& cls =
       Class::Handle(Isolate::Current()->class_table()->At(guarded_cid()));
   const char* class_name = String::Handle(cls.Name()).ToCString();
@@ -9020,16 +9090,18 @@
       is_final()) {
     ASSERT(guarded_list_length() != kUnknownFixedLength);
     if (guarded_list_length() == kNoFixedLength) {
-      return Thread::Current()->zone()->PrintToString("<%s [*]>", class_name);
+      return Thread::Current()->zone()->PrintToString("<%s [*]%s>", class_name,
+                                                      exactness);
     } else {
       return Thread::Current()->zone()->PrintToString(
-          "<%s [%" Pd " @%" Pd "]>", class_name, guarded_list_length(),
-          guarded_list_length_in_object_offset());
+          "<%s [%" Pd " @%" Pd "]%s>", class_name, guarded_list_length(),
+          guarded_list_length_in_object_offset(), exactness);
     }
   }
 
   return Thread::Current()->zone()->PrintToString(
-      "<%s %s>", is_nullable() ? "nullable" : "not-nullable", class_name);
+      "<%s %s%s>", is_nullable() ? "nullable" : "not-nullable", class_name,
+      exactness);
 }
 
 void Field::InitializeGuardedListLengthInObjectOffset() const {
@@ -9111,18 +9183,264 @@
   return true;
 }
 
+// Given the type G<T0, ..., Tn> and class C<U0, ..., Un> find path to C at G.
+// This path can be used to compute type arguments of C at G.
+//
+// Note: we are relying on the restriction that the same class can only occur
+// once among the supertype.
+static bool FindInstantiationOf(const Type& type,
+                                const Class& cls,
+                                GrowableArray<const AbstractType*>* path,
+                                bool consider_only_super_classes) {
+  if (type.type_class() == cls.raw()) {
+    return true;  // Found instantiation.
+  }
+
+  Class& cls2 = Class::Handle();
+  AbstractType& super_type = AbstractType::Handle();
+  super_type = cls.super_type();
+  if (!super_type.IsNull() && !super_type.IsObjectType()) {
+    cls2 = super_type.type_class();
+    path->Add(&super_type);
+    if (FindInstantiationOf(type, cls2, path, consider_only_super_classes)) {
+      return true;  // Found instantiation.
+    }
+    path->RemoveLast();
+  }
+
+  if (!consider_only_super_classes) {
+    Array& super_interfaces = Array::Handle(cls.interfaces());
+    for (intptr_t i = 0; i < super_interfaces.Length(); i++) {
+      super_type ^= super_interfaces.At(i);
+      cls2 = super_type.type_class();
+      path->Add(&super_type);
+      if (FindInstantiationOf(type, cls2, path,
+                              /*consider_only_supertypes=*/false)) {
+        return true;  // Found instantiation.
+      }
+      path->RemoveLast();
+    }
+  }
+
+  return false;  // Not found.
+}
+
+static void SetTrivialTypeExactness(const Field& field, const Class& cls) {
+  const intptr_t type_arguments_offset = cls.type_arguments_field_offset();
+  ASSERT(type_arguments_offset != Class::kNoTypeArguments);
+  if (StaticTypeExactnessState::CanRepresentAsTriviallyExact(
+          type_arguments_offset)) {
+    field.set_static_type_exactness_state(
+        StaticTypeExactnessState::TriviallyExact(type_arguments_offset));
+  } else {
+    field.set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+  }
+}
+
+bool Field::UpdateGuardedExactnessState(const Object& value) const {
+  if (!static_type_exactness_state().IsExactOrUninitialized()) {
+    // Nothing to update.
+    return false;
+  }
+
+  if (guarded_cid() == kDynamicCid) {
+    if (FLAG_trace_field_guards) {
+      THR_Print(
+          "  => switching off exactness tracking because guarded cid is "
+          "dynamic\n");
+    }
+    set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+    return true;  // Invalidate.
+  }
+
+  // If we are storing null into a field or we have an exact super type
+  // then there is nothing to do.
+  if (value.IsNull() || static_type_exactness_state().IsHasExactSuperType() ||
+      static_type_exactness_state().IsHasExactSuperClass()) {
+    return false;
+  }
+
+  // If we are storing a non-null value into a field that is considered
+  // to be trivially exact then we need to check if value has an appropriate
+  // type.
+  ASSERT(guarded_cid() != kNullCid);
+
+  const Type& field_type = Type::Cast(AbstractType::Handle(type()));
+  const TypeArguments& field_type_args =
+      TypeArguments::Handle(field_type.arguments());
+
+  const Instance& instance = Instance::Cast(value);
+  TypeArguments& args = TypeArguments::Handle();
+  if (static_type_exactness_state().IsTriviallyExact()) {
+    args = instance.GetTypeArguments();
+    if (args.raw() == field_type_args.raw()) {
+      return false;
+    }
+
+    if (FLAG_trace_field_guards) {
+      THR_Print("  expected %s got %s type arguments\n",
+                field_type_args.ToCString(), args.ToCString());
+    }
+
+    set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+    return true;
+  }
+
+  ASSERT(static_type_exactness_state().IsUninitialized());
+  ASSERT(field_type.IsFinalized());
+  const Class& cls = Class::Handle(instance.clazz());
+  GrowableArray<const AbstractType*> path(10);
+
+  bool is_super_class = true;
+  if (!FindInstantiationOf(field_type, cls, &path,
+                           /*consider_only_super_classes=*/true)) {
+    is_super_class = false;
+    bool found_super_interface = FindInstantiationOf(
+        field_type, cls, &path, /*consider_only_super_classes=*/false);
+    ASSERT(found_super_interface);
+  }
+
+  // Trivial case: field has type G<T0, ..., Tn> and value has type
+  // G<U0, ..., Un>. Check if type arguments match.
+  if (path.is_empty()) {
+    ASSERT(cls.raw() == field_type.type_class());
+    args = instance.GetTypeArguments();
+    // TODO(dartbug.com/34170) Evaluate if comparing relevant subvectors (that
+    // disregards superclass own arguments) improves precision of the
+    // tracking.
+    if (args.raw() == field_type_args.raw()) {
+      SetTrivialTypeExactness(*this, cls);
+      return true;
+    }
+
+    if (FLAG_trace_field_guards) {
+      THR_Print("  expected %s got %s type arguments\n",
+                field_type_args.ToCString(), args.ToCString());
+    }
+    set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+    return true;
+  }
+
+  // Value has type C<U0, ..., Un> and field has type G<T0, ..., Tn> and G != C.
+  // Compute C<X0, ..., Xn> at G (Xi are free type arguments).
+  // Path array contains a chain of immediate supertypes S0 <: S1 <: ... Sn,
+  // such that S0 is an immediate supertype of C and Sn is G<...>.
+  // Each Si might depend on type parameters of the previous supertype S{i-1}.
+  // To compute C<X0, ..., Xn> at G we walk the chain backwards and
+  // instantiate Si using type parameters of S{i-1} which gives us a type
+  // depending on type parameters of S{i-2}.
+  Error& error = Error::Handle();
+  AbstractType& type = AbstractType::Handle(path.Last()->raw());
+  for (intptr_t i = path.length() - 2; (i >= 0) && !type.IsInstantiated();
+       i--) {
+    args = path[i]->arguments();
+    type = type.InstantiateFrom(
+        args, TypeArguments::null_type_arguments(), kAllFree, &error,
+        /*instantiation_trail=*/nullptr, /*bound_trail=*/nullptr, Heap::kNew);
+  }
+
+  if (type.IsInstantiated()) {
+    // C<X0, ..., Xn> at G is fully instantiated and does not depend on
+    // Xi. In this case just check if type arguments match.
+    args = type.arguments();
+    if (args.Equals(field_type_args)) {
+      set_static_type_exactness_state(
+          is_super_class ? StaticTypeExactnessState::HasExactSuperClass()
+                         : StaticTypeExactnessState::HasExactSuperType());
+    } else {
+      if (FLAG_trace_field_guards) {
+        THR_Print(
+            "  expected %s got %s type arguments\n",
+            field_type_args.ToCString(),
+            TypeArguments::Handle(instance.GetTypeArguments()).ToCString());
+      }
+      set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+    }
+
+    // We are going from trivially exact to either super-exact or not-exact.
+    // In either of those case invalidate any code that might be depending
+    // on the field state.
+    return true;
+  }
+
+  // The most complicated case: C<X0, ..., Xn> at G depends on
+  // Xi values. To compare type arguments we would need to instantiate
+  // it fully from value's type arguments and compare with <U0, ..., Un>.
+  // However this would complicate fast path in the native code. To avoid this
+  // complication we would optimize for the trivial case: we check if
+  // C<X0, ..., Xn> at G is exactly G<X0, ..., Xn> which means we can simply
+  // compare values type arguements (<T0, ..., Tn>) to fields type arguments
+  // (<U0, ..., Un>) to establish if field type is exact.
+  ASSERT(cls.IsGeneric());
+  const intptr_t num_type_params = cls.NumTypeParameters();
+  bool trivial_case =
+      (num_type_params ==
+       Class::Handle(field_type.type_class()).NumTypeParameters()) &&
+      (instance.GetTypeArguments() == field_type.arguments());
+  if (!trivial_case && FLAG_trace_field_guards) {
+    THR_Print("Not a simple case: %" Pd " vs %" Pd
+              " type parameters, %s vs %s type arguments\n",
+              num_type_params,
+              Class::Handle(field_type.type_class()).NumTypeParameters(),
+              TypeArguments::Handle(instance.GetTypeArguments()).ToCString(),
+              field_type_args.ToCString());
+  }
+
+  AbstractType& type_arg = AbstractType::Handle();
+  args = type.arguments();
+  for (intptr_t i = 0; (i < num_type_params) && trivial_case; i++) {
+    type_arg = args.TypeAt(i);
+    if (!type_arg.IsTypeParameter() ||
+        (TypeParameter::Cast(type_arg).index() != i)) {
+      if (FLAG_trace_field_guards) {
+        THR_Print("  => encountered %s at index % " Pd "\n",
+                  type_arg.ToCString(), i);
+      }
+      trivial_case = false;
+    }
+  }
+
+  if (trivial_case) {
+    if (static_type_exactness_state().IsUninitialized()) {
+      SetTrivialTypeExactness(*this, cls);
+      return true;
+    }
+
+    // Nothing to do - already initialized and checked.
+    return false;
+  }
+
+  set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+  return true;
+}
+
 void Field::RecordStore(const Object& value) const {
   ASSERT(IsOriginal());
   if (!Isolate::Current()->use_field_guards()) {
     return;
   }
 
+  if ((guarded_cid() == kDynamicCid) ||
+      (is_nullable() && value.raw() == Object::null())) {
+    // Nothing to do: the field is not guarded or we are storing null into
+    // a nullable field.
+    return;
+  }
+
   if (FLAG_trace_field_guards) {
     THR_Print("Store %s %s <- %s\n", ToCString(), GuardedPropertiesAsCString(),
               value.ToCString());
   }
 
+  bool invalidate = false;
   if (UpdateGuardedCidAndLength(value)) {
+    invalidate = true;
+  }
+  if (UpdateGuardedExactnessState(value)) {
+    invalidate = true;
+  }
+
+  if (invalidate) {
     if (FLAG_trace_field_guards) {
       THR_Print("    => %s\n", GuardedPropertiesAsCString());
     }
@@ -9138,6 +9456,9 @@
   set_is_nullable(true);
   set_guarded_list_length(Field::kNoFixedLength);
   set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
+  if (static_type_exactness_state().IsTracking()) {
+    set_static_type_exactness_state(StaticTypeExactnessState::NotExact());
+  }
   // Drop any code that relied on the above assumptions.
   DeoptimizeDependentCode();
 }
@@ -13075,7 +13396,9 @@
 }
 #endif  // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
 
-RawInstructions* Instructions::New(intptr_t size, bool has_single_entry_point) {
+RawInstructions* Instructions::New(intptr_t size,
+                                   bool has_single_entry_point,
+                                   uword unchecked_entrypoint_pc_offset) {
   ASSERT(size >= 0);
   ASSERT(Object::instructions_class() != Class::null());
   if (size < 0 || size > kMaxElements) {
@@ -13092,6 +13415,7 @@
     result.SetSize(size);
     result.SetHasSingleEntryPoint(has_single_entry_point);
     result.set_stats(nullptr);
+    result.set_unchecked_entrypoint_pc_offset(unchecked_entrypoint_pc_offset);
   }
   return result.raw();
 }
@@ -15245,6 +15569,7 @@
 #endif
 
 RawCode* Code::FinalizeCode(const char* name,
+                            FlowGraphCompiler* compiler,
                             Assembler* assembler,
                             bool optimized,
                             CodeStatistics* stats /* = nullptr */) {
@@ -15266,7 +15591,8 @@
   assembler->set_code_object(code);
 #endif
   Instructions& instrs = Instructions::ZoneHandle(Instructions::New(
-      assembler->CodeSize(), assembler->has_single_entry_point()));
+      assembler->CodeSize(), assembler->has_single_entry_point(),
+      compiler == nullptr ? 0 : compiler->UncheckedEntryOffset()));
   INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize());
   INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize());
 
@@ -15341,6 +15667,7 @@
 }
 
 RawCode* Code::FinalizeCode(const Function& function,
+                            FlowGraphCompiler* compiler,
                             Assembler* assembler,
                             bool optimized /* = false */,
                             CodeStatistics* stats /* = nullptr */) {
@@ -15348,11 +15675,11 @@
 // try to avoid it.
 #ifndef PRODUCT
   if (CodeObservers::AreActive()) {
-    return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(), assembler,
-                        optimized, stats);
+    return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(), compiler,
+                        assembler, optimized, stats);
   }
 #endif  // !PRODUCT
-  return FinalizeCode("", assembler, optimized, stats);
+  return FinalizeCode("", compiler, assembler, optimized, stats);
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -15367,7 +15694,7 @@
   const intptr_t pointer_offset_count = 0;  // No fixups in bytecode.
   Code& code = Code::ZoneHandle(Code::New(pointer_offset_count));
   Instructions& instrs = Instructions::ZoneHandle(
-      Instructions::New(bytecode_size, true /* has_single_entry_point */));
+      Instructions::New(bytecode_size, true /* has_single_entry_point */, 0));
   INC_STAT(Thread::Current(), total_instr_size, bytecode_size);
   INC_STAT(Thread::Current(), total_code_size, bytecode_size);
 
@@ -15562,6 +15889,7 @@
   const Code& new_code =
       Code::Handle(StubCode::FixCallersTarget_entry()->code());
   SetActiveInstructions(Instructions::Handle(new_code.instructions()));
+  StoreNonPointer(&raw_ptr()->unchecked_entry_point_, raw_ptr()->entry_point_);
 }
 
 void Code::DisableStubCode() const {
@@ -15572,6 +15900,7 @@
   const Code& new_code =
       Code::Handle(StubCode::FixAllocationStubTarget_entry()->code());
   SetActiveInstructions(Instructions::Handle(new_code.instructions()));
+  StoreNonPointer(&raw_ptr()->unchecked_entry_point_, raw_ptr()->entry_point_);
 #else
   // DBC does not use allocation stubs.
   UNIMPLEMENTED();
@@ -15590,6 +15919,8 @@
                   Instructions::EntryPoint(instructions.raw()));
   StoreNonPointer(&raw_ptr()->monomorphic_entry_point_,
                   Instructions::MonomorphicEntryPoint(instructions.raw()));
+  StoreNonPointer(&raw_ptr()->unchecked_entry_point_,
+                  Instructions::UncheckedEntryPoint(instructions.raw()));
 #endif
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index f05ca7f..af38d51 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -45,6 +45,7 @@
 class DeoptInstr;
 class DisassemblyFormatter;
 class FinalizablePersistentHandle;
+class FlowGraphCompiler;
 class HierarchyInfo;
 class LocalScope;
 class CodeStatistics;
@@ -2269,6 +2270,8 @@
   // Return true if any parent function of this function is generic.
   bool HasGenericParent() const;
 
+  bool FindPragma(Isolate* I, const String& pragma_name, Object* options) const;
+
   // Not thread-safe; must be called in the main thread.
   // Sets function's code and code's function.
   void InstallOptimizedCode(const Code& code) const;
@@ -2316,6 +2319,10 @@
     return OFFSET_OF(RawFunction, entry_point_);
   }
 
+  static intptr_t unchecked_entry_point_offset() {
+    return OFFSET_OF(RawFunction, unchecked_entry_point_);
+  }
+
 #if defined(DART_USE_INTERPRETER)
   void AttachBytecode(const Code& bytecode) const;
   RawCode* Bytecode() const { return raw_ptr()->bytecode_; }
@@ -2478,12 +2485,14 @@
       if (FLAG_omit_strong_type_checks) {
         return false;
       }
-      return IsNonImplicitClosureFunction() ||
+      return IsClosureFunction() ||
              !(is_static() || (kind() == RawFunction::kConstructor));
     }
     return I->type_checks();
   }
 
+  bool MayHaveUncheckedEntryPoint(Isolate* I) const;
+
   TokenPosition token_pos() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return TokenPosition();
@@ -3151,6 +3160,116 @@
   friend class HeapProfiler;
 };
 
+// Representation of a state of runtime tracking of static type exactness for
+// a particular location in the program (e.g. exactness of type annotation
+// on a field).
+//
+// Given the static type G<T0, ..., Tn> we say that it is exact iff any
+// values that can be observed at this location has runtime type T such that
+// type arguments of T at G are exactly <T0, ..., Tn>.
+//
+// Currently we only support tracking for locations that are also known
+// to be monomorphic with respect to the actual class of the values it contains.
+//
+// Important: locations should never switch from tracked (kIsTriviallyExact,
+// kHasExactSuperType, kHasExactSuperClass, kNotExact) to not tracked
+// (kNotTracking) or the other way around because that would affect unoptimized
+// graphs generated by graph builder and skew deopt ids.
+class StaticTypeExactnessState final {
+ public:
+  // Values stored in the location with static type G<T0, ..., Tn> are all
+  // instances of C<T0, ..., Tn> and C<U0, ..., Un> at G has type parameters
+  // <U0, ..., Un>.
+  //
+  // For trivially exact types we can simply compare type argument
+  // vectors as pointers to check exactness. That's why we represent
+  // trivially exact locations as offset in words to the type arguments of
+  // class C. All other states are represented as non-positive values.
+  //
+  // Note: we are ignoring the type argument vector sharing optimization for
+  // now.
+  static inline StaticTypeExactnessState TriviallyExact(
+      intptr_t type_arguments_offset) {
+    ASSERT((type_arguments_offset > 0) &&
+           Utils::IsAligned(type_arguments_offset, kWordSize) &&
+           Utils::IsInt(8, type_arguments_offset / kWordSize));
+    return StaticTypeExactnessState(type_arguments_offset / kWordSize);
+  }
+
+  static inline bool CanRepresentAsTriviallyExact(
+      intptr_t type_arguments_offset) {
+    return Utils::IsInt(8, type_arguments_offset / kWordSize);
+  }
+
+  // Values stored in the location with static type G<T0, ..., Tn> are all
+  // instances of class C<...> and C<U0, ..., Un> at G has type
+  // parameters <T0, ..., Tn> for any <U0, ..., Un> - that is C<...> has a
+  // supertype G<T0, ..., Tn>.
+  //
+  // For such locations we can simply check if the value stored
+  // is an instance of an expected class and we don't have to look at
+  // type arguments carried by the instance.
+  //
+  // We distinguish situations where we know that G is a superclass of C from
+  // situations where G might be superinterface of C - because in the first
+  // type arguments of G give us constant prefix of type arguments of C.
+  static inline StaticTypeExactnessState HasExactSuperType() {
+    return StaticTypeExactnessState(kHasExactSuperType);
+  }
+
+  static inline StaticTypeExactnessState HasExactSuperClass() {
+    return StaticTypeExactnessState(kHasExactSuperClass);
+  }
+
+  // Values stored in the location don't fall under either kIsTriviallyExact
+  // or kHasExactSuperType categories.
+  //
+  // Note: that does not imply that static type annotation is not exact
+  // according to a broader definition, e.g. location might simply be
+  // polymorphic and store instances of multiple different types.
+  // However for simplicity we don't track such cases yet.
+  static inline StaticTypeExactnessState NotExact() {
+    return StaticTypeExactnessState(kNotExact);
+  }
+
+  // The location does not track exactness of its static type at runtime.
+  static inline StaticTypeExactnessState NotTracking() {
+    return StaticTypeExactnessState(kNotTracking);
+  }
+
+  static inline StaticTypeExactnessState Unitialized() {
+    return StaticTypeExactnessState(kUninitialized);
+  }
+
+  bool IsTracking() const { return value_ != kNotTracking; }
+  bool IsUninitialized() const { return value_ == kUninitialized; }
+  bool IsHasExactSuperClass() const { return value_ == kHasExactSuperClass; }
+  bool IsHasExactSuperType() const { return value_ == kHasExactSuperType; }
+  bool IsTriviallyExact() const { return value_ > kUninitialized; }
+  bool NeedsFieldGuard() const { return value_ >= kUninitialized; }
+  bool IsExactOrUninitialized() const { return value_ > kNotExact; }
+
+  static inline StaticTypeExactnessState Decode(int8_t value) {
+    return StaticTypeExactnessState(value);
+  }
+
+  int8_t Encode() const { return value_; }
+
+  static constexpr int8_t kUninitialized = 0;
+
+ private:
+  static constexpr int8_t kNotTracking = -4;
+  static constexpr int8_t kNotExact = -3;
+  static constexpr int8_t kHasExactSuperType = -2;
+  static constexpr int8_t kHasExactSuperClass = -1;
+
+  explicit StaticTypeExactnessState(int8_t value) : value_(value) {}
+
+  const int8_t value_;
+
+  DISALLOW_ALLOCATION();
+};
+
 class Field : public Object {
  public:
   RawField* Original() const;
@@ -3297,6 +3416,19 @@
         HasInitializerBit::update(has_initializer, raw_ptr()->kind_bits_));
   }
 
+  StaticTypeExactnessState static_type_exactness_state() const {
+    return StaticTypeExactnessState::Decode(
+        raw_ptr()->static_type_exactness_state_);
+  }
+
+  void set_static_type_exactness_state(StaticTypeExactnessState state) const {
+    StoreNonPointer(&raw_ptr()->static_type_exactness_state_, state.Encode());
+  }
+
+  static intptr_t static_type_exactness_state_offset() {
+    return OFFSET_OF(RawField, static_type_exactness_state_);
+  }
+
   // Return class id that any non-null value read from this field is guaranteed
   // to have or kDynamicCid if such class id is not known.
   // Stores to this field must update this information hence the name.
@@ -3467,6 +3599,11 @@
   // deoptimization of dependent code is required.
   bool UpdateGuardedCidAndLength(const Object& value) const;
 
+  // Update guarded exactness state for this field. Returns true, if
+  // deoptimization of dependent code is required.
+  // Assumes that guarded cid was already updated.
+  bool UpdateGuardedExactnessState(const Object& value) const;
+
   // Force this field's guard to be dynamic and deoptimize dependent code.
   void ForceDynamicGuardedCidAndLength() const;
 
@@ -4374,6 +4511,7 @@
     }
     return entry;
   }
+
   static uword EntryPoint(const RawInstructions* instr) {
     uword entry = PayloadStart(instr);
     if (!HasSingleEntryPoint(instr)) {
@@ -4382,6 +4520,10 @@
     return entry;
   }
 
+  static uword UncheckedEntryPoint(const RawInstructions* instr) {
+    return PayloadStart(instr) + instr->ptr()->unchecked_entrypoint_pc_offset_;
+  }
+
   static const intptr_t kMaxElements =
       (kMaxInt32 - (sizeof(RawInstructions) + sizeof(RawObject) +
                     (2 * OS::kMaxPreferredCodeAlignment)));
@@ -4434,6 +4576,10 @@
 #endif
   }
 
+  uword unchecked_entrypoint_pc_offset() const {
+    return raw_ptr()->unchecked_entrypoint_pc_offset_;
+  }
+
  private:
   void SetSize(intptr_t value) const {
     ASSERT(value >= 0);
@@ -4446,11 +4592,17 @@
                     FlagsBits::update(value, raw_ptr()->size_and_flags_));
   }
 
+  void set_unchecked_entrypoint_pc_offset(uword value) const {
+    StoreNonPointer(&raw_ptr()->unchecked_entrypoint_pc_offset_, value);
+  }
+
   // New is a private method as RawInstruction and RawCode objects should
   // only be created using the Code::FinalizeCode method. This method creates
   // the RawInstruction and RawCode objects, sets up the pointer offsets
   // and links the two in a GC safe manner.
-  static RawInstructions* New(intptr_t size, bool has_single_entry_point);
+  static RawInstructions* New(intptr_t size,
+                              bool has_single_entry_point,
+                              uword unchecked_entrypoint_pc_offset);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object);
   friend class Class;
@@ -4819,11 +4971,23 @@
     return OFFSET_OF(RawCode, instructions_);
   }
 
-  static intptr_t entry_point_offset() {
-    return OFFSET_OF(RawCode, entry_point_);
-  }
-  static intptr_t monomorphic_entry_point_offset() {
-    return OFFSET_OF(RawCode, monomorphic_entry_point_);
+  enum class EntryKind {
+    kNormal,
+    kUnchecked,
+    kMonomorphic,
+  };
+
+  static intptr_t entry_point_offset(EntryKind kind = EntryKind::kNormal) {
+    switch (kind) {
+      case EntryKind::kNormal:
+        return OFFSET_OF(RawCode, entry_point_);
+      case EntryKind::kUnchecked:
+        return OFFSET_OF(RawCode, unchecked_entry_point_);
+      case EntryKind::kMonomorphic:
+        return OFFSET_OF(RawCode, monomorphic_entry_point_);
+      default:
+        UNREACHABLE();
+    }
   }
 
   RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
@@ -5084,10 +5248,12 @@
   }
 #if !defined(DART_PRECOMPILED_RUNTIME)
   static RawCode* FinalizeCode(const Function& function,
+                               FlowGraphCompiler* compiler,
                                Assembler* assembler,
                                bool optimized = false,
                                CodeStatistics* stats = nullptr);
   static RawCode* FinalizeCode(const char* name,
+                               FlowGraphCompiler* compiler,
                                Assembler* assembler,
                                bool optimized,
                                CodeStatistics* stats = nullptr);
@@ -5140,6 +5306,14 @@
 
   bool IsDisabled() const { return instructions() != active_instructions(); }
 
+  uword unchecked_entry_point() const {
+    return raw_ptr()->unchecked_entry_point_;
+  }
+
+  void set_unchecked_entry_point(uword value) const {
+    StoreNonPointer(&raw_ptr()->unchecked_entry_point_, value);
+  }
+
  private:
   void set_state_bits(intptr_t bits) const;
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 920aa33..060c1c5 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2621,7 +2621,8 @@
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
-  Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
+  Code& code =
+      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
   function.AttachCode(code);
   const Instructions& instructions = Instructions::Handle(code.instructions());
   uword payload_start = instructions.PayloadStart();
@@ -2641,7 +2642,8 @@
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
-  Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
+  Code& code =
+      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
   function.AttachCode(code);
   Instructions& instructions = Instructions::Handle(code.instructions());
   uword payload_start = instructions.PayloadStart();
@@ -2667,7 +2669,8 @@
   GenerateEmbedStringInCode(&_assembler_, kHello);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedStringInCode"));
-  const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
   function.AttachCode(code);
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
@@ -2688,7 +2691,8 @@
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiInCode"));
-  const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
   function.AttachCode(code);
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
@@ -2704,7 +2708,8 @@
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
-  const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
   function.AttachCode(code);
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
@@ -2732,7 +2737,7 @@
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCode(
-      Function::Handle(CreateFunction("Test_Code")), &_assembler_));
+      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_));
   code.set_exception_handlers(exception_handlers);
 
   // Verify the exception handler table entries by accessing them.
@@ -2772,7 +2777,7 @@
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCode(
-      Function::Handle(CreateFunction("Test_Code")), &_assembler_));
+      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_));
   code.set_pc_descriptors(descriptors);
 
   // Verify the PcDescriptor entries by accessing them.
@@ -2833,7 +2838,7 @@
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCode(
-      Function::Handle(CreateFunction("Test_Code")), &_assembler_));
+      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_));
   code.set_pc_descriptors(descriptors);
 
   // Verify the PcDescriptor entries by accessing them.
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 24a67c7..17b21ad 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -17,6 +17,8 @@
 #include <fuchsia/timezone/cpp/fidl.h>
 
 #include "lib/component/cpp/environment_services.h"
+#include "lib/component/cpp/startup_context.h"
+#include "lib/svc/cpp/services.h"
 
 #include "platform/assert.h"
 #include "vm/zone.h"
@@ -40,11 +42,17 @@
   return static_cast<intptr_t>(getpid());
 }
 
+// TODO(FL-98): Change this to talk to fuchsia.dart to get timezone service to
+// directly get timezone.
+//
+// Putting this hack right now due to CP-120 as I need to remove
+// component:ConnectToEnvironmentServices and this is the only thing that is
+// blocking it and FL-98 will take time.
+static fuchsia::timezone::TimezoneSyncPtr tz;
+
 static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
                                                  int32_t* local_offset,
                                                  int32_t* dst_offset) {
-  fuchsia::timezone::TimezoneSyncPtr tz;
-  component::ConnectToEnvironmentService(tz.NewRequest());
   zx_status_t status = tz->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
                                                     local_offset, dst_offset);
   if (status != ZX_OK) {
@@ -58,8 +66,6 @@
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
   // TODO(abarth): Handle time zone changes.
   static const auto* tz_name = new std::string([] {
-    fuchsia::timezone::TimezoneSyncPtr tz;
-    component::ConnectToEnvironmentService(tz.NewRequest());
     fidl::StringPtr result;
     tz->GetTimezoneId(&result);
     return *result;
@@ -255,6 +261,10 @@
   static bool init_once_called = false;
   ASSERT(init_once_called == false);
   init_once_called = true;
+  auto environment_services = std::make_shared<component::Services>();
+  auto env_service_root = component::subtle::CreateStaticServiceRootHandle();
+  environment_services->Bind(std::move(env_service_root));
+  environment_services->ConnectToService(tz.NewRequest());
 }
 
 void OS::Shutdown() {}
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index edd8688..5cfa65a 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -179,6 +179,7 @@
       current_context_var_(NULL),
       arg_desc_var_(NULL),
       expression_temp_var_(NULL),
+      entry_points_temp_var_(NULL),
       finally_return_temp_var_(NULL),
       deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
       guarded_fields_(new ZoneGrowableArray<const Field*>()),
@@ -271,6 +272,18 @@
   return expression_temp_var();
 }
 
+LocalVariable* ParsedFunction::EnsureEntryPointsTemp() {
+  if (!has_entry_points_temp_var()) {
+    LocalVariable* temp = new (Z)
+        LocalVariable(function_.token_pos(), function_.token_pos(),
+                      Symbols::EntryPointsTemp(), Object::dynamic_type());
+    ASSERT(temp != NULL);
+    set_entry_points_temp_var(temp);
+  }
+  ASSERT(has_entry_points_temp_var());
+  return entry_points_temp_var();
+}
+
 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) {
   if (!has_finally_return_temp_var()) {
     LocalVariable* temp =
@@ -658,7 +671,6 @@
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
   Thread* thread = Thread::Current();
-  ASSERT(thread->long_jump_base()->IsSafeToJump());
   CSTAT_TIMER_SCOPE(thread, parser_timer);
 #ifndef PRODUCT
   VMTagScope tagScope(thread, VMTag::kCompileTopLevelTagId);
@@ -996,14 +1008,12 @@
   }
 #endif
   if (!cls.is_synthesized_class()) {
-    ASSERT(thread->long_jump_base()->IsSafeToJump());
     CSTAT_TIMER_SCOPE(thread, parser_timer);
     const Script& script = Script::Handle(zone, cls.script());
     const Library& lib = Library::Handle(zone, cls.library());
     Parser parser(script, lib, cls.token_pos());
     parser.ParseClassDefinition(cls);
   } else if (cls.is_enum_class()) {
-    ASSERT(thread->long_jump_base()->IsSafeToJump());
     CSTAT_TIMER_SCOPE(thread, parser_timer);
     const Script& script = Script::Handle(zone, cls.script());
     const Library& lib = Library::Handle(zone, cls.library());
@@ -1152,7 +1162,6 @@
   TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
                             "ParseFunction");
 #endif  // !PRODUCT
-  ASSERT(thread->long_jump_base()->IsSafeToJump());
   ASSERT(parsed_function != NULL);
   const Function& func = parsed_function->function();
   const Script& script = Script::Handle(zone, func.script());
@@ -6086,7 +6095,9 @@
   result_type.SetScopeFunction(func);
   func.set_end_token_pos(function_end_pos);
   func.set_modifier(func_modifier);
-  if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
+  if (library_.is_dart_scheme() &&
+      (library_.IsPrivate(func_name) ||
+       library_.raw() == Library::InternalLibrary())) {
     func.set_is_reflectable(false);
   }
   if (is_native) {
@@ -11745,6 +11756,11 @@
                                   InvocationMirror::kMethod,
                                   NULL,  // No existing function.
                                   prefix);
+  } else if (cls.IsTopLevel() &&
+             (cls.library() == Library::InternalLibrary()) &&
+             (func.name() == Symbols::UnsafeCast().raw())) {
+    ASSERT(num_arguments == 1);
+    return arguments->NodeAt(0);
   } else if (cls.IsTopLevel() && (cls.library() == Library::CoreLibrary()) &&
              (func.name() == Symbols::Identical().raw()) &&
              func_type_args.IsNull()) {
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 4e9d40b..2383ce2 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -157,6 +157,18 @@
   }
   bool has_expression_temp_var() const { return expression_temp_var_ != NULL; }
 
+  LocalVariable* entry_points_temp_var() const {
+    ASSERT(has_entry_points_temp_var());
+    return entry_points_temp_var_;
+  }
+  void set_entry_points_temp_var(LocalVariable* value) {
+    ASSERT(!has_entry_points_temp_var());
+    entry_points_temp_var_ = value;
+  }
+  bool has_entry_points_temp_var() const {
+    return entry_points_temp_var_ != NULL;
+  }
+
   LocalVariable* finally_return_temp_var() const {
     ASSERT(has_finally_return_temp_var());
     return finally_return_temp_var_;
@@ -171,6 +183,7 @@
   void EnsureFinallyReturnTemp(bool is_async);
 
   LocalVariable* EnsureExpressionTemp();
+  LocalVariable* EnsureEntryPointsTemp();
 
   bool HasDeferredPrefixes() const { return deferred_prefixes_->length() != 0; }
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes() const {
@@ -232,6 +245,7 @@
   LocalVariable* current_context_var_;
   LocalVariable* arg_desc_var_;
   LocalVariable* expression_temp_var_;
+  LocalVariable* entry_points_temp_var_;
   LocalVariable* finally_return_temp_var_;
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
   ZoneGrowableArray<const Field*>* guarded_fields_;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index ba4587d..dc6bcc9 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -901,6 +901,7 @@
   static bool CheckUsageCounter(RawFunction* raw_fun);
 
   uword entry_point_;  // Accessed from generated code.
+  uword unchecked_entry_point_;  // Accessed from generated code.
 
   VISIT_FROM(RawObject*, name_);
   RawString* name_;
@@ -1080,6 +1081,11 @@
   // generated on platforms with weak addressing modes (ARM).
   int8_t guarded_list_length_in_object_offset_;
 
+  // Runtime tracking state of exactness of type annotation of this field.
+  // See StaticTypeExactnessState for the meaning and possible values in this
+  // field.
+  int8_t static_type_exactness_state_;
+
   uint8_t kind_bits_;  // static, final, const, has initializer....
 
   friend class CidRewriteVisitor;
@@ -1261,6 +1267,37 @@
   // caller if they mismatch.
   uword monomorphic_entry_point_;  // Accessed from generated code (AOT only).
 
+  // Entry-point used from call-sites with some additional static information.
+  // The exact behavior of this entry-point depends on the kind of function:
+  //
+  // kRegularFunction/kSetter/kGetter:
+  //
+  //   Call-site is assumed to know that the (type) arguments are invariantly
+  //   type-correct against the actual runtime-type of the receiver. For
+  //   instance, this entry-point is used for invocations against "this" and
+  //   invocations from IC stubs that test the class type arguments.
+  //
+  // kClosureFunction:
+  //
+  //   Call-site is assumed to pass the correct number of positional and type
+  //   arguments (except in the case of partial instantiation, when the type
+  //   arguments are omitted). All (type) arguments are assumed to match the
+  //   corresponding (type) parameter types (bounds).
+  //
+  // kImplicitClosureFunction:
+  //
+  //   Similar to kClosureFunction, except that the types (bounds) of the (type)
+  //   arguments are expected to match the *runtime signature* of the closure,
+  //   which (unlike with kClosureFunction) may have more general (type)
+  //   parameter types (bounds) than the declared type of the forwarded method.
+  //
+  // In many cases a distinct static entry-point will not be created for a
+  // function if it would not be able to skip a lot of work (e.g., no argument
+  // type checks are necessary or this Code belongs to a stub). In this case
+  // 'unchecked_entry_point_' will refer to the same position as 'entry_point_'.
+  //
+  uword unchecked_entry_point_;  // Accessed from generated code.
+
   VISIT_FROM(RawObject*, object_pool_);
   RawObjectPool* object_pool_;     // Accessed from generated code.
   RawInstructions* instructions_;  // Accessed from generated code.
@@ -1361,6 +1398,8 @@
   CodeStatistics* stats_;
 #endif
 
+  uword unchecked_entrypoint_pc_offset_;
+
   // Variable length data follows here.
   uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 288f9f1..279d28e 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -881,6 +881,8 @@
       TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
   field.set_guarded_cid(reader->Read<int32_t>());
   field.set_is_nullable(reader->Read<int32_t>());
+  field.set_static_type_exactness_state(
+      StaticTypeExactnessState::Decode(reader->Read<int8_t>()));
 #if !defined(DART_PRECOMPILED_RUNTIME)
   field.set_kernel_offset(reader->Read<int32_t>());
 #endif
@@ -896,6 +898,8 @@
     field.set_is_nullable(true);
     field.set_guarded_list_length(Field::kNoFixedLength);
     field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
+    field.set_static_type_exactness_state(
+        StaticTypeExactnessState::NotTracking());
   } else {
     field.InitializeGuardedListLengthInObjectOffset();
   }
@@ -922,6 +926,7 @@
   writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode());
   writer->Write<int32_t>(ptr()->guarded_cid_);
   writer->Write<int32_t>(ptr()->is_nullable_);
+  writer->Write<int32_t>(ptr()->static_type_exactness_state_);
 #if !defined(DART_PRECOMPILED_RUNTIME)
   writer->Write<int32_t>(ptr()->kernel_offset_);
 #endif
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index c7b3412..1087bb6 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1877,15 +1877,7 @@
       isolate->reload_every_n_stack_overflow_checks();
   if ((FLAG_deoptimize_every > 0) || (FLAG_stacktrace_every > 0) ||
       (isolate_reload_every > 0)) {
-    bool is_auxiliary_isolate = ServiceIsolate::IsServiceIsolate(isolate);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    // Certain flags should not effect the kernel isolate itself.  They might be
-    // used by tests via the "VMOptions=--..." annotation to test VM
-    // functionality in the main isolate.
-    is_auxiliary_isolate =
-        is_auxiliary_isolate || KernelIsolate::IsKernelIsolate(isolate);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    if (!is_auxiliary_isolate) {
+    if (!Isolate::IsVMInternalIsolate(isolate)) {
       // TODO(turnidge): To make --deoptimize_every and
       // --stacktrace-every faster we could move this increment/test to
       // the generated code.
@@ -2444,10 +2436,10 @@
   HANDLESCOPE(thread);
 
   // All registers have been saved below last-fp as if they were locals.
-  const uword last_fp = saved_registers_address +
-                        (kNumberOfSavedCpuRegisters * kWordSize) +
-                        (kNumberOfSavedFpuRegisters * kFpuRegisterSize) -
-                        ((kFirstLocalSlotFromFp + 1) * kWordSize);
+  const uword last_fp =
+      saved_registers_address + (kNumberOfSavedCpuRegisters * kWordSize) +
+      (kNumberOfSavedFpuRegisters * kFpuRegisterSize) -
+      ((runtime_frame_layout.first_local_from_fp + 1) * kWordSize);
 
   // Get optimized code and frame that need to be deoptimized.
   DartFrameIterator iterator(last_fp, thread,
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 8351e9f..18f2751 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -931,7 +931,7 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
-  ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(isolate));
+  ASSERT(!Isolate::IsVMInternalIsolate(isolate));
 
   if (FLAG_trace_service) {
     OS::PrintErr(
diff --git a/runtime/vm/service_event.cc b/runtime/vm/service_event.cc
index 7105528..5822378 100644
--- a/runtime/vm/service_event.cc
+++ b/runtime/vm/service_event.cc
@@ -33,8 +33,7 @@
       timestamp_(OS::GetCurrentTimeMillis()) {
   // We should never generate events for the vm or service isolates.
   ASSERT(isolate_ != Dart::vm_isolate());
-  ASSERT(isolate == NULL ||
-         !ServiceIsolate::IsServiceIsolateDescendant(isolate_));
+  ASSERT(isolate == NULL || !Isolate::IsVMInternalIsolate(isolate));
 
   if ((event_kind == ServiceEvent::kPauseStart) ||
       (event_kind == ServiceEvent::kPauseExit)) {
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index f98e02f..607f8b5 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -194,7 +194,7 @@
   }
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
-  if (IsServiceIsolateDescendant(isolate)) {
+  if (Isolate::IsVMInternalIsolate(isolate)) {
     return false;
   }
   ASSERT(isolate != NULL);
@@ -219,7 +219,7 @@
   }
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
-  if (IsServiceIsolateDescendant(isolate)) {
+  if (Isolate::IsVMInternalIsolate(isolate)) {
     return false;
   }
   ASSERT(isolate != NULL);
diff --git a/runtime/vm/service_isolate.h b/runtime/vm/service_isolate.h
index 8ae8fd7..5759658 100644
--- a/runtime/vm/service_isolate.h
+++ b/runtime/vm/service_isolate.h
@@ -78,6 +78,7 @@
   static char* server_address_;
 
   friend class Dart;
+  friend class Isolate;
   friend class RunServiceTask;
   friend class ServiceIsolateNatives;
 };
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index f61af66..4f6a19f 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -683,7 +683,6 @@
   break_pc_ = NULL;
   break_instr_ = 0;
   last_setjmp_buffer_ = NULL;
-  top_exit_frame_info_ = 0;
 
   // Setup architecture state.
   // All registers are initialized to zero to start with.
@@ -1387,13 +1386,6 @@
         if (IsTracingExecution()) {
           THR_Print("Call to host function at 0x%" Pd "\n", external);
         }
-
-        if ((redirection->call_kind() == kRuntimeCall) ||
-            (redirection->call_kind() == kBootstrapNativeCall) ||
-            (redirection->call_kind() == kNativeCall)) {
-          // Set the top_exit_frame_info of this simulator to the native stack.
-          set_top_exit_frame_info(OSThread::GetCurrentStackPointer());
-        }
         if (redirection->call_kind() == kRuntimeCall) {
           NativeArguments arguments;
           ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -1467,7 +1459,6 @@
           set_register(R0, icount_);  // Zap result register from void function.
           set_register(R1, icount_);
         }
-        set_top_exit_frame_info(0);
 
         // Zap caller-saved registers, since the actual runtime call could have
         // used them.
@@ -1494,7 +1485,6 @@
         set_pc(saved_lr);
       } else {
         // Coming via long jump from a throw. Continue to exception handler.
-        set_top_exit_frame_info(0);
       }
 
       break;
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index ad94b25..7064ebb 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -85,12 +85,6 @@
   // Accessor to the instruction counter.
   uint64_t get_icount() const { return icount_; }
 
-  // The thread's top_exit_frame_info refers to a Dart frame in the simulator
-  // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
-  // native stack.
-  uword top_exit_frame_info() const { return top_exit_frame_info_; }
-  void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
-
   // Call on program start.
   static void InitOnce();
 
@@ -160,7 +154,6 @@
   uint64_t icount_;
   static int32_t flag_stop_sim_at_;
   SimulatorSetjmpBuffer* last_setjmp_buffer_;
-  uword top_exit_frame_info_;
 
   // Registered breakpoints.
   Instr* break_pc_;
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 51ac7bb..e38c939 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -732,7 +732,6 @@
   break_pc_ = NULL;
   break_instr_ = 0;
   last_setjmp_buffer_ = NULL;
-  top_exit_frame_info_ = 0;
 
   // Setup architecture state.
   // All registers are initialized to zero to start with.
@@ -1543,12 +1542,6 @@
       THR_Print("Call to host function at 0x%" Pd "\n", external);
     }
 
-    if ((redirection->call_kind() == kRuntimeCall) ||
-        (redirection->call_kind() == kBootstrapNativeCall) ||
-        (redirection->call_kind() == kNativeCall)) {
-      // Set the top_exit_frame_info of this simulator to the native stack.
-      set_top_exit_frame_info(OSThread::GetCurrentStackPointer());
-    }
     if (redirection->call_kind() == kRuntimeCall) {
       NativeArguments* arguments =
           reinterpret_cast<NativeArguments*>(get_register(R0));
@@ -1611,7 +1604,6 @@
       set_register(instr, R0, icount_);
       set_register(instr, R1, icount_);
     }
-    set_top_exit_frame_info(0);
 
     // Zap caller-saved registers, since the actual runtime call could have
     // used them.
@@ -1640,7 +1632,6 @@
     set_pc(saved_lr);
   } else {
     // Coming via long jump from a throw. Continue to exception handler.
-    set_top_exit_frame_info(0);
   }
 }
 
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index f961b80..2b6ba4b 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -81,12 +81,6 @@
   // Accessor to the instruction counter.
   uint64_t get_icount() const { return icount_; }
 
-  // The thread's top_exit_frame_info refers to a Dart frame in the simulator
-  // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
-  // native stack.
-  uword top_exit_frame_info() const { return top_exit_frame_info_; }
-  void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
-
   // Call on program start.
   static void InitOnce();
 
@@ -147,7 +141,6 @@
   uint64_t icount_;
   static int64_t flag_stop_sim_at_;
   SimulatorSetjmpBuffer* last_setjmp_buffer_;
-  uword top_exit_frame_info_;
 
   // Registered breakpoints.
   Instr* break_pc_;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 243622a..2565564 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -563,7 +563,6 @@
   stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
 
   last_setjmp_buffer_ = NULL;
-  top_exit_frame_info_ = 0;
 
   DEBUG_ONLY(icount_ = 0);
 }
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index c0d0e79..85493c74 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -52,12 +52,6 @@
   // High address (DBC stack grows up).
   uword stack_limit() const { return stack_limit_; }
 
-  // The thread's top_exit_frame_info refers to a Dart frame in the simulator
-  // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
-  // native stack.
-  uword top_exit_frame_info() const { return top_exit_frame_info_; }
-  void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
-
   // Call on program start.
   static void InitOnce();
 
@@ -102,7 +96,6 @@
   DEBUG_ONLY(uint64_t icount_;)
 
   SimulatorSetjmpBuffer* last_setjmp_buffer_;
-  uword top_exit_frame_info_;
 
   RawObjectPool* pp_;  // Pool Pointer.
   RawArray* argdesc_;  // Arguments Descriptor: used to pass information between
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 0a6d92b..ee2f77c 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -21,31 +21,46 @@
 
 namespace dart {
 
-intptr_t FrameSlotForVariable(const LocalVariable* variable) {
+const FrameLayout invalid_frame_layout = {
+    /*.first_object_from_fp = */ -1,
+    /*.last_fixed_object_from_fp = */ -1,
+    /*.param_end_from_fp = */ -1,
+    /*.first_local_from_fp = */ -1,
+    /*.dart_fixed_frame_size = */ -1,
+    /*.saved_caller_pp_from_fp = */ -1,
+    /*.code_from_fp = */ -1,
+};
+
+const FrameLayout default_frame_layout = {
+    /*.first_object_from_fp = */ kFirstObjectSlotFromFp,
+    /*.last_fixed_object_from_fp = */ kLastFixedObjectSlotFromFp,
+    /*.param_end_from_fp = */ kParamEndSlotFromFp,
+    /*.first_local_from_fp = */ kFirstLocalSlotFromFp,
+    /*.dart_fixed_frame_size = */ kDartFrameFixedSize,
+    /*.saved_caller_pp_from_fp = */ kSavedCallerPpSlotFromFp,
+    /*.code_from_fp = */ kPcMarkerSlotFromFp,
+};
+
+FrameLayout compiler_frame_layout = invalid_frame_layout;
+FrameLayout runtime_frame_layout = invalid_frame_layout;
+
+int FrameLayout::FrameSlotForVariable(const LocalVariable* variable) const {
   ASSERT(!variable->is_captured());
-  return FrameSlotForVariableIndex(variable->index().value());
+  return this->FrameSlotForVariableIndex(variable->index().value());
 }
 
-intptr_t FrameOffsetInBytesForVariable(const LocalVariable* variable) {
-  return FrameSlotForVariable(variable) * kWordSize;
-}
-
-intptr_t FrameSlotForVariableIndex(intptr_t variable_index) {
+int FrameLayout::FrameSlotForVariableIndex(int variable_index) const {
   // Variable indices are:
   //    [1, 2, ..., M] for the M parameters.
   //    [0, -1, -2, ... -(N-1)] for the N [LocalVariable]s
   // See (runtime/vm/scopes.h)
-  return variable_index <= 0 ? (variable_index + kFirstLocalSlotFromFp)
-                             : (variable_index + kParamEndSlotFromFp);
+  return variable_index <= 0 ? (variable_index + first_local_from_fp)
+                             : (variable_index + param_end_from_fp);
 }
 
-intptr_t VariableIndexForFrameSlot(intptr_t frame_slot) {
-  if (frame_slot <= kFirstLocalSlotFromFp) {
-    return frame_slot - kFirstLocalSlotFromFp;
-  } else {
-    ASSERT(frame_slot > kParamEndSlotFromFp);
-    return frame_slot - kParamEndSlotFromFp;
-  }
+void FrameLayout::InitOnce() {
+  compiler_frame_layout = default_frame_layout;
+  runtime_frame_layout = default_frame_layout;
 }
 
 bool StackFrame::IsStubFrame() const {
@@ -95,15 +110,21 @@
   ASSERT(visitor != NULL);
   // Visit pc marker and saved pool pointer, or, for interpreted frame, code
   // object and function object.
-  RawObject** last_fixed = reinterpret_cast<RawObject**>(fp()) +
-                           (is_interpreted() ? kKBCLastFixedObjectSlotFromFp
-                                             : kFirstObjectSlotFromFp);
-  RawObject** first_fixed = reinterpret_cast<RawObject**>(fp()) +
-                            (is_interpreted() ? kKBCFirstObjectSlotFromFp
-                                              : kLastFixedObjectSlotFromFp);
+  RawObject** last_fixed =
+      reinterpret_cast<RawObject**>(fp()) +
+      (is_interpreted() ? kKBCLastFixedObjectSlotFromFp
+                        : runtime_frame_layout.first_object_from_fp);
+  RawObject** first_fixed =
+      reinterpret_cast<RawObject**>(fp()) +
+      (is_interpreted() ? kKBCFirstObjectSlotFromFp
+                        : runtime_frame_layout.last_fixed_object_from_fp);
 #if !defined(TARGET_ARCH_DBC)
-  ASSERT(first_fixed <= last_fixed);
-  visitor->VisitPointers(first_fixed, last_fixed);
+  if (first_fixed <= last_fixed) {
+    visitor->VisitPointers(first_fixed, last_fixed);
+  } else {
+    ASSERT(runtime_frame_layout.first_object_from_fp ==
+           runtime_frame_layout.first_local_from_fp);
+  }
 #else
   ASSERT(last_fixed <= first_fixed);
   visitor->VisitPointers(last_fixed, first_fixed);
@@ -161,7 +182,7 @@
       }
       RawObject** first = reinterpret_cast<RawObject**>(sp());
       RawObject** last = reinterpret_cast<RawObject**>(
-          fp() + (kFirstLocalSlotFromFp * kWordSize));
+          fp() + (runtime_frame_layout.first_local_from_fp * kWordSize));
 
       // A stack map is present in the code object, use the stack map to
       // visit frame slots which are marked as having objects.
@@ -199,17 +220,19 @@
 
       // Now visit other slots which might be part of the calling convention.
       first = reinterpret_cast<RawObject**>(
-          fp() + ((kFirstLocalSlotFromFp + 1) * kWordSize));
+          fp() + ((runtime_frame_layout.first_local_from_fp + 1) * kWordSize));
       last = reinterpret_cast<RawObject**>(
-          fp() + (kFirstObjectSlotFromFp * kWordSize));
+          fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
       visitor->VisitPointers(first, last);
 #else
       RawObject** first = reinterpret_cast<RawObject**>(fp());
       RawObject** last = reinterpret_cast<RawObject**>(sp());
 
       // Visit fixed prefix of the frame.
-      RawObject** first_fixed = first + kFirstObjectSlotFromFp;
-      RawObject** last_fixed = first + kLastFixedObjectSlotFromFp;
+      RawObject** first_fixed =
+          first + runtime_frame_layout.first_object_from_fp;
+      RawObject** last_fixed =
+          first + (runtime_frame_layout.first_object_from_fp + 1);
       ASSERT(first_fixed <= last_fixed);
       visitor->VisitPointers(first_fixed, last_fixed);
 
@@ -250,11 +273,13 @@
   RawObject** first = reinterpret_cast<RawObject**>(
       is_interpreted() ? fp() + (kKBCFirstObjectSlotFromFp * kWordSize) : sp());
   RawObject** last = reinterpret_cast<RawObject**>(
-      is_interpreted() ? sp() : fp() + (kFirstObjectSlotFromFp * kWordSize));
+      is_interpreted()
+          ? sp()
+          : fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
 #else
   // On DBC stack grows upwards: fp() <= sp().
   RawObject** first = reinterpret_cast<RawObject**>(
-      fp() + (kFirstObjectSlotFromFp * kWordSize));
+      fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
   RawObject** last = reinterpret_cast<RawObject**>(sp());
 #endif  // !defined(TARGET_ARCH_DBC)
 
@@ -295,9 +320,9 @@
 
 RawCode* StackFrame::UncheckedGetCodeObject() const {
   return *(reinterpret_cast<RawCode**>(
-      fp() +
-      ((is_interpreted() ? kKBCPcMarkerSlotFromFp : kPcMarkerSlotFromFp) *
-       kWordSize)));
+      fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
+                                : runtime_frame_layout.code_from_fp) *
+              kWordSize)));
 }
 
 bool StackFrame::FindExceptionHandler(Thread* thread,
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 8071323..92ceedb 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -32,21 +32,62 @@
 class RawContext;
 class LocalVariable;
 
-// Returns the FP-relative index where [variable] can be found (assumes
-// [variable] is not captured), in words.
-intptr_t FrameSlotForVariable(const LocalVariable* variable);
+struct FrameLayout {
+  // The offset (in words) from FP to the first object.
+  int first_object_from_fp;
 
-// Returns the FP-relative index where [variable] can be found (assumes
-// [variable] is not captured), in bytes.
-intptr_t FrameOffsetInBytesForVariable(const LocalVariable* variable);
+  // The offset (in words) from FP to the last fixed object.
+  int last_fixed_object_from_fp;
 
-// Returns the FP-relative index where [variable_index] can be found (assumes
-// [variable_index] comes from a [LocalVariable::index()], which is not
-// captured).
-intptr_t FrameSlotForVariableIndex(intptr_t variable_index);
+  // The offset (in words) from FP to the first local.
+  int param_end_from_fp;
 
-// Returns the variable index from a FP-relative index.
-intptr_t VariableIndexForFrameSlot(intptr_t frame_slot);
+  // The offset (in words) from FP to the first local.
+  int first_local_from_fp;
+
+  // The fixed size of the frame.
+  int dart_fixed_frame_size;
+
+  // The offset (in words) from FP to the saved pool (if applicable).
+  int saved_caller_pp_from_fp;
+
+  // The offset (in words) from FP to the code object (if applicable).
+  int code_from_fp;
+
+  // The number of fixed slots below the saved PC.
+  int saved_below_pc() const { return -first_local_from_fp; }
+
+  // Returns the FP-relative index where [variable] can be found (assumes
+  // [variable] is not captured), in words.
+  int FrameSlotForVariable(const LocalVariable* variable) const;
+
+  // Returns the FP-relative index where [variable_index] can be found (assumes
+  // [variable_index] comes from a [LocalVariable::index()], which is not
+  // captured).
+  int FrameSlotForVariableIndex(int index) const;
+
+  // Returns the FP-relative index where [variable] can be found (assumes
+  // [variable] is not captured), in bytes.
+  int FrameOffsetInBytesForVariable(const LocalVariable* variable) const {
+    return FrameSlotForVariable(variable) * kWordSize;
+  }
+
+  // Returns the variable index from a FP-relative index.
+  intptr_t VariableIndexForFrameSlot(intptr_t frame_slot) const {
+    if (frame_slot <= first_local_from_fp) {
+      return frame_slot - first_local_from_fp;
+    } else {
+      ASSERT(frame_slot > param_end_from_fp);
+      return frame_slot - param_end_from_fp;
+    }
+  }
+
+  // Called to initialize the stack frame layout during startup.
+  static void InitOnce();
+};
+
+extern FrameLayout compiler_frame_layout;
+extern FrameLayout runtime_frame_layout;
 
 // Generic stack frame.
 class StackFrame : public ValueObject {
@@ -61,8 +102,9 @@
   // The pool pointer is not implemented on all architectures.
   static int SavedCallerPpSlotFromFp() {
     // Never called on an interpreter frame.
-    if (kSavedCallerPpSlotFromFp != kSavedCallerFpSlotFromFp) {
-      return kSavedCallerPpSlotFromFp;
+    if (runtime_frame_layout.saved_caller_pp_from_fp !=
+        kSavedCallerFpSlotFromFp) {
+      return runtime_frame_layout.saved_caller_pp_from_fp;
     }
     UNREACHABLE();
     return 0;
@@ -98,9 +140,9 @@
 
   void set_pc_marker(RawCode* code) {
     *reinterpret_cast<RawCode**>(
-        fp() +
-        ((is_interpreted() ? kKBCPcMarkerSlotFromFp : kPcMarkerSlotFromFp) *
-         kWordSize)) = code;
+        fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
+                                  : runtime_frame_layout.code_from_fp) *
+                kWordSize)) = code;
   }
 
   // Visit objects in the frame.
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index de288dc..6ee2181 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -62,8 +62,8 @@
                             void (*GenerateStub)(Assembler* assembler)) {
   Assembler assembler;
   GenerateStub(&assembler);
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(name, &assembler, false /* optimized */));
+  const Code& code = Code::Handle(
+      Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */));
 #ifndef PRODUCT
   if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
     LogBlock lb;
@@ -144,7 +144,8 @@
     StubCode::GenerateAllocationStubForClass(&assembler, cls);
 
     if (thread->IsMutatorThread()) {
-      stub ^= Code::FinalizeCode(name, &assembler, false /* optimized */);
+      stub ^=
+          Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */);
       // Check if background compilation thread has not already added the stub.
       if (cls.allocation_stub() == Code::null()) {
         stub.set_owner(cls);
@@ -168,7 +169,8 @@
         // Do not Garbage collect during this stage and instead allow the
         // heap to grow.
         NoHeapGrowthControlScope no_growth_control;
-        stub ^= Code::FinalizeCode(name, &assembler, false /* optimized */);
+        stub ^= Code::FinalizeCode(name, nullptr, &assembler,
+                                   false /* optimized */);
         stub.set_owner(cls);
         cls.set_allocation_stub(stub);
       }
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 8febb63..c28d7c2 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -526,11 +526,14 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - R0);
   const intptr_t saved_exception_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - R0);
   const intptr_t saved_stacktrace_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R1);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - R1);
   // Result in R0 is preserved as part of pushing all registers below.
 
   // Push registers in their enumeration order: lowest register number at
@@ -597,11 +600,14 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);  // Pass last FP in R0.
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into R1.
-    __ ldr(R1, Address(FP, kFirstLocalSlotFromFp * kWordSize));
+    __ ldr(R1,
+           Address(FP, compiler_frame_layout.first_local_from_fp * kWordSize));
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore result into R1.
-    __ ldr(R1, Address(FP, kFirstLocalSlotFromFp * kWordSize));
-    __ ldr(R2, Address(FP, (kFirstLocalSlotFromFp - 1) * kWordSize));
+    __ ldr(R1,
+           Address(FP, compiler_frame_layout.first_local_from_fp * kWordSize));
+    __ ldr(R2, Address(FP, (compiler_frame_layout.first_local_from_fp - 1) *
+                               kWordSize));
   }
   // Code above cannot cause GC.
   __ RestoreCodePointer();
@@ -704,7 +710,7 @@
   // Load the receiver.
   __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
   __ add(IP, FP, Operand(R2, LSL, 1));  // R2 is Smi.
-  __ ldr(R8, Address(IP, kParamEndSlotFromFp * kWordSize));
+  __ ldr(R8, Address(IP, compiler_frame_layout.param_end_from_fp * kWordSize));
 
   // Preserve IC data and arguments descriptor.
   __ PushList((1 << R4) | (1 << R9));
@@ -2606,7 +2612,8 @@
   __ LeaveStubFrame();
 
   __ ldr(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ bx(R1);
 }
 
@@ -2645,7 +2652,8 @@
   __ LeaveStubFrame();
 
   __ ldr(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ bx(R1);
 }
 
@@ -2667,7 +2675,8 @@
   __ LeaveStubFrame();
 
   __ ldr(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ bx(R1);
 }
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 4310cc7..8e438bf 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -545,11 +545,14 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - R0);
   const intptr_t saved_exception_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - R0);
   const intptr_t saved_stacktrace_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R1);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - R1);
   // Result in R0 is preserved as part of pushing all registers below.
 
   // Push registers in their enumeration order: lowest register number at
@@ -609,11 +612,14 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into R1.
-    __ LoadFromOffset(R1, FP, kFirstLocalSlotFromFp * kWordSize);
+    __ LoadFromOffset(R1, FP,
+                      compiler_frame_layout.first_local_from_fp * kWordSize);
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore result into R1.
-    __ LoadFromOffset(R1, FP, kFirstLocalSlotFromFp * kWordSize);
-    __ LoadFromOffset(R2, FP, (kFirstLocalSlotFromFp - 1) * kWordSize);
+    __ LoadFromOffset(R1, FP,
+                      compiler_frame_layout.first_local_from_fp * kWordSize);
+    __ LoadFromOffset(
+        R2, FP, (compiler_frame_layout.first_local_from_fp - 1) * kWordSize);
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
@@ -720,7 +726,8 @@
   // Load the receiver.
   __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
-  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+  __ LoadFromOffset(R6, TMP,
+                    compiler_frame_layout.param_end_from_fp * kWordSize);
 
   // Preserve IC data and arguments descriptor.
   __ Push(R5);
@@ -2845,7 +2852,8 @@
   __ LeaveStubFrame();
 
   __ ldr(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ br(R1);
 }
 
@@ -2885,7 +2893,8 @@
   __ LeaveStubFrame();
 
   __ ldr(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ br(R1);
 }
 
@@ -2906,7 +2915,8 @@
   __ LeaveStubFrame();
 
   __ ldr(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                        Code::EntryKind::kMonomorphic)));
   __ br(R1);
 }
 
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 9436428..2f2495e 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -58,7 +58,7 @@
   Assembler assembler;
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -98,7 +98,7 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index f4ba65c..d7f44bc 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -58,7 +58,7 @@
   Assembler assembler;
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -98,7 +98,7 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 041d1c9..1743093 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -381,11 +381,14 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - EAX);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - EAX);
   const intptr_t saved_exception_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - EAX);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - EAX);
   const intptr_t saved_stacktrace_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - EDX);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - EDX);
   // Result in EAX is preserved as part of pushing all registers below.
 
   // Push registers in their enumeration order: lowest register number at
@@ -444,11 +447,14 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into EBX.
-    __ movl(EBX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
+    __ movl(EBX, Address(EBP, compiler_frame_layout.first_local_from_fp *
+                                  kWordSize));
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore result into EBX.
-    __ movl(EBX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
-    __ movl(ECX, Address(EBP, (kFirstLocalSlotFromFp - 1) * kWordSize));
+    __ movl(EBX, Address(EBP, compiler_frame_layout.first_local_from_fp *
+                                  kWordSize));
+    __ movl(ECX, Address(EBP, (compiler_frame_layout.first_local_from_fp - 1) *
+                                  kWordSize));
   }
   // Code above cannot cause GC.
   __ LeaveFrame();
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 35e8e64..4e1df07 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -58,7 +58,7 @@
   Assembler assembler;
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -102,7 +102,7 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 12d6446..79293ad 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -477,11 +477,14 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - RAX);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - RAX);
   const intptr_t saved_exception_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - RAX);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - RAX);
   const intptr_t saved_stacktrace_slot_from_fp =
-      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - RDX);
+      compiler_frame_layout.first_local_from_fp + 1 -
+      (kNumberOfCpuRegisters - RDX);
   // Result in RAX is preserved as part of pushing all registers below.
 
   // Push registers in their enumeration order: lowest register number at
@@ -546,12 +549,15 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into RBX.
-    __ movq(RBX, Address(RBP, kFirstLocalSlotFromFp * kWordSize));
+    __ movq(RBX, Address(RBP, compiler_frame_layout.first_local_from_fp *
+                                  kWordSize));
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore exception into RBX.
-    __ movq(RBX, Address(RBP, kFirstLocalSlotFromFp * kWordSize));
+    __ movq(RBX, Address(RBP, compiler_frame_layout.first_local_from_fp *
+                                  kWordSize));
     // Restore stacktrace into RDX.
-    __ movq(RDX, Address(RBP, (kFirstLocalSlotFromFp - 1) * kWordSize));
+    __ movq(RDX, Address(RBP, (compiler_frame_layout.first_local_from_fp - 1) *
+                                  kWordSize));
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
@@ -660,8 +666,8 @@
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   // Three words (saved pp, saved fp, stub's pc marker)
   // in the stack above the return address.
-  __ movq(RAX,
-          Address(RSP, RAX, TIMES_4, kSavedAboveReturnAddress * kWordSize));
+  __ movq(RAX, Address(RSP, RAX, TIMES_4,
+                       compiler_frame_layout.saved_below_pc() * kWordSize));
   // Preserve IC data and arguments descriptor.
   __ pushq(RBX);
   __ pushq(R10);
@@ -2787,7 +2793,8 @@
   __ LeaveStubFrame();
 
   __ movq(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ movq(RCX, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ movq(RCX, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                          Code::EntryKind::kMonomorphic)));
   __ jmp(RCX);
 }
 
@@ -2823,7 +2830,8 @@
   __ LeaveStubFrame();
 
   __ movq(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ movq(RCX, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ movq(RCX, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                          Code::EntryKind::kMonomorphic)));
   __ jmp(RCX);
 }
 
@@ -2844,7 +2852,8 @@
   __ LeaveStubFrame();
 
   __ movq(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset()));
-  __ movq(RCX, FieldAddress(CODE_REG, Code::monomorphic_entry_point_offset()));
+  __ movq(RCX, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                          Code::EntryKind::kMonomorphic)));
   __ jmp(RCX);
 }
 
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index 0e282f0..cc108ae 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -58,7 +58,7 @@
   Assembler assembler;
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -98,7 +98,7 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index c518679..bf63026 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -25,6 +25,7 @@
   V(TruncDivOperator, "~/")                                                    \
   V(UnaryMinus, "unary-")                                                      \
   V(Identical, "identical")                                                    \
+  V(UnsafeCast, "unsafeCast")                                                  \
   V(Length, "length")                                                          \
   V(_setLength, "_setLength")                                                  \
   V(IndexToken, "[]")                                                          \
@@ -60,6 +61,7 @@
   V(_DeletedEnumSentinel, "_deleted_enum_sentinel")                            \
   V(_DeletedEnumPrefix, "Deleted enum value from ")                            \
   V(ExprTemp, ":expr_temp")                                                    \
+  V(EntryPointsTemp, ":entry_points_temp")                                     \
   V(FinallyRetVal, ":finally_ret_val")                                         \
   V(AnonymousClosure, "<anonymous closure>")                                   \
   V(AnonymousSignature, "<anonymous signature>")                               \
@@ -459,9 +461,10 @@
   V(GrowRegExpStack, "_growRegExpStack")                                       \
   V(DebugProcedureName, ":Eval")                                               \
   V(DebugClassName, "#DebugClass")                                             \
-  V(vm_entry_point, "vm.entry-point")                                          \
+  V(vm_entry_point, "vm:entry-point")                                          \
   V(Get, "get")                                                                \
-  V(Set, "set")
+  V(Set, "set")                                                                \
+  V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn")
 
 // Contains a list of frequently used strings in a canonicalized form. This
 // list is kept in the vm_isolate in order to share the copy across isolates
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 46aad71..5ad3d6e 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -725,6 +725,12 @@
     safepoint_state_ =
         BlockedForSafepointField::update(value, safepoint_state_);
   }
+  bool BypassSafepoints() const {
+    return BypassSafepointsField::decode(safepoint_state_);
+  }
+  static uint32_t SetBypassSafepoints(bool value, uint32_t state) {
+    return BypassSafepointsField::update(value, state);
+  }
 
   enum ExecutionState {
     kThreadInVM = 0,
@@ -907,6 +913,7 @@
   class AtSafepointField : public BitField<uint32_t, bool, 0, 1> {};
   class SafepointRequestedField : public BitField<uint32_t, bool, 1, 1> {};
   class BlockedForSafepointField : public BitField<uint32_t, bool, 2, 1> {};
+  class BypassSafepointsField : public BitField<uint32_t, bool, 3, 1> {};
   uint32_t safepoint_state_;
   uint32_t execution_state_;
 
diff --git a/runtime/vm/thread_registry.cc b/runtime/vm/thread_registry.cc
index c7883af..220f32c 100644
--- a/runtime/vm/thread_registry.cc
+++ b/runtime/vm/thread_registry.cc
@@ -82,7 +82,9 @@
   MonitorLocker ml(threads_lock());
   Thread* thread = active_list_;
   while (thread != NULL) {
-    thread->PrepareForGC();
+    if (!thread->BypassSafepoints()) {
+      thread->PrepareForGC();
+    }
     thread = thread->next_;
   }
 }
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 3f0e4a1..da216ee 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -349,8 +349,8 @@
   BuildOptimizedTypeTestStub(&assembler, hi, type, type_class);
 
   const char* name = namer_.StubNameForType(type);
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(name, &assembler, false /* optimized */));
+  const Code& code = Code::Handle(
+      Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */));
 #ifndef PRODUCT
   if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
     LogBlock lb;
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 89c1883..1d125a0 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -758,7 +758,7 @@
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction, true, false,
                     false, false, false, cls, TokenPosition::kMinSource));
-  code_ = Code::FinalizeCode(function, assembler_);
+  code_ = Code::FinalizeCode(function, nullptr, assembler_);
   code_.set_owner(function);
   code_.set_exception_handlers(Object::empty_exception_handlers());
 #ifndef PRODUCT
diff --git a/samples-dev/swarm/SwarmApp.dart b/samples-dev/swarm/SwarmApp.dart
index 12d15c2..8513eb4 100644
--- a/samples-dev/swarm/SwarmApp.dart
+++ b/samples-dev/swarm/SwarmApp.dart
@@ -23,9 +23,7 @@
   /** Observable UI state. */
   SwarmState state;
 
-  Swarm({bool useCannedData: false})
-      : super(),
-        onLoadFired = false {
+  Swarm({bool useCannedData: false}) : onLoadFired = false {
     Sections.initializeFromUrl(useCannedData, (currSections) {
       sections = currSections;
       state = new SwarmState(sections);
diff --git a/samples-dev/swarm/SwarmState.dart b/samples-dev/swarm/SwarmState.dart
index 3ab5f11..2f6f76a 100644
--- a/samples-dev/swarm/SwarmState.dart
+++ b/samples-dev/swarm/SwarmState.dart
@@ -54,8 +54,7 @@
   BiIterator<Section> _sectionIterator;
 
   SwarmState(this._dataModel)
-      : super(),
-        currentArticle = new ObservableValue<Article>(null),
+      : currentArticle = new ObservableValue<Article>(null),
         selectedArticle = new ObservableValue<Article>(null),
         storyMaximized = new ObservableValue<bool>(false),
         storyTextMode = new ObservableValue<bool>(true) {
diff --git a/samples-dev/swarm/SwarmViews.dart b/samples-dev/swarm/SwarmViews.dart
index 9896317..442355a 100644
--- a/samples-dev/swarm/SwarmViews.dart
+++ b/samples-dev/swarm/SwarmViews.dart
@@ -55,8 +55,7 @@
   final Set previousPageKeyPresses;
 
   FrontView(this.swarm)
-      : super('front-view fullpage'),
-        downKeyPresses = new Set.from([74 /*j*/, 40 /*down*/]),
+      : downKeyPresses = new Set.from([74 /*j*/, 40 /*down*/]),
         upKeyPresses = new Set.from([75 /*k*/, 38 /*up*/]),
         rightKeyPresses = new Set.from([39 /*right*/, 68 /*d*/, 76 /*l*/]),
         leftKeyPresses = new Set.from([37 /*left*/, 65 /*a*/, 72 /*h*/]),
@@ -64,7 +63,8 @@
         backKeyPresses = new Set.from([8 /*delete*/, 27 /*escape*/]),
         nextPageKeyPresses = new Set.from([78 /*n*/]),
         previousPageKeyPresses = new Set.from([80 /*p*/]),
-        nextPrevShown = false {
+        nextPrevShown = false,
+        super('front-view fullpage') {
     topView = new CompositeView('top-view', false, false, false);
 
     headerView = new HeaderView(swarm);
@@ -324,7 +324,7 @@
 class SwarmBackButton extends View {
   Swarm swarm;
 
-  SwarmBackButton(this.swarm) : super();
+  SwarmBackButton(this.swarm);
 
   Element render() => new Element.html('<div class="back-arrow button"></div>');
 
@@ -470,7 +470,7 @@
 // TODO(rnystrom): We have nearly identical versions of this littered through
 // the sample apps. Should consolidate into one.
 class WebBackButton extends View {
-  WebBackButton() : super();
+  WebBackButton();
 
   Element render() {
     return new Element.html('<div class="web-back-button button"></div>');
@@ -493,7 +493,7 @@
 // TODO(rnystrom): We have nearly identical versions of this littered through
 // the sample apps. Should consolidate into one.
 class WebForwardButton extends View {
-  WebForwardButton() : super();
+  WebForwardButton();
 
   Element render() {
     return new Element.html('<div class="web-forward-button button"></div>');
@@ -572,9 +572,7 @@
   EventListeners onChanged;
   List<String> states;
 
-  ToggleButton(this.states)
-      : super(),
-        onChanged = new EventListeners();
+  ToggleButton(this.states) : onChanged = new EventListeners();
 
   Element render() => new Element.tag('button');
 
@@ -711,7 +709,7 @@
   final Swarm swarm;
   final ArticleViewLayout articleLayout;
 
-  ArticleView(this.item, this.swarm, this.articleLayout) : super();
+  ArticleView(this.item, this.swarm, this.articleLayout);
 
   Element render() {
     Element node;
@@ -853,7 +851,7 @@
 
   View _pagedStory;
 
-  StoryContentView(this.swarm, this.item) : super();
+  StoryContentView(this.swarm, this.item);
 
   get childViews => [_pagedStory];
 
@@ -906,9 +904,9 @@
   final PageState pageState;
 
   SectionView(this.swarm, this.section, this._viewFactory)
-      : super('section-view'),
-        loadingText = new View.html('<div class="loading-section"></div>'),
-        pageState = new PageState() {
+      : loadingText = new View.html('<div class="loading-section"></div>'),
+        pageState = new PageState(),
+        super('section-view') {
     addChild(loadingText);
   }
 
diff --git a/samples-dev/swarm/Views.dart b/samples-dev/swarm/Views.dart
index 3bd25cc..0360b06 100644
--- a/samples-dev/swarm/Views.dart
+++ b/samples-dev/swarm/Views.dart
@@ -51,7 +51,7 @@
  * elements.
  */
 class _PlaceholderView extends View {
-  _PlaceholderView() : super() {}
+  _PlaceholderView();
 
   Element render() => new Element.tag('div');
 }
@@ -146,8 +146,7 @@
       this._removeClippedViews,
       this._showScrollbar,
       this._pages)
-      : super(),
-        _activeInterval = new Interval(0, 0),
+      : _activeInterval = new Interval(0, 0),
         _itemViews = new Map<int, View>() {
     // TODO(rnystrom): Move this into enterDocument once we have an exitDocument
     // that we can use to unregister it.
@@ -930,7 +929,7 @@
 
 /** A back button that is equivalent to clicking "back" in the browser. */
 class BackButton extends View {
-  BackButton() : super();
+  BackButton();
 
   Element render() => new Element.html('<div class="back-arrow button"></div>');
 
@@ -946,7 +945,7 @@
   final String _cssClass;
   final _clickHandler;
 
-  PushButtonView(this._text, this._cssClass, this._clickHandler) : super();
+  PushButtonView(this._text, this._cssClass, this._clickHandler);
 
   Element render() {
     return new Element.html('<button class="${_cssClass}">${_text}</button>');
@@ -968,7 +967,7 @@
   Element container;
   PushButtonView _done;
 
-  DialogView(this._title, this._cssName, this._content) : super() {}
+  DialogView(this._title, this._cssName, this._content);
 
   Element render() {
     final node = new Element.html('''
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
index 3db8ceb..aacebb5 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
@@ -71,14 +71,14 @@
   Dimension _dimension;
 
   GridLayout(Positionable view)
-      : super(view),
-        rows = _GridTrackParser.parse(view.customStyle['grid-rows']),
+      : rows = _GridTrackParser.parse(view.customStyle['grid-rows']),
         columns = _GridTrackParser.parse(view.customStyle['grid-columns']),
         template = _GridTemplateParser.parse(view.customStyle['grid-template']),
         rowSizing = _GridTrackParser
             .parseTrackSizing(view.customStyle['grid-row-sizing']),
         columnSizing = _GridTrackParser
-            .parseTrackSizing(view.customStyle['grid-column-sizing']) {
+            .parseTrackSizing(view.customStyle['grid-column-sizing']),
+        super(view) {
     _rowTracks = rows != null ? rows.tracks : new List<GridTrack>();
     _columnTracks = columns != null ? columns.tracks : new List<GridTrack>();
   }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
index 9de7f97..dd3e08f 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
@@ -330,9 +330,9 @@
   final Map<String, int> _lineNames;
 
   _GridTrackParser._internal(String src)
-      : super(src),
-        _tracks = new List<GridTrack>(),
-        _lineNames = new Map<String, int>();
+      : _tracks = new List<GridTrack>(),
+        _lineNames = new Map<String, int>(),
+        super(src);
 
   /** Parses the grid-rows and grid-columns CSS properties into object form. */
   static GridTrackList parse(String str) {
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
index 67a5396..60d6d0b 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
@@ -41,9 +41,7 @@
   // we need to correctly track whether we're content sized during a layout
   bool _contentSized;
 
-  FixedSizing(this.length, [this.units = 'px'])
-      : super(),
-        _contentSized = false {
+  FixedSizing(this.length, [this.units = 'px']) : _contentSized = false {
     if (units != 'px' && units != '%') {
       // TODO(jmesserly): support other unit types
       throw new UnsupportedError('Units other than px and %');
@@ -80,7 +78,7 @@
  */
 class FractionSizing extends SizingFunction {
   final num fractionValue;
-  FractionSizing(this.fractionValue) : super() {}
+  FractionSizing(this.fractionValue);
 
   bool get isFraction => true;
 
@@ -88,7 +86,7 @@
 }
 
 class MinContentSizing extends SizingFunction {
-  const MinContentSizing() : super();
+  const MinContentSizing();
 
   bool get isMinContentSized => true;
 
@@ -96,7 +94,7 @@
 }
 
 class MaxContentSizing extends SizingFunction {
-  const MaxContentSizing() : super();
+  const MaxContentSizing();
 
   bool get isMaxContentSized {
     return true;
diff --git a/samples-dev/swarm/swarm_ui_lib/observable/observable.dart b/samples-dev/swarm/swarm_ui_lib/observable/observable.dart
index 6f48db9..00dcdd9 100644
--- a/samples-dev/swarm/swarm_ui_lib/observable/observable.dart
+++ b/samples-dev/swarm/swarm_ui_lib/observable/observable.dart
@@ -134,8 +134,8 @@
   List<T> _internal;
 
   ObservableList([Observable parent = null])
-      : super(parent),
-        _internal = new List<T>();
+      : _internal = new List<T>(),
+        super(parent);
 
   T operator [](int index) => _internal[index];
 
@@ -371,8 +371,8 @@
 /** A wrapper around a single value whose change can be observed. */
 class ObservableValue<T> extends AbstractObservable {
   ObservableValue(T value, [Observable parent = null])
-      : super(parent),
-        _value = value;
+      : _value = value,
+        super(parent);
 
   T get value => _value;
 
diff --git a/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart b/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart
index 85c3fe6..ad1fd84 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart
@@ -29,8 +29,7 @@
       scrollable = false,
       vertical = false,
       showScrollbar = false])
-      : super(),
-        _nestedContainer = nestedContainer,
+      : _nestedContainer = nestedContainer,
         _scrollable = scrollable,
         _vertical = vertical,
         _showScrollbar = showScrollbar,
diff --git a/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart b/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart
index 1f6c56f..d028eeb 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart
@@ -26,8 +26,8 @@
   Timer animationTimer;
 
   ConveyorView()
-      : super('conveyor-view', true),
-        animationTimer = null {}
+      : animationTimer = null,
+        super('conveyor-view', true) {}
 
   Element render() {
     final result = super.render();
diff --git a/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart b/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart
index 0fde729..8e39b1a 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart
@@ -20,8 +20,8 @@
   final PageState pages;
 
   PagedContentView(this.content)
-      : super('paged-content'),
-        pages = new PageState() {
+      : pages = new PageState(),
+        super('paged-content') {
     addChild(new PagedColumnView(pages, content));
     addChild(new PageNumberView(pages));
   }
@@ -33,7 +33,7 @@
   Element _label;
   Element _left, _right;
 
-  PageNumberView(this.pages) : super();
+  PageNumberView(this.pages);
 
   Element render() {
     // TODO(jmesserly): this was supposed to use the somewhat flatter unicode
@@ -95,7 +95,7 @@
   int _viewportSize;
   Scroller scroller;
 
-  PagedColumnView(this.pages, this.contentView) : super();
+  PagedColumnView(this.pages, this.contentView);
 
   Element render() {
     final node = new Element.html('''
diff --git a/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart b/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart
index f03712e..3d760b1 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart
@@ -30,7 +30,7 @@
 
   List<String> _menuItems;
 
-  SliderMenu(this._menuItems, this.onSelect) : super() {}
+  SliderMenu(this._menuItems, this.onSelect);
 
   Element render() {
     // Create a div for each menu item.
diff --git a/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart b/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
index e795b23..663b45b 100644
--- a/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
+++ b/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
@@ -210,9 +210,7 @@
   Function exitDocumentFn;
   List<View> childViews;
 
-  TestView()
-      : super(),
-        childViews = [] {
+  TestView() : childViews = [] {
     // Default behavior.
     renderFn = () => new Element.html('<div class="test"></div>');
     afterRenderFn = (node) {};
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 2a8e9b5..b657a32 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -14,6 +14,7 @@
 # fail.
 
 import("../build/dart/copy_tree.gni")
+import("../runtime/runtime_args.gni")
 
 declare_args() {
   # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries.
@@ -130,14 +131,18 @@
     "../utils/dartfmt",
   ],
   [
-    "kernel-service",
-    "../utils/kernel-service",
-  ],
-  [
     "pub",
     "../utils/pub",
   ],
 ]
+if (create_kernel_service_snapshot) {
+  _platform_sdk_snapshots += [
+    [
+      "kernel-service",
+      "../utils/kernel-service:kernel-service_snapshot",
+    ],
+  ]
+}
 
 _full_sdk_snapshots = [
   [
@@ -173,14 +178,18 @@
     "../utils/bazel:kernel_worker",
   ],
   [
-    "kernel-service",
-    "../utils/kernel-service",
-  ],
-  [
     "pub",
     "../utils/pub",
   ],
 ]
+if (create_kernel_service_snapshot) {
+  _full_sdk_snapshots += [
+    [
+      "kernel-service",
+      "../utils/kernel-service:kernel-service_snapshot",
+    ],
+  ]
+}
 
 # Libraries that go under lib/
 _full_sdk_libraries = [
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 5ef35ee..ba145e5 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -685,11 +685,7 @@
         }
       } else {
         // TODO(32956): Remove this test.
-        if (JS_GET_FLAG('STRONG_MODE')) {
-          _current = JS<T>('', '#', value);
-        } else {
-          _current = value;
-        }
+        _current = JS<T>('', '#', value);
         return true;
       }
     }
diff --git a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
index f10fb5b..9f82ae4 100644
--- a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
@@ -51,16 +51,9 @@
 @patch
 @NoInline()
 Object extractTypeArguments<T>(T instance, Function extract) {
-  // In Dart 2.0 this function is recognized and replaced with calls to
-  // js_runtime.
-  if (JS_GET_FLAG('STRONG_MODE')) throw new UnimplementedError();
+  // This function is recognized and replaced with calls to js_runtime.
 
-  // In Dart 1.0, instantiating the generic with dynamic (which this does),
-  // gives you an object that can be used anywhere a more specific type is
-  // expected, so this works for now.
-
-  // This call to [extract] is also required for Dart 2.0 to model that the
-  // function is called and the returned value flows to the result of
-  // extractTypeArguments.
+  // This call to [extract] is required to model that the function is called and
+  // the returned value flows to the result of extractTypeArguments.
   return extract();
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index e1f8946..2c01398 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -668,14 +668,9 @@
   /// In minified mode, uses the unminified names if available.
   @NoInline()
   static String objectTypeName(Object object) {
-    if (JS_GET_FLAG('STRONG_MODE')) {
-      String className = _objectClassName(object);
-      String arguments = joinArguments(getRuntimeTypeInfo(object), 0);
-      return '${className}${arguments}';
-    } else {
-      return formatType(
-          _objectRawTypeNameV1(object), getRuntimeTypeInfo(object));
-    }
+    String className = _objectClassName(object);
+    String arguments = joinArguments(getRuntimeTypeInfo(object), 0);
+    return '${className}${arguments}';
   }
 
   static String _objectClassName(Object object) {
@@ -744,73 +739,6 @@
     return unminifyOrTag(name);
   }
 
-  static String _objectRawTypeNameV1(Object object) {
-    var interceptor = getInterceptor(object);
-    // The interceptor is either an object (self-intercepting plain Dart class),
-    // the prototype of the constructor for an Interceptor class (like
-    // `JSString.prototype`, `JSNull.prototype`), or an Interceptor object
-    // instance (`const JSString()`, should use `JSString.prototype`).
-    //
-    // These all should have a `constructor` property with a `name` property.
-    String name;
-    var interceptorConstructor = JS('', '#.constructor', interceptor);
-    if (JS('bool', 'typeof # == "function"', interceptorConstructor)) {
-      var interceptorConstructorName = JS('', '#.name', interceptorConstructor);
-      if (interceptorConstructorName is String) {
-        name = interceptorConstructorName;
-      }
-    }
-
-    if (name == null ||
-        identical(interceptor, JS_INTERCEPTOR_CONSTANT(Interceptor)) ||
-        object is UnknownJavaScriptObject) {
-      // Try to do better.  If we do not find something better, leave the name
-      // as 'UnknownJavaScriptObject' or 'Interceptor' (or the minified name).
-      //
-      // When we get here via the UnknownJavaScriptObject test (for JavaScript
-      // objects from outside the program), the object's constructor has a
-      // better name that 'UnknownJavaScriptObject'.
-      //
-      // When we get here the Interceptor test (for Native classes that are
-      // declared in the Dart program but have been 'folded' into Interceptor),
-      // the native class's constructor name is better than the generic
-      // 'Interceptor' (an abstract class).
-
-      // Try the [constructorNameFallback]. This gets the constructor name for
-      // any browser (used by [getNativeInterceptor]).
-      String dispatchName = constructorNameFallback(object);
-      if (dispatchName == 'Object') {
-        // Try to decompile the constructor by turning it into a string and get
-        // the name out of that. If the decompiled name is a string containing
-        // an identifier, we use that instead of the very generic 'Object'.
-        var objectConstructor = JS('', '#.constructor', object);
-        if (JS('bool', 'typeof # == "function"', objectConstructor)) {
-          var match = JS('var', r'#.match(/^\s*function\s*([\w$]*)\s*\(/)',
-              JS('var', r'String(#)', objectConstructor));
-          var decompiledName = match == null ? null : JS('var', r'#[1]', match);
-          if (decompiledName is String &&
-              JS('bool', r'/^\w+$/.test(#)', decompiledName)) {
-            name = decompiledName;
-          }
-        }
-        if (name == null) name = dispatchName;
-      } else {
-        name = dispatchName;
-      }
-    }
-
-    // Type inference does not understand that [name] is now always a non-null
-    // String. (There is some imprecision in the negation of the disjunction.)
-    name = JS('String', '#', name);
-
-    // TODO(kasperl): If the namer gave us a fresh global name, we may
-    // want to remove the numeric suffix that makes it unique too.
-    if (name.length > 1 && identical(name.codeUnitAt(0), DOLLAR_CHAR_VALUE)) {
-      name = name.substring(1);
-    }
-    return name;
-  }
-
   /// In minified mode, uses the unminified names if available.
   static String objectToHumanReadableString(Object object) {
     String name = objectTypeName(object);
@@ -2886,11 +2814,7 @@
     String name =
         JS('String|Null', '#[#]', this, STATIC_FUNCTION_NAME_PROPERTY_NAME);
     if (name == null) return 'Closure of unknown static method';
-    if (JS_GET_FLAG('STRONG_MODE')) {
-      return "Closure '${unminifyOrTag(name)}'";
-    } else {
-      return "Closure '$name'";
-    }
+    return "Closure '${unminifyOrTag(name)}'";
   }
 }
 
@@ -3786,7 +3710,6 @@
 bool assertTest(condition) {
   // Do bool success check first, it is common and faster than 'is Function'.
   if (true == condition) return false;
-  if (condition is Function) condition = condition();
   if (condition is bool) return !condition;
   throw new TypeErrorImplementation(condition, 'bool');
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 952a846..ae207fb6 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -57,14 +57,7 @@
 
   String get _typeName => __typeName ??= runtimeTypeToString(_rti);
 
-  String toString() {
-    if (JS_GET_FLAG('STRONG_MODE')) {
-      return _typeName;
-    } else {
-      return _unmangledName ??=
-          unmangleAllIdentifiersIfPreservedAnyways(_typeName);
-    }
-  }
+  String toString() => _typeName;
 
   // TODO(ahe): This is a poor hashCode as it collides with its name.
   int get hashCode => _hashCode ??= _typeName.hashCode;
@@ -172,21 +165,10 @@
   return rawRtiToJsConstructorName(getRawRuntimeType(getInterceptor(object)));
 }
 
-/**
- * Creates the string representation for the type representation [rti]
- * of type 4, the JavaScript array, where the first element represents the class
- * and the remaining elements represent the type arguments.
- */
-String _getRuntimeTypeAsStringV1(var rti) {
-  assert(isJsArray(rti));
-  String className = rawRtiToJsConstructorName(getIndex(rti, 0));
-  return '$className${joinArgumentsV1(rti, 1)}';
-}
-
-String _getRuntimeTypeAsStringV2(var rti, List<String> genericContext) {
+String _getRuntimeTypeAsString(var rti, List<String> genericContext) {
   assert(isJsArray(rti));
   String className = unminifyOrTag(rawRtiToJsConstructorName(getIndex(rti, 0)));
-  return '$className${joinArgumentsV2(rti, 1, genericContext)}';
+  return '$className${_joinArguments(rti, 1, genericContext)}';
 }
 
 /// Returns a human-readable representation of the type representation [rti].
@@ -194,43 +176,10 @@
 /// Called from generated code.
 @NoInline()
 String runtimeTypeToString(var rti) {
-  return JS_GET_FLAG('STRONG_MODE')
-      ? runtimeTypeToStringV2(rti, null)
-      : runtimeTypeToStringV1(rti);
+  return _runtimeTypeToString(rti, null);
 }
 
-String runtimeTypeToStringV1(var rti) {
-  if (rti == null) {
-    return 'dynamic';
-  }
-  if (isJsArray(rti)) {
-    // A list representing a type with arguments.
-    return _getRuntimeTypeAsStringV1(rti);
-  }
-  if (isJsFunction(rti)) {
-    // A reference to the constructor.
-    return rawRtiToJsConstructorName(rti);
-  }
-  if (rti is int) {
-    return '${rti}';
-  }
-  String functionPropertyName = JS_GET_NAME(JsGetName.FUNCTION_TYPE_TAG);
-  if (JS('bool', 'typeof #[#] != "undefined"', rti, functionPropertyName)) {
-    // If the RTI has typedef equivalence info (via mirrors), use that since the
-    // mirrors helpers will re-parse the generated string.
-
-    String typedefPropertyName = JS_GET_NAME(JsGetName.TYPEDEF_TAG);
-    var typedefInfo = JS('', '#[#]', rti, typedefPropertyName);
-    if (typedefInfo != null) {
-      return runtimeTypeToStringV1(typedefInfo);
-    }
-    return _functionRtiToStringV1(rti);
-  }
-  // We should not get here.
-  return 'unknown-reified-type';
-}
-
-String runtimeTypeToStringV2(var rti, List<String> genericContext) {
+String _runtimeTypeToString(var rti, List<String> genericContext) {
   if (isDartDynamicTypeRti(rti)) {
     return 'dynamic';
   }
@@ -239,7 +188,7 @@
   }
   if (isJsArray(rti)) {
     // A list representing a type with arguments.
-    return _getRuntimeTypeAsStringV2(rti, genericContext);
+    return _getRuntimeTypeAsString(rti, genericContext);
   }
   if (isJsFunction(rti)) {
     // A reference to the constructor.
@@ -257,81 +206,16 @@
   }
   if (isDartFunctionType(rti)) {
     // TODO(sra): If there is a typedef tag, use the typedef name.
-    return _functionRtiToStringV2(rti, genericContext);
+    return _functionRtiToString(rti, genericContext);
   }
   if (isDartFutureOrType(rti)) {
     var typeArgument = getFutureOrArgument(rti);
-    return 'FutureOr<${runtimeTypeToStringV2(typeArgument, genericContext)}>';
+    return 'FutureOr<${_runtimeTypeToString(typeArgument, genericContext)}>';
   }
   // We should not get here.
   return 'unknown-reified-type';
 }
 
-String _functionRtiToStringV1(var rti) {
-  String returnTypeText;
-  String voidTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
-  if (JS('bool', '!!#[#]', rti, voidTag)) {
-    returnTypeText = 'void';
-  } else {
-    String returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
-    var returnRti = JS('', '#[#]', rti, returnTypeTag);
-    returnTypeText = runtimeTypeToStringV1(returnRti);
-  }
-
-  String argumentsText = '';
-  String sep = '';
-
-  String requiredParamsTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG);
-  bool hasArguments = JS('bool', '# in #', requiredParamsTag, rti);
-  if (hasArguments) {
-    List arguments = JS('JSFixedArray', '#[#]', rti, requiredParamsTag);
-    for (var argument in arguments) {
-      argumentsText += sep;
-      argumentsText += runtimeTypeToStringV1(argument);
-      sep = ', ';
-    }
-  }
-
-  String optionalParamsTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG);
-  bool hasOptionalArguments = JS('bool', '# in #', optionalParamsTag, rti);
-  if (hasOptionalArguments) {
-    List optionalArguments = JS('JSFixedArray', '#[#]', rti, optionalParamsTag);
-    argumentsText += '$sep[';
-    sep = '';
-    for (var argument in optionalArguments) {
-      argumentsText += sep;
-      argumentsText += runtimeTypeToStringV1(argument);
-      sep = ', ';
-    }
-    argumentsText += ']';
-  }
-
-  String namedParamsTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_NAMED_PARAMETERS_TAG);
-  bool hasNamedArguments = JS('bool', '# in #', namedParamsTag, rti);
-  if (hasNamedArguments) {
-    var namedArguments = JS('', '#[#]', rti, namedParamsTag);
-    argumentsText += '$sep{';
-    sep = '';
-    for (String name in extractKeys(namedArguments)) {
-      argumentsText += sep;
-      argumentsText +=
-          runtimeTypeToStringV1(JS('', '#[#]', namedArguments, name));
-      argumentsText += ' $name';
-      sep = ', ';
-    }
-    argumentsText += '}';
-  }
-
-  // TODO(sra): Below is the same format as the VM. Change to:
-  //
-  //     '${returnTypeText} Function(${argumentsText})';
-  //
-  return '(${argumentsText}) => ${returnTypeText}';
-}
-
 // Returns a formatted String version of a function type.
 //
 // [genericContext] is list of the names of generic type parameters for generic
@@ -343,7 +227,7 @@
 // the inner scope index `0` is R, `3` is P, and `4` is Q.
 //
 // [genericContext] is initially `null`.
-String _functionRtiToStringV2(var rti, List<String> genericContext) {
+String _functionRtiToString(var rti, List<String> genericContext) {
   String typeParameters = '';
   int outerContextLength;
 
@@ -369,7 +253,7 @@
       var boundRti = boundsRti[i];
       if (isInterestingBound(boundRti)) {
         typeParameters +=
-            ' extends ' + runtimeTypeToStringV2(boundRti, genericContext);
+            ' extends ' + _runtimeTypeToString(boundRti, genericContext);
       }
     }
     typeParameters += '>';
@@ -382,7 +266,7 @@
   } else {
     String returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
     var returnRti = JS('', '#[#]', rti, returnTypeTag);
-    returnTypeText = runtimeTypeToStringV2(returnRti, genericContext);
+    returnTypeText = _runtimeTypeToString(returnRti, genericContext);
   }
 
   String argumentsText = '';
@@ -394,7 +278,7 @@
     List arguments = JS('JSFixedArray', '#[#]', rti, requiredParamsTag);
     for (var argument in arguments) {
       argumentsText += sep;
-      argumentsText += runtimeTypeToStringV2(argument, genericContext);
+      argumentsText += _runtimeTypeToString(argument, genericContext);
       sep = ', ';
     }
   }
@@ -408,7 +292,7 @@
     sep = '';
     for (var argument in optionalArguments) {
       argumentsText += sep;
-      argumentsText += runtimeTypeToStringV2(argument, genericContext);
+      argumentsText += _runtimeTypeToString(argument, genericContext);
       sep = ', ';
     }
     argumentsText += ']';
@@ -423,7 +307,7 @@
     sep = '';
     for (String name in extractKeys(namedArguments)) {
       argumentsText += sep;
-      argumentsText += runtimeTypeToStringV2(
+      argumentsText += _runtimeTypeToString(
           JS('', '#[#]', namedArguments, name), genericContext);
       argumentsText += ' $name';
       sep = ', ';
@@ -449,33 +333,10 @@
  * [startIndex].
  */
 String joinArguments(var types, int startIndex) {
-  return JS_GET_FLAG('STRONG_MODE')
-      ? joinArgumentsV2(types, startIndex, null)
-      : joinArgumentsV1(types, startIndex);
+  return _joinArguments(types, startIndex, null);
 }
 
-String joinArgumentsV1(var types, int startIndex) {
-  if (types == null) return '';
-  assert(isJsArray(types));
-  bool firstArgument = true;
-  bool allDynamic = true;
-  StringBuffer buffer = new StringBuffer('');
-  for (int index = startIndex; index < getLength(types); index++) {
-    if (firstArgument) {
-      firstArgument = false;
-    } else {
-      buffer.write(', ');
-    }
-    var argument = getIndex(types, index);
-    if (argument != null) {
-      allDynamic = false;
-    }
-    buffer.write(runtimeTypeToStringV1(argument));
-  }
-  return allDynamic ? '' : '<$buffer>';
-}
-
-String joinArgumentsV2(var types, int startIndex, List<String> genericContext) {
+String _joinArguments(var types, int startIndex, List<String> genericContext) {
   if (types == null) return '';
   assert(isJsArray(types));
   var separator = '';
@@ -488,9 +349,9 @@
     if (argument != null) {
       allDynamic = false;
     }
-    buffer.write(runtimeTypeToStringV2(argument, genericContext));
+    buffer.write(_runtimeTypeToString(argument, genericContext));
   }
-  return (!JS_GET_FLAG('STRONG_MODE') && allDynamic) ? '' : '<$buffer>';
+  return '<$buffer>';
 }
 
 /**
@@ -581,13 +442,6 @@
  *   against.
  */
 bool checkSubtype(Object object, String isField, List checks, String asField) {
-  return JS_GET_FLAG('STRONG_MODE')
-      ? checkSubtypeV2(object, isField, checks, asField)
-      : checkSubtypeV1(object, isField, checks, asField);
-}
-
-bool checkSubtypeV1(
-    Object object, String isField, List checks, String asField) {
   if (object == null) return false;
   var arguments = getRuntimeTypeInfo(object);
   // Interceptor is needed for JSArray and native classes.
@@ -599,23 +453,7 @@
   if (isSubclass == null) return false;
   // Should the asField function be passed the receiver?
   var substitution = getField(interceptor, asField);
-  return checkArgumentsV1(substitution, arguments, checks);
-}
-
-bool checkSubtypeV2(
-    Object object, String isField, List checks, String asField) {
-  if (object == null) return false;
-  var arguments = getRuntimeTypeInfo(object);
-  // Interceptor is needed for JSArray and native classes.
-  // TODO(sra): It could be a more specialized interceptor since [object] is not
-  // `null` or a primitive.
-  var interceptor = getInterceptor(object);
-  var isSubclass = getField(interceptor, isField);
-  // When we read the field and it is not there, [isSubclass] will be `null`.
-  if (isSubclass == null) return false;
-  // Should the asField function be passed the receiver?
-  var substitution = getField(interceptor, asField);
-  return checkArgumentsV2(substitution, arguments, null, checks, null);
+  return checkArguments(substitution, arguments, null, checks, null);
 }
 
 /// Returns the field's type name.
@@ -664,21 +502,9 @@
   throw new TypeErrorImplementation.fromMessage(message);
 }
 
-/**
- * Check that the types in the list [arguments] are subtypes of the types in
- * list [checks] (at the respective positions), possibly applying [substitution]
- * to the arguments before the check.
- *
- * See the comment in the beginning of this file for a description of the
- * possible values for [substitution].
- */
-bool checkArgumentsV1(var substitution, var arguments, var checks) {
-  return areSubtypesV1(substitute(substitution, arguments), checks);
-}
-
-bool checkArgumentsV2(
+bool checkArguments(
     var substitution, var arguments, var sEnv, var checks, var tEnv) {
-  return areSubtypesV2(substitute(substitution, arguments), sEnv, checks, tEnv);
+  return areSubtypes(substitute(substitution, arguments), sEnv, checks, tEnv);
 }
 
 /**
@@ -693,30 +519,13 @@
  * representations.
  */
 
-bool areSubtypesV1(var s, var t) {
-  // `null` means a raw type.
-  if (s == null || t == null) return true;
-
-  assert(isJsArray(s));
-  assert(isJsArray(t));
-  assert(getLength(s) == getLength(t));
-
-  int len = getLength(s);
-  for (int i = 0; i < len; i++) {
-    if (!isSubtypeV1(getIndex(s, i), getIndex(t, i))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool areSubtypesV2(var s, var sEnv, var t, var tEnv) {
+bool areSubtypes(var s, var sEnv, var t, var tEnv) {
   // `null` means a raw type.
   if (t == null) return true;
   if (s == null) {
     int len = getLength(t);
     for (int i = 0; i < len; i++) {
-      if (!isSubtypeV2(null, null, getIndex(t, i), tEnv)) {
+      if (!_isSubtype(null, null, getIndex(t, i), tEnv)) {
         return false;
       }
     }
@@ -729,7 +538,7 @@
 
   int len = getLength(s);
   for (int i = 0; i < len; i++) {
-    if (!isSubtypeV2(getIndex(s, i), sEnv, getIndex(t, i), tEnv)) {
+    if (!_isSubtype(getIndex(s, i), sEnv, getIndex(t, i), tEnv)) {
       return false;
     }
   }
@@ -748,25 +557,9 @@
 }
 
 /// Returns `true` if the runtime type representation [type] is a top type.
-///
-/// For Dart 1 this is either `dynamic` or `Object`. For Dart 2 this is either
-/// `dynamic`, `void` or `Object`.
+/// That is, either `dynamic`, `void` or `Object`.
 @ForceInline()
 bool isTopType(var type) {
-  return JS_GET_FLAG('STRONG_MODE') ? isTopTypeV2(type) : isTopTypeV1(type);
-}
-
-/// Returns `true` if the runtime type representation [type] is a top type for
-/// Dart 1. That is, either `dynamic` or `Object`.
-@ForceInline()
-bool isTopTypeV1(var type) {
-  return isDartDynamicTypeRti(type) || isDartObjectTypeRti(type);
-}
-
-/// Returns `true` if the runtime type representation [type] is a top type for
-/// Dart 2. That is, either `dynamic`, `void` or `Object`.
-@ForceInline()
-bool isTopTypeV2(var type) {
   return isDartDynamicTypeRti(type) ||
       isDartVoidTypeRti(type) ||
       isDartObjectTypeRti(type) ||
@@ -777,18 +570,7 @@
 /// [Null].
 @ForceInline()
 bool isSupertypeOfNull(var type) {
-  return JS_GET_FLAG('STRONG_MODE')
-      ? isSupertypeOfNullBaseV2(type) || isSupertypeOfNullRecursive(type)
-      : isSupertypeOfNullBaseV1(type);
-}
-
-/// Returns `true` if the runtime type representation [type] is a simple
-/// supertype of [Null].
-@ForceInline()
-bool isSupertypeOfNullBaseV1(var type) {
-  return isDartDynamicTypeRti(type) ||
-      isDartObjectTypeRti(type) ||
-      isNullTypeRti(type);
+  return isSupertypeOfNullBase(type) || isSupertypeOfNullRecursive(type);
 }
 
 /// Returns `true` if the runtime type representation [type] is a simple
@@ -797,7 +579,7 @@
 /// This method doesn't handle `FutureOr<Null>`. This is handle by
 /// [isSupertypeOfNullRecursive] because it requires a recursive check.
 @ForceInline()
-bool isSupertypeOfNullBaseV2(var type) {
+bool isSupertypeOfNullBase(var type) {
   return isDartDynamicTypeRti(type) ||
       isDartObjectTypeRti(type) ||
       isNullTypeRti(type) ||
@@ -818,7 +600,7 @@
   }
   if (isDartFutureOrType(type)) {
     var typeArgument = getFutureOrArgument(type);
-    return isSupertypeOfNullBaseV2(type) ||
+    return isSupertypeOfNullBase(type) ||
         isSupertypeOfNullRecursive(typeArgument);
   }
   return false;
@@ -848,7 +630,7 @@
   if (o == null) return isSupertypeOfNull(t);
   if (isTopType(t)) return true;
   if (JS('bool', 'typeof # == "object"', t)) {
-    if (JS_GET_FLAG('STRONG_MODE') && isDartFutureOrType(t)) {
+    if (isDartFutureOrType(t)) {
       // `o is FutureOr<T>` is equivalent to
       //
       //     o is T || o is Future<T>
@@ -915,75 +697,20 @@
  * constructor of the class, or an array (for generic class types).
  */
 bool isSubtype(var s, var t) {
-  return JS_GET_FLAG('STRONG_MODE')
-      ? isSubtypeV2(s, null, t, null)
-      : isSubtypeV1(s, t);
+  return _isSubtype(s, null, t, null);
 }
 
-bool isSubtypeV1(var s, var t) {
-  // Subtyping is reflexive.
-  if (isIdentical(s, t)) return true;
-  // If either type is dynamic, [s] is a subtype of [t].
-  if (isDartDynamicTypeRti(s) || isDartDynamicTypeRti(t)) return true;
-
-  // Generic function type parameters must match exactly, which would have
-  // exited earlier. The de Bruijn indexing ensures the representation as a
-  // small number can be used for type comparison.
-  if (isGenericFunctionTypeParameter(s)) {
-    // TODO(sra):  tau <: Object.
-    return false;
-  }
-  if (isGenericFunctionTypeParameter(t)) return false;
-
-  if (isNullType(s)) return true;
-
-  if (isDartFunctionType(t)) {
-    return isFunctionSubtypeV1(s, t);
-  }
-  // Check function types against the Function class and the Object class.
-  if (isDartFunctionType(s)) {
-    return isDartFunctionTypeRti(t) || isDartObjectTypeRti(t);
-  }
-
-  // Get the object describing the class and check for the subtyping flag
-  // constructed from the type of [t].
-  var typeOfS = isJsArray(s) ? getIndex(s, 0) : s;
-  var typeOfT = isJsArray(t) ? getIndex(t, 0) : t;
-
-  // Check for a subtyping flag.
-  // Get the necessary substitution of the type arguments, if there is one.
-  var substitution;
-  if (isNotIdentical(typeOfT, typeOfS)) {
-    String typeOfTString = runtimeTypeToString(typeOfT);
-    if (!builtinIsSubtype(typeOfS, typeOfTString)) {
-      return false;
-    }
-    var typeOfSPrototype = JS('', '#.prototype', typeOfS);
-    var field = '${JS_GET_NAME(JsGetName.OPERATOR_AS_PREFIX)}${typeOfTString}';
-    substitution = getField(typeOfSPrototype, field);
-  }
-  // The class of [s] is a subclass of the class of [t].  If [s] has no type
-  // arguments and no substitution, it is used as raw type.  If [t] has no
-  // type arguments, it used as a raw type.  In both cases, [s] is a subtype
-  // of [t].
-  if ((!isJsArray(s) && substitution == null) || !isJsArray(t)) {
-    return true;
-  }
-  // Recursively check the type arguments.
-  return checkArgumentsV1(substitution, getArguments(s), getArguments(t));
-}
-
-bool isSubtypeV2(var s, var sEnv, var t, var tEnv) {
+bool _isSubtype(var s, var sEnv, var t, var tEnv) {
   // Subtyping is reflexive.
   if (isIdentical(s, t)) return true;
 
   // [t] is a top type?
-  if (isTopTypeV2(t)) return true;
+  if (isTopType(t)) return true;
 
   if (isDartJsInteropTypeArgumentRti(s)) return true;
 
   // [s] is a top type?
-  if (isTopTypeV2(s)) {
+  if (isTopType(s)) {
     if (isGenericFunctionTypeParameter(t)) {
       // We need to check for function type variables because
       // `isDartFutureOrType` doesn't work on numbers.
@@ -992,7 +719,7 @@
     if (isDartFutureOrType(t)) {
       // [t] is FutureOr<T>. Check [s] <: T.
       var tTypeArgument = getFutureOrArgument(t);
-      return isSubtypeV2(s, sEnv, tTypeArgument, tEnv);
+      return _isSubtype(s, sEnv, tTypeArgument, tEnv);
     }
     return false;
   }
@@ -1009,7 +736,7 @@
   if (isNullType(s)) return true;
 
   if (isDartFunctionType(t)) {
-    return isFunctionSubtypeV2(s, sEnv, t, tEnv);
+    return _isFunctionSubtype(s, sEnv, t, tEnv);
   }
 
   if (isDartFunctionType(s)) {
@@ -1028,8 +755,8 @@
     if (isDartFutureOrType(s)) {
       // [S] is FutureOr<S>. Check S <: T
       var sTypeArgument = getFutureOrArgument(s);
-      return isSubtypeV2(sTypeArgument, sEnv, tTypeArgument, tEnv);
-    } else if (isSubtypeV2(s, sEnv, tTypeArgument, tEnv)) {
+      return _isSubtype(sTypeArgument, sEnv, tTypeArgument, tEnv);
+    } else if (_isSubtype(s, sEnv, tTypeArgument, tEnv)) {
       // `true` because [s] <: T.
       return true;
     } else {
@@ -1046,7 +773,7 @@
       var futureArgument =
           isJsArray(futureArguments) ? getIndex(futureArguments, 0) : null;
       // [s] implements Future<S>. Check S <: T.
-      return isSubtypeV2(futureArgument, sEnv, tTypeArgument, tEnv);
+      return _isSubtype(futureArgument, sEnv, tTypeArgument, tEnv);
     }
   }
 
@@ -1072,163 +799,17 @@
     return true;
   }
   // Recursively check the type arguments.
-  return checkArgumentsV2(
+  return checkArguments(
       substitution, getArguments(s), sEnv, getArguments(t), tEnv);
 }
 
-bool isAssignableV1(var s, var t) {
-  return isSubtypeV1(s, t) || isSubtypeV1(t, s);
-}
-
-/**
- * If [allowShorter] is `true`, [t] is allowed to be shorter than [s].
- */
-bool areAssignableV1(List s, List t, bool allowShorter) {
-  // Both lists are empty and thus equal.
-  if (t == null && s == null) return true;
-  // [t] is empty (and [s] is not) => only OK if [allowShorter].
-  if (t == null) return allowShorter;
-  // [s] is empty (and [t] is not) => [s] is not longer or equal to [t].
-  if (s == null) return false;
-
-  assert(isJsArray(s));
-  assert(isJsArray(t));
-
-  int sLength = getLength(s);
-  int tLength = getLength(t);
-  if (allowShorter) {
-    if (sLength < tLength) return false;
-  } else {
-    if (sLength != tLength) return false;
-  }
-
-  for (int i = 0; i < tLength; i++) {
-    if (!isAssignableV1(getIndex(s, i), getIndex(t, i))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool areAssignableMapsV1(var s, var t) {
-  if (t == null) return true;
-  if (s == null) return false;
-
-  assert(isJsObject(s));
-  assert(isJsObject(t));
-
-  List names =
-      JSArray.markFixedList(JS('', 'Object.getOwnPropertyNames(#)', t));
-  for (int i = 0; i < names.length; i++) {
-    var name = names[i];
-    if (JS('bool', '!Object.hasOwnProperty.call(#, #)', s, name)) {
-      return false;
-    }
-    var tType = JS('', '#[#]', t, name);
-    var sType = JS('', '#[#]', s, name);
-    if (!isAssignableV1(tType, sType)) return false;
-  }
-  return true;
-}
-
 /// Top-level function subtype check when [t] is known to be a function type
 /// rti.
 bool isFunctionSubtype(var s, var t) {
-  return JS_GET_FLAG('STRONG_MODE')
-      ? isFunctionSubtypeV2(s, null, t, null)
-      : isFunctionSubtypeV1(s, t);
+  return _isFunctionSubtype(s, null, t, null);
 }
 
-bool isFunctionSubtypeV1(var s, var t) {
-  assert(isDartFunctionType(t));
-  if (!isDartFunctionType(s)) return false;
-  var genericBoundsTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_GENERIC_BOUNDS_TAG);
-  var voidReturnTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
-  var returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
-
-  if (hasField(s, voidReturnTag)) {
-    if (hasNoField(t, voidReturnTag) && hasField(t, returnTypeTag)) {
-      return false;
-    }
-  } else if (hasNoField(t, voidReturnTag)) {
-    var sReturnType = getField(s, returnTypeTag);
-    var tReturnType = getField(t, returnTypeTag);
-    if (!isAssignableV1(sReturnType, tReturnType)) return false;
-  }
-  var requiredParametersTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG);
-  var sParameterTypes = getField(s, requiredParametersTag);
-  var tParameterTypes = getField(t, requiredParametersTag);
-
-  var optionalParametersTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG);
-  var sOptionalParameterTypes = getField(s, optionalParametersTag);
-  var tOptionalParameterTypes = getField(t, optionalParametersTag);
-
-  int sParametersLen = sParameterTypes != null ? getLength(sParameterTypes) : 0;
-  int tParametersLen = tParameterTypes != null ? getLength(tParameterTypes) : 0;
-
-  int sOptionalParametersLen =
-      sOptionalParameterTypes != null ? getLength(sOptionalParameterTypes) : 0;
-  int tOptionalParametersLen =
-      tOptionalParameterTypes != null ? getLength(tOptionalParameterTypes) : 0;
-
-  if (sParametersLen > tParametersLen) {
-    // Too many required parameters in [s].
-    return false;
-  }
-  if (sParametersLen + sOptionalParametersLen <
-      tParametersLen + tOptionalParametersLen) {
-    // Too few required and optional parameters in [s].
-    return false;
-  }
-  if (sParametersLen == tParametersLen) {
-    // Simple case: Same number of required parameters.
-    if (!areAssignableV1(sParameterTypes, tParameterTypes, false)) return false;
-    if (!areAssignableV1(
-        sOptionalParameterTypes, tOptionalParameterTypes, true)) {
-      return false;
-    }
-  } else {
-    // Complex case: Optional parameters of [s] for required parameters of [t].
-    int pos = 0;
-    // Check all required parameters of [s].
-    for (; pos < sParametersLen; pos++) {
-      if (!isAssignableV1(
-          getIndex(sParameterTypes, pos), getIndex(tParameterTypes, pos))) {
-        return false;
-      }
-    }
-    int sPos = 0;
-    int tPos = pos;
-    // Check the remaining parameters of [t] with the first optional parameters
-    // of [s].
-    for (; tPos < tParametersLen; sPos++, tPos++) {
-      if (!isAssignableV1(getIndex(sOptionalParameterTypes, sPos),
-          getIndex(tParameterTypes, tPos))) {
-        return false;
-      }
-    }
-    tPos = 0;
-    // Check the optional parameters of [t] with the remaining optional
-    // parameters of [s]:
-    for (; tPos < tOptionalParametersLen; sPos++, tPos++) {
-      if (!isAssignableV1(getIndex(sOptionalParameterTypes, sPos),
-          getIndex(tOptionalParameterTypes, tPos))) {
-        return false;
-      }
-    }
-  }
-
-  var namedParametersTag =
-      JS_GET_NAME(JsGetName.FUNCTION_TYPE_NAMED_PARAMETERS_TAG);
-  var sNamedParameters = getField(s, namedParametersTag);
-  var tNamedParameters = getField(t, namedParametersTag);
-  return areAssignableMapsV1(sNamedParameters, tNamedParameters);
-}
-
-bool isFunctionSubtypeV2(var s, var sEnv, var t, var tEnv) {
+bool _isFunctionSubtype(var s, var sEnv, var t, var tEnv) {
   assert(isDartFunctionType(t));
   if (!isDartFunctionType(s)) return false;
   var genericBoundsTag =
@@ -1255,7 +836,7 @@
 
   var sReturnType = getField(s, returnTypeTag);
   var tReturnType = getField(t, returnTypeTag);
-  if (!isSubtypeV2(sReturnType, sEnv, tReturnType, tEnv)) return false;
+  if (!_isSubtype(sReturnType, sEnv, tReturnType, tEnv)) return false;
 
   var requiredParametersTag =
       JS_GET_NAME(JsGetName.FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG);
@@ -1288,7 +869,7 @@
   int pos = 0;
   // Check all required parameters of [s].
   for (; pos < sParametersLen; pos++) {
-    if (!isSubtypeV2(getIndex(tParameterTypes, pos), tEnv,
+    if (!_isSubtype(getIndex(tParameterTypes, pos), tEnv,
         getIndex(sParameterTypes, pos), sEnv)) {
       return false;
     }
@@ -1298,7 +879,7 @@
   // Check the remaining parameters of [t] with the first optional parameters
   // of [s].
   for (; tPos < tParametersLen; sPos++, tPos++) {
-    if (!isSubtypeV2(getIndex(tParameterTypes, tPos), tEnv,
+    if (!_isSubtype(getIndex(tParameterTypes, tPos), tEnv,
         getIndex(sOptionalParameterTypes, sPos), sEnv)) {
       return false;
     }
@@ -1307,7 +888,7 @@
   // Check the optional parameters of [t] with the remaining optional
   // parameters of [s]:
   for (; tPos < tOptionalParametersLen; sPos++, tPos++) {
-    if (!isSubtypeV2(getIndex(tOptionalParameterTypes, tPos), tEnv,
+    if (!_isSubtype(getIndex(tOptionalParameterTypes, tPos), tEnv,
         getIndex(sOptionalParameterTypes, sPos), sEnv)) {
       return false;
     }
@@ -1319,11 +900,11 @@
   var tNamedParameters = getField(t, namedParametersTag);
   if (tNamedParameters == null) return true;
   if (sNamedParameters == null) return false;
-  return namedParametersSubtypeCheckV2(
+  return namedParametersSubtypeCheck(
       sNamedParameters, sEnv, tNamedParameters, tEnv);
 }
 
-bool namedParametersSubtypeCheckV2(var s, var sEnv, var t, var tEnv) {
+bool namedParametersSubtypeCheck(var s, var sEnv, var t, var tEnv) {
   assert(isJsObject(s));
   assert(isJsObject(t));
 
@@ -1337,7 +918,7 @@
     }
     var tType = JS('', '#[#]', t, name);
     var sType = JS('', '#[#]', s, name);
-    if (!isSubtypeV2(tType, tEnv, sType, sEnv)) return false;
+    if (!_isSubtype(tType, tEnv, sType, sEnv)) return false;
   }
   return true;
 }
diff --git a/sdk/lib/cli/wait_for.dart b/sdk/lib/cli/wait_for.dart
index 59078e2..1886ff1 100644
--- a/sdk/lib/cli/wait_for.dart
+++ b/sdk/lib/cli/wait_for.dart
@@ -46,13 +46,13 @@
  */
 external void _waitForEvent(int timeoutMillis);
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void Function(int) _getWaitForEvent() => _waitForEvent;
 
 // This should be set from C++ code by the embedder to wire up waitFor() to the
 // native implementation. In the standalone VM this is set to _waitForEvent()
 // above. If it is null, calling waitFor() will throw an UnsupportedError.
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 void Function(int) _waitForEventClosure;
 
 class _WaitForUtils {
@@ -111,7 +111,6 @@
  * subsequent calls block waiting for a condition that is only satisfied when
  * an earlier call returns.
  */
-@provisional
 T waitFor<T>(Future<T> future, {Duration timeout}) {
   T result;
   bool futureCompleted = false;
diff --git a/sdk/lib/core/annotations.dart b/sdk/lib/core/annotations.dart
index dc6109b..4034456 100644
--- a/sdk/lib/core/annotations.dart
+++ b/sdk/lib/core/annotations.dart
@@ -5,23 +5,22 @@
 part of dart.core;
 
 /**
- * The annotation `@Deprecated('expires when')` marks a feature as deprecated.
+ * The annotation `@Deprecated('migration')` marks a feature as deprecated.
  *
- * The annotation `@deprecated` is a shorthand for deprecating until
- * an unspecified "next release".
+ * The annotation [deprecated] is a shorthand for deprecating until
+ * an unspecified "next release" without migration instructions.
  *
  * The intent of the `@Deprecated` annotation is to inform users of a feature
  * that they should change their code, even if it is currently still working
  * correctly.
  *
  * A deprecated feature is scheduled to be removed at a later time, possibly
- * specified as the "expires" field of the annotation.
- * This means that a deprecated feature should not be used, or code using it
- * will break at some point in the future. If there is code using the feature,
- * that code should be rewritten to not use the deprecated feature.
+ * specified in [message]. A deprecated feature should not be used, code using
+ * it will break at some point in the future. If existing code is using the
+ * feature it should be rewritten to not use the deprecated feature.
  *
- * A deprecated feature should document how the same effect can be achieved,
- * so the programmer knows how to rewrite the code.
+ * A deprecated feature should document how the same effect can be achieved in
+ * [message], so the programmer knows how to rewrite the code.
  *
  * The `@Deprecated` annotation applies to libraries, top-level declarations
  * (variables, getters, setters, functions, classes and typedefs),
@@ -54,22 +53,28 @@
  */
 class Deprecated {
   /**
-   * A description of when the deprecated feature is expected to be retired.
+   * Message provided to the user when they use the deprecated feature.
+   *
+   * The message should explain how to migrate away from the feature if an
+   * alternative is available, and when the deprecated feature is expected to be
+   * removed.
    */
-  final String expires;
+  final String message;
 
   /**
-   * Create a deprecation annotation which specifies the expiration of the
-   * annotated feature.
+   * Create a deprecation annotation which specifies the migration path and
+   * expiration of the annotated feature.
    *
-   * The [expires] argument should be readable by programmers, and should state
-   * when an annotated feature is expected to be removed.
-   * This can be specified, for example, as a date, as a release number, or
-   * as relative to some other change (like "when bug 4418 is fixed").
+   * The [message] argument should be readable by programmers, and should state
+   * an alternative feature (if available) as well as when an annotated feature
+   * is expected to be removed.
    */
-  const Deprecated(String expires) : this.expires = expires;
+  const Deprecated(this.message);
 
-  String toString() => "Deprecated feature. Will be removed $expires";
+  @Deprecated('Use `message` instead. Will be removed in Dart 3.0.0')
+  String get expires => message;
+
+  String toString() => "Deprecated feature: $message";
 }
 
 /**
@@ -109,57 +114,23 @@
 const Object override = const _Override();
 
 /**
- * The annotation `@Provisional('message')` marks a feature as provisional.
+ * An annotation class that was used during development of Dart 2.
  *
- * An API is considered to be provisional if it is still going through the
- * process of stabilizing and is subject to change or removal.
- *
- * The intent of the `@Provisional` annotation is to mark APIs that are still in
- * development or that are added only tentatively. Adding the API allows users
- * to experiment with using the APIs, which can provide valuable feedback. Such
- * provisional APIs do not promise stability. They can be changed or removed
- * without warning.
- *
- * The `@Provisional` annotation applies to:
- * - library directives,
- * - public top-level declarations, and
- * - public members of public classes.
- *
- * Provisionality is transitive:
- * - If a library is provisional, so is every member of it.
- * - If a class is provisional, so is every member of it.
- * - If a variable is provisional, so are its implicit getter and setter.
- *
- * Further, if a class is provisional, so are classes that extend, implement,
- * and mix-in the class.
- *
- * A tool that processes Dart source code may report when:
- * - the code imports a provisional library.
- * - the code exports a provisional library, or any provisional member of
- *   a non-provisional library.
- * - the code refers statically to a provisional declaration.
- * - the code dynamically uses a member of an object with a statically known
- *   type, where the member is provisional on the static type of the object.
- *
- * If the provisional use is inside a library, class or method which is itself
- * provisional, the tool should not bother the user about it.
- * A provisional feature is expected to use other provisional features.
+ * Should not be used any more.
  */
+@deprecated
 class Provisional {
-  /**
-   * A brief message describing how or why the feature is provisional.
-   */
-  final String message;
-
-  const Provisional({String message})
-      : this.message = message ?? "Subject to change or removal.";
+  String get message => null;
+  const Provisional({String message});
 }
 
 /**
- * Marks a feature as provisional with the message "Subject to change or
- * removal".
+ * An annotation that was used during development of Dart 2.
+ *
+ * Should not be used any more.
  */
-const Provisional provisional = const Provisional();
+@deprecated
+const Null provisional = null;
 
 class _Proxy {
   const _Proxy();
@@ -248,7 +219,7 @@
  * function foo is annotated with a pragma 'other-pragma' specific to OtherTool.
  *
  */
-@pragma('vm.entry-point')
+@pragma('vm:entry-point')
 class pragma {
   /**
    * The name of the hint.
diff --git a/sdk/lib/core/bool.dart b/sdk/lib/core/bool.dart
index 6dfdb74..2aeca44 100644
--- a/sdk/lib/core/bool.dart
+++ b/sdk/lib/core/bool.dart
@@ -11,7 +11,7 @@
  * It is a compile-time error for a class to attempt to extend or implement
  * bool.
  */
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class bool {
   /**
    * Returns the boolean value of the environment declaration [name].
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 59899e1..48b8b68 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -116,7 +116,7 @@
  * Error thrown when attempting to throw [:null:].
  */
 class NullThrownError extends Error {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   NullThrownError();
   String toString() => "Throw of null.";
 }
@@ -141,7 +141,7 @@
    * If the `message` is not a [String], it is assumed to be a value instead
    * of a message.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   ArgumentError([this.message])
       : invalidValue = null,
         _hasValue = false,
@@ -160,7 +160,7 @@
    * names differ from the interface, it might be more useful to use the
    * interface method's argument name (or just rename arguments to match).
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   ArgumentError.value(value, [this.name, this.message])
       : invalidValue = value,
         _hasValue = true;
@@ -206,7 +206,7 @@
   /**
    * Create a new [RangeError] with the given [message].
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   RangeError(var message)
       : start = null,
         end = null,
@@ -239,7 +239,7 @@
    * invalid value, and the [message] can override the default error
    * description.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   RangeError.range(num invalidValue, int minValue, int maxValue,
       [String name, String message])
       : start = minValue,
@@ -417,7 +417,7 @@
  */
 class FallThroughError extends Error {
   FallThroughError();
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   external FallThroughError._create(String url, int line);
 
   external String toString();
@@ -488,7 +488,7 @@
  */
 class UnsupportedError extends Error {
   final String message;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   UnsupportedError(this.message);
   String toString() => "Unsupported operation: $message";
 }
@@ -546,7 +546,7 @@
 }
 
 class OutOfMemoryError implements Error {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const OutOfMemoryError();
   String toString() => "Out of Memory";
 
@@ -554,7 +554,7 @@
 }
 
 class StackOverflowError implements Error {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const StackOverflowError();
   String toString() => "Stack Overflow";
 
@@ -570,7 +570,7 @@
  */
 class CyclicInitializationError extends Error {
   final String variableName;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   CyclicInitializationError([this.variableName]);
   String toString() => variableName == null
       ? "Reading static variable during its initialization"
diff --git a/sdk/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
index 8a90653..737fcb9 100644
--- a/sdk/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -74,7 +74,7 @@
    * Optionally also supply the actual [source] with the incorrect format,
    * and the [offset] in the format where a problem was detected.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const FormatException([this.message = "", this.source, this.offset]);
 
   /**
@@ -175,7 +175,7 @@
 
 // Exception thrown when doing integer division with a zero divisor.
 class IntegerDivisionByZeroException implements Exception {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const IntegerDivisionByZeroException();
   String toString() => "IntegerDivisionByZeroException";
 }
diff --git a/sdk/lib/core/identical.dart b/sdk/lib/core/identical.dart
index 149780c..68da9f3 100644
--- a/sdk/lib/core/identical.dart
+++ b/sdk/lib/core/identical.dart
@@ -18,5 +18,5 @@
  *
  * This hash code is compatible with [identical].
  */
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 external int identityHashCode(Object object);
diff --git a/sdk/lib/core/null.dart b/sdk/lib/core/null.dart
index bf955a5..212fb47 100644
--- a/sdk/lib/core/null.dart
+++ b/sdk/lib/core/null.dart
@@ -11,7 +11,7 @@
  * It is a compile-time error for a class to attempt to extend or implement
  * Null.
  */
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class Null {
   factory Null._uninstantiable() {
     throw new UnsupportedError('class Null cannot be instantiated');
diff --git a/sdk/lib/core/object.dart b/sdk/lib/core/object.dart
index c384735..505efdf 100644
--- a/sdk/lib/core/object.dart
+++ b/sdk/lib/core/object.dart
@@ -18,7 +18,7 @@
  * section of the [library
  * tour](http://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html).
  */
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 class Object {
   /**
    * Creates a new [Object] instance.
@@ -105,7 +105,7 @@
    *
    * The default behavior is to throw a [NoSuchMethodError].
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   external dynamic noSuchMethod(Invocation invocation);
 
   /**
diff --git a/sdk/lib/developer/profiler.dart b/sdk/lib/developer/profiler.dart
index d620179..665cd27 100644
--- a/sdk/lib/developer/profiler.dart
+++ b/sdk/lib/developer/profiler.dart
@@ -144,7 +144,7 @@
   }
 
   // ignore: unused_element, called from native code
-  @pragma("vm.entry-point", !const bool.fromEnvironment("dart.vm.product"))
+  @pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
   static String _printMetrics() {
     var metrics = [];
     for (var metric in _metrics.values) {
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index 79de9fb..d782b67 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -64,7 +64,7 @@
   final int errorCode;
 
   /** Creates an OSError object from a message and an errorCode. */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const OSError([this.message = "", this.errorCode = noErrorCode]);
 
   /** Converts an OSError object to a string representation. */
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 7b5deb7..bdd4af1 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -126,7 +126,7 @@
    * If [path] is an absolute path, it will be immune to changes to the
    * current working directory.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory Directory(String path) {
     final IOOverrides overrides = IOOverrides.current;
     if (overrides == null) {
diff --git a/sdk/lib/io/embedder_config.dart b/sdk/lib/io/embedder_config.dart
index 33abb10..89265cf 100644
--- a/sdk/lib/io/embedder_config.dart
+++ b/sdk/lib/io/embedder_config.dart
@@ -16,7 +16,7 @@
   static bool _mayChdir = true;
 
   /// The Isolate may call exit().
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   static bool _mayExit = true;
 
   // The Isolate may set Stdin.echoMode.
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index df99209..e34008c 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -247,7 +247,7 @@
    * If [path] is an absolute path, it will be immune to changes to the
    * current working directory.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory File(String path) {
     final IOOverrides overrides = IOOverrides.current;
     if (overrides == null) {
@@ -980,7 +980,7 @@
    * [message], optional file system path [path] and optional OS error
    * [osError].
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const FileSystemException([this.message = "", this.path = "", this.osError]);
 
   String toString() {
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 1e78582..45cfc29 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -12,7 +12,7 @@
   /**
    * Creates a Link object.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   factory Link(String path) {
     final IOOverrides overrides = IOOverrides.current;
     if (overrides == null) {
diff --git a/sdk/lib/io/namespace_impl.dart b/sdk/lib/io/namespace_impl.dart
index 490a574..88987b6 100644
--- a/sdk/lib/io/namespace_impl.dart
+++ b/sdk/lib/io/namespace_impl.dart
@@ -19,6 +19,6 @@
   // If it is not set up by the embedder, relative paths will be resolved
   // relative to the process's current working directory and absolute paths will
   // be left relative to the file system root.
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   external static void _setupNamespace(var namespace);
 }
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index d7218bd..eb3504f 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -378,7 +378,7 @@
  * get the fields of the certificate.
  */
 abstract class X509Certificate {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   external factory X509Certificate._();
 
   /// The DER encoded bytes of the certificate.
@@ -1108,13 +1108,13 @@
  */
 class _ExternalBuffer {
   // This will be an ExternalByteArray, backed by C allocated data.
-  @pragma("vm.entry-point", "set")
+  @pragma("vm:entry-point", "set")
   List<int> data;
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   int start;
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   int end;
 
   final size;
@@ -1263,7 +1263,7 @@
   final String message;
   final OSError osError;
 
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const TlsException([String message = "", OSError osError = null])
       : this._("TlsException", message, osError);
 
@@ -1289,7 +1289,7 @@
  * a secure network connection.
  */
 class HandshakeException extends TlsException {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const HandshakeException([String message = "", OSError osError = null])
       : super._("HandshakeException", message, osError);
 }
@@ -1300,7 +1300,7 @@
  * certificate.
  */
 class CertificateException extends TlsException {
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   const CertificateException([String message = "", OSError osError = null])
       : super._("CertificateException", message, osError);
 }
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 99e708c..e517e0d 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -26,7 +26,7 @@
 class IsolateSpawnException implements Exception {
   /** Error message reported by the spawn operation. */
   final String message;
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   IsolateSpawnException(this.message);
   String toString() => "IsolateSpawnException: $message";
 }
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index 5ef8261..62e7ee8 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -455,7 +455,7 @@
    * Creates a [ByteData] of the specified length (in elements), all of
    * whose bytes are initially zero.
    */
-  @pragma("vm.entry-point")
+  @pragma("vm:entry-point")
   external factory ByteData(int length);
 
   /**
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 674efd1..e8a5600 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -696,13 +696,13 @@
   }
 }
 
-@pragma("vm.entry-point")
+@pragma("vm:entry-point")
 RawReceivePort boot() {
   // Return the port we expect isolate control messages on.
   return isolateControlPort;
 }
 
-@pragma("vm.entry-point", !const bool.fromEnvironment("dart.vm.product"))
+@pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
 void _registerIsolate(int port_id, SendPort sp, String name) {
   var service = new VMService();
   service.runningIsolates.isolateStartup(port_id, sp, name);
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 595539b..1dfba79 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == fasta ]
+Language/Classes/Constructors/Generative_Constructors/final_variables_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Classes/definition_t24: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
@@ -173,8 +174,10 @@
 Language/Classes/Constructors/Factories/syntax_t01: CompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t03: CompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t04: CompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t03: CompileTimeError # super initializer not last
 Language/Classes/Constructors/Generative_Constructors/explicit_type_t01: CompileTimeError
 Language/Classes/Constructors/Generative_Constructors/explicit_type_t02: CompileTimeError
+Language/Classes/Constructors/Generative_Constructors/initializers_t01: CompileTimeError # super initializer not last
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
 Language/Classes/Constructors/Generative_Constructors/initializing_this_t03: CompileTimeError
 Language/Classes/Constructors/implicit_constructor_t03: CompileTimeError
@@ -229,8 +232,6 @@
 Language/Classes/method_definition_t05: CompileTimeError
 Language/Classes/same_name_instance_and_static_members_t02: Pass
 Language/Classes/same_name_instance_and_static_members_t04: Pass
-Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
 Language/Enums/declaration_equivalent_t03: CompileTimeError
 Language/Enums/declaration_equivalent_t05: CompileTimeError
 Language/Enums/declaration_equivalent_t08: CompileTimeError
@@ -550,7 +551,10 @@
 Language/Expressions/Instance_Creation/New/evaluation_t17: CompileTimeError
 Language/Expressions/Instance_Creation/New/evaluation_t18: CompileTimeError
 Language/Expressions/Instance_Creation/New/execution_t02: CompileTimeError
+Language/Expressions/Instance_Creation/New/execution_t04: CompileTimeError # super initializer not last
+Language/Expressions/Instance_Creation/New/execution_t06: CompileTimeError # super initializer not last
 Language/Expressions/Instance_Creation/New/execution_t07: CompileTimeError
+Language/Expressions/Instance_Creation/New/execution_t09: CompileTimeError # super initializer not last
 Language/Expressions/Instance_Creation/New/execution_t11: CompileTimeError
 Language/Expressions/Instance_Creation/New/execution_t13: CompileTimeError
 Language/Expressions/Instance_Creation/New/named_constructor_t01: CompileTimeError
@@ -1119,8 +1123,6 @@
 Language/Variables/constant_variable_t03: CompileTimeError
 Language/Variables/constant_variable_t04: CompileTimeError
 Language/Variables/constant_variable_t10: CompileTimeError
-Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
-Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
 Language/Variables/final_t01/01: CompileTimeError
 Language/Variables/final_t02/01: CompileTimeError
 Language/Variables/implicit_getter_t02: CompileTimeError
@@ -1686,6 +1688,8 @@
 Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
 Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t03: CompileTimeError # super initializer not last
+Language/Classes/Constructors/Generative_Constructors/initializers_t01: CompileTimeError # super initializer not last
 Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t03: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t05: MissingCompileTimeError
@@ -1710,6 +1714,9 @@
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t03: MissingCompileTimeError
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/execution_t04: CompileTimeError # super initializer not last
+Language/Expressions/Instance_Creation/New/execution_t06: CompileTimeError # super initializer not last
+Language/Expressions/Instance_Creation/New/execution_t09: CompileTimeError # super initializer not last
 Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
 Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError
@@ -1744,8 +1751,6 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError
 Language/Types/Interface_Types/subtype_t30: CompileTimeError
-Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
-Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
 LibTest/core/int/compareTo_A01_t01: CompileTimeError
 LibTest/core/int/isEven_A01_t01: CompileTimeError
 LibTest/core/int/isOdd_A01_t01: CompileTimeError
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
index accdc59..75c8e79 100644
--- a/tests/co19_2/co19_2-analyzer.status
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -124,4 +124,3 @@
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t07: CompileTimeError # Issue 32903
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t08: CompileTimeError # Issue 32903
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t09: CompileTimeError # Issue 32903
-
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index a34a0b8..055c317 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -3,56 +3,57 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $fasta ]
-Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/arguments_type_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/function_type_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/function_type_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError # Issue 34190
+Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError # Issue 34190
+Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError # Issue 34190
+Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError # Issue 34190
+Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError # Issue 34190
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError # Issue 34191
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError # Issue 34191
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError # Issue 34191
+Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError # Issue 34192
+Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError # Issue 34192
+Language/Classes/Constructors/Factories/arguments_type_t01: MissingCompileTimeError # Issue 33308
+Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError # Issue 34161
+Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError # Issue 34161
+Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError # Issue 34160
+Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError # Issue 34160
+Language/Classes/Constructors/Factories/function_type_t01: MissingCompileTimeError # Issue 31590
+Language/Classes/Constructors/Factories/function_type_t02: MissingCompileTimeError # Issue 31590
+Language/Classes/Constructors/Generative_Constructors/final_variables_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
 Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/name_t02: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/name_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError
-Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError
-Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError
-Language/Classes/Getters/instance_getter_t04: MissingCompileTimeError
-Language/Classes/Getters/instance_getter_t05: MissingCompileTimeError
-Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Getters/instance_getter_t04: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Getters/instance_getter_t05: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Getters/type_object_t01: CompileTimeError
 Language/Classes/Getters/type_object_t02: CompileTimeError
-Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
-Language/Classes/Setters/instance_setter_t01: MissingCompileTimeError
-Language/Classes/Setters/instance_setter_t02: MissingCompileTimeError
-Language/Classes/Setters/instance_setter_t03: MissingCompileTimeError
-Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError
-Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError
-Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError
+Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError # Issue 34190
+Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError # Issue 34190
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError # Issue 32326
+Language/Classes/Setters/instance_setter_t01: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Setters/instance_setter_t02: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Setters/instance_setter_t03: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Setters/name_t06: CompileTimeError
 Language/Classes/Setters/name_t07: CompileTimeError
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
@@ -62,8 +63,6 @@
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
 Language/Classes/definition_t24: MissingCompileTimeError
 Language/Classes/method_definition_t06: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
 Language/Enums/syntax_t08: CompileTimeError
 Language/Enums/syntax_t09: CompileTimeError
 Language/Expressions/Assignable_Expressions/syntax_t01: CompileTimeError
@@ -76,16 +75,16 @@
 Language/Expressions/Assignment/super_assignment_t06: CompileTimeError
 Language/Expressions/Assignment/super_assignment_value_t02: CompileTimeError
 Language/Expressions/Bitwise_Expressions/syntax_t01: CompileTimeError
-Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
-Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t03: MissingCompileTimeError
-Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/exception_t01: MissingCompileTimeError
-Language/Expressions/Constants/exception_t03: MissingCompileTimeError
-Language/Expressions/Constants/exception_t04: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError
-Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
+Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError # Legal because of implicit const
+Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError # Legal because of implicit const
+Language/Expressions/Constants/depending_on_itself_t03: MissingCompileTimeError # Issue 34189
+Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError # Issue 34192
+Language/Expressions/Constants/exception_t01: MissingCompileTimeError # Issue 31936
+Language/Expressions/Constants/exception_t03: MissingCompileTimeError # Issue 31936
+Language/Expressions/Constants/exception_t04: MissingCompileTimeError # Issue 31936
+Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError # Issue 34192
+Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError # Issue 34192
+Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError # Issue 34192
 Language/Expressions/Equality/syntax_t01: CompileTimeError
 Language/Expressions/Function_Expressions/syntax_t05: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t01: CompileTimeError
@@ -96,27 +95,27 @@
 Language/Expressions/Function_Invocation/async_cleanup_t06: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t07: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t08: CompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError # Legal because of implicit const
+Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError # Issue 31936
 Language/Expressions/Instance_Creation/Const/parameterized_type_t01: CompileTimeError
 Language/Expressions/Instance_Creation/Const/parameterized_type_t02: CompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t16: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t17: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t18: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/generic_type_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/generic_type_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/generic_type_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/syntax_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/type_argument_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t07: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/evaluation_t16: MissingCompileTimeError # Issue 33308
+Language/Expressions/Instance_Creation/New/evaluation_t17: MissingCompileTimeError # Issue 33308
+Language/Expressions/Instance_Creation/New/evaluation_t18: MissingCompileTimeError # Issue 33308
+Language/Expressions/Instance_Creation/New/generic_type_t01: MissingCompileTimeError # Issue 32972
+Language/Expressions/Instance_Creation/New/generic_type_t02: MissingCompileTimeError # Issue 32972
+Language/Expressions/Instance_Creation/New/generic_type_t03: MissingCompileTimeError # Issue 32972
+Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: MissingCompileTimeError # Issue 33308
+Language/Expressions/Instance_Creation/New/syntax_t04: MissingCompileTimeError # Legal because of implicit new
+Language/Expressions/Instance_Creation/New/type_argument_t01: MissingCompileTimeError # Issue 33308
+Language/Expressions/Instance_Creation/malformed_or_malbounded_t07: MissingCompileTimeError # Issue 33308
 Language/Expressions/Lists/constant_list_t01: CompileTimeError
 Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
 Language/Expressions/Maps/constant_map_type_t01: CompileTimeError
 Language/Expressions/Maps/equal_keys_t01: MissingCompileTimeError
-Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
+Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError # Issue 32557
 Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t04: CompileTimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/function_type_t01: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/function_type_t01: MissingCompileTimeError # Issue 32975
 Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: CompileTimeError
 Language/Expressions/Multiplicative_Expressions/syntax_t01: CompileTimeError
 Language/Expressions/Postfix_Expressions/syntax_t01: CompileTimeError
@@ -133,21 +132,21 @@
 Language/Expressions/Strings/String_Interpolation/single_quote_t02: CompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t10: CompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t27: CompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
-Language/Generics/scope_t06: MissingCompileTimeError
+Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError # 32912
+Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError # 32912
+Language/Generics/scope_t06: MissingCompileTimeError # Issue 33308
 Language/Generics/syntax_t02: CompileTimeError
 Language/Generics/syntax_t03: CompileTimeError
-Language/Generics/upper_bound_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Exports/same_name_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
-Language/Metadata/compilation_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError
+Language/Generics/upper_bound_t01: MissingCompileTimeError # Issue 33308
+Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError # Issue 12916
+Language/Libraries_and_Scripts/Exports/same_name_t01: MissingCompileTimeError # Issue 12916
+Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError # Issue 33650
+Language/Metadata/compilation_t03: MissingCompileTimeError # Issue 34205
+Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError # Issue 30273
+Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError # Mixin super equirement
 Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # The test even says in the comment it should be a compile time error
-Language/Mixins/declaring_constructor_t05: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t06: MissingCompileTimeError
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Mixin constructor
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Mixin constructor
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
 Language/Statements/Continue/async_loops_t01: CompileTimeError
 Language/Statements/Continue/async_loops_t02: CompileTimeError
@@ -161,37 +160,35 @@
 Language/Statements/Continue/async_loops_t10: CompileTimeError
 Language/Statements/Continue/control_transfer_t08: CompileTimeError
 Language/Statements/Continue/control_transfer_t09: CompileTimeError
-Language/Statements/Continue/label_t07: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError
-Language/Statements/Switch/execution_t01: MissingCompileTimeError
-Language/Statements/Switch/expressions_t01: MissingCompileTimeError
-Language/Statements/Switch/expressions_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t04: MissingCompileTimeError
-Language/Statements/Switch/type_t01: MissingCompileTimeError
-Language/Statements/Switch/type_t02: MissingCompileTimeError
+Language/Statements/Continue/label_t07: MissingCompileTimeError # Issue 34206
+Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError # Issue 32557
+Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError # Issue 32557
+Language/Statements/Switch/execution_t01: MissingCompileTimeError # Issue 34207
+Language/Statements/Switch/expressions_t01: MissingCompileTimeError # Issue 34207
+Language/Statements/Switch/expressions_t02: MissingCompileTimeError # Issue 34207
+Language/Statements/Switch/expressions_t04: MissingCompileTimeError # Issue 34207
+Language/Statements/Switch/type_t01: MissingCompileTimeError # Issue 34207
+Language/Statements/Switch/type_t02: MissingCompileTimeError # Issue 34207
 Language/Statements/Try/catch_scope_t01: CompileTimeError
-Language/Types/Dynamic_Type_System/malbounded_type_error_t01: MissingCompileTimeError
+Language/Types/Dynamic_Type_System/malbounded_type_error_t01: MissingCompileTimeError # Issue 33308
 Language/Types/Interface_Types/subtype_t30: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t01: MissingCompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t05: MissingCompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t07: MissingCompileTimeError
-Language/Types/Parameterized_Types/malbounded_t01: MissingCompileTimeError
-Language/Types/Parameterized_Types/malbounded_t02: MissingCompileTimeError
-Language/Types/Parameterized_Types/malbounded_t03: MissingCompileTimeError
-Language/Types/Parameterized_Types/malbounded_t04: MissingCompileTimeError
-Language/Types/Parameterized_Types/malbounded_t05: MissingCompileTimeError
-Language/Types/Parameterized_Types/malbounded_t06: MissingCompileTimeError
-Language/Types/Static_Types/malformed_type_t01/04: MissingCompileTimeError
-Language/Types/Static_Types/malformed_type_t01/05: MissingCompileTimeError
-Language/Types/Static_Types/malformed_type_t01/06: MissingCompileTimeError
-Language/Types/Type_Void/returning_t03: MissingCompileTimeError
-Language/Types/Type_Void/returning_t04: MissingCompileTimeError
-Language/Types/Type_Void/returning_t05: MissingCompileTimeError
-Language/Types/Type_Void/syntax_t08: MissingCompileTimeError
-Language/Types/Type_Void/using_t01: MissingCompileTimeError
-Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
-Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
+Language/Types/Parameterized_Types/arity_mismatch_t01: MissingCompileTimeError # Issue 32972
+Language/Types/Parameterized_Types/arity_mismatch_t05: MissingCompileTimeError # Issue 32972
+Language/Types/Parameterized_Types/arity_mismatch_t07: MissingCompileTimeError # Issue 32972
+Language/Types/Parameterized_Types/malbounded_t01: MissingCompileTimeError # Issue 33308
+Language/Types/Parameterized_Types/malbounded_t02: MissingCompileTimeError # Issue 33308
+Language/Types/Parameterized_Types/malbounded_t03: MissingCompileTimeError # Issue 33308
+Language/Types/Parameterized_Types/malbounded_t04: MissingCompileTimeError # Issue 33308
+Language/Types/Parameterized_Types/malbounded_t05: MissingCompileTimeError # Issue 33308
+Language/Types/Parameterized_Types/malbounded_t06: MissingCompileTimeError # Issue 33308
+Language/Types/Static_Types/malformed_type_t01/04: MissingCompileTimeError # Issue 33308
+Language/Types/Static_Types/malformed_type_t01/05: MissingCompileTimeError # Issue 33308
+Language/Types/Static_Types/malformed_type_t01/06: MissingCompileTimeError # Issue 33308
+Language/Types/Type_Void/returning_t03: MissingCompileTimeError # Issue 30470
+Language/Types/Type_Void/returning_t04: MissingCompileTimeError # Issue 30470
+Language/Types/Type_Void/returning_t05: MissingCompileTimeError # Issue 30470
+Language/Types/Type_Void/syntax_t08: MissingCompileTimeError # Issue 33308
+Language/Types/Type_Void/using_t01: MissingCompileTimeError # Issue 30470
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t03: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t04: MissingCompileTimeError
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index 2bf98e9..89eedbe 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -19,13 +19,11 @@
 import 'package:front_end/src/fasta/util/link.dart' show Link;
 import 'package:kernel/ast.dart' as ir;
 
-const List<String> skipForKernel = const <String>[];
-
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const ClosureDataComputer(),
-        skipForKernel: skipForKernel, args: args, testOmit: true);
+        args: args, testOmit: true);
   });
 }
 
@@ -199,8 +197,8 @@
       print(' capturedScope (${capturedScope.runtimeType})');
       capturedScope.forEachBoxedVariable((a, b) => print('  boxed: $a->$b'));
     }
-    print(' closureRepresentationInfo (${closureRepresentationInfo
-        .runtimeType})');
+    print(
+        ' closureRepresentationInfo (${closureRepresentationInfo.runtimeType})');
     closureRepresentationInfo
         ?.forEachFreeVariable((a, b) => print('  free: $a->$b'));
     closureRepresentationInfo
diff --git a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
index 159d8d2..835facd 100644
--- a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
@@ -7,67 +7,65 @@
 import '../compiler_helper.dart';
 
 const String INT_PLUS_ZERO = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+int foo(int x) => x;
+main() {
+  int x = foo(0);
   return (x & 1) + 0;
 }
 """;
 
 const String ZERO_PLUS_INT = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+int foo(int x) => x;
+main() {
+  int x = foo(0);
   return 0 + (x & 1);
 }
 """;
 
-// TODO(johnniwinther): Find out why this doesn't work without the `as num`
-// cast.
 const String NUM_PLUS_ZERO = """
-int foo(x) => x;
-void main() {
-  var x = foo(0) as num;
+num foo(num x) => x;
+main() {
+  num x = foo(0);
   return x + 0;
 }
 """;
 
 const String ZERO_PLUS_NUM = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+num foo(num x) => x;
+main() {
+  num x = foo(0);
   return 0 + x;
 }
 """;
 
 const String INT_TIMES_ONE = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+int foo(int x) => x;
+main() {
+  int x = foo(0);
   return (x & 1) * 1;
 }
 """;
 
 const String ONE_TIMES_INT = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+int foo(int x) => x;
+main() {
+  int x = foo(0);
   return 1 * (x & 1);
 }
 """;
 
 const String NUM_TIMES_ONE = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+num foo(num x) => x;
+main() {
+  num x = foo(0);
   return x * 1;
 }
 """;
 
 const String ONE_TIMES_NUM = """
-int foo(x) => x;
-void main() {
-  var x = foo(0);
+num foo(num x) => x;
+main() {
+  num x = foo(0);
   return 1 * x;
 }
 """;
diff --git a/tests/compiler/dart2js/codegen/boolify_test.dart b/tests/compiler/dart2js/codegen/boolify_test.dart
deleted file mode 100644
index 9f0c41b..0000000
--- a/tests/compiler/dart2js/codegen/boolify_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library boolify_test;
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = r"""
-foo() {
-  var a = foo();
-  if (!a) return 1;
-  return 2;
-}
-""";
-
-main() {
-  test() async {
-    await compile(TEST, entry: 'foo', check: (String generated) {
-      Expect.isTrue(generated.contains('foo() !== true)'));
-    });
-  }
-
-  asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await test();
-  });
-}
diff --git a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
index 74dda1b..9bb13e8 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
@@ -18,7 +18,7 @@
 const String TEST_2 = """
 foo() {
   var a = 'Hello';
-  var b = 1.5;
+  dynamic b = 1.5;
   return a.codeUnitAt(b);
 }
 """;
@@ -27,7 +27,7 @@
 const String TEST_3 = """
 foo() {
   var a = 'Hello';
-  var b = 55;
+  dynamic b = 55;
   return a.codeUnitAt(b);
 }
 """;
diff --git a/tests/compiler/dart2js/codegen/constant_namer_test.dart b/tests/compiler/dart2js/codegen/constant_namer_test.dart
index 3a491f9..eca5838 100644
--- a/tests/compiler/dart2js/codegen/constant_namer_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_namer_test.dart
@@ -14,7 +14,7 @@
     use() { print(this); }
   }
   test() {
-    const [12,53].use();
+    (const [12,53] as dynamic).use();
     const Token('start').use();
     const Token('end').use();
     const Token('yes', 12).use();
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index d4323ed..d23eb44 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
@@ -39,10 +38,10 @@
 void main(List<String> args) {
   print(method(args[0]));
   print(methodAssumeDynamic('foo'));
-  print(methodTrustTypeAnnotations(42));
+  print(methodTrustTypeAnnotations(42 as dynamic));
   print(methodTrustTypeAnnotations("fourtyTwo"));
   print(methodNoInline('bar'));
-  print(methodNoInlineTrustTypeAnnotations(42));
+  print(methodNoInlineTrustTypeAnnotations(42 as dynamic));
   print(methodNoInlineTrustTypeAnnotations("fourtyTwo"));
   print(methodAssumeDynamicTrustTypeAnnotations(null));
 }
@@ -51,14 +50,13 @@
 
 main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await runTest();
   });
 }
 
 runTest() async {
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: MEMORY_SOURCE_FILES, options: [Flags.noPreviewDart2]);
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
   Compiler compiler = result.compiler;
   JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
   Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
index 4d3fad9..ab196ad 100644
--- a/tests/compiler/dart2js/codegen/gvn_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_test.dart
@@ -52,11 +52,11 @@
 class B {}
 
 main() {
-  var a = [new B(), new A()][0];
+  dynamic a = [new B(), new A()][0];
   var b = a.foo;
   var c = a.foo;
   if (a is B) {
-    c = a.foo;
+    c = (a as dynamic).foo;
   }
   return b + c;
 }
@@ -69,7 +69,7 @@
 }
 
 main() {
-  var a = new A();
+  dynamic a = new A();
   while (a.field == 54) { a.field = 42; }
 }
 """;
@@ -84,8 +84,8 @@
 }
 
 main() {
-  var a = new A();
-  var b = new A.bar();
+  dynamic a = new A();
+  dynamic b = new A.bar();
   while (a.field == 54) { a.field = 42; b.field = 42; }
 }
 """;
@@ -99,8 +99,8 @@
 }
 
 main() {
-  var a = new A();
-  var b = new A.bar();
+  dynamic a = new A();
+  dynamic b = new A.bar();
   for (int i = 0; i < a.field; i++) { a.field = 42; b.field = 42; }
 }
 """;
diff --git a/tests/compiler/dart2js/codegen/if_do_while_test.dart b/tests/compiler/dart2js/codegen/if_do_while_test.dart
index fb6378a..63d5b1e 100644
--- a/tests/compiler/dart2js/codegen/if_do_while_test.dart
+++ b/tests/compiler/dart2js/codegen/if_do_while_test.dart
@@ -22,9 +22,11 @@
   runTest() async {
     await compile(TEST, entry: 'foo', check: (String generated) {
       // Check that the do-while in the 'then' is enclosed in braces.
-      // Otherwise Android 4.0 stock browser has a syntax error. See issue 10923.
-      Expect.isTrue(
-          new RegExp(r'if[ ]*\([^)]+\)[ ]*\{[\n ]*do').hasMatch(generated));
+      // Otherwise Android 4.0 stock browser has a syntax error. See issue
+      // 10923.
+      RegExp pattern = new RegExp(r'if[ ]*\([^)]+\)[ ]*\{[\n ]*do');
+      Expect.isTrue(pattern.hasMatch(generated),
+          "Code pattern $pattern not found in\n$generated");
     });
   }
 
diff --git a/tests/compiler/dart2js/codegen/inferrer_factory_test.dart b/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
deleted file mode 100644
index 30bb917..0000000
--- a/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import '../compiler_helper.dart';
-
-const String TEST1 = r"""
-class A implements List {
-  factory A() {
-    // Avoid inlining by using try/catch.
-    try {
-      return new List();
-    } catch (e) {
-    }
-  }
-}
-
-main() {
-  new A()[0] = 42;
-}
-""";
-
-main() {
-  runTest() async {
-    String generated = await compileAll(TEST1);
-    // Check that we're using the index operator on the object returned
-    // by the A factory.
-    Expect.isTrue(generated.contains('[0] = 42'));
-  }
-
-  asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTest();
-  });
-}
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
index b7ecdeb..c915f48 100644
--- a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
@@ -32,14 +32,10 @@
 
 main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTest([Flags.noPreviewDart2]);
-    print('--test from kernel (trust-type-annotations)-----------------------');
-    await runTest([Flags.noPreviewDart2, Flags.trustTypeAnnotations]);
     print('--test from kernel (strong mode)----------------------------------');
-    await runTest([Flags.strongMode]);
-    print('--test from kernel (strong mode, omit-implicit.checks)------------');
-    await runTest([Flags.strongMode, Flags.omitImplicitChecks]);
+    await runTest([]);
+    print('--test from kernel (strong mode, omit-implicit-checks)------------');
+    await runTest([Flags.omitImplicitChecks]);
   });
 }
 
diff --git a/tests/compiler/dart2js/codegen/licm_test.dart b/tests/compiler/dart2js/codegen/licm_test.dart
index a5c397b..731da5c 100644
--- a/tests/compiler/dart2js/codegen/licm_test.dart
+++ b/tests/compiler/dart2js/codegen/licm_test.dart
@@ -12,7 +12,7 @@
 var a = [1];
 
 main() {
-  int count = int.parse('42') == 42 ? 42 : null;
+  dynamic count = int.parse('42') == 42 ? 42 : null;
   for (int i = 0; i < count && i < a[0]; i++) {
     print(i);
   }
diff --git a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
index 339512a..5ce5970 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// TODO(johnniwinther): Currently this only works with the mock compiler.
-
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../compiler_helper.dart';
@@ -70,23 +68,41 @@
 
 main() {
   runTests() async {
-    String generated1 = await compileAll(TEST1);
-    Expect.isTrue(generated1.contains('if (typeof t1'));
+    String generated1 = await compile(TEST1, disableTypeInference: false);
+    Expect.isTrue(
+        generated1.contains('if (typeof t1'),
+        "Code pattern 'if (typeof t1' not found in\n$generated1\n"
+        "for source\n$TEST1");
 
-    String generated2 = await compileAll(TEST2);
-    Expect.isTrue(generated2.contains('if (typeof t1'));
+    String generated2 = await compile(TEST2, disableTypeInference: false);
+    Expect.isTrue(
+        generated2.contains('if (typeof t1'),
+        "Code pattern 'if (typeof t1' not found in\n$generated2\n"
+        "for source\n$TEST2");
 
-    String generated3 = await compileAll(TEST3);
-    Expect.isTrue(generated3.contains('if (typeof t1'));
+    String generated3 = await compile(TEST3, disableTypeInference: false);
+    Expect.isTrue(
+        generated3.contains('if (typeof t1'),
+        "Code pattern 'if (typeof t1' not found in\n$generated3\n"
+        "for source\n$TEST3");
 
-    String generated4 = await compileAll(TEST4);
-    Expect.isTrue(generated4.contains('if (typeof t1'));
+    String generated4 = await compile(TEST4, disableTypeInference: false);
+    Expect.isTrue(
+        generated4.contains('if (typeof t1'),
+        "Code pattern 'if (typeof t1' not found in\n$generated4\n"
+        "for source\n$TEST4");
 
-    String generated5 = await compileAll(TEST5);
-    Expect.isFalse(generated5.contains('iae'));
+    String generated5 = await compile(TEST5, disableTypeInference: false);
+    Expect.isFalse(
+        generated5.contains('iae'),
+        "Code pattern 'iae' found in\n$generated5\n"
+        "for source\n$TEST5");
 
-    String generated6 = await compileAll(TEST6);
-    Expect.isFalse(generated6.contains('iae'));
+    String generated6 = await compile(TEST6, disableTypeInference: false);
+    Expect.isFalse(
+        generated6.contains('iae'),
+        "Code pattern 'iae' found in\n$generated6\n"
+        "for source\n$TEST6");
 
     var memberInvocations = const <String>[
       'first',
@@ -98,22 +114,20 @@
       'removeLast()',
     ];
     for (String member in memberInvocations) {
-      String generated = await compileAll(generateTest('$member'),
-          expectedErrors: 0, expectedWarnings: 0);
+      String generated =
+          await compile(generateTest('$member'), disableTypeInference: false);
       Expect.isTrue(
           generated.contains('+ 42'),
           "Missing '+ 42' code for invocation '$member':\n"
           "$generated");
-      // TODO(johnniwinther): Update this test to query the generated code for
-      // main only.
-      /*Expect.isFalse(
+      Expect.isFalse(
           generated.contains('if (typeof t1'),
           "Unexpected 'if (typeof t1' code for invocation '$member':\n"
           "$generated");
       Expect.isFalse(
           generated.contains('if (t1 == null)'),
           "Unexpected 'if (t1 == null)' code for invocation '$member':\n"
-          "$generated");*/
+          "$generated");
     }
   }
 
diff --git a/tests/compiler/dart2js/codegen/literal_list_test.dart b/tests/compiler/dart2js/codegen/literal_list_test.dart
index a989045..bae6dea 100644
--- a/tests/compiler/dart2js/codegen/literal_list_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_list_test.dart
@@ -18,9 +18,12 @@
 main() {
   runTest() async {
     await compile(TEST_ONE, entry: 'foo', check: (String generated) {
-      Expect.isTrue(generated.contains('print([1, 2]);'));
-      Expect.isTrue(generated.contains('print([3]);'));
-      Expect.isTrue(generated.contains('print([4, 5]);'));
+      Expect.isTrue(generated.contains('print([1, 2]);'),
+          "Code pattern 'print([1, 2]);' not found in\n$generated");
+      Expect.isTrue(generated.contains('print([3]);'),
+          "Code pattern 'print([3]);' not found in\n$generated");
+      Expect.isTrue(generated.contains('print([4, 5]);'),
+          "Code pattern 'print([4, 5]);' not found in\n$generated");
     });
   }
 
diff --git a/tests/compiler/dart2js/codegen/load_elimination_test.dart b/tests/compiler/dart2js/codegen/load_elimination_test.dart
index c6d6e27..be948ce 100644
--- a/tests/compiler/dart2js/codegen/load_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/load_elimination_test.dart
@@ -11,7 +11,7 @@
   var a = 42;
 }
 
-void main() {
+main() {
   new A().a = 54;
   return new A().a;
 }
@@ -22,7 +22,7 @@
   var a = 42;
 }
 
-void main() {
+main() {
   return new A().a;
 }
 """;
@@ -32,7 +32,7 @@
   var a = 42;
 }
 
-void main() {
+main() {
   var a = new A();
   return a.a + a.a;
 }
@@ -44,7 +44,7 @@
 }
 
 var list = [];
-void main() {
+main() {
   new A().a = 54;
   var a = new A();
   list.add(a);
@@ -58,7 +58,7 @@
 }
 
 var list = [];
-void main() {
+main() {
   var a = new A();
   list.add(a);
   return a.a + a.a;
@@ -71,7 +71,7 @@
 }
 
 var list = [new A()];
-void main() {
+main() {
   var a = new A();
   var b = list[0];
   b.a = 52;
@@ -85,7 +85,7 @@
 }
 
 var list = [new A(), new A()];
-void main() {
+main() {
   var a = list[0];
   a.a = 32;
   return a.a;
@@ -98,7 +98,7 @@
 }
 
 var list = [new A(), new A()];
-void main() {
+main() {
   var a = list[0];
   a.a = 32;
   var b = list[1];
@@ -112,7 +112,7 @@
   var a = 42;
 }
 
-void main() {
+main() {
   var a = new A();
   (() => a.a = 2)();
   return a.a;
@@ -124,7 +124,7 @@
   var a = 42;
 }
 
-void main() {
+main() {
   var a = new A();
   a.a = 2;
   return a.a;
@@ -144,7 +144,7 @@
   }
 }
 
-void main() {
+main() {
   var a = new A(42);
   var b = new A.bar(a);
   b.foo();
@@ -156,7 +156,7 @@
 var a;
 var b;
 
-void main() {
+main() {
   a = 10;
   b = 4;
   return a - b;
@@ -166,7 +166,7 @@
 const String TEST_13 = """
 var a = [1, 2];
 
-void main() {
+main() {
   a[0] = 10;
   a[1] = 4;
   return a[0] - a[1];
@@ -177,7 +177,7 @@
 var a = [1, 2];
 var b = [1, 2];
 
-void main() {
+main() {
   a[0] = 10;
   b[0] = 4;
   return a[0];
@@ -187,7 +187,7 @@
 const String TEST_15 = """
 var a;
 
-void main() {
+main() {
   a = 42;
   if (true) {
   }
@@ -198,7 +198,7 @@
 const String TEST_16 = """
 var a;
 
-void main() {
+main() {
   a = false;
   if (main() && main()) {
     a = true;
@@ -210,7 +210,7 @@
 const String TEST_17 = """
 var a;
 
-void main() {
+main() {
   if (main()) {
     a = true;
   } else {
@@ -222,7 +222,7 @@
 
 const String TEST_18 = """
 
-void main() {
+main() {
   var a = [42, true];
   if (a[1]) {
     a[0] = 1;
@@ -236,7 +236,8 @@
 main() {
   runTests() async {
     test(String code, String expected) async {
-      String generated = await compileAll(code, disableInlining: false);
+      String generated = await compile(code,
+          disableInlining: false, disableTypeInference: false);
       Expect.isTrue(
           generated.contains(expected),
           "Generated code didn't contain '$expected'.\n"
diff --git a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
index bd68a4c..f23704d 100644
--- a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
@@ -61,7 +61,7 @@
 """;
 
 const String PARAMETER_INIT = r"""
-int foo(var start, bool test) {
+int foo(var start, var test) {
   var result = start;
   if (test) {
     foo(1, 2);
diff --git a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
index b5fd0c1..d06e5ba 100644
--- a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
@@ -64,14 +64,13 @@
     hash = hash + 10;
     hash = hash + 42;
   }
-  print(t);
+  print(hash);
 }
 """;
 
 main() {
   runTests() async {
-    await compileAndMatchFuzzy(
-        TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;");
+    await compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x \\? 2 : 3;");
     await compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);");
 
     await compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10");
diff --git a/tests/compiler/dart2js/codegen/strength_eq_test.dart b/tests/compiler/dart2js/codegen/strength_eq_test.dart
index b75b0c5..c2f063a 100644
--- a/tests/compiler/dart2js/codegen/strength_eq_test.dart
+++ b/tests/compiler/dart2js/codegen/strength_eq_test.dart
@@ -10,7 +10,7 @@
 class A {
   var link;
 }
-int foo(x) {
+foo(x) {
   if (new DateTime.now().millisecondsSinceEpoch == 42) return null;
   var a = new A();
   if (new DateTime.now().millisecondsSinceEpoch == 42) return a;
@@ -25,8 +25,8 @@
 
 main() {
   runTest() async {
-    // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
-    // `x.link`, so x cannot be `null`.
+    // The `==` is strengthened to a HIdentity instruction. The HIdentity
+    // follows `x.link`, so x cannot be `null`.
     var compare = new RegExp(r'x === x\.get\$link\(\)');
     await compileAndMatch(CODE, 'main', compare);
   }
diff --git a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
index 4fc1bf7..19121e1 100644
--- a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
@@ -36,8 +36,8 @@
       default:
         a = 33;
     }
+    print(a);
   }
-  print(a);
 }
 """;
 
@@ -54,8 +54,8 @@
       default:
         b = 0;
     }
+    print(a+b);
   }
-  print(a+b);
 }
 """;
 
@@ -70,12 +70,11 @@
         b = 0;
         continue K;
       K: case 3:
-        b = 19;
-      default:
+        default:
         b = 5;
     }
+    print(a+b);
   }
-  print(a+b);
 }
 """;
 
@@ -92,8 +91,8 @@
       L: default:
         b = 5;
     }
+    print(a+b);
   }
-  print(a+b);
 }
 """;
 
@@ -109,8 +108,8 @@
         break;
       L: default:
     }
+    print(a+b);
   }
-  print(a+b);
 }
 """;
 
diff --git a/tests/compiler/dart2js/codegen/tree_shaking_test.dart b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
index 2d8d365..8fa1ee9 100644
--- a/tests/compiler/dart2js/codegen/tree_shaking_test.dart
+++ b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
@@ -16,6 +16,7 @@
 }
 class C implements A {
   bar() => 68;
+  noSuchMethod(_) {}
 }
 main() {
   new A();
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
index b8282c5..900a628 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
@@ -35,11 +35,11 @@
 }
 
 main () {
-  var a = new A("42");
+  var a = new A("42" as dynamic);
   print(a.aField);
   print(a.foo("42"));
   print(a.foo(42));
-  print(a.faa("42"));
+  print(a.faa("42" as dynamic));
   print(a.faa(42));
   print(a.baz("42"));
   print(a.baz(42));
@@ -51,7 +51,7 @@
 
 void main() {
   runTest() async {
-    var options = [Flags.noPreviewDart2, Flags.trustTypeAnnotations];
+    var options = [Flags.omitImplicitChecks];
     var result = await runCompiler(
         memorySourceFiles: {'main.dart': TEST}, options: options);
     var compiler = result.compiler;
diff --git a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
index 3232909..0b3e412 100644
--- a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
@@ -46,8 +46,8 @@
       RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
       Iterator<Match> matches = regexp.allMatches(generated).iterator;
       checkNumberOfMatches(matches, 0);
-      Expect.isTrue(generated.contains(
-          new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
+      Expect.isTrue(generated
+          .contains(new RegExp(r'return a \? [$A-Z]+\.foo\(2\) : b;')));
     });
     await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp("foo\\(1\\)");
diff --git a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
index 0326068..aa6a3b7 100644
--- a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
+++ b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
@@ -26,7 +26,7 @@
 
 const String TEST3 = r"""
 main() {
-  var a = 52;
+  dynamic a = 52;
   var g = () { a = 'foo'; };
   var f = () => a + 87;
   f();
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 5415410..e85ade1 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -45,17 +45,21 @@
     bool minify: false,
     bool disableInlining: true,
     bool trustJSInteropTypeAnnotations: false,
+    bool disableTypeInference: true,
+    bool omitImplicitChecks: true,
     void check(String generatedEntry),
     bool returnAll: false}) async {
   OutputCollector outputCollector = returnAll ? new OutputCollector() : null;
-  // TODO(sigmund): use strong-mode.
-  List<String> options = <String>[
-    Flags.noPreviewDart2,
-    Flags.disableTypeInference
-  ];
+  List<String> options = <String>[];
+  if (disableTypeInference) {
+    options.add(Flags.disableTypeInference);
+  }
   if (enableTypeAssertions) {
     options.add(Flags.enableCheckedMode);
   }
+  if (omitImplicitChecks) {
+    options.add(Flags.omitImplicitChecks);
+  }
   if (minify) {
     options.add(Flags.minify);
   }
@@ -101,7 +105,7 @@
     int expectedWarnings}) async {
   OutputCollector outputCollector = new OutputCollector();
   DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
-  List<String> options = <String>[Flags.noPreviewDart2];
+  List<String> options = <String>[];
   if (disableInlining) {
     options.add(Flags.disableInlining);
   }
@@ -145,15 +149,15 @@
 
 Future compileAndMatch(String code, String entry, RegExp regexp) {
   return compile(code, entry: entry, check: (String generated) {
-    Expect.isTrue(
-        regexp.hasMatch(generated), '"$generated" does not match /$regexp/');
+    Expect.isTrue(regexp.hasMatch(generated),
+        '"$generated" does not match /$regexp/ from source:\n$code');
   });
 }
 
 Future compileAndDoNotMatch(String code, String entry, RegExp regexp) {
   return compile(code, entry: entry, check: (String generated) {
-    Expect.isFalse(
-        regexp.hasMatch(generated), '"$generated" has a match in /$regexp/');
+    Expect.isFalse(regexp.hasMatch(generated),
+        '"$generated" has a match in /$regexp/ from source:\n$code');
   });
 }
 
@@ -172,14 +176,19 @@
 Future compileAndMatchFuzzyHelper(String code, String entry, String regexp,
     {bool shouldMatch}) {
   return compile(code, entry: entry, check: (String generated) {
+    String originalRegexp = regexp;
     final xRe = new RegExp('\\bx\\b');
     regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
     final spaceRe = new RegExp('\\s+');
     regexp = regexp.replaceAll(spaceRe, '(?:\\s*)');
     if (shouldMatch) {
-      Expect.isTrue(new RegExp(regexp).hasMatch(generated));
+      Expect.isTrue(
+          new RegExp(regexp).hasMatch(generated),
+          "Pattern '$originalRegexp' not found in\n$generated\n"
+          "from source\n$code");
     } else {
-      Expect.isFalse(new RegExp(regexp).hasMatch(generated));
+      Expect.isFalse(new RegExp(regexp).hasMatch(generated),
+          "Pattern '$originalRegexp' found in\n$generated\nfrom source\n$code");
     }
   });
 }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 55d9c3e..150a79c 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -29,6 +29,7 @@
 kernel/*: Slow, Pass
 kernel/compile_from_dill_fast_startup_test: RuntimeError # Test must be updated to support FE with patching.
 kernel/compile_from_dill_test: RuntimeError # Test must be updated to support FE with patching.
+model/native_test: Pass, Slow
 model/subtype_test: Pass, Slow
 no_such_method_enabled_test: Pass, Slow
 packages/*: Skip # Skip packages folder
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index b98c3609..5fee0a1 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -18,8 +18,6 @@
 
 import 'package:kernel/ast.dart' as ir;
 
-const List<String> skipForKernel = const <String>[];
-
 ///  Add in options to pass to the compiler like
 /// `Flags.disableTypeInference` or `Flags.disableInlining`
 const List<String> compilerOptions = const <String>[];
@@ -34,7 +32,6 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const OutputUnitDataComputer(),
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
-        skipForKernel: skipForKernel,
         options: compilerOptions,
         args: args,
         testOmit: true, setUpFunction: () {
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 08a0a26..6cb57c2 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -490,7 +490,6 @@
 /// file and any supporting libraries.
 Future checkTests(Directory dataDir, DataComputer dataComputer,
     {bool testStrongMode: true,
-    List<String> skipForKernel: const <String>[],
     List<String> skipForStrong: const <String>[],
     bool filterActualData(IdValue idValue, ActualData actualData),
     List<String> options: const <String>[],
@@ -527,15 +526,13 @@
     if (shouldContinue) continued = true;
     testCount++;
     List<String> testOptions = options.toList();
-    bool strongModeOnlyTest = false;
     bool trustTypeAnnotations = false;
     if (name.endsWith('_ea.dart')) {
       testOptions.add(Flags.enableAsserts);
     }
     if (name.contains('_strong')) {
-      strongModeOnlyTest = true;
       if (!testStrongMode) {
-        testOptions.add(Flags.strongMode);
+        // TODO(johnniwinther): Remove irrelevant tests.
       }
     }
     if (name.endsWith('_checked.dart')) {
@@ -593,36 +590,12 @@
 
     if (setUpFunction != null) setUpFunction();
 
-    if (skipForKernel.contains(name) ||
-        (testStrongMode && strongModeOnlyTest)) {
-      print('--skipped for kernel--------------------------------------------');
-    } else {
-      print('--from kernel---------------------------------------------------');
-      List<String> options = [Flags.noPreviewDart2]..addAll(testOptions);
-      if (trustTypeAnnotations) {
-        options.add(Flags.trustTypeAnnotations);
-      }
-      MemberAnnotations<IdValue> annotations = expectedMaps[kernelMarker];
-      CompiledData compiledData2 = await computeData(
-          entryPoint, memorySourceFiles, dataComputer,
-          options: options,
-          verbose: verbose,
-          testFrontend: testFrontend,
-          forUserLibrariesOnly: forUserLibrariesOnly,
-          globalIds: annotations.globalData.keys);
-      if (await checkCode(
-          kernelName, entity.uri, code, annotations, compiledData2,
-          filterActualData: filterActualData,
-          fatalErrors: !testAfterFailures)) {
-        hasFailures = true;
-      }
-    }
     if (testStrongMode) {
       if (skipForStrong.contains(name)) {
         print('--skipped for kernel (strong mode)----------------------------');
       } else {
         print('--from kernel (strong mode)-----------------------------------');
-        List<String> options = [Flags.strongMode]..addAll(testOptions);
+        List<String> options = new List<String>.from(testOptions);
         if (trustTypeAnnotations && !testOmit) {
           options.add(Flags.omitImplicitChecks);
         }
@@ -648,7 +621,6 @@
       } else {
         print('--from kernel (strong mode, omit-implicit-checks)-------------');
         List<String> options = [
-          Flags.strongMode,
           Flags.omitImplicitChecks,
           Flags.laxRuntimeTypeToString
         ]..addAll(testOptions);
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index 1db6c07..3d5ac07 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -33,7 +33,6 @@
     useColors = argResults['colors'];
   }
   bool verbose = argResults['verbose'];
-  bool strongMode = argResults['strong'];
   bool omitImplicitChecks = argResults['omit-implicit-checks'];
   bool trustTypeAnnotations = argResults['trust-type-annotations'];
 
@@ -49,9 +48,6 @@
   }
 
   options = new List<String>.from(options);
-  if (!strongMode) {
-    options.add(Flags.noPreviewDart2);
-  }
   if (trustTypeAnnotations) {
     options.add(Flags.trustTypeAnnotations);
   }
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index 4d29bc9..eec0b3e 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:expect/expect.dart';
@@ -53,8 +52,7 @@
       F11(null);
       F12(null);
     }
-    """),
-        options: [Flags.strongMode]);
+    """));
 
     testToString(FunctionType type, String expectedToString) {
       Expect.equals(expectedToString, type.toString());
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index d4636c3..bc93229 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -177,7 +177,6 @@
     D8Result result = await runWithD8(memorySourceFiles: {
       'main.dart': SOURCE
     }, options: [
-      Flags.strongMode,
       Flags.disableRtiOptimization,
     ], expectedOutput: OUTPUT, printJs: args.contains('-v'));
     Compiler compiler = result.compilationResult.compiler;
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index ae12d71..1bded63 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:compiler/src/universe/call_structure.dart';
@@ -30,7 +29,7 @@
       ${createUses(signatures, prefix: 't')}
       ${createUses(signatures, prefix: 'm')}
     }
-    """, options: [Flags.strongMode]);
+    """);
 
     for (FunctionTypeData data in signatures) {
       FunctionType functionType = env.getElementType('t${data.name}');
diff --git a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
index ff59958..3a423a4 100644
--- a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
@@ -66,7 +66,7 @@
   asyncTest(() async {
     CompilationResult result = await runCompiler(
         memorySourceFiles: {'main.dart': code},
-        options: [Flags.strongMode, Flags.omitImplicitChecks]);
+        options: [Flags.omitImplicitChecks]);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/generic_methods/world_test.dart b/tests/compiler/dart2js/generic_methods/world_test.dart
index 4dbea81..97899ee 100644
--- a/tests/compiler/dart2js/generic_methods/world_test.dart
+++ b/tests/compiler/dart2js/generic_methods/world_test.dart
@@ -3,7 +3,6 @@
 // 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/compiler.dart';
 import 'package:compiler/src/universe/call_structure.dart';
 import 'package:compiler/src/universe/world_builder.dart';
@@ -85,8 +84,8 @@
 
 main() {
   asyncTest(() async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': code}, options: [Flags.strongMode]);
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': code});
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     CodegenWorldBuilder worldBuilder = compiler.codegenWorldBuilder;
diff --git a/tests/compiler/dart2js/helpers/element_lookup.dart b/tests/compiler/dart2js/helpers/element_lookup.dart
index 4823c94..4a46d08 100644
--- a/tests/compiler/dart2js/helpers/element_lookup.dart
+++ b/tests/compiler/dart2js/helpers/element_lookup.dart
@@ -17,6 +17,17 @@
       closedWorld.commonElements.interceptorsLibrary, name);
   cls ??= elementEnvironment.lookupClass(
       closedWorld.commonElements.jsHelperLibrary, name);
+  if (cls == null) {
+    for (LibraryEntity library in elementEnvironment.libraries) {
+      if (library.canonicalUri.scheme != 'dart' &&
+          library.canonicalUri.scheme != 'package') {
+        cls = elementEnvironment.lookupClass(library, name);
+        if (cls != null) {
+          break;
+        }
+      }
+    }
+  }
   assert(cls != null, "Class '$name' not found.");
   return cls;
 }
@@ -24,21 +35,49 @@
 MemberEntity findClassMember(
     JClosedWorld closedWorld, String className, String memberName,
     {bool required: true}) {
+  bool isSetter = false;
+  if (memberName.endsWith('=')) {
+    memberName = memberName.substring(0, memberName.length - 1);
+    isSetter = true;
+  }
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   ClassEntity cls = findClass(closedWorld, className);
   assert(cls != null, "Class '$className' not found.");
-  MemberEntity member = elementEnvironment.lookupClassMember(cls, memberName);
+  MemberEntity member =
+      elementEnvironment.lookupClassMember(cls, memberName, setter: isSetter);
+  if (member == null && !isSetter) {
+    member = elementEnvironment.lookupConstructor(cls, memberName);
+  }
   assert(
       !required || member != null, "Member '$memberName' not found in $cls.");
   return member;
 }
 
 MemberEntity findMember(JClosedWorld closedWorld, String name) {
+  bool isSetter = false;
+  if (name.endsWith('=')) {
+    name = name.substring(0, name.length - 1);
+    isSetter = true;
+  }
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   MemberEntity member = elementEnvironment.lookupLibraryMember(
-      elementEnvironment.mainLibrary, name);
+      elementEnvironment.mainLibrary, name,
+      setter: isSetter);
   member ??= elementEnvironment.lookupLibraryMember(
-      closedWorld.commonElements.coreLibrary, name);
+      closedWorld.commonElements.coreLibrary, name,
+      setter: isSetter);
+  if (member == null) {
+    for (LibraryEntity library in elementEnvironment.libraries) {
+      if (library.canonicalUri.scheme != 'dart' &&
+          library.canonicalUri.scheme != 'package') {
+        member = elementEnvironment.lookupLibraryMember(library, name,
+            setter: isSetter);
+        if (member != null) {
+          break;
+        }
+      }
+    }
+  }
   assert(member != null, "Member '$name' not found.");
   return member;
 }
diff --git a/tests/compiler/dart2js/impact/data/classes.dart b/tests/compiler/dart2js/impact/data/classes.dart
index 6b3c008..3085091 100644
--- a/tests/compiler/dart2js/impact/data/classes.dart
+++ b/tests/compiler/dart2js/impact/data/classes.dart
@@ -269,7 +269,7 @@
 }
 
 /*kernel.element: testInstanceGenericMethod:
- dynamic=[genericMethod(1)],
+ dynamic=[call(1),genericMethod(1)],
  static=[
   GenericClass.generative(0),
   assertIsSubtype,
diff --git a/tests/compiler/dart2js/impact/data/invokes.dart b/tests/compiler/dart2js/impact/data/invokes.dart
index 6de7f52..1633c30 100644
--- a/tests/compiler/dart2js/impact/data/invokes.dart
+++ b/tests/compiler/dart2js/impact/data/invokes.dart
@@ -439,6 +439,13 @@
 
 /*element: testDynamicInvoke:
  dynamic=[
+  call(1),
+  call(1,b),
+  call(1,b,c),
+  call(1,b,c),
+  call(1,c),
+  call(2),
+  call(3),
   f1(1),
   f2(1),
   f3(2),
@@ -628,11 +635,14 @@
   () {};
 }
 
-/*kernel.element: testClosureInvoke:dynamic=[call(0)],
-  static=[def:<anonymous>],
-  type=[inst:Function]*/
-/*strong.element: testClosureInvoke:dynamic=[call(0)],
-  static=[computeSignature,
+/*kernel.element: testClosureInvoke:
+ dynamic=[call(0)],
+ static=[def:<anonymous>],
+ type=[inst:Function]
+*/
+/*strong.element: testClosureInvoke:
+ dynamic=[call(0)],
+ static=[computeSignature,
   def:<anonymous>,
   getRuntimeTypeArguments,
   getRuntimeTypeInfo,
@@ -642,31 +652,39 @@
   inst:JSExtendableArray<dynamic>,
   inst:JSFixedArray<dynamic>,
   inst:JSMutableArray<dynamic>,
-  inst:JSUnmodifiableArray<dynamic>]*/
+  inst:JSUnmodifiableArray<dynamic>]
+*/
 testClosureInvoke() {
   () {}();
 }
 
-/*element: testInvokeIndex:dynamic=[[]],
-  type=[inst:JSDouble,
+/*element: testInvokeIndex:
+ dynamic=[[]],
+ type=[inst:JSDouble,
   inst:JSInt,
   inst:JSNumber,
   inst:JSPositiveInt,
   inst:JSUInt31,
-  inst:JSUInt32]*/
+  inst:JSUInt32]
+*/
 testInvokeIndex(o) => o[42];
 
-/*element: testInvokeIndexSet:dynamic=[[]=],
-  type=[inst:JSDouble,
+/*element: testInvokeIndexSet:
+ dynamic=[[]=],
+ type=[inst:JSDouble,
   inst:JSInt,
   inst:JSNull,
   inst:JSNumber,
   inst:JSPositiveInt,
   inst:JSUInt31,
-  inst:JSUInt32]*/
+  inst:JSUInt32]
+*/
 testInvokeIndexSet(o) => o[42] = null;
 
-/*element: testDynamicPrivateMethodInvoke:dynamic=[_privateMethod(0)],type=[inst:JSNull]*/
+/*element: testDynamicPrivateMethodInvoke:
+ dynamic=[_privateMethod(0),call(0)],
+ type=[inst:JSNull]
+*/
 testDynamicPrivateMethodInvoke([o]) => o._privateMethod();
 
 class GenericClass<X, Y> {}
diff --git a/tests/compiler/dart2js/impact/data/jsinterop.dart b/tests/compiler/dart2js/impact/data/jsinterop.dart
index 3c966dd..053d722 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop.dart
@@ -61,7 +61,14 @@
   external double method();
 }
 
-/*element: testJsInteropClass:dynamic=[method(0)],static=[JsInteropClass.(0)]*/
+/*kernel.element: testJsInteropClass:
+ dynamic=[call(0),method(0)],
+ static=[JsInteropClass.(0)]
+*/
+/*strong.element: testJsInteropClass:
+ dynamic=[method(0)],
+ static=[JsInteropClass.(0)]
+*/
 testJsInteropClass() => new JsInteropClass().method();
 
 typedef void Callback<T>(T value);
@@ -96,5 +103,12 @@
   external GenericClass method([Callback<T> callback]);
 }
 
-/*element: testOptionalGenericFunctionTypeArgument:dynamic=[method(0)],static=[GenericClass.(0)]*/
+/*kernel.element: testOptionalGenericFunctionTypeArgument:
+ dynamic=[call(0),method(0)],
+ static=[GenericClass.(0)]
+*/
+/*strong.element: testOptionalGenericFunctionTypeArgument:
+ dynamic=[method(0)],
+ static=[GenericClass.(0)]
+*/
 testOptionalGenericFunctionTypeArgument() => new GenericClass().method();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_closure.dart b/tests/compiler/dart2js/inference/data/expose_this_closure.dart
index d49b4e2..6619281 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_closure.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_closure.dart
@@ -6,7 +6,6 @@
 main() {
   exposeThis1();
   exposeThis2();
-  exposeThis3();
   exposeThis4();
   exposeThis5();
 }
@@ -53,39 +52,6 @@
 exposeThis2() => new Class2();
 
 ////////////////////////////////////////////////////////////////////////////////
-// Class with super call containing closure between two initializers.
-////////////////////////////////////////////////////////////////////////////////
-
-abstract class SuperClass1 {
-  /*element: SuperClass1.:[exact=Class3]*/
-  SuperClass1(
-      /*kernel.[null|subclass=Object]*/
-      /*strong.[null|subclass=JSInt]*/
-      o);
-}
-
-class Class3 extends SuperClass1 {
-  /*element: Class3.field1:[exact=JSUInt31]*/
-  var field1;
-  // The inferred type of the field includes `null` because `this` has been
-  // exposed before its initialization.
-  /*element: Class3.field2:[null|exact=JSUInt31]*/
-  var field2;
-
-  /*element: Class3.:[exact=Class3]*/
-  Class3()
-      : field1 = 42,
-        // ignore: STRONG_MODE_INVALID_SUPER_INVOCATION
-        super(/*[exact=JSUInt31]*/ () {
-          return 42;
-        }()),
-        field2 = 87;
-}
-
-/*element: exposeThis3:[exact=Class3]*/
-exposeThis3() => new Class3();
-
-////////////////////////////////////////////////////////////////////////////////
 // Class with closure after two initializers in the constructor body.
 ////////////////////////////////////////////////////////////////////////////////
 
diff --git a/tests/compiler/dart2js/inference/data/factory.dart b/tests/compiler/dart2js/inference/data/factory.dart
new file mode 100644
index 0000000..624a334
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/factory.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  /*element: A.generative:[exact=A]*/
+  A.generative();
+
+  factory A.redirect() = B;
+
+  /*element: A.fact:[exact=C]*/
+  factory A.fact() => new C();
+}
+
+/*element: B.:[exact=B]*/
+class B implements A {}
+
+/*element: C.:[exact=C]*/
+class C implements A {}
+
+/*element: main:[null]*/
+main() {
+  createGenerative();
+  createRedirecting();
+  createFactory();
+}
+
+/*element: createGenerative:[exact=A]*/
+createGenerative() => new A.generative();
+
+/*element: createRedirecting:[exact=B]*/
+createRedirecting() => new A.redirect();
+
+/*element: createFactory:[exact=C]*/
+createFactory() => new A.fact();
diff --git a/tests/compiler/dart2js/inference/data/field_type.dart b/tests/compiler/dart2js/inference/data/field_type.dart
index 44168f3..da7880c 100644
--- a/tests/compiler/dart2js/inference/data/field_type.dart
+++ b/tests/compiler/dart2js/inference/data/field_type.dart
@@ -554,10 +554,10 @@
   /*element: A23.:[exact=A23]*/
   A23() {
     // Test string interpolation.
-    '${/*update: [exact=A23]*/f23a = null}';
+    '${/*update: [exact=A23]*/ f23a = null}';
     // Test string juxtaposition.
     ''
-        '${/*update: [exact=A23]*/f23b = null}';
+        '${/*update: [exact=A23]*/ f23b = null}';
     // Test list literal.
     [/*update: [exact=A23]*/ f23c = null];
     // Test map literal.
diff --git a/tests/compiler/dart2js/inference/data/initializer.dart b/tests/compiler/dart2js/inference/data/initializer.dart
index 0a38dfe..933f92e 100644
--- a/tests/compiler/dart2js/inference/data/initializer.dart
+++ b/tests/compiler/dart2js/inference/data/initializer.dart
@@ -8,7 +8,6 @@
   fieldInitializer();
   thisInitializer();
   superInitializer();
-  superInitializerFirst();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -78,31 +77,3 @@
 
 /*element: superInitializer:[exact=Class4]*/
 superInitializer() => new Class4(0);
-
-////////////////////////////////////////////////////////////////////////////////
-// Constructor with super constructor call before field initializer.
-////////////////////////////////////////////////////////////////////////////////
-
-abstract class SuperClass5 {
-  /*element: SuperClass5.field1:[exact=JSUInt31]*/
-  var field1;
-
-  /*element: SuperClass5.:[exact=Class5]*/
-  SuperClass5(this. /*[exact=JSUInt31]*/ field1);
-}
-
-class Class5 extends SuperClass5 {
-  /*element: Class5.field2:Value([exact=JSString], value: "")*/
-  var field2;
-
-  /*element: Class5.:[exact=Class5]*/
-  Class5(
-      /*[exact=JSUInt31]*/ field1,
-      /*Value([exact=JSString], value: "")*/ field2)
-      // ignore: STRONG_MODE_INVALID_SUPER_INVOCATION
-      : super(field1),
-        this.field2 = field2;
-}
-
-/*element: superInitializerFirst:[exact=Class5]*/
-superInitializerFirst() => new Class5(0, '');
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index 43d222a..736f033 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -19,11 +19,6 @@
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
 
-const List<String> skipForKernel = const <String>[
-  // TODO(johnniwinther): Remove this when issue 31767 is fixed.
-  'mixin_constructor_default_parameter_values.dart',
-];
-
 const List<String> skipForStrong = const <String>[
   // TODO(johnniwinther): Remove this when issue 31767 is fixed.
   'mixin_constructor_default_parameter_values.dart',
@@ -49,7 +44,6 @@
         forUserLibrariesOnly: true,
         args: args,
         options: [stopAfterTypeInference],
-        skipForKernel: skipForKernel,
         skipForStrong: skipForStrong,
         shardIndex: shardIndex ?? 0,
         shards: shardIndex != null ? 2 : 1, onTest: (Uri uri) {
diff --git a/tests/compiler/dart2js/inference/libs/mixin_constructor_default_parameter_values_lib.dart b/tests/compiler/dart2js/inference/libs/mixin_constructor_default_parameter_values_lib.dart
index 0578297..a105fa0 100644
--- a/tests/compiler/dart2js/inference/libs/mixin_constructor_default_parameter_values_lib.dart
+++ b/tests/compiler/dart2js/inference/libs/mixin_constructor_default_parameter_values_lib.dart
@@ -29,5 +29,5 @@
         this.y = b;
 
   /*element: C.toString:[exact=JSString]*/
-  String toString() => "C(${/*[exact=D]*/x},${/*[exact=D]*/y})";
+  String toString() => "C(${/*[exact=D]*/ x},${/*[exact=D]*/ y})";
 }
diff --git a/tests/compiler/dart2js/inference/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
index 24dcb84..d474b9d 100644
--- a/tests/compiler/dart2js/inference/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_test.dart
@@ -3,7 +3,6 @@
 // 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/inferrer/typemasks/masks.dart';
 import 'package:expect/expect.dart';
 
@@ -13,8 +12,8 @@
 
 String generateTest(String listAllocation) {
   return """
-int anInt = 42;
-double aDouble = 42.5;
+dynamic anInt = 42;
+dynamic aDouble = 42.5;
 
 class A {
   final field;
@@ -22,7 +21,7 @@
 
   A(this.field);
 
-  A.bar(list) {
+  A.bar(list) : field = null {
     nonFinalField = list;
   }
 
@@ -144,14 +143,14 @@
   listUsedWithConstraint[0] += anInt;
 
   listEscapingFromSetter[0] = anInt;
-  foo(new A(null).field = listEscapingFromSetter);
+  foo((new A(null) as dynamic).field = listEscapingFromSetter);
 
   listUsedInLocal[0] = anInt;
-  var a = listUsedInLocal;
+  dynamic a = listUsedInLocal;
   listUsedInLocal[1] = aDouble;
 
   // At least use [listUnused] in a local to pretend it's used.
-  var b = listUnset;
+  dynamic b = listUnset;
 
   listOnlySetWithConstraint[0]++;
 
@@ -190,28 +189,25 @@
 void main() {
   runTest() async {
     // Test literal list.
-    await doTest('[]', nullify: false);
+    await doTest('<dynamic>[]', nullify: false);
     // Test growable list.
-    await doTest('new List()', nullify: false);
+    await doTest('new List<dynamic>()', nullify: false);
     // Test fixed list.
-    await doTest('new List(1)', nullify: true);
+    await doTest('new List<dynamic>(1)', nullify: true);
     // Test List.filled.
-    await doTest('new List.filled(1, 0)', nullify: false);
+    await doTest('new List<dynamic>.filled(1, 0)', nullify: false);
     // Test List.filled.
-    await doTest('new List.filled(1, null)', nullify: true);
+    await doTest('new List<dynamic>.filled(1, null)', nullify: true);
   }
 
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await runTest();
   });
 }
 
 doTest(String allocation, {bool nullify}) async {
   String source = generateTest(allocation);
-  var result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: [Flags.noPreviewDart2]);
+  var result = await runCompiler(memorySourceFiles: {'main.dart': source});
   Expect.isTrue(result.isSuccess);
   var compiler = result.compiler;
   var typesInferrer = compiler.globalInference.typesInferrerInternal;
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index 0bcafc9..a6d709c 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -29,14 +29,10 @@
 
 main() async {
   asyncTest(() async {
-    print('--test Dart 1 ----------------------------------------------------');
-    await runTest([Flags.noPreviewDart2], trust: false);
-    print('--test Dart 1 --trust-type-annotations ---------------------------');
-    await runTest([Flags.noPreviewDart2, Flags.trustTypeAnnotations]);
     print('--test Dart 2 ----------------------------------------------------');
-    await runTest([Flags.strongMode], trust: false);
+    await runTest([], trust: false);
     print('--test Dart 2 --omit-implicit-checks -----------------------------');
-    await runTest([Flags.strongMode, Flags.omitImplicitChecks]);
+    await runTest([Flags.omitImplicitChecks]);
   });
 }
 
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index e30eaa8..44426e8 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -3,7 +3,6 @@
 // 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/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
@@ -18,8 +17,8 @@
 
 String generateTest(String mapAllocation) {
   return """
-int anInt = 42;
-double aDouble = 42.5;
+dynamic anInt = 42;
+dynamic aDouble = 42.5;
 String aKey = 'aKey';
 String anotherKey = 'anotherKey';
 String presetKey = 'presetKey';
@@ -30,7 +29,7 @@
 
   A(this.field);
 
-  A.bar(map) {
+  A.bar(map) : field = null {
     nonFinalField = map;
   }
 
@@ -160,14 +159,14 @@
   mapUsedWithConstraint[aKey] += anInt;
 
   mapEscapingFromSetter[aKey] = anInt;
-  foo(new A(null).field = mapEscapingFromSetter);
+  foo((new A(null) as dynamic).field = mapEscapingFromSetter);
 
   mapUsedInLocal[aKey] = anInt;
-  var a = mapUsedInLocal;
+  dynamic a = mapUsedInLocal;
   mapUsedInLocal[anotherKey] = aDouble;
 
   // At least use [mapUnset] in a local to pretend it's used.
-  var b = mapUnset;
+  dynamic b = mapUnset;
 
   mapOnlySetWithConstraint[aKey]++;
 
@@ -210,17 +209,16 @@
 void main() {
   runTests() async {
     // Test empty literal map
-    await doTest('{}');
+    await doTest('<dynamic, dynamic>{}');
     // Test preset map of <String,uint32>
-    await doTest('{presetKey : anInt}',
+    await doTest('<dynamic, dynamic>{presetKey : anInt}',
         keyElementName: "presetKey", valueElementName: "anInt");
     // Test preset map of <Double,uint32>
-    await doTest('{aDouble : anInt}',
+    await doTest('<dynamic, dynamic>{aDouble : anInt}',
         keyElementName: "aDouble", valueElementName: "anInt");
   }
 
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await runTests();
   });
 }
@@ -228,9 +226,7 @@
 doTest(String allocation,
     {String keyElementName, String valueElementName}) async {
   String source = generateTest(allocation);
-  var result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: [Flags.noPreviewDart2]);
+  var result = await runCompiler(memorySourceFiles: {'main.dart': source});
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   TypeMask keyType, valueType;
diff --git a/tests/compiler/dart2js/inference/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
index 4304c1a..77e2bfe 100644
--- a/tests/compiler/dart2js/inference/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -740,26 +739,24 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await runTests();
   });
 }
 
 runTests() async {
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {
-        'main.dart': r'''
+  CompilationResult result = await runCompiler(memorySourceFiles: {
+    'main.dart': r'''
     import 'dart:collection';
-    class AList<E> extends ListBase<E> {}
+    class AList<E> extends ListBase<E> {
+      noSuchMethod(_) {}
+    }
     main() {
       print('${0}${true}${null}${0.5}${[]}${{}}');
       print('${"".split("")}${new RegExp('')}');
       print('${const []}${const {}}${(){}}${new AList()}');
     }
     '''
-      },
-      beforeRun: (compiler) => compiler.stopAfterTypeInference = true,
-      options: [Flags.noPreviewDart2]);
+  }, beforeRun: (compiler) => compiler.stopAfterTypeInference = true);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
index 782b867..b2f73fe 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
@@ -49,6 +49,16 @@
   } while (i < 10);
 }
 
+/*element: _hardLoop:loop,(allowLoops)code after return*/
+@ForceInline()
+_hardLoop() {
+  for (int i = 0; i < 10; i++) {
+    if (i % 2 == 0) return 2;
+    if (i % 3 == 0) return 3;
+  }
+  return 1;
+}
+
 /*element: forceInlineLoops:[]*/
 @NoInline()
 forceInlineLoops() {
@@ -56,4 +66,5 @@
   _forInLoop();
   _whileLoop();
   _doLoop();
+  _hardLoop();
 }
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index 8c5d88c..110b7b3 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -93,15 +93,27 @@
         }
       });
       StringBuffer sb = new StringBuffer();
-      String tooDifficultReason = getTooDifficultReason(member);
+      String tooDifficultReason1 = getTooDifficultReasonForbidLoops(member);
+      String tooDifficultReason2 = getTooDifficultReasonAllowLoops(member);
       inlinedIn.sort();
-      if (tooDifficultReason != null) {
-        sb.write(tooDifficultReason);
-        if (inlinedIn.isNotEmpty) {
-          sb.write(',[${inlinedIn.join(',')}]');
-        }
-      } else {
-        sb.write('[${inlinedIn.join(',')}]');
+      String sep = '';
+      if (tooDifficultReason1 != null) {
+        sb.write(sep);
+        sb.write(tooDifficultReason1);
+        sep = ',';
+      }
+      if (tooDifficultReason2 != null &&
+          tooDifficultReason2 != tooDifficultReason1) {
+        sb.write(sep);
+        sb.write('(allowLoops)');
+        sb.write(tooDifficultReason2);
+        sep = ',';
+      }
+      if (inlinedIn.isNotEmpty || sep == '') {
+        sb.write(sep);
+        sb.write('[');
+        sb.write(inlinedIn.join(','));
+        sb.write(']');
       }
       return sb.toString();
     }
@@ -113,12 +125,18 @@
         .getConstructorBody(_elementMap.getMemberDefinition(constructor).node);
   }
 
-  String getTooDifficultReason(MemberEntity member) {
+  String getTooDifficultReasonForbidLoops(MemberEntity member) {
     if (member is! FunctionEntity) return null;
     return kernel.InlineWeeder.cannotBeInlinedReason(_elementMap, member, null,
         enableUserAssertions: true);
   }
 
+  String getTooDifficultReasonAllowLoops(MemberEntity member) {
+    if (member is! FunctionEntity) return null;
+    return kernel.InlineWeeder.cannotBeInlinedReason(_elementMap, member, null,
+        allowLoops: true, enableUserAssertions: true);
+  }
+
   @override
   String computeMemberValue(Id id, ir.Member node) {
     return getMemberValue(_elementMap.getMember(node));
diff --git a/tests/compiler/dart2js/jsinterop/declaration_test.dart b/tests/compiler/dart2js/jsinterop/declaration_test.dart
index a800430..d8f0fac6 100644
--- a/tests/compiler/dart2js/jsinterop/declaration_test.dart
+++ b/tests/compiler/dart2js/jsinterop/declaration_test.dart
@@ -413,7 +413,9 @@
   func();
 }
 '''),
-  const Test('Non-external field.', '''
+  const Test(
+    'Non-external field.',
+    '''
 @JS()
 library lib;
 
@@ -431,7 +433,10 @@
 main() {
   makeB().callback();
 }
-'''),
+''',
+    // TODO(34174): Disallow js-interop fields.
+    /*errors: const [MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED]*/
+  ),
 ];
 
 void main(List<String> args) {
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index 8233d0b..e49b646 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
@@ -19,15 +18,11 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await testClasses([Flags.noPreviewDart2]);
-    print('--test from kernel (strong mode)----------------------------------');
-    // TODO(johnniwinther): Update the test to be strong mode compliant.
-    //await testClasses([Flags.strongMode]);
+    await testClasses();
   });
 }
 
-testClasses(List<String> options) async {
+testClasses() async {
   test(String mainSource,
       {List<String> directlyInstantiated: const <String>[],
       List<String> abstractlyInstantiated: const <String>[],
@@ -38,14 +33,14 @@
 
 @JS()
 class A {
-  get foo;
+  external get foo;
 
   external A(var foo);
 }
 
 @JS('BClass')
 class B {
-  get foo;
+  external get foo;
 
   external B(var foo);
 }
@@ -53,7 +48,7 @@
 @JS()
 @anonymous
 class C {
-  final foo;
+  external get foo;
 
   external factory C({foo});
 }
@@ -61,7 +56,7 @@
 @JS()
 @anonymous
 class D {
-  final foo;
+  external get foo;
 
   external factory D({foo});
 }
@@ -87,7 +82,7 @@
 
 $mainSource
 """
-    }, options: options);
+    });
     Compiler compiler = result.compiler;
     Map<String, ClassEntity> classEnvironment = <String, ClassEntity>{};
 
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index c85cf11..b682c5f 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -63,12 +63,9 @@
   return handler;
 }
 
-// Cached kernel state for non-strong mode.
+// Cached kernel state.
 fe.InitializedCompilerState kernelInitializedCompilerState;
 
-// Cached kernel state for strong mode.
-fe.InitializedCompilerState strongKernelInitializedCompilerState;
-
 /// memorySourceFiles can contain a map of string filename to string file
 /// contents or string file name to binary file contents (hence the `dynamic`
 /// type for the second parameter).
@@ -99,15 +96,9 @@
   if (beforeRun != null) {
     beforeRun(compiler);
   }
-  fe.InitializedCompilerState compilerState;
   bool isSuccess = await compiler.run(entryPoint);
-  if (compiler.options.strongMode) {
-    compilerState = strongKernelInitializedCompilerState =
-        compiler.libraryLoader.initializedCompilerState;
-  } else {
-    compilerState = kernelInitializedCompilerState =
-        compiler.libraryLoader.initializedCompilerState;
-  }
+  fe.InitializedCompilerState compilerState = kernelInitializedCompilerState =
+      compiler.libraryLoader.initializedCompilerState;
   return new CompilationResult(compiler,
       isSuccess: isSuccess, kernelInitializedCompilerState: compilerState);
 }
@@ -156,13 +147,8 @@
     ..environment = {}
     ..packageConfig = packageConfig
     ..packagesDiscoveryProvider = packagesDiscoveryProvider;
-  if (compilerOptions.strongMode) {
-    compilerOptions.kernelInitializedCompilerState =
-        strongKernelInitializedCompilerState;
-  } else {
-    compilerOptions.kernelInitializedCompilerState =
-        kernelInitializedCompilerState;
-  }
+  compilerOptions.kernelInitializedCompilerState =
+      kernelInitializedCompilerState;
   CompilerImpl compiler = new CompilerImpl(
       provider, outputProvider, diagnosticHandler, compilerOptions);
 
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index da0633f..05c754b 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -8,7 +8,6 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/universe/class_set.dart';
 import 'package:compiler/src/util/enumset.dart';
@@ -18,17 +17,14 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await testAll();
-    print('--test from kernel (strong)---------------------------------------');
-    await testAll(strongMode: true);
   });
 }
 
-testAll({bool strongMode: false}) async {
+testAll() async {
   await testIterators();
   await testForEach();
-  await testClosures(strongMode: strongMode);
+  await testClosures();
 }
 
 testIterators() async {
@@ -588,7 +584,7 @@
       find: I, anySubtype: true, expectedResult: true);
 }
 
-testClosures({bool strongMode}) async {
+testClosures() async {
   var env = await TypeEnvironment.create(r"""
       class A {
         call() => null;
@@ -599,9 +595,7 @@
         () {};
         local() {}
       }
-      """,
-      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2],
-      testBackendWorld: true);
+      """, testBackendWorld: true);
   JClosedWorld world = env.jClosedWorld;
 
   ClassEntity functionClass = world.commonElements.functionClass;
@@ -616,7 +610,7 @@
         "of $functionClass.");
   }
 
-  checkIsFunction(A, expected: !strongMode);
+  checkIsFunction(A, expected: false);
 
   world.classHierarchy.forEachStrictSubtypeOf(closureClass, checkIsFunction);
 }
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index c347ba0..8cf68f5 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
@@ -48,17 +47,12 @@
   /// a [ConstantResult].
   final expectedResults;
 
-  /// Expected results for Dart 2 if different from [expectedResults].
-  final strongModeResults;
-
   /// A [MessageKind] or a list of [MessageKind]s containing the error messages
   /// expected as the result of evaluating the constant under the empty
   /// environment.
   final expectedErrors;
 
-  const ConstantData(this.code, this.expectedResults,
-      {this.expectedErrors, strongModeResults})
-      : this.strongModeResults = strongModeResults ?? expectedResults;
+  const ConstantData(this.code, this.expectedResults, {this.expectedErrors});
 }
 
 class EvaluationError {
@@ -169,18 +163,13 @@
     const ConstantData('Object', 'TypeConstant(Object)'),
     const ConstantData('null ?? 0', 'IntConstant(0)'),
     const ConstantData(
-        'const [0, 1]', 'ListConstant([IntConstant(0), IntConstant(1)])',
-        strongModeResults:
-            'ListConstant(<int>[IntConstant(0), IntConstant(1)])'),
+        'const [0, 1]', 'ListConstant(<int>[IntConstant(0), IntConstant(1)])'),
     const ConstantData('const <int>[0, 1]',
         'ListConstant(<int>[IntConstant(0), IntConstant(1)])'),
     const ConstantData(
         'const {0: 1, 2: 3}',
-        'MapConstant({IntConstant(0): IntConstant(1), '
-        'IntConstant(2): IntConstant(3)})',
-        strongModeResults:
-            'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
-            'IntConstant(2): IntConstant(3)})'),
+        'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
+        'IntConstant(2): IntConstant(3)})'),
     const ConstantData(
         'const <int, int>{0: 1, 2: 3}',
         'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
@@ -543,7 +532,7 @@
     }
     class D extends C {
       final b;
-      const D(c) : super(c + 1), b = c + 2;
+      const D(c) : b = c + 2, super(c + 1);
     }
   ''', const [
     const ConstantData(r'const A()', 'ConstructedConstant(A())'),
@@ -608,12 +597,10 @@
   print(source);
 
   Future runTest(
-      List<String> options,
       EvaluationEnvironment getEnvironment(
-          Compiler compiler, FieldEntity field),
-      {bool strongMode: false}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': source}, options: options);
+          Compiler compiler, FieldEntity field)) async {
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': source});
     Compiler compiler = result.compiler;
     ElementEnvironment elementEnvironment =
         compiler.frontendStrategy.elementEnvironment;
@@ -624,8 +611,7 @@
         ConstantExpression constant =
             elementEnvironment.getFieldConstant(field);
 
-        var expectedResults =
-            strongMode ? data.strongModeResults : data.expectedResults;
+        var expectedResults = data.expectedResults;
         if (expectedResults is String) {
           expectedResults = <Map<String, String>, String>{
             const <String, String>{}: expectedResults
@@ -673,33 +659,18 @@
     });
   }
 
-  const skipKernelList = const [];
-
   const skipStrongList = const [
     // TODO(johnniwinther): Investigate why different errors are reported in
     // strong mode.
     'errors',
   ];
 
-  if (!skipKernelList.contains(data.name) && !data.strongModeOnly) {
-    print(
-        '--test kernel-------------------------------------------------------');
-    await runTest([Flags.noPreviewDart2],
-        (Compiler compiler, FieldEntity field) {
+  if (!skipStrongList.contains(data.name)) {
+    await runTest((Compiler compiler, FieldEntity field) {
       KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
       KernelToElementMap elementMap = frontendStrategy.elementMap;
       return new KernelEvaluationEnvironment(elementMap, null, field,
           constantRequired: field.isConst);
     });
   }
-  if (!skipStrongList.contains(data.name)) {
-    print(
-        '--test kernel (strong mode)-----------------------------------------');
-    await runTest([Flags.strongMode], (Compiler compiler, FieldEntity field) {
-      KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
-      KernelToElementMap elementMap = frontendStrategy.elementMap;
-      return new KernelEvaluationEnvironment(elementMap, null, field,
-          constantRequired: field.isConst);
-    }, strongMode: true);
-  }
 }
diff --git a/tests/compiler/dart2js/model/constant_expression_test.dart b/tests/compiler/dart2js/model/constant_expression_test.dart
index 901f962..f9064ae 100644
--- a/tests/compiler/dart2js/model/constant_expression_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_test.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/constants/expressions.dart';
 import 'package:compiler/src/kernel/element_map_impl.dart';
@@ -22,10 +21,7 @@
   /// Tested constants.
   final List<ConstantData> constants;
 
-  final bool strongModeOnly;
-
-  const TestData(this.declarations, this.constants,
-      {this.strongModeOnly: false});
+  const TestData(this.declarations, this.constants);
 }
 
 class ConstantData {
@@ -38,9 +34,6 @@
   /// ConstantExpression.getText() result if different from [code].
   final String text;
 
-  /// ConstantExpression.getText() result if different from [code].
-  final String strongText;
-
   /// The expected instance type for ConstructedConstantExpression.
   final String type;
 
@@ -48,10 +41,9 @@
   final Map<String, String> fields;
 
   const ConstantData(String code, this.kind,
-      {String text, String strongText, this.type, this.fields})
+      {String text, this.type, this.fields})
       : this.code = code,
-        this.text = text ?? code,
-        this.strongText = strongText ?? text ?? code;
+        this.text = text ?? code;
 }
 
 const List<TestData> DATA = const [
@@ -95,13 +87,13 @@
     const ConstantData('#name', ConstantExpressionKind.SYMBOL),
     const ConstantData('const []', ConstantExpressionKind.LIST),
     const ConstantData('const [0, 1]', ConstantExpressionKind.LIST,
-        strongText: 'const <int>[0, 1]'),
+        text: 'const <int>[0, 1]'),
     const ConstantData('const <int>[0, 1]', ConstantExpressionKind.LIST),
     const ConstantData('const <dynamic>[0, 1]', ConstantExpressionKind.LIST,
         text: 'const [0, 1]'),
     const ConstantData('const {}', ConstantExpressionKind.MAP),
     const ConstantData('const {0: 1, 2: 3}', ConstantExpressionKind.MAP,
-        strongText: 'const <int, int>{0: 1, 2: 3}'),
+        text: 'const <int, int>{0: 1, 2: 3}'),
     const ConstantData(
         'const <int, int>{0: 1, 2: 3}', ConstantExpressionKind.MAP),
     const ConstantData(
@@ -182,9 +174,7 @@
         'const [const <dynamic, dynamic>{0: true, "1": "c" "d"}, '
         'const Class(const Class<dynamic, dynamic>(toplevelConstant))]',
         ConstantExpressionKind.LIST,
-        text: 'const [const {0: true, "1": "cd"}, '
-            'const Class(const Class(toplevelConstant))]',
-        strongText: 'const <Object>[const {0: true, "1": "cd"}, '
+        text: 'const <Object>[const {0: true, "1": "cd"}, '
             'const Class(const Class(toplevelConstant))]'),
   ]),
   const TestData('''
@@ -311,32 +301,26 @@
     const ConstantData('identity', ConstantExpressionKind.FUNCTION),
     const ConstantData(
         'const C<int>(0, identity)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C<int>', strongText: 'const C<int>(0, <int>(identity))'),
+        type: 'C<int>', text: 'const C<int>(0, <int>(identity))'),
     const ConstantData(
         'const C<double>(0.5, identity)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C<double>',
-        strongText: 'const C<double>(0.5, <double>(identity))'),
-  ], strongModeOnly: true)
+        type: 'C<double>', text: 'const C<double>(0.5, <double>(identity))'),
+  ])
 ];
 
 main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTest(strongMode: false);
-    print('--test from kernel (strong)---------------------------------------');
-    await runTest(strongMode: true);
+    await runTest();
   });
 }
 
-Future runTest({bool strongMode}) async {
+Future runTest() async {
   for (TestData data in DATA) {
-    await testData(data, strongMode: strongMode);
+    await testData(data);
   }
 }
 
-Future testData(TestData data, {bool strongMode}) async {
-  if (data.strongModeOnly && !strongMode) return;
-
+Future testData(TestData data) async {
   StringBuffer sb = new StringBuffer();
   sb.writeln('${data.declarations}');
   Map<String, ConstantData> constants = {};
@@ -353,9 +337,8 @@
   }
   sb.writeln('}');
   String source = sb.toString();
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: {'main.dart': source});
   Compiler compiler = result.compiler;
   var elementEnvironment = compiler.frontendStrategy.elementEnvironment;
 
@@ -373,7 +356,7 @@
         constant.kind,
         "Unexpected kind '${constant.kind}' for constant "
         "`${constant.toDartText()}`, expected '${data.kind}'.");
-    String text = strongMode ? data.strongText : data.text;
+    String text = data.text;
     Expect.equals(
         text,
         constant.toDartText(),
diff --git a/tests/compiler/dart2js/model/enqueuer_test.dart b/tests/compiler/dart2js/model/enqueuer_test.dart
index 6407ea4..126e217 100644
--- a/tests/compiler/dart2js/model/enqueuer_test.dart
+++ b/tests/compiler/dart2js/model/enqueuer_test.dart
@@ -155,7 +155,6 @@
 main() {}
 '''
   }, options: [
-    Flags.strongMode,
     Flags.disableInlining,
   ]);
 
diff --git a/tests/compiler/dart2js/model/forwarding_stub_test.dart b/tests/compiler/dart2js/model/forwarding_stub_test.dart
index 234f97b..ddc9f46 100644
--- a/tests/compiler/dart2js/model/forwarding_stub_test.dart
+++ b/tests/compiler/dart2js/model/forwarding_stub_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -26,8 +25,8 @@
 
 main() {
   asyncTest(() async {
-    CompilationResult result = await (runCompiler(
-        memorySourceFiles: {'main.dart': source}, options: [Flags.strongMode]));
+    CompilationResult result =
+        await (runCompiler(memorySourceFiles: {'main.dart': source}));
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
index bdee3aa..2245e4e 100644
--- a/tests/compiler/dart2js/model/future_or_test.dart
+++ b/tests/compiler/dart2js/model/future_or_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:expect/expect.dart';
@@ -50,7 +49,7 @@
   new C().futureT();
   new C().futureOrT();
 }
-""", options: [Flags.strongMode]);
+""");
     FunctionType getFunctionType(String name, String expectedType,
         [ClassEntity cls]) {
       FunctionType type = env.getMemberType(name, cls);
diff --git a/tests/compiler/dart2js/model/native_test.dart b/tests/compiler/dart2js/model/native_test.dart
new file mode 100644
index 0000000..2172f02
--- /dev/null
+++ b/tests/compiler/dart2js/model/native_test.dart
@@ -0,0 +1,282 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+enum Kind {
+  regular,
+  native,
+  jsInterop,
+}
+
+main() {
+  asyncTest(() async {
+    await runTest('tests/compiler/dart2js_extra/jsinterop_test.dart', '', {
+      'Class': Kind.regular,
+      'JsInteropClass': Kind.jsInterop,
+      'topLevelField': Kind.regular,
+      'topLevelGetter': Kind.regular,
+      'topLevelSetter': Kind.regular,
+      'topLevelFunction': Kind.regular,
+      'externalTopLevelGetter': Kind.jsInterop,
+      'externalTopLevelSetter': Kind.jsInterop,
+      'externalTopLevelFunction': Kind.jsInterop,
+      'externalTopLevelJsInteropGetter': Kind.jsInterop,
+      'externalTopLevelJsInteropSetter': Kind.jsInterop,
+      'externalTopLevelJsInteropFunction': Kind.jsInterop,
+      'Class.generative': Kind.regular,
+      'Class.fact': Kind.regular,
+      'Class.instanceField': Kind.regular,
+      'Class.instanceGetter': Kind.regular,
+      'Class.instanceSetter': Kind.regular,
+      'Class.instanceMethod': Kind.regular,
+      'Class.staticField': Kind.regular,
+      'Class.staticGetter': Kind.regular,
+      'Class.staticSetter': Kind.regular,
+      'Class.staticMethod': Kind.regular,
+      'JsInteropClass.externalGenerative': Kind.jsInterop,
+      'JsInteropClass.externalFact': Kind.jsInterop,
+      'JsInteropClass.externalJsInteropGenerative': Kind.jsInterop,
+      'JsInteropClass.externalJsInteropFact': Kind.jsInterop,
+      'JsInteropClass.externalInstanceGetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceSetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceMethod': Kind.jsInterop,
+      'JsInteropClass.externalStaticGetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticSetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticMethod': Kind.jsInterop,
+      'JsInteropClass.externalInstanceJsInteropGetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceJsInteropSetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceJsInteropMethod': Kind.jsInterop,
+      'JsInteropClass.externalStaticJsInteropGetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticJsInteropSetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticJsInteropMethod': Kind.jsInterop,
+    }, skipList: [
+      // TODO(34174): Js-interop fields should not be allowed.
+      '01',
+      '02',
+      '03',
+      '04',
+      '38',
+      '42',
+      '46',
+      '51',
+      // TODO(33834): Non-external constructors should not be allowed.
+      '34',
+      '35',
+      '36',
+      '37',
+    ]);
+    await runTest('tests/compiler/dart2js_extra/non_jsinterop_test.dart', '', {
+      'Class': Kind.regular,
+      'JsInteropClass': Kind.jsInterop,
+      'topLevelField': Kind.regular,
+      'topLevelGetter': Kind.regular,
+      'topLevelSetter': Kind.regular,
+      'topLevelFunction': Kind.regular,
+      'externalTopLevelJsInteropGetter': Kind.jsInterop,
+      'externalTopLevelJsInteropSetter': Kind.jsInterop,
+      'externalTopLevelJsInteropFunction': Kind.jsInterop,
+      'Class.generative': Kind.regular,
+      'Class.fact': Kind.regular,
+      'Class.instanceField': Kind.regular,
+      'Class.instanceGetter': Kind.regular,
+      'Class.instanceSetter': Kind.regular,
+      'Class.instanceMethod': Kind.regular,
+      'Class.staticField': Kind.regular,
+      'Class.staticGetter': Kind.regular,
+      'Class.staticSetter': Kind.regular,
+      'Class.staticMethod': Kind.regular,
+      'JsInteropClass.externalGenerative': Kind.jsInterop,
+      'JsInteropClass.externalFact': Kind.jsInterop,
+      'JsInteropClass.externalJsInteropGenerative': Kind.jsInterop,
+      'JsInteropClass.externalJsInteropFact': Kind.jsInterop,
+      'JsInteropClass.externalInstanceGetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceSetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceMethod': Kind.jsInterop,
+      'JsInteropClass.externalStaticGetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticSetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticMethod': Kind.jsInterop,
+      'JsInteropClass.externalInstanceJsInteropGetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceJsInteropSetter': Kind.jsInterop,
+      'JsInteropClass.externalInstanceJsInteropMethod': Kind.jsInterop,
+      'JsInteropClass.externalStaticJsInteropGetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticJsInteropSetter': Kind.jsInterop,
+      'JsInteropClass.externalStaticJsInteropMethod': Kind.jsInterop,
+    }, skipList: [
+      // TODO(34174): Js-interop fields should not be allowed.
+      '01',
+      '02',
+      '03',
+      '04',
+      '38',
+      '42',
+      '46',
+      '51',
+      // TODO(33834): Non-external constructors should not be allowed.
+      '34',
+      '35',
+      '36',
+      '37',
+    ]);
+    // TODO(johnniwinther): Add similar test for native declarations.
+  });
+}
+
+runTest(String fileName, String location, Map<String, Kind> expectations,
+    {List<String> skipList: const <String>[]}) async {
+  print('--------------------------------------------------------------------');
+  print('Testing $fileName');
+  print('--------------------------------------------------------------------');
+  String test = new File(fileName).readAsStringSync();
+
+  List<String> commonLines = <String>[];
+  Map<String, SubTest> subTests = <String, SubTest>{};
+
+  int lineIndex = 0;
+  for (String line in test.split('\n')) {
+    int index = line.indexOf('//#');
+    if (index != -1) {
+      String prefix = line.substring(0, index);
+      String suffix = line.substring(index + 3);
+      String name = suffix.substring(0, suffix.indexOf((':'))).trim();
+      SubTest subTest = subTests.putIfAbsent(name, () => new SubTest());
+      subTest.lines[lineIndex] = line;
+      int commentIndex = prefix.indexOf('// ');
+      if (commentIndex != -1) {
+        subTest.expectedError = prefix.substring(commentIndex + 3).trim();
+      }
+      commonLines.add('');
+    } else {
+      commonLines.add(line);
+    }
+    lineIndex++;
+  }
+
+  String path = '${location}main.dart';
+  Uri entryPoint = Uri.parse('memory:$path');
+  await runPositiveTest(
+      entryPoint, {path: commonLines.join('\n')}, expectations);
+  for (String name in subTests.keys) {
+    if (!skipList.contains(name)) {
+      SubTest subTest = subTests[name];
+      await runNegativeTest(
+          subTest, entryPoint, {path: subTest.generateCode(commonLines)});
+    }
+  }
+}
+
+runPositiveTest(Uri entryPoint, Map<String, String> sources,
+    Map<String, Kind> expectations) async {
+  CompilationResult result =
+      await runCompiler(entryPoint: entryPoint, memorySourceFiles: sources);
+  Expect.isTrue(result.isSuccess);
+
+  JClosedWorld closedWorld = result.compiler.backendClosedWorldForTesting;
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+
+  void checkClass(ClassEntity cls,
+      {bool isNative: false, bool isJsInterop: false}) {
+    if (isJsInterop) {
+      isNative = true;
+    }
+    Expect.equals(isJsInterop, closedWorld.nativeData.isJsInteropClass(cls),
+        "Unexpected js interop class result for $cls.");
+    Expect.equals(isNative, closedWorld.nativeData.isNativeClass(cls),
+        "Unexpected native class result for $cls.");
+    if (isJsInterop) {
+      Expect.isTrue(closedWorld.nativeData.isJsInteropLibrary(cls.library),
+          "Unexpected js interop library result for ${cls.library}.");
+    }
+  }
+
+  void checkMember(MemberEntity member,
+      {bool isNative: false, bool isJsInterop: false}) {
+    if (isJsInterop) {
+      isNative = true;
+    }
+    Expect.equals(isJsInterop, closedWorld.nativeData.isJsInteropMember(member),
+        "Unexpected js interop member result for $member.");
+    Expect.equals(isNative, closedWorld.nativeData.isNativeMember(member),
+        "Unexpected native member result for $member.");
+    if (isJsInterop) {
+      Expect.isTrue(closedWorld.nativeData.isJsInteropLibrary(member.library),
+          "Unexpected js interop library result for ${member.library}.");
+    }
+  }
+
+  elementEnvironment.forEachLibraryMember(elementEnvironment.mainLibrary,
+      (MemberEntity member) {
+    if (member == elementEnvironment.mainFunction) return;
+
+    Kind kind = expectations.remove(member.name);
+    Expect.isNotNull(kind, "No expectations for $member");
+    checkMember(member,
+        isNative: kind == Kind.native, isJsInterop: kind == Kind.jsInterop);
+  });
+
+  elementEnvironment.forEachClass(elementEnvironment.mainLibrary,
+      (ClassEntity cls) {
+    Kind kind = expectations.remove(cls.name);
+    Expect.isNotNull(kind, "No expectations for $cls");
+    checkClass(cls,
+        isNative: kind == Kind.native, isJsInterop: kind == Kind.jsInterop);
+
+    checkClassMember(MemberEntity member) {
+      Kind kind = expectations.remove('${cls.name}.${member.name}');
+      Expect.isNotNull(kind, "No expectations for $member");
+      checkMember(member,
+          isNative: kind == Kind.native, isJsInterop: kind == Kind.jsInterop);
+    }
+
+    elementEnvironment.forEachConstructor(cls, checkClassMember);
+    elementEnvironment.forEachLocalClassMember(cls, checkClassMember);
+  });
+
+  Expect.isTrue(expectations.isEmpty, "Untested expectations: $expectations");
+}
+
+runNegativeTest(
+    SubTest subTest, Uri entryPoint, Map<String, String> sources) async {
+  DiagnosticCollector collector = new DiagnosticCollector();
+  CompilationResult result = await runCompiler(
+      entryPoint: entryPoint,
+      memorySourceFiles: sources,
+      diagnosticHandler: collector);
+  Expect.isFalse(result.isSuccess, "Expected compile time error for\n$subTest");
+  Expect.equals(
+      1, collector.errors.length, "Expected compile time error for\n$subTest");
+  Expect.equals(
+      'MessageKind.${subTest.expectedError}',
+      collector.errors.first.messageKind.toString(),
+      "Unexpected compile time error for\n$subTest");
+}
+
+class SubTest {
+  String expectedError;
+  final Map<int, String> lines = <int, String>{};
+
+  String generateCode(List<String> commonLines) {
+    StringBuffer sb = new StringBuffer();
+    int i = 0;
+    while (i < commonLines.length) {
+      if (lines.containsKey(i)) {
+        sb.writeln(lines[i]);
+      } else {
+        sb.writeln(commonLines[i]);
+      }
+      i++;
+    }
+    return sb.toString();
+  }
+
+  String toString() {
+    return lines.values.join('\n');
+  }
+}
diff --git a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
index 7519cdd..69655bd 100644
--- a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
+++ b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
@@ -3,7 +3,6 @@
 // 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/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
@@ -104,8 +103,8 @@
 
 main() {
   asyncTest(() async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': source}, options: [Flags.strongMode]);
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': source});
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
index 4a360c9..8c7c8d3 100644
--- a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -15,14 +14,11 @@
 main() {
   useStrongModeWorldStrategy = true;
   asyncTest(() async {
-    print('--test from non-strong mode---------------------------------------');
-    await runTest(strongMode: false);
-    print('--test from strong mode-------------------------------------------');
-    await runTest(strongMode: true);
+    await runTest();
   });
 }
 
-runTest({bool strongMode}) async {
+runTest() async {
   CompilationResult result = await runCompiler(memorySourceFiles: {
     'main.dart': '''
 class A {
@@ -140,33 +136,19 @@
   r = new R(); // Create R after call.
 }
 '''
-  }, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
+  });
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
 
   Map<String, List<String>> expectedLiveMembersMap = <String, List<String>>{
-    'A': strongMode
-        ? ['method1', 'getter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'B': strongMode
-        ? ['method2', 'setter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'C': strongMode
-        ? ['method1', 'getter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'D': strongMode
-        ? ['method2', 'setter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'G': strongMode
-        ? ['method1', 'getter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'I': strongMode
-        ? ['method1', 'getter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'K': strongMode
-        ? ['method1', 'getter']
-        : ['method1', 'method2', 'getter', 'setter'],
-    'N': strongMode ? [] : ['method1', 'getter', 'setter'],
+    'A': ['method1', 'getter'],
+    'B': ['method2', 'setter'],
+    'C': ['method1', 'getter'],
+    'D': ['method2', 'setter'],
+    'G': ['method1', 'getter'],
+    'I': ['method1', 'getter'],
+    'K': ['method1', 'getter'],
+    'N': [],
     'P': ['method1', 'getter', 'setter'],
     'Q': ['method3'],
   };
@@ -188,8 +170,7 @@
     Expect.setEquals(
         expectedLiveMembers,
         actualLiveMembers,
-        "Unexpected live members for $cls "
-        "in ${strongMode ? 'Dart 2' : 'Dart 1'}. \n"
+        "Unexpected live members for $cls. \n"
         "Expected members for ${cls.name}: $expectedLiveMembers\n"
         "Actual members for ${cls.name}  : $actualLiveMembers");
   });
diff --git a/tests/compiler/dart2js/model/strong_mode_impact_test.dart b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
index 908e142..2ad2eb5 100644
--- a/tests/compiler/dart2js/model/strong_mode_impact_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -16,14 +15,11 @@
 
 main() {
   asyncTest(() async {
-    print('--test from non-strong mode---------------------------------------');
-    await runTest(strongMode: false);
-    print('--test from strong mode-------------------------------------------');
-    await runTest(strongMode: true);
+    await runTest();
   });
 }
 
-runTest({bool strongMode}) async {
+runTest() async {
   String source = '''
 class A {}
 class B {}
@@ -60,40 +56,24 @@
 ''';
 
   Map<String, Impact> expectedImpactMap = <String, Impact>{
-    'method1':
-        strongMode ? const Impact() : new Impact(checkedModeChecks: ['int']),
-    'method2': strongMode
-        ? new Impact(implicitCasts: ['int'])
-        : new Impact(checkedModeChecks: ['int']),
-    'method3': strongMode
-        ? new Impact(parameterChecks: ['int'])
-        : new Impact(checkedModeChecks: ['int']),
-    'method4': strongMode
-        ? new Impact(asCasts: ['int'])
-        : new Impact(checkedModeChecks: ['int'], asCasts: ['int']),
-    'method5':
-        strongMode ? const Impact() : new Impact(checkedModeChecks: ['void']),
+    'method1': const Impact(),
+    'method2': new Impact(implicitCasts: ['int']),
+    'method3': new Impact(parameterChecks: ['int']),
+    'method4': new Impact(asCasts: ['int']),
+    'method5': const Impact(),
     'method6': const Impact(),
     'method7': const Impact(),
-    'method8':
-        strongMode ? const Impact() : new Impact(checkedModeChecks: ['int']),
-    'method9': strongMode
-        ? new Impact(implicitCasts: ['int'])
-        : new Impact(checkedModeChecks: ['int']),
+    'method8': const Impact(),
+    'method9': new Impact(implicitCasts: ['int']),
     'method10': const Impact(),
     'method11': const Impact(),
-    'method12': strongMode
-        ? const Impact()
-        : new Impact(checkedModeChecks: ['int', 'String']),
-    'method13': strongMode
-        ? new Impact(implicitCasts: ['int'], parameterChecks: ['String'])
-        : new Impact(checkedModeChecks: ['int', 'String']),
+    'method12': const Impact(),
+    'method13': new Impact(implicitCasts: ['int'], parameterChecks: ['String']),
   };
 
   ImpactCacheDeleter.retainCachesForTesting = true;
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: {'main.dart': source});
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
 
@@ -116,7 +96,7 @@
     Set<String> implicitCasts = expectedImpact.implicitCasts.toSet();
     Set<String> parameterChecks = expectedImpact.parameterChecks.toSet();
 
-    String context = 'in $member for Dart ${strongMode ? '2' : '1'}:\n'
+    String context = 'in $member:\n'
         'Expected: $expectedImpact\nActual: $typeUses';
     for (TypeUse typeUse in typeUses) {
       String type = '${typeUse.type}';
@@ -125,11 +105,6 @@
           Expect.isTrue(asCasts.contains(type), "Extra $typeUse $context");
           asCasts.remove(type);
           break;
-        case TypeUseKind.CHECKED_MODE_CHECK:
-          Expect.isTrue(
-              checkedModeChecks.contains(type), "Extra $typeUse $context");
-          checkedModeChecks.remove(type);
-          break;
         case TypeUseKind.IMPLICIT_CAST:
           Expect.isTrue(
               implicitCasts.contains(type), "Extra $typeUse $context");
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index 2a98af7..c265ea0 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -6,7 +6,6 @@
 
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/types.dart';
 import 'package:expect/expect.dart';
@@ -14,24 +13,21 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await runTests();
-    print('--test from kernel (strong)---------------------------------------');
-    await runTests(strongMode: true);
   });
 }
 
-Future runTests({bool strongMode: false}) async {
-  await testCallableSubtype(strongMode: strongMode);
-  await testInterfaceSubtype(strongMode: strongMode);
-  await testFunctionSubtyping(strongMode: strongMode);
-  await testTypedefSubtyping(strongMode: strongMode);
-  await testFunctionSubtypingOptional(strongMode: strongMode);
-  await testTypedefSubtypingOptional(strongMode: strongMode);
-  await testFunctionSubtypingNamed(strongMode: strongMode);
-  await testTypedefSubtypingNamed(strongMode: strongMode);
-  await testTypeVariableSubtype(strongMode: strongMode);
-  await testStrongModeSubtyping(strongMode: strongMode);
+Future runTests() async {
+  await testCallableSubtype();
+  await testInterfaceSubtype();
+  await testFunctionSubtyping();
+  await testTypedefSubtyping();
+  await testFunctionSubtypingOptional();
+  await testTypedefSubtypingOptional();
+  await testFunctionSubtypingNamed();
+  await testTypedefSubtypingNamed();
+  await testTypeVariableSubtype();
+  await testStrongModeSubtyping();
 }
 
 void testTypes(TypeEnvironment env, DartType subtype, DartType supertype,
@@ -52,7 +48,7 @@
   testTypes(env, subtype, supertype, expectSubtype, expectMoreSpecific);
 }
 
-Future testInterfaceSubtype({bool strongMode}) async {
+Future testInterfaceSubtype() async {
   await TypeEnvironment.create(r"""
       class A<T> {}
       class B<T1, T2> extends A<T1> {}
@@ -63,8 +59,7 @@
       main() {
         new C();
       }
-      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) {
+      """).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -85,8 +80,8 @@
     expect(true, void_, dynamic_);
     // Unsure about the next one, see dartbug.com/14933.
     expect(true, dynamic_, void_, expectMoreSpecific: false);
-    expect(strongMode, void_, Object_);
-    expect(strongMode, Object_, void_);
+    expect(true, void_, Object_);
+    expect(true, Object_, void_);
     expect(true, Null_, void_);
 
     expect(true, Object_, Object_);
@@ -100,21 +95,21 @@
     expect(true, num_, num_);
     expect(true, int_, num_);
     expect(false, String_, num_);
-    expect(!strongMode, dynamic_, num_, expectMoreSpecific: false);
+    expect(false, dynamic_, num_, expectMoreSpecific: false);
     expect(true, Null_, num_);
 
     expect(false, Object_, int_);
     expect(false, num_, int_);
     expect(true, int_, int_);
     expect(false, String_, int_);
-    expect(!strongMode, dynamic_, int_, expectMoreSpecific: false);
+    expect(false, dynamic_, int_, expectMoreSpecific: false);
     expect(true, Null_, int_);
 
     expect(false, Object_, String_);
     expect(false, num_, String_);
     expect(false, int_, String_);
     expect(true, String_, String_);
-    expect(!strongMode, dynamic_, String_, expectMoreSpecific: false);
+    expect(false, dynamic_, String_, expectMoreSpecific: false);
     expect(true, Null_, String_);
 
     expect(true, Object_, dynamic_);
@@ -128,7 +123,7 @@
     expect(false, num_, Null_);
     expect(false, int_, Null_);
     expect(false, String_, Null_);
-    expect(!strongMode, dynamic_, Null_, expectMoreSpecific: false);
+    expect(false, dynamic_, Null_, expectMoreSpecific: false);
     expect(true, Null_, Null_);
 
     DartType A_Object = instantiate(A, [Object_]);
@@ -156,21 +151,21 @@
     expect(true, A_num, A_num);
     expect(true, A_int, A_num);
     expect(false, A_String, A_num);
-    expect(!strongMode, A_dynamic, A_num, expectMoreSpecific: false);
+    expect(false, A_dynamic, A_num, expectMoreSpecific: false);
     expect(true, A_Null, A_num);
 
     expect(false, A_Object, A_int);
     expect(false, A_num, A_int);
     expect(true, A_int, A_int);
     expect(false, A_String, A_int);
-    expect(!strongMode, A_dynamic, A_int, expectMoreSpecific: false);
+    expect(false, A_dynamic, A_int, expectMoreSpecific: false);
     expect(true, A_Null, A_int);
 
     expect(false, A_Object, A_String);
     expect(false, A_num, A_String);
     expect(false, A_int, A_String);
     expect(true, A_String, A_String);
-    expect(!strongMode, A_dynamic, A_String, expectMoreSpecific: false);
+    expect(false, A_dynamic, A_String, expectMoreSpecific: false);
     expect(true, A_Null, A_String);
 
     expect(true, A_Object, A_dynamic);
@@ -184,7 +179,7 @@
     expect(false, A_num, A_Null);
     expect(false, A_int, A_Null);
     expect(false, A_String, A_Null);
-    expect(!strongMode, A_dynamic, A_Null, expectMoreSpecific: false);
+    expect(false, A_dynamic, A_Null, expectMoreSpecific: false);
     expect(true, A_Null, A_Null);
 
     DartType B_Object_Object = instantiate(B, [Object_, Object_]);
@@ -216,9 +211,9 @@
 
     expect(true, B_dynamic_dynamic, Object_);
     expect(true, B_dynamic_dynamic, A_Object, expectMoreSpecific: false);
-    expect(!strongMode, B_dynamic_dynamic, A_num, expectMoreSpecific: false);
-    expect(!strongMode, B_dynamic_dynamic, A_int, expectMoreSpecific: false);
-    expect(!strongMode, B_dynamic_dynamic, A_String, expectMoreSpecific: false);
+    expect(false, B_dynamic_dynamic, A_num, expectMoreSpecific: false);
+    expect(false, B_dynamic_dynamic, A_int, expectMoreSpecific: false);
+    expect(false, B_dynamic_dynamic, A_String, expectMoreSpecific: false);
     expect(true, B_dynamic_dynamic, A_dynamic);
 
     expect(true, B_String_dynamic, Object_);
@@ -237,15 +232,13 @@
     expect(false, B_Object_Object, B_num_num);
     expect(true, B_num_num, B_num_num);
     expect(true, B_int_num, B_num_num);
-    expect(!strongMode, B_dynamic_dynamic, B_num_num,
-        expectMoreSpecific: false);
+    expect(false, B_dynamic_dynamic, B_num_num, expectMoreSpecific: false);
     expect(false, B_String_dynamic, B_num_num);
 
     expect(false, B_Object_Object, B_int_num);
     expect(false, B_num_num, B_int_num);
     expect(true, B_int_num, B_int_num);
-    expect(!strongMode, B_dynamic_dynamic, B_int_num,
-        expectMoreSpecific: false);
+    expect(false, B_dynamic_dynamic, B_int_num, expectMoreSpecific: false);
     expect(false, B_String_dynamic, B_int_num);
 
     expect(true, B_Object_Object, B_dynamic_dynamic);
@@ -257,7 +250,7 @@
     expect(false, B_Object_Object, B_String_dynamic);
     expect(false, B_num_num, B_String_dynamic);
     expect(false, B_int_num, B_String_dynamic);
-    expect(!strongMode, B_dynamic_dynamic, B_String_dynamic,
+    expect(false, B_dynamic_dynamic, B_String_dynamic,
         expectMoreSpecific: false);
     expect(true, B_String_dynamic, B_String_dynamic);
 
@@ -285,12 +278,10 @@
     expect(true, C_int_String, B_String_dynamic);
 
     expect(true, C_dynamic_dynamic, B_Object_Object, expectMoreSpecific: false);
-    expect(!strongMode, C_dynamic_dynamic, B_num_num,
-        expectMoreSpecific: false);
-    expect(!strongMode, C_dynamic_dynamic, B_int_num,
-        expectMoreSpecific: false);
+    expect(false, C_dynamic_dynamic, B_num_num, expectMoreSpecific: false);
+    expect(false, C_dynamic_dynamic, B_int_num, expectMoreSpecific: false);
     expect(true, C_dynamic_dynamic, B_dynamic_dynamic);
-    expect(!strongMode, C_dynamic_dynamic, B_String_dynamic,
+    expect(false, C_dynamic_dynamic, B_String_dynamic,
         expectMoreSpecific: false);
 
     expect(false, C_int_String, A_int);
@@ -302,7 +293,7 @@
   });
 }
 
-Future testCallableSubtype({bool strongMode}) async {
+Future testCallableSubtype() async {
   await TypeEnvironment.create(r"""
       class U {}
       class V extends U {}
@@ -327,8 +318,7 @@
         a.m4(null, null);
         a.m5(null, null);
       }
-      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) {
+      """).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -344,14 +334,14 @@
     DartType m4 = env.getMemberType('m4', classA);
     DartType m5 = env.getMemberType('m5', classA);
 
-    expect(!strongMode, A, function);
-    expect(!strongMode, A, call);
-    expect(!strongMode, call, m1);
-    expect(!strongMode, A, m1);
-    expect(!strongMode, A, m2, expectMoreSpecific: false);
+    expect(false, A, function);
+    expect(false, A, call);
+    expect(false, call, m1);
+    expect(false, A, m1);
+    expect(false, A, m2, expectMoreSpecific: false);
     expect(false, A, m3);
     expect(false, A, m4);
-    expect(!strongMode, A, m5);
+    expect(false, A, m5);
   });
 }
 
@@ -375,25 +365,23 @@
       'void', 'inline_void__int', '(void Function(int i) f)'),
 ];
 
-Future testFunctionSubtyping({bool strongMode}) async {
+Future testFunctionSubtyping() async {
   await TypeEnvironment.create(
           createMethods(functionTypesData, additionalData: """
   main() {
     ${createUses(functionTypesData)}
   }
-  """),
-          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
+  """))
       .then(functionSubtypingHelper);
 }
 
-Future testTypedefSubtyping({bool strongMode}) async {
+Future testTypedefSubtyping() async {
   await TypeEnvironment.create(
           createTypedefs(functionTypesData, additionalData: """
   main() {
     ${createUses(functionTypesData)}
   }
-  """),
-          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
+  """))
       .then(functionSubtypingHelper);
 }
 
@@ -469,29 +457,27 @@
   const FunctionTypeData('void', 'void___Object_int', '([Object o, int i])'),
 ];
 
-Future testFunctionSubtypingOptional({bool strongMode}) async {
+Future testFunctionSubtypingOptional() async {
   await TypeEnvironment.create(
           createMethods(optionalFunctionTypesData, additionalData: """
   main() {
     ${createUses(optionalFunctionTypesData)}
   }
-  """),
-          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) => functionSubtypingOptionalHelper(env, strongMode));
+  """))
+      .then((env) => functionSubtypingOptionalHelper(env));
 }
 
-Future testTypedefSubtypingOptional({bool strongMode}) async {
+Future testTypedefSubtypingOptional() async {
   await TypeEnvironment.create(
           createTypedefs(optionalFunctionTypesData, additionalData: """
   main() {
     ${createUses(optionalFunctionTypesData)}
   }
-  """),
-          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) => functionSubtypingOptionalHelper(env, strongMode));
+  """))
+      .then((env) => functionSubtypingOptionalHelper(env));
 }
 
-functionSubtypingOptionalHelper(TypeEnvironment env, bool strongMode) {
+functionSubtypingOptionalHelper(TypeEnvironment env) {
   void expect(bool expectSubtype, String sub, String sup,
       {bool expectMoreSpecific}) {
     testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific);
@@ -508,7 +494,7 @@
   // Test ([Object])->void <: ([int])->void.
   expect(true, 'void___Object', 'void___int', expectMoreSpecific: false);
   // Test ([int])->void <: ([Object])->void.
-  expect(!strongMode, 'void___int', 'void___Object');
+  expect(false, 'void___int', 'void___Object');
   // Test (int,[int])->void <: (int)->void.
   expect(true, 'void__int__int', 'void__int');
   // Test (int,[int])->void <: (int,[int])->void.
@@ -551,29 +537,27 @@
   const FunctionTypeData('void', 'void___c_int', '({int c})'),
 ];
 
-Future testFunctionSubtypingNamed({bool strongMode}) async {
+Future testFunctionSubtypingNamed() async {
   await TypeEnvironment.create(
           createMethods(namedFunctionTypesData, additionalData: """
   main() {
     ${createUses(namedFunctionTypesData)}
   }
-  """),
-          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) => functionSubtypingNamedHelper(env, strongMode));
+  """))
+      .then((env) => functionSubtypingNamedHelper(env));
 }
 
-Future testTypedefSubtypingNamed({bool strongMode}) async {
+Future testTypedefSubtypingNamed() async {
   await TypeEnvironment.create(
           createTypedefs(namedFunctionTypesData, additionalData: """
   main() {
     ${createUses(namedFunctionTypesData)}
   }
-  """),
-          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) => functionSubtypingNamedHelper(env, strongMode));
+  """))
+      .then((env) => functionSubtypingNamedHelper(env));
 }
 
-functionSubtypingNamedHelper(TypeEnvironment env, bool strongMode) {
+functionSubtypingNamedHelper(TypeEnvironment env) {
   expect(bool expectSubtype, String sub, String sup,
       {bool expectMoreSpecific}) {
     testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific);
@@ -592,7 +576,7 @@
   // Test ({Object a})->void <: ({int a})->void.
   expect(true, 'void___a_Object', 'void___a_int', expectMoreSpecific: false);
   // Test ({int a})->void <: ({Object a})->void.
-  expect(!strongMode, 'void___a_int', 'void___a_Object');
+  expect(false, 'void___a_int', 'void___a_Object');
   // Test (int,{int a})->void <: (int,{int a})->void.
   expect(true, 'void__int__a_int', 'void__int__a_int2');
   // Test ({int a})->void <: ({double a})->void.
@@ -609,7 +593,7 @@
   expect(true, 'void___a_int_b_int_c_int', 'void___c_int');
 }
 
-Future testTypeVariableSubtype({bool strongMode}) async {
+Future testTypeVariableSubtype() async {
   await TypeEnvironment.create(r"""
       class A<T> {}
       class B<T extends Object> {}
@@ -634,8 +618,7 @@
         new I();
         new J();
       }
-      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) {
+      """).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -845,7 +828,7 @@
   });
 }
 
-Future testStrongModeSubtyping({bool strongMode}) async {
+Future testStrongModeSubtyping() async {
   await TypeEnvironment.create(r"""
       class ClassWithCall {
         void call() {}
@@ -872,8 +855,7 @@
         takeVoid(null);
         takeObject(null);
       }
-      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
-      .then((env) {
+      """).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       Expect.equals(expectSubtype, env.isSubtype(T, S), '$T <: $S');
       if (expectSubtype) {
@@ -907,10 +889,10 @@
     DartType takeObject = env.getMemberType('takeObject');
 
     // Classes with call methods are no longer subtypes of Function.
-    expect(!strongMode, ClassWithCall, Function_);
+    expect(false, ClassWithCall, Function_);
     // Classes with call methods are no longer subtype the function type of the
     // call method.
-    expect(!strongMode, ClassWithCall, ClassWithCallType);
+    expect(false, ClassWithCall, ClassWithCallType);
 
     // At runtime `Object`, `dynamic` and `void` are the same and are therefore
     // subtypes and supertypes of each other.
@@ -918,7 +900,7 @@
     // `dynamic` is no longer a bottom type but `Null` is.
 
     expect(true, Object_, Object_);
-    expect(strongMode, Object_, void_);
+    expect(true, Object_, void_);
     expect(true, Object_, dynamic_);
     expect(false, Object_, Null_);
     expect(false, Object_, Function_);
@@ -926,10 +908,10 @@
     expect(true, dynamic_, Object_);
     expect(true, dynamic_, void_);
     expect(true, dynamic_, dynamic_);
-    expect(!strongMode, dynamic_, Null_);
-    expect(!strongMode, dynamic_, Function_);
+    expect(false, dynamic_, Null_);
+    expect(false, dynamic_, Function_);
 
-    expect(strongMode, void_, Object_);
+    expect(true, void_, Object_);
     expect(true, void_, void_);
     expect(true, void_, dynamic_);
     expect(false, void_, Null_);
@@ -942,13 +924,13 @@
     expect(true, Null_, Function_);
 
     expect(true, Function_, Object_);
-    expect(strongMode, Function_, void_);
+    expect(true, Function_, void_);
     expect(true, Function_, dynamic_);
     expect(false, Function_, Null_);
     expect(true, Function_, Function_);
 
     expect(true, List_Object, List_Object);
-    expect(strongMode, List_Object, List_void);
+    expect(true, List_Object, List_void);
     expect(true, List_Object, List_dynamic);
     expect(false, List_Object, List_Null);
     expect(false, List_Object, List_Function);
@@ -956,10 +938,10 @@
     expect(true, List_dynamic, List_Object);
     expect(true, List_dynamic, List_void);
     expect(true, List_dynamic, List_dynamic);
-    expect(!strongMode, List_dynamic, List_Null);
-    expect(!strongMode, List_dynamic, List_Function);
+    expect(false, List_dynamic, List_Null);
+    expect(false, List_dynamic, List_Function);
 
-    expect(strongMode, List_void, List_Object);
+    expect(true, List_void, List_Object);
     expect(true, List_void, List_void);
     expect(true, List_void, List_dynamic);
     expect(false, List_void, List_Null);
@@ -972,14 +954,14 @@
     expect(true, List_Null, List_Function);
 
     expect(true, List_Function, List_Object);
-    expect(strongMode, List_Function, List_void);
+    expect(true, List_Function, List_void);
     expect(true, List_Function, List_dynamic);
     expect(false, List_Function, List_Null);
     expect(true, List_Function, List_Function);
 
     // Return type are now covariant.
     expect(true, returnNum, returnNum);
-    expect(!strongMode, returnNum, returnInt);
+    expect(false, returnNum, returnInt);
     expect(true, returnNum, returnVoid);
     expect(true, returnNum, returnObject);
 
@@ -991,10 +973,10 @@
     expect(false, returnVoid, returnNum);
     expect(false, returnVoid, returnInt);
     expect(true, returnVoid, returnVoid);
-    expect(strongMode, returnVoid, returnObject);
+    expect(true, returnVoid, returnObject);
 
-    expect(!strongMode, returnObject, returnNum);
-    expect(!strongMode, returnObject, returnInt);
+    expect(false, returnObject, returnNum);
+    expect(false, returnObject, returnInt);
     expect(true, returnObject, returnVoid);
     expect(true, returnObject, returnObject);
 
@@ -1002,21 +984,21 @@
     expect(true, takeNum, takeNum);
     expect(true, takeNum, takeInt);
     expect(false, takeNum, takeVoid);
-    expect(!strongMode, takeNum, takeObject);
+    expect(false, takeNum, takeObject);
 
-    expect(!strongMode, takeInt, takeNum);
+    expect(false, takeInt, takeNum);
     expect(true, takeInt, takeInt);
     expect(false, takeInt, takeVoid);
-    expect(!strongMode, takeInt, takeObject);
+    expect(false, takeInt, takeObject);
 
-    expect(strongMode, takeVoid, takeNum);
-    expect(strongMode, takeVoid, takeInt);
+    expect(true, takeVoid, takeNum);
+    expect(true, takeVoid, takeInt);
     expect(true, takeVoid, takeVoid);
-    expect(strongMode, takeVoid, takeObject);
+    expect(true, takeVoid, takeObject);
 
     expect(true, takeObject, takeNum);
     expect(true, takeObject, takeInt);
-    expect(strongMode, takeObject, takeVoid);
+    expect(true, takeObject, takeVoid);
     expect(true, takeObject, takeObject);
   });
 }
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index 6b338b0..59da374 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -8,7 +8,6 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/universe/class_set.dart';
 import 'package:compiler/src/world.dart';
@@ -16,9 +15,7 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTests();
-    print('--test from kernel (strong)---------------------------------------');
+    // TODO(johnniwinther): Remove code for Dart 1 tests.
     await runTests(strongMode: true);
   });
 }
@@ -51,7 +48,7 @@
         new F();
         new G();
       }
-      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
+      """);
   KClosedWorld world = env.kClosedWorld;
 
   ClassEntity A = env.getElement("A");
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 58babc1..c6470a9 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/call_structure.dart';
@@ -16,7 +15,6 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await testClassSets();
   });
 }
@@ -30,6 +28,7 @@
 }
 class Subtype implements Superclass {
   bar() {}
+  noSuchMethod(_) {}
 }
 """;
 
@@ -40,6 +39,7 @@
   String testMode;
 
   Future run(List<String> instantiated) async {
+    print('---- testing $instantiated ---------------------------------------');
     StringBuffer main = new StringBuffer();
     main.writeln(CLASSES);
     main.write('main() {');
@@ -49,8 +49,8 @@
     main.write('}');
     testMode = '$instantiated';
 
-    var env = await TypeEnvironment.create(main.toString(),
-        testBackendWorld: true, options: [Flags.noPreviewDart2]);
+    var env =
+        await TypeEnvironment.create(main.toString(), testBackendWorld: true);
     foo = new Selector.call(const PublicName('foo'), CallStructure.NO_ARGS);
     bar = new Selector.call(const PublicName('bar'), CallStructure.NO_ARGS);
     baz = new Selector.call(const PublicName('baz'), CallStructure.NO_ARGS);
@@ -73,7 +73,7 @@
     Expect.equals(
         expectedResult,
         result,
-        'Unexpected result for $selector in $cls ($query)'
+        'Unexpected result for $selector in $cls ($query) '
         'for instantiations $testMode');
   }
 
@@ -233,7 +233,7 @@
   check(superclass, ClassQuery.SUBCLASS, foo, false);
   check(superclass, ClassQuery.SUBCLASS, bar, false);
   check(superclass, ClassQuery.SUBCLASS, baz, false);
-  check(superclass, ClassQuery.SUBTYPE, foo, true);
+  check(superclass, ClassQuery.SUBTYPE, foo, false);
   check(superclass, ClassQuery.SUBTYPE, bar, false);
   check(superclass, ClassQuery.SUBTYPE, baz, true);
 
@@ -247,13 +247,13 @@
   check(subclass, ClassQuery.SUBTYPE, bar, false);
   check(subclass, ClassQuery.SUBTYPE, baz, false);
 
-  check(subtype, ClassQuery.EXACT, foo, true);
+  check(subtype, ClassQuery.EXACT, foo, false);
   check(subtype, ClassQuery.EXACT, bar, false);
   check(subtype, ClassQuery.EXACT, baz, true);
-  check(subtype, ClassQuery.SUBCLASS, foo, true);
+  check(subtype, ClassQuery.SUBCLASS, foo, false);
   check(subtype, ClassQuery.SUBCLASS, bar, false);
   check(subtype, ClassQuery.SUBCLASS, baz, true);
-  check(subtype, ClassQuery.SUBTYPE, foo, true);
+  check(subtype, ClassQuery.SUBTYPE, foo, false);
   check(subtype, ClassQuery.SUBTYPE, bar, false);
   check(subtype, ClassQuery.SUBTYPE, baz, true);
 
@@ -278,7 +278,7 @@
   check(superclass, ClassQuery.SUBCLASS, foo, false);
   check(superclass, ClassQuery.SUBCLASS, bar, false);
   check(superclass, ClassQuery.SUBCLASS, baz, true);
-  check(superclass, ClassQuery.SUBTYPE, foo, true);
+  check(superclass, ClassQuery.SUBTYPE, foo, false);
   check(superclass, ClassQuery.SUBTYPE, bar, false);
   check(superclass, ClassQuery.SUBTYPE, baz, true);
 
@@ -292,13 +292,13 @@
   check(subclass, ClassQuery.SUBTYPE, bar, false);
   check(subclass, ClassQuery.SUBTYPE, baz, true);
 
-  check(subtype, ClassQuery.EXACT, foo, true);
+  check(subtype, ClassQuery.EXACT, foo, false);
   check(subtype, ClassQuery.EXACT, bar, false);
   check(subtype, ClassQuery.EXACT, baz, true);
-  check(subtype, ClassQuery.SUBCLASS, foo, true);
+  check(subtype, ClassQuery.SUBCLASS, foo, false);
   check(subtype, ClassQuery.SUBCLASS, bar, false);
   check(subtype, ClassQuery.SUBCLASS, baz, true);
-  check(subtype, ClassQuery.SUBTYPE, foo, true);
+  check(subtype, ClassQuery.SUBTYPE, foo, false);
   check(subtype, ClassQuery.SUBTYPE, bar, false);
   check(subtype, ClassQuery.SUBTYPE, baz, true);
 }
diff --git a/tests/compiler/dart2js/no_such_method_enabled_test.dart b/tests/compiler/dart2js/no_such_method_enabled_test.dart
index f89588f..b98c045 100644
--- a/tests/compiler/dart2js/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/no_such_method_enabled_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -20,7 +19,6 @@
   final bool isThrowing;
   final bool isDefault;
   final bool isOther;
-  final bool isNotApplicable;
   final bool isComplexNoReturn;
   final bool isComplexReturn;
 
@@ -31,7 +29,6 @@
       this.isThrowing: false,
       this.isDefault: false,
       this.isOther: false,
-      this.isNotApplicable: false,
       this.isComplexNoReturn: false,
       this.isComplexReturn: false});
 }
@@ -120,7 +117,7 @@
   noSuchMethod(x) => 3;
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', isOther: true, isComplexReturn: true),
@@ -130,40 +127,29 @@
   noSuchMethod(x, [y]) => super.noSuchMethod(x);
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', hasForwardingSyntax: true, isDefault: true),
   ]),
   const NoSuchMethodTest("""
 class A {
-  noSuchMethod(x, [y]) => super.noSuchMethod(x, y);
+  noSuchMethod(x, [y]) => super.noSuchMethod(x) + y;
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', isOther: true, isComplexNoReturn: true),
   ], isNoSuchMethodUsed: true),
   const NoSuchMethodTest("""
 class A {
-  noSuchMethod(x, y) => super.noSuchMethod(x);
-}
-main() {
-  print(new A().foo());
-}
-""", const <NoSuchMethodInfo>[
-    const NoSuchMethodInfo('A',
-        hasForwardingSyntax: true, isNotApplicable: true),
-  ]),
-  const NoSuchMethodTest("""
-class A {
   noSuchMethod(Invocation x) {
-    throw new UnsupportedError();
+    throw new UnsupportedError('');
   }
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', hasThrowingSyntax: true, isThrowing: true),
@@ -176,7 +162,7 @@
   }
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', isOther: true, isComplexNoReturn: true),
@@ -188,7 +174,7 @@
   }
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', isOther: true, isComplexReturn: true),
@@ -198,7 +184,7 @@
   noSuchMethod(x) => super.noSuchMethod(x) as dynamic;
 }
 main() {
-  print(new A().foo());
+  print((new A() as dynamic).foo());
 }
 """, const <NoSuchMethodInfo>[
     const NoSuchMethodInfo('A', hasForwardingSyntax: true, isDefault: true),
@@ -210,9 +196,8 @@
     for (NoSuchMethodTest test in TESTS) {
       print('---- testing -------------------------------------------------');
       print(test.code);
-      CompilationResult result = await runCompiler(
-          memorySourceFiles: {'main.dart': test.code},
-          options: [Flags.noPreviewDart2]);
+      CompilationResult result =
+          await runCompiler(memorySourceFiles: {'main.dart': test.code});
       Compiler compiler = result.compiler;
       checkTest(compiler, test);
     }
@@ -295,10 +280,6 @@
         info.isOther,
         registry.otherImpls.contains(frontendNoSuchMethod),
         "Unexpected isOther result on $frontendNoSuchMethod.");
-    Expect.equals(
-        info.isNotApplicable,
-        registry.notApplicableImpls.contains(frontendNoSuchMethod),
-        "Unexpected isNotApplicable result on $frontendNoSuchMethod.");
 
     ClassEntity backendClass = backendEnvironment.lookupClass(
         backendEnvironment.mainLibrary, info.className);
diff --git a/tests/compiler/dart2js/rti/bound_check_test.dart b/tests/compiler/dart2js/rti/bound_check_test.dart
index e767d28..b0729aa 100644
--- a/tests/compiler/dart2js/rti/bound_check_test.dart
+++ b/tests/compiler/dart2js/rti/bound_check_test.dart
@@ -3,7 +3,6 @@
 // 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 '../helpers/d8_helper.dart';
 
 const String SOURCE1 = r'''
@@ -45,45 +44,11 @@
 TypeError: The type argument 'A' is not a subtype of the type variable bound 'B' of type variable 'T' in 'call'.
 ''';
 
-const String SOURCE2 = r'''
-import 'package:expect/expect.dart';
-
-class A {}
-class B {}
-
-class C<T extends A>{
-}
-
-class D<T> extends C<T> {}
-
-main() {
-  bool printError(e) {
-     print(e); return true;
-  }
-
-  new C<A>();
-  Expect.throws(() => new C<B>(), printError);
-  new D<A>();
-  Expect.throws(() => new D<B>(), printError);
-}
-''';
-
-const String OUTPUT2 = r'''
-TypeError: Can't create an instance of malbounded type 'C<B>': 'B' is not a subtype of bound 'A' type variable 'C.T' of type 'C<C.T>'.
-TypeError: Can't create an instance of malbounded type 'D<B>': 'B' is not a subtype of bound 'A' type variable 'C.T' of type 'C<C.T>' on the supertype 'C<B>' of 'D<B>'.
-''';
-
 main(List<String> args) {
   asyncTest(() async {
-    await runWithD8(memorySourceFiles: {
-      'main.dart': SOURCE1
-    }, options: [
-      Flags.strongMode,
-    ], expectedOutput: OUTPUT1, printJs: args.contains('-v'));
     await runWithD8(
-        memorySourceFiles: {'main.dart': SOURCE2},
-        options: [Flags.noPreviewDart2, Flags.enableCheckedMode],
-        expectedOutput: OUTPUT2,
+        memorySourceFiles: {'main.dart': SOURCE1},
+        expectedOutput: OUTPUT1,
         printJs: args.contains('-v'));
   });
 }
diff --git a/tests/compiler/dart2js/rti/data/no_such_method1_strong.dart b/tests/compiler/dart2js/rti/data/no_such_method1_strong.dart
index 21ed9d8..3694cb0 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method1_strong.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method1_strong.dart
@@ -5,7 +5,7 @@
 import 'package:expect/expect.dart';
 
 class C {
-  /*element: C.noSuchMethod:selectors=[Selector(call, foo, arity=0, types=2)]*/
+  /*element: C.noSuchMethod:selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
   noSuchMethod(i) => i.typeArguments;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/no_such_method2_strong.dart b/tests/compiler/dart2js/rti/data/no_such_method2_strong.dart
index 6b39377..81d823c 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method2_strong.dart
@@ -5,7 +5,7 @@
 import 'package:expect/expect.dart';
 
 class C {
-  /*element: C.noSuchMethod:selectors=[Selector(call, foo, arity=0, types=2)]*/
+  /*element: C.noSuchMethod:selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
   noSuchMethod(i) => i.typeArguments;
 }
 
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index cd7fab0..c5ff693 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -39,6 +39,17 @@
   new F();
   new H();
   new I();
+  method<int>();
+}
+
+method<T>() {
+  local1() {}
+  local2(T t) {}
+  local3<S>(S s) {}
+
+  local1();
+  local2(null);
+  local3(null);
 }
 ''';
 
@@ -50,20 +61,26 @@
   'D': const <String>[r'$isB', r'$asB'],
   'E': const <String>[],
   'F': const <String>[r'$asB'],
-  'G': const <String>[r'$isFunction'],
-  'H': const <String>[r'$isFunction', r'$isG'],
-  'I': const <String>[r'$isFunction', r'$signature'],
+  'G': const <String>[],
+  'H': const <String>[r'$isG'],
+  'I': const <String>[],
+  'method_local1': const <String>[r'$signature'],
+  'method_local2': const <String>[r'$signature'],
+  'method_local3': const <String>[r'$signature'],
 };
 
 main() {
   runTest() async {
-    CompilationResult result = await runCompiler(memorySourceFiles: {
-      'main.dart': code
-    }, options: [
-      Flags.noPreviewDart2,
-      Flags.disableRtiOptimization,
-      Flags.disableInlining
-    ]);
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': code},
+        // TODO(johnniwinther): This test fails if inlining is disabled. This
+        // is because the selector for calling `local1` matches `H.call` which
+        // is not considered live be resolution. We need to mark function-call
+        // selectors separately from dynamic calls and class-calls as to not
+        // mix these in codegen. Currently this test works without
+        // --disable-inlining, but the option should be re-enabled to ensure
+        // the intended coverage.
+        options: [Flags.disableRtiOptimization /*, Flags.disableInlining*/]);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
@@ -71,12 +88,18 @@
     RuntimeTypesNeed rtiNeed = closedWorld.rtiNeed;
     ProgramLookup programLookup = new ProgramLookup(compiler);
 
+    List<ClassEntity> closures = <ClassEntity>[];
+
     void processMember(MemberEntity element) {
       if (element is FunctionEntity) {
         Expect.isTrue(rtiNeed.methodNeedsTypeArguments(element),
             "Expected $element to need type arguments.");
         Expect.isTrue(rtiNeed.methodNeedsSignature(element),
             "Expected $element to need signature.");
+        elementEnvironment.forEachNestedClosure(element,
+            (FunctionEntity local) {
+          closures.add(local.enclosingClass);
+        });
       }
     }
 
@@ -89,6 +112,9 @@
       if (expectedIsChecks != null) {
         Class cls = programLookup.getClass(element);
         List<String> isChecks = cls.isChecks.map((m) => m.name.key).toList();
+        if (cls.functionTypeIndex != null) {
+          isChecks.add(r'$signature');
+        }
         Expect.setEquals(
             expectedIsChecks,
             isChecks,
@@ -100,6 +126,7 @@
     LibraryEntity library = elementEnvironment.mainLibrary;
     elementEnvironment.forEachClass(library, processClass);
     elementEnvironment.forEachLibraryMember(library, processMember);
+    closures.forEach(processClass);
   }
 
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/rti/factory_call_test.dart b/tests/compiler/dart2js/rti/factory_call_test.dart
index 5c0628e..6524254 100644
--- a/tests/compiler/dart2js/rti/factory_call_test.dart
+++ b/tests/compiler/dart2js/rti/factory_call_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -39,8 +38,8 @@
 
 main() {
   asyncTest(() async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': code}, options: [Flags.strongMode]);
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': code});
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/rti/instance_call_test.dart b/tests/compiler/dart2js/rti/instance_call_test.dart
index 9d220f9..1a547de 100644
--- a/tests/compiler/dart2js/rti/instance_call_test.dart
+++ b/tests/compiler/dart2js/rti/instance_call_test.dart
@@ -100,7 +100,7 @@
   asyncTest(() async {
     CompilationResult result = await runCompiler(
         memorySourceFiles: {'main.dart': code},
-        options: [Flags.strongMode, Flags.omitImplicitChecks]);
+        options: [Flags.omitImplicitChecks]);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index 2e6f996..dc94ae7 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -33,9 +33,6 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const RtiNeedDataComputer(),
         options: [],
-        skipForKernel: [
-          'runtime_type_closure_equals2.dart',
-        ],
         skipForStrong: [
           'map_literal_checked.dart',
           // TODO(johnniwinther): Optimize local function type signature need.
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index 147cd0d..51a06d3 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_test.dart
@@ -8,7 +8,6 @@
 
 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/types.dart';
 import 'package:compiler/src/js/js.dart';
@@ -24,15 +23,12 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
     await testAll();
-    print('--test from kernel (strong)---------------------------------------');
-    await testAll(strongMode: true);
   });
 }
 
-testAll({bool strongMode: false}) async {
-  await testTypeRepresentations(strongMode: strongMode);
+testAll() async {
+  await testTypeRepresentations();
 }
 
 List<FunctionTypeData> signatures = const <FunctionTypeData>[
@@ -53,7 +49,7 @@
       "<T extends num, S>(FutureOr<T> a, S b, List<void> c)"),
 ];
 
-testTypeRepresentations({bool strongMode}) async {
+testTypeRepresentations() async {
   String source = '''
 import 'dart:async';
 
@@ -65,17 +61,15 @@
   ${createUses(signatures, prefix: 'm')}
 }
 ''';
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: {'main.dart': source});
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   JavaScriptBackend backend = compiler.backend;
 
   TypeRepresentationGenerator typeRepresentation =
       new TypeRepresentationGenerator(
-          backend.namer, compiler.backendClosedWorldForTesting.nativeData,
-          strongMode: strongMode);
+          backend.namer, compiler.backendClosedWorldForTesting.nativeData);
 
   Expression onVariable(TypeVariableType _variable) {
     TypeVariableType variable = _variable;
@@ -113,9 +107,7 @@
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   String func = backend.namer.functionTypeTag;
   String ret = backend.namer.functionTypeReturnTypeTag;
-  String retvoid = strongMode
-      ? '$ret: -1'
-      : '${backend.namer.functionTypeVoidReturnTag}: true';
+  String retvoid = '$ret: -1';
   String args = backend.namer.functionTypeRequiredParametersTag;
   String opt = backend.namer.functionTypeOptionalParametersTag;
   String named = backend.namer.functionTypeNamedParametersTag;
@@ -178,7 +170,6 @@
   String Typedef8_tag = getTypedefTag(Typedef8_);
   String Typedef9_tag = getTypedefTag(Typedef9_);
   String Typedef10_tag = getTypedefTag(Typedef10_);
-  String Typedef11_tag = getTypedefTag(Typedef11_);
 
   expect(int_, '$int_rep');
   expect(String_, '$String_rep');
@@ -187,11 +178,9 @@
   // List<E>
   expect(elementEnvironment.getThisType(List_), '[$List_rep, $List_E_rep]');
   // List
-  expect(elementEnvironment.getRawType(List_),
-      strongMode ? '[$List_rep,,]' : '$List_rep');
+  expect(elementEnvironment.getRawType(List_), '[$List_rep,,]');
   // List<dynamic>
-  expect(instantiate(List_, [dynamic_]),
-      strongMode ? '[$List_rep,,]' : '$List_rep');
+  expect(instantiate(List_, [dynamic_]), '[$List_rep,,]');
   // List<int>
   expect(instantiate(List_, [int_]), '[$List_rep, $int_rep]');
   // List<Typedef1>
@@ -248,28 +237,20 @@
       '[$List_rep, {$func: 1, '
       '$args: [{$func: 1, $retvoid, '
       '$args: [$int_rep], $opt: [,]}]$Typedef10_tag}]');
-  if (!strongMode) {
-    expect(
-        instantiate(List_, [Typedef11_]),
-        '[$List_rep, {$func: 1, $args: [,, [$List_rep,,]]}]',
-        '[$List_rep, {$func: 1, $args: [,, [$List_rep,,]]$Typedef11_tag}]');
-  } else {
-    expect(
-        instantiate(List_, [Typedef11_]),
-        '[$List_rep, {$func: 1, $bounds: [$num_rep, $Object_rep], '
-        '$ret: {$futureOr: 1, $futureOrType: $int_rep}, '
-        '$args: [{$futureOr: 1, $futureOrType: 0}, 1, [$List_rep, -1]]}]');
-  }
+
+  expect(
+      instantiate(List_, [Typedef11_]),
+      '[$List_rep, {$func: 1, $bounds: [$num_rep, $Object_rep], '
+      '$ret: {$futureOr: 1, $futureOrType: $int_rep}, '
+      '$args: [{$futureOr: 1, $futureOrType: 0}, 1, [$List_rep, -1]]}]');
 
   // Map<K,V>
   expect(elementEnvironment.getThisType(Map_),
       '[$Map_rep, $Map_K_rep, $Map_V_rep]');
   // Map
-  expect(elementEnvironment.getRawType(Map_),
-      strongMode ? '[$Map_rep,,,]' : '$Map_rep');
+  expect(elementEnvironment.getRawType(Map_), '[$Map_rep,,,]');
   // Map<dynamic,dynamic>
-  expect(instantiate(Map_, [dynamic_, dynamic_]),
-      strongMode ? '[$Map_rep,,,]' : '$Map_rep');
+  expect(instantiate(Map_, [dynamic_, dynamic_]), '[$Map_rep,,,]');
   // Map<int,String>
   expect(
       instantiate(Map_, [int_, String_]), '[$Map_rep, $int_rep, $String_rep]');
@@ -325,14 +306,9 @@
       ' $retvoid, $args: [$int_rep], $opt: [,]}]}');
 
   // FutureOr<int> m11<T, S>(FutureOr<T> a, S b, List<void> c) {}
-  if (!strongMode) {
-    expect(findFunctionType(closedWorld, 'm11'),
-        '{$func: 1, $args: [,, [$List_rep,,]]}');
-  } else {
-    expect(
-        findFunctionType(closedWorld, 'm11'),
-        '{$func: 1, $bounds: [$num_rep, $Object_rep], '
-        '$ret: {$futureOr: 1, $futureOrType: $int_rep}, '
-        '$args: [{$futureOr: 1, $futureOrType: 0}, 1, [$List_rep, -1]]}');
-  }
+  expect(
+      findFunctionType(closedWorld, 'm11'),
+      '{$func: 1, $bounds: [$num_rep, $Object_rep], '
+      '$ret: {$futureOr: 1, $futureOrType: $int_rep}, '
+      '$args: [{$futureOr: 1, $futureOrType: 0}, 1, [$List_rep, -1]]}');
 }
diff --git a/tests/compiler/dart2js/sourcemaps/data/invokes.dart b/tests/compiler/dart2js/sourcemaps/data/invokes.dart
index a48a4ae..11fad4d 100644
--- a/tests/compiler/dart2js/sourcemaps/data/invokes.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/invokes.dart
@@ -122,14 +122,10 @@
   }
 
   invalidInvokes() {
-    // ignore: not_enough_required_arguments
-    C();
-    // ignore: invocation_of_non_function
-    dynamic();
-    // ignore: invocation_of_non_function
-    F();
-    // ignore: invocation_of_non_function
-    T();
+    (C as dynamic)();
+    (dynamic as dynamic)();
+    (F as dynamic)();
+    (T as dynamic)();
   }
 
   thisInstanceInvokes() {
diff --git a/tests/compiler/dart2js/sourcemaps/data/others.dart b/tests/compiler/dart2js/sourcemaps/data/others.dart
index 6d485a0..86ead71 100644
--- a/tests/compiler/dart2js/sourcemaps/data/others.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/others.dart
@@ -286,13 +286,3 @@
     print(e);
   }
 }
-
-unresolvedToplevel() {
-  // ignore: undefined_function
-  unresolved();
-}
-
-unresolvedType(e) {
-  // ignore: type_test_with_undefined_name
-  e is Unresolved;
-}
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
index 396eab4..70de964 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Error pattern: NoSuchMethodError: method not found: '([^']*)'\nReceiver: Instance of '[^']*'
+// Error pattern: NoSuchMethodError: method not found: '([^']*)'\r?\nReceiver: Instance of '[^']*'
 // Kind of minified name: instance
 // Expected deobfuscated name: m1
 
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
index 2640e7f..eb38df3 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Error pattern: NoSuchMethodError: method not found: '[^']*'\nReceiver: Instance of '([^']*)'
+// Error pattern: NoSuchMethodError: method not found: '[^']*'\r?\nReceiver: Instance of '([^']*)'
 // Kind of minified name: global
 // Expected deobfuscated name: B
 
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
index e0dbefc..78c9d5e 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
@@ -16,6 +16,11 @@
           // Switch continue target updates don't store the source information.
           return true;
         }
+        if (point.jsCode.startsWith('t1=[P.int]')) {
+          // TODO(johnniwinther): Ensure we have source information on type
+          // arguments.
+          return true;
+        }
         return false;
       };
     }
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
index 6d62f1f3..4eaf294 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
@@ -131,7 +131,7 @@
 }
 
 const Map<String, List<String>> TEST_CONFIGURATIONS = const {
-  'kernel': const [Flags.noPreviewDart2],
+  'kernel': const [],
 };
 
 final Map<String, Uri> TEST_FILES = _computeTestFiles();
diff --git a/tests/compiler/dart2js_extra/27199_test.dart b/tests/compiler/dart2js_extra/27199_test.dart
index 2c477fd..d4150bf 100644
--- a/tests/compiler/dart2js_extra/27199_test.dart
+++ b/tests/compiler/dart2js_extra/27199_test.dart
@@ -23,6 +23,6 @@
 main() {
   dynamic c = new C();
   dynamic a = 12;
-  if (confuse(true)) a = {};
+  if (confuse(true)) a = <String, ItemListFilter>{};
   c.f = a;
 }
diff --git a/tests/compiler/dart2js_extra/34156_test.dart b/tests/compiler/dart2js_extra/34156_test.dart
new file mode 100644
index 0000000..c579faf
--- /dev/null
+++ b/tests/compiler/dart2js_extra/34156_test.dart
@@ -0,0 +1,35 @@
+// 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:meta/dart2js.dart' as dart2js;
+import 'package:expect/expect.dart';
+
+@dart2js.tryInline
+// This function should not be inlined. Multiple returns and try-catch cannot
+// currently be inlined correctly.
+method() {
+  try {
+    thrower();
+    return 'x';
+  } catch (e) {
+    print(e);
+    return 'y';
+  }
+  return 'z';
+}
+
+thrower() {
+  if (g) throw 123;
+}
+
+var g;
+main() {
+  g = false;
+  var x1 = method();
+  Expect.equals('x', x1);
+
+  g = true;
+  var x2 = method();
+  Expect.equals('y', x2);
+}
diff --git a/tests/compiler/dart2js_extra/checked_setter_test.dart b/tests/compiler/dart2js_extra/checked_setter_test.dart
new file mode 100644
index 0000000..2846015
--- /dev/null
+++ b/tests/compiler/dart2js_extra/checked_setter_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class A {
+  String field;
+}
+
+class B {
+  int field;
+}
+
+@NoInline()
+assign(d) {
+  d.field = 0;
+}
+
+main() {
+  Expect.throws(() => assign(new A()));
+  assign(new B()); //# 01: ok
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index c33366d..13e682f 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -8,8 +8,32 @@
 class_test: Fail
 constant_javascript_semantics4_test: Fail, OK
 generic_class_is_test: Fail # Issue 32004
+jsinterop_test/01: MissingCompileTimeError # Issue 34174
+jsinterop_test/02: MissingCompileTimeError # Issue 34174
+jsinterop_test/03: MissingCompileTimeError # Issue 34174
+jsinterop_test/04: MissingCompileTimeError # Issue 34174
+jsinterop_test/34: MissingCompileTimeError # Issue 33834
+jsinterop_test/35: MissingCompileTimeError # Issue 33834
+jsinterop_test/36: MissingCompileTimeError # Issue 33834
+jsinterop_test/37: MissingCompileTimeError # Issue 33834
+jsinterop_test/38: MissingCompileTimeError # Issue 34174
+jsinterop_test/42: MissingCompileTimeError # Issue 34174
+jsinterop_test/46: MissingCompileTimeError # Issue 34174
+jsinterop_test/51: MissingCompileTimeError # Issue 34174
 many_instantiations_test/01: Crash # Issue 33819
 no_such_method_test: Fail # Wrong Invocation.memberName.
+non_jsinterop_test/01: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/02: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/03: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/04: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/34: MissingCompileTimeError # Issue 33834
+non_jsinterop_test/35: MissingCompileTimeError # Issue 33834
+non_jsinterop_test/36: MissingCompileTimeError # Issue 33834
+non_jsinterop_test/37: MissingCompileTimeError # Issue 33834
+non_jsinterop_test/38: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/42: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/46: MissingCompileTimeError # Issue 34174
+non_jsinterop_test/51: MissingCompileTimeError # Issue 34174
 statements_test: Fail
 typed_locals_test: Pass, Fail
 
diff --git a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
new file mode 100644
index 0000000..e36f6b0
--- /dev/null
+++ b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int a, int b) => a + b;
+}
+
+class C2 {
+  int call(int a, int b, int c) => a + b + c;
+}
+
+class D {
+  dynamic f1 = new C1();
+  dynamic f2 = new C2();
+}
+
+@NoInline()
+id(o) => o;
+
+main() {
+  dynamic d1 = id(new D());
+  Expect.equals(d1.f1(1, 2), 3); //# 01: ok
+  Expect.equals(d1.f2(1, 2, 3), 6); //# 02: ok
+  D d2 = id(new D());
+  Expect.equals(d2.f1(2, 3), 5); //# 03: ok
+  Expect.equals(d2.f2(2, 3, 4), 9); //# 04: ok
+}
diff --git a/tests/compiler/dart2js_extra/jsinterop_test.dart b/tests/compiler/dart2js_extra/jsinterop_test.dart
new file mode 100644
index 0000000..7c3c719
--- /dev/null
+++ b/tests/compiler/dart2js_extra/jsinterop_test.dart
@@ -0,0 +1,242 @@
+// 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.
+
+// TODO(johnniwinther): Share this test with ddc.
+
+// Test for positive and negative uses of js-interop declarations in a library
+// _with_ a @JS() annotation. This file is also used in
+// tests/compiler/dart2js/model/native_test.dart.
+
+@JS()
+library lib;
+
+import 'package:js/js.dart';
+
+var topLevelField;
+
+get topLevelGetter => null;
+
+set topLevelSetter(_) {}
+
+topLevelFunction() {}
+
+@JS('a') // JS_INTEROP_FIELD_NOT_SUPPORTED       //# 01: compile-time error
+var topLevelJsInteropField; //# 01: continued
+
+@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 02: compile-time error
+get topLevelJsInteropGetter => null; //# 02: continued
+
+@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 03: compile-time error
+set topLevelJsInteropSetter(_) {} //# 03: continued
+
+@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 04: compile-time error
+topLevelJsInteropFunction() {} //# 04: continued
+
+external get externalTopLevelGetter;
+
+external set externalTopLevelSetter(_);
+
+external externalTopLevelFunction();
+
+@JS('a')
+external get externalTopLevelJsInteropGetter;
+
+@JS('b')
+external set externalTopLevelJsInteropSetter(_);
+
+@JS('c')
+external externalTopLevelJsInteropFunction();
+
+class Class {
+  Class.generative();
+  factory Class.fact() => null;
+
+  // NON_NATIVE_EXTERNAL               //# 08: compile-time error
+  external Class.externalGenerative(); //# 08: continued
+
+  // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
+  external factory Class.externalFact(); //# 09: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 10: compile-time error
+  Class.jsInteropGenerative(); //# 10: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
+  factory Class.jsInteropFact() => null; //# 11: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
+  external Class.externalJsInteropGenerative(); //# 12: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
+  external factory Class.externalJsInteropFact(); //# 13: continued
+
+  var instanceField;
+  get instanceGetter => null;
+  set instanceSetter(_) {}
+  instanceMethod() {}
+
+  static var staticField;
+  get staticGetter => null;
+  set staticSetter(_) {}
+  staticMethod() {}
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
+  var instanceJsInteropField; //# 14: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
+  get instanceJsInteropGetter => null; //# 15: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
+  set instanceJsInteropSetter(_) {} //# 16: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
+  instanceJsInteropMethod() {} //# 17: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
+  static var staticJsInteropField; //# 18: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
+  get staticJsInteropGetter => null; //# 19: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
+  set staticJsInteropSetter(_) {} //# 20: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
+  staticJsInteropMethod() {} //# 21: continued
+
+  // NON_NATIVE_EXTERNAL               //# 22: compile-time error
+  external get externalInstanceGetter; //# 22: continued
+
+  // NON_NATIVE_EXTERNAL                  //# 23: compile-time error
+  external set externalInstanceSetter(_); //# 23: continued
+
+  // NON_NATIVE_EXTERNAL             //# 24: compile-time error
+  external externalInstanceMethod(); //# 24: continued
+
+  // NON_NATIVE_EXTERNAL             //# 25: compile-time error
+  external get externalStaticGetter; //# 25: continued
+
+  // NON_NATIVE_EXTERNAL                //# 26: compile-time error
+  external set externalStaticSetter(_); //# 26: continued
+
+  // NON_NATIVE_EXTERNAL           //# 27: compile-time error
+  external externalStaticMethod(); //# 27: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
+  external get externalInstanceJsInteropGetter; //# 28: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
+  external set externalInstanceJsInteropSetter(_); //# 29: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
+  external externalInstanceJsInteropMethod(); //# 30: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
+  external get externalStaticJsInteropGetter; //# 31: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
+  external set externalStaticJsInteropSetter(_); //# 32: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
+  external externalStaticJsInteropMethod(); //# 33: continued
+}
+
+@JS('d')
+class JsInteropClass {
+  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 34: compile-time error
+  JsInteropClass.generative(); //# 34: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 35: compile-time error
+  factory JsInteropClass.fact() => null; //# 35: continued
+
+  external JsInteropClass.externalGenerative();
+  external factory JsInteropClass.externalFact();
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 36: compile-time error
+  JsInteropClass.jsInteropGenerative(); //# 36: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 37: compile-time error
+  factory JsInteropClass.jsInteropFact() => null; //# 37: continued
+
+  @JS('a')
+  external JsInteropClass.externalJsInteropGenerative();
+
+  @JS('a')
+  external factory JsInteropClass.externalJsInteropFact();
+
+  // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 38: compile-time error
+  var instanceField; //# 38: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 39: compile-time error
+  get instanceGetter => null; //# 39: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 40: compile-time error
+  set instanceSetter(_) {} //# 40: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 41: compile-time error
+  instanceMethod() {} //# 41: continued
+
+  // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 42: compile-time error
+  static var staticField; //# 42: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 43: compile-time error
+  get staticGetter => null; //# 43: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 44: compile-time error
+  set staticSetter(_) {} //# 44: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 45: compile-time error
+  staticMethod() {} //# 45: continued
+
+  @JS('a') // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 46: compile-time error
+  var instanceJsInteropField; //# 46: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 48: compile-time error
+  get instanceJsInteropGetter => null; //# 48: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 49: compile-time error
+  set instanceJsInteropSetter(_) {} //# 49: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 50: compile-time error
+  instanceJsInteropMethod() {} //# 50: continued
+
+  @JS('a') // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 51: compile-time error
+  static var staticJsInteropField; //# 51: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 52: compile-time error
+  get staticJsInteropGetter => null; //# 52: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 53: compile-time error
+  set staticJsInteropSetter(_) {} //# 53: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 54: compile-time error
+  staticJsInteropMethod() {} //# 54: continued
+
+  external get externalInstanceGetter;
+  external set externalInstanceSetter(_);
+  external externalInstanceMethod();
+
+  external get externalStaticGetter;
+  external set externalStaticSetter(_);
+  external externalStaticMethod();
+
+  @JS('a')
+  external get externalInstanceJsInteropGetter;
+
+  @JS('a')
+  external set externalInstanceJsInteropSetter(_);
+
+  @JS('a')
+  external externalInstanceJsInteropMethod();
+
+  @JS('a')
+  external get externalStaticJsInteropGetter;
+
+  @JS('a')
+  external set externalStaticJsInteropSetter(_);
+
+  @JS('a')
+  external externalStaticJsInteropMethod();
+}
+
+main() {}
diff --git a/tests/compiler/dart2js_extra/non_jsinterop_test.dart b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
new file mode 100644
index 0000000..f676126
--- /dev/null
+++ b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
@@ -0,0 +1,244 @@
+// 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.
+
+// TODO(johnniwinther): Share this test with ddc.
+
+// Test for positive and negative uses of js-interop declarations in a library
+// _without_ a @JS() anntaotion. This file is also used in
+// tests/compiler/dart2js/model/native_test.dart.
+
+library lib;
+
+import 'package:js/js.dart';
+
+var topLevelField;
+
+get topLevelGetter => null;
+
+set topLevelSetter(_) {}
+
+topLevelFunction() {}
+
+@JS('a') // JS_INTEROP_FIELD_NOT_SUPPORTED       //# 01: compile-time error
+var topLevelJsInteropField; //# 01: continued
+
+@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 02: compile-time error
+get topLevelJsInteropGetter => null; //# 02: continued
+
+@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 03: compile-time error
+set topLevelJsInteropSetter(_) {} //# 03: continued
+
+@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 04: compile-time error
+topLevelJsInteropFunction() {} //# 04: continued
+
+// NON_NATIVE_EXTERNAL               //# 05: compile-time error
+external get externalTopLevelGetter; //# 05: continued
+
+// NON_NATIVE_EXTERNAL                  //# 06: compile-time error
+external set externalTopLevelSetter(_); //# 06: continued
+
+// NON_NATIVE_EXTERNAL               //# 07: compile-time error
+external externalTopLevelFunction(); //# 07: continued
+
+@JS('a')
+external get externalTopLevelJsInteropGetter;
+
+@JS('b')
+external set externalTopLevelJsInteropSetter(_);
+
+@JS('c')
+external externalTopLevelJsInteropFunction();
+
+class Class {
+  Class.generative();
+  factory Class.fact() => null;
+
+  // NON_NATIVE_EXTERNAL               //# 08: compile-time error
+  external Class.externalGenerative(); //# 08: continued
+
+  // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
+  external factory Class.externalFact(); //# 09: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 10: compile-time error
+  Class.jsInteropGenerative(); //# 10: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
+  factory Class.jsInteropFact() => null; //# 11: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
+  external Class.externalJsInteropGenerative(); //# 12: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
+  external factory Class.externalJsInteropFact(); //# 13: continued
+
+  var instanceField;
+  get instanceGetter => null;
+  set instanceSetter(_) {}
+  instanceMethod() {}
+
+  static var staticField;
+  get staticGetter => null;
+  set staticSetter(_) {}
+  staticMethod() {}
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
+  var instanceJsInteropField; //# 14: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
+  get instanceJsInteropGetter => null; //# 15: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
+  set instanceJsInteropSetter(_) {} //# 16: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
+  instanceJsInteropMethod() {} //# 17: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
+  static var staticJsInteropField; //# 18: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
+  get staticJsInteropGetter => null; //# 19: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
+  set staticJsInteropSetter(_) {} //# 20: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
+  staticJsInteropMethod() {} //# 21: continued
+
+  // NON_NATIVE_EXTERNAL               //# 22: compile-time error
+  external get externalInstanceGetter; //# 22: continued
+
+  // NON_NATIVE_EXTERNAL                  //# 23: compile-time error
+  external set externalInstanceSetter(_); //# 23: continued
+
+  // NON_NATIVE_EXTERNAL             //# 24: compile-time error
+  external externalInstanceMethod(); //# 24: continued
+
+  // NON_NATIVE_EXTERNAL             //# 25: compile-time error
+  external get externalStaticGetter; //# 25: continued
+
+  // NON_NATIVE_EXTERNAL                //# 26: compile-time error
+  external set externalStaticSetter(_); //# 26: continued
+
+  // NON_NATIVE_EXTERNAL           //# 27: compile-time error
+  external externalStaticMethod(); //# 27: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
+  external get externalInstanceJsInteropGetter; //# 28: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
+  external set externalInstanceJsInteropSetter(_); //# 29: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
+  external externalInstanceJsInteropMethod(); //# 30: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
+  external get externalStaticJsInteropGetter; //# 31: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
+  external set externalStaticJsInteropSetter(_); //# 32: continued
+
+  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
+  external externalStaticJsInteropMethod(); //# 33: continued
+}
+
+@JS('d')
+class JsInteropClass {
+  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 34: compile-time error
+  JsInteropClass.generative(); //# 34: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 35: compile-time error
+  factory JsInteropClass.fact() => null; //# 35: continued
+
+  external JsInteropClass.externalGenerative();
+  external factory JsInteropClass.externalFact();
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 36: compile-time error
+  JsInteropClass.jsInteropGenerative(); //# 36: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 37: compile-time error
+  factory JsInteropClass.jsInteropFact() => null; //# 37: continued
+
+  @JS('a')
+  external JsInteropClass.externalJsInteropGenerative();
+
+  @JS('a')
+  external factory JsInteropClass.externalJsInteropFact();
+
+  // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 38: compile-time error
+  var instanceField; //# 38: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 39: compile-time error
+  get instanceGetter => null; //# 39: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 40: compile-time error
+  set instanceSetter(_) {} //# 40: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 41: compile-time error
+  instanceMethod() {} //# 41: continued
+
+  // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 42: compile-time error
+  static var staticField; //# 42: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 43: compile-time error
+  get staticGetter => null; //# 43: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 44: compile-time error
+  set staticSetter(_) {} //# 44: continued
+
+  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 45: compile-time error
+  staticMethod() {} //# 45: continued
+
+  @JS('a') // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 46: compile-time error
+  var instanceJsInteropField; //# 46: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 48: compile-time error
+  get instanceJsInteropGetter => null; //# 48: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 49: compile-time error
+  set instanceJsInteropSetter(_) {} //# 49: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 50: compile-time error
+  instanceJsInteropMethod() {} //# 50: continued
+
+  @JS('a') // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 51: compile-time error
+  static var staticJsInteropField; //# 51: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 52: compile-time error
+  get staticJsInteropGetter => null; //# 52: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 53: compile-time error
+  set staticJsInteropSetter(_) {} //# 53: continued
+
+  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 54: compile-time error
+  staticJsInteropMethod() {} //# 54: continued
+
+  external get externalInstanceGetter;
+  external set externalInstanceSetter(_);
+  external externalInstanceMethod();
+
+  external get externalStaticGetter;
+  external set externalStaticSetter(_);
+  external externalStaticMethod();
+
+  @JS('a')
+  external get externalInstanceJsInteropGetter;
+
+  @JS('a')
+  external set externalInstanceJsInteropSetter(_);
+
+  @JS('a')
+  external externalInstanceJsInteropMethod();
+
+  @JS('a')
+  external get externalStaticJsInteropGetter;
+
+  @JS('a')
+  external set externalStaticJsInteropSetter(_);
+
+  @JS('a')
+  external externalStaticJsInteropMethod();
+}
+
+main() {}
diff --git a/tests/compiler/dart2js_extra/super_constructor1_test.dart b/tests/compiler/dart2js_extra/super_constructor1_test.dart
index b570312..a0aaf86 100644
--- a/tests/compiler/dart2js_extra/super_constructor1_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor1_test.dart
@@ -25,8 +25,8 @@
 class C extends B {
   var z;
   C(i)
-      : super(i * 3),
-        z = i {
+      : z = i,
+        super(i * 3) {
     message = '${message}C($i)';
   }
 }
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 6273aa3..cc56706 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -9,11 +9,15 @@
 [ $browser ]
 *: Skip
 
-[ $compiler == dart2js && $checked && !$strong ]
-native_method_inlining_test: RuntimeError
-
 [ $compiler == dart2js && $fasta ]
+field_type2_test: CompileTimeError # Issue 33762
+field_type_test: CompileTimeError # Issue 33762
+native_exceptions1_frog_test: CompileTimeError # Issue 33762
 native_library_same_name_used_frog_test: CompileTimeError
+native_mixin_with_plain_test: CompileTimeError # Issue 33762
+native_window1_frog_test: CompileTimeError # Issue 33762
+native_window2_frog_test: CompileTimeError # Issue 33762
+subclassing_constructor_1_test: CompileTimeError # Issue 33762
 subclassing_constructor_1_test: RuntimeError
 subclassing_super_call_test: RuntimeError
 subclassing_super_field_1_test: RuntimeError
@@ -21,6 +25,3 @@
 
 [ $compiler == dart2js && $minified ]
 optimization_hints_test: RuntimeError, OK # Test relies on unminified names.
-
-[ $compiler == dart2js && $strong ]
-native_checked_fields_frog_test: RuntimeError
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index ec5e1ad..1dd30c1 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// dart2jsOptions=--omit-implicit-checks
+
 // Test that native methods with unnamed optional arguments are called with the
 // number of arguments in the call site AND the call site is inlined.
 
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
index 968ddba..bf989a7 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
@@ -45,8 +45,8 @@
 
   B.two()
       : b1 = log(201),
-        super.two(),
-        b3 = log(203) {
+        b3 = log(203),
+        super.two() {
     log('body(B.two)');
   }
 
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index 6a563a2..f00e5df 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -6,7 +6,6 @@
 unsorted/invocation_errors_test: Pass
 unsorted/nsm_dispatcher_test: Skip # The test uses Symbol without MirrorsUsed
 unsorted/simple_literal_test/01: Skip # The test expects error for large integer literal.
-unsorted/super_initializer_test: Skip
 
 [ !$fasta ]
 unsorted/loop_test: Skip # This test uses optional new/const.
@@ -17,10 +16,6 @@
 [ $compiler == dart2analyzer && $runtime == none ]
 unsorted/super_mixin_test: CompileTimeError
 
-[ $compiler == dart2analyzer && $strong ]
-unsorted/klass_field_initializer_test: CompileTimeError
-unsorted/super_initializer_test: CompileTimeError
-
 [ $compiler == dart2js && $fasta ]
 unsorted/super_mixin_test: RuntimeError
 unsorted/try_finally_test: Crash
diff --git a/tests/kernel/unsorted/klass_field_initializer_test.dart b/tests/kernel/unsorted/klass_field_initializer_test.dart
index cc00184..11c51af6 100644
--- a/tests/kernel/unsorted/klass_field_initializer_test.dart
+++ b/tests/kernel/unsorted/klass_field_initializer_test.dart
@@ -21,8 +21,8 @@
   var m;
 
   B(this.n, o)
-      : super(o),
-        m = "m";
+      : m = "m",
+        super(o);
 }
 
 main() {
diff --git a/tests/kernel/unsorted/super_initializer_test.dart b/tests/kernel/unsorted/super_initializer_test.dart
deleted file mode 100644
index 95ac2dd..0000000
--- a/tests/kernel/unsorted/super_initializer_test.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-import 'package:expect/expect.dart';
-
-String log;
-init() {
-  log = '';
-}
-
-logit(msg) {
-  return log = '$log$msg';
-}
-
-class Base {
-  var b;
-  Base.arg0() : b = logit('b') {
-    logit('B');
-  }
-  Base.arg1(a) : b = logit('b') {
-    logit('B');
-  }
-  Base.arg2(a, b) : b = logit('b') {
-    logit('B');
-  }
-}
-
-class Sub extends Base {
-  var x;
-  var s;
-  Sub.arg0()
-      : x = logit('x'),
-        super.arg0(),
-        s = logit('s') {
-    logit('S');
-  }
-  Sub.arg1(a)
-      : x = logit('x'),
-        super.arg1(logit('1')),
-        s = logit('s') {
-    logit('S');
-  }
-  Sub.arg2(a, b)
-      : x = logit('x'),
-        super.arg2(logit('1'), logit('2')),
-        s = logit('s') {
-    logit('S');
-  }
-}
-
-test(fun(), String result) {
-  init();
-  fun();
-  Expect.isTrue(log == result);
-}
-
-main() {
-  test(() => new Sub.arg0(), 'xsbBS');
-  test(() => new Sub.arg1(1), 'x1sbBS');
-  test(() => new Sub.arg2(1, 2), 'x12sbBS');
-}
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 29ebc2a..3999cf2 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -10,6 +10,8 @@
 prefix5_negative_test: Fail
 
 [ $fasta ]
+assertion_initializer_const_error2_test.dart: CompileTimeError # super initializer not last
+assertion_initializer_test.dart: CompileTimeError # super initializer not last
 bad_constructor_test/04: MissingCompileTimeError
 bad_constructor_test/06: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
@@ -20,14 +22,23 @@
 bit_operations_test/03: CompileTimeError
 bit_operations_test/04: CompileTimeError
 bit_operations_test/none: CompileTimeError
+canonical_const3_test: CompileTimeError # super initializer not last
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
+closure_in_initializer_test: CompileTimeError # super initializer not last
 config_import_test: Crash
 const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
 const_switch2_test/01: MissingCompileTimeError
+constructor2_test: CompileTimeError # super initializer not last
+constructor3_test: CompileTimeError # super initializer not last
+constructor5_test: CompileTimeError # super initializer not last
+constructor6_test: CompileTimeError # super initializer not last
+constructor_initializer_test/none: CompileTimeError # super initializer not last
+constructor_test: CompileTimeError # super initializer not last
+constructor_with_mixin_test: CompileTimeError # super initializer not last
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -36,9 +47,11 @@
 duplicate_implements_test/02: MissingCompileTimeError
 duplicate_implements_test/03: MissingCompileTimeError
 duplicate_implements_test/04: MissingCompileTimeError
+example_constructor_test: CompileTimeError # super initializer not last
 factory_redirection_test/07: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
+field_initialization_order_test: CompileTimeError # super initializer not last
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
@@ -46,6 +59,8 @@
 field_override4_test/02: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
+final_field_initialization_order_test: CompileTimeError # super initializer not last
+function_test: CompileTimeError # super initializer not last
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
@@ -105,6 +120,7 @@
 mixin_super_constructor_named_test/01: MissingCompileTimeError
 mixin_super_constructor_positionals_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
+naming_test: CompileTimeError # super initializer not last
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -115,7 +131,10 @@
 override_inheritance_mixed_test/03: MissingCompileTimeError
 override_inheritance_mixed_test/04: MissingCompileTimeError
 override_method_with_field_test/01: MissingCompileTimeError
+parameter_initializer_test.dart: CompileTimeError # super initializer not last
 private_super_constructor_test/01: MissingCompileTimeError
+private_test: CompileTimeError # super initializer not last
+redirecting_constructor_initializer_test: CompileTimeError # super initializer not last
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
 regress_20394_test/01: MissingCompileTimeError
@@ -125,13 +144,19 @@
 regress_28217_test/none: MissingCompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
+string_interpolate_test.dart: CompileTimeError # super initializer not last
+super_field_access_test: CompileTimeError # super initializer not last
+super_first_constructor_test: CompileTimeError # super initializer not last
+super_test: CompileTimeError # super initializer not last
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
 switch_case_test/00: MissingCompileTimeError
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 syntax_test/none: CompileTimeError
+third_test: CompileTimeError # super initializer not last
 type_variable_conflict2_test/02: MissingCompileTimeError
+unbound_getter_test.dart: CompileTimeError # super initializer not last
 vm/debug_break_enabled_vm_test/01: CompileTimeError
 vm/debug_break_enabled_vm_test/none: CompileTimeError
 vm/regress_14903_test: CompileTimeError
diff --git a/tests/language_2/conflicting_type_variable_and_setter_test.dart b/tests/language_2/conflicting_type_variable_and_setter_test.dart
index 2aca0c3..2efcecb 100644
--- a/tests/language_2/conflicting_type_variable_and_setter_test.dart
+++ b/tests/language_2/conflicting_type_variable_and_setter_test.dart
@@ -4,7 +4,10 @@
 
 import "package:expect/expect.dart";
 
-class C<D> {
+class C<
+        D //# 01: compile-time error
+        E //# none: ok
+         > {
   void set D(int value) {
     field = value;
   }
diff --git a/tests/language_2/constructor9_test.dart b/tests/language_2/constructor9_test.dart
index fc13e5b..3194d1d 100644
--- a/tests/language_2/constructor9_test.dart
+++ b/tests/language_2/constructor9_test.dart
@@ -7,7 +7,7 @@
 
 class Klass {
   Klass(var v) : field_ = v {}
-  final uninitializedFinalField_; // //# 01: static type warning
+  final uninitializedFinalField_; // //# 01: compile-time error
   var field_;
 }
 
diff --git a/tests/language_2/field_initialization_order_test.dart b/tests/language_2/field_initialization_order_test.dart
index c3322c7..dda70a7 100644
--- a/tests/language_2/field_initialization_order_test.dart
+++ b/tests/language_2/field_initialization_order_test.dart
@@ -82,5 +82,5 @@
   Expect.equals(
       'b.bi.a.ai.', run(() => new InheritOneField.initWithSuperInit_correctOrder()));
   Expect.equals(
-      'b.a.ai.bi.', run(() => new InheritOneField.initWithSuperInit_incorrectOrder()));
+      'b.bi.a.ai.', run(() => new InheritOneField.initWithSuperInit_incorrectOrder()));
 }
diff --git a/tests/language_2/invalid_returns/async_invalid_return_06_test.dart b/tests/language_2/invalid_returns/async_invalid_return_06_test.dart
deleted file mode 100644
index 4df22a2..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_06_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-int v = null;
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_07_test.dart b/tests/language_2/invalid_returns/async_invalid_return_07_test.dart
deleted file mode 100644
index 17fef33..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_07_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-int v = null;
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_09_test.dart b/tests/language_2/invalid_returns/async_invalid_return_09_test.dart
deleted file mode 100644
index 353e1d3..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_09_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-Object v = null;
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_10_test.dart b/tests/language_2/invalid_returns/async_invalid_return_10_test.dart
deleted file mode 100644
index 0c86c25..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_10_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-Object v = null;
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_12_test.dart b/tests/language_2/invalid_returns/async_invalid_return_12_test.dart
deleted file mode 100644
index 25077da..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_12_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-Future<int> v = null;
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_13_test.dart b/tests/language_2/invalid_returns/async_invalid_return_13_test.dart
deleted file mode 100644
index 426e24a..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_13_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-Future<int> v = null;
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_15_test.dart b/tests/language_2/invalid_returns/async_invalid_return_15_test.dart
deleted file mode 100644
index 71045781..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_15_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-FutureOr<int> v = null;
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_16_test.dart b/tests/language_2/invalid_returns/async_invalid_return_16_test.dart
deleted file mode 100644
index cc48867..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_16_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-FutureOr<int> v = null;
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_18_test.dart b/tests/language_2/invalid_returns/async_invalid_return_18_test.dart
deleted file mode 100644
index adb46e6..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_18_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-Future<Object> v = null;
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_19_test.dart b/tests/language_2/invalid_returns/async_invalid_return_19_test.dart
deleted file mode 100644
index 423c1a6..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_19_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-Future<Object> v = null;
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_21_test.dart b/tests/language_2/invalid_returns/async_invalid_return_21_test.dart
deleted file mode 100644
index 0274ef9..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_21_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-FutureOr<Object> v = null;
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_invalid_return_22_test.dart b/tests/language_2/invalid_returns/async_invalid_return_22_test.dart
deleted file mode 100644
index 6d8fb3e..0000000
--- a/tests/language_2/invalid_returns/async_invalid_return_22_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/*
-* `return exp;` where `exp` has static type `S` is an error if `flatten(T)` is
-  `void` and `flatten(S)` is not `void`, `dynamic`, or `Null`
-*/
-FutureOr<Object> v = null;
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ v;
-}
-
-void main() {
-  test();
-}
diff --git a/tests/language_2/invalid_returns/async_valid_returns.dart b/tests/language_2/invalid_returns/async_valid_returns.dart
index 3df1be4..f5ca755 100644
--- a/tests/language_2/invalid_returns/async_valid_returns.dart
+++ b/tests/language_2/invalid_returns/async_valid_returns.dart
@@ -319,7 +319,7 @@
 
 /*
 * `return exp;` where `exp` has static type `S` is a valid return if:
-  * `flatten(T)` is not `void`
+  * `T` is not `void`
   * and `flatten(S)` is not `void`
   * and `Future<flatten(S)>` is assignable to `T`
 */
@@ -343,6 +343,46 @@
   return fvi;
 }
 
+Future<void> async_int_to_Future_void__e() async => vi;
+Future<void> async_int_to_Future_void_() async {
+  return vi;
+}
+
+Future<void> async_Object_to_Future_void__e() async => vo;
+Future<void> async_Object_to_Future_void_() async {
+  return vo;
+}
+
+Future<void> async_FutureOr_int__to_Future_void__e() async => fovi;
+Future<void> async_FutureOr_int__to_Future_void_() async {
+  return fovi;
+}
+
+Future<void> async_Future_int__to_Future_void__e() async => fvi;
+Future<void> async_Future_int__to_Future_void_() async {
+  return fvi;
+}
+
+FutureOr<void> async_int_to_FutureOr_void__e() async => vi;
+FutureOr<void> async_int_to_FutureOr_void_() async {
+  return vi;
+}
+
+FutureOr<void> async_Object_to_FutureOr_void__e() async => vo;
+FutureOr<void> async_Object_to_FutureOr_void_() async {
+  return vo;
+}
+
+FutureOr<void> async_FutureOr_int__to_FutureOr_void__e() async => fovi;
+FutureOr<void> async_FutureOr_int__to_FutureOr_void_() async {
+  return fovi;
+}
+
+FutureOr<void> async_Future_int__to_FutureOr_void__e() async => fvi;
+FutureOr<void> async_Future_int__to_FutureOr_void_() async {
+  return fvi;
+}
+
 void main() {
   async_int_to_void_e();
   async_int_to_Future_void__e();
@@ -462,4 +502,20 @@
   async_FutureOr_int__to_Future_int_();
   async_Future_int__to_Future_int__e();
   async_Future_int__to_Future_int_();
+  async_int_to_Future_void__e();
+  async_int_to_Future_void_();
+  async_Object_to_Future_void__e();
+  async_Object_to_Future_void_();
+  async_FutureOr_int__to_Future_void__e();
+  async_FutureOr_int__to_Future_void_();
+  async_Future_int__to_Future_void__e();
+  async_Future_int__to_Future_void_();
+  async_int_to_FutureOr_void__e();
+  async_int_to_FutureOr_void_();
+  async_Object_to_FutureOr_void__e();
+  async_Object_to_FutureOr_void_();
+  async_FutureOr_int__to_FutureOr_void__e();
+  async_FutureOr_int__to_FutureOr_void_();
+  async_Future_int__to_FutureOr_void__e();
+  async_Future_int__to_FutureOr_void_();
 }
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 3473030..52840b1 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -83,40 +83,6 @@
 implicit_creation/implicit_new_prefix_constructor_generic_test: Fail # No support for implicit creation.
 implicit_creation/implicit_new_prefix_constructor_test: Fail # No support for implicit creation.
 
-[ $compiler != dart2js && !$strong ]
-initializer_super_last_test/cc01: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc02: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc03: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc04: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc05: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc06: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc07: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc08: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc09: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc10: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc11: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc12: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc13: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc14: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc15: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc16: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc17: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc18: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc19: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc20: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc21: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc22: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc23: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc24: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc25: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc26: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc27: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc28: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc29: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc30: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc31: MissingCompileTimeError # Was valid in Dart 1.
-initializer_super_last_test/cc32: MissingCompileTimeError # Was valid in Dart 1.
-
 [ $compiler != dartdevc && $compiler != dart2js && !$checked ]
 function_type/*: Skip # Needs checked mode.
 
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 6d1d6c5..469f479 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -19,7 +19,7 @@
 multiline_newline_test/05r: Pass
 regress_29349_test: Pass
 void/generalized_void_syntax_test: Pass
-void/void_type_function_types_test/none: Pass 
+void/void_type_function_types_test/none: Pass
 
 [ $compiler == dart2analyzer && !$analyzer_use_fasta_parser && !$fasta ]
 constructor_type_parameter_test/00: MissingCompileTimeError # Issue 33110
@@ -40,10 +40,6 @@
 arg_param_trailing_comma_test/74: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)
 arg_param_trailing_comma_test/98: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)
 arg_param_trailing_comma_test/99: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)
-assign_to_type_test/01: Crash # Error recovery in method body (invalid assignment)
-assign_to_type_test/02: Crash # Error recovery in method body (invalid assignment)
-assign_to_type_test/03: Crash # Error recovery in method body (invalid assignment)
-assign_to_type_test/04: Crash # Error recovery in method body (invalid assignment)
 black_listed_test/02: Crash # Issue 33686 - No core library found
 black_listed_test/04: Crash # Issue 33686 - No core library found
 black_listed_test/06: Crash # Issue 33686 - No core library found
@@ -58,36 +54,24 @@
 built_in_identifier_type_annotation_test/set: Crash # Issue #34043 - Error recovery in outline
 built_in_identifier_type_annotation_test/set-funret: Crash # Issue #34043 - Error recovery in outline
 call_nonexistent_static_test/10: Crash # Error recovery in method body (attempt to read from setter)
-case_expression_with_assignment_test/01: Crash # Error recovery in method body (assignment to constant)
 class_cycle2_test/01: Crash # Issue #34043 - Error recovery in outline (class hierarchy cycle - see also #33756)
 class_cycle2_test/02: Crash # Issue #34043 - Error recovery in outline (class hierarchy cycle - see also #33756)
 class_cycle_test/00: Crash # Issue #34043 - Error recovery in outline (class hierarchy cycle - see also #33756)
 class_cycle_test/01: Crash # Issue #34043 - Error recovery in outline (class hierarchy cycle - see also #33756)
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
-class_literal_static_test/12: Crash # Error recovery in method body (invalid assignment)
-class_literal_static_test/13: Crash # Error recovery in method body (invalid assignment)
-class_literal_static_test/24: Crash # Error recovery in method body (invalid assignment)
-class_literal_test/12: Crash # Error recovery in method body (invalid assignment)
-class_literal_test/13: Crash # Error recovery in method body (invalid assignment)
-class_literal_test/24: Crash # Error recovery in method body (invalid assignment)
 compile_time_constant_static5_test/11: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/21: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/23: CompileTimeError # Issue 31402
-conditional_property_assignment_test/20: Crash # Error recovery in method body (invalid assignment)
-conditional_property_assignment_test/21: Crash # Error recovery in method body (invalid assignment)
-conditional_property_assignment_test/22: Crash # Error recovery in method body (invalid assignment)
 config_import_corelib_test: CompileTimeError # Issue 34047
 conflicting_generic_interfaces_hierarchy_loop_infinite_test: Crash # Issue #34043 - Error recovery in outline (class hierarchy cycle - see also #33756)
 conflicting_generic_interfaces_hierarchy_loop_test: Crash # Issue #34043 - Error recovery in outline (class hierarchy cycle - see also #33756)
 const_counter_test/01: Crash # Error recovery in method body (use of non-const closure in a const context)
 const_native_factory_test: Crash # Issue #34043 - Error recovery in outline (native const factory)
-constructor9_test/01: MissingStaticWarning
+constructor9_test/01: MissingCompileTimeError
 constructor_name_test/02: Crash # Issue #34043 - Error recovery in outline (illegal constructor name)
 constructor_named_arguments_test/01: Crash # Error recovery in method body (argument mismatch in constructor redirect)
-constructor_redirect2_test/02: Crash # Issue 33686 - No core library found
-constructor_redirect2_test/03: Crash # Issue 33686 - No core library found
 constructor_redirect2_test/04: Crash # Issue 33686 - No core library found
 constructor_redirect_test/01: Crash # Error recovery in method body (reference to non-static method in constructor initializer)
 covariant_override_test: Crash # Improper handling of correct code - override fails to appear in kernel representation
@@ -121,23 +105,18 @@
 factory_with_type_parameters_test/04: Crash # Issue 33686 - No core library found
 field1_test: Crash # Issue 33686 - No core library found
 field2_test: Crash # Issue 33686 - No core library found
+field3_test/01: MissingCompileTimeError
+field3_test/02: MissingCompileTimeError
 field4_test: Crash # Issue 33686 - No core library found
 field5_test: Crash # Issue 33686 - No core library found
 field6_test/00: Crash # Issue 33686 - No core library found
 field6_test/01: Crash # Issue 33686 - No core library found
-field_initialization_order_test/01: MissingCompileTimeError
 final_syntax_test/01: MissingCompileTimeError
 final_syntax_test/02: MissingCompileTimeError
 final_syntax_test/03: MissingCompileTimeError
 final_syntax_test/04: MissingCompileTimeError
-first_class_types_literals_test/03: Crash # Error recovery in method body (invalid assignment)
-first_class_types_literals_test/04: Crash # Error recovery in method body (invalid assignment)
-first_class_types_literals_test/08: Crash # Error recovery in method body (invalid assignment)
-first_class_types_literals_test/09: Crash # Error recovery in method body (invalid assignment)
 function_type_parameter2_negative_test: Crash # Error recovery in method body (use of non-const closure in a const context)
 function_type_parameter_negative_test: Crash # Error recovery in method body (use of non-const closure in a const context)
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_function_typedef2_test/04: Crash # Issue #34043 - Error recovery in outline (attempt to apply type arguments to a non-generic type)
 generic_local_functions_test: Crash # Problem with generic function-typed parameter
 generic_methods_generic_function_parameter_test: Crash # Problem with generic function-typed parameter
@@ -158,7 +137,6 @@
 getters_setters_type_test/01: MissingStaticWarning
 hidden_import_test/01: MissingStaticWarning
 hidden_import_test/02: MissingStaticWarning
-if_null_assignment_behavior_test/15: Crash # Error recovery in method body (invalid assignment)
 illegal_initializer_test/02: Crash # Issue #33771 - Error recovery in method body (error in constructor initializer)
 illegal_initializer_test/04: Crash # Issue #33771 - Error recovery in method body (error in constructor initializer)
 import_nonexisting_dart_uri_test/01: Crash # Issue 33686 - No core library found
@@ -174,7 +152,6 @@
 issue31596_super_test/03: CompileTimeError # Front end fails to skip forwarding stubs when resolving super calls
 label5_test/01: Crash # Error recovery in method body (illegal jump target)
 label6_test/03: Crash # Error recovery in method body (illegal jump target)
-library_ambiguous_test/00: Crash # Error recovery in method body (ambiguous imported name)
 library_test/01: Crash # Issue 33686 - No core library found
 list_literal_negative_test: Crash # Error recovery in method body (malformed constructor invocation)
 list_literal_syntax_test/06: Crash
@@ -270,7 +247,6 @@
 parser_quirks_test: CompileTimeError # Issue 34047
 part_of_multiple_libs_test/01: Crash # Poor handling of part file used by multiple libs
 part_refers_to_core_library_test/01: Crash # Issue 33686 - No core library found
-prefix_import_collision_test/01: Crash # Error recovery in method body (ambiguous imported name)
 prefix_shadow_test/01: Crash # Error recovery in method body (attempt to use type variable as prefix)
 prefix_variable_collision_test/01: Crash # Issue 33686 - No core library found
 regress_20394_test/01: Crash # Error recovery in method body (error in super constructor call)
@@ -301,7 +277,6 @@
 string_split_test: CompileTimeError # Issue 34047
 string_supertype_checked_test: CompileTimeError # Issue 34047
 super_bound_closure_test/none: CompileTimeError # Issue 34047
-super_call4_test/01: Pass
 super_conditional_operator_test/01: Crash # Error recovery in method body (error in constructor redirect)
 super_conditional_operator_test/17: Crash # Error recovery in method body (nonsensical use of super)
 super_conditional_operator_test/18: Crash # Error recovery in method body (nonsensical use of super)
@@ -338,9 +313,6 @@
 syntax_test/24: Crash # Issue #34043 - Error recovery in outline (illegal operator declaration)
 syntax_test/25: Crash # Issue #34043 - Error recovery in outline (illegal operator declaration)
 syntax_test/26: Crash # Issue #34043 - Error recovery in outline (illegal operator declaration)
-syntax_test/63: Crash # Error recovery in method body (invalid assignment)
-syntax_test/64: Crash # Error recovery in method body (invalid assignment)
-syntax_test/65: Crash # Error recovery in method body (invalid assignment)
 this_conditional_operator_test/01: Crash # Error recovery in method body (error in constructor redirect)
 this_in_initializer_test/06: Crash # Error recovery in method body (error in constructor initializer)
 this_in_initializer_test/07: Crash # Error recovery in method body (error in constructor initializer)
@@ -448,10 +420,10 @@
 config_import_corelib_test: CompileTimeError
 config_import_corelib_test: StaticWarning, OK
 conflicting_generic_interfaces_hierarchy_loop_infinite_test: Skip # Crashes or times out
-conflicting_type_variable_and_setter_test: CompileTimeError # Issue 25525
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
 const_for_in_variable_test/01: MissingCompileTimeError # Issue 25161
+constructor9_test/01: MissingCompileTimeError # CFE Issue 33022
 default_implementation2_test: CompileTimeError # Issue 30855
 dynamic_prefix_core_test/01: MissingCompileTimeError
 emit_const_fields_test: CompileTimeError
@@ -459,8 +431,8 @@
 enum_syntax_test/06: Fail # Issue 21649
 error_stacktrace_test/00: MissingCompileTimeError
 error_stacktrace_test/00: Pass
-field3_test/01: MissingCompileTimeError # Issue 33022
-field3_test/02: MissingCompileTimeError # Issue 33022
+field3_test/01: MissingCompileTimeError # CFE Issue 33022
+field3_test/02: MissingCompileTimeError # CFE Issue 33022
 field3a_negative_test: StaticWarning # Issue 28823
 final_syntax_test/01: Fail # Issue 11124
 final_syntax_test/02: Fail # Issue 11124
@@ -501,8 +473,13 @@
 issue31596_test: CompileTimeError
 malformed2_test: Pass, MissingCompileTimeError # Issue 31056.
 method_override7_test/03: Fail # Issue 11497
+mixin_forwarding_constructor4_test/01: CompileTimeError # See issue 15101
+mixin_forwarding_constructor4_test/02: CompileTimeError # See issue 15101
+mixin_forwarding_constructor4_test/03: CompileTimeError # See issue 15101
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
+mixin_super_constructor_named_test/01: CompileTimeError # See issue 15101
+mixin_super_constructor_positionals_test/01: CompileTimeError # See issue 15101
 mixin_supertype_subclass2_test/02: MissingStaticWarning # Issue 25614
 mixin_supertype_subclass2_test/05: MissingStaticWarning # Issue 25614
 mixin_supertype_subclass3_test/02: MissingStaticWarning # Issue 25614
@@ -592,7 +569,6 @@
 vm/regress_33469_test/03: MissingCompileTimeError # http://dartbug.com/33481
 void/generalized_void_syntax_test: CompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_function_types_test/none: CompileTimeError # Issue 30177
-void/void_type_usage_test/async_use_in_await: CompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 32f3b70..3b91111 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -17,8 +17,6 @@
 call_method_is_check_test/06: RuntimeError
 call_method_must_not_be_field_test/03: RuntimeError # Issue 32155
 call_method_must_not_be_getter_test/03: RuntimeError # Issue 32155
-checked_setter2_test: RuntimeError # Issue 31128
-checked_setter_test: RuntimeError # Issue 31128
 config_import_corelib_test: CompileTimeError # we need a special platform.dill file for categories=all. Once we fix that, all dart:* are supported when using '--categories=all' so this will become a RuntimeError, OK.
 config_import_test: RuntimeError # Test flag is not passed to the compiler.
 const_constructor_mixin3_test: CompileTimeError # Issue 33644.
@@ -29,6 +27,9 @@
 deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in dart2js; bug #11551.
 duplicate_interface_implements_test/01: MissingCompileTimeError
+external_test/10: CompileTimeError # External non-js-interop function are treated as compile-time errors.
+external_test/13: CompileTimeError # External non-js-interop function are treated as compile-time errors.
+external_test/20: CompileTimeError # External non-js-interop function are treated as compile-time errors.
 function_propagation_test: RuntimeError
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -79,7 +80,6 @@
 
 [ $compiler == dart2js && $runtime == chrome ]
 field_override_optimization_test: RuntimeError
-field_type_check2_test/01: MissingRuntimeError
 
 [ $compiler == dart2js && $runtime == chrome && $system == macos ]
 await_future_test: Pass, Timeout # Issue 26735
@@ -95,14 +95,12 @@
 
 [ $compiler == dart2js && $runtime == d8 && !$checked ]
 field_override_optimization_test: RuntimeError
-field_type_check2_test/01: MissingRuntimeError
 
 [ $compiler == dart2js && $runtime == d8 && $strong ]
 stacktrace_test: RuntimeError
 
 [ $compiler == dart2js && $runtime == ff ]
 field_override_optimization_test: RuntimeError
-field_type_check2_test/01: MissingRuntimeError
 round_test: Pass, Fail, OK # Fixed in ff 35. Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $runtime == jsshell ]
@@ -113,7 +111,6 @@
 async_star_test/02: RuntimeError
 await_for_test: Skip # Jsshell does not provide periodic timers, Issue 7728
 field_override_optimization_test: RuntimeError
-field_type_check2_test/01: MissingRuntimeError
 regress_23996_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
 
 [ $compiler == dart2js && $runtime != none && $checked ]
@@ -123,7 +120,6 @@
 
 [ $compiler == dart2js && $runtime == safari ]
 field_override_optimization_test: RuntimeError
-field_type_check2_test/01: MissingRuntimeError
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $runtime == safari && $strong ]
@@ -221,7 +217,6 @@
 const_error_multiply_initialized_test/04: MissingCompileTimeError
 const_evaluation_test/01: RuntimeError
 const_init2_test/02: MissingCompileTimeError
-const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
 const_switch2_test/01: MissingCompileTimeError
@@ -257,9 +252,6 @@
 deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
 deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
 deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 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
@@ -310,9 +302,6 @@
 map_literal1_test/01: MissingCompileTimeError
 map_literal8_test: RuntimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/02: MissingCompileTimeError
 mixin_illegal_super_use_test/03: MissingCompileTimeError
@@ -363,8 +352,6 @@
 mixin_mixin_test: RuntimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
-mixin_super_constructor_named_test/01: MissingCompileTimeError
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError
 mixin_super_test: CompileTimeError
 mixin_super_use_test: CompileTimeError
 mixin_superclass_test: CompileTimeError
@@ -390,7 +377,6 @@
 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
-named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError # Issue 11551
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
 no_main_test/01: CompileTimeError
@@ -406,8 +392,6 @@
 positional_parameters_type_test/01: MissingCompileTimeError
 positional_parameters_type_test/02: MissingCompileTimeError
 private_super_constructor_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
@@ -430,12 +414,6 @@
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 symbol_literal_test/01: MissingCompileTimeError
-syntax_test/28: MissingCompileTimeError # Issue 29763
-syntax_test/29: MissingCompileTimeError # Issue 29763
-syntax_test/30: MissingCompileTimeError # Issue 29763
-syntax_test/31: MissingCompileTimeError # Issue 29763
-syntax_test/32: MissingCompileTimeError # Issue 29763
-syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
 type_check_const_function_typedef2_test: MissingCompileTimeError
@@ -447,13 +425,6 @@
 [ $compiler == dart2js && !$checked ]
 bool_check_test: RuntimeError
 bool_condition_check_test: RuntimeError
-covariance_field_test/01: RuntimeError
-covariance_field_test/02: RuntimeError
-covariance_field_test/03: RuntimeError
-covariance_field_test/04: RuntimeError
-covariance_field_test/05: RuntimeError
-issue31596_super_test/02: MissingCompileTimeError
-issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
 
 [ $compiler == dart2js && $fast_startup ]
@@ -466,15 +437,9 @@
 issue23244_test: RuntimeError
 
 [ $compiler == dart2js && $host_checked && $strong ]
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: 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_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) ||
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
 class_literal_static_test/03: MissingCompileTimeError
 class_literal_static_test/07: MissingCompileTimeError
@@ -484,19 +449,6 @@
 compile_time_constant_k_test/03: MissingCompileTimeError
 config_import_corelib_test: CompileTimeError
 covariant_subtyping_test: RuntimeError
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-field3_test/01: MissingCompileTimeError
-generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_recursive_bound_test/02: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -505,53 +457,9 @@
 issue23244_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 library_env_test/has_no_html_support: RuntimeError
 library_env_test/has_no_io_support: RuntimeError
-malbounded_instantiation_test/01: MissingCompileTimeError
-malbounded_instantiation_test/02: MissingCompileTimeError
-malbounded_instantiation_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/02: MissingCompileTimeError
-malbounded_redirecting_factory_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/04: MissingCompileTimeError
-malbounded_redirecting_factory_test/05: MissingCompileTimeError
-malbounded_type_cast2_test: MissingCompileTimeError
-malbounded_type_cast_test/00: MissingCompileTimeError
-malbounded_type_cast_test/01: MissingCompileTimeError
-malbounded_type_cast_test/02: MissingCompileTimeError
-malbounded_type_literal_test/00: MissingCompileTimeError
-malbounded_type_test2_test/00: MissingCompileTimeError
-malbounded_type_test_test/00: MissingCompileTimeError
-malbounded_type_test_test/01: MissingCompileTimeError
-malbounded_type_test_test/02: MissingCompileTimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-mixin_invalid_bound2_test/02: MissingCompileTimeError
-mixin_invalid_bound2_test/03: MissingCompileTimeError
-mixin_invalid_bound2_test/04: MissingCompileTimeError
-mixin_invalid_bound2_test/05: MissingCompileTimeError
-mixin_invalid_bound2_test/06: MissingCompileTimeError
-mixin_invalid_bound2_test/07: MissingCompileTimeError
-mixin_invalid_bound2_test/08: MissingCompileTimeError
-mixin_invalid_bound2_test/09: MissingCompileTimeError
-mixin_invalid_bound2_test/10: MissingCompileTimeError
-mixin_invalid_bound2_test/11: MissingCompileTimeError
-mixin_invalid_bound2_test/12: MissingCompileTimeError
-mixin_invalid_bound2_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/14: MissingCompileTimeError
-mixin_invalid_bound2_test/15: MissingCompileTimeError
-mixin_invalid_bound_test/02: MissingCompileTimeError
-mixin_invalid_bound_test/03: MissingCompileTimeError
-mixin_invalid_bound_test/04: MissingCompileTimeError
-mixin_invalid_bound_test/05: MissingCompileTimeError
-mixin_invalid_bound_test/06: MissingCompileTimeError
-mixin_invalid_bound_test/07: MissingCompileTimeError
-mixin_invalid_bound_test/08: MissingCompileTimeError
-mixin_invalid_bound_test/09: MissingCompileTimeError
-mixin_invalid_bound_test/10: MissingCompileTimeError
-mixin_super_bound_test/01: MissingCompileTimeError
-mixin_super_bound_test/02: MissingCompileTimeError
-mixin_type_parameters_errors_test/03: MissingCompileTimeError
-mixin_type_parameters_errors_test/04: MissingCompileTimeError
-named_constructor_test/01: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 partial_tearoff_instantiation_test/06: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 partial_tearoff_instantiation_test/07: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
@@ -564,17 +472,7 @@
 sync_generator2_test/52: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 type_literal_prefix_call_test/00: MissingCompileTimeError
 type_promotion_logical_and_test/01: MissingCompileTimeError
-type_variable_bounds2_test: MissingCompileTimeError
-type_variable_bounds3_test/00: MissingCompileTimeError
-type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/01: MissingCompileTimeError
 type_variable_bounds_test/02: Crash # NoSuchMethodError: The method 'accept' was called on null.
-type_variable_bounds_test/03: MissingCompileTimeError
-type_variable_bounds_test/04: MissingCompileTimeError
-type_variable_bounds_test/05: MissingCompileTimeError
-type_variable_bounds_test/06: MissingCompileTimeError
-type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/11: MissingCompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
 
@@ -595,15 +493,9 @@
 runtime_type_function_test: RuntimeError # Uses runtimeType.toString()
 
 [ $compiler == dart2js && $minified && $strong ]
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: 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_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: RuntimeError
 class_literal_static_test/01: MissingCompileTimeError
 class_literal_static_test/03: MissingCompileTimeError
@@ -613,19 +505,6 @@
 compile_time_constant_k_test/03: MissingCompileTimeError
 config_import_corelib_test: CompileTimeError
 covariant_subtyping_test: RuntimeError
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-field3_test/01: MissingCompileTimeError
-generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_recursive_bound_test/02: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -635,56 +514,12 @@
 issue18628_2_test/01: MissingCompileTimeError
 issue23244_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 library_env_test/has_no_html_support: RuntimeError
-malbounded_instantiation_test/01: MissingCompileTimeError
-malbounded_instantiation_test/02: MissingCompileTimeError
-malbounded_instantiation_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/02: MissingCompileTimeError
-malbounded_redirecting_factory_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/04: MissingCompileTimeError
-malbounded_redirecting_factory_test/05: MissingCompileTimeError
-malbounded_type_cast2_test: MissingCompileTimeError
-malbounded_type_cast_test/00: MissingCompileTimeError
-malbounded_type_cast_test/01: MissingCompileTimeError
-malbounded_type_cast_test/02: MissingCompileTimeError
-malbounded_type_literal_test/00: MissingCompileTimeError
-malbounded_type_test2_test/00: MissingCompileTimeError
-malbounded_type_test_test/00: MissingCompileTimeError
-malbounded_type_test_test/01: MissingCompileTimeError
-malbounded_type_test_test/02: MissingCompileTimeError
 many_overridden_no_such_method_test: RuntimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
 mixin_generic_test: RuntimeError # Issue 12605
-mixin_invalid_bound2_test/02: MissingCompileTimeError
-mixin_invalid_bound2_test/03: MissingCompileTimeError
-mixin_invalid_bound2_test/04: MissingCompileTimeError
-mixin_invalid_bound2_test/05: MissingCompileTimeError
-mixin_invalid_bound2_test/06: MissingCompileTimeError
-mixin_invalid_bound2_test/07: MissingCompileTimeError
-mixin_invalid_bound2_test/08: MissingCompileTimeError
-mixin_invalid_bound2_test/09: MissingCompileTimeError
-mixin_invalid_bound2_test/10: MissingCompileTimeError
-mixin_invalid_bound2_test/11: MissingCompileTimeError
-mixin_invalid_bound2_test/12: MissingCompileTimeError
-mixin_invalid_bound2_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/14: MissingCompileTimeError
-mixin_invalid_bound2_test/15: MissingCompileTimeError
-mixin_invalid_bound_test/02: MissingCompileTimeError
-mixin_invalid_bound_test/03: MissingCompileTimeError
-mixin_invalid_bound_test/04: MissingCompileTimeError
-mixin_invalid_bound_test/05: MissingCompileTimeError
-mixin_invalid_bound_test/06: MissingCompileTimeError
-mixin_invalid_bound_test/07: MissingCompileTimeError
-mixin_invalid_bound_test/08: MissingCompileTimeError
-mixin_invalid_bound_test/09: MissingCompileTimeError
-mixin_invalid_bound_test/10: MissingCompileTimeError
 mixin_mixin_type_arguments_test: RuntimeError
-mixin_super_bound_test/01: MissingCompileTimeError
-mixin_super_bound_test/02: MissingCompileTimeError
-mixin_type_parameters_errors_test/03: MissingCompileTimeError
-mixin_type_parameters_errors_test/04: MissingCompileTimeError
-named_constructor_test/01: MissingCompileTimeError
 no_such_method_native_test: RuntimeError
 no_such_method_test: RuntimeError
 overridden_no_such_method_test: RuntimeError
@@ -698,17 +533,7 @@
 symbol_conflict_test: RuntimeError # Issue 23857
 type_literal_prefix_call_test/00: MissingCompileTimeError
 type_promotion_logical_and_test/01: MissingCompileTimeError
-type_variable_bounds2_test: MissingCompileTimeError
-type_variable_bounds3_test/00: MissingCompileTimeError
-type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/01: MissingCompileTimeError
 type_variable_bounds_test/02: Crash # NoSuchMethodError: The method 'accept' was called on null.
-type_variable_bounds_test/03: MissingCompileTimeError
-type_variable_bounds_test/04: MissingCompileTimeError
-type_variable_bounds_test/05: MissingCompileTimeError
-type_variable_bounds_test/06: MissingCompileTimeError
-type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/11: MissingCompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
 
@@ -733,7 +558,6 @@
 const_constructor3_test/04: MissingCompileTimeError # OK - Subtype check uses JS number semantics.
 const_dynamic_type_literal_test/02: MissingCompileTimeError
 const_evaluation_test/01: RuntimeError
-const_instance_field_test/01: MissingCompileTimeError
 const_list_test: RuntimeError
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
@@ -741,15 +565,10 @@
 const_switch2_test/01: MissingCompileTimeError
 const_switch_test/02: RuntimeError, OK # constant identity based on JS constants
 const_switch_test/04: RuntimeError, OK # constant identity based on JS constants
-const_types_test/34: MissingCompileTimeError
-const_types_test/39: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
 covariant_subtyping_test: Crash
 ct_const_test: RuntimeError
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
 deferred_redirecting_factory_test: RuntimeError
@@ -766,8 +585,6 @@
 external_test/20: MissingRuntimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-field_initialization_order_test/01: MissingCompileTimeError
-field_initialization_order_test/none: RuntimeError
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -776,11 +593,8 @@
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
 function_subtype_inline2_test: RuntimeError
-function_subtype_setter0_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_methods_bounds_test/02: MissingRuntimeError
@@ -815,9 +629,6 @@
 local_function_test/none: RuntimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
@@ -855,8 +666,6 @@
 mixin_illegal_superclass_test/30: MissingCompileTimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
-mixin_super_constructor_named_test/01: MissingCompileTimeError
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError
 mixin_super_test: CompileTimeError
 mixin_super_use_test: CompileTimeError
 mixin_superclass_test: CompileTimeError
@@ -885,7 +694,6 @@
 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
-named_parameters_default_eq_test/02: MissingCompileTimeError
 named_parameters_default_eq_test/none: RuntimeError
 nan_identical_test: RuntimeError # Issue 11551
 nested_generic_closure_test: RuntimeError
@@ -895,8 +703,6 @@
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
 parser_quirks_test: CompileTimeError
-redirecting_factory_default_values_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError, OK # non JS number semantics
@@ -910,7 +716,6 @@
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
-string_interpolation_and_buffer_test: RuntimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
@@ -921,12 +726,6 @@
 switch_case_test/00: MissingCompileTimeError
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
-syntax_test/28: MissingCompileTimeError # Issue 29763
-syntax_test/29: MissingCompileTimeError # Issue 29763
-syntax_test/30: MissingCompileTimeError # Issue 29763
-syntax_test/31: MissingCompileTimeError # Issue 29763
-syntax_test/32: MissingCompileTimeError # Issue 29763
-syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
 type_error_test: RuntimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 5ff7f66..858b6af 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -4,6 +4,8 @@
 
 # Sections in this file should contain "$compiler == dartdevc" or dartdevk.
 [ $compiler == dartdevc ]
+abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
+abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError # Issue #30568
 accessor_conflict_export2_test: CompileTimeError # Issue 25626
 accessor_conflict_export_test: CompileTimeError # Issue 25626
@@ -31,12 +33,12 @@
 check_member_static_test/01: CompileTimeError
 conflicting_generic_interfaces_hierarchy_loop_infinite_test: Skip # Crashes or times out
 conflicting_generic_interfaces_simple_test: MissingCompileTimeError
-conflicting_type_variable_and_setter_test: CompileTimeError
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
 const_constructor_mixin3_test/01: MissingCompileTimeError # Issue 33644
 const_constructor_mixin_test/01: MissingCompileTimeError # Issue 33644
 const_for_in_variable_test/01: MissingCompileTimeError
+constructor9_test/01: MissingCompileTimeError # CFE Issue 33022
 constructor_type_parameter_test/00: MissingCompileTimeError
 constructor_with_type_parameters_test/03: MissingCompileTimeError
 covariance_field_test/03: RuntimeError
@@ -52,6 +54,8 @@
 expect_test: RuntimeError # Issue 29920
 export_private_test/01: MissingCompileTimeError # Issue 29920
 f_bounded_quantification3_test: RuntimeError # Issue 29920
+field3_test/01: MissingCompileTimeError # CFE Issue 33022
+field3_test/02: MissingCompileTimeError # CFE Issue 33022
 field_wierd_name_test: Crash
 final_syntax_test/01: MissingCompileTimeError
 final_syntax_test/02: MissingCompileTimeError
@@ -100,8 +104,13 @@
 label_test: RuntimeError
 left_shift_test: RuntimeError # Ints and doubles are unified.
 method_override7_test/03: MissingCompileTimeError
+mixin_forwarding_constructor4_test/01: CompileTimeError # See issue 15101
+mixin_forwarding_constructor4_test/02: CompileTimeError # See issue 15101
+mixin_forwarding_constructor4_test/03: CompileTimeError # See issue 15101
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
+mixin_super_constructor_named_test/01: CompileTimeError # See issue 15101
+mixin_super_constructor_positionals_test/01: CompileTimeError # See issue 15101
 mixin_super_test: RuntimeError
 mixin_super_use_test: RuntimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
@@ -135,6 +144,7 @@
 regress_23089_test: MissingCompileTimeError
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # Intended to fail, requires 64-bit numbers.
+regress_27617_test/1: MissingCompileTimeError
 regress_29025_test: CompileTimeError # Issue 29081
 regress_29349_test: CompileTimeError # Issue 31093
 regress_29405_test: CompileTimeError # Issue 29421
@@ -192,7 +202,6 @@
 type_variable_scope_test/none: CompileTimeError
 void/generalized_void_syntax_test: CompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_function_types_test/none: CompileTimeError # Issue 30177
-void/void_type_usage_test/async_use_in_await: CompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
@@ -224,9 +233,6 @@
 void/void_type_usage_test/sync_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 
 [ $compiler == dartdevk ]
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-async_return_types_test/nestedFuture: MissingCompileTimeError
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -235,8 +241,6 @@
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError # Kernel is missing the implicit `call` tearoff for assignment `Function`
 call_method_must_not_be_field_test/06: RuntimeError # Kernel does not distinguish `d()` from `d.call()`
 call_method_must_not_be_getter_test/06: RuntimeError # Kernel does not distinguish `d()` from `d.call()`
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_c_test/02: MissingCompileTimeError
@@ -261,26 +265,13 @@
 const_constructor_nonconst_field_test/01: MissingCompileTimeError
 const_constructor_nonconst_param_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/02: MissingCompileTimeError
-const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
 const_optional_args_test/01: MissingCompileTimeError
 const_switch2_test/01: MissingCompileTimeError
 const_syntax_test/05: MissingCompileTimeError
-const_types_test/34: MissingCompileTimeError
-const_types_test/39: MissingCompileTimeError
 constants_test/05: MissingCompileTimeError
 covariant_subtyping_test: RuntimeError
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-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_load_library_wrong_args_test/01: CompileTimeError
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
 duplicate_implements_test/01: MissingCompileTimeError
@@ -291,18 +282,11 @@
 export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-field_initialization_order_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
 generic_function_bounds_test: RuntimeError
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
-generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
@@ -324,32 +308,11 @@
 instantiate_tearoff_of_call_test: CompileTimeError
 issue18628_2_test/01: MissingCompileTimeError
 issue31596_super_test/01: CompileTimeError
-issue31596_super_test/02: MissingCompileTimeError
 issue31596_super_test/03: CompileTimeError
-issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-malbounded_instantiation_test/01: MissingCompileTimeError
-malbounded_instantiation_test/02: MissingCompileTimeError
-malbounded_instantiation_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/02: MissingCompileTimeError
-malbounded_redirecting_factory_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/04: MissingCompileTimeError
-malbounded_redirecting_factory_test/05: MissingCompileTimeError
-malbounded_type_cast2_test: MissingCompileTimeError
-malbounded_type_cast_test/00: MissingCompileTimeError
-malbounded_type_cast_test/01: MissingCompileTimeError
-malbounded_type_cast_test/02: MissingCompileTimeError
-malbounded_type_literal_test/00: MissingCompileTimeError
-malbounded_type_test2_test/00: MissingCompileTimeError
-malbounded_type_test_test/00: MissingCompileTimeError
-malbounded_type_test_test/01: MissingCompileTimeError
-malbounded_type_test_test/02: MissingCompileTimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
@@ -385,50 +348,17 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mixin_invalid_bound2_test/02: MissingCompileTimeError
-mixin_invalid_bound2_test/03: MissingCompileTimeError
-mixin_invalid_bound2_test/04: MissingCompileTimeError
-mixin_invalid_bound2_test/05: MissingCompileTimeError
-mixin_invalid_bound2_test/06: MissingCompileTimeError
-mixin_invalid_bound2_test/07: MissingCompileTimeError
-mixin_invalid_bound2_test/08: MissingCompileTimeError
-mixin_invalid_bound2_test/09: MissingCompileTimeError
-mixin_invalid_bound2_test/10: MissingCompileTimeError
-mixin_invalid_bound2_test/11: MissingCompileTimeError
-mixin_invalid_bound2_test/12: MissingCompileTimeError
-mixin_invalid_bound2_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/14: MissingCompileTimeError
-mixin_invalid_bound2_test/15: MissingCompileTimeError
-mixin_invalid_bound_test/02: MissingCompileTimeError
-mixin_invalid_bound_test/03: MissingCompileTimeError
-mixin_invalid_bound_test/04: MissingCompileTimeError
-mixin_invalid_bound_test/05: MissingCompileTimeError
-mixin_invalid_bound_test/06: MissingCompileTimeError
-mixin_invalid_bound_test/07: MissingCompileTimeError
-mixin_invalid_bound_test/08: MissingCompileTimeError
-mixin_invalid_bound_test/09: MissingCompileTimeError
-mixin_invalid_bound_test/10: MissingCompileTimeError
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
-mixin_super_bound_test/01: MissingCompileTimeError
-mixin_super_bound_test/02: MissingCompileTimeError
-mixin_super_constructor_named_test/01: MissingCompileTimeError
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError
 mixin_super_test: RuntimeError
 mixin_super_use_test: RuntimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
 mixin_supertype_subclass_test/05: MissingCompileTimeError
-mixin_type_parameters_errors_test/03: MissingCompileTimeError
-mixin_type_parameters_errors_test/04: MissingCompileTimeError
 mock_writable_final_private_field_test: RuntimeError
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
-named_constructor_test/01: MissingCompileTimeError
-named_parameters_default_eq_test/02: MissingCompileTimeError
 no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
 null_no_such_method_test: CompileTimeError # Issue 31533
-redirecting_factory_default_values_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError # UnimplementedError: node <InvalidExpression> `invalid-expression`
@@ -448,6 +378,7 @@
 switch_case_test/00: MissingCompileTimeError
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
+syncstar_yield_test/capturing: RuntimeError
 syncstar_yield_test/copyParameters: RuntimeError # Expect.equals(expected: <2>, actual: <3>) fails.
 try_catch_test/01: MissingCompileTimeError
 type_alias_equality_test/02: RuntimeError # Issue 32785
@@ -463,17 +394,6 @@
 type_promotion_functions_test/none: CompileTimeError # Issue 31537
 type_promotion_logical_and_test/01: MissingCompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError # Issue 31533
-type_variable_bounds2_test: MissingCompileTimeError
-type_variable_bounds3_test/00: MissingCompileTimeError
-type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/01: MissingCompileTimeError
-type_variable_bounds_test/02: MissingCompileTimeError
-type_variable_bounds_test/03: MissingCompileTimeError
-type_variable_bounds_test/04: MissingCompileTimeError
-type_variable_bounds_test/05: MissingCompileTimeError
-type_variable_bounds_test/06: MissingCompileTimeError
-type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/11: MissingCompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 
 [ $compiler == dartdevk && $checked ]
@@ -485,8 +405,6 @@
 assertion_initializer_const_error2_test/*: SkipByDesign # DDC does not support non-checked mode.
 
 [ $compiler == dartdevc || $compiler == dartdevk ]
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 async_covariant_type_test: RuntimeError # Check too late
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
@@ -535,9 +453,6 @@
 exception_test: RuntimeError # DDC doesn't implement NullThrownError?; Expect.isTrue(false) fails.
 expect_test: RuntimeError # Issue 29920; Expect.identical did not fail
 f_bounded_quantification3_test: RuntimeError # Issue 29920; Uncaught Error: type arguments should not be null: (F1, F2) => {
-field3_test/01: MissingCompileTimeError # Issue 33022
-field3_test/02: MissingCompileTimeError # Issue 33022
-field_initialization_order_test/none: RuntimeError # Expect.equals(expected: <b.a.ai.bi.>, actual: <b.bi.a.ai.>) fails.
 flatten_test/05: MissingRuntimeError # Issue 29920
 flatten_test/08: MissingRuntimeError # Issue 29920
 flatten_test/09: MissingRuntimeError # Issue 29920
@@ -589,19 +504,15 @@
 parser_quirks_test: CompileTimeError
 regress_16640_test: RuntimeError # Issue 29920; Uncaught Error: type arguments should not be null: E => {
 regress_22443_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
-regress_27617_test/1: MissingCompileTimeError
 stack_overflow_stacktrace_test: RuntimeError # Issue 29920; RangeError: Maximum call stack size exceeded
 stack_overflow_test: RuntimeError # Issue 29920; RangeError: Maximum call stack size exceeded
 stacktrace_demangle_ctors_test: RuntimeError # Issue 31089; Expect.isTrue(false) fails.
 stacktrace_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
-string_interpolation_and_buffer_test: RuntimeError # NoSuchMethodError: method not found: '<Unexpected Null Value>'
 string_literals_test: RuntimeError # Expect.equals(expected: <\x00\x0A\x0D\x7F\xFF\u{FFFF}\u{D800}\u{DC00}\u{DBFF}\u{DFFF}>, actual: <\x00\x0A\x0D\x7F\xFF\u{FFFF}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}>) fails.
 super_test: RuntimeError # Expect.equals(expected: <0>, actual: <2>) fails.
 switch_label2_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 switch_label_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 switch_try_catch_test: RuntimeError # Issue 29920; Expect.throws: Unexpected 'UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 syncstar_covariant_type_test: RuntimeError # Check too late
-syntax_test/60: MissingCompileTimeError
-syntax_test/61: MissingCompileTimeError
 truncdiv_test: RuntimeError # Issue 29920; Expect.throws fails: Did not throw
 vm/*: SkipByDesign # VM only tests.; VM only tests.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 9f006ad..a0a0476 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -60,8 +60,6 @@
 external_test/10: MissingRuntimeError
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
-field_initialization_order_test/01: MissingCompileTimeError
-field_initialization_order_test/none: RuntimeError
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -220,122 +218,98 @@
 const_constructor_mixin3_test: CompileTimeError # Issue 33644.
 const_constructor_mixin_test: CompileTimeError # Issue 33644.
 const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field. Issue 32326.
-const_types_test/34: MissingCompileTimeError # Issue 32988
-const_types_test/39: MissingCompileTimeError # Issue 32988
+const_types_test/34: MissingCompileTimeError # Issue 31590
+const_types_test/39: MissingCompileTimeError # Issue 31590
 cyclic_type_variable_test/01: MissingCompileTimeError # Issue 32989 (missing cycle check in bounds)
 cyclic_type_variable_test/02: MissingCompileTimeError # Issue 32989 (missing cycle check in bounds)
 cyclic_type_variable_test/03: MissingCompileTimeError # Issue 32989 (missing cycle check in bounds)
 cyclic_type_variable_test/04: MissingCompileTimeError # Issue 32989 (missing cycle check in bounds)
-default_factory2_test/01: MissingCompileTimeError # Issue 32988
-default_factory_test/01: MissingCompileTimeError # Issue 32988
+default_factory2_test/01: MissingCompileTimeError # Issue 31590
+default_factory_test/01: MissingCompileTimeError # Issue 31590
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 duplicate_export_collision_test/01: MissingCompileTimeError # Issue 12916
-f_bounded_quantification_test/01: MissingCompileTimeError # Issue 33018
-f_bounded_quantification_test/02: MissingCompileTimeError # Issue 33018
-factory4_test/00: MissingCompileTimeError # Issue 32988
-field3_test/01: MissingCompileTimeError # Issue 33022
-field3_test/02: MissingCompileTimeError # Issue 33022
-generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33018
-generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33018
-initializer_super_last_test/cc04: MissingCompileTimeError
-initializer_super_last_test/cc09: MissingCompileTimeError
-initializer_super_last_test/cc10: MissingCompileTimeError
-initializer_super_last_test/cc11: MissingCompileTimeError
-initializer_super_last_test/cc12: MissingCompileTimeError
-initializer_super_last_test/cc13: MissingCompileTimeError
-initializer_super_last_test/cc14: MissingCompileTimeError
-initializer_super_last_test/cc15: MissingCompileTimeError
-initializer_super_last_test/cc16: MissingCompileTimeError
-initializer_super_last_test/cc25: MissingCompileTimeError
-initializer_super_last_test/cc26: MissingCompileTimeError
-initializer_super_last_test/cc27: MissingCompileTimeError
-initializer_super_last_test/cc28: MissingCompileTimeError
-initializer_super_last_test/cc29: MissingCompileTimeError
-initializer_super_last_test/cc30: MissingCompileTimeError
-initializer_super_last_test/cc31: MissingCompileTimeError
-initializer_super_last_test/cc32: MissingCompileTimeError
-issue31596_super_test/02: MissingCompileTimeError
-issue31596_super_test/04: MissingCompileTimeError
-malbounded_instantiation_test/01: MissingCompileTimeError # Issue 33018
-malbounded_instantiation_test/02: MissingCompileTimeError # Issue 33018
-malbounded_instantiation_test/03: MissingCompileTimeError # Issue 33018
-malbounded_redirecting_factory_test/02: MissingCompileTimeError # Issue 33018
-malbounded_redirecting_factory_test/03: MissingCompileTimeError # Issue 33018
-malbounded_redirecting_factory_test/04: MissingCompileTimeError # Issue 33018
-malbounded_redirecting_factory_test/05: MissingCompileTimeError # Issue 33018
-malbounded_type_cast2_test: MissingCompileTimeError # Issue 33018
-malbounded_type_cast_test/00: MissingCompileTimeError # Issue 33018
-malbounded_type_cast_test/01: MissingCompileTimeError # Issue 33018
-malbounded_type_cast_test/02: MissingCompileTimeError # Issue 33018
-malbounded_type_literal_test/00: MissingCompileTimeError # Issue 33018
-malbounded_type_test2_test/00: MissingCompileTimeError # Issue 33018
-malbounded_type_test_test/00: MissingCompileTimeError # Issue 33018
-malbounded_type_test_test/01: MissingCompileTimeError # Issue 33018
-malbounded_type_test_test/02: MissingCompileTimeError # Issue 33018
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError # KernelVM bug: Issue 15101
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError # KernelVM bug: Issue 15101
-mixin_invalid_bound2_test/02: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/03: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/04: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/05: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/06: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/07: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/08: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/09: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/10: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/11: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/12: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/13: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/14: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound2_test/15: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/02: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/03: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/04: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/05: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/06: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/07: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/08: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/09: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_invalid_bound_test/10: MissingCompileTimeError # Issue 33071 (missing bounds check)
-mixin_super_bound_test/01: MissingCompileTimeError
-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/03: MissingCompileTimeError
-mixin_type_parameters_errors_test/04: MissingCompileTimeError
-named_constructor_test/01: MissingCompileTimeError
-named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
-partial_tearoff_instantiation_test/05: MissingCompileTimeError
-partial_tearoff_instantiation_test/06: MissingCompileTimeError
-partial_tearoff_instantiation_test/07: MissingCompileTimeError
-partial_tearoff_instantiation_test/08: MissingCompileTimeError
-redirecting_factory_default_values_test/01: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
-redirecting_factory_default_values_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
+f_bounded_quantification_test/01: MissingCompileTimeError # Issue 33308
+f_bounded_quantification_test/02: MissingCompileTimeError # Issue 33308
+factory4_test/00: MissingCompileTimeError # Issue 31590
+generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33308
+generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33308
+issue31596_super_test/02: MissingCompileTimeError # Issue 31596
+issue31596_super_test/04: MissingCompileTimeError # Issue 31596
+malbounded_instantiation_test/01: MissingCompileTimeError # Issue 33308
+malbounded_instantiation_test/02: MissingCompileTimeError # Issue 33308
+malbounded_instantiation_test/03: MissingCompileTimeError # Issue 33308
+malbounded_redirecting_factory_test/02: MissingCompileTimeError # Issue 33308
+malbounded_redirecting_factory_test/03: MissingCompileTimeError # Issue 33308
+malbounded_redirecting_factory_test/04: MissingCompileTimeError # Issue 33308
+malbounded_redirecting_factory_test/05: MissingCompileTimeError # Issue 33308
+malbounded_type_cast2_test: MissingCompileTimeError # Issue 33308
+malbounded_type_cast_test/00: MissingCompileTimeError # Issue 33308
+malbounded_type_cast_test/01: MissingCompileTimeError # Issue 33308
+malbounded_type_cast_test/02: MissingCompileTimeError # Issue 33308
+malbounded_type_literal_test/00: MissingCompileTimeError # Issue 33308
+malbounded_type_test2_test/00: MissingCompileTimeError # Issue 33308
+malbounded_type_test_test/00: MissingCompileTimeError # Issue 33308
+malbounded_type_test_test/01: MissingCompileTimeError # Issue 33308
+malbounded_type_test_test/02: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/02: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/03: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/04: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/05: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/06: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/07: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/08: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/09: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/10: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/11: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/12: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/13: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/14: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound2_test/15: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/02: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/03: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/04: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/05: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/06: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/07: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/08: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/09: MissingCompileTimeError # Issue 33308
+mixin_invalid_bound_test/10: MissingCompileTimeError # Issue 33308
+mixin_super_bound_test/01: MissingCompileTimeError # Issue 33308
+mixin_super_bound_test/02: MissingCompileTimeError # Issue 33308
+mixin_type_parameters_errors_test/03: MissingCompileTimeError # Issue 32972
+mixin_type_parameters_errors_test/04: MissingCompileTimeError # Issue 32972
+named_constructor_test/01: MissingCompileTimeError # Issue 34159
+named_parameters_default_eq_test/02: MissingCompileTimeError # Issue 34160
+partial_tearoff_instantiation_test/05: MissingCompileTimeError # Issue 32281
+partial_tearoff_instantiation_test/06: MissingCompileTimeError # Issue 32281
+partial_tearoff_instantiation_test/07: MissingCompileTimeError # Issue 32281
+partial_tearoff_instantiation_test/08: MissingCompileTimeError # Issue 32281
+redirecting_factory_default_values_test/01: MissingCompileTimeError # Issue 34160
+redirecting_factory_default_values_test/02: MissingCompileTimeError # Issue 34160
 regress_22976_test/*: CompileTimeError # Issue 31935
-regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-syntax_test/28: MissingCompileTimeError # Issue 29763
-syntax_test/29: MissingCompileTimeError # Issue 29763
-syntax_test/30: MissingCompileTimeError # Issue 29763
-syntax_test/31: MissingCompileTimeError # Issue 29763
-syntax_test/32: MissingCompileTimeError # Issue 29763
-syntax_test/33: MissingCompileTimeError # Issue 29763
-syntax_test/60: MissingCompileTimeError # Issue 30176
-syntax_test/61: MissingCompileTimeError # Issue 30176
-type_variable_bounds2_test: MissingCompileTimeError
-type_variable_bounds3_test/00: MissingCompileTimeError
-type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/01: MissingCompileTimeError
-type_variable_bounds_test/02: MissingCompileTimeError
-type_variable_bounds_test/03: MissingCompileTimeError
-type_variable_bounds_test/04: MissingCompileTimeError
-type_variable_bounds_test/05: MissingCompileTimeError
-type_variable_bounds_test/06: MissingCompileTimeError
-type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/11: MissingCompileTimeError
+regress_27617_test/1: MissingCompileTimeError # Issue 34161
+syntax_test/28: MissingCompileTimeError # Issue 29763 - low priority
+syntax_test/29: MissingCompileTimeError # Issue 29763 - low priority
+syntax_test/30: MissingCompileTimeError # Issue 29763 - low priority
+syntax_test/31: MissingCompileTimeError # Issue 29763 - low priority
+syntax_test/32: MissingCompileTimeError # Issue 29763 - low priority
+syntax_test/33: MissingCompileTimeError # Issue 29763 - low priority
+syntax_test/60: MissingCompileTimeError # Issue 30470
+syntax_test/61: MissingCompileTimeError # Issue 30470
+type_variable_bounds2_test: MissingCompileTimeError # Issue 33308
+type_variable_bounds3_test/00: MissingCompileTimeError # Issue 33308
+type_variable_bounds4_test/01: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/01: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/02: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/03: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/04: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/05: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/06: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/08: MissingCompileTimeError # Issue 33308
+type_variable_bounds_test/11: MissingCompileTimeError # Issue 33308
 vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
@@ -361,6 +335,9 @@
 const_constructor_nonconst_field_test/01: MissingCompileTimeError
 const_syntax_test/05: MissingCompileTimeError
 
+[ $compiler != dart2analyzer && $compiler != dart2js && $fasta && $strong ]
+super_call4_test/01: MissingCompileTimeError
+
 # The precomilation and bytecode configurations use a kernel2kernel constants evaluator
 # which is is more correct than fasta/vm in JIT mode (i.e. it catches more
 # compile-time errors).
@@ -455,260 +432,260 @@
 void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError
 void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError
 void/void_type_usage_test/call_addition: MissingCompileTimeError
-void/void_type_usage_test/call_argument: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_argument: MissingCompileTimeError
 void/void_type_usage_test/call_boolean_and_left: MissingCompileTimeError
 void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError
 void/void_type_usage_test/call_boolean_negation: MissingCompileTimeError
 void/void_type_usage_test/call_boolean_or_left: MissingCompileTimeError
 void/void_type_usage_test/call_boolean_or_right: MissingCompileTimeError
-void/void_type_usage_test/call_cascade: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_cascade: MissingCompileTimeError
 void/void_type_usage_test/call_conditional_stmt: MissingCompileTimeError
-void/void_type_usage_test/call_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/call_dynamic_init: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_do_while: MissingCompileTimeError
+void/void_type_usage_test/call_dynamic_init: MissingCompileTimeError
 void/void_type_usage_test/call_equals_left: MissingCompileTimeError
 void/void_type_usage_test/call_equals_right: MissingCompileTimeError
-void/void_type_usage_test/call_for_in: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_for_in: MissingCompileTimeError
 void/void_type_usage_test/call_identical: MissingCompileTimeError
-void/void_type_usage_test/call_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/call_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/call_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/call_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_is: MissingCompileTimeError
+void/void_type_usage_test/call_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/call_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/call_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/call_multiplication: MissingCompileTimeError
-void/void_type_usage_test/call_null_dot: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_null_dot: MissingCompileTimeError
 void/void_type_usage_test/call_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/call_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/call_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/call_toString: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_throw: MissingCompileTimeError
+void/void_type_usage_test/call_toString: MissingCompileTimeError
 void/void_type_usage_test/call_use_in_conditional_assignment_right: MissingCompileTimeError
 void/void_type_usage_test/call_use_in_list_subscript: MissingCompileTimeError
 void/void_type_usage_test/call_use_in_map_lookup: MissingCompileTimeError
 void/void_type_usage_test/call_use_in_string_interpolation: MissingCompileTimeError
-void/void_type_usage_test/call_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2_argument: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2_dynamic_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/call_while: MissingCompileTimeError
+void/void_type_usage_test/conditional2_argument: MissingCompileTimeError
+void/void_type_usage_test/conditional2_dynamic_init: MissingCompileTimeError
+void/void_type_usage_test/conditional2_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/conditional2_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/conditional2_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/conditional2_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2for_in: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional2while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional3_argument: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional3_dynamic_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional3_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional3_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/conditional2_throw: MissingCompileTimeError
+void/void_type_usage_test/conditional2do_while: MissingCompileTimeError
+void/void_type_usage_test/conditional2for_in: MissingCompileTimeError
+void/void_type_usage_test/conditional2while: MissingCompileTimeError
+void/void_type_usage_test/conditional3_argument: MissingCompileTimeError
+void/void_type_usage_test/conditional3_dynamic_init: MissingCompileTimeError
+void/void_type_usage_test/conditional3_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/conditional3_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/conditional3_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/conditional3_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional3_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_argument: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_dynamic_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_for_in: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/conditional3_throw: MissingCompileTimeError
+void/void_type_usage_test/conditional_argument: MissingCompileTimeError
+void/void_type_usage_test/conditional_do_while: MissingCompileTimeError
+void/void_type_usage_test/conditional_dynamic_init: MissingCompileTimeError
+void/void_type_usage_test/conditional_for_in: MissingCompileTimeError
+void/void_type_usage_test/conditional_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/conditional_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/conditional_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/conditional_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/conditional_while: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/conditional_throw: MissingCompileTimeError
+void/void_type_usage_test/conditional_while: MissingCompileTimeError
 void/void_type_usage_test/final_local_addition: MissingCompileTimeError
-void/void_type_usage_test/final_local_argument: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_argument: MissingCompileTimeError
 void/void_type_usage_test/final_local_boolean_and_left: MissingCompileTimeError
 void/void_type_usage_test/final_local_boolean_and_right: MissingCompileTimeError
 void/void_type_usage_test/final_local_boolean_negation: MissingCompileTimeError
 void/void_type_usage_test/final_local_boolean_or_left: MissingCompileTimeError
 void/void_type_usage_test/final_local_boolean_or_right: MissingCompileTimeError
-void/void_type_usage_test/final_local_cascade: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_cascade: MissingCompileTimeError
 void/void_type_usage_test/final_local_conditional_stmt: MissingCompileTimeError
-void/void_type_usage_test/final_local_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/final_local_dynamic_init: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_do_while: MissingCompileTimeError
+void/void_type_usage_test/final_local_dynamic_init: MissingCompileTimeError
 void/void_type_usage_test/final_local_equals_left: MissingCompileTimeError
 void/void_type_usage_test/final_local_equals_right: MissingCompileTimeError
-void/void_type_usage_test/final_local_for_in: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_for_in: MissingCompileTimeError
 void/void_type_usage_test/final_local_identical: MissingCompileTimeError
-void/void_type_usage_test/final_local_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/final_local_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/final_local_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/final_local_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_is: MissingCompileTimeError
+void/void_type_usage_test/final_local_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/final_local_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/final_local_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/final_local_multiplication: MissingCompileTimeError
-void/void_type_usage_test/final_local_null_dot: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_null_dot: MissingCompileTimeError
 void/void_type_usage_test/final_local_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/final_local_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/final_local_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/final_local_toString: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_throw: MissingCompileTimeError
+void/void_type_usage_test/final_local_toString: MissingCompileTimeError
 void/void_type_usage_test/final_local_use_in_conditional_assignment_right: MissingCompileTimeError
 void/void_type_usage_test/final_local_use_in_list_subscript: MissingCompileTimeError
 void/void_type_usage_test/final_local_use_in_map_lookup: MissingCompileTimeError
 void/void_type_usage_test/final_local_use_in_string_interpolation: MissingCompileTimeError
-void/void_type_usage_test/final_local_while: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/final_local_while: MissingCompileTimeError
 void/void_type_usage_test/global_addition: MissingCompileTimeError
-void/void_type_usage_test/global_argument: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_argument: MissingCompileTimeError
 void/void_type_usage_test/global_boolean_and_left: MissingCompileTimeError
 void/void_type_usage_test/global_boolean_and_right: MissingCompileTimeError
 void/void_type_usage_test/global_boolean_negation: MissingCompileTimeError
 void/void_type_usage_test/global_boolean_or_left: MissingCompileTimeError
 void/void_type_usage_test/global_boolean_or_right: MissingCompileTimeError
-void/void_type_usage_test/global_cascade: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_cascade: MissingCompileTimeError
 void/void_type_usage_test/global_conditional_stmt: MissingCompileTimeError
-void/void_type_usage_test/global_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_dynamic_init: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_do_while: MissingCompileTimeError
+void/void_type_usage_test/global_dynamic_init: MissingCompileTimeError
 void/void_type_usage_test/global_equals_left: MissingCompileTimeError
 void/void_type_usage_test/global_equals_right: MissingCompileTimeError
-void/void_type_usage_test/global_for_in: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_for_in: MissingCompileTimeError
 void/void_type_usage_test/global_identical: MissingCompileTimeError
-void/void_type_usage_test/global_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_is: MissingCompileTimeError
+void/void_type_usage_test/global_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/global_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/global_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/global_multiplication: MissingCompileTimeError
-void/void_type_usage_test/global_null_dot: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_null_equals2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_null_dot: MissingCompileTimeError
+void/void_type_usage_test/global_null_equals2: MissingCompileTimeError
 void/void_type_usage_test/global_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/global_toString: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_throw: MissingCompileTimeError
+void/void_type_usage_test/global_toString: MissingCompileTimeError
 void/void_type_usage_test/global_use_in_conditional_assignment_left: MissingCompileTimeError
 void/void_type_usage_test/global_use_in_conditional_assignment_right: MissingCompileTimeError
 void/void_type_usage_test/global_use_in_list_subscript: MissingCompileTimeError
 void/void_type_usage_test/global_use_in_map_lookup: MissingCompileTimeError
 void/void_type_usage_test/global_use_in_string_interpolation: MissingCompileTimeError
-void/void_type_usage_test/global_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_argument: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_cascade: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_dynamic_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_for_in: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_literal_map_value_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_null_dot: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_null_equals2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/global_while: MissingCompileTimeError
+void/void_type_usage_test/instance2_argument: MissingCompileTimeError
+void/void_type_usage_test/instance2_cascade: MissingCompileTimeError
+void/void_type_usage_test/instance2_do_while: MissingCompileTimeError
+void/void_type_usage_test/instance2_dynamic_init: MissingCompileTimeError
+void/void_type_usage_test/instance2_for_in: MissingCompileTimeError
+void/void_type_usage_test/instance2_is: MissingCompileTimeError
+void/void_type_usage_test/instance2_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/instance2_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/instance2_literal_map_value_init2: MissingCompileTimeError
+void/void_type_usage_test/instance2_null_dot: MissingCompileTimeError
+void/void_type_usage_test/instance2_null_equals2: MissingCompileTimeError
 void/void_type_usage_test/instance2_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_toString: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance2_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_argument: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_cascade: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_dynamic_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_for_in: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_literal_map_value_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_null_dot: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_null_equals2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/instance2_throw: MissingCompileTimeError
+void/void_type_usage_test/instance2_toString: MissingCompileTimeError
+void/void_type_usage_test/instance2_while: MissingCompileTimeError
+void/void_type_usage_test/instance3_argument: MissingCompileTimeError
+void/void_type_usage_test/instance3_cascade: MissingCompileTimeError
+void/void_type_usage_test/instance3_do_while: MissingCompileTimeError
+void/void_type_usage_test/instance3_dynamic_init: MissingCompileTimeError
+void/void_type_usage_test/instance3_for_in: MissingCompileTimeError
+void/void_type_usage_test/instance3_is: MissingCompileTimeError
+void/void_type_usage_test/instance3_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/instance3_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/instance3_literal_map_value_init2: MissingCompileTimeError
+void/void_type_usage_test/instance3_null_dot: MissingCompileTimeError
+void/void_type_usage_test/instance3_null_equals2: MissingCompileTimeError
 void/void_type_usage_test/instance3_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_toString: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance3_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_argument: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_cascade: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_dynamic_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_for_in: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_literal_map_value_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_null_dot: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_null_equals2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/instance3_throw: MissingCompileTimeError
+void/void_type_usage_test/instance3_toString: MissingCompileTimeError
+void/void_type_usage_test/instance3_while: MissingCompileTimeError
+void/void_type_usage_test/instance_argument: MissingCompileTimeError
+void/void_type_usage_test/instance_cascade: MissingCompileTimeError
+void/void_type_usage_test/instance_do_while: MissingCompileTimeError
+void/void_type_usage_test/instance_dynamic_init: MissingCompileTimeError
+void/void_type_usage_test/instance_for_in: MissingCompileTimeError
+void/void_type_usage_test/instance_is: MissingCompileTimeError
+void/void_type_usage_test/instance_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/instance_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/instance_literal_map_value_init2: MissingCompileTimeError
+void/void_type_usage_test/instance_null_dot: MissingCompileTimeError
+void/void_type_usage_test/instance_null_equals2: MissingCompileTimeError
 void/void_type_usage_test/instance_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_toString: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/instance_while: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/instance_throw: MissingCompileTimeError
+void/void_type_usage_test/instance_toString: MissingCompileTimeError
+void/void_type_usage_test/instance_while: MissingCompileTimeError
 void/void_type_usage_test/local_addition: MissingCompileTimeError
-void/void_type_usage_test/local_argument: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_argument: MissingCompileTimeError
 void/void_type_usage_test/local_boolean_and_left: MissingCompileTimeError
 void/void_type_usage_test/local_boolean_and_right: MissingCompileTimeError
 void/void_type_usage_test/local_boolean_negation: MissingCompileTimeError
 void/void_type_usage_test/local_boolean_or_left: MissingCompileTimeError
 void/void_type_usage_test/local_boolean_or_right: MissingCompileTimeError
-void/void_type_usage_test/local_cascade: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_cascade: MissingCompileTimeError
 void/void_type_usage_test/local_conditional_stmt: MissingCompileTimeError
-void/void_type_usage_test/local_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/local_dynamic_init: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_do_while: MissingCompileTimeError
+void/void_type_usage_test/local_dynamic_init: MissingCompileTimeError
 void/void_type_usage_test/local_equals_left: MissingCompileTimeError
 void/void_type_usage_test/local_equals_right: MissingCompileTimeError
-void/void_type_usage_test/local_for_in: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_for_in: MissingCompileTimeError
 void/void_type_usage_test/local_identical: MissingCompileTimeError
-void/void_type_usage_test/local_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/local_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/local_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/local_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_is: MissingCompileTimeError
+void/void_type_usage_test/local_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/local_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/local_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/local_multiplication: MissingCompileTimeError
-void/void_type_usage_test/local_null_dot: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_null_dot: MissingCompileTimeError
 void/void_type_usage_test/local_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/local_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/local_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/local_toString: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_throw: MissingCompileTimeError
+void/void_type_usage_test/local_toString: MissingCompileTimeError
 void/void_type_usage_test/local_use_in_conditional_assignment_left: MissingCompileTimeError
 void/void_type_usage_test/local_use_in_conditional_assignment_right: MissingCompileTimeError
 void/void_type_usage_test/local_use_in_list_subscript: MissingCompileTimeError
 void/void_type_usage_test/local_use_in_map_lookup: MissingCompileTimeError
 void/void_type_usage_test/local_use_in_string_interpolation: MissingCompileTimeError
-void/void_type_usage_test/local_while: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/local_while: MissingCompileTimeError
 void/void_type_usage_test/param_addition: MissingCompileTimeError
-void/void_type_usage_test/param_argument: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_argument: MissingCompileTimeError
 void/void_type_usage_test/param_boolean_and_left: MissingCompileTimeError
 void/void_type_usage_test/param_boolean_and_right: MissingCompileTimeError
 void/void_type_usage_test/param_boolean_negation: MissingCompileTimeError
 void/void_type_usage_test/param_boolean_or_left: MissingCompileTimeError
 void/void_type_usage_test/param_boolean_or_right: MissingCompileTimeError
-void/void_type_usage_test/param_cascade: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_cascade: MissingCompileTimeError
 void/void_type_usage_test/param_conditional_stmt: MissingCompileTimeError
-void/void_type_usage_test/param_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/param_dynamic_init: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_do_while: MissingCompileTimeError
+void/void_type_usage_test/param_dynamic_init: MissingCompileTimeError
 void/void_type_usage_test/param_equals_left: MissingCompileTimeError
 void/void_type_usage_test/param_equals_right: MissingCompileTimeError
-void/void_type_usage_test/param_for_in: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_for_in: MissingCompileTimeError
 void/void_type_usage_test/param_identical: MissingCompileTimeError
-void/void_type_usage_test/param_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/param_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/param_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/param_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_is: MissingCompileTimeError
+void/void_type_usage_test/param_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/param_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/param_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/param_multiplication: MissingCompileTimeError
-void/void_type_usage_test/param_null_dot: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_null_dot: MissingCompileTimeError
 void/void_type_usage_test/param_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/param_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/param_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/param_toString: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_throw: MissingCompileTimeError
+void/void_type_usage_test/param_toString: MissingCompileTimeError
 void/void_type_usage_test/param_use_in_conditional_assignment_left: MissingCompileTimeError
 void/void_type_usage_test/param_use_in_conditional_assignment_right: MissingCompileTimeError
 void/void_type_usage_test/param_use_in_list_subscript: MissingCompileTimeError
 void/void_type_usage_test/param_use_in_map_lookup: MissingCompileTimeError
 void/void_type_usage_test/param_use_in_string_interpolation: MissingCompileTimeError
-void/void_type_usage_test/param_while: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/param_while: MissingCompileTimeError
 void/void_type_usage_test/paren_addition: MissingCompileTimeError
-void/void_type_usage_test/paren_argument: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_argument: MissingCompileTimeError
 void/void_type_usage_test/paren_boolean_and_left: MissingCompileTimeError
 void/void_type_usage_test/paren_boolean_and_right: MissingCompileTimeError
 void/void_type_usage_test/paren_boolean_negation: MissingCompileTimeError
 void/void_type_usage_test/paren_boolean_or_left: MissingCompileTimeError
 void/void_type_usage_test/paren_boolean_or_right: MissingCompileTimeError
-void/void_type_usage_test/paren_cascade: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_cascade: MissingCompileTimeError
 void/void_type_usage_test/paren_conditional_stmt: MissingCompileTimeError
-void/void_type_usage_test/paren_do_while: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/paren_dynamic_init: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_do_while: MissingCompileTimeError
+void/void_type_usage_test/paren_dynamic_init: MissingCompileTimeError
 void/void_type_usage_test/paren_equals_left: MissingCompileTimeError
 void/void_type_usage_test/paren_equals_right: MissingCompileTimeError
-void/void_type_usage_test/paren_for_in: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_for_in: MissingCompileTimeError
 void/void_type_usage_test/paren_identical: MissingCompileTimeError
-void/void_type_usage_test/paren_is: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/paren_literal_list_init: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/paren_literal_map_key_init2: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/paren_literal_map_value_init2: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_is: MissingCompileTimeError
+void/void_type_usage_test/paren_literal_list_init: MissingCompileTimeError
+void/void_type_usage_test/paren_literal_map_key_init2: MissingCompileTimeError
+void/void_type_usage_test/paren_literal_map_value_init2: MissingCompileTimeError
 void/void_type_usage_test/paren_multiplication: MissingCompileTimeError
-void/void_type_usage_test/paren_null_dot: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_null_dot: MissingCompileTimeError
 void/void_type_usage_test/paren_null_equals1: MissingCompileTimeError
 void/void_type_usage_test/paren_return: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/paren_throw: MissingCompileTimeError # Issue 32804
-void/void_type_usage_test/paren_toString: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_throw: MissingCompileTimeError
+void/void_type_usage_test/paren_toString: MissingCompileTimeError
 void/void_type_usage_test/paren_use_in_conditional_assignment_right: MissingCompileTimeError
 void/void_type_usage_test/paren_use_in_list_subscript: MissingCompileTimeError
 void/void_type_usage_test/paren_use_in_map_lookup: MissingCompileTimeError
 void/void_type_usage_test/paren_use_in_string_interpolation: MissingCompileTimeError
-void/void_type_usage_test/paren_while: MissingCompileTimeError # Issue 32804
+void/void_type_usage_test/paren_while: MissingCompileTimeError
 void/void_type_usage_test/sync_use_in_yield: MissingCompileTimeError
 void/void_type_usage_test/sync_use_in_yield_star: MissingCompileTimeError
 void/void_type_usage_test/void_default_parameter_closure: MissingCompileTimeError
@@ -717,15 +694,15 @@
 [ $compiler != dart2analyzer && $fasta && $strong ]
 map_literal3_test/03: MissingCompileTimeError
 
+[ $compiler != dart2analyzer && $fasta && !$strong ]
+super_call4_test/01: MissingCompileTimeError
+
 [ $compiler != dart2js && $fasta ]
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
 mixin_supertype_subclass_test/05: MissingCompileTimeError
 
-[ $compiler != dart2js && $fasta && $strong ]
-super_call4_test/01: MissingCompileTimeError
-
 [ $compiler == dartk && $runtime == vm && !$checked && $strong ]
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
 assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
@@ -744,6 +721,11 @@
 const_dynamic_type_literal_test/02: Pass
 map_literal3_test/01: Pass
 map_literal3_test/02: Pass
+vm/bool_check_stack_traces_test/01: RuntimeError # No support for line numbers in stacktraces
+vm/bool_check_stack_traces_test/none: RuntimeError # No support for line numbers in stacktraces
+vm/causal_async_exception_stack2_test: RuntimeError # No support for line numbers in stacktraces
+vm/causal_async_exception_stack_test: RuntimeError # No support for line numbers in stacktraces
+vm/regress_28325_test: RuntimeError # No support for line numbers in stacktraces
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 const_instance_field_test/01: Crash # Issue 32326.
@@ -917,7 +899,6 @@
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
 factory3_test/01: Pass
 field_increment_bailout_test: SkipByDesign
-field_initialization_order_test: Fail, OK
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -1094,9 +1075,6 @@
 export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-field_initialization_order_test/01: MissingCompileTimeError
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
@@ -1437,6 +1415,10 @@
 vm/type_vm_test/35: MissingRuntimeError
 vm/type_vm_test/36: MissingRuntimeError
 
+[ $runtime != dart_precompiled && $runtime != vm && $fasta ]
+generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 30931
+generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 30931
+
 [ $runtime == vm && $checked && $strong && ($compiler == dartk || $compiler == dartkb) ]
 assert_initializer_test/31: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/32: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -1526,7 +1508,6 @@
 external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-field_initialization_order_test: Fail, OK
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -1854,7 +1835,6 @@
 factory_return_type_checked_test/00: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
-field_initialization_order_test/01: MissingCompileTimeError
 field_method4_test: MissingCompileTimeError
 field_override2_test: MissingCompileTimeError
 field_override3_test/00: MissingCompileTimeError
@@ -1897,8 +1877,6 @@
 generic_constructor_mixin3_test/01: MissingCompileTimeError
 generic_constructor_mixin_test/01: MissingCompileTimeError
 generic_field_mixin6_test/01: MissingCompileTimeError
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_function_typedef2_test/04: MissingCompileTimeError
 generic_methods_dynamic_test/01: MissingCompileTimeError
 generic_methods_dynamic_test/03: MissingCompileTimeError
@@ -2312,7 +2290,6 @@
 substring_test/01: MissingCompileTimeError
 super_assign_test/01: MissingCompileTimeError
 super_bound_closure_test/01: MissingCompileTimeError
-super_call4_test/01: MissingCompileTimeError
 super_operator_index_test/01: MissingCompileTimeError
 super_operator_index_test/02: MissingCompileTimeError
 super_operator_index_test/03: MissingCompileTimeError
diff --git a/tests/language_2/mixin_forwarding_constructor4_test.dart b/tests/language_2/mixin_forwarding_constructor4_test.dart
index 965c5b4..ece8c13 100644
--- a/tests/language_2/mixin_forwarding_constructor4_test.dart
+++ b/tests/language_2/mixin_forwarding_constructor4_test.dart
@@ -2,17 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Verify that when no constructors are forwarded from the base class
-// through a mixin, it is always an error; the mixin does not acquire an
-// implicit default constructor.
+// Verify that a forwarding constructor is generated even when there is an
+// optional parameter.
 
 abstract class Mixin {}
 
 class Base {
   Base(
-      {x} //       //# 01: compile-time error
-      {x} //       //# 02: compile-time error
-      {x} //       //# 03: compile-time error
+      {x} //       //# 01: ok
+      {x} //       //# 02: ok
+      {x} //       //# 03: ok
       );
 }
 
diff --git a/tests/language_2/mixin_super_constructor_named_test.dart b/tests/language_2/mixin_super_constructor_named_test.dart
index ebcfd43..0f93c37 100644
--- a/tests/language_2/mixin_super_constructor_named_test.dart
+++ b/tests/language_2/mixin_super_constructor_named_test.dart
@@ -7,7 +7,7 @@
 class Base {
   int i, j;
   Base.ctor(int this.i
-            , {int this.j: 10} //   //# 01: compile-time error
+            , {int this.j: 10} //   //# 01: ok
       ) {
     if (j == null) {
       j = 10;
@@ -24,12 +24,12 @@
 
 class C extends Base with M {
   int l = 131;
-  C.foo() : super.ctor(1, j: 13); //# 01: compile-time error
+  C.foo() : super.ctor(1, j: 13); //# 01: continued
   C.bar() : super.ctor(1);
 }
 
 main() {
-  C c1 = new C.foo(); //            //# 01: compile-time error
+  C c1 = new C.foo(); //            //# 01: continued
   C c2 = new C.bar();
   Expect.equals(1, c2.i);
   Expect.equals(10, c2.j);
diff --git a/tests/language_2/mixin_super_constructor_positionals_test.dart b/tests/language_2/mixin_super_constructor_positionals_test.dart
index 46b72a6..68fd9eb 100644
--- a/tests/language_2/mixin_super_constructor_positionals_test.dart
+++ b/tests/language_2/mixin_super_constructor_positionals_test.dart
@@ -8,7 +8,7 @@
   int i, j;
   Base.ctor(
       int this.i,
-            [ //                 //# 01: compile-time error
+            [ //                 //# 01: ok
       int this.j
             ] //                 //# 01: continued
       );
diff --git a/tests/language_2/string_interpolation_and_buffer_test.dart b/tests/language_2/string_interpolation_and_buffer_test.dart
index 60b680c..05bfe2d 100644
--- a/tests/language_2/string_interpolation_and_buffer_test.dart
+++ b/tests/language_2/string_interpolation_and_buffer_test.dart
@@ -2,77 +2,67 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test to ensure that StringBuffer and string interpolation behaves
-// the same and fail fast.
+// Interpolation calls `toString`.
+// The evaluation of the interpolation fails if `toString` throws or returns
+// null. In Dart 2, any method overriding `Object.toString` must return a
+// `String` or `null`. In particular, if `object.toString()` returns null, then
+// `"$object"` must not evaluate to the string `"null"`.
+//
+// The specification states that the expression of an interpolation is
+// evaluated as follows:
+//
+// 1. Evaluate $e_i$ to an object $o_i$.
+// 2. Invoke the `toString` method on *o<sub>i</sub>* with no arguments,
+//    and let *r<sub>i</sub>*$ be the returned value.
+// 3. If *r<sub>i</sub>* is not an instance of the built-in type `String`,
+//    throw an `Error`.
+//
+// (Then the resulting strings are concatenated with the literal string parts).
+//
+//
+// Adding an object to a `StringBuffer` behaves the same as evaluating
+// an expression in an interpolation. It must immediately fail if the
+// object's toString throws or returns `null`.
+//
+// This ensures that implementing interpolation via a `StringBuffer`is
+// a valid implementation choice.
 
 import "package:expect/expect.dart";
 
-class ToStringWrapper {
-  final value;
-
-  ToStringWrapper(this.value);
-
-  toString() => value;
+class ToStringString {
+  String toString() => "String";
 }
 
-wrap(value) => new ToStringWrapper(value);
+class ToStringNull {
+  String toString() => null;
+}
 
-main() {
-  interpolate(object) {
-    var result;
-    try {
-      result = '${wrap(object)}';
-    } on ArgumentError {
-      return 'Error';
-    }
-    Expect.isTrue(result is String);
-    return 'Success';
-  }
+class ToStringThrows {
+  String toString() => throw "Throw";
+}
 
-  buffer(object) {
-    var sb;
-    try {
-      sb = new StringBuffer()..write(wrap(object));
-    } on ArgumentError {
-      return 'Error';
-    }
-    if (object == null) {
-      Expect.isTrue(sb.toString() is String);
-    }
-    return 'Success';
-  }
+void main() {
+  var s = ToStringString();
+  var n = ToStringNull();
+  var t = ToStringThrows();
 
-  initBuffer(object) {
-    var sb;
-    try {
-      sb = new StringBuffer(wrap(object));
-    } on ArgumentError {
-      return 'Error';
-    }
-    if (object == null) {
-      Expect.isTrue(sb.toString() is String);
-    }
-    return 'Success';
-  }
+  Expect.equals("$s$s", "StringString");
+  // Throws immediately when evaluating the first interpolated expression.
+  Expect.throws<String>(() => "$t${throw "unreachable"}", (e) => e == "Throw");
+  Expect.throws<Error>(() => "$n${throw "unreachable"}");
 
-  Expect.equals('Error', interpolate(null));
-  Expect.equals('Success', interpolate(""));
-  Expect.equals('Success', interpolate("string"));
-  Expect.equals('Error', interpolate([]));
-  Expect.equals('Error', interpolate([1]));
-  Expect.equals('Error', interpolate(new Object()));
+  // Throws immediately when adding object that doesn't return a String.
+  Expect.equals(
+      (StringBuffer()..write(s)..write(s)).toString(), "StringString");
+  Expect.throws<String>(
+      () => StringBuffer()..write(t)..write(throw "unreachable"),
+      (e) => e == "Throw");
+  Expect.throws<Error>(
+      () => StringBuffer()..write(n)..write(throw "unreachable"));
 
-  Expect.equals('Error', buffer(null));
-  Expect.equals('Success', buffer(""));
-  Expect.equals('Success', buffer("string"));
-  Expect.equals('Error', buffer([]));
-  Expect.equals('Error', buffer([1]));
-  Expect.equals('Error', buffer(new Object()));
-
-  Expect.equals('Error', initBuffer(null));
-  Expect.equals('Success', initBuffer(""));
-  Expect.equals('Success', initBuffer("string"));
-  Expect.equals('Error', initBuffer([]));
-  Expect.equals('Error', initBuffer([1]));
-  Expect.equals('Error', initBuffer(new Object()));
+  // Same behavior for constructor argument as if adding it to buffer later.
+  Expect.equals((StringBuffer(s)..write(s)).toString(), "StringString");
+  Expect.throws<String>(
+      () => StringBuffer(t)..write(throw "unreachable"), (e) => e == "Throw");
+  Expect.throws<Error>(() => StringBuffer(n)..write(throw "unreachable"));
 }
diff --git a/tests/language_2/syncstar_yield_test.dart b/tests/language_2/syncstar_yield_test.dart
index f8417fe..160142c 100644
--- a/tests/language_2/syncstar_yield_test.dart
+++ b/tests/language_2/syncstar_yield_test.dart
@@ -37,6 +37,53 @@
   yield p + i;
 }
 
+void testCapturingInSyncStar() {
+  int localL0 = 0;
+
+  nested1(int paramL1) sync* {
+    int localL1 = 0;
+    localL0 += 10;
+    paramL1 += 100;
+
+    nested2(int paramL2) sync* {
+      int localL2 = 0;
+      localL0 += 1000;
+      paramL1 += 10000;
+      localL1 += 100000;
+      paramL2 += 1000000;
+      localL2 += 10000000;
+
+      yield localL0 + paramL1 + localL1 + paramL2 + localL2;
+    }
+
+    yield nested2(0);
+  }
+
+  Iterable t1 = nested1(0);
+
+  Iterator it11 = t1.iterator;
+  Iterator it12 = t1.iterator;
+  it11.moveNext();
+  it12.moveNext();
+
+  Iterable t2 = it11.current;
+  Iterable t3 = it12.current;
+  Iterator it21 = t2.iterator;
+  Iterator it22 = t2.iterator;
+  Iterator it31 = t3.iterator;
+  Iterator it32 = t3.iterator;
+
+  it21.moveNext();
+  it22.moveNext();
+  it31.moveNext();
+  it32.moveNext();
+
+  Expect.equals(11111120, it21.current);
+  Expect.equals(11222120, it22.current);
+  Expect.equals(11113120, it31.current);
+  Expect.equals(11224120, it32.current);
+}
+
 main() {
   Expect.listEquals([1], foo1().toList());
   Expect.listEquals(
@@ -54,4 +101,6 @@
   Expect.isFalse(it1.moveNext());
   Expect.isFalse(it2.moveNext()); //# copyParameters: continued
   Expect.isFalse(it2.moveNext()); //# copyParameters: continued
+
+  testCapturingInSyncStar(); //# capturing: ok
 }
diff --git a/tests/lib_2/lib_2_analyzer.status b/tests/lib_2/lib_2_analyzer.status
index fb40aa7..72c133b 100644
--- a/tests/lib_2/lib_2_analyzer.status
+++ b/tests/lib_2/lib_2_analyzer.status
@@ -7,7 +7,6 @@
 html/element_types_keygen_test: CompileTimeError # Chrome 57 keygen removed
 html/js_function_getter_trust_types_test: Skip # dart2js specific flags.
 html/js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue #25759
-mirrors/deferred_mirrors_metadata_test: Fail # Issue 17522
 mirrors/deferred_type_test: StaticWarning, OK # Deliberately refers to a deferred type in a declaration.
 mirrors/generic_f_bounded_mixin_application_test: StaticWarning # Test Issue
 mirrors/mirrors_nsm_mismatch_test: StaticWarning, OK
@@ -18,7 +17,6 @@
 mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
 
 [ $compiler == dart2analyzer && $strong ]
-mirrors/deferred_mirrors_metadata_test: StaticWarning # Issue 28969
 mirrors/deferred_type_test: CompileTimeError, OK # Deliberately refers to a deferred type in a declaration.
 mirrors/generic_f_bounded_mixin_application_test: CompileTimeError
 mirrors/mirrors_nsm_mismatch_test: CompileTimeError, OK
diff --git a/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart b/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart
index 2ac3d34..81d67c8 100644
--- a/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart
+++ b/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart
@@ -11,7 +11,7 @@
 
 class F {
   @H()
-  final int f;
+  int f;
 }
 
 @C()
diff --git a/tests/standalone_2/io/directory_test.dart b/tests/standalone_2/io/directory_test.dart
index c193483..dad3ac5 100644
--- a/tests/standalone_2/io/directory_test.dart
+++ b/tests/standalone_2/io/directory_test.dart
@@ -194,7 +194,6 @@
           if (++errors == 2) {
             d.delete(recursive: true).then((_) => asyncEnd());
           }
-          return true;
         }
 
         long.delete().catchError(onError);
@@ -359,8 +358,8 @@
     String template = 'dart_temp_dir';
     if (base.existsSync()) {
       asyncStart();
-      Future.wait([base.createTemp(template), base.createTemp(template)]).then(
-          (tempDirs) {
+      Future.wait([base.createTemp(template), base.createTemp(template)])
+          .then((tempDirs) {
         Expect.notEquals(tempDirs[0].path, tempDirs[1].path);
         for (Directory t in tempDirs) {
           Expect.isTrue(t.existsSync());
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 42c19e7..36b4a51 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -108,7 +108,6 @@
 io/socket_many_connections_test: Skip # This test fails with "Too many open files" on the Mac OS buildbot. This is expected as MacOS by default runs with a very low number of allowed open files ('ulimit -n' says something like 256).
 
 [ $strong && ($compiler == dartk || $compiler == dartkb || $compiler == dartkp) ]
-io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
 io/http_auth_digest_test: RuntimeError
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 45e463b..4af09aa 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -11,7 +11,6 @@
 # to add them.
 
 [ $compiler == app_jitk ]
-io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
 io/http_auth_digest_test: RuntimeError
@@ -59,7 +58,6 @@
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 io/compile_all_test: Crash # Issue 32373
-io/directory_test: Crash # Issue 33475
 io/raw_socket_test: Crash
 io/skipping_dart2js_compilations_test: Crash
 io/socket_exception_test: Pass, Crash
diff --git a/tools/VERSION b/tools/VERSION
index 5f0eacc..6f56b53 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 1
 PATCH 0
-PRERELEASE 1
+PRERELEASE 2
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 3f8d93e..a82fba1 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -430,6 +430,18 @@
         "compiler": "dart2analyzer",
         "enable-asserts": true,
         "use-sdk": true
+      }},
+    "analyzer-cfe-(linux|mac|win)": {
+      "options": {
+        "compiler": "dart2analyzer",
+        "use-cfe": true,
+        "use-sdk": true
+      }},
+    "analyzer-fasta_parser-linux": {
+      "options": {
+        "compiler": "dart2analyzer",
+        "analyzer-use-fasta-parser": true,
+        "use-sdk": true
       }}
   },
   "builder_configurations": [
@@ -503,6 +515,7 @@
           "name": "vm tests",
           "arguments": [
             "-ndartkb-linux-${mode}-x64",
+            "--compiler=dartkb",
             "vm",
             "language_2"
           ]
@@ -1133,7 +1146,9 @@
         {
           "name": "dart2js tests",
           "arguments": [
-            "-ndart2js-hostasserts-linux-ia32-d8"],
+            "-ndart2js-hostasserts-linux-ia32-d8",
+            "--dart2js-batch"
+          ],
           "exclude_tests": ["observatory_ui", "co19"],
           "shards": 6,
           "fileset": "dart2js_hostasserts"
@@ -1141,19 +1156,25 @@
         {
           "name": "dart2js package tests",
           "arguments": [
-            "-ndart2js-hostasserts-linux-ia32-d8"],
+            "-ndart2js-hostasserts-linux-ia32-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["pkg"]
         },
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-hostasserts-linux-ia32-d8"],
+            "-ndart2js-hostasserts-linux-ia32-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["observatory_ui"]
         },
         {
           "name": "dart2js extra tests",
           "arguments": [
-            "-ndart2js-hostasserts-linux-ia32-d8"],
+            "-ndart2js-hostasserts-linux-ia32-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["dart2js_extra","dart2js_native"]
         }
       ]
@@ -1182,6 +1203,7 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "exclude_tests": ["observatory_ui", "co19"],
@@ -1192,6 +1214,7 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["pkg"]
@@ -1200,6 +1223,7 @@
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["observatory_ui"]
@@ -1208,6 +1232,7 @@
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["dart2js_extra","dart2js_native"]
@@ -1238,6 +1263,7 @@
           "name": "dart2js fast-startup tests",
           "arguments": [
             "-ndart2js-faststartup-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "exclude_tests": ["observatory_ui", "co19"],
@@ -1248,6 +1274,7 @@
           "name": "dart2js fast-startup package tests",
           "arguments": [
             "-ndart2js-faststartup-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["pkg"]
@@ -1256,6 +1283,7 @@
           "name": "dart2js fast-startup observatory-ui tests",
           "arguments": [
             "-ndart2js-faststartup-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["observatory_ui"]
@@ -1264,6 +1292,7 @@
           "name": "dart2js fast-startup extra tests",
           "arguments": [
             "-ndart2js-faststartup-${system}-${runtime}",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["dart2js_extra","dart2js_native"]
@@ -1284,7 +1313,9 @@
         {
           "name": "dart2js tests",
           "arguments": [
-            "-ndart2js-minified-linux-d8"],
+            "-ndart2js-minified-linux-d8",
+            "--dart2js-batch"
+          ],
           "exclude_tests": ["observatory_ui", "co19"],
           "shards": 6,
           "fileset": "dart2js"
@@ -1292,7 +1323,9 @@
         {
           "name": "dart2js fast-startup tests",
           "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8"],
+            "-ndart2js-minified-faststartup-linux-d8",
+            "--dart2js-batch"
+          ],
           "exclude_tests": ["observatory_ui", "co19"],
           "shards": 6,
           "fileset": "dart2js"
@@ -1300,37 +1333,49 @@
         {
           "name": "dart2js package tests",
           "arguments": [
-            "-ndart2js-minified-linux-d8"],
+            "-ndart2js-minified-linux-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["pkg"]
         },
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-minified-linux-d8"],
+            "-ndart2js-minified-linux-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["observatory_ui"]
         },
         {
           "name": "dart2js extra tests",
           "arguments": [
-            "-ndart2js-minified-linux-d8"],
+            "-ndart2js-minified-linux-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["dart2js_extra","dart2js_native"]
         },
         {
           "name": "dart2js fast-startup package tests",
           "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8"],
+            "-ndart2js-minified-faststartup-linux-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["pkg"]
         },
         {
           "name": "dart2js fast-startup observatory-ui tests",
           "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8"],
+            "-ndart2js-minified-faststartup-linux-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["observatory_ui"]
         },
         {
           "name": "dart2js fast-startup extra tests",
           "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8"],
+            "-ndart2js-minified-faststartup-linux-d8",
+            "--dart2js-batch"
+          ],
           "tests": ["dart2js_extra","dart2js_native"]
         }
       ]
@@ -1350,6 +1395,7 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "exclude_tests": ["observatory_ui", "co19"],
@@ -1360,6 +1406,7 @@
           "name": "dart2js fast-startup tests",
           "arguments": [
             "-ndart2js-minified-faststartup-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "exclude_tests": ["observatory_ui", "co19"],
@@ -1370,6 +1417,7 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["pkg"]
@@ -1378,6 +1426,7 @@
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["observatory_ui"]
@@ -1385,13 +1434,16 @@
         {
           "name": "dart2js extra tests",
           "arguments": [
-            "-ndart2js-minified-csp-linux-chrome"],
+            "-ndart2js-minified-csp-linux-chrome",
+            "--dart2js-batch"
+          ],
           "tests": ["dart2js_extra","dart2js_native"]
         },
         {
           "name": "dart2js fast-startup package tests",
           "arguments": [
             "-ndart2js-minified-faststartup-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["pkg"]
@@ -1400,6 +1452,7 @@
           "name": "dart2js fast-startup observatory-ui tests",
           "arguments": [
             "-ndart2js-minified-faststartup-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["observatory_ui"]
@@ -1408,6 +1461,7 @@
           "name": "dart2js fast-startup extra tests",
           "arguments": [
             "-ndart2js-minified-faststartup-csp-linux-chrome",
+            "--dart2js-batch",
             "--reset-browser-configuration"
           ],
           "tests": ["dart2js_extra","dart2js_native"]
@@ -1596,18 +1650,14 @@
         {
           "name": "dartanalyzer --batch --use-cfe pkg tests",
           "arguments": [
-            "--compiler=dart2analyzer",
-            "--use-cfe",
-            "--use-sdk",
+            "-nanalyzer-cfe-${system}",
             "pkg"
           ]
         },
         {
           "name": "run language2 tests",
           "arguments": [
-            "--compiler=dart2analyzer",
-            "--use-cfe",
-            "--use-sdk",
+            "-nanalyzer-cfe-${system}",
             "language_2"
           ]
         },
@@ -1833,9 +1883,7 @@
         {
           "name": "run language2 tests",
           "arguments": [
-            "--analyzer-use-fasta-parser",
-            "--compiler=dart2analyzer",
-            "--use-sdk",
+            "-nanalyzer-fasta_parser-linux",
             "language_2"
           ]
         },
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index 04bfdd2..07f7029 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -1,7 +1,6 @@
 # See http://luci-config.appspot.com/schemas/projects/refs:cq.cfg for the
 # documentation of this file format.
 version: 1
-cq_name: "dart"
 cq_status_url: "https://chromium-cq-status.appspot.com"
 git_repo_url: "https://dart.googlesource.com/sdk.git"
 max_commit_burst: 2
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 7d42256..f1762e6 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -833,14 +833,8 @@
 
   int get timeoutMultiplier {
     var multiplier = 1;
-    if (_isDebug) multiplier *= 4;
+    if (_isDebug) multiplier *= 2;
     if (_isChecked) multiplier *= 2;
-
-    // The CL in 396c92e disabled running the kernel-isolate from app-jit
-    // snapshots if the VM is run with --snapshot-kind=app-jit. This made our
-    // app-jit tests run slower.
-    if (previewDart2) multiplier *= 2;
-
     return multiplier;
   }
 
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index 433d1d7..07f4bf5 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -37,8 +37,6 @@
       this.reportInJson,
       this.resetBrowser,
       this.skipCompilation,
-      this.useAnalyzerCfe,
-      this.useAnalyzerFastaParser,
       this.useKernelBytecode,
       this.writeDebugLog,
       this.writeTestOutcomeLog,
@@ -89,8 +87,6 @@
   final bool reportInJson;
   final bool resetBrowser;
   final bool skipCompilation;
-  final bool useAnalyzerCfe;
-  final bool useAnalyzerFastaParser;
   final bool useKernelBytecode;
   final bool writeDebugLog;
   final bool writeTestOutcomeLog;
@@ -111,6 +107,8 @@
   bool get isCsp => configuration.isCsp;
   bool get isMinified => configuration.isMinified;
   bool get noPreviewDart2 => !configuration.previewDart2;
+  bool get useAnalyzerCfe => configuration.useAnalyzerCfe;
+  bool get useAnalyzerFastaParser => configuration.useAnalyzerFastaParser;
   bool get useBlobs => configuration.useBlobs;
   bool get useSdk => configuration.useSdk;
   bool get useFastStartup => configuration.useFastStartup;
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index dd3896f..dca625a 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -638,6 +638,9 @@
                     compiler, mode, runtime, system,
                     timeout: data["timeout"] as int,
                     enableAsserts: data["enable_asserts"] as bool,
+                    useAnalyzerCfe: data["use_cfe"] as bool,
+                    useAnalyzerFastaParser:
+                        data["analyzer_use_fasta_parser"] as bool,
                     useBlobs: data["use_blobs"] as bool,
                     useSdk: data["use_sdk"] as bool,
                     useFastStartup: data["fast_startup"] as bool,
@@ -668,9 +671,6 @@
                 reportInJson: data["report_in_json"] as bool,
                 resetBrowser: data["reset_browser_configuration"] as bool,
                 skipCompilation: data["skip_compilation"] as bool,
-                useAnalyzerCfe: data["use_cfe"] as bool,
-                useAnalyzerFastaParser:
-                    data["analyzer_use_fasta_parser"] as bool,
                 useKernelBytecode: compiler == Compiler.dartkb,
                 writeDebugLog: data["write_debug_log"] as bool,
                 writeTestOutcomeLog: data["write_test_outcome_log"] as bool,
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index 2ce063a..5046ef3 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -239,6 +239,8 @@
     if (suite.configuration.compiler == Compiler.dartkb) {
       args.removeWhere(
           (String arg) => arg.startsWith('--optimization-counter-threshold'));
+      args.removeWhere(
+          (String arg) => arg.startsWith('--optimization_counter_threshold'));
       args = <String>['--optimization-counter-threshold=-1']..addAll(args);
     }
 
diff --git a/utils/analysis_server/BUILD.gn b/utils/analysis_server/BUILD.gn
index 7cc939a..00ff196 100644
--- a/utils/analysis_server/BUILD.gn
+++ b/utils/analysis_server/BUILD.gn
@@ -5,7 +5,6 @@
 import("../application_snapshot.gni")
 
 application_snapshot("analysis_server") {
-  dart_version = 2
   main_dart = "../../pkg/analysis_server/bin/server.dart"
   training_args = [
     "--train-using=" + rebase_path("../../pkg/analyzer_cli"),
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 5ed85b2..e8e6d35 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -3,15 +3,17 @@
 # BSD-style license that can be found in the LICENSE file.
 
 import("../build/dart/dart_action.gni")
+import("../runtime/runtime_args.gni")
 
 _dart_root = get_path_info("..", "abspath")
 
 declare_args() {
   # Default to building app-jit snapshots. The simulator and cross builds
   # override this to script snapshots to cut down on build time.
-  dart_snapshot_kind = "app-jit"
   if (target_cpu != host_cpu) {
     dart_snapshot_kind = "script"
+  } else {
+    dart_snapshot_kind = "app-jit"
   }
 }
 
@@ -24,12 +26,8 @@
 #  training_args (required):
 #    Arguments to pass to the Dart application for the training run.
 #
-#  dart_version (optional):
-#    Must be 1 or 2. Defaults to 1.
-#
 #  vm_args (optional):
-#    Additional arguments to the Dart VM. Do not put --preview-dart-2 here.
-#    Instead set dart_version = 2.
+#    Additional arguments to the Dart VM.
 #
 #  name (optional):
 #    The name of the snapshot if different from the target name. The output
@@ -46,7 +44,7 @@
 #
 #  output (optional):
 #    Overrides the full output path.
-template("application_snapshot") {
+template("_application_snapshot") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
   assert(defined(invoker.training_args), "Must specify 'training_args'")
   snapshot_vm_args = []
@@ -76,27 +74,8 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
-  # TODO(asiva), flip default once the VM is dart2 by default.
-  dart_version = 1
-  if (defined(invoker.dart_version)) {
-    dart_version = invoker.dart_version
-  }
-  assert(dart_version == 1 || dart_version == 2,
-      "For $target_name, dart_version must be 1 or 2")
   dart_action(target_name) {
     deps = extra_deps
-
-    if (dart_version == 1) {
-      snapshot_vm_args += [ "--no-preview-dart-2" ]
-    } else {
-      # HACK: When creating app-jit snapshots for Dart 2 apps, the standalone
-      # Dart VM binary requires the app-jit snapshot for the kernel service to
-      # be adjacent to it. This deps ensures that it is there, but a different
-      # approach will be needed when the kernel service itself switches to
-      # Dart 2 to avoid creating a circular dependence.
-      deps += [ "$_dart_root/utils/kernel-service:copy_kernel_service_snapshot"]
-    }
-
     depfile = "$output.d"
 
     script = main_dart
@@ -132,6 +111,107 @@
   }
 }
 
+# Creates an app-jit snapshot for a Dart2 program based on a training run.
+#
+# Parameters:
+#  main_dart (required):
+#    The entrypoint to the Dart application.
+#
+#  training_args (required):
+#    Arguments to pass to the Dart application for the training run.
+#
+#  vm_args (optional):
+#    Additional arguments to the Dart VM. Do not put --no-preview-dart-2 here.
+#    Instead use the template application_snapshot_dart1.
+#
+#  name (optional):
+#    The name of the snapshot if different from the target name. The output
+#    will be in $root_gen_dir/$name.dart.snapshot.
+#
+#  deps (optional):
+#    Any build dependencies.
+#
+#  dot_packages (optional):
+#    The .packages file for the app. Defaults to the $_dart_root/.packages.
+#
+#  output (optional):
+#    Overrides the full output path.
+template("application_snapshot") {
+  _application_snapshot(target_name) {
+    forward_variables_from(invoker, "*")
+    if (!defined(invoker.deps)) {
+      deps = []
+    }
+    deps += [
+      "$_dart_root/utils/kernel-service:kernel-service_snapshot"
+    ]
+  }
+}
+
+# Creates an app-jit snapshot for a Dart1 program based on a training run.
+#
+# Parameters:
+#  main_dart (required):
+#    The entrypoint to the Dart application.
+#
+#  training_args (required):
+#    Arguments to pass to the Dart application for the training run.
+#
+#  vm_args (optional):
+#    Additional arguments to the Dart VM. Do not put --no-preview-dart-2 here.
+#
+#  name (optional):
+#    The name of the snapshot if different from the target name. The output
+#    will be in $root_gen_dir/$name.dart.snapshot.
+#
+#  deps (optional):
+#    Any build dependencies.
+#
+#  dot_packages (optional):
+#    The .packages file for the app. Defaults to the $_dart_root/.packages.
+#
+#  output (optional):
+#    Overrides the full output path.
+template("application_snapshot_dart1") {
+  _application_snapshot(target_name) {
+    forward_variables_from(invoker, "*")
+    if (!defined(invoker.vm_args)) {
+      vm_args = []
+    }
+    vm_args += [ "--no-preview-dart-2" ]
+  }
+}
+
+# Creates an app-jit snapshot for the common FE based on a training run.
+#
+# Parameters:
+#  main_dart (required):
+#    The entrypoint to the Dart application.
+#
+#  training_args (required):
+#    Arguments to pass to the Dart application for the training run.
+#
+#  vm_args (optional):
+#    Additional arguments to the Dart VM. Do not put --no-preview-dart-2 here.
+#
+#  name (optional):
+#    The name of the snapshot if different from the target name. The output
+#    will be in $root_gen_dir/$name.dart.snapshot.
+#
+#  deps (optional):
+#    Any build dependencies.
+#
+#  dot_packages (optional):
+#    The .packages file for the app. Defaults to the $_dart_root/.packages.
+#
+#  output (optional):
+#    Overrides the full output path.
+template("kernel_application_snapshot") {
+  _application_snapshot(target_name) {
+    forward_variables_from(invoker, "*")
+  }
+}
+
 template("aot_assembly") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
   aot_vm_args = []
diff --git a/utils/bazel/BUILD.gn b/utils/bazel/BUILD.gn
index eb754ab..6f6d3da 100644
--- a/utils/bazel/BUILD.gn
+++ b/utils/bazel/BUILD.gn
@@ -7,5 +7,4 @@
 application_snapshot("kernel_worker") {
   main_dart = "kernel_worker.dart"
   training_args = [ "--help" ]
-  dart_version = 2
 }
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index d9f1cd0..f6024c4 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -32,7 +32,7 @@
   # dart_action() needs kernel service snapshot to run in Dart 2 mode.
   # This can't be added as a dependency to dart_action() itself as it will
   # create a circular dependency.
-  deps += [ "../../utils/kernel-service:copy_kernel_service_snapshot" ]
+  deps += [ "../../utils/kernel-service:kernel-service" ]
 
   output_dir = rebase_path(target_gen_dir)
 
@@ -58,8 +58,6 @@
 }
 
 application_snapshot("dart2js") {
-  dart_version = 2
-
   deps = [
     ":compile_dart2js_platform",
     ":compile_dart2js_platform_strong",
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index ff06c7b..e41c7f6 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -21,7 +21,6 @@
                              "list lines")
 
 application_snapshot("generate_dartanalyzer_snapshot") {
-  dart_version = 2
   main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
   training_args = [
     "--dart-sdk=" + rebase_path("../../sdk"),
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index cd84c19..6fecc50 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -11,8 +11,6 @@
 sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
 
 application_snapshot("dartdevc") {
-  dart_version = 2
-
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
 
   training_args = [
@@ -35,8 +33,6 @@
 }
 
 application_snapshot("dartdevk") {
-  dart_version = 2
-
   main_dart = "../../pkg/dev_compiler/bin/dartdevk.dart"
 
   training_args = [
@@ -93,7 +89,7 @@
     # dart_action() needs kernel service snapshot to run in Dart 2 mode.
     # This can't be added as a dependency to dart_action() itself as it will
     # create a circular dependency.
-    deps += [ "../../utils/kernel-service:copy_kernel_service_snapshot" ]
+    deps += [ "../../utils/kernel-service:kernel-service" ]
 
     inputs = sdk_lib_files + compiler_files + dev_compiler_files + [
                "$root_out_dir/dart2js_platform.dill",
diff --git a/utils/dartdoc/BUILD.gn b/utils/dartdoc/BUILD.gn
index 688a76b..0ba4fe2 100644
--- a/utils/dartdoc/BUILD.gn
+++ b/utils/dartdoc/BUILD.gn
@@ -5,7 +5,6 @@
 import("../application_snapshot.gni")
 
 application_snapshot("dartdoc") {
-  dart_version = 2
   main_dart = "../../third_party/pkg/dartdoc/bin/dartdoc.dart"
   training_args = [ "--help" ]
 }
diff --git a/utils/dartfmt/BUILD.gn b/utils/dartfmt/BUILD.gn
index 99ae1ed..466a1b8 100644
--- a/utils/dartfmt/BUILD.gn
+++ b/utils/dartfmt/BUILD.gn
@@ -5,7 +5,6 @@
 import("../application_snapshot.gni")
 
 application_snapshot("dartfmt") {
-  dart_version = 2
   main_dart = "../../third_party/pkg_tested/dart_style/bin/format.dart"
 
   # Train it on formatting its own source.
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index df39bb9..489e38d 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -4,24 +4,39 @@
 
 import("../../build/dart/dart_action.gni")
 import("../../build/dart/dart_host_sdk_toolchain.gni")
+import("../../runtime/runtime_args.gni")
 import("../application_snapshot.gni")
 
+group("kernel-service") {
+  if (create_kernel_service_snapshot) {
+    deps = [
+      # TODO(rmacnak): Link this into 'dart'.
+      ":copy_kernel-service_snapshot",
+    ]
+  } else {
+    deps = [
+      ":kernel_service_dill",
+    ]
+  }
+}
+
 # TODO: Switch this to use kernel based app-jit snapshot
 # when we are ready to switch to the kernel based core snapshots.
-application_snapshot("kernel-service") {
-  main_dart = "../../pkg/vm/bin/kernel_service.dart"
+kernel_application_snapshot("kernel-service_snapshot") {
+  main_dart = "$root_gen_dir/kernel_service.dill"
   deps = [
-    "../../runtime/vm:kernel_platform_files($dart_host_toolchain)",
+    ":kernel_service_dill",
   ]
   training_args = [
     "--train",
     "file://" + rebase_path("../../pkg/compiler/lib/src/dart2js.dart"),
   ]
+  output = "$root_gen_dir/kernel-service.dart.snapshot"
 }
 
-copy("copy_kernel_service_snapshot") {
+copy("copy_kernel-service_snapshot") {
   deps = [
-    ":kernel-service",
+    ":kernel-service_snapshot",
   ]
   sources = [
     "$root_gen_dir/kernel-service.dart.snapshot",
@@ -40,14 +55,15 @@
   training_args = [
     "--train",
     "--sdk-root=$sdk_root/",
-    "--platform=$sdk_root/vm_platform.dill",
+    "--platform=$sdk_root/vm_platform_strong.dill",
   ]
   output = "$root_out_dir/frontend_server.dart.snapshot"
 }
 
 prebuilt_dart_action("kernel_service_dill") {
   deps = [
-    "../../runtime/vm:vm_legacy_platform",
+    "../../runtime/vm:vm_platform",
+    "../../runtime/vm:kernel_platform_files($dart_host_toolchain)",
   ]
   kernel_service_script = "../../pkg/vm/bin/kernel_service.dart"
   gen_kernel_script = "../../pkg/vm/bin/gen_kernel.dart"
@@ -55,7 +71,7 @@
   inputs = [
     gen_kernel_script,
     kernel_service_script,
-    "$root_out_dir/vm_platform.dill",
+    "$root_out_dir/vm_platform_strong.dill",
   ]
   output = "$root_gen_dir/kernel_service.dill"
   outputs = [
@@ -74,14 +90,10 @@
 
   script = gen_kernel_script
 
-  # TODO: Switch over to vm_platform_strong.dill and remove the
-  # flags --no-strong-mode once https://github.com/dart-lang/sdk/issues/31623
-  # is fixed.
   args = [
     "--packages=" + rebase_path("../../.packages"),
-    "--platform=" + rebase_path("$root_out_dir/vm_platform.dill"),
+    "--platform=" + rebase_path("$root_out_dir/vm_platform_strong.dill"),
     "--no-aot",
-    "--no-strong-mode",
     "--no-embed-sources",
     "--output=" + rebase_path("$root_gen_dir/kernel_service.dill"),
     rebase_path(kernel_service_script),
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index a87616b..b2f724c 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -5,7 +5,6 @@
 import("../application_snapshot.gni")
 
 application_snapshot("pub") {
-  dart_version = 2
   main_dart = "../../third_party/pkg/pub/bin/pub.dart"
   training_args = [ "--help" ]
 }