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" ]
 }
