Version 2.0.0-dev.17.0

Merge commit '4553cdeeb6a272d75d34bfc83ecba84194b3994f' into dev
diff --git a/.packages b/.packages
index 1f0b101..cfa718c 100644
--- a/.packages
+++ b/.packages
@@ -77,7 +77,6 @@
 quiver:third_party/pkg/quiver/lib
 quiver_hashcode:third_party/pkg/quiver_hashcode/lib
 resource:third_party/pkg/resource/lib
-scheduled_test:third_party/pkg/scheduled_test/lib
 sdk_library_metadata:sdk/lib/_internal/sdk_library_metadata/lib
 shelf:third_party/pkg/shelf/lib
 shelf_packages_handler:third_party/pkg/shelf_packages_handler/lib
@@ -95,8 +94,10 @@
 term_glyph:third_party/pkg/term_glyph/lib
 test:third_party/pkg/test/lib
 test_dart:tools/testing/dart
-testing:pkg/testing/lib
+test_descriptor:third_party/pkg/test_descriptor/lib
+test_process:third_party/pkg/test_process/lib
 test_reflective_loader:third_party/pkg/test_reflective_loader/lib
+testing:pkg/testing/lib
 tuple:third_party/pkg/tuple/lib
 typed_data:third_party/pkg/typed_data/lib
 typed_mock:pkg/typed_mock/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 087bbe5..282a3ac 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -56,6 +56,7 @@
   * Renamed the `HtmlEscapeMode` constants `UNKNOWN`, `ATTRIBUTE`,
     `SQ_ATTRIBUTE` and `ELEMENT` to `unknown`, `attribute`, `sqAttribute` and
     `elements`.
+  * Changed return type of `Base64Codec.decode` to `Uint8List`.
 
 * `dart:developer`
   * `Timeline.startSync` and `Timeline.timeSync` now accept an optional
diff --git a/DEPS b/DEPS
index 28211bb..38556fb 100644
--- a/DEPS
+++ b/DEPS
@@ -6,6 +6,13 @@
 # Before adding or updating dependencies, please review the documentation here:
 # https://github.com/dart-lang/sdk/wiki/Adding-and-Updating-Dependencies
 
+allowed_hosts = [
+  'boringssl.googlesource.com',
+  'chromium.googlesource.com',
+  'dart.googlesource.com',
+  'fuchsia.googlesource.com',
+]
+
 vars = {
   # The dart_root is the root of our sdk checkout. This is normally
   # simply sdk, but if using special gclient specs it can be different.
@@ -47,7 +54,7 @@
   "barback-0.13.0_rev": "@34853",
   "barback-0.14.0_rev": "@36398",
   "barback-0.14.1_rev": "@38525",
-  "barback_tag" : "@0.15.2+13",
+  "barback_tag" : "@0.15.2+14",
   "bazel_worker_tag": "@v0.1.4",
   "boolean_selector_tag" : "@1.0.2",
   "boringssl_gen_rev": "@d2b56d1b7657e52eb5a1f075968c773aa3e53614",
@@ -73,13 +80,13 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "@1.0.7",  # Please see the note above before updating.
+  "dart_style_tag": "@1.0.9",  # Please see the note above before updating.
 
   "dartdoc_tag" : "@v0.15.0+1",
   "fixnum_tag": "@0.10.5",
   "func_rev": "@25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "@1.1.5",
-  "html_tag" : "@0.13.2+1",
+  "html_tag" : "@0.13.2+2",
   "http_multi_server_tag" : "@2.0.4",
   "http_parser_tag" : "@3.1.1",
   "http_retry_tag": "@0.1.0",
@@ -105,13 +112,12 @@
   "plugin_tag": "@0.2.0+2",
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.3.4",
-  "protobuf_tag": "@0.5.4",
+  "protobuf_tag": "@0.6.0",
   "pub_rev": "@667281eef93b4be648cceca400e954e000edba38",
   "pub_semver_tag": "@1.3.2",
   "quiver_tag": "@0.27.0",
   "resource_rev":"@af5a5bf65511943398146cf146e466e5f0b95cb9",
   "root_certificates_rev": "@a4c7c6f23a664a37bc1b6f15a819e3f2a292791a",
-  "scheduled_test_tag": "@0.12.11+1",
   "shelf_static_rev": "@3558aa35a0d2f0f35868c3fd64b258e140db0122",
   "shelf_packages_handler_tag": "@1.0.3",
   "shelf_tag": "@0.7.1",
@@ -120,13 +126,15 @@
   "source_maps-0.9.4_rev": "@38524",
   "source_maps_tag": "@0.10.4",
   "source_span_tag": "@1.4.0",
-  "stack_trace_tag": "@1.8.2",
+  "stack_trace_tag": "@1.9.0",
   "stream_channel_tag": "@1.6.2",
   "string_scanner_tag": "@1.0.2",
   "sunflower_rev": "@879b704933413414679396b129f5dfa96f7a0b1e",
+  "test_descriptor_tag": "@1.0.3",
+  "test_process_tag": "@1.0.1",
   "term_glyph_tag": "@1.0.0",
   "test_reflective_loader_tag": "@0.1.3",
-  "test_tag": "@0.12.24+6",
+  "test_tag": "@0.12.29+1",
   "tuple_tag": "@v1.0.1",
   "typed_data_tag": "@1.1.3",
   "usage_tag": "@3.3.0",
@@ -283,8 +291,6 @@
       + Var("quiver_tag"),
   Var("dart_root") + "/third_party/pkg/resource":
       Var("dart_git") + "resource.git" + Var("resource_rev"),
-  Var("dart_root") + "/third_party/pkg/scheduled_test":
-      Var("dart_git") + "scheduled_test.git" + Var("scheduled_test_tag"),
   Var("dart_root") + "/third_party/pkg/shelf":
       Var("dart_git") + "shelf.git" + Var("shelf_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
@@ -318,6 +324,10 @@
       Var("dart_git") + "term_glyph.git" + Var("term_glyph_tag"),
   Var("dart_root") + "/third_party/pkg/test":
       Var("dart_git") + "test.git" + Var("test_tag"),
+  Var("dart_root") + "/third_party/pkg/test_descriptor":
+      Var("dart_git") + "test_descriptor.git" + Var("test_descriptor_tag"),
+  Var("dart_root") + "/third_party/pkg/test_process":
+      Var("dart_git") + "test_process.git" + Var("test_process_tag"),
   Var("dart_root") + "/third_party/pkg/test_reflective_loader":
       Var("dart_git") + "test_reflective_loader.git" +
       Var("test_reflective_loader_tag"),
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 4e65f3e..0cdf43b 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -225,14 +225,31 @@
   return []
 
 
+def _CheckValidHostsInDEPS(input_api, output_api):
+  """Checks that DEPS file deps are from allowed_hosts."""
+  # Run only if DEPS file has been modified to annoy fewer bystanders.
+  if all(f.LocalPath() != 'DEPS' for f in input_api.AffectedFiles()):
+    return []
+  # Outsource work to gclient verify
+  try:
+    input_api.subprocess.check_output(['gclient', 'verify'])
+    return []
+  except input_api.subprocess.CalledProcessError, error:
+    return [output_api.PresubmitError(
+        'DEPS file must have only dependencies from allowed hosts.',
+        long_text=error.output)]
+
+
 def CheckChangeOnCommit(input_api, output_api):
-  return (_CheckBuildStatus(input_api, output_api) +
+  return (_CheckValidHostsInDEPS(input_api, output_api) +
+          _CheckBuildStatus(input_api, output_api) +
           _CheckNewTests(input_api, output_api) +
           _CheckDartFormat(input_api, output_api) +
           _CheckStatusFiles(input_api, output_api))
 
 
 def CheckChangeOnUpload(input_api, output_api):
-  return (_CheckNewTests(input_api, output_api) +
+  return (_CheckValidHostsInDEPS(input_api, output_api) +
+          _CheckNewTests(input_api, output_api) +
           _CheckDartFormat(input_api, output_api) +
           _CheckStatusFiles(input_api, output_api))
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index a0879ba..1df31f2 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -35,6 +35,7 @@
 % - Update "FutureOr" specification for Dart 2.0.
 % - Require that a top-level "main" declaration is a valid script-entry
 %   function declaration.
+% - State that the return type of a setter or []= is void when not specified.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -1021,7 +1022,9 @@
 \LMLabel{typeOfAFunction}
 
 \LMHash{}
-If a function does not declare a return type explicitly, its return type is \DYNAMIC{} (\ref{typeDynamic}), unless it is a constructor function, in which case its return type is the immediately enclosing class.
+If a function does not declare a return type explicitly, its return type is \DYNAMIC{} (\ref{typeDynamic}),
+unless it is a constructor function, in which case its return type is the immediately enclosing class,
+or it is a setter or operator \code{[]=}, in which case its return type is \VOID{}.
 
 \LMHash{}
 Let $F$ be a function with required formal parameters $T_1$ $p_1 \ldots, T_n$ $p_n$, return type $T_0$ and no optional parameters.
@@ -1298,6 +1301,10 @@
 \LMHash{}
 It is a static warning if the return type of the user-declared operator \code{[]=} is explicitly declared and not \VOID{}.
 
+\commentary{
+If no return type is specified for a user-declared operator \code{[]=}, its return type is \VOID{} (\ref{typeOfAFunction}).
+}
+
 % add rationale: return in []= methods will have no effect, a the expression always returns its second argument (the RHS of the assignment, for consistency with assignment in general). So it's best to enforce this by declaring the method to be void, even though the expression that uses it returns an object with the type of the RHS, as described in \ref{assignment}.
 
 
@@ -1366,8 +1373,9 @@
   .
 \end{grammar}
 
-\LMHash{}
-If no return type is specified, the return type of the setter is \DYNAMIC{}.
+\commentary{
+If no return type is specified, the return type of the setter is \VOID{} (\ref{typeOfAFunction}).
+}
 
 \LMHash{}
 A setter definition that is prefixed with the \STATIC{} modifier defines a static setter.
@@ -3657,7 +3665,7 @@
 $(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1} = d_1, \ldots,  T_{n+k}$ $x_{n+k} = d_k])$ \ASYNC{} $=> e$
 is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow \code{Future<$flatten(T_0)$>}$, where $T_0$ is the static type of $e$and $flatten(T)$ is defined as follows:
 
-If $T = FuturOr<S>$ then $flatten(T) = S$.
+If $T = FutureOr<S>$ then $flatten(T) = S$.
 
 Otherwise if $T <: Future$ then let $S$ be a type such that $T << Future<S>$ and for all $R$, if $T << Future<R>$ then $S << R$.
 
diff --git a/docs/language/informal/instantiate-to-bound.md b/docs/language/informal/instantiate-to-bound.md
index a8fa628..d182dcb 100644
--- a/docs/language/informal/instantiate-to-bound.md
+++ b/docs/language/informal/instantiate-to-bound.md
@@ -1,61 +1,70 @@
 ## Feature: Instantiate to Bound
 
-Author: eernst@
+**Author**: eernst@
+
+**Version**: 0.5 (2018-01-11)
+
+**Status**: Under implementation.
 
 Based on [this description](https://github.com/dart-lang/sdk/issues/27526#issuecomment-260021397) by leafp@.
 
-**Status**: Under implementation. Remaining issue: Can a super-bounded
-type be created by instantiate to bound?
-
-**This document** is an informal specification of the the instantiate to bound
-mechanism in Dart 2. The feature described here, *instantiate to bound*, makes
-it possible to omit some or all actual type arguments in some types using
-generic classes. The missing type arguments will be added implicitly, and the
-chosen value for a given type argument will be the bound on the corresponding
-formal type parameter. In some situations no such bound can be expressed, in
-which case a compile-time error occurs. To resolve that, the type arguments
-can be given explicitly.
+**This document** is an informal specification of the the instantiate to
+bound mechanism in Dart 2. The feature described here, *instantiate to
+bound*, makes it possible to omit some or all actual type arguments in some
+types using generic classes. The missing type arguments will be added
+implicitly, and the chosen value for a given type argument will be the
+bound on the corresponding formal type parameter. In some situations no
+such bound can be expressed, in which case a compile-time error occurs. To
+resolve that, the type arguments can be given explicitly.
 
 ## Background
 
 In Dart 1.x, missing actual type arguments were filled in with the value
 `dynamic`, which was always a useful choice because that would yield types
-which were at the bottom of the set of similar types, as well as at the top.
+which were at the bottom of the set of similar types, as well as at the
+top.
+
 ```dart
 List xs = <int>[]; // OK, also dynamically: List<int> <: List<dynamic>.
 List<int> y = new List(); // OK, also dynamically: List<dynamic> <: List<int>.
 ```
+
 In Dart 2, type inference is used in many situations to infer missing type
 arguments, hence selecting values that will work in the given context.
-However, when the context does not provide any information to this inference
-process, some default choice must be made.
+However, when the context does not provide any information to this
+inference process, some default choice must be made.
 
 In Dart 2, `dynamic` is no longer a super- and subtype of all other types,
-and hence using `dynamic` as the default value for a missing actual
-type argument will create many malformed types:
+and hence using `dynamic` as the default value for a missing actual type
+argument will create many malformed types:
+
 ```dart
 class A<X extends num> {}
 A a = null; // A is malformed if interpreted as A<dynamic>.
 ```
-Hence, a new rule for finding default actual type arguments must be specified.
+
+Hence, a new rule for finding default actual type arguments must be
+specified.
 
 ## Motivation
 
-It is convenient for developers to be able to use a more concise notation for
-some types, and instantiate to bound will enable this.
+It is convenient for developers to be able to use a more concise notation
+for some types, and instantiate to bound will enable this.
 
-We will use a relatively simple mechanism which is allowed to fail. This means
-that developers will have to write actual type arguments explicitly in some
-ambiguous situations, thus adding visual complexity to the source code and
-requiring extra time and effort to choose and write those arguments. However,
-we consider the ability to reason straightforwardly about generic types in
-general more important than (possibly misleading) conciseness.
+We will use a relatively simple mechanism which is allowed to fail. This
+means that developers will have to write actual type arguments explicitly
+in some ambiguous situations, thus adding visual complexity to the source
+code and requiring extra time and effort to choose and write those
+arguments. However, we consider the ability to reason straightforwardly
+about generic types in general more important than (possibly misleading)
+conciseness.
 
-The performance characteristics of the chosen algorithm plays a role as well,
-because it is important to be able to find default type arguments in a short
-amount of time. Because of that, we have chosen to require explicit type
-arguments on bounds except for some "simple" cases. Again, this means that the
-source code will be somewhat more verbose, in return for overall simplicity.
+The performance characteristics of the chosen algorithm plays a role as
+well, because it is important to be able to find default type arguments in
+a short amount of time. Because of that, we have chosen to require explicit
+type arguments on bounds except for some "simple" cases. Again, this means
+that the source code will be somewhat more verbose, in return for overall
+simplicity.
 
 Here are some examples:
 
@@ -75,7 +84,7 @@
 
 class D<T extends Comparable<T>> {}
 
-// Error: no default type arguments can be computed for D.
+// The raw type D is completed to D<Comparable<dynamic>>.
 D x;
 
 // Error: T of D does not have a simple bound, so raw D cannot be a bound.
@@ -91,21 +100,24 @@
 ## Static analysis
 
 Let _G_ be a generic class with formal type parameter declarations
-_F1 .. Fk_ containing formal type parameters _X1 .. Xk_ and bounds _B1
-.. Bk_. We say that the formal type parameter _Xj_ has a _simple bound_
-when one of the following requirements is satisfied:
+_F<sub>1</sub> .. F<sub>k</sub>_ containing formal type parameters
+_X<sub>1</sub> .. X<sub>k</sub>_ and bounds
+_B<sub>1</sub> .. B<sub>k</sub>_. We say that the formal type parameter
+_X<sub>j</sub>_ has a _simple bound_ when one of the following requirements
+is satisfied:
 
-1. _Bj_ is omitted.
+1. _B<sub>j</sub>_ is omitted.
 
-2. _Bj_ is included, but does not contain any of _X1 .. Xk_. If _Bj_
-   contains a type _T_ on the form `qualified` (*for instance, `C` or
-   `p.D`*) which denotes a generic class _G1_ (*that is, _T_ is a raw
-   type*), every type argument of _G1_ has a simple bound.
+2. _B<sub>j</sub>_ is included, but does not contain any of _X<sub>1</sub>
+   .. X<sub>k</sub>_. If _B<sub>j</sub>_ contains a type _T_ on the form
+   `qualified` (*for instance, `C` or `p.D`*) which denotes a generic class
+   _G<sub>1</sub>_ (*that is, _T_ is a raw type*), every type argument of
+   _G<sub>1</sub>_ has a simple bound.
 
-The notion of a simple bound must be interpreted inductively rather
-than coinductively, i.e., if a bound _Bj_ of a generic class _G_ is
-reached during an investigation of whether _Bj_ is a simple bound,
-the answer is no.
+The notion of a simple bound must be interpreted inductively rather than
+coinductively, i.e., if a bound _B<sub>j</sub>_ of a generic class _G_ is
+reached during an investigation of whether _B<sub>j</sub>_ is a simple
+bound, the answer is no.
 
 *For example, with `class C<X extends C> {}` the type parameter `X` does
 not have a simple bound.*
@@ -114,10 +126,10 @@
 involved types to be "simple enough". We impose the following constraint on
 all bounds because any generic type may be used as a raw type.*
 
-It is a compile-time error if a formal parameter bound _B_ contains
-a type _T_ on the form `qualified` and _T_ denotes a generic class
-_G_ (*that is, _T_ is a raw type*), unless every formal type parameter of
-_G_ has a simple bound.
+It is a compile-time error if a formal parameter bound _B_ contains a type
+_T_ on the form `qualified` and _T_ denotes a generic class _G_ (*that is,
+_T_ is a raw type*), unless every formal type parameter of _G_ has a simple
+bound.
 
 *In short, type arguments on bounds can only be omitted if they themselves
 have simple bounds. In particular, `class C<X extends C> {}` is a
@@ -141,56 +153,94 @@
 bound would still be used in cases where no information is available to
 infer the omitted type arguments, e.g., for `List xs = [];`.*
 
-When type inference is providing actual type arguments for a term _G_ on
+*When type inference is providing actual type arguments for a term _G_ on
 the form `qualified` which denotes a generic class, instantiate to bound
-will provide the value for a single type argument in cases where no
-information is available for inferring such an actual type argument. In
-this situation, it is a compile-time error if instantiate to bound fails.
-
-In all these cases, instantiate to bound selects the value for an omitted
-actual type argument as follows:
+may be used to provide the value for type arguments where no information is
+available for inferring such an actual type argument. This document does
+not specify how inference interacts with instantiate to bound, that will be
+specified as part of the specification of inference. We will hence proceed
+to specify instantiate to bound as it applies to a type argument list which
+is omitted, such that a value for all the actual type arguments must be
+computed.*
 
 Let _T_ be a `qualified` term which denotes a generic class _G_ (*so _T_ is
-a raw type*), let _F1 .. Fk_ be the formal type parameter declarations in the
-declaration of _G_, with type parameters _X1 .. Xk_ and bounds _B1 .. Bk_
-with types _T1 .. Tk_, and let _j_ be the position of the actual type
-argument for which the selection will be made.
+a raw type*), let _F<sub>1</sub> .. F<sub>k</sub>_ be the formal type
+parameter declarations in the declaration of _G_, with type parameters
+_X<sub>1</sub> .. X<sub>k</sub>_ and bounds _B<sub>1</sub>
+.. B<sub>k</sub>_ with types _T<sub>1</sub> .. T<sub>k</sub>_. For _i_ in
+_1 .. k_, let _S<sub>i</sub>_ denote the result of performing instantiate
+to bound on the type in the bound, _T<sub>i</sub>_; in the case where
+_B<sub>i</sub>_ is omitted, let _S<sub>i</sub>_ be `dynamic`.
 
-If _Bj_ is omitted, the selected value for _Xj_ is `dynamic`.
+*Note that if _T<sub>i</sub>_ for some _i_ is raw then we know that all its
+omitted type arguments have simple bounds, which limits the complexity of
+the instantiate to bound step for _T<sub>i</sub>_.*
 
-Otherwise, if _Bj_ does not contain any of the formal type parameters
-_X1 .. Xk_, the selected value for _Xj_ is the result of performing
-instantiate to bound on the type in the bound, _Tj_.
+Instantiate to bound then computes an actual type argument list for _G_ as
+follows:
 
-*Note that if _Tj_ is raw then we know that all its omitted type arguments
-have simple bounds, which limits the complexity of the instantiate to bound
-step for _Tj_.*
+Let _U<sub>i,1</sub>_ be _S<sub>i</sub>_, for all _i_ in _1 .. k_. (*This
+is the "current value" of the bound for type variable _i_, at step 1; in
+general we will consider the current step, _m_, and use data for that step,
+e.g., the bound _U<sub>i,m</sub>_, to compute the data for step _m + 1_*).
 
-Otherwise, define the substitution _s_ as follows: for all _j_ in _1 .. k_,
-replace _Xj_ by the result of applying instantiate to bound on _Tj_. Now,
-repeatedly apply _s_ on the types in the bounds _T1 .. Tk_ until _Tj_ does
-not contain any of the formal type parameters _X1 .. Xk_.
+Let _--><sub>m</sub>_ be a relation among the type variables
+_X<sub>1</sub> .. X<sub>k</sub>_ such that
+_X<sub>p</sub> --><sub>m</sub> X<sub>q</sub>_ iff _X<sub>q</sub>_ occurs in
+_U<sub>p,m</sub>_ (*so each type variable is related to, that is, depends
+on, every type variable in its bound, possibly including itself*).
+Let _==><sub>m</sub>_ be the transitive closure of _--><sub>m</sub>_.
+For each _m_, let _U<sub>i,m+1</sub>_, for _i_ in _1 .. k_, be determined
+as follows:
 
-If this process terminates then the selected value is the final
-value of the bound in _Fj_. If it does not terminate, the instantiate
-to bounds process has failed.
+- Let _j_ be the lowest number such that
+  _X<sub>j</sub> ==><sub>m</sub> X<sub>j</sub>_ (*that is, such that this
+  type variable is a member of a dependency cycle*).
+  Let _{Y<sub>1</sub> .. Y<sub>p</sub>}_ be the the maximal subset
+  containing _X<sub>j</sub>_ of _{X<sub>1</sub> .. X<sub>k</sub>}_ where
+  every pair is related: _Y<sub>q</sub> ==><sub>m</sub> Y<sub>r</sub>_, for
+  all _q, r_ in _1 .. p_ (*i.e., this subset is a strongly connected
+  component in the dependency graph containing _X<sub>j</sub>_*).
+  Then _U<sub>i,m+1</sub>_ is the result of substituting, in
+  _U<sub>i,m</sub>_, `Null` for every contravariant occurrence
+  of _X<sub>j</sub>_, and `dynamic` for every covariant occurrence of
+  _X<sub>j</sub>_, for all _i_ in _1 .. k_ such that _X<sub>i</sub>_ is a
+  member of _{Y<sub>1</sub> .. Y<sub>p</sub>}_; and _U<sub>i,m+1</sub>_ is
+  _U<sub>i,m</sub>_, for all other _i_ in _1 .. k_.
+  *That is, we update the bounds of type variables in the dependency cycle
+  such that the type variables in the dependency cycle are replaced by
+  `Null` or `dynamic`, depending on the variance of the location.*
 
-*It can always be determined whether the process will terminate, because
-it always replaces each formal type parameter by a specific term, thus
-incrementally building a regular tree: If the bound in _Fj_ at some step
-_s_ contains some type parameter _Xm_, and it contains _Xm_ again at a
-later step _s+n_, then the process will not terminate. If no such
-repeated occurrence of a type parameter occurs then the process will
-terminate, because the set of formal type parameters is finite.*
+- Otherwise, (*if no such dependency cycle exists*) let _j_ be the
+  lowest number such that _X<sub>j</sub>_ occurs in
+  _U<sub>p,m</sub>_ for some _p_ and
+  _X<sub>j</sub> -/-><sub>m</sub> X<sub>q</sub>_ for all _q_ in _1..k_
+  (*that is, _U<sub>j,m</sub>_ is closed, that is, the current bound of
+  _X<sub>j</sub>_ does not depend on any other type variables; but
+  _X<sub>j</sub>_ is being depended on by the bounds of some other type
+  variables*). Then _U<sub>i,m+1</sub>_ is the result of substituting, in
+  _U<sub>i,m</sub>_, `Null` for every contravariant occurrence
+  of _X<sub>j</sub>_, and _U<sub>j,m</sub>_ for every covariant occurrence
+  of _X<sub>j</sub>_, for all _i_ in _1 .. k_.
 
-*Note that instantiate to bound will always fail if the bound
-on _Fj_ is an F-bound, e.g., `class A<T extends B<T>>`.*
+- Otherwise, (*when no dependencies exist*) terminate with the result
+  _&lt;U<sub>1,m</sub> ..., U<sub>k,m</sub>&gt;_.
+
+*This process will always terminate, because the total number of
+occurrences of type variables from _{X<sub>1</sub> .. X<sub>k</sub>}_ in
+the current bounds is strictly decreasing with each step, and we terminate
+when that number reaches zero.*
+
+*Note that this process may produce a
+[super-bounded type](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md).*
 
 When instantiate to bound is applied to a type it proceeds recursively: For
-a generic instantiation `G<T1..Tk>` it is applied to `T1..Tk`; for
-a function type `T0 Function(T1..Tj, {Tj+1 xj+1 .. Tk xk})` and
-a function type `T0 Function(T1..Tj, [Tj+1 .. Tk])` it is applied
-to `T0..Tk`.
+a generic instantiation _G<T<sub>1</sub> .. T<sub>k</sub>>_ it is applied
+to _T<sub>1</sub> .. T<sub>k</sub>_; for a function type
+_T<sub>0</sub> Function(T<sub>1</sub> .. T<sub>j</sub>, {T<sub>j+1</sub> x<sub>1</sub> .. T<sub>k</sub> x<sub>j+k</sub>})_
+and a function type
+_T<sub>0</sub> Function(T<sub>1</sub> .. T<sub>j</sub>, [T<sub>j+1</sub> .. T<sub>j+k</sub>])_
+it is applied to _T<sub>0</sub> .. T<sub>j+k</sub>_.
 
 *This means that instantiate to bound has no effect on a type that does not
 contain any raw types; conversely, instantiate to bound will act on types
@@ -199,34 +249,24 @@
 
 ## Dynamic semantics
 
-There is no separate dynamic semantics for this mechanism. The semantics
-of a given program _P_ is the semantics of the program _P'_ which is
-created from _P_ by applying instantiate to bound where applicable.
-
-
-## Discussion
-
-A more complex algorithm was considered, possibly involving support for
-recursive (infinite) types. For example:
-
-```dart
-// A global dependency: F and G could be in different libraries.
-class F<T extends G> {}
-class G<T extends F> {}
-```
-
-In this case, instantiating the bounds to the infinite terms
-`G<F<G<F<G<F<...>>>>>>` and `F<G<F<G<F<G<...>>>>>>` would be a consistent
-solution, which could be justified by means of a coinductive
-interpretation of what it means to be a 'simple bound'. However, we do not
-expect solutions to this kind of challenge to be sufficiently useful
-(if even possible) to justify the added complexity, both with respect to
-comprehensibility for human readers, and with respect to the performance
-of tools.
+The instantiate to bound transformation which is specified in the static
+analysis section is used to provide type arguments to dynamic invocations
+of generic functions, when no actual type arguments are passed. Otherwise,
+the semantics of a given program _P_ is the semantics of the program _P'_
+which is created from _P_ by applying instantiate to bound where
+applicable.
 
 
 ## Updates
 
+*   Jan 11th 2018, version 0.5: Revised treatment of variance based on
+    strongly connected components in the dependency graph.
+
+*   Dec 13th 2017: Revised to allow infinite substitution sequences when the
+    value of a type argument is computed, specifying how to detect that
+    the substitution sequence is infinite, and how to obtain a result from
+    there.
+
 *   Sep 15th 2017: Transferred to the SDK repository as
     [instantiate-to-bound.md](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md).
 
diff --git a/docs/language/informal/super-bounded-types.md b/docs/language/informal/super-bounded-types.md
new file mode 100644
index 0000000..028db60
--- /dev/null
+++ b/docs/language/informal/super-bounded-types.md
@@ -0,0 +1,553 @@
+## Feature: Super-bounded Types
+
+**Author**: eernst@.
+
+**Version**: 0.5 (2018-01-11).
+
+**Status**: Under discussion.
+
+**This document** is an informal specification of the support in Dart 2 for
+using certain generic types where the declared bounds are violated. The
+feature described here, *super-bounded types*, consists in allowing an
+actual type argument to be a supertype of the declared bound, as long as a
+consistent replacement of `Object`, `dynamic`, and `void` by `Null`
+produces a traditional, well-bounded type. For example, if a class `C`
+takes a type argument `X` which must extend `C<X>`, `C<Object>`,
+`C<dynamic>`, and `C<void>` are correct super-bounded types. This is useful
+because there is no other way to specify a type which retains the knowledge
+that it is a `C` based type, and at the same time it is a supertype of
+`C<T>` for all the `T` that satisfy the specified bound. In other words, it
+allows developers to specify that they want to work with a `C<T>`, except
+that they don't care which `T`, and _every_ such `T` must be allowed.
+
+This permission to use a super-bounded type is only granted in some
+situations. For instance, super-bounded types are allowed as type
+annotations, but they are not allowed in instance creation expressions like
+`new C<Object>()` (assuming that `Object` violates the bound of
+`C`). Similarly, a function declared as
+```dart
+void foo<X extends List<num>>(X x) {
+  ...
+}
+```
+cannot be invoked with `foo<List<dynamic>>('Hello!')`, nor can the type
+argument be inferred to `List<dynamic>` in an invocation like
+`foo('Hello!')`. But `C<void> x = new C<int>();` is OK, and so is
+`x is C<Object>`.
+
+
+## Motivation
+
+Many well-known classes have a characteristic typing structure:
+```dart
+abstract class num implements Comparable<num> {...}
+class Duration implements Comparable<Duration> {...}
+class DateTime implements Comparable<DateTime> {...}
+...
+```
+The class `Comparable<T>` has a method `int compareTo(T other)`,
+which makes it possible to do things like this:
+```dart
+int comparison = a.compareTo(b);
+```
+This works fine when `a` and `b` both have type `num`, or both have type
+`Duration`, but it is not so easy to describe the situation where the
+comparable type can vary. For instance, consider the following:
+```dart
+class ComparablePair<X extends Comparable<X>> {
+  X a, b;
+}
+
+main() {
+  ComparablePair<MysteryType> myPair = ...
+  int comparison = myPair.a.compareTo(myPair.b);
+}
+```
+We could replace `MysteryType` by `num` and then work on pairs
+of `num` only. But can we find a type to replace `MysteryType` such
+that `myPair` can hold an instance of `ComparablePair<T>`, no matter
+which `T` it uses?
+
+We would need a supertype of all those `T` where
+`T extends Comparable<T>`; but we cannot use the obvious ones like
+`Object` or `dynamic`, because they do not satisfy the declared
+bound for the type argument to `ComparablePair`. There is in fact no such
+type in the Dart type system!
+
+This is an issue that comes up in various forms whenever a type parameter
+bound uses the corresponding type variable itself (or multiple type
+parameters mutually depend on each other), that is, whenever we have one
+or more _F-bounded_ type parameters. Here is an example which is concise
+and contains the core of the issue:
+```dart
+class C<X extends C<X>> {
+  X next;
+}
+```
+For each given type `T` it is possible to determine whether `T` is a
+subtype of `C<T>`, in which case that `T` would be an admissible actual
+type argument for `C`. This means that the set of possible values for `X`
+is a well-defined set.
+
+However, there is no type `S` such that the set of possible values for `X`
+is equal to the set of subtypes of `S`; that is, the set of types we seek
+to express is not the set of subtypes of anything. Sure, those types are a
+subset of all subtypes of `Object`, but we need to express that _exact_ set
+of types, not a superset.
+
+Hence, we cannot correctly characterize "all possible values for `X`" as a
+single type argument. This means that we cannot find a `U` such that `C<U>`
+is the least upper bound of all possible types on the form `C<T>`.
+
+But that's exactly what we _must_ find, if we are to safely express the
+greatest possible amount of information about the set of objects whose type
+is on the form `C<T>` for some `T`. In particular, we cannot express the
+type which "should be" the result of
+[instantiate-to-bound](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md)
+on the raw type `C`.
+
+We can make an attempt to approximate the least supertype of all correct
+generic instantiations of `C` (that is, a supertype of all types on the
+form `C<T>`). Assume that `T` is an admissible actual type argument for
+`C` (that is, we can rely on `T extends C<T>`):
+```dart
+// Because `T extends C<T>`, and due to generic covariance:
+C<T>  <:  C<C<T>>
+
+// Same facts used on the nested type argument `T`:
+C<C<T>>  <:  C<C<C<T>>> ...
+
+// Same at the next level ...
+C<C<C<T>>>  <:  C<C<C<C<T>>>>
+...
+```
+We can continue ad infinitum, and this means that a good candidate for the
+"least upper bound of all `C<T>`" would be the infinite type `W` where
+`W = C<W>`. Basically, `W = C<C<C<C<C<C<...>>>>>>`, nesting to an
+infinite depth.
+
+Note that `T` "disappears" when we extend the nesting ad infinitum, which
+means that `W` is the result we find for _every_ `T`. Conversely, we cannot
+hope to find a different type `V` (not equal to `C<R>` for any `R`) such
+that `V` is both a supertype of all types on the form `C<T>` for some `T`
+and `V` is a proper subtype of `W`. In other words, if the "least upper
+bound of all `C<T>`" exists, it must be `W`.
+
+However, we do not wish to introduce these infinite types into the Dart
+type universe. The ability to express types on this form will
+inevitably introduce the ability to express many new kinds of types, and we
+do not expect this generalization to improve the expressive power of the
+language in a manner that compensates sufficiently for the burden of
+managing the added complexity.
+
+Instead, we give developers the responsibility to make the choice
+explicitly: They can use super-bounded types to express a range of
+supertypes of these infinite types (as well as other types, if they
+wish). When they do that with an infinite type, they can make the choice to
+unfold it exactly as many times as they want. At the same time, they will
+be forced to maintain a greater level of awareness of the nature of these
+types than they would, had we chosen to model infinite types, e.g., by
+unfolding them to some specific, finite level.
+
+Here are some examples of finite unfoldings, and the effect they have on
+types of expressions:
+```dart
+class C<X extends C<X>> {
+  X next;
+  C(this.next);
+}
+
+class D extends C<D> {
+  D(D next): super(next);
+}
+
+main() {
+  D d = new D(new D(null));
+  C<dynamic> c0 = d;
+  C<C<dynamic>> c1 = d;
+  C<C<C<dynamic>>> c2 = d;
+
+  c0.next.unknown(42); // Statically OK, `c0.next` is `dynamic`.
+  c1.next.unknown(43); // Compile-time error.
+  c1.next.next.unknown(44); // Statically OK.
+  c2.next.next.unknown(45); // Compile-time error.
+  c2.next.next.next.unknown(46); // Statically OK.
+
+  // With type `D`, the static analysis is aware of the cyclic
+  // structure of the type, and every level of nesting is handled
+  // safely. But `D` may be less useful because there may be a
+  // similar type `D2`, and this code will only work with `D`.
+  d.next.next.next.next.next.next.next.unknown(46); // Compile-time error.
+}
+```
+We can make a choice of how to deal with the missing type information. When
+we use `C<dynamic>`, `C<C<dynamic>>` and `C<C<C<dynamic>>>` we will
+implicitly switch to dynamic member access after a few steps of
+navigation.
+
+If we choose to use `C<Object>`, `C<C<Object>>` and so on then we will have
+to use explicit downcasts in order to access all non-`Object` members. We
+will still be able to pass `c0.next` as an argument to a function expecting
+a `C<S>` (where `S` can be anything), but we could also pass it where a
+`String` is expected, etc.
+
+Finally, if we choose to use `C<void>` and so on then we will not even be
+able to access the object where the type information ends: we cannot use
+the value of an expression like `c0.next` at all without an explicit
+cast. This means that we cannot pass `c0.next` as an argument to a function
+that accepts a `C<S>` (for any `S`) without an explicit cast.
+
+In summary, the choice of `dynamic`, `Object`, and `void` offers a range of
+approaches to the lack of typing information, but the amount of information
+remains the same.
+
+
+## Syntax
+
+This feature does not require any modifications to the Dart grammar.
+
+
+## Static analysis
+
+We say that the parameterized type _G<T<sub>1</sub>..T<sub>k</sub>>_ is
+_regular-bounded_ when _T<sub>j</sub> <: [T<sub>1</sub>/X<sub>1</sub> ..
+T<sub>k</sub>/X<sub>k</sub>]B<sub>j</sub>_ for all _j_, _1 <= j <= k_,
+where _X<sub>1</sub>..X<sub>k</sub>_ are the formal type parameters of _G_
+in declaration order, and _B<sub>1</sub>..B<sub>k</sub>_ are the
+corresponding upper bounds.
+
+*This means that each actual type argument satisfies the declared upper
+bound for the corresponding formal type parameter.*
+
+We extend covariance for generic class types such that it can be used also
+in cases where a type argument violates the corresponding bound.
+
+*For instance, assuming the classes `C` and `D` as declared in the
+Motivation section, `C<D>` is a subtype of `C<Object>`. This is new because
+`C<Object>` used to be a compile-time error, which means that no questions
+could be asked about its properties. Note that this is a straightforward
+application of the usual covariance rule: `C<D> <: C<Object>` because
+`D <: Object`. We need this relaxation of the rules in order to be able to
+define which violations of the declared bounds are admissible.*
+
+Let _G_ denote a generic class, _X<sub>1</sub>..X<sub>k</sub>_ the formal
+type parameters of _G_ in declaration order, and
+_B<sub>1</sub>..B<sub>k</sub>_ the types in the corresponding upper bounds,
+using `Object` when the upper bound is omitted. The parameterized type
+_G&lt;T<sub>1</sub>..T<sub>k</sub>&gt;_ is then a _super-bounded type_
+iff the following two requirements are satisfied:
+
+1.   There is a _j_, _1 <= j <= k_, such that _T<sub>j</sub>_ is not a
+     subtype of
+     _[T<sub>1</sub>/X<sub>1</sub>..T<sub>k</sub>/X<sub>k</sub>]B<sub>j</sub>_.
+
+2.   Let _S<sub>j</sub>_, _1 <= j <= k_, be the result of replacing every
+     covariant occurrence of `Object`, `dynamic`, and `void` in
+     _T<sub>j</sub>_ by `Null`, and every contravariant occurrence of `Null`
+     by `Object`. It is then required that
+     _S<sub>j</sub> &lt;:
+     [S<sub>1</sub>/X<sub>1</sub>..S<sub>k</sub>/X<sub>k</sub>]B<sub>j</sub>_
+     for all _j_, _1 <= j <= k_.
+
+*In short, at least one type argument violates its bound, and the type is
+regular-bounded after replacing all occurrences of an extreme type by the
+opposite extreme type, according to their variance.*
+
+*For instance, assuming the declarations of `C` and `D` as in the
+Motivation section, `C<Object>` is a super-bounded type, because `Object`
+violates the declared bound and `C<Null>` is regular-bounded.*
+
+*Here is an example that involves contravariance:*
+
+```dart
+class E<X extends void Function(X)> {}
+```
+
+*With this declaration, `E<void Function(Null)>` is a super-bounded type
+because `E<void Function(Object)>` is a regular-bounded type. Note that
+the contravariance can also be eliminated, yielding a simpler super-bounded
+type: `E<dynamic>` is a super-bounded type because `E<Null>` is a
+regular-bounded type.*
+
+We say that a parameterized type _T_ is _well-bounded_ if it is
+regular-bounded or super-bounded.
+
+*Note that it is possible for a super-bounded type to be nested in another
+type which is super-bounded, and it can also be nested in another type
+which is not super-bounded. For example, assuming `C` as in the Motivation
+section, `C<C<Object>>` is a super-bounded type which contains a
+super-bounded type; in contrast, `List<C<Object>>` is a regular type (a
+generic instantiation of `List`) which contains a super-bounded type
+(`C<Object>`).*
+
+It is a compile-time error if a parameterized type is not well-bounded.
+
+*That is, a parameterized type is regular-bounded, or it is super-bounded,
+or it is an error. This rule replaces and relaxes the rule in the language
+specification that constrains parameterized types to be regular-bounded.*
+
+It is a compile-time error if a type used as the type in an instance
+creation expression (*that is, the `T` in expressions of the form
+`new T(...)`, `new T.id(...)`, `const T(...)`, or `const T.id(...)`*)
+is super-bounded. It is a compile-time error if the type in a redirection
+of a redirecting factory constructor (*that is, the `T` in a phrase of the
+form `T` or `T.id` after `=` in the constructor declaration*) is
+super-bounded. It is a compile-time error if a super-bounded type is
+specified as a superinterface for a class. (*This implies that a
+super-bounded type cannot appear in an `extends`, `implements`, or
+`with` clause, or in a mixin application; e.g., `T` in
+`class C = T with M;` cannot be super-bounded*). Finally, it is a
+compile-time error if a bound in a formal type parameter declaration is
+super-bounded.
+
+*This means that we allow super-bounded types as function return types, as
+type annotations on variables (all of them: library, static, instance, and
+local variables, and formal parameters of functions), in type tests
+(`e is T`), in type casts (`e as T`), in `on` clauses, and as type
+arguments.*
+
+Let _F_ denote a parameterized type alias, _X<sub>1</sub>..X<sub>k</sub>_ the
+formal type parameters of _F_ in declaration order, and
+_B<sub>1</sub>..B<sub>k</sub>_ the types in the corresponding upper bounds,
+using `Object` when the upper bound is omitted. The parameterized type
+_F&lt;T<sub>1</sub>..T<sub>k</sub>&gt;_ is then a _super-bounded type_
+iff the following three requirements are satisfied:
+
+1.   There is a _j_, _1 <= j <= k_, such that _T<sub>j</sub>_ is not a
+     subtype of
+     _[T<sub>1</sub>/X<sub>1</sub>..T<sub>k</sub>/X<sub>k</sub>]B<sub>j</sub>_.
+
+2.   Let _S<sub>j</sub>_, _1 <= j <= k_, be the result of replacing every
+     covariant occurrence of `Object`, `dynamic`, and `void` in
+     _T<sub>j</sub>_ by `Null`, and every contravariant occurrence of `Null`
+     by `dynamic`. It is then required that
+     _S<sub>j</sub> &lt;:
+     [S<sub>1</sub>/X<sub>1</sub>..S<sub>k</sub>/X<sub>k</sub>]B<sub>j</sub>_
+     for all _j_, _1 <= j <= k_.
+
+3.   Let _T_ be the right hand side of the declaration of _F_, then
+     _[T<sub>1</sub>/X<sub>1</sub>..T<sub>k</sub>/X<sub>k</sub>]T_ is a
+     well-bounded type.
+
+*In short, a parameterized type based on a type alias, `F<...>`, must pass the
+super-boundedness checks in itself, and so must the body of `F`.*
+
+*For instance, assume that `F` and `G` are declared as follows:*
+```dart
+class A<X extends C<X>> {
+  ...
+}
+
+typedef F<X extends C<X>> = A<X> Function();
+typedef G<X extends C<X>> = void Function(A<X>);
+```
+*The type `F<Object>` is then a super-bounded type, because `F<Null>` is
+regular-bounded (`Null` is a subtype of `C<Null>`) and because
+`A<Object> Function()` is well-bounded, because `A<Object>` is
+super-bounded. Similarly, `G<Object>` is a super-bounded type because
+`void Function(A<Object>)` is well-bounded because `A<Object>` is
+super-bounded.*
+
+*The subtype relations for super-bounded types follow directly from the
+extension of generic covariance to include actual type arguments that
+violate the declared bounds. For the example in the Motivation section, `D`
+is a subtype of `C<D>` which is a subtype of `C<C<D>>`, which is a subtype
+of `C<C<C<D>>>`, continuing with `C<C<C<Object>>>>`, `C<C<Object>>`,
+`C<Object>`, and `Object`, respectively, and similarly for `dynamic` and
+`void`.*
+
+Types of members from super-bounded class types are computed using the same
+rules as types of members from other types. Types of function applications
+involving super-bounded types are computed using the same rules as types of
+function applications involving other types.
+
+*For instance, using the example class `C` again, if `c1` has static type
+`C<C<dynamic>>` then `c1.next` has static type `C<dynamic>` and
+`c1.next.next` has static type `dynamic`. Similarly, if `List<X> foo(X)`
+were the signature of a method in `C`, `c1.foo` would have static type
+`List<C<dynamic>> Function(C<dynamic>)`. Note that the argument type `X`
+makes that parameter of `foo` covariant, which implies that the reified
+type of the tear-off `c1.foo` would have argument type `Object`, which
+ensures that the expression `c1.foo` evaluates to a value whose dynamic
+type is a subtype of the static type, as it should.*
+
+*Similarly, if we invoke an instance method with statically known argument
+type `C<void>` whose argument is covariant, there will be a dynamic type
+check on the actual argument (which might require that it is, say, of type
+`D`); that check may fail at run time, but this is no different from the
+situation with types that are not super-bounded. In general, the
+introduction of super-bounded types does not introduce new soundness
+considerations around covariance.*
+
+*Super-bounded function types do not have to be only in the statically
+known types of first class functions, they can also be part of the actual
+type of a function at run time.  For instance, a function may be declared
+as follows:*
+
+```dart
+List<C<dynamic>> foo(C<dynamic> x) {
+  ...
+}
+```
+
+*It would then have type exactly `List<C<dynamic>> Function(C<dynamic>)`,
+and this means that it will accept an object which is an instance of a
+subtype of `C<T>` for any `T`, and it will return a list whose element type
+is some subtype of `C<dynamic>`, which could be `D` or `C<C<D>>` at run
+time.*
+
+
+## Dynamic semantics
+
+The reification of a super-bounded type (*e.g., as a parameter type in a
+reified function type*) uses the types as specified.
+
+*For instance `void foo(C<Object> x) => print(x);` will have reified type
+`void Function(C<Object>)`. It is allowed for a run-time entity to have a
+type which contains a super-bounded type, it is only prohibited for
+run-time entities to have a super-bounded type themselves. So there can be
+an instance whose dynamic type is `List<C<Object>>` but no instance whose
+dynamic type is `C<Object>`.*
+
+The subtype rules used for run-time type tests, casts, and generated type
+checks are the same as the subtype rules used during static analysis.
+
+*If an implementation applies an optimization that is only valid when
+super-bounded types cannot exist, or in other ways relies on the (no longer
+valid) assumption that super-bounded types cannot exist, it will need to
+stop using that optimization or making that assumption. We do not expect
+this to be a common situation, nor do we expect significant losses in
+performance due to the introduction of this feature.*
+
+
+## Discussion
+
+The super-bounded type feature is all about violating bounds, in a
+controlled manner. But what is the **motivation for enforcing bounds** in
+the first place? The answer to that question serves to justify why it must
+be 'controlled'. We have at least two reasons, one internal and one
+external.
+
+The **internal reason** is that the bound of each formal type parameter is
+relied upon during type checking of the body of the corresponding generic
+declaration. For instance:
+```dart
+class C<X extends num> {
+  X x;
+  bool get foo => x.isNegative; // Statically safe invocation.
+}
+```
+If we ever allow an instance of `C<Object>` to be created, or even an
+instance of a subclass which has `C<Object>` as a (possibly indirect)
+superclass, then we could end up executing that implementation of `foo` in
+a situation where `x` does not have an `isNegative` getter. In other words,
+the internal issue is that super-bounding may induce a plain soundness
+violation in the scope of the type parameter.
+
+This motivates the ban on super-bounding in instance creation expressions,
+e.g., the ban on `new C<Object>()`.
+
+However, it does not suffice to justify banning super-bounded `implements`
+clauses: There will not be any inherited method implementations from a type
+that a given class implements, and hence no code will ever be executed in
+the above situation (where a formal type parameter is in scope, and its
+actual value violates the bound). In fact, code which could be executed in
+this context would have static knowledge of the super-bound, and hence
+there is no soundness issue in the body of such a class, nor in its
+subclasses or subtypes.
+
+```dart
+// A thought experiment (explaining why this is a compile-time error).
+class D implements C<Object> {
+  Object x;
+  bool get foo => false;
+}
+```
+
+It is reasonable to expect a `C<Object>` to have a field `x` of type
+`Object` and a `foo` getter of type `bool`, and we can easily implement
+that. There is no soundness issue, because no code is inherited from `C`.
+
+But there is also an **external reason**: It is reasonable to expect that
+every instance will satisfy declared bounds, e.g., whenever an object is
+accessed under the type `C<T>` for any `T`, it should be true that `T` is a
+subtype of `num`. This is not a soundness issue per se; the class `D` is
+perfectly consistent in its behavior with a typing as `C<Object>`, and its
+implementation is type safe.
+
+However, it seems reasonable for developers to reckon as follows: When an
+object _o_ has a static type like `C<Object>` it must satisfy the
+expectations associated with `C`. So there exists an actual type argument
+`T` which satisfies the declared bound, and _o_ must then behave like an
+instance of `C<T>`. In the example, with the given bound `num` and using
+covariance, _o_ would then be guaranteed to be typable as a `C<num>`. So
+the following contains downcasts, but it is "reasonable" to expect them to
+be guaranteed to succeed at run time:
+
+```dart
+C<Object> cObject = ...; // Complex creation.
+C<num> cNum = cObject; // Safe, right?
+bool b = (cObject.x as num).isNegative; // Also safe, right?
+```
+
+If `D` is allowed to exist then we can have a consistent language, and the
+above would be OK, but the "safe" downcasts would in fact fail at run
+time. The point is that when we know something is a `C<Object>` then we know
+that it satisfies the constraints of `C<Object>`, and we can't assume that
+it satisfies any stronger constraints (such as those of `C<num>`).
+
+This is not a soundness issue in the traditional sense, but it is an issue
+about how important it is to **allow** developers to make that **extra
+assumption** that all implementations of a given generic class _G_ must be
+just as picky about their actual type arguments as _G_ itself.
+
+We think that it is indeed justified to make these extra assumptions, and
+**hence** we have **banned super-bounded `implements` clauses**.
+
+The extra assumptions which are now supported could be stated as: We can
+rely on the declared bounds on type parameters of generic classes and
+functions, also for code which is outside the scope of those type
+parameters.
+
+In short, the underlying principle is that "there cannot be an instance of
+a generic class (including instances of subtypes), nor an invocation of a
+generic function, whose actual type arguments violate the declared
+bounds".
+
+Super-bounded function types are possible and useful. Consider the
+following example:
+```dart
+// If bound on `X` holds then `C<X>` is regular-bounded.
+typedef F<X extends C<X>> = C<X> Function();
+
+main() {
+  F<C<dynamic>> f = ...; // OK, checking `F<C<Null>>` and `C<dynamic> Function()`.
+  var c0 = f(); // `c0` has type `C<C<dynamic>>`.
+  var c1 = c0.next; // `c1` has type `C<dynamic>`
+  var c2 = c1.next; // `c2` has type `dynamic`
+  ...
+}
+```
+In this example, an unfolding of `C` to a specific level is supported in a
+function type, and application of such a function immediately brings out
+class types like `C<C<dynamic>>` that we have already argued are useful.
+
+
+## Updates
+
+*   Version 0.5 (2018-01-11), generalized to allow replacement of top types
+    covariantly and bottom types contravariantly. Introduced checks on
+    parameterized type aliases (such that bounds declared for the type
+    alias itself are taken into account).
+
+*   Version 0.4 (2017-12-14), clarified several points and corrected
+    locations where super-bounded types were prohibited, but we should just
+    say that the bounds must be satisfied.
+
+*   Version 0.3 (2017-11-07), dropping `super`, instead allowing `Object`,
+    `dynamic`, or `void` for super-bounded types, with a similar treatment as
+    `super` used to get.
+
+*   Version 0.2 (2017-10-31), introduced keyword `super` as a type argument.
+
+*   Version 0.1 (2017-10-20), initial version of this informal specification.
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index 815fe24..ae06bdf 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -68,7 +68,7 @@
         help: 'Run a quick version of the benchmark. This is not useful for '
             'gathering accurate times,\nbut can be used to validate that the '
             'benchmark works.');
-    argParser.addFlag('preview-dart-2',
+    argParser.addFlag('use-cfe',
         negatable: false,
         help: 'Benchmark against the Dart 2.0 front end implementation.');
     argParser.addOption('repeat',
@@ -96,7 +96,7 @@
     final String benchmarkId = argResults.rest.first;
     final int repeatCount = int.parse(argResults['repeat']);
     final bool quick = argResults['quick'];
-    final bool previewDart2 = argResults['preview-dart-2'];
+    final bool useCFE = argResults['use-cfe'];
     final bool verbose = argResults['verbose'];
 
     final Benchmark benchmark =
@@ -118,7 +118,7 @@
       for (int iteration = 0; iteration < actualIterations; iteration++) {
         BenchMarkResult newResult = await benchmark.run(
           quick: quick,
-          previewDart2: previewDart2,
+          useCFE: useCFE,
           verbose: verbose,
         );
         print('  $newResult');
@@ -149,7 +149,7 @@
 
   Future<BenchMarkResult> run({
     bool quick: false,
-    bool previewDart2: false,
+    bool useCFE: false,
     bool verbose: false,
   });
 
diff --git a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
index f035551..7640ff1 100644
--- a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
+++ b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
@@ -28,7 +28,7 @@
   @override
   Future<BenchMarkResult> run({
     bool quick: false,
-    bool previewDart2: false,
+    bool useCFE: false,
     bool verbose: false,
   }) async {
     if (!quick) {
@@ -38,7 +38,7 @@
     Stopwatch stopwatch = new Stopwatch()..start();
 
     AnalysisServerMemoryUsageTest test = new AnalysisServerMemoryUsageTest();
-    await test.setUp(previewDart2: previewDart2);
+    await test.setUp(useCFE: useCFE);
     await test.subscribeToStatusNotifications();
     await test.sendAnalysisSetAnalysisRoots(getProjectRoots(quick: quick), []);
     await test.analysisFinished;
@@ -73,7 +73,7 @@
   @override
   Future<BenchMarkResult> run({
     bool quick: false,
-    bool previewDart2: false,
+    bool useCFE: false,
     bool verbose: false,
   }) async {
     Stopwatch stopwatch = new Stopwatch()..start();
@@ -82,7 +82,7 @@
     if (verbose) {
       test.debugStdio();
     }
-    await test.setUp(previewDart2: previewDart2);
+    await test.setUp(useCFE: useCFE);
     await test.subscribeToStatusNotifications();
     await test.sendAnalysisSetAnalysisRoots(getProjectRoots(quick: quick), []);
     await test.analysisFinished;
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index 1971bf5..ed9a3d1 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -55,7 +55,7 @@
    * The server is automatically started before every test.
    */
   @override
-  Future setUp({bool previewDart2: false}) {
+  Future setUp({bool useCFE: false}) {
     onAnalysisErrors.listen((AnalysisErrorsParams params) {
       currentAnalysisErrors[params.file] = params.errors;
     });
@@ -70,7 +70,7 @@
     });
     return startServer(
       servicesPort: vmServicePort,
-      previewDart2: previewDart2,
+      cfe: useCFE,
     ).then((_) {
       server.listenToOutput(dispatchNotification);
       server.exitCode.then((_) {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index bd4e9c9..2108ce0 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -363,7 +363,7 @@
         new PluginWatcher(resourceProvider, pluginManager);
 
     defaultContextOptions.generateImplicitErrors = false;
-    defaultContextOptions.useFastaParser = options.previewDart2;
+    defaultContextOptions.useFastaParser = options.useCFE;
 
     {
       String name = options.newAnalysisDriverLog;
@@ -1122,9 +1122,14 @@
   CrashReportSender crashReportSender;
 
   /**
-   * Whether to enable the Dart 2.0 Front End.
+   * Whether to enable the Dart 2.0 preview.
    */
   bool previewDart2 = false;
+
+  /**
+   * Whether to enable the Dart 2.0 Common Front End implementation.
+   */
+  bool useCFE = false;
 }
 
 /**
@@ -1340,6 +1345,7 @@
     builder.byteStore = analysisServer.byteStore;
     builder.fileContentOverlay = analysisServer.fileContentOverlay;
     builder.previewDart2 = analysisServer.options.previewDart2;
+    builder.useCFE = analysisServer.options.useCFE;
     return builder;
   }
 
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index cf271e5..272498f 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -364,7 +364,6 @@
   /**
    * Return a list of all of the plugins that are currently known.
    */
-  @visibleForTesting
   List<PluginInfo> get plugins => _pluginMap.values.toList();
 
   /**
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 039d508..594ca15 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -262,11 +262,16 @@
   static const String CACHE_FOLDER = "cache";
 
   /**
-   * Whether to enable the Dart 2.0 Front End.
+   * Whether to enable the Dart 2.0 preview.
    */
   static const String PREVIEW_DART2 = "preview-dart-2";
 
   /**
+   * Whether to enable the Dart 2.0 Common Front End implementation.
+   */
+  static const String USE_CFE = "use-cfe";
+
+  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -312,6 +317,7 @@
     analysisServerOptions.clientVersion = results[CLIENT_VERSION];
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     analysisServerOptions.previewDart2 = results[PREVIEW_DART2];
+    analysisServerOptions.useCFE = results[USE_CFE];
 
     ContextBuilderOptions.flutterRepo = results[FLUTTER_REPO];
 
@@ -537,8 +543,9 @@
         defaultsTo: "as-is");
     parser.addOption(CACHE_FOLDER,
         help: "[path] path to the location where to cache data");
-    parser.addFlag(PREVIEW_DART2,
-        help: "Enable the Dart 2.0 Front End implementation.");
+    parser.addFlag(PREVIEW_DART2, help: "Enable the Dart 2.0 preview");
+    parser.addFlag(USE_CFE,
+        help: "Enable the Dart 2.0 Common Front End implementation");
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index a43d978..e11f938 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/generated/source.dart' show Source, SourceRange;
-import 'package:meta/meta.dart';
 
 /**
  * A [SearchEngine] implementation.
@@ -134,7 +133,6 @@
   }
 }
 
-@visibleForTesting
 class SearchMatchImpl implements SearchMatch {
   @override
   final String file;
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 5eb1038..e43652e 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -1169,6 +1169,8 @@
     h3('Status');
     buf.writeln(writeOption('Preview-dart-2',
         diagnosticsSite.socketServer.analysisServerOptions.previewDart2));
+    buf.writeln(writeOption('Use common front end',
+        diagnosticsSite.socketServer.analysisServerOptions.useCFE));
     buf.writeln(writeOption('Instrumentation enabled',
         AnalysisEngine.instance.instrumentationService.isActive));
     buf.writeln(writeOption('Server process ID', pid));
diff --git a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
index 4fc4eb1..9b0a08f 100644
--- a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
@@ -14,7 +14,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../analysis_abstract.dart';
-import '../mocks.dart';
 
 main() {
   defineReflectiveSuite(() {
diff --git a/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart b/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
index 8cfbfad..c3f7d6bb 100644
--- a/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
@@ -12,7 +12,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../analysis_abstract.dart';
-import '../mocks.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -37,7 +36,7 @@
 
   Future<Null> prepareAnalyzedFiles() async {
     addGeneralAnalysisSubscription(GeneralAnalysisService.ANALYZED_FILES);
-    await pumpEventQueue();
+    await pumpEventQueue(times: 5000);
   }
 
   void processNotification(Notification notification) {
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index 161eb85..dbe5ac0 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -16,7 +16,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../analysis_abstract.dart';
-import '../mocks.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -76,7 +75,7 @@
 import 'does_not_exist.dart';
 ''');
     await waitForTasksFinished();
-    await pumpEventQueue();
+    await pumpEventQueue(times: 5000);
     List<AnalysisError> errors = filesErrors[testFile];
     // Verify that we are generating only 1 error for the bad URI.
     // https://github.com/dart-lang/sdk/issues/23754
@@ -139,7 +138,7 @@
     createProject();
     addTestFile('library lib');
     await waitForTasksFinished();
-    await pumpEventQueue();
+    await pumpEventQueue(times: 5000);
     List<AnalysisError> errors = filesErrors[testFile];
     expect(errors, hasLength(1));
     AnalysisError error = errors[0];
@@ -192,7 +191,7 @@
 }
 ''');
     await waitForTasksFinished();
-    await pumpEventQueue();
+    await pumpEventQueue(times: 5000);
     List<AnalysisError> errors = filesErrors[testFile];
     expect(errors, hasLength(1));
     AnalysisError error = errors[0];
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 1f797a9..8c45789 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -249,44 +249,37 @@
   @override
   String get byteStorePath {
     fail('Unexpected invocation of byteStorePath');
-    return null;
   }
 
   @override
   InstrumentationService get instrumentationService {
     fail('Unexpected invocation of instrumentationService');
-    return null;
   }
 
   @override
   NotificationManager get notificationManager {
     fail('Unexpected invocation of notificationManager');
-    return null;
   }
 
   @override
   List<PluginInfo> get plugins {
     fail('Unexpected invocation of plugins');
-    return null;
   }
 
   @override
   ResourceProvider get resourceProvider {
     fail('Unexpected invocation of resourceProvider');
-    return null;
   }
 
   @override
   String get sdkPath {
     fail('Unexpected invocation of sdkPath');
-    return null;
   }
 
   @override
   Future<Null> addPluginToContextRoot(
       analyzer.ContextRoot contextRoot, String path) async {
     fail('Unexpected invocation of addPluginToContextRoot');
-    return null;
   }
 
   @override
@@ -306,13 +299,11 @@
   @override
   List<String> pathsFor(String pluginPath) {
     fail('Unexpected invocation of pathsFor');
-    return null;
   }
 
   @override
   List<PluginInfo> pluginsForContextRoot(analyzer.ContextRoot contextRoot) {
     fail('Unexpected invocation of pluginsForContextRoot');
-    return null;
   }
 
   @override
@@ -352,6 +343,5 @@
   @override
   Future<List<Null>> stopAll() async {
     fail('Unexpected invocation of stopAll');
-    return null;
   }
 }
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 9ba47f2..bbb3807 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -120,7 +120,7 @@
     server.setAnalysisRoots('0', ['/pkg'], [], {});
     // Pump the event queue to make sure the server has finished any
     // analysis.
-    return pumpEventQueue().then((_) {
+    return pumpEventQueue(times: 5000).then((_) {
       List<Notification> notifications = channel.notificationsReceived;
       expect(notifications, isNotEmpty);
       // expect at least one notification indicating analysis is in progress
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 4cd4a46..4064bbb 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -38,7 +38,7 @@
             reason: 'exit: ${r.exitCode}\n${r.stdout}\n${r.stderr}');
       });
 
-      test('$benchmarkId-preview-dart-2', () {
+      test('$benchmarkId-use-cfe', () {
         ProcessResult r = Process.runSync(
           Platform.resolvedExecutable,
           [
@@ -46,7 +46,7 @@
             'run',
             '--repeat=1',
             '--quick',
-            '--preview-dart-2',
+            '--use-cfe',
             benchmarkId
           ],
           workingDirectory: _serverSourcePath,
diff --git a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
index 4395c7a..ad0c8ac 100644
--- a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
+++ b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
@@ -13,8 +13,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../mocks.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ByteStreamClientChannelTest);
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 7933584..94a3acd 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -46,6 +46,15 @@
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class AbstractContextManagerTest extends ContextManagerTest {
   void test_contextsInAnalysisRoot_nestedContext() {
@@ -86,7 +95,7 @@
     // package:analysis_server/src/context_manager.dart 1043:16           ContextManagerImpl._checkForPackagespecUpdate
     // package:analysis_server/src/context_manager.dart 1553:5            ContextManagerImpl._handleWatchEvent
     //return super.test_embedder_added();
-    fail('NoSuchMethodError');
+    _fail('NoSuchMethodError');
     // Create files.
     String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
     newFile('$libPath/main.dart');
@@ -2164,7 +2173,7 @@
     //return super.test_optionsFile_update_strongMode();
     // After a few other changes, the test now times out on my machine, so I'm
     // disabling it in order to prevent it from being flaky.
-    fail('Test times out');
+    _fail('Test times out');
     var file = resourceProvider.newFile('$projPath/bin/test.dart', r'''
 main() {
   var paths = <int>[];
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 90b92b4..08eeb1ba 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -19,7 +19,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'domain_completion_util.dart';
-import 'mocks.dart' show pumpEventQueue;
 
 main() {
   defineReflectiveSuite(() {
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 9fe5e02..d5a61dc 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -31,6 +31,15 @@
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class ConvertGetterMethodToMethodTest extends _AbstractGetRefactoring_Test {
   test_function() {
@@ -1214,7 +1223,7 @@
 
   @failingTest
   test_OK() {
-    fail('The move file refactoring is not supported under the new driver');
+    _fail('The move file refactoring is not supported under the new driver');
     newFile('/project/bin/lib.dart');
     addTestFile('''
 import 'dart:math';
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index 4420642..b9c0748 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -12,10 +12,19 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OptionsIntegrationTest);
-    defineReflectiveTests(OptionsIntegrationTest_PreviewDart2);
+    defineReflectiveTests(OptionsIntegrationTest_UseCFE);
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class OptionsIntegrationTest extends AbstractAnalysisServerIntegrationTest {
   @failingTest
@@ -23,7 +32,7 @@
     // TimeoutException after 0:00:30.000000: Test timed out after 30 seconds
     // (#28868).
 
-    fail('test timeout expected - #28868');
+    _fail('test timeout expected - #28868');
 
     String options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
     writeFile(options, '''
@@ -54,7 +63,7 @@
     // TimeoutException after 0:00:30.000000: Test timed out after 30 seconds
     // (#28868).
 
-    fail('test timeout expected - #28868');
+    _fail('test timeout expected - #28868');
 
     String options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
     writeFile(options, '''
@@ -82,7 +91,7 @@
 }
 
 @reflectiveTest
-class OptionsIntegrationTest_PreviewDart2 extends OptionsIntegrationTest {
+class OptionsIntegrationTest_UseCFE extends OptionsIntegrationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index fe968d7..c56fb03 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisErrorIntegrationTest);
-    defineReflectiveTests(AnalysisErrorIntegrationTest_PreviewDart2);
+    defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
   });
 }
 
@@ -101,10 +101,9 @@
 }
 
 @reflectiveTest
-class AnalysisErrorIntegrationTest_PreviewDart2
-    extends AnalysisErrorIntegrationTest {
+class AnalysisErrorIntegrationTest_UseCFE extends AnalysisErrorIntegrationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart b/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart
index 0d18844..d992b66 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart
@@ -17,7 +17,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisDomainGetErrorsTest);
-    defineReflectiveTests(AnalysisDomainGetErrorsTest_PreviewDart2);
+    defineReflectiveTests(AnalysisDomainGetErrorsTest_UseCFE);
   });
 }
 
@@ -74,14 +74,14 @@
       {bool checked: true,
       int diagnosticPort,
       int servicesPort,
-      bool previewDart2: false}) {
+      bool cfe: false}) {
     String sdkPath = createNonStandardSdk();
     return server.start(
         checked: checked,
         diagnosticPort: diagnosticPort,
         sdkPath: sdkPath,
         servicesPort: servicesPort,
-        previewDart2: previewDart2);
+        useCFE: cfe);
   }
 
   Future test_getErrors() async {
@@ -100,8 +100,7 @@
 }
 
 @reflectiveTest
-class AnalysisDomainGetErrorsTest_PreviewDart2
-    extends AnalysisDomainGetErrorsTest {
+class AnalysisDomainGetErrorsTest_UseCFE extends AnalysisDomainGetErrorsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index c8a518f..a4912ac 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetErrorsTest);
-    defineReflectiveTests(GetErrorsTest_PreviewDart2);
+    defineReflectiveTests(GetErrorsTest_UseCFE);
   });
 }
 
@@ -37,7 +37,7 @@
 }
 
 @reflectiveTest
-class GetErrorsTest_PreviewDart2 extends GetErrorsTest {
+class GetErrorsTest_UseCFE extends GetErrorsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 352df8c..f9a45f6 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetHoverIntegrationTest);
-    defineReflectiveTests(AnalysisGetHoverIntegrationTest_PreviewDart2);
+    defineReflectiveTests(AnalysisGetHoverIntegrationTest_UseCFE);
   });
 }
 
@@ -190,10 +190,10 @@
 }
 
 @reflectiveTest
-class AnalysisGetHoverIntegrationTest_PreviewDart2
+class AnalysisGetHoverIntegrationTest_UseCFE
     extends AnalysisGetHoverIntegrationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 4823a1a..655fa65 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -15,8 +15,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest);
-    defineReflectiveTests(
-        AnalysisGetImportedElementsIntegrationTest_PreviewDart2);
+    defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
   });
 }
 
@@ -142,8 +141,8 @@
 }
 
 @reflectiveTest
-class AnalysisGetImportedElementsIntegrationTest_PreviewDart2
+class AnalysisGetImportedElementsIntegrationTest_UseCFE
     extends AnalysisGetImportedElementsIntegrationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
index dda8e99..318f244 100644
--- a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetLibraryDependenciesTest);
-    defineReflectiveTests(GetLibraryDependenciesTest_PreviewDart2);
+    defineReflectiveTests(GetLibraryDependenciesTest_UseCFE);
   });
 }
 
@@ -48,8 +48,7 @@
 }
 
 @reflectiveTest
-class GetLibraryDependenciesTest_PreviewDart2
-    extends GetLibraryDependenciesTest {
+class GetLibraryDependenciesTest_UseCFE extends GetLibraryDependenciesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index e9757fb..a9d7bb7 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetNavigationTest);
-    defineReflectiveTests(GetNavigationTest_PreviewDart2);
+    defineReflectiveTests(GetNavigationTest_UseCFE);
   });
 }
 
@@ -68,9 +68,9 @@
 }
 
 @reflectiveTest
-class GetNavigationTest_PreviewDart2 extends GetNavigationTest {
+class GetNavigationTest_UseCFE extends GetNavigationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
index 532002c..7142da9 100644
--- a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
@@ -13,7 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetReachableSourcesTest);
-    defineReflectiveTests(GetReachableSourcesTest_PreviewDart2);
+    defineReflectiveTests(GetReachableSourcesTest_UseCFE);
   });
 }
 
@@ -50,7 +50,7 @@
 }
 
 @reflectiveTest
-class GetReachableSourcesTest_PreviewDart2 extends GetReachableSourcesTest {
+class GetReachableSourcesTest_UseCFE extends GetReachableSourcesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index 8091efa..f52caaf 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisHighlightsTest);
-    defineReflectiveTests(AnalysisHighlightsTest_PreviewDart2);
+    defineReflectiveTests(AnalysisHighlightsTest_UseCFE);
   });
 }
 
@@ -147,9 +147,9 @@
 }
 
 @reflectiveTest
-class AnalysisHighlightsTest_PreviewDart2 extends AnalysisHighlightsTest {
+class AnalysisHighlightsTest_UseCFE extends AnalysisHighlightsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test2.dart b/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
index 7d7314b..2157e77 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisHighlightsTest);
-    defineReflectiveTests(AnalysisHighlightsTest_PreviewDart2);
+    defineReflectiveTests(AnalysisHighlightsTest_UseCFE);
   });
 }
 
@@ -24,14 +24,14 @@
     bool checked: true,
     int diagnosticPort,
     int servicesPort,
-    bool previewDart2: false,
+    bool cfe: false,
   }) {
     return server.start(
         checked: checked,
         diagnosticPort: diagnosticPort,
         servicesPort: servicesPort,
         useAnalysisHighlight2: true,
-        previewDart2: previewDart2);
+        useCFE: cfe);
   }
 
   test_highlights() {
@@ -167,7 +167,7 @@
 }
 
 @reflectiveTest
-class AnalysisHighlightsTest_PreviewDart2 extends AnalysisHighlightsTest {
+class AnalysisHighlightsTest_UseCFE extends AnalysisHighlightsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index 803c4a1..d217042 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(LintIntegrationTest);
-    defineReflectiveTests(LintIntegrationTest_PreviewDart2);
+    defineReflectiveTests(LintIntegrationTest_UseCFE);
   });
 }
 
@@ -84,7 +84,7 @@
 }
 
 @reflectiveTest
-class LintIntegrationTest_PreviewDart2 extends LintIntegrationTest {
+class LintIntegrationTest_UseCFE extends LintIntegrationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index bad4f91..1eb6b71 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisNavigationTest);
-    defineReflectiveTests(AnalysisNavigationTest_PreviewDart2);
+    defineReflectiveTests(AnalysisNavigationTest_UseCFE);
   });
 }
 
@@ -84,7 +84,6 @@
         }
       }
       fail('No element found for index $index');
-      return null;
     }
 
     void checkLocal(
@@ -137,9 +136,9 @@
 }
 
 @reflectiveTest
-class AnalysisNavigationTest_PreviewDart2 extends AnalysisNavigationTest {
+class AnalysisNavigationTest_UseCFE extends AnalysisNavigationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 78f8ca4..5174ef4 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OccurrencesTest);
-    defineReflectiveTests(OccurrencesTest_PreviewDart2);
+    defineReflectiveTests(OccurrencesTest_UseCFE);
   });
 }
 
@@ -50,7 +50,6 @@
           }
         }
         fail('No element found matching $elementName');
-        return null;
       }
 
       void check(String elementName, Iterable<String> expectedOccurrences) {
@@ -69,7 +68,7 @@
 }
 
 @reflectiveTest
-class OccurrencesTest_PreviewDart2 extends OccurrencesTest {
+class OccurrencesTest_UseCFE extends OccurrencesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index 048ae85..0d5dc43 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OutlineTest);
-    defineReflectiveTests(OutlineTest_PreviewDart2);
+    defineReflectiveTests(OutlineTest_UseCFE);
   });
 }
 
@@ -85,7 +85,7 @@
 }
 
 @reflectiveTest
-class OutlineTest_PreviewDart2 extends OutlineTest {
+class OutlineTest_UseCFE extends OutlineTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index ca1bdbea..39c4bb4 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OverridesTest);
-    defineReflectiveTests(OverridesTest_PreviewDart2);
+    defineReflectiveTests(OverridesTest_UseCFE);
   });
 }
 
@@ -123,7 +123,7 @@
 }
 
 @reflectiveTest
-class OverridesTest_PreviewDart2 extends OverridesTest {
+class OverridesTest_UseCFE extends OverridesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index 8423906..5cca2f0 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -13,7 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
-    defineReflectiveTests(SetAnalysisRootsTest_PreviewDart2);
+    defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
   });
 }
 
@@ -80,7 +80,7 @@
 }
 
 @reflectiveTest
-class SetAnalysisRootsTest_PreviewDart2 extends SetAnalysisRootsTest {
+class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 792e290..7a726ab 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -17,7 +17,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ReanalyzeTest);
-    defineReflectiveTests(ReanalyzeTest_PreviewDart2);
+    defineReflectiveTests(ReanalyzeTest_UseCFE);
   });
 }
 
@@ -50,7 +50,7 @@
 }
 
 @reflectiveTest
-class ReanalyzeTest_PreviewDart2 extends ReanalyzeTest {
+class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 23693a7..319a4a4 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ReanalyzeTest);
-    defineReflectiveTests(ReanalyzeTest_PreviewDart2);
+    defineReflectiveTests(ReanalyzeTest_UseCFE);
   });
 }
 
@@ -41,7 +41,7 @@
 }
 
 @reflectiveTest
-class ReanalyzeTest_PreviewDart2 extends ReanalyzeTest {
+class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index 80869a9..f9ebcb0 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
-    defineReflectiveTests(SetAnalysisRootsTest_PreviewDart2);
+    defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
   });
 }
 
@@ -33,7 +33,7 @@
 }
 
 @reflectiveTest
-class SetAnalysisRootsTest_PreviewDart2 extends SetAnalysisRootsTest {
+class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index 3ee248a..ff147fc 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetGeneralSubscriptionsTest);
-    defineReflectiveTests(SetGeneralSubscriptionsTest_PreviewDart2);
+    defineReflectiveTests(SetGeneralSubscriptionsTest_UseCFE);
   });
 }
 
@@ -41,8 +41,7 @@
 }
 
 @reflectiveTest
-class SetGeneralSubscriptionsTest_PreviewDart2
-    extends SetGeneralSubscriptionsTest {
+class SetGeneralSubscriptionsTest_UseCFE extends SetGeneralSubscriptionsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 6a07229..7d86706 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetPriorityFilesTest);
-    defineReflectiveTests(SetPriorityFilesTest_PreviewDart2);
+    defineReflectiveTests(SetPriorityFilesTest_UseCFE);
   });
 }
 
@@ -31,7 +31,7 @@
 }
 
 @reflectiveTest
-class SetPriorityFilesTest_PreviewDart2 extends SetPriorityFilesTest {
+class SetPriorityFilesTest_UseCFE extends SetPriorityFilesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index 1656f80..02dcd05 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetSubscriptionsTest);
-    defineReflectiveTests(SetSubscriptionsTest_PreviewDart2);
+    defineReflectiveTests(SetSubscriptionsTest_UseCFE);
   });
 }
 
@@ -33,7 +33,7 @@
 }
 
 @reflectiveTest
-class SetSubscriptionsTest_PreviewDart2 extends SetSubscriptionsTest {
+class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index c42ee65..42ef868 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
-    defineReflectiveTests(UpdateContentTest_PreviewDart2);
+    defineReflectiveTests(UpdateContentTest_UseCFE);
   });
 }
 
@@ -53,9 +53,9 @@
 }
 
 @reflectiveTest
-class UpdateContentTest_PreviewDart2 extends UpdateContentTest {
+class UpdateContentTest_UseCFE extends UpdateContentTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index ac2644b..2238262 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
-    defineReflectiveTests(UpdateContentTest_PreviewDart2);
+    defineReflectiveTests(UpdateContentTest_UseCFE);
   });
 }
 
@@ -108,7 +108,7 @@
 }
 
 @reflectiveTest
-class UpdateContentTest_PreviewDart2 extends UpdateContentTest {
+class UpdateContentTest_UseCFE extends UpdateContentTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_options_test.dart b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
index f4d9610..5d6b548 100644
--- a/pkg/analysis_server/test/integration/analysis/update_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateOptionsTest);
-    defineReflectiveTests(UpdateOptionsTest_PreviewDart2);
+    defineReflectiveTests(UpdateOptionsTest_UseCFE);
   });
 }
 
@@ -48,7 +48,7 @@
 }
 
 @reflectiveTest
-class UpdateOptionsTest_PreviewDart2 extends UpdateOptionsTest {
+class UpdateOptionsTest_UseCFE extends UpdateOptionsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analytics/enable_test.dart b/pkg/analysis_server/test/integration/analytics/enable_test.dart
index d7dfdfd..d04e9ee 100644
--- a/pkg/analysis_server/test/integration/analytics/enable_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/enable_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EnableTest);
-    defineReflectiveTests(EnableTest_PreviewDart2);
+    defineReflectiveTests(EnableTest_UseCFE);
   });
 }
 
@@ -34,7 +34,7 @@
 }
 
 @reflectiveTest
-class EnableTest_PreviewDart2 extends EnableTest {
+class EnableTest_UseCFE extends EnableTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart b/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
index daf089d..712a050 100644
--- a/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IsEnabledTest);
-    defineReflectiveTests(IsEnabledTest_PreviewDart2);
+    defineReflectiveTests(IsEnabledTest_UseCFE);
   });
 }
 
@@ -27,7 +27,7 @@
 }
 
 @reflectiveTest
-class IsEnabledTest_PreviewDart2 extends IsEnabledTest {
+class IsEnabledTest_UseCFE extends IsEnabledTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analytics/send_event_test.dart b/pkg/analysis_server/test/integration/analytics/send_event_test.dart
index 1098697..250790e 100644
--- a/pkg/analysis_server/test/integration/analytics/send_event_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/send_event_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SendEventTest);
-    defineReflectiveTests(SendEventTest_PreviewDart2);
+    defineReflectiveTests(SendEventTest_UseCFE);
   });
 }
 
@@ -32,7 +32,7 @@
 }
 
 @reflectiveTest
-class SendEventTest_PreviewDart2 extends SendEventTest {
+class SendEventTest_UseCFE extends SendEventTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/analytics/send_timing_test.dart b/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
index 03ff2c4..ee8d812 100644
--- a/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SendTimingTest);
-    defineReflectiveTests(SendTimingTest_PreviewDart2);
+    defineReflectiveTests(SendTimingTest_UseCFE);
   });
 }
 
@@ -32,7 +32,7 @@
 }
 
 @reflectiveTest
-class SendTimingTest_PreviewDart2 extends SendTimingTest {
+class SendTimingTest_UseCFE extends SendTimingTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index b3f4e19..74aee23 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetSuggestionsTest);
-    defineReflectiveTests(GetSuggestionsTest_PreviewDart2);
+    defineReflectiveTests(GetSuggestionsTest_UseCFE);
   });
 }
 
@@ -119,7 +119,7 @@
 }
 
 @reflectiveTest
-class GetSuggestionsTest_PreviewDart2 extends GetSuggestionsTest {
+class GetSuggestionsTest_UseCFE extends GetSuggestionsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
index 282b5f7..897113f 100644
--- a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetDiagnosticsTest);
-    defineReflectiveTests(GetDiagnosticsTest_PreviewDart2);
+    defineReflectiveTests(GetDiagnosticsTest_UseCFE);
   });
 }
 
@@ -31,7 +31,7 @@
 }
 
 @reflectiveTest
-class GetDiagnosticsTest_PreviewDart2 extends GetDiagnosticsTest {
+class GetDiagnosticsTest_UseCFE extends GetDiagnosticsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
index d4009e6..bcce8b6 100644
--- a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetServerPortTest);
-    defineReflectiveTests(GetServerPortTest_PreviewDart2);
+    defineReflectiveTests(GetServerPortTest_UseCFE);
   });
 }
 
@@ -38,7 +38,7 @@
 }
 
 @reflectiveTest
-class GetServerPortTest_PreviewDart2 extends GetServerPortTest {
+class GetServerPortTest_UseCFE extends GetServerPortTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/format_test.dart b/pkg/analysis_server/test/integration/edit/format_test.dart
index 4380afd..9b161ba 100644
--- a/pkg/analysis_server/test/integration/edit/format_test.dart
+++ b/pkg/analysis_server/test/integration/edit/format_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FormatTest);
-    defineReflectiveTests(FormatTest_PreviewDart2);
+    defineReflectiveTests(FormatTest_UseCFE);
   });
 }
 
@@ -81,7 +81,7 @@
 }
 
 @reflectiveTest
-class FormatTest_PreviewDart2 extends FormatTest {
+class FormatTest_UseCFE extends FormatTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_assists_test.dart b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
index 0918d7b..b54ddd0 100644
--- a/pkg/analysis_server/test/integration/edit/get_assists_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetAssistsTest);
-    defineReflectiveTests(GetAssistsTest_PreviewDart2);
+    defineReflectiveTests(GetAssistsTest_UseCFE);
   });
 }
 
@@ -53,9 +53,9 @@
 }
 
 @reflectiveTest
-class GetAssistsTest_PreviewDart2 extends GetAssistsTest {
+class GetAssistsTest_UseCFE extends GetAssistsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 0ae9808..0d359f6 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetAvailableRefactoringsTest);
-    defineReflectiveTests(GetAvailableRefactoringsTest_PreviewDart2);
+    defineReflectiveTests(GetAvailableRefactoringsTest_UseCFE);
   });
 }
 
@@ -38,8 +38,7 @@
 }
 
 @reflectiveTest
-class GetAvailableRefactoringsTest_PreviewDart2
-    extends GetAvailableRefactoringsTest {
+class GetAvailableRefactoringsTest_UseCFE extends GetAvailableRefactoringsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index fc111ae..c0e52b7 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetFixesTest);
-    defineReflectiveTests(GetFixesTest_PreviewDart2);
+    defineReflectiveTests(GetFixesTest_UseCFE);
   });
 }
 
@@ -63,9 +63,9 @@
 }
 
 @reflectiveTest
-class GetFixesTest_PreviewDart2 extends GetFixesTest {
+class GetFixesTest_UseCFE extends GetFixesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 4a3e3e9..8e34a3b 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetPostfixCompletionTest);
-    defineReflectiveTests(GetPostfixCompletionTest_PreviewDart2);
+    defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
   });
 }
 
@@ -53,7 +53,7 @@
 }
 
 @reflectiveTest
-class GetPostfixCompletionTest_PreviewDart2 extends GetPostfixCompletionTest {
+class GetPostfixCompletionTest_UseCFE extends GetPostfixCompletionTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart b/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
index 59ac3a5..f6469aa 100644
--- a/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetRefactoringTest);
-    defineReflectiveTests(GetRefactoringTest_PreviewDart2);
+    defineReflectiveTests(GetRefactoringTest_UseCFE);
   });
 }
 
@@ -69,9 +69,9 @@
 }
 
 @reflectiveTest
-class GetRefactoringTest_PreviewDart2 extends GetRefactoringTest {
+class GetRefactoringTest_UseCFE extends GetRefactoringTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
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 345c5cf..d462006 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
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetStatementCompletionTest);
-    defineReflectiveTests(GetStatementCompletionTest_PreviewDart2);
+    defineReflectiveTests(GetStatementCompletionTest_UseCFE);
   });
 }
 
@@ -55,10 +55,9 @@
 }
 
 @reflectiveTest
-class GetStatementCompletionTest_PreviewDart2
-    extends GetStatementCompletionTest {
+class GetStatementCompletionTest_UseCFE extends GetStatementCompletionTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index 4f3d343..da142fc 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -16,8 +16,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetImportElementsIntegrationTest);
-    defineReflectiveTests(
-        AnalysisGetImportElementsIntegrationTest_PreviewDart2);
+    defineReflectiveTests(AnalysisGetImportElementsIntegrationTest_UseCFE);
   });
 }
 
@@ -141,8 +140,8 @@
 }
 
 @reflectiveTest
-class AnalysisGetImportElementsIntegrationTest_PreviewDart2
+class AnalysisGetImportElementsIntegrationTest_UseCFE
     extends AnalysisGetImportElementsIntegrationTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index afda363..32f59cb 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IsPostfixCompletionApplicableTest);
-    defineReflectiveTests(IsPostfixCompletionApplicableTest_PreviewDart2);
+    defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
   });
 }
 
@@ -42,8 +42,8 @@
 }
 
 @reflectiveTest
-class IsPostfixCompletionApplicableTest_PreviewDart2
+class IsPostfixCompletionApplicableTest_UseCFE
     extends IsPostfixCompletionApplicableTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index b5f52b7..3caf5f80 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListPostfixCompletionTemplatesTest);
-    defineReflectiveTests(ListPostfixCompletionTemplatesTest_PreviewDart2);
+    defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
   });
 }
 
@@ -42,8 +42,8 @@
 }
 
 @reflectiveTest
-class ListPostfixCompletionTemplatesTest_PreviewDart2
+class ListPostfixCompletionTemplatesTest_UseCFE
     extends ListPostfixCompletionTemplatesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index cc94235..4d519e9 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OrganizeDirectivesTest);
-    defineReflectiveTests(OrganizeDirectivesTest_PreviewDart2);
+    defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
   });
 }
 
@@ -77,7 +77,7 @@
 }
 
 @reflectiveTest
-class OrganizeDirectivesTest_PreviewDart2 extends OrganizeDirectivesTest {
+class OrganizeDirectivesTest_UseCFE extends OrganizeDirectivesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/edit/sort_members_test.dart b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
index 277c168..da09496 100644
--- a/pkg/analysis_server/test/integration/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SortMembersTest);
-    defineReflectiveTests(SortMembersTest_PreviewDart2);
+    defineReflectiveTests(SortMembersTest_UseCFE);
   });
 }
 
@@ -65,7 +65,7 @@
 }
 
 @reflectiveTest
-class SortMembersTest_PreviewDart2 extends SortMembersTest {
+class SortMembersTest_UseCFE extends SortMembersTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/execution/create_context_test.dart b/pkg/analysis_server/test/integration/execution/create_context_test.dart
index 841a427..2604eab 100644
--- a/pkg/analysis_server/test/integration/execution/create_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/create_context_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(CreateContextTest);
-    defineReflectiveTests(CreateContextTest_PreviewDart2);
+    defineReflectiveTests(CreateContextTest_UseCFE);
   });
 }
 
@@ -25,7 +25,7 @@
 }
 
 @reflectiveTest
-class CreateContextTest_PreviewDart2 extends CreateContextTest {
+class CreateContextTest_UseCFE extends CreateContextTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 5277069..3cf0e19 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeleteContextTest);
-    defineReflectiveTests(DeleteContextTest_PreviewDart2);
+    defineReflectiveTests(DeleteContextTest_UseCFE);
   });
 }
 
@@ -44,7 +44,7 @@
 }
 
 @reflectiveTest
-class DeleteContextTest_PreviewDart2 extends DeleteContextTest {
+class DeleteContextTest_UseCFE extends DeleteContextTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index 8b186cb..9990a23 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapUriTest);
-    defineReflectiveTests(MapUriTest_PreviewDart2);
+    defineReflectiveTests(MapUriTest_UseCFE);
   });
 }
 
@@ -41,7 +41,7 @@
 }
 
 @reflectiveTest
-class MapUriTest_PreviewDart2 extends MapUriTest {
+class MapUriTest_UseCFE extends MapUriTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
index 09835d7..a715edd 100644
--- a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetSubscriptionsTest);
-    defineReflectiveTests(SetSubscriptionsTest_PreviewDart2);
+    defineReflectiveTests(SetSubscriptionsTest_UseCFE);
   });
 }
 
@@ -24,7 +24,7 @@
 }
 
 @reflectiveTest
-class SetSubscriptionsTest_PreviewDart2 extends SetSubscriptionsTest {
+class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index 13ae694..823ac4d 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetKytheEntriesTest);
-    defineReflectiveTests(GetKytheEntriesTest_PreviewDart2);
+    defineReflectiveTests(GetKytheEntriesTest_UseCFE);
   });
 }
 
@@ -40,7 +40,7 @@
 }
 
 @reflectiveTest
-class GetKytheEntriesTest_PreviewDart2 extends GetKytheEntriesTest {
+class GetKytheEntriesTest_UseCFE extends GetKytheEntriesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 823e17f..bc24fb8 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -13,7 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindElementReferencesTest);
-    defineReflectiveTests(FindElementReferencesTest_PreviewDart2);
+    defineReflectiveTests(FindElementReferencesTest_UseCFE);
   });
 }
 
@@ -73,9 +73,9 @@
 }
 
 @reflectiveTest
-class FindElementReferencesTest_PreviewDart2 extends FindElementReferencesTest {
+class FindElementReferencesTest_UseCFE extends FindElementReferencesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index babe602..38f0c67 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindMemberDeclarationsTest);
-    defineReflectiveTests(FindMemberDeclarationsTest_PreviewDart2);
+    defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
   });
 }
 
@@ -52,8 +52,7 @@
 }
 
 @reflectiveTest
-class FindMemberDeclarationsTest_PreviewDart2
-    extends FindMemberDeclarationsTest {
+class FindMemberDeclarationsTest_UseCFE extends FindMemberDeclarationsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/search/find_member_references_test.dart b/pkg/analysis_server/test/integration/search/find_member_references_test.dart
index 9c9cac3..3541b6f 100644
--- a/pkg/analysis_server/test/integration/search/find_member_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_references_test.dart
@@ -13,7 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindMemberReferencesTest);
-    defineReflectiveTests(FindMemberReferencesTest_PreviewDart2);
+    defineReflectiveTests(FindMemberReferencesTest_UseCFE);
   });
 }
 
@@ -55,9 +55,9 @@
 }
 
 @reflectiveTest
-class FindMemberReferencesTest_PreviewDart2 extends FindMemberReferencesTest {
+class FindMemberReferencesTest_UseCFE extends FindMemberReferencesTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
index a422c7a..4a2a41d 100644
--- a/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
@@ -11,7 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindTopLevelDeclarationsTest);
-    defineReflectiveTests(FindTopLevelDeclarationsTest_PreviewDart2);
+    defineReflectiveTests(FindTopLevelDeclarationsTest_UseCFE);
   });
 }
 
@@ -57,8 +57,7 @@
 }
 
 @reflectiveTest
-class FindTopLevelDeclarationsTest_PreviewDart2
-    extends FindTopLevelDeclarationsTest {
+class FindTopLevelDeclarationsTest_UseCFE extends FindTopLevelDeclarationsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
index 2d9a0a2..7970c1d 100644
--- a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
@@ -14,7 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetTypeHierarchyTest);
-    defineReflectiveTests(GetTypeHierarchyTest_PreviewDart2);
+    defineReflectiveTests(GetTypeHierarchyTest_UseCFE);
   });
 }
 
@@ -270,15 +270,14 @@
       return items[nameToIndex[name]];
     } else {
       fail('Class $name not found in hierarchy results');
-      return null;
     }
   }
 }
 
 @reflectiveTest
-class GetTypeHierarchyTest_PreviewDart2 extends GetTypeHierarchyTest {
+class GetTypeHierarchyTest_UseCFE extends GetTypeHierarchyTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analysis_server/test/integration/server/get_version_test.dart b/pkg/analysis_server/test/integration/server/get_version_test.dart
index 485b771..2a85544 100644
--- a/pkg/analysis_server/test/integration/server/get_version_test.dart
+++ b/pkg/analysis_server/test/integration/server/get_version_test.dart
@@ -9,7 +9,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetVersionTest);
-    defineReflectiveTests(GetVersionTest_PreviewDart2);
+    defineReflectiveTests(GetVersionTest_UseCFE);
   });
 }
 
@@ -21,7 +21,7 @@
 }
 
 @reflectiveTest
-class GetVersionTest_PreviewDart2 extends GetVersionTest {
+class GetVersionTest_UseCFE extends GetVersionTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
index d86e9a0..1dbb9db 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
@@ -10,7 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetSubscriptionsInvalidTest);
-    defineReflectiveTests(SetSubscriptionsInvalidTest_PreviewDart2);
+    defineReflectiveTests(SetSubscriptionsInvalidTest_UseCFE);
   });
 }
 
@@ -31,8 +31,7 @@
 }
 
 @reflectiveTest
-class SetSubscriptionsInvalidTest_PreviewDart2
-    extends SetSubscriptionsInvalidTest {
+class SetSubscriptionsInvalidTest_UseCFE extends SetSubscriptionsInvalidTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
index c180f9a..afae71b 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
@@ -13,10 +13,19 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetSubscriptionsTest);
-    defineReflectiveTests(SetSubscriptionsTest_PreviewDart2);
+    defineReflectiveTests(SetSubscriptionsTest_UseCFE);
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class SetSubscriptionsTest extends AbstractAnalysisServerIntegrationTest {
   @failingTest
@@ -24,7 +33,7 @@
     // This test times out on the bots and has been disabled to keep them green.
     // We need to discover the cause and re-enable it.
 
-    fail(
+    _fail(
         'This test times out on the bots and has been disabled to keep them green.'
         'We need to discover the cause and re-enable it.');
 
@@ -65,7 +74,7 @@
 }
 
 @reflectiveTest
-class SetSubscriptionsTest_PreviewDart2 extends SetSubscriptionsTest {
+class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/server/shutdown_test.dart b/pkg/analysis_server/test/integration/server/shutdown_test.dart
index 8f24bdb..a68bf82 100644
--- a/pkg/analysis_server/test/integration/server/shutdown_test.dart
+++ b/pkg/analysis_server/test/integration/server/shutdown_test.dart
@@ -12,7 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ShutdownTest);
-    defineReflectiveTests(ShutdownTest_PreviewDart2);
+    defineReflectiveTests(ShutdownTest_UseCFE);
   });
 }
 
@@ -32,7 +32,7 @@
 }
 
 @reflectiveTest
-class ShutdownTest_PreviewDart2 extends ShutdownTest {
+class ShutdownTest_UseCFE extends ShutdownTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index 1ffa86a..dab8eaa 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -13,7 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(StatusTest);
-    defineReflectiveTests(StatusTest_PreviewDart2);
+    defineReflectiveTests(StatusTest_UseCFE);
   });
 }
 
@@ -51,7 +51,7 @@
 }
 
 @reflectiveTest
-class StatusTest_PreviewDart2 extends StatusTest {
+class StatusTest_UseCFE extends StatusTest {
   @override
-  bool get usePreviewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index f8dc21a..466cde6 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -94,7 +94,7 @@
    * Amount of time to give the server to respond to a shutdown request before
    * forcibly terminating it.
    */
-  static const Duration SHUTDOWN_TIMEOUT = const Duration(seconds: 5);
+  static const Duration SHUTDOWN_TIMEOUT = const Duration(seconds: 60);
 
   /**
    * Connection to the analysis server.
@@ -253,10 +253,10 @@
   }
 
   /**
-   * Whether to run integration tests with the --preview-dart-2 flag.
+   * Whether to run integration tests with the --use-cfe flag.
    */
-  // TODO(devoncarew): Remove this when --preview-dart-2 goes away.
-  bool get usePreviewDart2 => false;
+  // TODO(devoncarew): Remove this when --use-cfe goes away.
+  bool get useCFE => false;
 
   /**
    * Start [server].
@@ -265,13 +265,13 @@
     bool checked: true,
     int diagnosticPort,
     int servicesPort,
-    bool previewDart2: false,
+    bool cfe: false,
   }) {
     return server.start(
         checked: checked,
         diagnosticPort: diagnosticPort,
         servicesPort: servicesPort,
-        previewDart2: previewDart2 || usePreviewDart2);
+        useCFE: cfe || useCFE);
   }
 
   /**
@@ -669,7 +669,7 @@
     bool profileServer: false,
     String sdkPath,
     int servicesPort,
-    bool previewDart2: false,
+    bool useCFE: false,
     bool useAnalysisHighlight2: false,
   }) async {
     if (_process != null) {
@@ -724,8 +724,8 @@
     if (useAnalysisHighlight2) {
       arguments.add('--useAnalysisHighlight2');
     }
-    if (previewDart2) {
-      arguments.add('--preview-dart-2');
+    if (useCFE) {
+      arguments.add('--use-cfe');
     }
     // TODO(devoncarew): We could experiment with instead launching the analysis
     // server in a separate isolate. This would make it easier to debug the
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 20a5fcd..3a8cfb8 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -47,20 +47,6 @@
 Matcher isResponseSuccess(String id) => new _IsResponseSuccess(id);
 
 /**
- * Returns a [Future] that completes after pumping the event queue [times]
- * times. By default, this should pump the event queue enough times to allow
- * any code to run, as long as it's not waiting on some external event.
- */
-Future pumpEventQueue([int times = 5000]) {
-  if (times == 0) return new Future.value();
-  // We use a delayed future to allow microtask events to finish. The
-  // Future.value or Future() constructors use scheduleMicrotask themselves and
-  // would therefore not wait for microtask callbacks that are scheduled after
-  // invoking this method.
-  return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
-}
-
-/**
  * A mock [PackageMapProvider].
  */
 class MockPackageMapProvider implements PubPackageMapProvider {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index 17b1d2f..ef82b02 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -76,7 +76,6 @@
         }
       }
       fail('Failed to find $expectedUri in $uriList');
-      return null;
     }
 
     void assertImportedLib(String expectedUri) {
diff --git a/pkg/analysis_server/test/src/domain_abstract_test.dart b/pkg/analysis_server/test/src/domain_abstract_test.dart
index 6585efb..dde70ce 100644
--- a/pkg/analysis_server/test/src/domain_abstract_test.dart
+++ b/pkg/analysis_server/test/src/domain_abstract_test.dart
@@ -100,6 +100,5 @@
   @override
   Response handleRequest(Request request) {
     fail('Unexpected invocation of handleRequest');
-    return null;
   }
 }
diff --git a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
index 1b5dd99..ae42433 100644
--- a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
@@ -22,6 +22,15 @@
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class NotificationManagerTest extends ProtocolTestUtilities {
   String testDir;
@@ -355,7 +364,7 @@
 
   @failingTest
   void test_recordOutlines_withSubscription() {
-    fail('The outline handling needs to be re-worked slightly');
+    _fail('The outline handling needs to be re-worked slightly');
     // TODO(brianwilkerson) Figure out outlines. What should we do when merge
     // cannot produce a single outline?
     manager.setSubscriptions({
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index f6ef78c6..e1b9320 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -145,7 +145,6 @@
       }
     }
     fail('Not found $name in $unit');
-    return null;
   }
 
   InstanceCreationExpression _getTopVariableCreation(String name,
diff --git a/pkg/analysis_server/test/src/watch_manager_test.dart b/pkg/analysis_server/test/src/watch_manager_test.dart
index 2fe0471..248c5b0 100644
--- a/pkg/analysis_server/test/src/watch_manager_test.dart
+++ b/pkg/analysis_server/test/src/watch_manager_test.dart
@@ -11,8 +11,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:watcher/watcher.dart';
 
-import '../mocks.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(WatchManagerTest);
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 24a231f..883a143 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -70,6 +70,7 @@
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME,
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME,
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME,
+  CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION,
   CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 6bccdb7..8b78044 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -131,11 +131,16 @@
   FileContentOverlay fileContentOverlay;
 
   /**
-   * Whether to enable the Dart 2.0 Front End.
+   * Whether to enable the Dart 2.0 preview.
    */
   bool previewDart2 = false;
 
   /**
+   * Whether to enable the Dart 2.0 Common Front End implementation.
+   */
+  bool useCFE = false;
+
+  /**
    * Initialize a newly created builder to be ready to build a context rooted in
    * the directory with the given [rootDirectoryPath].
    */
@@ -175,7 +180,7 @@
 
     // The folder with `vm_platform_strong.dill`, which has required patches.
     Folder kernelPlatformFolder;
-    if (previewDart2) {
+    if (useCFE) {
       DartSdk sdk = sf.dartSdk;
       if (sdk is FolderBasedDartSdk) {
         var binariesPath = computePlatformBinariesPath(sdk.directory.path);
@@ -194,7 +199,7 @@
         contextRoot,
         sf,
         options,
-        enableKernelDriver: previewDart2,
+        enableKernelDriver: useCFE,
         kernelPlatformFolder: kernelPlatformFolder);
     // temporary plugin support:
     if (onCreateAnalysisDriver != null) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 588c842..958b75a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -19,6 +19,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/file_tracker.dart';
+import 'package:analyzer/src/dart/analysis/frontend_resolution.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
 import 'package:analyzer/src/dart/analysis/kernel_context.dart';
 import 'package:analyzer/src/dart/analysis/library_analyzer.dart';
@@ -43,7 +44,6 @@
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/api_signature.dart';
 import 'package:front_end/src/base/performance_logger.dart';
-import 'package:front_end/src/incremental/kernel_driver.dart' show KernelDriver;
 import 'package:meta/meta.dart';
 
 /**
@@ -183,10 +183,10 @@
   final Uint32List _salt = new Uint32List(1 + AnalysisOptions.signatureLength);
 
   /**
-   * If [enableKernelDriver], then the instance of [KernelDriver].
+   * If [enableKernelDriver], then the instance of [FrontEndCompiler].
    * Otherwise `null`.
    */
-  KernelDriver _kernelDriver;
+  FrontEndCompiler _frontEndCompiler;
 
   /**
    * The set of priority files, that should be analyzed sooner.
@@ -1103,7 +1103,7 @@
   void removeFile(String path) {
     _throwIfNotAbsolutePath(path);
     _throwIfChangesAreNotAllowed();
-    _kernelDriverInvalidate(path);
+    _frontEndCompilerInvalidate(path);
     _fileTracker.removeFile(path);
     _priorityResults.clear();
   }
@@ -1112,7 +1112,7 @@
    * Implementation for [changeFile].
    */
   void _changeFile(String path) {
-    _kernelDriverInvalidate(path);
+    _frontEndCompilerInvalidate(path);
     _fileTracker.changeFile(path);
     _priorityResults.clear();
   }
@@ -1191,6 +1191,7 @@
           if (enableKernelDriver) {
             kernelContext = await _createKernelContext(library);
             analyzer = new LibraryAnalyzer(
+                _logger,
                 analysisOptions,
                 declaredVariables,
                 sourceFactory,
@@ -1199,11 +1200,12 @@
                 kernelContext.resynthesizer,
                 library,
                 enableKernelDriver: true,
-                previewDart2: _analysisOptions.useFastaParser,
-                kernelDriver: _kernelDriver);
+                useCFE: _analysisOptions.useFastaParser,
+                frontEndCompiler: _frontEndCompiler);
           } else {
             libraryContext = await _createLibraryContext(library);
             analyzer = new LibraryAnalyzer(
+                _logger,
                 analysisOptions,
                 declaredVariables,
                 sourceFactory,
@@ -1343,18 +1345,18 @@
         declaredVariables,
         _sourceFactory,
         fsState,
-        _kernelDriver);
+        _frontEndCompiler);
   }
 
   /**
-   * Creates a new [KernelDriver] in [_kernelDriver].
+   * Creates a new [FrontEndCompiler] in [_frontEndCompiler].
    *
    * This is used both on initial construction and whenever the configuration
    * changes.
    */
   void _createKernelDriver() {
     if (enableKernelDriver) {
-      _kernelDriver = createKernelDriver(
+      _frontEndCompiler = new FrontEndCompiler(
           _logger,
           _byteStore,
           analysisOptions,
@@ -1395,6 +1397,16 @@
   }
 
   /**
+   * Invalidate the file with the given [path] in the [_frontEndCompiler].
+   */
+  void _frontEndCompilerInvalidate(String path) {
+    if (_frontEndCompiler != null) {
+      var fileUri = _resourceProvider.pathContext.toUri(path);
+      _frontEndCompiler.invalidate(fileUri);
+    }
+  }
+
+  /**
    * Load the [AnalysisResult] for the given [file] from the [bytes]. Set
    * optional [content] and [resolvedUnit].
    */
@@ -1467,16 +1479,6 @@
   }
 
   /**
-   * Invalidate the file with the given [path] in the KernelDriver.
-   */
-  void _kernelDriverInvalidate(String path) {
-    if (_kernelDriver != null) {
-      var uri = _resourceProvider.pathContext.toUri(path);
-      _kernelDriver.invalidate(uri);
-    }
-  }
-
-  /**
    * Return the lint code with the given [errorName], or `null` if there is no
    * lint registered with that name.
    */
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 2d1ae3d..d4f4af8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -95,6 +95,11 @@
   final Uri uri;
 
   /**
+   * The absolute file URI of the file.
+   */
+  final Uri fileUri;
+
+  /**
    * The [Source] of the file with the [uri].
    */
   final Source source;
@@ -137,12 +142,13 @@
    */
   bool hasErrorOrWarning = false;
 
-  FileState._(this._fsState, this.path, this.uri, this.source)
+  FileState._(this._fsState, this.path, this.uri, this.fileUri, this.source)
       : isInExternalSummaries = false;
 
   FileState._external(this._fsState, this.uri)
       : isInExternalSummaries = true,
         path = null,
+        fileUri = null,
         source = null {
     _apiSignature = new Uint8List(16);
   }
@@ -729,7 +735,7 @@
    */
   FileState get unresolvedFile {
     if (_unresolvedFile == null) {
-      _unresolvedFile = new FileState._(this, null, null, null);
+      _unresolvedFile = new FileState._(this, null, null, null, null);
       _unresolvedFile.refresh();
     }
     return _unresolvedFile;
@@ -756,8 +762,9 @@
         return file;
       }
       // Create a new file.
+      Uri fileUri = _resourceProvider.pathContext.toUri(path);
       FileSource uriSource = new FileSource(resource, uri);
-      file = new FileState._(this, path, uri, uriSource);
+      file = new FileState._(this, path, uri, fileUri, uriSource);
       _uriToFile[uri] = file;
       _addFileWithPath(path, file);
       _pathToCanonicalFile[path] = file;
@@ -796,8 +803,9 @@
 
       String path = uriSource.fullName;
       File resource = _resourceProvider.getFile(path);
+      Uri fileUri = _resourceProvider.pathContext.toUri(path);
       FileSource source = new FileSource(resource, uri);
-      file = new FileState._(this, path, uri, source);
+      file = new FileState._(this, path, uri, fileUri, source);
       _uriToFile[uri] = file;
       _addFileWithPath(path, file);
       file.refresh();
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 00dda37..3668894 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -1,9 +1,26 @@
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/kernel_metadata.dart';
 import 'package:analyzer/src/fasta/resolution_storer.dart';
-import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:front_end/src/api_prototype/byte_store.dart';
+import 'package:front_end/src/api_prototype/compilation_message.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/file_system.dart' as front_end;
+import 'package:front_end/src/base/libraries_specification.dart';
+import 'package:front_end/src/base/performance_logger.dart';
+import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/fasta/builder/builder.dart';
 import 'package:front_end/src/fasta/builder/library_builder.dart';
+import 'package:front_end/src/fasta/compiler_context.dart';
 import 'package:front_end/src/fasta/dill/dill_target.dart';
 import 'package:front_end/src/fasta/kernel/kernel_target.dart';
+import 'package:front_end/src/fasta/kernel/metadata_collector.dart';
 import 'package:front_end/src/fasta/source/diet_listener.dart';
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/fasta/source/source_loader.dart';
@@ -12,94 +29,29 @@
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
+import 'package:front_end/src/fasta/uri_translator_impl.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart' as kernel;
-
-class AnalyzerDietListener extends DietListener {
-  final Uri _requestedLibraryFileUri;
-  final List<CollectedResolution> _resolutions;
-
-  AnalyzerDietListener(
-      SourceLibraryBuilder library,
-      ClassHierarchy hierarchy,
-      CoreTypes coreTypes,
-      TypeInferenceEngine typeInferenceEngine,
-      this._requestedLibraryFileUri,
-      this._resolutions)
-      : super(library, hierarchy, coreTypes, typeInferenceEngine);
-
-  StackListener createListener(
-      ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope, TypeInferenceListener listener]) {
-    InstrumentedResolutionStorer storer;
-    if (_isInRequestedLibrary(builder)) {
-      var resolution = new CollectedResolution();
-      _resolutions.add(resolution);
-      storer = new InstrumentedResolutionStorer(
-          resolution.kernelDeclarations,
-          resolution.kernelReferences,
-          resolution.kernelTypes,
-          resolution.declarationOffsets,
-          resolution.referenceOffsets,
-          resolution.typeOffsets);
-    }
-    return super.createListener(
-        builder, memberScope, isInstanceMember, formalParameterScope, storer);
-  }
-
-  /// Return `true` if the given [builder] is in the requested library.
-  bool _isInRequestedLibrary(Builder builder) {
-    return builder.computeLibraryUri() == _requestedLibraryFileUri;
-  }
-}
-
-class AnalyzerLoader<L> extends SourceLoader<L> {
-  final Uri _requestedLibraryFileUri;
-  final List<CollectedResolution> _resolutions;
-
-  AnalyzerLoader(FileSystem fileSystem, TargetImplementation target,
-      this._requestedLibraryFileUri, this._resolutions)
-      : super(fileSystem, false, target);
-
-  @override
-  AnalyzerDietListener createDietListener(LibraryBuilder library) {
-    return new AnalyzerDietListener(library, hierarchy, coreTypes,
-        typeInferenceEngine, _requestedLibraryFileUri, _resolutions);
-  }
-}
-
-class AnalyzerTarget extends KernelTarget {
-  final Uri requestedLibraryFileUri;
-  final List<CollectedResolution> resolutions = [];
-
-  AnalyzerTarget(
-      FileSystem fileSystem,
-      DillTarget dillTarget,
-      UriTranslator uriTranslator,
-      bool strongMode,
-      this.requestedLibraryFileUri)
-      : super(fileSystem, false, dillTarget, uriTranslator);
-
-  @override
-  AnalyzerLoader<kernel.Library> createLoader() {
-    return new AnalyzerLoader<kernel.Library>(
-        fileSystem, this, requestedLibraryFileUri, resolutions);
-  }
-}
+import 'package:kernel/kernel.dart';
+import 'package:kernel/src/incremental_class_hierarchy.dart';
+import 'package:kernel/target/targets.dart';
+import 'package:kernel/type_environment.dart';
+import 'package:package_config/packages.dart';
+import 'package:package_config/src/packages_impl.dart';
+import 'package:path/path.dart' as pathos;
 
 /// Resolution information in a single function body.
 class CollectedResolution {
   /// The list of local declarations stored by body builders while
   /// compiling the library.
-  final List<kernel.TreeNode> kernelDeclarations = [];
+  final List<TreeNode> kernelDeclarations = [];
 
   /// The list of references to local or external stored by body builders
   /// while compiling the library.
-  final List<kernel.Node> kernelReferences = [];
+  final List<Node> kernelReferences = [];
 
   /// The list of types stored by body builders while compiling the library.
-  final List<kernel.DartType> kernelTypes = [];
+  final List<DartType> kernelTypes = [];
 
   /// File offsets corresponding to the declarations in [kernelDeclarations].
   ///
@@ -116,3 +68,448 @@
   /// These are used strictly for validation purposes.
   final List<int> typeOffsets = [];
 }
+
+/// The compilation result for a single file.
+class FileCompilationResult {
+  /// The file system URI of the file.
+  final Uri fileUri;
+
+  /// The list of resolution for each code block, e.g function body.
+  final List<CollectedResolution> resolutions;
+
+  /// The list of all FrontEnd errors in the file.
+  final List<CompilationMessage> errors;
+
+  FileCompilationResult(this.fileUri, this.resolutions, this.errors);
+}
+
+/// The wrapper around FrontEnd compiler that can be used incrementally.
+///
+/// When the client needs the kernel, resolution information, and errors for
+/// a library, it should call [compile].  The compiler will compile the library
+/// and the transitive closure of its dependencies.  The results are cached,
+/// so the next invocation for a dependency will be served from the cache.
+///
+/// If a file is changed, [invalidate] should be invoked.  This will invalidate
+/// the file, its library, and the transitive closure of dependencies.  So, the
+/// next invocation of [compile] will recompile libraries required for the
+/// requested library.
+class FrontEndCompiler {
+  static const MSG_PENDING_COMPILE =
+      'A compile() invocation is still executing.';
+
+  /// Options used by the kernel compiler.
+  final ProcessedOptions _options;
+
+  /// The logger to report compilation progress.
+  final PerformanceLog _logger;
+
+  /// The [FileSystem] to access file during compilation.
+  final front_end.FileSystem _fileSystem;
+
+  /// The object that knows how to resolve "package:" and "dart:" URIs.
+  final UriTranslator uriTranslator;
+
+  /// The listener / recorder for compilation errors produced by the compiler.
+  final _ErrorListener _errorListener;
+
+  /// Each key is the absolute URI of a library.
+  /// Each value is the compilation result of the key library.
+  final Map<Uri, LibraryCompilationResult> _results = {};
+
+  /// The [Program] with currently valid libraries. When a file is invalidated,
+  /// we remove the file, its library, and everything affected from [_program].
+  Program _program = new Program();
+
+  /// Each key is the file system URI of a library.
+  /// Each value is the libraries that directly depend on the key library.
+  final Map<Uri, Set<Uri>> _directLibraryDependencies = {};
+
+  /// Each key is the file system URI of a library.
+  /// Each value is the [Library] that is still in the [_program].
+  final Map<Uri, Library> _uriToLibrary = {};
+
+  /// Each key is the file system URI of a part.
+  /// Each value is the file system URI of the library that sources the part.
+  final Map<Uri, Uri> _partToLibrary = {};
+
+  /// Whether [compile] is executing.
+  bool _isCompileExecuting = false;
+
+  factory FrontEndCompiler(
+      PerformanceLog logger,
+      ByteStore byteStore,
+      AnalysisOptions analysisOptions,
+      Folder sdkFolder,
+      SourceFactory sourceFactory,
+      FileSystemState fsState,
+      pathos.Context pathContext) {
+    // Prepare SDK libraries.
+    Map<String, LibraryInfo> dartLibraries = {};
+    {
+      DartSdk dartSdk = sourceFactory.dartSdk;
+      dartSdk.sdkLibraries.forEach((sdkLibrary) {
+        var dartUri = sdkLibrary.shortName;
+        var name = Uri.parse(dartUri).path;
+        var path = dartSdk.mapDartUri(dartUri).fullName;
+        var fileUri = pathContext.toUri(path);
+        dartLibraries[name] = new LibraryInfo(name, fileUri, const []);
+      });
+    }
+
+    // Prepare packages.
+    Packages packages = Packages.noPackages;
+    {
+      Map<String, List<Folder>> packageMap = sourceFactory.packageMap;
+      if (packageMap != null) {
+        var map = <String, Uri>{};
+        for (var name in packageMap.keys) {
+          map[name] = packageMap[name].first.toUri();
+        }
+        packages = new MapPackages(map);
+      }
+    }
+
+    // TODO(scheglov) Should we restore this?
+//    // Try to find the SDK outline.
+//    // It is not used for unit testing, we compile SDK sources.
+//    // But for running shared tests we need the patched SDK.
+//    List<int> sdkOutlineBytes;
+//    if (sdkFolder != null) {
+//      try {
+//        sdkOutlineBytes = sdkFolder
+//            .getChildAssumingFile('vm_platform_strong.dill')
+//            .readAsBytesSync();
+//      } catch (_) {}
+//    }
+
+    var uriTranslator = new UriTranslatorImpl(
+        new TargetLibrariesSpecification('none', dartLibraries), packages);
+    var errorListener = new _ErrorListener();
+    var options = new CompilerOptions()
+      ..target = new _AnalyzerTarget(
+          new TargetFlags(strongMode: analysisOptions.strongMode))
+      ..reportMessages = false
+      ..logger = logger
+      ..fileSystem = new _FileSystemAdaptor(fsState, pathContext)
+      ..byteStore = byteStore
+      ..onError = errorListener.onError;
+    var processedOptions = new ProcessedOptions(options);
+
+    return new FrontEndCompiler._(
+        processedOptions, uriTranslator, errorListener);
+  }
+
+  FrontEndCompiler._(this._options, this.uriTranslator, this._errorListener)
+      : _logger = _options.logger,
+        _fileSystem = _options.fileSystem;
+
+  /// Compile the library with the given absolute [uri], and everything it
+  /// depends on. Return the result of the requested library compilation.
+  ///
+  /// If there is the cached result for the library (compiled directly, or as
+  /// a result of compilation of another library), it will be returned quickly.
+  ///
+  /// Throw [StateError] if another compilation is pending.
+  Future<LibraryCompilationResult> compile(Uri uri) {
+    if (_isCompileExecuting) {
+      throw new StateError(MSG_PENDING_COMPILE);
+    }
+    _isCompileExecuting = true;
+
+    {
+      LibraryCompilationResult result = _results[uri];
+      if (result != null) {
+        _isCompileExecuting = false;
+        return new Future.value(result);
+      }
+    }
+
+    return _runWithFrontEndContext('Compile', () async {
+      try {
+        var dillTarget =
+            new DillTarget(_options.ticker, uriTranslator, _options.target);
+
+        // Append all libraries what we still have in the current program.
+        await _logger.runAsync('Load dill libraries', () async {
+          dillTarget.loader.appendLibraries(_program);
+          await dillTarget.buildOutlines();
+        });
+
+        // Create the target to compile the library.
+        var kernelTarget = new _AnalyzerKernelTarget(_fileSystem, dillTarget,
+            uriTranslator, new AnalyzerMetadataCollector());
+        kernelTarget.read(uri);
+
+        // Compile the entry point into the new program.
+        _program = await _logger.runAsync('Compile', () async {
+          await kernelTarget.buildOutlines(nameRoot: _program.root);
+          return await kernelTarget.buildProgram() ?? _program;
+        });
+
+        // TODO(scheglov) Only for new libraries?
+        _program.computeCanonicalNames();
+
+        _logger.run('Compute dependencies', _computeDependencies);
+
+        // TODO(scheglov) Can we keep the same instance?
+        var types = new TypeEnvironment(
+            new CoreTypes(_program), new IncrementalClassHierarchy());
+
+        // Add results for new libraries.
+        for (var library in _program.libraries) {
+          if (!_results.containsKey(library.importUri)) {
+            Map<Uri, List<CollectedResolution>> libraryResolutions =
+                kernelTarget.resolutions[library.fileUri];
+
+            var files = <Uri, FileCompilationResult>{};
+
+            void addFileResult(Uri fileUri) {
+              if (libraryResolutions != null) {
+                files[fileUri] = new FileCompilationResult(
+                    fileUri,
+                    libraryResolutions[fileUri] ?? [],
+                    _errorListener.fileUriToErrors[fileUri] ?? []);
+              }
+            }
+
+            addFileResult(library.fileUri);
+            for (var part in library.parts) {
+              addFileResult(part.fileUri);
+            }
+
+            var libraryResult = new LibraryCompilationResult(
+                _program, types, library.importUri, library, files);
+            _results[library.importUri] = libraryResult;
+          }
+        }
+        _errorListener.fileUriToErrors.clear();
+
+        // The result must have been computed.
+        return _results[uri];
+      } finally {
+        _isCompileExecuting = false;
+      }
+    });
+  }
+
+  /// Invalidate the file with the given file [uri], its library and the
+  /// transitive the of libraries that use it.  The next time when any of these
+  /// libraries is be requested in [compile], it will be recompiled again.
+  void invalidate(Uri uri) {
+    void invalidateLibrary(Uri libraryUri) {
+      Library library = _uriToLibrary.remove(libraryUri);
+      if (library == null) return;
+
+      // Invalidate the library.
+      _program.libraries.remove(library);
+      _program.root.removeChild('${library.importUri}');
+      _program.uriToSource.remove(libraryUri);
+      _results.remove(library.importUri);
+
+      // Recursively invalidate dependencies.
+      Set<Uri> directDependencies =
+          _directLibraryDependencies.remove(libraryUri);
+      directDependencies?.forEach(invalidateLibrary);
+    }
+
+    Uri libraryUri = _partToLibrary.remove(uri) ?? uri;
+    invalidateLibrary(libraryUri);
+  }
+
+  /// Recompute [_directLibraryDependencies] for the current [_program].
+  void _computeDependencies() {
+    _directLibraryDependencies.clear();
+    _uriToLibrary.clear();
+    _partToLibrary.clear();
+
+    void processLibrary(Library library) {
+      if (_uriToLibrary.containsKey(library.fileUri)) {
+        return;
+      }
+      _uriToLibrary[library.fileUri] = library;
+
+      // Remember libraries for parts.
+      for (var part in library.parts) {
+        _partToLibrary[part.fileUri] = library.fileUri;
+      }
+
+      // Record reverse dependencies.
+      for (LibraryDependency dependency in library.dependencies) {
+        Library targetLibrary = dependency.targetLibrary;
+        _directLibraryDependencies
+            .putIfAbsent(targetLibrary.fileUri, () => new Set<Uri>())
+            .add(library.fileUri);
+        processLibrary(targetLibrary);
+      }
+    }
+
+    // Record dependencies for every library in the program.
+    _program.libraries.forEach(processLibrary);
+  }
+
+  Future<T> _runWithFrontEndContext<T>(String msg, Future<T> f()) async {
+    return await CompilerContext.runWithOptions(_options, (context) {
+      context.disableColors();
+      return _logger.runAsync(msg, f);
+    });
+  }
+}
+
+/// The compilation result for a single library.
+class LibraryCompilationResult {
+  /// The full current [Program]. It has all libraries that are required by
+  /// this library, but might also have other libraries, that are not required.
+  ///
+  /// The object is mutable, and is changed when files are invalidated.
+  final Program program;
+
+  /// The [TypeEnvironment] for the [program].
+  final TypeEnvironment types;
+
+  /// The absolute URI of the library.
+  final Uri uri;
+
+  /// The kernel [Library] of the library.
+  final Library kernel;
+
+  /// The map from file system URIs to results for the defining unit and parts.
+  final Map<Uri, FileCompilationResult> files;
+
+  LibraryCompilationResult(
+      this.program, this.types, this.uri, this.kernel, this.files);
+}
+
+/// The [DietListener] that record resolution information.
+class _AnalyzerDietListener extends DietListener {
+  final Map<Uri, List<CollectedResolution>> _resolutions;
+
+  _AnalyzerDietListener(
+      SourceLibraryBuilder library,
+      ClassHierarchy hierarchy,
+      CoreTypes coreTypes,
+      TypeInferenceEngine typeInferenceEngine,
+      this._resolutions)
+      : super(library, hierarchy, coreTypes, typeInferenceEngine);
+
+  StackListener createListener(
+      ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
+      [Scope formalParameterScope, TypeInferenceListener listener]) {
+    InstrumentedResolutionStorer storer;
+    var fileResolutions = _resolutions[builder.fileUri];
+    if (fileResolutions == null) {
+      fileResolutions = <CollectedResolution>[];
+      _resolutions[builder.fileUri] = fileResolutions;
+    }
+    var resolution = new CollectedResolution();
+    fileResolutions.add(resolution);
+    storer = new InstrumentedResolutionStorer(
+        resolution.kernelDeclarations,
+        resolution.kernelReferences,
+        resolution.kernelTypes,
+        resolution.declarationOffsets,
+        resolution.referenceOffsets,
+        resolution.typeOffsets);
+    return super.createListener(
+        builder, memberScope, isInstanceMember, formalParameterScope, storer);
+  }
+}
+
+/// The [KernelTarget] that records resolution information.
+class _AnalyzerKernelTarget extends KernelTarget {
+  final Map<Uri, Map<Uri, List<CollectedResolution>>> resolutions = {};
+
+  _AnalyzerKernelTarget(front_end.FileSystem fileSystem, DillTarget dillTarget,
+      UriTranslator uriTranslator, MetadataCollector metadataCollector)
+      : super(fileSystem, true, dillTarget, uriTranslator,
+            metadataCollector: metadataCollector);
+
+  @override
+  _AnalyzerSourceLoader<Library> createLoader() {
+    return new _AnalyzerSourceLoader<Library>(fileSystem, this, resolutions);
+  }
+}
+
+/// The [SourceLoader] that record resolution information.
+class _AnalyzerSourceLoader<L> extends SourceLoader<L> {
+  final Map<Uri, Map<Uri, List<CollectedResolution>>> _resolutions;
+
+  _AnalyzerSourceLoader(front_end.FileSystem fileSystem,
+      TargetImplementation target, this._resolutions)
+      : super(fileSystem, true, target);
+
+  @override
+  _AnalyzerDietListener createDietListener(LibraryBuilder library) {
+    var libraryResolutions = <Uri, List<CollectedResolution>>{};
+    _resolutions[library.fileUri] = libraryResolutions;
+    return new _AnalyzerDietListener(
+        library, hierarchy, coreTypes, typeInferenceEngine, libraryResolutions);
+  }
+}
+
+/**
+ * [Target] for static analysis, with all features enabled.
+ */
+class _AnalyzerTarget extends NoneTarget {
+  _AnalyzerTarget(TargetFlags flags) : super(flags);
+
+  @override
+  List<String> get extraRequiredLibraries => const <String>['dart:_internal'];
+
+  @override
+  bool enableNative(Uri uri) => true;
+}
+
+/// The listener for [CompilationMessage]s from FrontEnd.
+class _ErrorListener {
+  final Map<Uri, List<CompilationMessage>> fileUriToErrors = {};
+
+  void onError(CompilationMessage error) {
+    var fileUri = error.span.sourceUrl;
+    fileUriToErrors.putIfAbsent(fileUri, () => []).add(error);
+  }
+}
+
+/// Adapter of [FileSystemState] to [front_end.FileSystem].
+class _FileSystemAdaptor implements front_end.FileSystem {
+  final FileSystemState fsState;
+  final pathos.Context pathContext;
+
+  _FileSystemAdaptor(this.fsState, this.pathContext);
+
+  @override
+  front_end.FileSystemEntity entityForUri(Uri uri) {
+    if (uri.isScheme('file')) {
+      var path = pathContext.fromUri(uri);
+      var file = fsState.getFileForPath(path);
+      return new _FileSystemEntityAdaptor(uri, file);
+    } else {
+      throw new front_end.FileSystemException(
+          uri, 'Only file:// URIs are supported, but $uri is given.');
+    }
+  }
+}
+
+/// Adapter of [FileState] to [front_end.FileSystemEntity].
+class _FileSystemEntityAdaptor implements front_end.FileSystemEntity {
+  final Uri uri;
+  final FileState file;
+
+  _FileSystemEntityAdaptor(this.uri, this.file);
+
+  @override
+  Future<bool> exists() async {
+    return file.exists;
+  }
+
+  @override
+  Future<List<int>> readAsBytes() async {
+    // TODO(scheglov) Optimize.
+    return UTF8.encode(file.content);
+  }
+
+  @override
+  Future<String> readAsString() async {
+    return file.content;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
index be948b9..e0323b2 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
@@ -3,100 +3,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:convert';
 
 import 'package:analyzer/context/declared_variables.dart';
 import 'package:analyzer/dart/element/element.dart' show CompilationUnitElement;
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/dart/analysis/kernel_metadata.dart';
+import 'package:analyzer/src/dart/analysis/frontend_resolution.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine, AnalysisOptions;
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/kernel/resynthesize.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/base/libraries_specification.dart';
 import 'package:front_end/src/base/performance_logger.dart';
-import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/uri_translator_impl.dart';
-import 'package:front_end/src/incremental/kernel_driver.dart';
 import 'package:kernel/ast.dart' as kernel;
-import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart' as kernel;
-import 'package:package_config/packages.dart';
-import 'package:package_config/src/packages_impl.dart';
-import 'package:path/path.dart' as pathos;
-
-/**
- * Create a new [KernelDriver] for the given configuration.
- */
-KernelDriver createKernelDriver(
-    PerformanceLog logger,
-    ByteStore byteStore,
-    AnalysisOptions analysisOptions,
-    Folder sdkFolder,
-    SourceFactory sourceFactory,
-    FileSystemState fsState,
-    pathos.Context pathContext) {
-  // Prepare SDK libraries.
-  Map<String, LibraryInfo> dartLibraries = {};
-  {
-    DartSdk dartSdk = sourceFactory.dartSdk;
-    dartSdk.sdkLibraries.forEach((sdkLibrary) {
-      var dartUri = sdkLibrary.shortName;
-      var name = Uri.parse(dartUri).path;
-      var path = dartSdk.mapDartUri(dartUri).fullName;
-      var fileUri = pathContext.toUri(path);
-      dartLibraries[name] = new LibraryInfo(name, fileUri, const []);
-    });
-  }
-
-  // Prepare packages.
-  Packages packages = Packages.noPackages;
-  {
-    Map<String, List<Folder>> packageMap = sourceFactory.packageMap;
-    if (packageMap != null) {
-      var map = <String, Uri>{};
-      for (var name in packageMap.keys) {
-        map[name] = packageMap[name].first.toUri();
-      }
-      packages = new MapPackages(map);
-    }
-  }
-
-  // Try to find the SDK outline.
-  // It is not used for unit testing, we compile SDK sources.
-  // But for running shared tests we need the patched SDK.
-  List<int> sdkOutlineBytes;
-  if (sdkFolder != null) {
-    try {
-      sdkOutlineBytes = sdkFolder
-          .getChildAssumingFile('vm_platform_strong.dill')
-          .readAsBytesSync();
-    } catch (_) {}
-  }
-
-  var uriTranslator = new UriTranslatorImpl(
-      new TargetLibrariesSpecification('none', dartLibraries), packages);
-  var errorListener = new KernelErrorListener();
-  var options = new ProcessedOptions(new CompilerOptions()
-    ..target = new _AnalysisTarget(
-        new TargetFlags(strongMode: analysisOptions.strongMode))
-    ..reportMessages = false
-    ..logger = logger
-    ..fileSystem = new _FileSystemAdaptor(fsState, pathContext)
-    ..byteStore = byteStore
-    ..onError = errorListener.onError);
-  return new KernelDriver(options, uriTranslator, errorListener,
-      metadataFactory: new AnalyzerMetadataFactory(),
-      sdkOutlineBytes: sdkOutlineBytes);
-}
 
 /**
  * Support for resynthesizing element model from Kernel.
@@ -156,25 +77,24 @@
       DeclaredVariables declaredVariables,
       SourceFactory sourceFactory,
       FileSystemState fsState,
-      KernelDriver driver) async {
+      FrontEndCompiler compiler) async {
     return logger.runAsync('Create kernel context', () async {
       Uri targetUri = targetLibrary.uri;
-      KernelResult kernelResult = await driver.getKernel(targetUri);
+      LibraryCompilationResult compilationResult =
+          await compiler.compile(targetUri);
 
-      // Remember Kernel libraries required to resynthesize the target.
+      // Remember Kernel libraries produced by the compiler.
+      // There might be more libraries than we actually need.
+      // This is probably OK, because we consume them lazily.
       var libraryMap = <String, kernel.Library>{};
       var libraryExistMap = <String, bool>{};
-
-      void addLibrary(kernel.Library library) {
+      for (var library in compilationResult.program.libraries) {
         String uriStr = library.importUri.toString();
         libraryMap[uriStr] = library;
         FileState file = fsState.getFileForUri(library.importUri);
         libraryExistMap[uriStr] = file?.exists ?? false;
       }
 
-      kernelResult.dependencies.forEach(addLibrary);
-      addLibrary(kernelResult.libraryResult.library);
-
       if (DEBUG) {
         print('----------- ${targetLibrary.uriStr}');
         var libraryKernel = libraryMap[targetLibrary.uriStr];
@@ -192,8 +112,8 @@
       analysisContext.contentCache = new _ContentCacheWrapper(fsState);
 
       // Create the resynthesizer bound to the analysis context.
-      var resynthesizer = new KernelResynthesizer(
-          analysisContext, kernelResult.types, libraryMap, libraryExistMap);
+      var resynthesizer = new KernelResynthesizer(analysisContext,
+          compilationResult.types, libraryMap, libraryExistMap);
 
       return new KernelContext._(analysisContext, resynthesizer);
     });
@@ -208,19 +128,6 @@
 }
 
 /**
- * [Target] for static analysis, with all features enabled.
- */
-class _AnalysisTarget extends NoneTarget {
-  _AnalysisTarget(TargetFlags flags) : super(flags);
-
-  @override
-  List<String> get extraRequiredLibraries => const <String>['dart:_internal'];
-
-  @override
-  bool enableNative(Uri uri) => true;
-}
-
-/**
  * [ContentCache] wrapper around [FileContentOverlay].
  */
 class _ContentCacheWrapper implements ContentCache {
@@ -258,45 +165,3 @@
     return fsState.getFileForPath(path);
   }
 }
-
-class _FileSystemAdaptor implements FileSystem {
-  final FileSystemState fsState;
-  final pathos.Context pathContext;
-
-  _FileSystemAdaptor(this.fsState, this.pathContext);
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    if (uri.isScheme('file')) {
-      var path = pathContext.fromUri(uri);
-      var file = fsState.getFileForPath(path);
-      return new _FileSystemEntityAdaptor(uri, file);
-    } else {
-      throw new ArgumentError(
-          'Only file:// URIs are supported, but $uri is given.');
-    }
-  }
-}
-
-class _FileSystemEntityAdaptor implements FileSystemEntity {
-  final Uri uri;
-  final FileState file;
-
-  _FileSystemEntityAdaptor(this.uri, this.file);
-
-  @override
-  Future<bool> exists() async {
-    return file.exists;
-  }
-
-  @override
-  Future<List<int>> readAsBytes() async {
-    // TODO(scheglov) Optimize.
-    return UTF8.encode(file.content);
-  }
-
-  @override
-  Future<String> readAsString() async {
-    return file.content;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 8c3fe08..ac98670 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -37,8 +37,8 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
+import 'package:front_end/src/base/performance_logger.dart';
 import 'package:front_end/src/dependency_walker.dart';
-import 'package:front_end/src/incremental/kernel_driver.dart';
 import 'package:kernel/kernel.dart' as kernel;
 import 'package:kernel/type_algebra.dart' as kernel;
 
@@ -46,14 +46,15 @@
  * Analyzer of a single library.
  */
 class LibraryAnalyzer {
+  final PerformanceLog _logger;
   final AnalysisOptions _analysisOptions;
   final DeclaredVariables _declaredVariables;
   final SourceFactory _sourceFactory;
   final FileState _library;
 
   final bool _enableKernelDriver;
-  final bool _previewDart2;
-  final KernelDriver _kernelDriver;
+  final bool _useCFE;
+  final FrontEndCompiler _frontEndCompiler;
 
   final bool Function(Uri) _isLibraryUri;
   final AnalysisContextImpl _context;
@@ -73,6 +74,7 @@
   final List<ConstantEvaluationTarget> _constants = [];
 
   LibraryAnalyzer(
+      this._logger,
       this._analysisOptions,
       this._declaredVariables,
       this._sourceFactory,
@@ -81,19 +83,19 @@
       this._resynthesizer,
       this._library,
       {bool enableKernelDriver: false,
-      bool previewDart2: false,
-      KernelDriver kernelDriver})
+      bool useCFE: false,
+      FrontEndCompiler frontEndCompiler})
       : _typeProvider = _context.typeProvider,
         _enableKernelDriver = enableKernelDriver,
-        _previewDart2 = previewDart2,
-        _kernelDriver = kernelDriver;
+        _useCFE = useCFE,
+        _frontEndCompiler = frontEndCompiler;
 
   /**
    * Compute analysis results for all units of the library.
    */
   Future<Map<FileState, UnitAnalysisResult>> analyze() async {
     return PerformanceStatistics.analysis.makeCurrentWhileAsync(() async {
-      if (_previewDart2) {
+      if (_useCFE) {
         return await _analyze2();
       } else {
         return _analyze();
@@ -177,100 +179,93 @@
   }
 
   Future<Map<FileState, UnitAnalysisResult>> _analyze2() async {
-    Map<FileState, CompilationUnit> units = {};
+    return await _logger.runAsync('Analyze', () async {
+      Map<FileState, CompilationUnit> units = {};
 
-    // Parse all files.
-    units[_library] = _parse(_library);
-    for (FileState part in _library.partedFiles) {
-      units[part] = _parse(part);
-    }
-
-    // Resolve URIs in directives to corresponding sources.
-    units.forEach((file, unit) {
-      _resolveUriBasedDirectives(file, unit);
-    });
-
-    try {
-      _libraryElement = _resynthesizer
-          .getElement(new ElementLocationImpl.con3([_library.uriStr]));
-
-      _resolveDirectives(units);
-
-      // TODO(scheglov) Improve.
-      AnalyzerTarget analyzerTarget;
-      final kernelResult = await _kernelDriver.compileLibrary(
-          (fileSystem, bool includeComments, dillTarget, uriTranslator,
-                  {metadataCollector}) =>
-              analyzerTarget ??= new AnalyzerTarget(fileSystem, dillTarget,
-                  uriTranslator, _analysisOptions.strongMode, _library.uri),
-          _library.uri);
-
-      var resolutions = new _ResolutionProvider(analyzerTarget.resolutions);
-      units.forEach((file, unit) {
-        _resolveFile2(file, unit, resolutions);
-        _computePendingMissingRequiredParameters(file, unit);
-
-        // Invalid part URIs can result in an element with a null source
-        if (unit.element.source != null) {
-          final reporter = new FastaErrorReporter(_getErrorReporter(file));
-          final libraryKernelResult = kernelResult.results
-              .expand((r) => r.libraryResults)
-              .where((r) => r.library.importUri == unit.element.source.uri)
-              .firstWhere((_) => true, orElse: () => null);
-          libraryKernelResult?.errors?.forEach(
-              (kernelError) => reporter.reportCompilationMessage(kernelError));
+      // Parse all files.
+      _logger.run('Parse units', () {
+        units[_library] = _parse(_library);
+        for (FileState part in _library.partedFiles) {
+          units[part] = _parse(part);
         }
       });
 
-      _computeConstants();
+      // Resolve URIs in directives to corresponding sources.
+      units.forEach((file, unit) {
+        _resolveUriBasedDirectives(file, unit);
+      });
 
-      // TODO(scheglov) Restore.
-//      PerformanceStatistics.errors.makeCurrentWhile(() {
-//        units.forEach((file, unit) {
-//          _computeVerifyErrors(file, unit);
-//        });
-//      });
+      try {
+        _libraryElement = _resynthesizer
+            .getElement(new ElementLocationImpl.con3([_library.uriStr]));
 
-      if (_analysisOptions.hint) {
-        PerformanceStatistics.hints.makeCurrentWhile(() {
+        _resolveDirectives(units);
+
+        var libraryResult = await _logger.runAsync('Compile library', () {
+          return _frontEndCompiler.compile(_library.uri);
+        });
+
+        _logger.run('Apply resolution', () {
           units.forEach((file, unit) {
-            {
-              var visitor = new GatherUsedLocalElementsVisitor(_libraryElement);
-              unit.accept(visitor);
-              _usedLocalElementsList.add(visitor.usedElements);
-            }
-            {
-              var visitor =
-                  new GatherUsedImportedElementsVisitor(_libraryElement);
-              unit.accept(visitor);
-              _usedImportedElementsList.add(visitor.usedElements);
+            var resolutions = libraryResult.files[file.fileUri].resolutions;
+            var resolutionProvider = new _ResolutionProvider(resolutions);
+
+            _resolveFile2(file, unit, resolutionProvider);
+            _computePendingMissingRequiredParameters(file, unit);
+
+            // Invalid part URIs can result in an element with a null source
+            if (unit.element.source != null) {
+              var reporter = new FastaErrorReporter(_getErrorReporter(file));
+              var fileResult = libraryResult.files[file.fileUri];
+              fileResult?.errors?.forEach(reporter.reportCompilationMessage);
             }
           });
-          units.forEach((file, unit) {
-            _computeHints(file, unit);
-          });
         });
+
+        _computeConstants();
+
+        if (_analysisOptions.hint) {
+          PerformanceStatistics.hints.makeCurrentWhile(() {
+            units.forEach((file, unit) {
+              {
+                var visitor =
+                    new GatherUsedLocalElementsVisitor(_libraryElement);
+                unit.accept(visitor);
+                _usedLocalElementsList.add(visitor.usedElements);
+              }
+              {
+                var visitor =
+                    new GatherUsedImportedElementsVisitor(_libraryElement);
+                unit.accept(visitor);
+                _usedImportedElementsList.add(visitor.usedElements);
+              }
+            });
+            units.forEach((file, unit) {
+              _computeHints(file, unit);
+            });
+          });
+        }
+
+        if (_analysisOptions.lint) {
+          PerformanceStatistics.lints.makeCurrentWhile(() {
+            units.forEach((file, unit) {
+              _computeLints(file, unit);
+            });
+          });
+        }
+      } finally {
+        _context.dispose();
       }
 
-      if (_analysisOptions.lint) {
-        PerformanceStatistics.lints.makeCurrentWhile(() {
-          units.forEach((file, unit) {
-            _computeLints(file, unit);
-          });
-        });
-      }
-    } finally {
-      _context.dispose();
-    }
-
-    // Return full results.
-    Map<FileState, UnitAnalysisResult> results = {};
-    units.forEach((file, unit) {
-      List<AnalysisError> errors = _getErrorListener(file).errors;
-      errors = _filterIgnoredErrors(file, errors);
-      results[file] = new UnitAnalysisResult(file, unit, errors);
+      // Return full results.
+      Map<FileState, UnitAnalysisResult> results = {};
+      units.forEach((file, unit) {
+        List<AnalysisError> errors = _getErrorListener(file).errors;
+        errors = _filterIgnoredErrors(file, errors);
+        results[file] = new UnitAnalysisResult(file, unit, errors);
+      });
+      return results;
     });
-    return results;
   }
 
   /**
@@ -513,9 +508,8 @@
    * Return a new parsed unresolved [CompilationUnit].
    */
   CompilationUnit _parse(FileState file) {
-    AnalysisErrorListener errorListener = _previewDart2
-        ? AnalysisErrorListener.NULL_LISTENER
-        : _getErrorListener(file);
+    AnalysisErrorListener errorListener =
+        _useCFE ? AnalysisErrorListener.NULL_LISTENER : _getErrorListener(file);
     String content = file.content;
     CompilationUnit unit = file.parse(errorListener);
 
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index e55219b..56e0f25 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -326,6 +326,23 @@
           "Try choosing a different name for the type parameter.");
 
   /**
+   * 16.33 Identifier Reference: It is a compile-time error if a built-in
+   * identifier is used as the declared name of a prefix, class, type parameter
+   * or type alias.
+   *
+   * Parameters:
+   * 0: the built-in identifier that is being used
+   *
+   * TODO(scheglov) It would be nice to get more specific errors.
+   * https://github.com/dart-lang/sdk/issues/31811
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_IN_DECLARATION =
+      const CompileTimeErrorCode(
+          'BUILT_IN_IDENTIFIER_IN_DECLARATION',
+          "The built-in identifier '{0}' can't be used as a name.",
+          "Try choosing a different name.");
+
+  /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements
    * the operator <i>==</i>.
    *
@@ -949,7 +966,10 @@
    * Parameters:
    * 0: the name of the type that cannot be extended
    *
-   * See [IMPLEMENTS_DISALLOWED_CLASS].
+   * See [IMPLEMENTS_DISALLOWED_CLASS] and [MIXIN_OF_DISALLOWED_CLASS].
+   *
+   * TODO(scheglov) We might want to restore specific code with FrontEnd.
+   * https://github.com/dart-lang/sdk/issues/31821
    */
   static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS =
       const CompileTimeErrorCode(
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 41ef5e3..ee7fdb3 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -2708,16 +2708,6 @@
     errorReporter.reportMessage(message, offset, length);
   }
 
-  @override
-  void addWarning(Message message, int charOffset, int length) {
-    library.addWarning(message, charOffset, uri);
-  }
-
-  @override
-  void addNit(Message message, int charOffset) {
-    library.addNit(message, charOffset, uri);
-  }
-
   /// Return `true` if [token] is either `null` or is the symbol or keyword
   /// [value].
   bool optionalOrNull(String value, Token token) {
diff --git a/pkg/analyzer/lib/src/fasta/mock_element.dart b/pkg/analyzer/lib/src/fasta/mock_element.dart
index 6adb4bf..38c4cbe 100644
--- a/pkg/analyzer/lib/src/fasta/mock_element.dart
+++ b/pkg/analyzer/lib/src/fasta/mock_element.dart
@@ -103,7 +103,8 @@
   computeNode() => unsupported("computeNode", charOffset, fileUri);
 
   @override
-  getAncestor<E>(predicate) => unsupported("getAncestor", charOffset, fileUri);
+  getAncestor<E extends Element>(predicate) =>
+      unsupported("getAncestor", charOffset, fileUri);
 
   @override
   String getExtendedDisplayName(String shortName) {
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index dd0090f..3780770 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -30,6 +30,9 @@
   final List<kernel.DartType> _types;
   int _typeIndex = 0;
 
+  /// The current label scope. Each [Block] adds a new one.
+  _LabelScope _labelScope = new _LabelScope(null);
+
   /// Indicates whether we are applying resolution to an annotation.
   ///
   /// When this field is `true`, [PropertyInducingElement]s should be replaced
@@ -69,6 +72,52 @@
   }
 
   @override
+  void visitAnnotation(Annotation node) {
+    SimpleIdentifier constructorName = node.constructorName;
+
+    // Peek forward and check if the next element is a PrefixElement.
+    SimpleIdentifier topEntity;
+    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
+      PrefixedIdentifier prefixedIdentifier = node.name;
+
+      SimpleIdentifier prefix = prefixedIdentifier.prefix;
+      PrefixElement prefixElement = _getReferenceFor(prefix);
+      _getTypeFor(prefix); // prefix type
+      prefix.staticElement = prefixElement;
+
+      topEntity = prefixedIdentifier.identifier;
+    } else {
+      topEntity = node.name;
+    }
+
+    Element element = _getReferenceFor(topEntity);
+    DartType type = _getTypeFor(topEntity);
+    node.element = element;
+
+    if (element is ConstructorElement) {
+      topEntity.staticElement = element.enclosingElement;
+
+      if (constructorName != null) {
+        constructorName.staticElement = element;
+        constructorName.staticType = element.type;
+      }
+
+      ArgumentList argumentList = node.arguments;
+      if (argumentList != null) {
+        _applyResolutionToArguments(argumentList);
+        _resolveNamedArguments(argumentList, element.parameters);
+      }
+    } else {
+      topEntity.staticElement = element;
+      topEntity.staticType = type;
+      if (constructorName != null) {
+        constructorName.accept(this);
+        node.element = constructorName.staticElement;
+      }
+    }
+  }
+
+  @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
     applyToTypeAnnotation(
@@ -112,6 +161,22 @@
   }
 
   @override
+  void visitBlock(Block node) {
+    _labelScope = new _LabelScope(_labelScope);
+    super.visitBlock(node);
+    _labelScope = _labelScope.parent;
+  }
+
+  @override
+  void visitBreakStatement(BreakStatement node) {
+    SimpleIdentifier label = node.label;
+    if (label != null) {
+      LabelElement labelElement = _labelScope[label.name];
+      label.staticElement = labelElement;
+    }
+  }
+
+  @override
   void visitCascadeExpression(CascadeExpression node) {
     visitNode(node);
     node.staticType = node.target.staticType;
@@ -164,6 +229,15 @@
   }
 
   @override
+  void visitContinueStatement(ContinueStatement node) {
+    SimpleIdentifier label = node.label;
+    if (label != null) {
+      LabelElement labelElement = _labelScope[label.name];
+      label.staticElement = labelElement;
+    }
+  }
+
+  @override
   void visitExpression(Expression node) {
     visitNode(node);
     node.staticType = _getTypeFor(node);
@@ -346,52 +420,6 @@
   }
 
   @override
-  void visitAnnotation(Annotation node) {
-    SimpleIdentifier constructorName = node.constructorName;
-
-    // Peek forward and check if the next element is a PrefixElement.
-    SimpleIdentifier topEntity;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
-      PrefixedIdentifier prefixedIdentifier = node.name;
-
-      SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      PrefixElement prefixElement = _getReferenceFor(prefix);
-      _getTypeFor(prefix); // prefix type
-      prefix.staticElement = prefixElement;
-
-      topEntity = prefixedIdentifier.identifier;
-    } else {
-      topEntity = node.name;
-    }
-
-    Element element = _getReferenceFor(topEntity);
-    DartType type = _getTypeFor(topEntity);
-    node.element = element;
-
-    if (element is ConstructorElement) {
-      topEntity.staticElement = element.enclosingElement;
-
-      if (constructorName != null) {
-        constructorName.staticElement = element;
-        constructorName.staticType = element.type;
-      }
-
-      ArgumentList argumentList = node.arguments;
-      if (argumentList != null) {
-        _applyResolutionToArguments(argumentList);
-        _resolveNamedArguments(argumentList, element.parameters);
-      }
-    } else {
-      topEntity.staticElement = element;
-      topEntity.staticType = type;
-      if (constructorName != null) {
-        constructorName.accept(this);
-        node.element = constructorName.staticElement;
-      }
-    }
-  }
-
-  @override
   void visitIsExpression(IsExpression node) {
     node.expression.accept(this);
     applyToTypeAnnotation(
@@ -400,6 +428,15 @@
   }
 
   @override
+  void visitLabel(Label node) {
+    SimpleIdentifier label = node.label;
+    String name = label.name;
+    var element = new LabelElementImpl(name, label.offset, false, false);
+    _labelScope.add(name, element);
+    label.staticElement = element;
+  }
+
+  @override
   void visitListLiteral(ListLiteral node) {
     node.elements.accept(this);
     DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
@@ -440,8 +477,13 @@
 
     node.staticInvokeType = invokeType;
     node.staticType = resultType;
-    node.methodName.staticElement = invokeElement;
-    node.methodName.staticType = invokeType;
+
+    if (node.methodName.name == 'call' && invokeElement == null) {
+      // Don't resolve explicit call() invocation of function types.
+    } else {
+      node.methodName.staticElement = invokeElement;
+      node.methodName.staticType = invokeType;
+    }
 
     if (invokeType is FunctionType) {
       if (node.typeArguments != null &&
@@ -1029,3 +1071,26 @@
     return super._getTypeFor(entity);
   }
 }
+
+/// The hierarchical scope for labels.
+class _LabelScope {
+  final _LabelScope parent;
+  final Map<String, LabelElement> elements = {};
+
+  _LabelScope(this.parent);
+
+  LabelElement operator [](String name) {
+    var element = elements[name];
+    if (element != null) {
+      return element;
+    }
+    if (parent != null) {
+      return parent[name];
+    }
+    return null;
+  }
+
+  void add(String name, LabelElement element) {
+    elements[name] = element;
+  }
+}
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 4e7d136e..9215502 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -455,7 +455,8 @@
     _replaceType(invokeType, resultOffset);
 
     if (!isImplicitCall) {
-      throw new UnimplementedError(); // TODO(scheglov): handle this case
+      _replaceReference(const NullNode('explicit-call'));
+      _replaceType(const NullType());
     }
     super.genericExpressionExit("methodInvocation", expression, inferredType);
   }
@@ -495,8 +496,8 @@
 
   @override
   void propertyGetExitCall(Expression expression, DartType inferredType) {
-    throw new UnimplementedError(); // TODO(scheglov): handle this case
-    // super.propertyGetExitCall(expression, inferredType);
+    _recordReference(const NullNode('explicit-call'), expression.fileOffset);
+    _recordType(const NullType(), expression.fileOffset);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 6dee157..a28b6ca 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -590,6 +590,7 @@
         _applyType(element.bound, node.bound);
       }
     }
+    _setGenericFunctionType(node.bound, element.bound);
     super.visitTypeParameter(node);
     _resolveMetadata(node, node.metadata, element);
     return null;
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 2fa521d..abf9bae 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -25,6 +25,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/task/strong/checker.dart';
 
 /**
  * An object used by instances of [ResolverVisitor] to resolve references within
@@ -166,7 +167,7 @@
       Expression leftHandSide = node.leftHandSide;
       if (leftHandSide != null) {
         String methodName = operatorType.lexeme;
-        DartType staticType = _getStaticType(leftHandSide);
+        DartType staticType = _getStaticType(leftHandSide, read: true);
         MethodElement staticMethod =
             _lookUpMethod(leftHandSide, staticType, methodName);
         node.staticElement = staticMethod;
@@ -979,7 +980,7 @@
         operatorType == TokenType.MINUS_MINUS) {
       Expression operand = node.operand;
       String methodName = _getPrefixOperator(node);
-      DartType staticType = _getStaticType(operand);
+      DartType staticType = _getStaticType(operand, read: true);
       MethodElement staticMethod =
           _lookUpMethod(operand, staticType, methodName);
       node.staticElement = staticMethod;
@@ -1418,17 +1419,6 @@
   }
 
   /**
-   * Return `true` if the given [element] is or inherits from a class marked
-   * with `@proxy`.
-   * 
-   * See [ClassElement.isOrInheritsProxy].
-   */
-  bool _hasProxy(Element element) =>
-      !_resolver.strongMode &&
-      element is ClassElement &&
-      element.isOrInheritsProxy;
-
-  /**
    * Look for any declarations of the given [identifier] that are imported using
    * a prefix. Return the element that was found, or `null` if the name is not
    * imported using a prefix.
@@ -1555,8 +1545,8 @@
    * Return the static type of the given [expression] that is to be used for
    * type analysis.
    */
-  DartType _getStaticType(Expression expression) {
-    DartType staticType = _getStaticTypeOrFunctionType(expression);
+  DartType _getStaticType(Expression expression, {bool read: false}) {
+    DartType staticType = _getStaticTypeOrFunctionType(expression, read: read);
     if (staticType is FunctionType) {
       //
       // All function types are subtypes of 'Function', which is itself a
@@ -1567,14 +1557,27 @@
     return staticType;
   }
 
-  DartType _getStaticTypeOrFunctionType(Expression expression) {
+  DartType _getStaticTypeOrFunctionType(Expression expression,
+      {bool read: false}) {
     if (expression is NullLiteral) {
       return _resolver.typeProvider.nullType;
     }
-    return _resolveTypeParameter(expression.staticType);
+    DartType type = read ? getReadType(expression) : expression.staticType;
+    return _resolveTypeParameter(type);
   }
 
   /**
+   * Return `true` if the given [element] is or inherits from a class marked
+   * with `@proxy`.
+   *
+   * See [ClassElement.isOrInheritsProxy].
+   */
+  bool _hasProxy(Element element) =>
+      !_resolver.strongMode &&
+      element is ClassElement &&
+      element.isOrInheritsProxy;
+
+  /**
    * Check for a generic method & apply type arguments if any were passed.
    */
   DartType _instantiateGenericMethod(
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6bfaf4d..82b8ad0 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -51,6 +51,8 @@
 
   static final _testDir = '${path.separator}test${path.separator}';
 
+  static final _testingDir = '${path.separator}testing${path.separator}';
+
   /**
    * The class containing the AST nodes being visited, or `null` if we are not in the scope of
    * a class.
@@ -879,10 +881,19 @@
     bool inCurrentLibrary(Element element) =>
         element.library == _currentLibrary;
 
+    bool inExportDirective(SimpleIdentifier identifier) =>
+        identifier.parent is Combinator &&
+        identifier.parent.parent is ExportDirective;
+
     bool inTestDirectory(LibraryElement library) =>
-        library.definingCompilationUnit.source.fullName.contains(_testDir);
+        library.definingCompilationUnit.source.fullName.contains(_testDir) ||
+        library.definingCompilationUnit.source.fullName.contains(_testingDir);
 
     Element element = identifier.bestElement;
+    if (!isProtected(element) && !isVisibleForTesting(element)) {
+      return;
+    }
+
     if (isProtected(element)) {
       if (inCurrentLibrary(element) || inCommentReference(identifier)) {
         // The access is valid; even if [element] is also marked
@@ -894,18 +905,29 @@
           identifier.getAncestor((AstNode node) => node is ClassDeclaration);
       if (_hasTypeOrSuperType(accessingClass?.element, definingClass.type)) {
         return;
-      } else {
-        _errorReporter.reportErrorForNode(
-            HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
-            identifier,
-            [identifier.name.toString(), definingClass.name]);
       }
     }
-    if (isVisibleForTesting(element) &&
-        !inCurrentLibrary(element) &&
-        !inTestDirectory(_currentLibrary) &&
-        !inCommentReference(identifier)) {
-      Element definingClass = element.enclosingElement;
+    if (isVisibleForTesting(element)) {
+      if (inCurrentLibrary(element) ||
+          inTestDirectory(_currentLibrary) ||
+          inExportDirective(identifier) ||
+          inCommentReference(identifier)) {
+        // The access is valid; even if [element] is also marked
+        // `protected`, the "visibilities" are unioned.
+        return;
+      }
+    }
+
+    // At this point, [identifier] was not cleared as protected access, nor
+    // cleared as access for testing. Report the appropriate violation(s).
+    Element definingClass = element.enclosingElement;
+    if (isProtected(element)) {
+      _errorReporter.reportErrorForNode(
+          HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
+          identifier,
+          [identifier.name.toString(), definingClass.name]);
+    }
+    if (isVisibleForTesting(element)) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
           identifier,
@@ -4188,7 +4210,7 @@
    * already has a context type. This recorded type will be the least upper
    * bound of all types added with [addReturnOrYieldType].
    */
-  void popReturnContext(BlockFunctionBody node) {
+  void popReturnContext(FunctionBody node) {
     if (_returnStack.isNotEmpty && _inferredReturn.isNotEmpty) {
       DartType context = _returnStack.removeLast() ?? DynamicTypeImpl.instance;
       DartType inferred = _inferredReturn.removeLast();
@@ -4204,7 +4226,7 @@
   /**
    * Push a block function body's return type onto the return stack.
    */
-  void pushReturnContext(BlockFunctionBody node) {
+  void pushReturnContext(FunctionBody node) {
     _returnStack.add(getContext(node));
     _inferredReturn.add(_typeProvider.nullType);
   }
@@ -4769,6 +4791,12 @@
   FunctionBody _currentFunctionBody;
 
   /**
+   * The type of the expression of the immediately enclosing [SwitchStatement],
+   * or `null` if not in a [SwitchStatement].
+   */
+  DartType _enclosingSwitchStatementExpressionType;
+
+  /**
    * Are we running in strong mode or not.
    */
   bool strongMode;
@@ -5217,6 +5245,8 @@
     Expression leftOperand = node.leftOperand;
     Expression rightOperand = node.rightOperand;
     if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
+      InferenceContext.setType(leftOperand, typeProvider.boolType);
+      InferenceContext.setType(rightOperand, typeProvider.boolType);
       leftOperand?.accept(this);
       if (rightOperand != null) {
         _overrideManager.enterScope();
@@ -5240,6 +5270,8 @@
         }
       }
     } else if (operatorType == TokenType.BAR_BAR) {
+      InferenceContext.setType(leftOperand, typeProvider.boolType);
+      InferenceContext.setType(rightOperand, typeProvider.boolType);
       leftOperand?.accept(this);
       if (rightOperand != null) {
         _overrideManager.enterScope();
@@ -5537,6 +5569,7 @@
   Object visitDoStatement(DoStatement node) {
     _overrideManager.enterScope();
     try {
+      InferenceContext.setType(node.condition, typeProvider.boolType);
       super.visitDoStatement(node);
     } finally {
       _overrideManager.exitScope();
@@ -5590,9 +5623,19 @@
     _overrideManager.enterScope();
     try {
       InferenceContext.setTypeFromNode(node.expression, node);
+      inferenceContext.pushReturnContext(node);
       super.visitExpressionFunctionBody(node);
+
+      DartType type = node.expression.staticType;
+      if (_enclosingFunction.isAsynchronous) {
+        type = type.flattenFutures(typeSystem);
+      }
+      if (type != null) {
+        inferenceContext.addReturnOrYieldType(type);
+      }
     } finally {
       _overrideManager.exitScope();
+      inferenceContext.popReturnContext(node);
     }
     return null;
   }
@@ -5624,25 +5667,40 @@
 
   @override
   void visitForEachStatementInScope(ForEachStatement node) {
+    Expression iterable = node.iterable;
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    SimpleIdentifier identifier = node.identifier;
+
+    identifier?.accept(this);
+
+    DartType valueType;
+    if (loopVariable != null) {
+      TypeAnnotation typeAnnotation = loopVariable.type;
+      valueType = typeAnnotation?.type ?? typeProvider.dynamicType;
+    }
+    if (identifier != null) {
+      Element element = identifier.staticElement;
+      if (element is VariableElement) {
+        valueType = element.type;
+      } else if (element is PropertyAccessorElement) {
+        if (element.parameters.isNotEmpty) {
+          valueType = element.parameters[0].type;
+        }
+      }
+    }
+    if (valueType != null) {
+      InterfaceType targetType = (node.awaitKeyword == null)
+          ? typeProvider.iterableType
+          : typeProvider.streamType;
+      InferenceContext.setType(iterable, targetType.instantiate([valueType]));
+    }
+
     //
     // We visit the iterator before the loop variable because the loop variable
     // cannot be in scope while visiting the iterator.
     //
-    Expression iterable = node.iterable;
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    SimpleIdentifier identifier = node.identifier;
-    if (loopVariable?.type?.type != null) {
-      InterfaceType targetType = (node.awaitKeyword == null)
-          ? typeProvider.iterableType
-          : typeProvider.streamType;
-      InferenceContext.setType(
-          iterable,
-          targetType
-              .instantiate([resolutionMap.typeForTypeName(loopVariable.type)]));
-    }
     iterable?.accept(this);
     loopVariable?.accept(this);
-    identifier?.accept(this);
     Statement body = node.body;
     if (body != null) {
       _overrideManager.enterScope();
@@ -5694,6 +5752,7 @@
   void visitForStatementInScope(ForStatement node) {
     node.variables?.accept(this);
     node.initialization?.accept(this);
+    InferenceContext.setType(node.condition, typeProvider.boolType);
     node.condition?.accept(this);
     _overrideManager.enterScope();
     try {
@@ -5810,6 +5869,7 @@
   @override
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
+    InferenceContext.setType(condition, typeProvider.boolType);
     condition?.accept(this);
     Map<VariableElement, DartType> thenOverrides =
         const <VariableElement, DartType>{};
@@ -6074,6 +6134,8 @@
   Object visitSwitchCase(SwitchCase node) {
     _overrideManager.enterScope();
     try {
+      InferenceContext.setType(
+          node.expression, _enclosingSwitchStatementExpressionType);
       super.visitSwitchCase(node);
     } finally {
       _overrideManager.exitScope();
@@ -6093,6 +6155,19 @@
   }
 
   @override
+  Object visitSwitchStatementInScope(SwitchStatement node) {
+    var previousExpressionType = _enclosingSwitchStatementExpressionType;
+    try {
+      node.expression?.accept(this);
+      _enclosingSwitchStatementExpressionType = node.expression.staticType;
+      node.members.accept(this);
+    } finally {
+      _enclosingSwitchStatementExpressionType = previousExpressionType;
+    }
+    return null;
+  }
+
+  @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _overrideManager.enterScope();
     try {
@@ -6147,6 +6222,7 @@
     try {
       _implicitLabelScope = _implicitLabelScope.nest(node);
       Expression condition = node.condition;
+      InferenceContext.setType(condition, typeProvider.boolType);
       condition?.accept(this);
       Statement body = node.body;
       if (body != null) {
@@ -7543,7 +7619,7 @@
               new LabelScope(labelScope, labelName.name, member, labelElement);
         }
       }
-      super.visitSwitchStatement(node);
+      visitSwitchStatementInScope(node);
     } finally {
       labelScope = outerScope;
       _implicitLabelScope = outerImplicitScope;
@@ -7551,6 +7627,10 @@
     return null;
   }
 
+  void visitSwitchStatementInScope(SwitchStatement node) {
+    super.visitSwitchStatement(node);
+  }
+
   @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 8216594..11ed85d 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -18,7 +18,8 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/task/strong/checker.dart' show getDefiniteType;
+import 'package:analyzer/src/task/strong/checker.dart'
+    show getDefiniteType, getReadType;
 
 /**
  * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
@@ -128,6 +129,9 @@
         // inferred a type in some fashion.
         if (p.hasImplicitType && (p.type == null || p.type.isDynamic)) {
           inferredType = ts.upperBoundForType(inferredType);
+          if (inferredType.isDartCoreNull) {
+            inferredType = _typeProvider.objectType;
+          }
           if (!inferredType.isDynamic) {
             p.type = inferredType;
             inferred = true;
@@ -314,7 +318,8 @@
     } else if (operator == TokenType.QUESTION_QUESTION_EQ) {
       // The static type of a compound assignment using ??= is the least upper
       // bound of the static types of the LHS and RHS.
-      _analyzeLeastUpperBound(node, node.leftHandSide, node.rightHandSide);
+      _analyzeLeastUpperBound(node, node.leftHandSide, node.rightHandSide,
+          read: true);
       return null;
     } else if (operator == TokenType.AMPERSAND_AMPERSAND_EQ ||
         operator == TokenType.BAR_BAR_EQ) {
@@ -323,7 +328,7 @@
       ExecutableElement staticMethodElement = node.staticElement;
       DartType staticType = _computeStaticReturnType(staticMethodElement);
       staticType = _typeSystem.refineBinaryExpressionType(
-          node.leftHandSide.staticType,
+          _getStaticType(node.leftHandSide, read: true),
           operator,
           node.rightHandSide.staticType,
           staticType);
@@ -1062,11 +1067,11 @@
   @override
   Object visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
-    DartType staticType = _getStaticType(operand);
+    DartType staticType = _getStaticType(operand, read: true);
     TokenType operator = node.operator.type;
     if (operator == TokenType.MINUS_MINUS || operator == TokenType.PLUS_PLUS) {
       DartType intType = _typeProvider.intType;
-      if (identical(_getStaticType(node.operand), intType)) {
+      if (identical(staticType, intType)) {
         staticType = intType;
       }
     }
@@ -1171,7 +1176,7 @@
       if (operator == TokenType.MINUS_MINUS ||
           operator == TokenType.PLUS_PLUS) {
         DartType intType = _typeProvider.intType;
-        if (identical(_getStaticType(node.operand), intType)) {
+        if (identical(_getStaticType(node.operand, read: true), intType)) {
           staticType = intType;
         }
       }
@@ -1444,9 +1449,10 @@
    * of the static (propagated) types of subexpressions [expr1] and [expr2].
    */
   void _analyzeLeastUpperBound(
-      Expression node, Expression expr1, Expression expr2) {
-    DartType staticType1 = _getDefiniteType(expr1);
-    DartType staticType2 = _getDefiniteType(expr2);
+      Expression node, Expression expr1, Expression expr2,
+      {bool read: false}) {
+    DartType staticType1 = _getDefiniteType(expr1, read: read);
+    DartType staticType2 = _getDefiniteType(expr2, read: read);
     if (staticType1 == null) {
       // TODO(brianwilkerson) Determine whether this can still happen.
       staticType1 = _dynamicType;
@@ -1658,8 +1664,8 @@
    * See [getDefiniteType] for more information. Without strong mode, this is
    * equivalent to [_getStaticType].
    */
-  DartType _getDefiniteType(Expression expr) =>
-      getDefiniteType(expr, _typeSystem, _typeProvider);
+  DartType _getDefiniteType(Expression expr, {bool read: false}) =>
+      getDefiniteType(expr, _typeSystem, _typeProvider, read: read);
 
   /**
    * If the given element name can be mapped to the name of a class defined within the given
@@ -1793,8 +1799,13 @@
   /**
    * Return the static type of the given [expression].
    */
-  DartType _getStaticType(Expression expression) {
-    DartType type = expression.staticType;
+  DartType _getStaticType(Expression expression, {bool read: false}) {
+    DartType type;
+    if (read) {
+      type = getReadType(expression);
+    } else {
+      type = expression.staticType;
+    }
     if (type == null) {
       // TODO(brianwilkerson) Determine the conditions for which the static type
       // is null.
@@ -2012,36 +2023,27 @@
    * (in strong mode) a local function declaration.
    */
   void _inferLocalFunctionReturnType(FunctionExpression node) {
-    bool recordInference = false;
     ExecutableElementImpl functionElement =
         node.element as ExecutableElementImpl;
 
     FunctionBody body = node.body;
-    DartType computedType;
-    if (body is ExpressionFunctionBody) {
-      computedType = _getStaticType(body.expression);
-    } else {
-      computedType = _dynamicType;
-    }
 
-    // If we had a better type from the function body, use it.
-    //
-    // This helps in a few cases:
-    // * ExpressionFunctionBody, when the surrounding context had a better type.
-    // * BlockFunctionBody, if we inferred a type from yield/return.
-    // * we also normalize bottom to dynamic here.
-    if (_strongMode &&
-        (computedType.isDartCoreNull || computedType.isDynamic)) {
-      DartType contextType = InferenceContext.getContext(body);
-      computedType = contextType ?? _dynamicType;
-      recordInference = !computedType.isDynamic;
+    DartType computedType;
+    if (_strongMode) {
+      computedType = InferenceContext.getContext(body) ?? _dynamicType;
+    } else {
+      if (body is ExpressionFunctionBody) {
+        computedType = _getStaticType(body.expression);
+      } else {
+        computedType = _dynamicType;
+      }
     }
 
     computedType = _computeReturnTypeOfFunction(body, computedType);
     functionElement.returnType = computedType;
     _recordPropagatedTypeOfFunction(functionElement, node.body);
     _recordStaticType(node, functionElement.type);
-    if (recordInference) {
+    if (_strongMode) {
       _resolver.inferenceContext.recordInference(node, functionElement.type);
     }
   }
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 435f026..5586c26 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -925,16 +925,27 @@
     unitElement.librarySource = librarySource;
 
     if (fileUri != null) {
-      // Compute the URI relative to the library directory.
-      // E.g. when the library directory URI is `sdk/lib/core`, and the unit
-      // URI is `sdk/lib/core/bool.dart`, the result is `bool.dart`.
-      var relativeUri = pathos.url.relative(fileUri, from: libraryDirectoryUri);
-      // Compute the absolute URI.
-      // When the absolute library URI is `dart:core`, and the relative
-      // URI is `bool.dart`, the result is `dart:core/bool.dart`.
-      Uri absoluteUri =
-          resolveRelativeUri(librarySource.uri, Uri.parse(relativeUri));
-      String absoluteUriStr = absoluteUri.toString();
+      String absoluteUriStr;
+      if (fileUri.startsWith('file://')) {
+        // Compute the URI relative to the library directory.
+        // E.g. when the library directory URI is `sdk/lib/core`, and the unit
+        // URI is `sdk/lib/core/bool.dart`, the result is `bool.dart`.
+        var relativeUri =
+            pathos.url.relative(fileUri, from: libraryDirectoryUri);
+        // Compute the absolute URI.
+        // When the absolute library URI is `dart:core`, and the relative
+        // URI is `bool.dart`, the result is `dart:core/bool.dart`.
+        Uri absoluteUri =
+            resolveRelativeUri(librarySource.uri, Uri.parse(relativeUri));
+        absoluteUriStr = absoluteUri.toString();
+      } else {
+        // File URIs must have the "file" scheme.
+        // But for invalid URIs, which cannot be even parsed, FrontEnd returns
+        // URIs with the "org-dartlang-malformed-uri" scheme, and does not
+        // resolve them to file URIs.
+        // We don't have anything better than to use these URIs as is.
+        absoluteUriStr = fileUri;
+      }
       unitElement.source = resynthesizer._getSource(absoluteUriStr);
     } else {
       unitElement.source = librarySource;
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 5839720..7cd78e7 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -229,7 +229,10 @@
       // TODO(paulberry): do I need to store type arguments?
       return result;
     }
-    if (element is GenericFunctionTypeElement) {
+    if (element is GenericFunctionTypeElementForLink) {
+      // TODO(mfairhurst) update the typeParameterContext to be the current
+      // element. See test_constExpr_makeTypedList_functionType. This causes
+      // serious breakages elsewhere.
       result.entityKind = EntityRefKind.genericFunctionType;
       result.syntheticReturnType = _createLinkedType(
           type.returnType, compilationUnit, typeParameterContext);
@@ -237,6 +240,8 @@
           .map((ParameterElement param) => _serializeSyntheticParam(
               param, compilationUnit, typeParameterContext))
           .toList();
+      _storeTypeArguments(
+          type.typeArguments, result, compilationUnit, typeParameterContext);
       return result;
     }
     // TODO(paulberry): implement other cases.
@@ -1982,10 +1987,13 @@
    * better return type).
    */
   DartType _computeDefaultReturnType() {
-    if (_unlinkedExecutable.kind == UnlinkedExecutableKind.setter &&
+    var kind = _unlinkedExecutable.kind;
+    var isMethod = kind == UnlinkedExecutableKind.functionOrMethod;
+    var isSetter = kind == UnlinkedExecutableKind.setter;
+    if ((isSetter || isMethod && _unlinkedExecutable.name == '[]=') &&
         (library as LibraryElementForLink)._linker.strongMode) {
-      // In strong mode, setters without an explicit return type are
-      // considered to return `void`.
+      // In strong mode, setters and `[]=` operators without an explicit
+      // return type are considered to return `void`.
       return VoidTypeImpl.instance;
     } else {
       return DynamicTypeImpl.instance;
@@ -2528,7 +2536,7 @@
     DartType itemType = numItems == 0
         ? DynamicTypeImpl.instance
         : _popList(numItems).reduce(_leastUpperBound);
-    itemType = _dynamicIfNull(itemType);
+    itemType ??= DynamicTypeImpl.instance;
     stack.add(typeProvider.listType.instantiate(<DartType>[itemType]));
   }
 
@@ -2546,8 +2554,8 @@
             valueType == null ? type : _leastUpperBound(valueType, type);
       }
     }
-    keyType = _dynamicIfNull(keyType);
-    valueType = _dynamicIfNull(valueType);
+    keyType ??= DynamicTypeImpl.instance;
+    valueType ??= DynamicTypeImpl.instance;
     stack.add(typeProvider.mapType.instantiate(<DartType>[keyType, valueType]));
   }
 
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index dc091cb..f487341 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -74,7 +74,8 @@
   @override
   EntityRefBuilder serializeConstructorRef(DartType type, Identifier typeName,
       TypeArgumentList typeArguments, SimpleIdentifier name) {
-    EntityRefBuilder typeBuilder = serializeType(type, typeName, typeArguments);
+    EntityRefBuilder typeBuilder =
+        serializeTypeName(type, typeName, typeArguments);
     if (name == null) {
       return typeBuilder;
     } else {
@@ -143,10 +144,14 @@
   }
 
   @override
-  EntityRefBuilder serializeType(
+  EntityRefBuilder serializeTypeName(
       DartType type, Identifier name, TypeArgumentList arguments) {
-    return visitor.serializeType(name, arguments);
+    return visitor.serializeTypeName(name, arguments);
   }
+
+  @override
+  EntityRefBuilder serializeGenericFunctionType(GenericFunctionType node) =>
+      visitor.serializeGenericFunctionType(node);
 }
 
 /**
@@ -449,16 +454,15 @@
     b.typeParameters =
         serializeTypeParameters(typeParameters, typeParameterScope);
     if (superclass != null) {
-      b.supertype = serializeTypeName(superclass);
+      b.supertype = serializeType(superclass);
     } else {
       b.hasNoSupertype = isCoreLibrary && name == 'Object';
     }
     if (withClause != null) {
-      b.mixins = withClause.mixinTypes.map(serializeTypeName).toList();
+      b.mixins = withClause.mixinTypes.map(serializeType).toList();
     }
     if (implementsClause != null) {
-      b.interfaces =
-          implementsClause.interfaces.map(serializeTypeName).toList();
+      b.interfaces = implementsClause.interfaces.map(serializeType).toList();
     }
     if (members != null) {
       scopes.add(buildClassMemberScope(name, members));
@@ -624,7 +628,7 @@
     if (!isTopLevel) {
       b.isStatic = isDeclaredStatic;
     }
-    b.returnType = serializeTypeName(returnType);
+    b.returnType = serializeType(returnType);
     bool isSemanticallyStatic = isTopLevel || isDeclaredStatic;
     if (formalParameters != null) {
       bool oldMayInheritCovariance = _parametersMayInheritCovariance;
@@ -735,7 +739,7 @@
    */
   void serializeFunctionTypedParameterDetails(UnlinkedParamBuilder b,
       TypeAnnotation returnType, FormalParameterList parameters) {
-    EntityRefBuilder serializedReturnType = serializeTypeName(returnType);
+    EntityRefBuilder serializedReturnType = serializeType(returnType);
     if (serializedReturnType != null) {
       b.type = serializedReturnType;
     }
@@ -759,7 +763,7 @@
         serializeTypeParameters(node.typeParameters, typeParameterScope);
     b.syntheticReturnType = node.returnType == null
         ? serializeDynamic()
-        : serializeTypeName(node.returnType);
+        : serializeType(node.returnType);
     b.syntheticParams = node.parameters.parameters
         .map((FormalParameter p) => p.accept(this) as UnlinkedParamBuilder)
         .toList();
@@ -866,7 +870,7 @@
    * a [EntityRef].  Note that this method does the right thing if the
    * name doesn't refer to an entity other than a type (e.g. a class member).
    */
-  EntityRefBuilder serializeType(
+  EntityRefBuilder serializeTypeName(
       Identifier identifier, TypeArgumentList typeArguments) {
     if (identifier == null) {
       return null;
@@ -911,8 +915,7 @@
             'Unexpected identifier type: ${identifier.runtimeType}');
       }
       if (typeArguments != null) {
-        b.typeArguments =
-            typeArguments.arguments.map(serializeTypeName).toList();
+        b.typeArguments = typeArguments.arguments.map(serializeType).toList();
       }
       return b;
     }
@@ -924,9 +927,9 @@
    * a [EntityRef].  Note that this method does the right thing if the
    * name doesn't refer to an entity other than a type (e.g. a class member).
    */
-  EntityRefBuilder serializeTypeName(TypeAnnotation node) {
+  EntityRefBuilder serializeType(TypeAnnotation node) {
     if (node is TypeName) {
-      return serializeType(node?.name, node?.typeArguments);
+      return serializeTypeName(node?.name, node?.typeArguments);
     } else if (node is GenericFunctionType) {
       return serializeGenericFunctionType(node);
     } else if (node != null) {
@@ -974,7 +977,7 @@
       b.isStatic = isDeclaredStatic;
       b.name = variable.name.name;
       b.nameOffset = variable.name.offset;
-      b.type = serializeTypeName(variables.type);
+      b.type = serializeType(variables.type);
       b.documentationComment = serializeDocumentation(documentationComment);
       b.annotations = serializeAnnotations(annotations);
       b.codeRange = serializeCodeRange(variables.parent);
@@ -1158,7 +1161,7 @@
       if (node.parameters != null) {
         serializeFunctionTypedParameterDetails(b, node.type, node.parameters);
       } else {
-        b.type = serializeTypeName(node.type);
+        b.type = serializeType(node.type);
       }
     }
     return b;
@@ -1222,7 +1225,7 @@
     b.nameOffset = node.name.offset;
     b.typeParameters =
         serializeTypeParameters(node.typeParameters, typeParameterScope);
-    EntityRefBuilder serializedReturnType = serializeTypeName(node.returnType);
+    EntityRefBuilder serializedReturnType = serializeType(node.returnType);
     if (serializedReturnType != null) {
       b.returnType = serializedReturnType;
     }
@@ -1345,7 +1348,7 @@
   @override
   UnlinkedParamBuilder visitSimpleFormalParameter(SimpleFormalParameter node) {
     UnlinkedParamBuilder b = serializeParameter(node);
-    b.type = serializeTypeName(node.type);
+    b.type = serializeType(node.type);
     return b;
   }
 
@@ -1361,7 +1364,7 @@
     b.name = node.name.name;
     b.nameOffset = node.name.offset;
     if (node.bound != null) {
-      b.bound = serializeTypeName(node.bound);
+      b.bound = serializeType(node.bound);
     }
     b.annotations = serializeAnnotations(node.metadata);
     b.codeRange = serializeCodeRange(node);
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index d64b3ec..ad72193 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -198,15 +198,25 @@
    * given [name] and [arguments].  The parameter [type] might be `null` if the
    * type is not resolved.
    */
-  EntityRefBuilder serializeType(
+  EntityRefBuilder serializeTypeName(
       DartType type, Identifier name, TypeArgumentList arguments);
 
   /**
+   * Return [EntityRefBuilder] that corresponds to the [type], which is defined
+   * using generic function type syntax. These may appear as the type arguments
+   * of a const list, etc.
+   */
+  EntityRefBuilder serializeGenericFunctionType(GenericFunctionType type);
+
+  /**
    * Return [EntityRefBuilder] that corresponds to the given [type].
    */
-  EntityRefBuilder serializeTypeName(TypeAnnotation type) {
+  EntityRefBuilder serializeType(TypeAnnotation type) {
     if (type is TypeName) {
-      return serializeType(type?.type, type?.name, type?.typeArguments);
+      return serializeTypeName(type?.type, type?.name, type?.typeArguments);
+    }
+    if (type is GenericFunctionType) {
+      return serializeGenericFunctionType(type);
     }
     throw new ArgumentError(
         'Cannot serialize an instance of ${type.runtimeType}');
@@ -313,7 +323,13 @@
    */
   void _serialize(Expression expr) {
     if (expr is IntegerLiteral) {
-      _pushInt(expr.value);
+      int value = expr.value ?? 0;
+      if (value >= 0) {
+        _pushInt(value);
+      } else {
+        _pushInt(-value);
+        operations.add(UnlinkedExprOperation.negate);
+      }
     } else if (expr is DoubleLiteral) {
       operations.add(UnlinkedExprOperation.pushDouble);
       doubles.add(expr.value);
@@ -401,12 +417,12 @@
     } else if (expr is AsExpression) {
       isValidConst = false;
       _serialize(expr.expression);
-      references.add(serializeTypeName(expr.type));
+      references.add(serializeType(expr.type));
       operations.add(UnlinkedExprOperation.typeCast);
     } else if (expr is IsExpression) {
       isValidConst = false;
       _serialize(expr.expression);
-      references.add(serializeTypeName(expr.type));
+      references.add(serializeType(expr.type));
       operations.add(UnlinkedExprOperation.typeCheck);
     } else if (expr is SuperExpression) {
       operations.add(UnlinkedExprOperation.pushSuper);
@@ -548,7 +564,7 @@
     }
     if (expr.typeArguments != null &&
         expr.typeArguments.arguments.length == 1) {
-      references.add(serializeTypeName(expr.typeArguments.arguments[0]));
+      references.add(serializeType(expr.typeArguments.arguments[0]));
       operations.add(UnlinkedExprOperation.makeTypedList);
     } else {
       operations.add(UnlinkedExprOperation.makeUntypedList);
@@ -567,8 +583,8 @@
     }
     if (expr.typeArguments != null &&
         expr.typeArguments.arguments.length == 2) {
-      references.add(serializeTypeName(expr.typeArguments.arguments[0]));
-      references.add(serializeTypeName(expr.typeArguments.arguments[1]));
+      references.add(serializeType(expr.typeArguments.arguments[0]));
+      references.add(serializeType(expr.typeArguments.arguments[1]));
       operations.add(UnlinkedExprOperation.makeTypedMap);
     } else {
       operations.add(UnlinkedExprOperation.makeUntypedMap);
@@ -692,7 +708,7 @@
     } else {
       ints.add(typeArguments.arguments.length);
       for (TypeAnnotation type in typeArguments.arguments) {
-        references.add(serializeTypeName(type));
+        references.add(serializeType(type));
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 8af0cf7..395dd83 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -7,6 +7,7 @@
 library analyzer.src.task.strong.checker;
 
 import 'dart:collection';
+
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
@@ -37,8 +38,15 @@
 /// because we know it evaluates to a specific, concrete function, and we can
 /// treat "dynamic" as top for that case, which is more permissive.
 DartType getDefiniteType(
-    Expression expression, TypeSystem typeSystem, TypeProvider typeProvider) {
-  DartType type = expression.staticType ?? DynamicTypeImpl.instance;
+    Expression expression, TypeSystem typeSystem, TypeProvider typeProvider,
+    {bool read: false}) {
+  DartType type;
+  if (read) {
+    type = getReadType(expression);
+  } else {
+    type = expression.staticType;
+  }
+  type ??= DynamicTypeImpl.instance;
   if (typeSystem is StrongTypeSystemImpl &&
       type is FunctionType &&
       hasStrictArrow(expression)) {
@@ -48,6 +56,35 @@
   return type;
 }
 
+DartType getReadType(Expression expression) {
+  if (expression is IndexExpression) {
+    return expression.auxiliaryElements?.staticElement?.returnType;
+  }
+  {
+    Element setter;
+    if (expression is PrefixedIdentifier) {
+      setter = expression.staticElement;
+    } else if (expression is PropertyAccess) {
+      setter = expression.propertyName.staticElement;
+    } else if (expression is SimpleIdentifier) {
+      setter = expression.staticElement;
+    }
+    if (setter is PropertyAccessorElement && setter.isSetter) {
+      var getter = setter.variable.getter;
+      if (getter != null) {
+        return getter.returnType;
+      }
+    }
+  }
+  if (expression is SimpleIdentifier) {
+    var aux = expression.auxiliaryElements;
+    if (aux != null) {
+      return aux.staticElement?.returnType;
+    }
+  }
+  return expression.staticType;
+}
+
 bool hasStrictArrow(Expression expression) {
   var element = _getKnownElement(expression);
   return element is FunctionElement || element is MethodElement;
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index eec4814..45150a5 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -363,7 +363,7 @@
     //
     // Infer the return type.
     //
-    if (element.hasImplicitReturnType) {
+    if (element.hasImplicitReturnType && element.displayName != '[]=') {
       (element as ExecutableElementImpl).returnType =
           _computeReturnType(overriddenTypes.map((t) => t.returnType));
       if (element is PropertyAccessorElement) {
diff --git a/pkg/analyzer/test/cancelable_future_test.dart b/pkg/analyzer/test/cancelable_future_test.dart
index a578c8b..2f63cac 100644
--- a/pkg/analyzer/test/cancelable_future_test.dart
+++ b/pkg/analyzer/test/cancelable_future_test.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/cancelable_future.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:watcher/src/utils.dart';
 
 void main() {
   defineReflectiveSuite(() {
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 4f7a9c2..1a4f23f 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -19,7 +19,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @failingTest
   @override
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 0d6afa0..9db22ac 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
@@ -22,7 +22,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
@@ -33,13 +33,6 @@
 
   @override
   @failingTest
-  test_ambiguousExport() async {
-    // Expected 1 errors of type CompileTimeErrorCode.AMBIGUOUS_EXPORT, found 0
-    await super.test_ambiguousExport();
-  }
-
-  @override
-  @failingTest
   test_annotationWithNotClass() async {
     // Bad state: No reference information for property at 117
     await super.test_annotationWithNotClass();
@@ -75,44 +68,16 @@
 
   @override
   @failingTest
-  test_async_used_as_identifier_in_statement_label() async {
-    // Bad state: Expected element reference for analyzer offset 14; got one for kernel offset 21
-    await super.test_async_used_as_identifier_in_statement_label();
-  }
-
-  @override
-  @failingTest
-  test_async_used_as_identifier_in_switch_label() async {
-    // Bad state: No reference information for async at 31
-    await super.test_async_used_as_identifier_in_switch_label();
-  }
-
-  @override
-  @failingTest
-  // This test fails because the kernel driver element model produces a
-  // different element model result than the regular parser produces. Once these
-  // tests enable the faster parser (and not just the kernel driver), this
-  // should be looked at again.
   test_bug_23176() async {
+    // This test fails because the kernel driver element model produces a
+    // different element model result than the regular parser produces. Once these
+    // tests enable the faster parser (and not just the kernel driver), this
+    // should be looked at again.
     return super.test_bug_23176();
   }
 
   @override
   @failingTest
-  test_builtInIdentifierAsMixinName_classTypeAlias() async {
-    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, found 0
-    await super.test_builtInIdentifierAsMixinName_classTypeAlias();
-  }
-
-  @override
-  @failingTest
-  test_builtInIdentifierAsPrefixName() async {
-    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME, found 0
-    await super.test_builtInIdentifierAsPrefixName();
-  }
-
-  @override
-  @failingTest
   test_builtInIdentifierAsType_formalParameter_field() async {
     // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, found 0;
     //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (23)
@@ -136,27 +101,6 @@
 
   @override
   @failingTest
-  test_builtInIdentifierAsTypedefName_functionTypeAlias() async {
-    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, found 0
-    await super.test_builtInIdentifierAsTypedefName_functionTypeAlias();
-  }
-
-  @override
-  @failingTest
-  test_builtInIdentifierAsTypeName() async {
-    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, found 0
-    await super.test_builtInIdentifierAsTypeName();
-  }
-
-  @override
-  @failingTest
-  test_builtInIdentifierAsTypeParameterName() async {
-    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME, found 0
-    await super.test_builtInIdentifierAsTypeParameterName();
-  }
-
-  @override
-  @failingTest
   test_caseExpressionTypeImplementsEquals() async {
     // Expected 1 errors of type CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
     await super.test_caseExpressionTypeImplementsEquals();
@@ -892,29 +836,7 @@
 
   @override
   @failingTest
-  test_extendsDisallowedClass_class_bool() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
-    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
-    await super.test_extendsDisallowedClass_class_bool();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_class_double() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_class_double();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_class_int() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
-    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
-    await super.test_extendsDisallowedClass_class_int();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
   test_extendsDisallowedClass_class_Null() async {
     // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
     //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
@@ -923,42 +845,7 @@
 
   @override
   @failingTest
-  test_extendsDisallowedClass_class_num() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_class_num();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_class_String() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
-    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
-    await super.test_extendsDisallowedClass_class_String();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_classTypeAlias_bool() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_classTypeAlias_bool();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_classTypeAlias_double() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_classTypeAlias_double();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_classTypeAlias_int() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_classTypeAlias_int();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
   test_extendsDisallowedClass_classTypeAlias_Null() async {
     // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
     await super.test_extendsDisallowedClass_classTypeAlias_Null();
@@ -966,20 +853,6 @@
 
   @override
   @failingTest
-  test_extendsDisallowedClass_classTypeAlias_num() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_classTypeAlias_num();
-  }
-
-  @override
-  @failingTest
-  test_extendsDisallowedClass_classTypeAlias_String() async {
-    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
-    await super.test_extendsDisallowedClass_classTypeAlias_String();
-  }
-
-  @override
-  @failingTest
   test_extendsEnum() async {
     // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_ENUM, found 0
     await super.test_extendsEnum();
@@ -1206,27 +1079,7 @@
 
   @override
   @failingTest
-  test_implementsDisallowedClass_class_bool() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_class_bool();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_class_double() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_class_double();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_class_int() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_class_int();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
   test_implementsDisallowedClass_class_Null() async {
     // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
     await super.test_implementsDisallowedClass_class_Null();
@@ -1234,48 +1087,7 @@
 
   @override
   @failingTest
-  test_implementsDisallowedClass_class_num() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_class_num();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_class_String() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_class_String();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_class_String_num() async {
-    // Expected 2 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_class_String_num();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_classTypeAlias_bool() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_classTypeAlias_bool();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_classTypeAlias_double() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_classTypeAlias_double();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_classTypeAlias_int() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_classTypeAlias_int();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
   test_implementsDisallowedClass_classTypeAlias_Null() async {
     // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
     await super.test_implementsDisallowedClass_classTypeAlias_Null();
@@ -1283,27 +1095,6 @@
 
   @override
   @failingTest
-  test_implementsDisallowedClass_classTypeAlias_num() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_classTypeAlias_num();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_classTypeAlias_String() async {
-    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_classTypeAlias_String();
-  }
-
-  @override
-  @failingTest
-  test_implementsDisallowedClass_classTypeAlias_String_num() async {
-    // Expected 2 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
-    await super.test_implementsDisallowedClass_classTypeAlias_String_num();
-  }
-
-  @override
-  @failingTest
   test_implementsDynamic() async {
     // AnalysisException: Element mismatch in /test.dart at /test.dart
     await super.test_implementsDynamic();
@@ -1760,6 +1551,27 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_invalidUri_export() async {
+    return super.test_invalidUri_export();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_invalidUri_import() async {
+    return super.test_invalidUri_import();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_invalidUri_part() async {
+    return super.test_invalidUri_part();
+  }
+
+  @override
+  @failingTest
   test_isInConstInstanceCreation_restored() async {
     // Expected 1 errors of type CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
     await super.test_isInConstInstanceCreation_restored();
@@ -1923,27 +1735,7 @@
 
   @override
   @failingTest
-  test_mixinOfDisallowedClass_class_bool() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_class_bool();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_class_double() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_class_double();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_class_int() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_class_int();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
   test_mixinOfDisallowedClass_class_Null() async {
     // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
     await super.test_mixinOfDisallowedClass_class_Null();
@@ -1951,41 +1743,7 @@
 
   @override
   @failingTest
-  test_mixinOfDisallowedClass_class_num() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_class_num();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_class_String() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_class_String();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_classTypeAlias_bool() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_classTypeAlias_bool();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_classTypeAlias_double() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_classTypeAlias_double();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_classTypeAlias_int() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_classTypeAlias_int();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
   test_mixinOfDisallowedClass_classTypeAlias_Null() async {
     // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
     await super.test_mixinOfDisallowedClass_classTypeAlias_Null();
@@ -1993,20 +1751,6 @@
 
   @override
   @failingTest
-  test_mixinOfDisallowedClass_classTypeAlias_num() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_classTypeAlias_num();
-  }
-
-  @override
-  @failingTest
-  test_mixinOfDisallowedClass_classTypeAlias_String() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
-    await super.test_mixinOfDisallowedClass_classTypeAlias_String();
-  }
-
-  @override
-  @failingTest
   test_mixinOfEnum() async {
     // AnalysisException: Element mismatch in /test.dart at /test.dart
     await super.test_mixinOfEnum();
@@ -2187,20 +1931,6 @@
 
   @override
   @failingTest
-  test_noDefaultSuperConstructorImplicit_superHasParameters() async {
-    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
-    await super.test_noDefaultSuperConstructorImplicit_superHasParameters();
-  }
-
-  @override
-  @failingTest
-  test_noDefaultSuperConstructorImplicit_superOnlyNamed() async {
-    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
-    await super.test_noDefaultSuperConstructorImplicit_superOnlyNamed();
-  }
-
-  @override
-  @failingTest
   test_nonConstantAnnotationConstructor_named() async {
     // Bad state: No reference information for A at 30
     await super.test_nonConstantAnnotationConstructor_named();
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 7dc9b41..de88150 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -85,8 +85,12 @@
 class C = A with String, num;''');
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
-      CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
     ]);
     verify([source]);
   }
@@ -547,8 +551,11 @@
 class B {}
 class as = A with B;''');
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION
+          : CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
+    ]);
     verify([source]);
   }
 
@@ -556,7 +563,9 @@
     Source source = addSource("import 'dart:async' as abstract;");
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME,
+      useCFE
+          ? CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION
+          : CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME,
       HintCode.UNUSED_IMPORT
     ]);
     verify([source]);
@@ -595,24 +604,33 @@
   test_builtInIdentifierAsTypedefName_functionTypeAlias() async {
     Source source = addSource("typedef bool as();");
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION
+          : CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
+    ]);
     verify([source]);
   }
 
   test_builtInIdentifierAsTypeName() async {
     Source source = addSource("class as {}");
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION
+          : CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME
+    ]);
     verify([source]);
   }
 
   test_builtInIdentifierAsTypeParameterName() async {
     Source source = addSource("class A<as> {}");
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION
+          : CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME
+    ]);
     verify([source]);
   }
 
@@ -2072,7 +2090,14 @@
 class M {}
 class C = bool with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2090,7 +2115,14 @@
 class M {}
 class C = int with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2117,7 +2149,14 @@
 class M {}
 class C = String with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2528,42 +2567,66 @@
   test_implementsDisallowedClass_class_bool() async {
     Source source = addSource("class A implements bool {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_double() async {
     Source source = addSource("class A implements double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_int() async {
     Source source = addSource("class A implements int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_Null() async {
     Source source = addSource("class A implements Null {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_num() async {
     Source source = addSource("class A implements num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_String() async {
     Source source = addSource("class A implements String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2571,8 +2634,12 @@
     Source source = addSource("class A implements String, num {}");
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
     ]);
     verify([source]);
   }
@@ -2583,7 +2650,11 @@
 class M {}
 class C = A with M implements bool;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2593,7 +2664,11 @@
 class M {}
 class C = A with M implements double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2603,7 +2678,11 @@
 class M {}
 class C = A with M implements int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2613,7 +2692,11 @@
 class M {}
 class C = A with M implements Null;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2623,7 +2706,11 @@
 class M {}
 class C = A with M implements num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2633,7 +2720,11 @@
 class M {}
 class C = A with M implements String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -2644,8 +2735,12 @@
 class C = A with M implements String, num;''');
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
     ]);
     verify([source]);
   }
@@ -3873,42 +3968,66 @@
   test_mixinOfDisallowedClass_class_bool() async {
     Source source = addSource("class A extends Object with bool {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_double() async {
     Source source = addSource("class A extends Object with double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_int() async {
     Source source = addSource("class A extends Object with int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_Null() async {
     Source source = addSource("class A extends Object with Null {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_num() async {
     Source source = addSource("class A extends Object with num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_String() async {
     Source source = addSource("class A extends Object with String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -3917,7 +4036,11 @@
 class A {}
 class C = A with bool;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -3926,7 +4049,11 @@
 class A {}
 class C = A with double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -3935,7 +4062,11 @@
 class A {}
 class C = A with int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -3944,7 +4075,11 @@
 class A {}
 class C = A with Null;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -3953,7 +4088,11 @@
 class A {}
 class C = A with num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -3962,7 +4101,11 @@
 class A {}
 class C = A with String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    assertErrors(source, [
+      useCFE
+          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
+          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
     verify([source]);
   }
 
@@ -5833,6 +5976,17 @@
     verify([source]);
   }
 
+  test_referencedBeforeDeclaration_hideInBlock_comment() async {
+    Source source = addSource(r'''
+main() {
+  /// [v] is a variable.
+  var v = 2;
+}
+print(x) {}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
   test_referencedBeforeDeclaration_hideInBlock_function() async {
     Source source = addSource(r'''
 var v = 1;
@@ -5911,17 +6065,6 @@
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
-  test_referencedBeforeDeclaration_hideInBlock_comment() async {
-    Source source = addSource(r'''
-main() {
-  /// [v] is a variable.
-  var v = 2;
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-  }
-
   test_rethrowOutsideCatch() async {
     Source source = addSource(r'''
 f() {
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 0b74b24..b2f5e2d 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -353,7 +353,6 @@
       node = node.parent;
     }
     fail('Node not found');
-    return null;
   }
 }
 
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 37e48cc..b9454b3 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -36,6 +36,15 @@
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class ElementResolverCodeTest extends ResolverTestCase {
   test_annotation_class_namedConstructor() async {
@@ -317,7 +326,7 @@
   ElementResolver _resolver;
 
   void fail_visitExportDirective_combinators() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     // Need to set up the exported library so that the identifier can be
     // resolved.
     ExportDirective directive = AstTestFactory.exportDirective2(null, [
@@ -328,12 +337,12 @@
   }
 
   void fail_visitFunctionExpressionInvocation() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitImportDirective_combinators_noPrefix() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     // Need to set up the imported library so that the identifier can be
     // resolved.
     ImportDirective directive = AstTestFactory.importDirective3(null, null, [
@@ -344,7 +353,7 @@
   }
 
   void fail_visitImportDirective_combinators_prefix() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     // Need to set up the imported library so that the identifiers can be
     // resolved.
     String prefixName = "p";
@@ -361,7 +370,7 @@
   }
 
   void fail_visitRedirectingConstructorInvocation() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index d3944f7..3ec9e0b 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -250,13 +250,11 @@
   @override
   AnalysisCache get analysisCache {
     fail("Unexpected invocation of analysisCache");
-    return null;
   }
 
   @override
   AnalysisOptions get analysisOptions {
     fail("Unexpected invocation of getAnalysisOptions");
-    return null;
   }
 
   @override
@@ -272,7 +270,6 @@
   @override
   CacheConsistencyValidator get cacheConsistencyValidator {
     fail("Unexpected invocation of cacheConsistencyValidator");
-    return null;
   }
 
   @override
@@ -283,26 +280,22 @@
   @override
   DeclaredVariables get declaredVariables {
     fail("Unexpected invocation of getDeclaredVariables");
-    return null;
   }
 
   @deprecated
   @override
   EmbedderYamlLocator get embedderYamlLocator {
     fail("Unexpected invocation of get embedderYamlLocator");
-    return null;
   }
 
   @override
   List<AnalysisTarget> get explicitTargets {
     fail("Unexpected invocation of visitCacheItems");
-    return null;
   }
 
   @override
   ResolverProvider get fileResolverProvider {
     fail("Unexpected invocation of fileResolverProvider");
-    return null;
   }
 
   @override
@@ -313,18 +306,15 @@
   @override
   List<Source> get htmlSources {
     fail("Unexpected invocation of getHtmlSources");
-    return null;
   }
 
   @override
   Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents {
     fail("Unexpected invocation of analyzedSources");
-    return null;
   }
 
   bool get isActive {
     fail("Unexpected invocation of isActive");
-    return false;
   }
 
   void set isActive(bool isActive) {
@@ -334,31 +324,26 @@
   @override
   bool get isDisposed {
     fail("Unexpected invocation of isDisposed");
-    return false;
   }
 
   @override
   List<Source> get launchableClientLibrarySources {
     fail("Unexpected invocation of getLaunchableClientLibrarySources");
-    return null;
   }
 
   @override
   List<Source> get launchableServerLibrarySources {
     fail("Unexpected invocation of getLaunchableServerLibrarySources");
-    return null;
   }
 
   @override
   List<Source> get librarySources {
     fail("Unexpected invocation of getLibrarySources");
-    return null;
   }
 
   @override
   String get name {
     fail("Unexpected invocation of name");
-    return null;
   }
 
   @override
@@ -369,31 +354,26 @@
   @override
   Stream<SourcesChangedEvent> get onSourcesChanged {
     fail("Unexpected invocation of onSourcesChanged");
-    return null;
   }
 
   @override
   List<Source> get prioritySources {
     fail("Unexpected invocation of getPrioritySources");
-    return null;
   }
 
   @override
   List<AnalysisTarget> get priorityTargets {
     fail("Unexpected invocation of visitCacheItems");
-    return null;
   }
 
   @override
   CachePartition get privateAnalysisCachePartition {
     fail("Unexpected invocation of privateAnalysisCachePartition");
-    return null;
   }
 
   @override
   SourceFactory get sourceFactory {
     fail("Unexpected invocation of getSourceFactory");
-    return null;
   }
 
   @override
@@ -404,13 +384,11 @@
   @override
   List<Source> get sources {
     fail("Unexpected invocation of sources");
-    return null;
   }
 
   @override
   TypeProvider get typeProvider {
     fail("Unexpected invocation of getTypeProvider");
-    return null;
   }
 
   @override
@@ -421,19 +399,16 @@
   @override
   TypeSystem get typeSystem {
     fail("Unexpected invocation of getTypeSystem");
-    return null;
   }
 
   @override
   List<WorkManager> get workManagers {
     fail("Unexpected invocation of workManagers");
-    return null;
   }
 
   @override
   bool aboutToComputeResult(CacheEntry entry, ResultDescriptor result) {
     fail("Unexpected invocation of aboutToComputeResult");
-    return false;
   }
 
   @override
@@ -449,62 +424,52 @@
   @override
   void applyChanges(ChangeSet changeSet) {
     fail("Unexpected invocation of applyChanges");
-    return null;
   }
 
   @override
   String computeDocumentationComment(Element element) {
     fail("Unexpected invocation of computeDocumentationComment");
-    return null;
   }
 
   @override
   List<AnalysisError> computeErrors(Source source) {
     fail("Unexpected invocation of computeErrors");
-    return null;
   }
 
   @override
   List<Source> computeExportedLibraries(Source source) {
     fail("Unexpected invocation of computeExportedLibraries");
-    return null;
   }
 
   @override
   List<Source> computeImportedLibraries(Source source) {
     fail("Unexpected invocation of computeImportedLibraries");
-    return null;
   }
 
   @override
   SourceKind computeKindOf(Source source) {
     fail("Unexpected invocation of computeKindOf");
-    return null;
   }
 
   @override
   LibraryElement computeLibraryElement(Source source) {
     fail("Unexpected invocation of computeLibraryElement");
-    return null;
   }
 
   @override
   LineInfo computeLineInfo(Source source) {
     fail("Unexpected invocation of computeLineInfo");
-    return null;
   }
 
   @override
   CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
       Source source, Source librarySource) {
     fail("Unexpected invocation of getResolvedCompilationUnitFuture");
-    return null;
   }
 
   @override
   V computeResult<V>(AnalysisTarget target, ResultDescriptor<V> result) {
     fail("Unexpected invocation of computeResult");
-    return null;
   }
 
   @override
@@ -515,150 +480,126 @@
   @override
   List<CompilationUnit> ensureResolvedDartUnits(Source source) {
     fail("Unexpected invocation of ensureResolvedDartUnits");
-    return null;
   }
 
   @override
   bool exists(Source source) {
     fail("Unexpected invocation of exists");
-    return false;
   }
 
   @override
   CacheEntry getCacheEntry(AnalysisTarget target) {
     fail("Unexpected invocation of visitCacheItems");
-    return null;
   }
 
   @override
   CompilationUnitElement getCompilationUnitElement(
       Source unitSource, Source librarySource) {
     fail("Unexpected invocation of getCompilationUnitElement");
-    return null;
   }
 
   @deprecated
   @override
   V getConfigurationData<V>(ResultDescriptor<V> key) {
     fail("Unexpected invocation of getConfigurationData");
-    return null;
   }
 
   @override
   TimestampedData<String> getContents(Source source) {
     fail("Unexpected invocation of getContents");
-    return null;
   }
 
   @override
   InternalAnalysisContext getContextFor(Source source) {
     fail("Unexpected invocation of getContextFor");
-    return null;
   }
 
   @override
   Element getElement(ElementLocation location) {
     fail("Unexpected invocation of getElement");
-    return null;
   }
 
   @override
   AnalysisErrorInfo getErrors(Source source) {
     fail("Unexpected invocation of getErrors");
-    return null;
   }
 
   @override
   List<Source> getHtmlFilesReferencing(Source source) {
     fail("Unexpected invocation of getHtmlFilesReferencing");
-    return null;
   }
 
   @override
   SourceKind getKindOf(Source source) {
     fail("Unexpected invocation of getKindOf");
-    return null;
   }
 
   @override
   List<Source> getLibrariesContaining(Source source) {
     fail("Unexpected invocation of getLibrariesContaining");
-    return null;
   }
 
   @override
   List<Source> getLibrariesDependingOn(Source librarySource) {
     fail("Unexpected invocation of getLibrariesDependingOn");
-    return null;
   }
 
   @override
   List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
     fail("Unexpected invocation of getLibrariesReferencedFromHtml");
-    return null;
   }
 
   @override
   LibraryElement getLibraryElement(Source source) {
     fail("Unexpected invocation of getLibraryElement");
-    return null;
   }
 
   @override
   LineInfo getLineInfo(Source source) {
     fail("Unexpected invocation of getLineInfo");
-    return null;
   }
 
   @override
   int getModificationStamp(Source source) {
     fail("Unexpected invocation of getModificationStamp");
-    return 0;
   }
 
   @override
   ChangeNoticeImpl getNotice(Source source) {
     fail("Unexpected invocation of getNotice");
-    return null;
   }
 
   @override
   Namespace getPublicNamespace(LibraryElement library) {
     fail("Unexpected invocation of getPublicNamespace");
-    return null;
   }
 
   @override
   CompilationUnit getResolvedCompilationUnit(
       Source unitSource, LibraryElement library) {
     fail("Unexpected invocation of getResolvedCompilationUnit");
-    return null;
   }
 
   @override
   CompilationUnit getResolvedCompilationUnit2(
       Source unitSource, Source librarySource) {
     fail("Unexpected invocation of getResolvedCompilationUnit");
-    return null;
   }
 
   @override
   V getResult<V>(AnalysisTarget target, ResultDescriptor<V> result) {
     fail("Unexpected invocation of getResult");
-    return null;
   }
 
   @override
   List<Source> getSourcesWithFullName(String path) {
     fail("Unexpected invocation of getSourcesWithFullName");
-    return null;
   }
 
   @override
   bool handleContentsChanged(
       Source source, String originalContents, String newContents, bool notify) {
     fail("Unexpected invocation of handleContentsChanged");
-    return false;
   }
 
   @override
@@ -669,44 +610,37 @@
   @override
   bool isClientLibrary(Source librarySource) {
     fail("Unexpected invocation of isClientLibrary");
-    return false;
   }
 
   @override
   bool isServerLibrary(Source librarySource) {
     fail("Unexpected invocation of isServerLibrary");
-    return false;
   }
 
   @override
   Stream<ResultChangedEvent> onResultChanged(ResultDescriptor descriptor) {
     fail("Unexpected invocation of onResultChanged");
-    return null;
   }
 
   @deprecated
   @override
   Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
     fail("Unexpected invocation of onResultComputed");
-    return null;
   }
 
   @override
   CompilationUnit parseCompilationUnit(Source source) {
     fail("Unexpected invocation of parseCompilationUnit");
-    return null;
   }
 
   @override
   Document parseHtmlDocument(Source source) {
     fail("Unexpected invocation of parseHtmlDocument");
-    return null;
   }
 
   @override
   AnalysisResult performAnalysisTask() {
     fail("Unexpected invocation of performAnalysisTask");
-    return null;
   }
 
   @override
@@ -723,14 +657,12 @@
   CompilationUnit resolveCompilationUnit(
       Source unitSource, LibraryElement library) {
     fail("Unexpected invocation of resolveCompilationUnit");
-    return null;
   }
 
   @override
   CompilationUnit resolveCompilationUnit2(
       Source unitSource, Source librarySource) {
     fail("Unexpected invocation of resolveCompilationUnit");
-    return null;
   }
 
   @override
@@ -753,7 +685,6 @@
   @override
   bool shouldErrorsBeAnalyzed(Source source) {
     fail("Unexpected invocation of shouldErrorsBeAnalyzed");
-    return false;
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 3e7843c..410dd7e 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -18,7 +18,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 7854a5c..ccab1d2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -18,7 +18,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @failingTest
   @override
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index a767ae0..4b5f6f7 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -1998,10 +1998,19 @@
   void b() => new A().a();
 }
 ''');
+    Source source3 = addNamedSource('/testing/lib1.dart', r'''
+import '../lib1.dart';
+
+class C {
+  void b() => new A().a();
+}
+''');
     await computeAnalysisResult(source);
     await computeAnalysisResult(source2);
+    await computeAnalysisResult(source3);
     assertNoErrors(source2);
-    verify([source, source2]);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
   }
 
   test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
@@ -2052,7 +2061,23 @@
     verify([source, source2]);
   }
 
-  test_invalidUseProtectedAndForTesting_method_OK() async {
+  test_invalidUseOfVisibleForTestingMember_OK_export() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+
+@visibleForTesting
+int fn0() => 1;
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+export 'lib1.dart' show fn0;
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_invalidUseProtectedAndForTesting_asProtected_OK() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
 class A {
@@ -2074,6 +2099,28 @@
     verify([source, source2]);
   }
 
+  test_invalidUseProtectedAndForTesting_asTesting_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/test/test1.dart', r'''
+import '../lib1.dart';
+
+void main() {
+  new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
   test_isDouble() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.dart2jsHint = true;
diff --git a/pkg/analyzer/test/generated/invalid_code_kernel_test.dart b/pkg/analyzer/test/generated/invalid_code_kernel_test.dart
index cacac44..bf1cd61 100644
--- a/pkg/analyzer/test/generated/invalid_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_kernel_test.dart
@@ -21,7 +21,7 @@
   bool get enableNewAnalysisDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @failingTest
   @override
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 54da903..596d2c3 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -32,7 +32,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
@@ -163,6 +163,13 @@
 
   @override
   @failingTest
+  @potentialAnalyzerProblem
+  test_forEach_genericFunctionType() async {
+    return super.test_forEach_genericFunctionType();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_functionDeclaration_scope_signature() async {
     return super.test_functionDeclaration_scope_signature();
@@ -247,6 +254,20 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_nativeConstConstructor() async {
+    return super.test_nativeConstConstructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_nativeFunctionBodyInNonSDKCode_function() async {
+    return super.test_nativeFunctionBodyInNonSDKCode_function();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_nonBoolExpression_functionType() async {
     return super.test_nonBoolExpression_functionType();
@@ -297,6 +318,13 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
+  test_typeArgument_boundToFunctionType() async {
+    return super.test_typeArgument_boundToFunctionType();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
   test_undefinedIdentifier_synthetic_whenExpression() async {
     return super.test_undefinedIdentifier_synthetic_whenExpression();
   }
@@ -310,15 +338,22 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedMethod_functionExpression_callMethod() async {
-    return super.test_undefinedMethod_functionExpression_callMethod();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_uriDoesNotExist_dll() async {
+    return super.test_uriDoesNotExist_dll();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_forEach_genericFunctionType() async {
-    return super.test_forEach_genericFunctionType();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_uriDoesNotExist_dylib() async {
+    return super.test_uriDoesNotExist_dylib();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
+  test_uriDoesNotExist_so() async {
+    return super.test_uriDoesNotExist_so();
   }
 }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index cec534b..220cc65 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -6396,6 +6396,13 @@
     verify([source]);
   }
 
+  test_typeArgument_boundToFunctionType() async {
+    Source source = addSource("class A<T extends void Function<T>(T)>{}");
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   Future<Null> _check_wrongNumberOfParametersForOperator(
       String name, String parameters) async {
     Source source = addSource("""
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index c61a040..e8a95d5 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -35,7 +35,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @failingTest
   @override
diff --git a/pkg/analyzer/test/generated/package_test.dart b/pkg/analyzer/test/generated/package_test.dart
index 4dd7bf4..e80e868 100644
--- a/pkg/analyzer/test/generated/package_test.dart
+++ b/pkg/analyzer/test/generated/package_test.dart
@@ -254,6 +254,5 @@
   @override
   Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
     fail('Unexpected invocation of resolve');
-    return null;
   }
 }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 9b18b50..5814a6f 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -8668,18 +8668,42 @@
     expect(list.rightParenthesis, isNotNull);
   }
 
+  void test_parseFormalParameterList_prefixedType_missingName() {
+    FormalParameterList list = parseFormalParameterList('(io.File)',
+        errors: [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1)]);
+    expect(list, isNotNull);
+    expect(list.leftParenthesis, isNotNull);
+    expect(list.leftDelimiter, isNull);
+    expect(list.parameters, hasLength(1));
+    // TODO(danrubel): Investigate and improve recovery of parameter type/name.
+    SimpleFormalParameter parameter = list.parameters[0];
+    expect(parameter.toSource(), 'io.File ');
+    expect(parameter.identifier.token.isSynthetic, isTrue);
+    TypeName type = parameter.type;
+    PrefixedIdentifier typeName = type.name;
+    expect(typeName.prefix.token.isSynthetic, isFalse);
+    expect(typeName.identifier.token.isSynthetic, isFalse);
+    expect(list.rightDelimiter, isNull);
+    expect(list.rightParenthesis, isNotNull);
+  }
+
   void test_parseFormalParameterList_prefixedType_partial() {
-    int errorOffset = usingFastaParser ? 4 : 3;
     FormalParameterList list = parseFormalParameterList('(io.)', errors: [
-      expectedError(ParserErrorCode.MISSING_IDENTIFIER, errorOffset, 1),
-      expectedError(ParserErrorCode.MISSING_IDENTIFIER, errorOffset, 1)
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 4, 1),
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 4, 1)
     ]);
     expect(list, isNotNull);
     expect(list.leftParenthesis, isNotNull);
     expect(list.leftDelimiter, isNull);
     expect(list.parameters, hasLength(1));
     // TODO(danrubel): Investigate and improve recovery of parameter type/name.
-    expect(list.parameters[0].toSource(), 'io. ');
+    SimpleFormalParameter parameter = list.parameters[0];
+    expect(parameter.toSource(), 'io. ');
+    expect(parameter.identifier.token.isSynthetic, isTrue);
+    TypeName type = parameter.type;
+    PrefixedIdentifier typeName = type.name;
+    expect(typeName.prefix.token.isSynthetic, isFalse);
+    expect(typeName.identifier.token.isSynthetic, isTrue);
     expect(list.rightDelimiter, isNull);
     expect(list.rightParenthesis, isNotNull);
   }
@@ -10428,10 +10452,17 @@
   }
 
   void test_incomplete_topLevelVariable_const() {
-    CompilationUnit unit = parseCompilationUnit("const ", codes: [
-      ParserErrorCode.MISSING_IDENTIFIER,
-      ParserErrorCode.EXPECTED_TOKEN
-    ]);
+    CompilationUnit unit = parseCompilationUnit("const ",
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                CompileTimeErrorCode.CONST_NOT_INITIALIZED
+              ]
+            : [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
@@ -10445,10 +10476,17 @@
   }
 
   void test_incomplete_topLevelVariable_final() {
-    CompilationUnit unit = parseCompilationUnit("final ", codes: [
-      ParserErrorCode.MISSING_IDENTIFIER,
-      ParserErrorCode.EXPECTED_TOKEN
-    ]);
+    CompilationUnit unit = parseCompilationUnit("final ",
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                StaticWarningCode.FINAL_NOT_INITIALIZED
+              ]
+            : [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
@@ -10482,10 +10520,17 @@
     CompilationUnit unit = parseCompilationUnit(r'''
 class C {
   const
-}''', codes: [
-      ParserErrorCode.MISSING_IDENTIFIER,
-      ParserErrorCode.EXPECTED_TOKEN
-    ]);
+}''',
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                CompileTimeErrorCode.CONST_NOT_INITIALIZED
+              ]
+            : [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
diff --git a/pkg/analyzer/test/generated/resolver_kernel_test.dart b/pkg/analyzer/test/generated/resolver_kernel_test.dart
index ef8abbb..bc11b8b 100644
--- a/pkg/analyzer/test/generated/resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/resolver_kernel_test.dart
@@ -18,7 +18,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 2b05e91..91c212c 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -57,6 +57,15 @@
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class AnalysisDeltaTest extends EngineTestCase {
   TestSource source1 = new TestSource('/1.dart');
@@ -2534,17 +2543,17 @@
   TypeResolverVisitor _visitor;
 
   fail_visitConstructorDeclaration() async {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   fail_visitFunctionTypeAlias() async {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   fail_visitVariableDeclaration() async {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     ClassElement type = ElementFactory.classElement2("A");
     VariableDeclaration node = AstTestFactory.variableDeclaration("a");
     AstTestFactory
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 49548e5..b2690a0 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -350,7 +350,7 @@
 
   bool get enableNewAnalysisDriver => false;
 
-  bool get previewDart2 => false;
+  bool get useCFE => false;
 
   /**
    * Return a type provider that can be used to test the results of resolution.
@@ -666,7 +666,7 @@
     }
     options ??= defaultAnalysisOptions;
     if (enableNewAnalysisDriver) {
-      if (previewDart2) {
+      if (useCFE) {
         (options as AnalysisOptionsImpl)
           ..strongMode = true
           ..useFastaParser = true;
diff --git a/pkg/analyzer/test/generated/sdk_test.dart b/pkg/analyzer/test/generated/sdk_test.dart
index 69c774e..73b17f5 100644
--- a/pkg/analyzer/test/generated/sdk_test.dart
+++ b/pkg/analyzer/test/generated/sdk_test.dart
@@ -60,7 +60,6 @@
 
   DartSdk _failIfAbsent() {
     fail('Use of ifAbsent function');
-    return null;
   }
 }
 
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
index 34e8ad9..3081d1d 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
@@ -18,7 +18,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index f977b4e..6842666 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -36,6 +36,15 @@
   });
 }
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 /**
  * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
  */
@@ -199,17 +208,17 @@
   TypeSystem get _typeSystem => _visitor.typeSystem;
 
   void fail_visitFunctionExpressionInvocation() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitMethodInvocation() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitSimpleIdentifier() {
-    fail("Not yet tested");
+    _fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 3f1eb5a..d48655d 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -25,7 +25,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
@@ -1049,7 +1049,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
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 a6292e4..2066b768e 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -25,7 +25,7 @@
   bool get enableKernelDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index b03f69f..2c48053 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -33,7 +33,7 @@
   bool get enableNewAnalysisDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
@@ -100,64 +100,6 @@
 
   @override
   @failingTest
-  test_functionLiteral_assignment_typedArguments() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_functionLiteral_assignment_typedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_assignment_unTypedArguments() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_functionLiteral_assignment_unTypedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_functionExpressionInvocation_typedArguments() async {
-    // Bad state: Expected a type for null at 154; got one for kernel offset 142
-    await super
-        .test_functionLiteral_functionExpressionInvocation_typedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_functionExpressionInvocation_unTypedArguments() async {
-    // Bad state: Expected a type for null at 150; got one for kernel offset 142
-    await super
-        .test_functionLiteral_functionExpressionInvocation_unTypedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_functionInvocation_typedArguments() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_functionLiteral_functionInvocation_typedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_functionInvocation_unTypedArguments() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_functionLiteral_functionInvocation_unTypedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_methodInvocation_typedArguments() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_functionLiteral_methodInvocation_typedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_methodInvocation_unTypedArguments() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_functionLiteral_methodInvocation_unTypedArguments();
-  }
-
-  @override
-  @failingTest
   test_futureOr_downwards8() async {
     // type 'BottomTypeImpl' is not a subtype of type 'InterfaceType' in type cast where
     await super.test_futureOr_downwards8();
@@ -336,7 +278,7 @@
   bool get enableNewAnalysisDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   test_futureOr_promotion3() async {
@@ -530,5 +472,5 @@
   bool get enableNewAnalysisDriver => true;
 
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index d508efa..b766357 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -809,10 +809,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isString, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -838,10 +838,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isInt, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -903,10 +903,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isString, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -934,10 +934,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isInt, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -963,10 +963,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isString, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -992,10 +992,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isInt, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -1023,10 +1023,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isString, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
@@ -1054,10 +1054,10 @@
       return resolutionMap.elementDeclaredByFunctionExpression(exp).type;
     }
 
-    _isFunction2Of(_isInt, _isString)(literal(0));
+    _isFunction2Of(_isInt, _isNull)(literal(0));
     _isFunction2Of(_isInt, _isString)(literal(1));
     _isFunction2Of(_isInt, _isString)(literal(2));
-    _isFunction2Of(_isInt, _isInt)(literal(3));
+    _isFunction2Of(_isInt, _isString)(literal(3));
     _isFunction2Of(_isInt, _isString)(literal(4));
   }
 
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 027ec86..3604aed 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -73,7 +73,6 @@
       }
     }
     fail("Could not find getter named $getterName in ${type.displayName}");
-    return null;
   }
 
   /**
@@ -90,7 +89,6 @@
       }
     }
     fail("Could not find method named $methodName in ${type.displayName}");
-    return null;
   }
 
   void setUp() {
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 640a9f3..e7de210 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -50,7 +50,6 @@
   bool isEqualNodes(AstNode first, AstNode second) {
     if (first != null && identical(first, second)) {
       fail('Failed to copy node: $first (${first.offset})');
-      return false;
     }
     return super.isEqualNodes(first, second);
   }
@@ -59,7 +58,6 @@
   bool isEqualTokens(Token first, Token second) {
     if (expectTokensCopied && first != null && identical(first, second)) {
       fail('Failed to copy token: ${first.lexeme} (${first.offset})');
-      return false;
     }
     if (first?.precedingComments != null) {
       CommentToken comment = first.precedingComments;
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 8b66f55..8d963c9 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -32,7 +32,6 @@
 import 'package:html/dom.dart' show Document;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:watcher/src/utils.dart';
 
 import '../../generated/engine_test.dart';
 import '../../generated/test_support.dart';
diff --git a/pkg/analyzer/test/src/context/source_test.dart b/pkg/analyzer/test/src/context/source_test.dart
index 2857e86..5347f29 100644
--- a/pkg/analyzer/test/src/context/source_test.dart
+++ b/pkg/analyzer/test/src/context/source_test.dart
@@ -58,6 +58,5 @@
   @override
   Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
     fail('Unexpected invocation of resolve');
-    return null;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 33f83e8..4b98b46 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -68,9 +68,9 @@
   bool get disableChangesAndCacheAllResults => false;
 
   /**
-   * Whether to enable the Dart 2.0 Front End.
+   * Whether to enable the Dart 2.0 Common Front End.
    */
-  bool get previewDart2 => false;
+  bool useCFE = false;
 
   void addTestFile(String content, {bool priority: false}) {
     testCode = content;
@@ -100,13 +100,13 @@
         createAnalysisOptions(),
         disableChangesAndCacheAllResults: disableChangesAndCacheAllResults,
         externalSummaries: externalSummaries,
-        enableKernelDriver: previewDart2);
+        enableKernelDriver: useCFE);
   }
 
   AnalysisOptionsImpl createAnalysisOptions() => new AnalysisOptionsImpl()
     ..strongMode = true
     ..enableUriInPartOf = true
-    ..useFastaParser = previewDart2;
+    ..useFastaParser = useCFE;
 
   int findOffset(String search) {
     int offset = testCode.indexOf(search);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index e1a6eee..deeac1d 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -18,10 +18,19 @@
 /// them, or know that this is an analyzer problem.
 const potentialAnalyzerProblem = const Object();
 
+/// Wrapper around the test package's `fail` function.
+///
+/// Unlike the test package's `fail` function, this function is not annotated
+/// with @alwaysThrows, so we can call it at the top of a test method without
+/// causing the rest of the method to be flagged as dead code.
+void _fail(String message) {
+  fail(message);
+}
+
 @reflectiveTest
 class AnalysisDriverResolutionTest_Kernel extends AnalysisDriverResolutionTest {
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
   @override
   @failingTest
@@ -34,7 +43,7 @@
 @reflectiveTest
 class AnalysisDriverTest_Kernel extends AnalysisDriverTest {
   @override
-  bool get previewDart2 => true;
+  bool get useCFE => true;
 
 //  @failingTest
 //  @potentialAnalyzerProblem
@@ -201,7 +210,7 @@
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
   @override
   test_part_getUnitElement_noLibrary() async {
-    fail('This test fails even with @failingTest');
+    _fail('This test fails even with @failingTest');
     await super.test_part_getUnitElement_noLibrary();
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 3bbf4dd..95a3cb0 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1693,7 +1693,7 @@
 
     TypeName typeName = statement.variables.type;
     expect(typeName.type, isUndefinedType);
-    if (previewDart2) {
+    if (useCFE) {
       expect(typeName.typeArguments.arguments[0].type, isUndefinedType);
     } else {
       expect(typeName.typeArguments.arguments[0].type, typeProvider.intType);
@@ -2124,7 +2124,7 @@
 
       PrefixedIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, same(cElement));
-      if (previewDart2) {
+      if (useCFE) {
         expect(typeIdentifier.staticType, cTypeInt);
       } else {
         expect(typeIdentifier.staticType, cTypeDynamic);
@@ -2153,7 +2153,7 @@
 
       PrefixedIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
-      if (previewDart2) {
+      if (useCFE) {
         expect(typeIdentifier.staticType, cTypeDouble);
       } else {
         expect(typeIdentifier.staticType, cTypeDynamic);
@@ -2370,6 +2370,36 @@
     }
   }
 
+  test_label_while() async {
+    addTestFile(r'''
+main() {
+  myLabel:
+  while (true) {
+    continue myLabel;
+    break myLabel;
+  }
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    List<Statement> statements = _getMainStatements(result);
+
+    LabeledStatement statement = statements[0];
+
+    Label label = statement.labels.single;
+    LabelElement labelElement = label.label.staticElement;
+
+    WhileStatement whileStatement = statement.statement;
+    Block whileBlock = whileStatement.body;
+
+    ContinueStatement continueStatement = whileBlock.statements[0];
+    expect(continueStatement.label.staticElement, same(labelElement));
+    expect(continueStatement.label.staticType, isNull);
+
+    BreakStatement breakStatement = whileBlock.statements[1];
+    expect(breakStatement.label.staticElement, same(labelElement));
+    expect(breakStatement.label.staticType, isNull);
+  }
+
   test_local_function() async {
     addTestFile(r'''
 void main() {
@@ -2506,7 +2536,7 @@
     expect(fInvocation.methodName.staticElement, same(fElement));
     expect(fInvocation.staticType, typeProvider.intType);
     // TODO(scheglov) We don't support invoke types well.
-//    if (previewDart2) {
+//    if (useCFE) {
 //      String fInstantiatedType = '(int, String) → int';
 //      expect(fInvocation.methodName.staticType.toString(), fInstantiatedType);
 //      expect(fInvocation.staticInvokeType.toString(), fInstantiatedType);
@@ -3181,6 +3211,73 @@
     _assertArgumentToParameter(arguments[2], methodElement.parameters[2]);
   }
 
+  test_methodInvocation_explicitCall_classTarget() async {
+    addTestFile(r'''
+class C {
+  double call(int p) => 0.0;
+}
+main() {
+  new C().call(0);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.errors, isEmpty);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    ClassDeclaration cNode = result.unit.declarations[0];
+    ClassElement cElement = cNode.element;
+    MethodElement callElement = cElement.methods[0];
+
+    List<Statement> statements = _getMainStatements(result);
+
+    ExpressionStatement statement = statements[0];
+    MethodInvocation invocation = statement.expression;
+
+    expect(invocation.staticType, typeProvider.doubleType);
+    expect(invocation.staticInvokeType.toString(), '(int) → double');
+
+    SimpleIdentifier methodName = invocation.methodName;
+    expect(methodName.staticElement, same(callElement));
+    expect(methodName.staticType.toString(), '(int) → double');
+  }
+
+  test_methodInvocation_explicitCall_functionTarget() async {
+    addTestFile(r'''
+main(double computation(int p)) {
+  computation.call(1);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.errors, isEmpty);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    FunctionDeclaration main = result.unit.declarations[0];
+    FunctionElement mainElement = main.element;
+    ParameterElement parameter = mainElement.parameters[0];
+
+    BlockFunctionBody mainBody = main.functionExpression.body;
+    List<Statement> statements = mainBody.block.statements;
+
+    ExpressionStatement statement = statements[0];
+    MethodInvocation invocation = statement.expression;
+
+    expect(invocation.staticType, typeProvider.doubleType);
+    expect(invocation.staticInvokeType.toString(), '(int) → double');
+
+    SimpleIdentifier target = invocation.target;
+    expect(target.staticElement, same(parameter));
+    expect(target.staticType.toString(), '(int) → double');
+
+    SimpleIdentifier methodName = invocation.methodName;
+    if (useCFE) {
+      expect(methodName.staticElement, isNull);
+      expect(methodName.staticType, isNull);
+    } else {
+      expect(methodName.staticElement, same(parameter));
+      expect(methodName.staticType, parameter.type);
+    }
+  }
+
   test_methodInvocation_instanceMethod_forwardingStub() async {
     addTestFile(r'''
 class A {
@@ -3234,7 +3331,7 @@
       var invokeTypeStr = '(int) → void';
       expect(invocation.staticType.toString(), 'void');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
-      if (previewDart2) {
+      if (useCFE) {
         expect(invocation.methodName.staticElement, same(mElement));
         expect(invocation.methodName.staticType.toString(), invokeTypeStr);
       } else {
@@ -3270,12 +3367,12 @@
       var invokeTypeStr = '(int, double) → Map<int, double>';
       expect(invocation.staticType.toString(), 'Map<int, double>');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
-      if (previewDart2) {
+      if (useCFE) {
         expect(invocation.methodName.staticElement, same(mElement));
         expect(invocation.methodName.staticType.toString(), invokeTypeStr);
       }
 
-      if (previewDart2) {
+      if (useCFE) {
         expect(arguments[0].staticParameterElement, isNull);
         expect(arguments[1].staticParameterElement, isNull);
       } else {
@@ -3338,7 +3435,7 @@
     ExpressionStatement statement = fooStatements[0];
     MethodInvocation invocation = statement.expression;
     expect(invocation.methodName.staticElement, same(fElement.getter));
-    if (previewDart2) {
+    if (useCFE) {
       _assertDynamicFunctionType(invocation.staticInvokeType);
     } else {
       expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
@@ -3372,7 +3469,7 @@
     ExpressionStatement statement = fooStatements[0];
     MethodInvocation invocation = statement.expression;
     expect(invocation.methodName.staticElement, same(fElement));
-    if (previewDart2) {
+    if (useCFE) {
       _assertDynamicFunctionType(invocation.staticInvokeType);
     } else {
       expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
@@ -3534,7 +3631,7 @@
       var invokeTypeStr = '(int) → void';
       expect(invocation.staticType.toString(), 'void');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
-      if (!previewDart2) {
+      if (!useCFE) {
         expect(invocation.staticInvokeType.element, same(mElement));
       }
       expect(invocation.methodName.staticElement, same(mElement));
@@ -3558,7 +3655,7 @@
       var invokeTypeStr = '(int) → void';
       expect(invocation.staticType.toString(), 'void');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
-      if (!previewDart2) {
+      if (!useCFE) {
         expect(invocation.staticInvokeType.element, same(mElement));
       }
       expect(invocation.methodName.staticElement, same(mElement));
@@ -3664,7 +3761,7 @@
       List<Expression> arguments = invocation.argumentList.arguments;
 
       expect(invocation.methodName.staticElement, same(fElement));
-      if (previewDart2) {
+      if (useCFE) {
         expect(invocation.methodName.staticType.toString(), fTypeString);
       }
       expect(invocation.staticType, VoidTypeImpl.instance);
@@ -3684,7 +3781,7 @@
       List<Expression> arguments = invocation.argumentList.arguments;
 
       expect(invocation.methodName.staticElement, same(fElement));
-      if (previewDart2) {
+      if (useCFE) {
         expect(invocation.methodName.staticType.toString(), fTypeString);
       }
       expect(invocation.staticType, VoidTypeImpl.instance);
@@ -3839,6 +3936,38 @@
     expect(identifier.staticType, typeProvider.intType);
   }
 
+  test_prefixedIdentifier_explicitCall() async {
+    addTestFile(r'''
+main(double computation(int p)) {
+  computation.call;
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.errors, isEmpty);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    FunctionDeclaration main = result.unit.declarations[0];
+    FunctionElement mainElement = main.element;
+    ParameterElement parameter = mainElement.parameters[0];
+
+    BlockFunctionBody mainBody = main.functionExpression.body;
+    List<Statement> statements = mainBody.block.statements;
+
+    ExpressionStatement statement = statements[0];
+    PrefixedIdentifier prefixed = statement.expression;
+
+    expect(prefixed.prefix.staticElement, same(parameter));
+    expect(prefixed.prefix.staticType.toString(), '(int) → double');
+
+    SimpleIdentifier methodName = prefixed.identifier;
+    expect(methodName.staticElement, isNull);
+    if (useCFE) {
+      expect(methodName.staticType, isNull);
+    } else {
+      expect(methodName.staticType, typeProvider.dynamicType);
+    }
+  }
+
   test_prefixedIdentifier_importPrefix_className() async {
     var libPath = _p('/test/lib/lib.dart');
     provider.newFile(libPath, '''
@@ -4210,6 +4339,17 @@
     }
   }
 
+  test_stringInterpolation_multiLine_emptyBeforeAfter() async {
+    addTestFile(r"""
+void main() {
+  var v = 42;
+  '''$v''';
+}
+""");
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.errors, isEmpty);
+  }
+
   test_super() async {
     String content = r'''
 class A {
@@ -4614,7 +4754,7 @@
 
     SimpleIdentifier dName = enumNode.name;
     expect(dName.staticElement, same(enumElement));
-    if (previewDart2) {
+    if (useCFE) {
       expect(dName.staticType, typeProvider.typeType);
     }
 
@@ -5452,13 +5592,13 @@
   }
 
   /// Assert that the [argument] is associated with the [expectedParameter],
-  /// if [previewDart2] is `null`. If the [argument] is a [NamedExpression],
+  /// if [useCFE] is `null`. If the [argument] is a [NamedExpression],
   /// the name must be resolved to the parameter in both cases.
   void _assertArgumentToParameter(
       Expression argument, ParameterElement expectedParameter,
       {DartType parameterMemberType}) {
     ParameterElement actualParameter = argument.staticParameterElement;
-    if (previewDart2) {
+    if (useCFE) {
       expect(actualParameter, isNull);
       if (argument is NamedExpression) {
         SimpleIdentifier name = argument.name.label;
@@ -5499,7 +5639,7 @@
 
   /// Assert that the [type] is a function type `() -> dynamic`.
   void _assertDynamicFunctionType(DartType type) {
-    if (previewDart2) {
+    if (useCFE) {
       expect(type.toString(), '() → dynamic');
     } else {
       expect(type, DynamicTypeImpl.instance);
@@ -5553,7 +5693,6 @@
       }
     }
     fail('Not found main() in ${result.unit}');
-    return null;
   }
 
   /**
@@ -8385,7 +8524,6 @@
       }
     }
     fail('Cannot find the class $name in\n$unit');
-    return null;
   }
 
   VariableDeclaration _getClassField(
@@ -8401,7 +8539,6 @@
       }
     }
     fail('Cannot find the field $fieldName in the class $className in\n$unit');
-    return null;
   }
 
   String _getClassFieldType(
@@ -8424,7 +8561,6 @@
     }
     fail('Cannot find the method $methodName in the class $className in\n'
         '$unit');
-    return null;
   }
 
   String _getClassMethodReturnType(
@@ -8457,7 +8593,6 @@
       }
     }
     fail('Cannot find the top-level variable $name in\n$unit');
-    return null;
   }
 
   String _getTopLevelVarType(CompilationUnit unit, String name) {
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index ef27ed8..fff33da 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -197,7 +197,6 @@
   @override
   dynamic noSuchMethod(Invocation invocation) {
     fail('Unexpected invocation of ${invocation.memberName}');
-    return null;
   }
 
   @override
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index c74db16..3faa53d 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -1456,7 +1456,6 @@
       }
     }
     fail('Class member not found');
-    return null;
   }
 
   EvaluationResultImpl _evaluateTopLevelVariable(
diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart
index 3538988..891bdd3 100644
--- a/pkg/analyzer/test/src/dart/constant/value_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/value_test.dart
@@ -1925,7 +1925,6 @@
       return new DartObjectImpl(_typeProvider.boolType, BoolState.TRUE_STATE);
     }
     fail("Invalid boolean value used in test");
-    return null;
   }
 
   DartObjectImpl _doubleValue(double value) {
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
index 10377b5..c424d5f 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
@@ -39,14 +39,11 @@
                 'typedef',
                 'functionVoid',
                 'functionNonVoid',
-                'const',
-                'final',
                 'getter',
                 'setter'
               ]),
           new TestDescriptor('named', 'class A',
-              [ParserErrorCode.MISSING_CLASS_BODY], 'class A {}',
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.MISSING_CLASS_BODY], 'class A {}'),
           new TestDescriptor(
               'extends',
               'class A extends',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
index f375872..8ccb281 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
@@ -37,11 +37,9 @@
               "export '';",
               allFailing: true),
           new TestDescriptor('emptyUri', "export ''",
-              [ParserErrorCode.EXPECTED_TOKEN], "export '';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "export '';"),
           new TestDescriptor('uri', "export 'a.dart'",
-              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart';"),
           new TestDescriptor(
               'hide',
               "export 'a.dart' hide",
@@ -52,8 +50,7 @@
               "export 'a.dart' hide _s_;",
               failing: allExceptEof),
           new TestDescriptor('hideName', "export 'a.dart' hide A",
-              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A;",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A;"),
           new TestDescriptor(
               'hideComma',
               "export 'a.dart' hide A,",
@@ -64,8 +61,7 @@
               "export 'a.dart' hide A, _s_;",
               failing: allExceptEof),
           new TestDescriptor('hideCommaName', "export 'a.dart' hide A, B",
-              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A, B;",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A, B;"),
           new TestDescriptor(
               'hideShow',
               "export 'a.dart' hide A show",
@@ -85,8 +81,7 @@
               "export 'a.dart' show _s_;",
               failing: allExceptEof),
           new TestDescriptor('showName', "export 'a.dart' show A",
-              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A;",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A;"),
           new TestDescriptor(
               'showComma',
               "export 'a.dart' show A,",
@@ -97,8 +92,7 @@
               "export 'a.dart' show A, _s_;",
               failing: allExceptEof),
           new TestDescriptor('showCommaName', "export 'a.dart' show A, B",
-              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A, B;",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A, B;"),
           new TestDescriptor(
               'showHide',
               "export 'a.dart' show A hide",
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
new file mode 100644
index 0000000..861b52d
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+
+import 'partial_code_support.dart';
+
+main() {
+  new MethodTest().buildAll();
+}
+
+class MethodTest extends PartialCodeTest {
+  buildAll() {
+    List<String> allExceptEof = <String>[
+      'field',
+      'fieldConst',
+      'fieldFinal',
+      'methodNonVoid',
+      'methodVoid',
+      'getter',
+      'setter'
+    ];
+    buildTests(
+        'field_declaration',
+        [
+          //
+          // Instance field, const.
+          //
+          new TestDescriptor(
+              'const_noName',
+              'const',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'const _s_;',
+              allFailing: true),
+          new TestDescriptor('const_name', 'const f',
+              [ParserErrorCode.EXPECTED_TOKEN], 'const f;',
+              allFailing: true),
+          new TestDescriptor(
+              'const_equals',
+              'const f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'const f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('const_initializer', 'const f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'const f = 0;'),
+          //
+          // Instance field, final.
+          //
+          new TestDescriptor(
+              'final_noName',
+              'final',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'final _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('final_name', 'final f',
+              [ParserErrorCode.EXPECTED_TOKEN], 'final f;',
+              allFailing: true),
+          new TestDescriptor(
+              'final_equals',
+              'final f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'final f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('final_initializer', 'final f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'final f = 0;'),
+          //
+          // Instance field, var.
+          //
+          new TestDescriptor(
+              'var_noName',
+              'var',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'var _s_;',
+              failing: allExceptEof),
+          new TestDescriptor(
+              'var_name', 'var f', [ParserErrorCode.EXPECTED_TOKEN], 'var f;',
+              allFailing: true),
+          new TestDescriptor(
+              'var_equals',
+              'var f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'var f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('var_initializer', 'var f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'var f = 0;'),
+          //
+          // Instance field, type.
+          //
+          new TestDescriptor(
+              'type_noName',
+              'A',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'A _s_;',
+              failing: allExceptEof),
+          new TestDescriptor(
+              'type_name', 'A f', [ParserErrorCode.EXPECTED_TOKEN], 'A f;',
+              failing: allExceptEof),
+          new TestDescriptor(
+              'type_equals',
+              'A f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'A f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('type_initializer', 'A f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'A f = 0;'),
+          //
+          // Static field, const.
+          //
+          new TestDescriptor(
+              'static_const_noName',
+              'static const',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static const _s_;',
+              allFailing: true),
+          new TestDescriptor('static_const_name', 'static const f',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static const f;',
+              allFailing: true),
+          new TestDescriptor(
+              'static_const_equals',
+              'static const f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static const f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_const_initializer', 'static const f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static const f = 0;'),
+          //
+          // Static field, final.
+          //
+          new TestDescriptor(
+              'static_final_noName',
+              'static final',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static final _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_final_name', 'static final f',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static final f;',
+              allFailing: true),
+          new TestDescriptor(
+              'static_final_equals',
+              'static final f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static final f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_final_initializer', 'static final f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static final f = 0;'),
+          //
+          // Static field, var.
+          //
+          new TestDescriptor(
+              'static_var_noName',
+              'static var',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static var _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_var_name', 'static var f',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static var f;',
+              allFailing: true),
+          new TestDescriptor(
+              'static_var_equals',
+              'static var f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static var f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_var_initializer', 'static var f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static var f = 0;'),
+          //
+          // Static field, type.
+          //
+          new TestDescriptor(
+              'static_type_noName',
+              'static A',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static A _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_type_name', 'static A f',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A f;',
+              failing: allExceptEof),
+          new TestDescriptor(
+              'static_type_equals',
+              'static A f =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static A f = _s_;',
+              failing: allExceptEof),
+          new TestDescriptor('static_type_initializer', 'static A f = 0',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A f = 0;'),
+        ],
+        PartialCodeTest.classMemberSuffixes,
+        head: 'class C { ',
+        tail: ' }');
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index 0fb6f87..86240ee 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -23,11 +23,9 @@
               "import '';",
               allFailing: true),
           new TestDescriptor('emptyUri', "import ''",
-              [ParserErrorCode.EXPECTED_TOKEN], "import '';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "import '';"),
           new TestDescriptor('fullUri', "import 'a.dart'",
-              [ParserErrorCode.EXPECTED_TOKEN], "import 'a.dart';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "import 'a.dart';"),
         ],
         PartialCodeTest.prePartSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
index 5b618fe..b1f0f16 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
@@ -40,8 +40,7 @@
               'library _s_;',
               failing: allExceptEof),
           new TestDescriptor('name', 'library lib',
-              [ParserErrorCode.EXPECTED_TOKEN], 'library lib;',
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], 'library lib;'),
           new TestDescriptor(
               'nameDot',
               'library lib.',
@@ -52,8 +51,7 @@
               'library lib._s_;',
               failing: allExceptEof),
           new TestDescriptor('nameDotName', 'library lib.a',
-              [ParserErrorCode.EXPECTED_TOKEN], 'library lib.a;',
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], 'library lib.a;'),
         ],
         PartialCodeTest.prePartSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
index d104bcf..432d9d4 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
@@ -15,14 +15,17 @@
     buildTests(
         'method_declaration',
         [
+          //
+          // Instance method, no return type.
+          //
           new TestDescriptor('noType_leftParen', 'm(',
-              [ParserErrorCode.EXPECTED_TOKEN], "m();",
+              [ParserErrorCode.EXPECTED_TOKEN], 'm();',
               allFailing: true),
           new TestDescriptor('noType_paramName', 'm(B',
-              [ParserErrorCode.EXPECTED_TOKEN], "m(B);",
+              [ParserErrorCode.EXPECTED_TOKEN], 'm(B);',
               allFailing: true),
           new TestDescriptor('noType_paramTypeAndName', 'm(B b',
-              [ParserErrorCode.EXPECTED_TOKEN], "m(B b);",
+              [ParserErrorCode.EXPECTED_TOKEN], 'm(B b);',
               allFailing: true),
           new TestDescriptor(
               'noType_paramAndComma',
@@ -31,13 +34,13 @@
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
-              "m(B b, _s_);",
+              'm(B b, _s_);',
               allFailing: true),
           new TestDescriptor('noType_noParams', 'm()',
-              [ParserErrorCode.EXPECTED_TOKEN], "m();",
+              [ParserErrorCode.EXPECTED_TOKEN], 'm();',
               allFailing: true),
           new TestDescriptor('noType_params', 'm(b, c)',
-              [ParserErrorCode.EXPECTED_TOKEN], "m(b, c);",
+              [ParserErrorCode.EXPECTED_TOKEN], 'm(b, c);',
               allFailing: true),
           new TestDescriptor(
               'noType_emptyOptional',
@@ -46,8 +49,7 @@
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.MISSING_FUNCTION_BODY
               ],
-              "m(B b, [_s_]){}",
-              failing: ['fieldConst']),
+              'm(B b, [_s_]){}'),
           new TestDescriptor(
               'noType_emptyNamed',
               'm(B b, {})',
@@ -55,31 +57,33 @@
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.MISSING_FUNCTION_BODY
               ],
-              "m(B b, {_s_}){}",
-              failing: ['fieldConst']),
+              'm(B b, {_s_}){}'),
+          //
+          // Instance method, with simple return type.
+          //
           new TestDescriptor('type_leftParen', 'A m(',
-              [ParserErrorCode.EXPECTED_TOKEN], "A m();",
+              [ParserErrorCode.EXPECTED_TOKEN], 'A m();',
               allFailing: true),
           new TestDescriptor('type_paramName', 'A m(B',
-              [ParserErrorCode.EXPECTED_TOKEN], "A m(B);",
+              [ParserErrorCode.EXPECTED_TOKEN], 'A m(B);',
               allFailing: true),
           new TestDescriptor('type_paramTypeAndName', 'A m(B b',
-              [ParserErrorCode.EXPECTED_TOKEN], "A m(B b);",
+              [ParserErrorCode.EXPECTED_TOKEN], 'A m(B b);',
               allFailing: true),
           new TestDescriptor(
-              'noType_paramAndComma',
+              'type_paramAndComma',
               'A m(B b,',
               [
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
-              "A m(B b, _s_);",
+              'A m(B b, _s_);',
               allFailing: true),
           new TestDescriptor('type_noParams', 'A m()',
-              [ParserErrorCode.EXPECTED_TOKEN], "A m();",
+              [ParserErrorCode.EXPECTED_TOKEN], 'A m();',
               allFailing: true),
           new TestDescriptor('type_params', 'A m(b, c)',
-              [ParserErrorCode.EXPECTED_TOKEN], "A m(b, c);",
+              [ParserErrorCode.EXPECTED_TOKEN], 'A m(b, c);',
               allFailing: true),
           new TestDescriptor(
               'type_emptyOptional',
@@ -88,8 +92,7 @@
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.MISSING_FUNCTION_BODY
               ],
-              "A m(B b, [_s_]){}",
-              failing: ['fieldConst']),
+              'A m(B b, [_s_]){}'),
           new TestDescriptor(
               'type_emptyNamed',
               'A m(B b, {})',
@@ -97,8 +100,93 @@
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.MISSING_FUNCTION_BODY
               ],
-              "A m(B b, {_s_}){}",
-              failing: ['fieldConst']),
+              'A m(B b, {_s_}){}'),
+          //
+          // Static method, no return type.
+          //
+          new TestDescriptor('static_noType_leftParen', 'static m(',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static m();',
+              allFailing: true),
+          new TestDescriptor('static_noType_paramName', 'static m(B',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static m(B);',
+              allFailing: true),
+          new TestDescriptor('static_noType_paramTypeAndName', 'static m(B b',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static m(B b);',
+              allFailing: true),
+          new TestDescriptor(
+              'static_noType_paramAndComma',
+              'static m(B b,',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static m(B b, _s_);',
+              allFailing: true),
+          new TestDescriptor('static_noType_noParams', 'static m()',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static m();',
+              allFailing: true),
+          new TestDescriptor('static_noType_params', 'static m(b, c)',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static m(b, c);',
+              allFailing: true),
+          new TestDescriptor(
+              'static_noType_emptyOptional',
+              'static m(B b, [])',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              'static m(B b, [_s_]){}'),
+          new TestDescriptor(
+              'static_noType_emptyNamed',
+              'static m(B b, {})',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              'static m(B b, {_s_}){}'),
+          //
+          // Static method, with simple return type.
+          //
+          new TestDescriptor('static_type_leftParen', 'static A m(',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A m();',
+              allFailing: true),
+          new TestDescriptor('static_type_paramName', 'static A m(B',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A m(B);',
+              allFailing: true),
+          new TestDescriptor('static_type_paramTypeAndName', 'static A m(B b',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A m(B b);',
+              allFailing: true),
+          new TestDescriptor(
+              'static_type_paramAndComma',
+              'static A m(B b,',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'static A m(B b, _s_);',
+              allFailing: true),
+          new TestDescriptor('static_type_noParams', 'static A m()',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A m();',
+              allFailing: true),
+          new TestDescriptor('static_type_params', 'static A m(b, c)',
+              [ParserErrorCode.EXPECTED_TOKEN], 'static A m(b, c);',
+              allFailing: true),
+          new TestDescriptor(
+              'static_type_emptyOptional',
+              'static A m(B b, [])',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              'static A m(B b, [_s_]){}'),
+          new TestDescriptor(
+              'static_type_emptyNamed',
+              'static A m(B b, {})',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              'static A m(B b, {_s_}){}'),
         ],
         PartialCodeTest.classMemberSuffixes,
         head: 'class C { ',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
index 75adedf..cde7dbb 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
@@ -23,11 +23,9 @@
               "part '';",
               allFailing: true),
           new TestDescriptor('emptyUri', "part ''",
-              [ParserErrorCode.EXPECTED_TOKEN], "part '';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "part '';"),
           new TestDescriptor('uri', "part 'a.dart'",
-              [ParserErrorCode.EXPECTED_TOKEN], "part 'a.dart';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "part 'a.dart';"),
         ],
         PartialCodeTest.postPartSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
index 2808206..0fbbd80 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
@@ -49,14 +49,11 @@
               'part of lib._s_;',
               failing: allExceptEof),
           new TestDescriptor('nameDotName', 'part of lib.a',
-              [ParserErrorCode.EXPECTED_TOKEN], 'part of lib.a;',
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], 'part of lib.a;'),
           new TestDescriptor('emptyUri', "part of ''",
-              [ParserErrorCode.EXPECTED_TOKEN], "part of '';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "part of '';"),
           new TestDescriptor('uri', "part of 'a.dart'",
-              [ParserErrorCode.EXPECTED_TOKEN], "part of 'a.dart';",
-              failing: onlyConstAndFinal),
+              [ParserErrorCode.EXPECTED_TOKEN], "part of 'a.dart';"),
         ],
         PartialCodeTest.declarationSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index 6b5a921..35c91eb 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -26,8 +26,8 @@
    */
   static final List<TestSuffix> classMemberSuffixes = <TestSuffix>[
     new TestSuffix('field', 'var f;'),
-    new TestSuffix('fieldConst', 'const f;'),
-    new TestSuffix('fieldFinal', 'final f;'),
+    new TestSuffix('fieldConst', 'const f = 0;'),
+    new TestSuffix('fieldFinal', 'final f = 0;'),
     new TestSuffix('methodNonVoid', 'int a(b) => 0;'),
     new TestSuffix('methodVoid', 'void a(b) {}'),
     new TestSuffix('getter', 'int get a => 0;'),
@@ -44,8 +44,8 @@
     new TestSuffix('functionVoid', 'void f() {}'),
     new TestSuffix('functionNonVoid', 'int f() {}'),
     new TestSuffix('var', 'var a;'),
-    new TestSuffix('const', 'const a;'),
-    new TestSuffix('final', 'final a;'),
+    new TestSuffix('const', 'const a = 0;'),
+    new TestSuffix('final', 'final a = 0;'),
     new TestSuffix('getter', 'int get a => 0;'),
     new TestSuffix('setter', 'set a(b) {}')
   ];
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
index e714b32..735402b 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
@@ -11,6 +11,7 @@
 import 'continue_statement_test.dart' as continue_statement;
 import 'do_statement_test.dart' as do_statement;
 import 'export_directive_test.dart' as export_directive;
+import 'field_declaration_test.dart' as field_declaration;
 import 'forEach_statement_test.dart' as forEach_statement;
 import 'for_statement_test.dart' as for_statement;
 import 'if_statement_test.dart' as if_statement;
@@ -37,6 +38,7 @@
     continue_statement.main();
     do_statement.main();
     export_directive.main();
+    field_declaration.main();
     for_statement.main();
     forEach_statement.main();
     if_statement.main();
diff --git a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
index cf2c3b8..f86a63b 100644
--- a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
@@ -51,7 +51,6 @@
       _safelyWriteNodePath(buffer, first.owner);
     }
     fail(buffer.toString());
-    return false;
   }
 
   @override
@@ -78,7 +77,6 @@
       _safelyWriteNodePath(buffer, first);
     }
     fail(buffer.toString());
-    return false;
   }
 
   @override
@@ -92,7 +90,6 @@
       _safelyWriteNodePath(buffer, first);
     }
     fail(buffer.toString());
-    return false;
   }
 
   /**
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index c6cd476..742fcbe 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -8,6 +8,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -480,6 +481,10 @@
         expect(r.value, o.value, reason: desc);
       } else if (o is IntegerLiteral && r is IntegerLiteral) {
         expect(r.value ?? 0, o.value ?? 0, reason: desc);
+      } else if (o is IntegerLiteral && r is PrefixExpression) {
+        expect(r.operator.type, TokenType.MINUS);
+        IntegerLiteral ri = r.operand;
+        expect(-ri.value, o.value, reason: desc);
       } else if (o is DoubleLiteral && r is DoubleLiteral) {
         if (r.value != null &&
             r.value.isNaN &&
@@ -1195,7 +1200,6 @@
     } else {
       fail('Unexpected type for resynthesized ($desc):'
           ' ${element.runtimeType}');
-      return null;
     }
   }
 
@@ -4076,14 +4080,14 @@
     }
   }
 
-  @failingTest // https://github.com/dart-lang/sdk/issues/31768
   test_const_topLevel_literal() async {
     var library = await checkLibrary(r'''
 const vNull = null;
 const vBoolFalse = false;
 const vBoolTrue = true;
 const vInt = 1;
-const vIntLong = 0x9876543210987654321;
+const vIntLong1 = 0x7FFFFFFFFFFFFFFF;
+const vIntLong2 = 0xFFFFFFFFFFFFFFFF;
 const vDouble = 2.3;
 const vString = 'abc';
 const vStringConcat = 'aaa' 'bbb';
@@ -4096,7 +4100,8 @@
 const bool vBoolFalse = false;
 const bool vBoolTrue = true;
 const int vInt = 1;
-const int vIntLong = 44998905507923676709665;
+const int vIntLong1 = 9223372036854775807;
+const int vIntLong2 = -1;
 const double vDouble = 2.3;
 const String vString = 'abc';
 const String vStringConcat = 'aaabbb';
@@ -4109,7 +4114,8 @@
 const dynamic vBoolFalse = false;
 const dynamic vBoolTrue = true;
 const dynamic vInt = 1;
-const dynamic vIntLong = 44998905507923676709665;
+const dynamic vIntLong1 = 9223372036854775807;
+const dynamic vIntLong2 = -1;
 const dynamic vDouble = 2.3;
 const dynamic vString = 'abc';
 const dynamic vStringConcat = 'aaabbb';
@@ -5493,8 +5499,11 @@
   }
 
   test_export_class_type_alias() async {
-    addLibrarySource(
-        '/a.dart', 'class C {} exends _D with _E; class _D {} class _E {}');
+    addLibrarySource('/a.dart', r'''
+class C = _D with _E;
+class _D {}
+class _E {}
+''');
     var library = await checkLibrary('export "a.dart";');
     checkElementText(library, r'''
 export 'a.dart';
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 651b216..668c30f 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -5,29 +5,22 @@
 library analyzer.test.src.summary.resynthesize_kernel_test;
 
 import 'dart:async';
+import 'dart:typed_data';
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/kernel_metadata.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/frontend_resolution.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/kernel/resynthesize.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/base/libraries_specification.dart';
 import 'package:front_end/src/base/performance_logger.dart';
-import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/uri_translator_impl.dart';
-import 'package:front_end/src/incremental/kernel_driver.dart';
 import 'package:kernel/kernel.dart' as kernel;
-import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart' as kernel;
 import 'package:kernel/type_environment.dart' as kernel;
-import 'package:package_config/packages.dart';
-import 'package:path/path.dart' as pathos;
 import 'package:test/src/frontend/expect.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -59,7 +52,7 @@
 class ResynthesizeKernelStrongTest extends ResynthesizeTest {
   static const DEBUG = false;
 
-  final resourceProvider = new MemoryResourceProvider(context: pathos.posix);
+  final resourceProvider = new MemoryResourceProvider();
 
   @override
   bool get isSharedFrontEnd => true;
@@ -86,7 +79,8 @@
       {bool allowErrors: false, bool dumpSummaries: false}) async {
     new MockSdk(resourceProvider: resourceProvider);
 
-    File testFile = resourceProvider.newFile('/test.dart', text);
+    String testPath = resourceProvider.convertPath('/test.dart');
+    File testFile = resourceProvider.newFile(testPath, text);
     Uri testUri = testFile.toUri();
     String testUriStr = testUri.toString();
 
@@ -154,12 +148,6 @@
   }
 
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30266')
-  test_const_invalid_intLiteral() async {
-    await super.test_const_invalid_intLiteral();
-  }
-
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30258')
   test_constructor_redirected_factory_named_generic() async {
     await super.test_constructor_redirected_factory_named_generic();
@@ -197,12 +185,6 @@
 
   @failingTest
   @notForDart2
-  test_export_configurations_useDefault() async {
-    await super.test_export_configurations_useDefault();
-  }
-
-  @failingTest
-  @notForDart2
   test_export_configurations_useFirst() async {
     await super.test_export_configurations_useFirst();
   }
@@ -215,12 +197,6 @@
 
   @failingTest
   @notForDart2
-  test_exportImport_configurations_useDefault() async {
-    await super.test_exportImport_configurations_useDefault();
-  }
-
-  @failingTest
-  @notForDart2
   test_exportImport_configurations_useFirst() async {
     await super.test_exportImport_configurations_useFirst();
   }
@@ -244,12 +220,6 @@
 
   @failingTest
   @notForDart2
-  test_import_configurations_useDefault() async {
-    await super.test_import_configurations_useDefault();
-  }
-
-  @failingTest
-  @notForDart2
   test_import_configurations_useFirst() async {
     await super.test_import_configurations_useFirst();
   }
@@ -365,12 +335,6 @@
   }
 
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30725')
-  test_parts_invalidUri_nullStringValue() async {
-    await super.test_parts_invalidUri_nullStringValue();
-  }
-
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31711')
   test_typedef_generic_asFieldType() async {
     await super.test_typedef_generic_asFieldType();
@@ -418,40 +382,40 @@
   }
 
   Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
-    Map<String, LibraryInfo> dartLibraries = {};
-    MockSdk.FULL_URI_MAP.forEach((dartUri, path) {
-      var name = Uri.parse(dartUri).path;
-      dartLibraries[name] =
-          new LibraryInfo(name, Uri.parse('file://$path'), const []);
-    });
+    var logger = new PerformanceLog(null);
+    var byteStore = new MemoryByteStore();
+    var analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
 
-    var uriTranslator = new UriTranslatorImpl(
-        new TargetLibrariesSpecification('none', dartLibraries),
-        Packages.noPackages);
-    var options = new ProcessedOptions(new CompilerOptions()
-      ..target = new NoneTarget(new TargetFlags(strongMode: isStrongMode))
-      ..reportMessages = false
-      ..logger = new PerformanceLog(null)
-      ..fileSystem = new _FileSystemAdaptor(resourceProvider)
-      ..byteStore = new MemoryByteStore());
-    var driver = new KernelDriver(
-        options, uriTranslator, new KernelErrorListener(),
-        metadataFactory: new AnalyzerMetadataFactory());
+    var fsState = new FileSystemState(
+        logger,
+        byteStore,
+        new FileContentOverlay(),
+        resourceProvider,
+        sourceFactory,
+        analysisOptions,
+        new Uint32List(0));
 
-    KernelResult kernelResult = await driver.getKernel(testUri);
+    var compiler = new FrontEndCompiler(
+        logger,
+        new MemoryByteStore(),
+        analysisOptions,
+        null,
+        sourceFactory,
+        fsState,
+        resourceProvider.pathContext);
 
+    LibraryCompilationResult libraryResult = await compiler.compile(testUri);
+
+    // Remember Kernel libraries produced by the compiler.
     var libraryMap = <String, kernel.Library>{};
     var libraryExistMap = <String, bool>{};
-
-    void addLibrary(kernel.Library library) {
+    for (var library in libraryResult.program.libraries) {
       String uriStr = library.importUri.toString();
       libraryMap[uriStr] = library;
-      libraryExistMap[uriStr] = true;
+      FileState file = fsState.getFileForUri(library.importUri);
+      libraryExistMap[uriStr] = file?.exists ?? false;
     }
 
-    kernelResult.dependencies.forEach(addLibrary);
-    addLibrary(kernelResult.libraryResult.library);
-
     if (DEBUG) {
       String testUriStr = testUri.toString();
       var library = libraryMap[testUriStr];
@@ -459,7 +423,7 @@
     }
 
     var resynthesizer = new KernelResynthesizer(
-        context, kernelResult.types, libraryMap, libraryExistMap);
+        context, libraryResult.types, libraryMap, libraryExistMap);
     return resynthesizer;
   }
 
@@ -470,42 +434,3 @@
     return buffer.toString();
   }
 }
-
-class _FileSystemAdaptor implements FileSystem {
-  final ResourceProvider provider;
-
-  _FileSystemAdaptor(this.provider);
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    if (uri.isScheme('file')) {
-      var file = provider.getFile(uri.path);
-      return new _FileSystemEntityAdaptor(uri, file);
-    } else {
-      throw new ArgumentError(
-          'Only file:// URIs are supported, but $uri is given.');
-    }
-  }
-}
-
-class _FileSystemEntityAdaptor implements FileSystemEntity {
-  final Uri uri;
-  final File file;
-
-  _FileSystemEntityAdaptor(this.uri, this.file);
-
-  @override
-  Future<bool> exists() async {
-    return file.exists;
-  }
-
-  @override
-  Future<List<int>> readAsBytes() async {
-    return file.readAsBytesSync();
-  }
-
-  @override
-  Future<String> readAsString() async {
-    return file.readAsStringSync();
-  }
-}
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 7ec895f..7581f8e 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -16,9 +16,9 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/public_namespace_computer.dart'
     as public_namespace;
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:path/path.dart' show posix;
 import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../context/mock_sdk.dart';
 
@@ -326,7 +326,6 @@
       found.add(dep.uri);
     }
     fail('Did not find dependency $relativeUri.  Found: $found');
-    return null;
   }
 
   /**
@@ -2638,6 +2637,71 @@
     ]);
   }
 
+  test_constExpr_makeTypedList_functionType() {
+    UnlinkedVariable variable =
+        serializeVariableText('final v = <void Function(int)>[];');
+    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+      UnlinkedExprOperation.makeTypedList
+    ], ints: [
+      0 // Size of the list
+    ], referenceValidators: [
+      (EntityRef reference) {
+        expect(reference, new isInstanceOf<EntityRef>());
+        expect(reference.entityKind, EntityRefKind.genericFunctionType);
+        expect(reference.syntheticParams, hasLength(1));
+        {
+          final param = reference.syntheticParams[0];
+          expect(param.name, ''); // no name for generic type parameters
+          checkTypeRef(param.type, 'dart:core', 'int',
+              expectedKind: ReferenceKind.classOrEnum);
+        }
+        expect(reference.paramReference, 0);
+        expect(reference.typeParameters, hasLength(0));
+        // TODO(mfairhurst) check this references void
+        expect(reference.syntheticReturnType, isNotNull);
+      }
+    ]);
+  }
+
+  @failingTest
+  test_constExpr_makeTypedList_functionType_withTypeParameters() {
+    UnlinkedVariable variable = serializeVariableText(
+        'final v = <void Function<T>(Function<Q>(T, Q))>[];');
+    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+      UnlinkedExprOperation.makeTypedList
+    ], ints: [
+      0 // Size of the list
+    ], referenceValidators: [
+      (EntityRef reference) {
+        expect(reference, new isInstanceOf<EntityRef>());
+        expect(reference.entityKind, EntityRefKind.genericFunctionType);
+        expect(reference.syntheticParams, hasLength(1));
+        {
+          final param = reference.syntheticParams[0];
+          expect(param.type, new isInstanceOf<EntityRef>());
+          expect(param.type.entityKind, EntityRefKind.genericFunctionType);
+          expect(param.type.syntheticParams, hasLength(2));
+          {
+            final subparam = reference.syntheticParams[0];
+            expect(subparam.name, ''); // no name for generic type parameters
+            expect(subparam.type, new isInstanceOf<EntityRef>());
+            expect(subparam.type.paramReference, 2);
+          }
+          {
+            final subparam = reference.syntheticParams[1];
+            expect(subparam.name, ''); // no name for generic type parameters
+            expect(subparam.type, new isInstanceOf<EntityRef>());
+            expect(subparam.type.paramReference, 1);
+          }
+        }
+        expect(reference.paramReference, 0);
+        expect(reference.typeParameters, hasLength(1));
+        // TODO(mfairhurst) check this references void
+        expect(reference.syntheticReturnType, isNotNull);
+      }
+    ]);
+  }
+
   test_constExpr_makeTypedMap() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const <int, String>{11: "aaa", 22: "bbb", 33: "ccc"};');
@@ -2809,13 +2873,23 @@
     ]);
   }
 
-  @failingTest // https://github.com/dart-lang/sdk/issues/31768
-  test_constExpr_pushLongInt() {
+  test_constExpr_pushLongInt_maxNegative() {
     UnlinkedVariable variable =
-        serializeVariableText('const v = 0xA123456789ABCDEF012345678;');
+        serializeVariableText('const v = 0xFFFFFFFFFFFFFFFF;');
+    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+      UnlinkedExprOperation.pushInt,
+      UnlinkedExprOperation.negate
+    ], ints: [
+      1
+    ]);
+  }
+
+  test_constExpr_pushLongInt_maxPositive() {
+    UnlinkedVariable variable =
+        serializeVariableText('const v = 0x7FFFFFFFFFFFFFFF;');
     assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedExprOperation.pushLongInt],
-        ints: [4, 0xA, 0x12345678, 0x9ABCDEF0, 0x12345678]);
+        ints: [2, 0x7FFFFFFF, 0xFFFFFFFF]);
   }
 
   test_constExpr_pushLongInt_min2() {
@@ -2829,18 +2903,11 @@
     ]);
   }
 
-  @failingTest // https://github.com/dart-lang/sdk/issues/31768
-  test_constExpr_pushLongInt_min3() {
+  test_constExpr_pushLongInt_tooLong() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0x10000000000000000;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushLongInt
-    ], ints: [
-      3,
-      1,
-      0,
-      0,
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr,
+        operators: [UnlinkedExprOperation.pushInt], ints: [0]);
   }
 
   test_constExpr_pushNull() {
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index c247c00..4d895f0 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -146,14 +146,14 @@
   test_initializer_functionLiteral_expressionBody() async {
     var content = r'''
 var a = 0;
-var t = (int p) => (a = 1);
+var t = /*info:INFERRED_TYPE_CLOSURE*/(int p) => (a = 1);
 ''';
     await checkFile(content);
   }
 
   test_initializer_functionLiteral_parameters_withoutType() async {
     var content = r'''
-var t = (int a, b,int c, d) => 0;
+var t = /*info:INFERRED_TYPE_CLOSURE*/(int a, b,int c, d) => 0;
 ''';
     await checkFile(content);
   }
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index c4b786b..1faae13 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -1114,7 +1114,6 @@
       }
     }
     fail('Annotation not found');
-    return null;
   }
 
   test_annotation_with_args() {
@@ -1269,7 +1268,6 @@
       }
     }
     fail('Annotation not found');
-    return null;
   }
 
   test_annotation_non_const_constructor() {
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index a022797..2ed061e 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -447,7 +447,7 @@
 
   test_conversionAndDynamicInvoke() async {
     addFile('''
-dynamic toString = (int x) => x + 42;
+dynamic toString = /*info:INFERRED_TYPE_CLOSURE*/(int x) => x + 42;
 dynamic hashCode = "hello";
 ''', name: '/helper.dart');
     await checkFile('''
@@ -511,7 +511,7 @@
   (/*info:DYNAMIC_INVOKE*/a1.toStringClosure("hello"));
   a1.hashCode;
 
-  dynamic toString = () => null;
+  dynamic toString = /*info:INFERRED_TYPE_CLOSURE*/() => null;
   (/*info:DYNAMIC_INVOKE*/toString());
 
   (/*info:DYNAMIC_INVOKE*/helper.toString());
@@ -1156,10 +1156,10 @@
         botTop
                       );
     apply<BotTop>(
-        (dynamic x) => new A(),
-        (dynamic x) => (x as Object),
-        (A x) => x,
-        (A x) => null,
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => new A(),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => (x as Object),
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => x,
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => null,
         botA,
         botTop
                       );
@@ -1181,10 +1181,10 @@
         /*info:DOWN_CAST_COMPOSITE*/botTop
                     );
     apply<ATop>(
-        (dynamic x) => new A(),
-        (dynamic x) => (x as Object),
-        (A x) => x,
-        (A x) => null,
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => new A(),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => (x as Object),
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => x,
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => null,
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/botA,
         /*info:DOWN_CAST_COMPOSITE*/botTop
                     );
@@ -1206,10 +1206,10 @@
         /*info:DOWN_CAST_COMPOSITE*/botTop
                     );
     apply<BotA>(
-        (dynamic x) => new A(),
-        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(dynamic x) => (x as Object),
-        (A x) => x,
-        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(A x) => (/*info:UNNECESSARY_CAST*/x as Object),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => new A(),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => (/*info:DOWN_CAST_IMPLICIT*/x as Object),
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => x,
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => (/*info:DOWN_CAST_IMPLICIT, info:UNNECESSARY_CAST*/x as Object),
         botA,
         /*info:DOWN_CAST_COMPOSITE*/botTop
                     );
@@ -1231,10 +1231,10 @@
         /*info:DOWN_CAST_COMPOSITE*/botTop
                   );
     apply<AA>(
-        (dynamic x) => new A(),
-        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(dynamic x) => (x as Object),
-        (A x) => x,
-        /*error:INVALID_CAST_FUNCTION_EXPR*/(A x) => (/*info:UNNECESSARY_CAST*/x as Object), // known function
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => new A(),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => (/*info:DOWN_CAST_IMPLICIT*/x as Object),
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => x,
+        /*info:INFERRED_TYPE_CLOSURE*/(A x) => (/*info:DOWN_CAST_IMPLICIT, info:UNNECESSARY_CAST*/x as Object), // known function
         /*info:DOWN_CAST_COMPOSITE*/botA,
         /*info:DOWN_CAST_COMPOSITE*/botTop
                   );
@@ -1256,10 +1256,10 @@
         /*info:DOWN_CAST_COMPOSITE*/botTop
                       );
     apply<TopTop>(
-        (dynamic x) => new A(),
-        (dynamic x) => (x as Object),
-        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(A x) => x,
-        /*error:INVALID_CAST_FUNCTION_EXPR*/(A x) => (/*info:UNNECESSARY_CAST*/x as Object), // known function
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => new A(),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => (x as Object),
+        /*info:INFERRED_TYPE_CLOSURE, error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(A x) => x,
+        /*info:INFERRED_TYPE_CLOSURE, error:INVALID_CAST_FUNCTION_EXPR*/(A x) => (/*info:UNNECESSARY_CAST*/x as Object), // known function
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/botA,
         /*info:DOWN_CAST_COMPOSITE*/botTop
                       );
@@ -1281,10 +1281,10 @@
         /*info:DOWN_CAST_COMPOSITE*/botTop
                     );
     apply<TopA>(
-        (dynamic x) => new A(),
-        /*error:INVALID_CAST_FUNCTION_EXPR*/(dynamic x) => (x as Object), // known function
-        /*error:INVALID_CAST_FUNCTION_EXPR*/(A x) => x, // known function
-        /*error:INVALID_CAST_FUNCTION_EXPR*/(A x) => (/*info:UNNECESSARY_CAST*/x as Object), // known function
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => new A(),
+        /*info:INFERRED_TYPE_CLOSURE*/(dynamic x) => (/*info:DOWN_CAST_IMPLICIT*/x as Object), // known function
+        /*info:INFERRED_TYPE_CLOSURE, error:INVALID_CAST_FUNCTION_EXPR*/(A x) => x, // known function
+        /*info:INFERRED_TYPE_CLOSURE, error:INVALID_CAST_FUNCTION_EXPR*/(A x) => (/*info:DOWN_CAST_IMPLICIT, info:UNNECESSARY_CAST*/x as Object), // known function
         /*info:DOWN_CAST_COMPOSITE*/botA,
         /*info:DOWN_CAST_COMPOSITE*/botTop
                     );
@@ -1350,13 +1350,13 @@
 
 void test1() {
   void takesF(f(int x)) => null;
-  takesF((dynamic y) => 3);
+  takesF(/*info:INFERRED_TYPE_CLOSURE*/(dynamic y) => 3);
 }
 
 void test2() {
   int x;
   int f<T>(T t, callback(T x)) { return 3; }
-  f(x, (y) => 3);
+  f(x, /*info:INFERRED_TYPE_CLOSURE*/(y) => 3);
 }
 ''');
   }
@@ -1967,7 +1967,7 @@
   test_functionTypingAndSubtyping_subtypeOfUniversalType() async {
     await checkFile('''
 void main() {
-  nonGenericFn(x) => null;
+  nonGenericFn/*info:INFERRED_TYPE_CLOSURE*/(x) => null;
   {
     R f<P, R>(P p) => null;
     T g<S, T>(S s) => null;
@@ -1976,7 +1976,7 @@
     local = g; // valid
 
     // Non-generic function cannot subtype a generic one.
-    local = /*error:INVALID_ASSIGNMENT*/(x) => null;
+    local = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/(x) => null;
     local = /*error:INVALID_ASSIGNMENT*/nonGenericFn;
   }
   {
@@ -1992,7 +1992,7 @@
     local2 = /*info:DOWN_CAST_COMPOSITE*/local;
 
     // Non-generic function cannot subtype a generic one.
-    local = /*error:INVALID_ASSIGNMENT*/(x) => null;
+    local = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/(x) => null;
     local = /*error:INVALID_ASSIGNMENT*/nonGenericFn;
   }
 }
@@ -2290,7 +2290,7 @@
 
   test_implicitCasts_genericMethods() async {
     addFile('''
-var x = <String>[].map<String>((x) => "");
+var x = <String>[].map<String>(/*info:INFERRED_TYPE_CLOSURE*/(x) => "");
 ''');
     await check(implicitCasts: false);
   }
@@ -2398,9 +2398,9 @@
   d = /*error:IMPLICIT_DYNAMIC_FUNCTION*/g();
   i = g();
 
-  /*error:IMPLICIT_DYNAMIC_INVOKE*/(<T>(T t) => t)(d);
-  (<T>(T t) => t)(42);
-  (<T>() => /*info:UNNECESSARY_CAST*/null as T)<int>();
+  /*error:IMPLICIT_DYNAMIC_INVOKE*/(/*info:INFERRED_TYPE_CLOSURE*/<T>(T t) => t)(d);
+  (/*info:INFERRED_TYPE_CLOSURE*/<T>(T t) => t)(42);
+  (/*info:INFERRED_TYPE_CLOSURE*/<T>() => /*info:UNNECESSARY_CAST*/null as T)<int>();
 }
     ''');
     await check(implicitDynamic: false);
@@ -2513,7 +2513,7 @@
 
 // nested function
 void main() {
-  /*error:IMPLICIT_DYNAMIC_RETURN*/g0() {return g0();}
+  /*error:IMPLICIT_DYNAMIC_RETURN*/g0/*info:INFERRED_TYPE_CLOSURE*/() {return g0();}
   dynamic g1() { return 42; }
 }
 
@@ -2537,8 +2537,8 @@
 void ftf1(dynamic f(int x)) {}
 
 // function expressions
-var fe0 = (int x) => x as dynamic;
-var fe1 = (int x) => x;
+var fe0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => x as dynamic;
+var fe1 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => x;
     ''');
     await check(implicitDynamic: false);
   }
@@ -4057,7 +4057,7 @@
   SplayTreeMap([int compare(K key1, K key2),
                 bool isValidKey(potentialKey)])
     : _comparator = /*info:DOWN_CAST_COMPOSITE*/(compare == null) ? Comparable.compare : compare,
-      _validKey = (isValidKey != null) ? isValidKey : ((v) => true) {
+      _validKey = (isValidKey != null) ? isValidKey : (/*info:INFERRED_TYPE_CLOSURE*/(v) => true) {
 
     // NOTE: this is a down cast because isValidKey has fuzzy arrow type.
     _Predicate<Object> v = /*info:DOWN_CAST_COMPOSITE*/(isValidKey != null)
@@ -4178,8 +4178,8 @@
     await checkFile(r'''
 void f<T extends num>(T x, T y) {
   var z = x;
-  var f = () => x;
-  f = () => y;
+  var f = /*info:INFERRED_TYPE_CLOSURE*/() => x;
+  f = /*info:INFERRED_TYPE_CLOSURE*/() => y;
   if (x is int) {
     /*info:DYNAMIC_INVOKE*/z./*error:UNDEFINED_GETTER*/isEven;
     var q = x;
@@ -4187,7 +4187,7 @@
     /*info:DYNAMIC_INVOKE*/f()./*error:UNDEFINED_GETTER*/isEven;
 
     // This captures the type `T extends int`.
-    var g = () => x;
+    var g = /*info:INFERRED_TYPE_CLOSURE*/() => x;
     g = /*info:DOWN_CAST_COMPOSITE*/f;
     g().isEven;
     q = g();
@@ -4377,7 +4377,7 @@
   /*info:DOWN_CAST_IMPLICIT_ASSIGN*/b++;
   /*info:DOWN_CAST_IMPLICIT_ASSIGN*/b--;
 
-  takesC(C c) => null;
+  takesC/*info:INFERRED_TYPE_CLOSURE*/(C c) => null;
   takesC(/*info:DOWN_CAST_IMPLICIT*/++/*info:DOWN_CAST_IMPLICIT_ASSIGN*/b);
   takesC(/*info:DOWN_CAST_IMPLICIT*/--/*info:DOWN_CAST_IMPLICIT_ASSIGN*/b);
   takesC(/*info:DOWN_CAST_IMPLICIT,info:DOWN_CAST_IMPLICIT_ASSIGN*/b++);
diff --git a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
new file mode 100644
index 0000000..4f208e9
--- /dev/null
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -0,0 +1,869 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/resolver_test_case.dart';
+import '../../../generated/test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(Dart2InferenceTest);
+  });
+}
+
+/// Tests for Dart2 inference rules back-ported from FrontEnd.
+///
+/// https://github.com/dart-lang/sdk/issues/31638
+@reflectiveTest
+class Dart2InferenceTest extends ResolverTestCase {
+  @override
+  AnalysisOptions get defaultAnalysisOptions =>
+      new AnalysisOptionsImpl()..strongMode = true;
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_bool_assert() async {
+    var code = r'''
+T f<T>() => null;
+
+main() {
+  assert(f()); // 1
+  assert(f(), f()); // 2
+}
+
+class C {
+  C() : assert(f()), // 3
+        assert(f(), f()); // 4
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    String getType(String prefix) {
+      var invocation = _findMethodInvocation(unit, code, prefix);
+      return invocation.staticInvokeType.toString();
+    }
+
+    expect(getType('f()); // 1'), '() → bool');
+
+    expect(getType('f(), '), '() → bool');
+    expect(getType('f()); // 2'), '() → dynamic');
+
+    expect(getType('f()), // 3'), '() → bool');
+
+    expect(getType('f(), '), '() → bool');
+    expect(getType('f()); // 4'), '() → dynamic');
+  }
+
+  test_bool_logical() async {
+    var code = r'''
+T f<T>() => null;
+
+var v1 = f() || f(); // 1
+var v2 = f() && f(); // 2
+
+main() {
+  var v1 = f() || f(); // 3
+  var v2 = f() && f(); // 4
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    void assertType(String prefix) {
+      var invocation = _findMethodInvocation(unit, code, prefix);
+      expect(invocation.staticInvokeType.toString(), '() → bool');
+    }
+
+    assertType('f() || f(); // 1');
+    assertType('f(); // 1');
+    assertType('f() && f(); // 2');
+    assertType('f(); // 2');
+
+    assertType('f() || f(); // 3');
+    assertType('f(); // 3');
+    assertType('f() && f(); // 4');
+    assertType('f(); // 4');
+  }
+
+  test_bool_statement() async {
+    var code = r'''
+T f<T>() => null;
+
+main() {
+  while (f()) {} // 1
+  do {} while (f()); // 2
+  if (f()) {} // 3
+  for (; f(); ) {} // 4
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    void assertType(String prefix) {
+      var invocation = _findMethodInvocation(unit, code, prefix);
+      expect(invocation.staticInvokeType.toString(), '() → bool');
+    }
+
+    assertType('f()) {} // 1');
+    assertType('f());');
+    assertType('f()) {} // 3');
+    assertType('f(); ) {} // 4');
+  }
+
+  test_closure_downwardReturnType_arrow() async {
+    var code = r'''
+void main() {
+  List<int> Function() g;
+  g = () => 42;
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    Expression closure = _findExpression(unit, code, '() => 42');
+    expect(closure.staticType.toString(), '() → List<int>');
+  }
+
+  test_closure_downwardReturnType_block() async {
+    var code = r'''
+void main() {
+  List<int> Function() g;
+  g = () { // mark
+    return 42;
+  };
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    Expression closure = _findExpression(unit, code, '() { // mark');
+    expect(closure.staticType.toString(), '() → List<int>');
+  }
+
+  test_compoundAssignment_index() async {
+    var code = r'''
+int getInt() => 0;
+num getNum() => 0;
+double getDouble() => 0.0;
+
+abstract class Test<T, U> {
+  T operator [](String s);
+  void operator []=(String s, U v);
+}
+
+void test1(Test<int, int> t) {
+  var /*@type=int*/ v1 = t['x'] = getInt();
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=int*/ v4 = t['x'] ??= getInt();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=int*/ v7 = t['x'] += getInt();
+  var /*@type=num*/ v8 = t['x'] += getNum();
+  var /*@type=int*/ v10 = ++t['x'];
+  var /*@type=int*/ v11 = t['x']++;
+}
+
+void test2(Test<int, num> t) {
+  var /*@type=int*/ v1 = t['x'] = getInt();
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=double*/ v3 = t['x'] = getDouble();
+  var /*@type=int*/ v4 = t['x'] ??= getInt();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=num*/ v6 = t['x'] ??= getDouble();
+  var /*@type=int*/ v7 = t['x'] += getInt();
+  var /*@type=num*/ v8 = t['x'] += getNum();
+  var /*@type=double*/ v9 = t['x'] += getDouble();
+  var /*@type=int*/ v10 = ++t['x'];
+  var /*@type=int*/ v11 = t['x']++;
+}
+
+void test3(Test<int, double> t) {
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=double*/ v3 = t['x'] = getDouble();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=num*/ v6 = t['x'] ??= getDouble();
+  var /*@type=int*/ v7 = t['x'] += getInt();
+  var /*@type=num*/ v8 = t['x'] += getNum();
+  var /*@type=double*/ v9 = t['x'] += getDouble();
+  var /*@type=int*/ v10 = ++t['x'];
+  var /*@type=int*/ v11 = t['x']++;
+}
+
+void test4(Test<num, int> t) {
+  var /*@type=int*/ v1 = t['x'] = getInt();
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=num*/ v4 = t['x'] ??= getInt();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=num*/ v7 = t['x'] += getInt();
+  var /*@type=num*/ v8 = t['x'] += getNum();
+  var /*@type=num*/ v10 = ++t['x'];
+  var /*@type=num*/ v11 = t['x']++;
+}
+
+void test5(Test<num, num> t) {
+  var /*@type=int*/ v1 = t['x'] = getInt();
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=double*/ v3 = t['x'] = getDouble();
+  var /*@type=num*/ v4 = t['x'] ??= getInt();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=num*/ v6 = t['x'] ??= getDouble();
+  var /*@type=num*/ v7 = t['x'] += getInt();
+  var /*@type=num*/ v8 = t['x'] += getNum();
+  var /*@type=num*/ v9 = t['x'] += getDouble();
+  var /*@type=num*/ v10 = ++t['x'];
+  var /*@type=num*/ v11 = t['x']++;
+}
+
+void test6(Test<num, double> t) {
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=double*/ v3 = t['x'] = getDouble();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=num*/ v6 = t['x'] ??= getDouble();
+  var /*@type=num*/ v7 = t['x'] += getInt();
+  var /*@type=num*/ v8 = t['x'] += getNum();
+  var /*@type=num*/ v9 = t['x'] += getDouble();
+  var /*@type=num*/ v10 = ++t['x'];
+  var /*@type=num*/ v11 = t['x']++;
+}
+
+void test7(Test<double, int> t) {
+  var /*@type=int*/ v1 = t['x'] = getInt();
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=num*/ v4 = t['x'] ??= getInt();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=double*/ v7 = t['x'] += getInt();
+  var /*@type=double*/ v8 = t['x'] += getNum();
+  var /*@type=double*/ v10 = ++t['x'];
+  var /*@type=double*/ v11 = t['x']++;
+}
+
+void test8(Test<double, num> t) {
+  var /*@type=int*/ v1 = t['x'] = getInt();
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=double*/ v3 = t['x'] = getDouble();
+  var /*@type=num*/ v4 = t['x'] ??= getInt();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=double*/ v6 = t['x'] ??= getDouble();
+  var /*@type=double*/ v7 = t['x'] += getInt();
+  var /*@type=double*/ v8 = t['x'] += getNum();
+  var /*@type=double*/ v9 = t['x'] += getDouble();
+  var /*@type=double*/ v10 = ++t['x'];
+  var /*@type=double*/ v11 = t['x']++;
+}
+
+void test9(Test<double, double> t) {
+  var /*@type=num*/ v2 = t['x'] = getNum();
+  var /*@type=double*/ v3 = t['x'] = getDouble();
+  var /*@type=num*/ v5 = t['x'] ??= getNum();
+  var /*@type=double*/ v6 = t['x'] ??= getDouble();
+  var /*@type=double*/ v7 = t['x'] += getInt();
+  var /*@type=double*/ v8 = t['x'] += getNum();
+  var /*@type=double*/ v9 = t['x'] += getDouble();
+  var /*@type=double*/ v10 = ++t['x'];
+  var /*@type=double*/ v11 = t['x']++;
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+    _assertTypeAnnotations(code, unit);
+  }
+
+  test_compoundAssignment_prefixedIdentifier() async {
+    var code = r'''
+int getInt() => 0;
+num getNum() => 0;
+double getDouble() => 0.0;
+
+class Test<T extends U, U> {
+  T get x => null;
+  void set x(U _) {}
+}
+
+void test1(Test<int, int> t) {
+  var /*@type=int*/ v1 = t.x = getInt();
+  var /*@type=num*/ v2 = t.x = getNum();
+  var /*@type=int*/ v4 = t.x ??= getInt();
+  var /*@type=num*/ v5 = t.x ??= getNum();
+  var /*@type=int*/ v7 = t.x += getInt();
+  var /*@type=num*/ v8 = t.x += getNum();
+  var /*@type=int*/ v10 = ++t.x;
+  var /*@type=int*/ v11 = t.x++;
+}
+
+void test2(Test<int, num> t) {
+  var /*@type=int*/ v1 = t.x = getInt();
+  var /*@type=num*/ v2 = t.x = getNum();
+  var /*@type=double*/ v3 = t.x = getDouble();
+  var /*@type=int*/ v4 = t.x ??= getInt();
+  var /*@type=num*/ v5 = t.x ??= getNum();
+  var /*@type=num*/ v6 = t.x ??= getDouble();
+  var /*@type=int*/ v7 = t.x += getInt();
+  var /*@type=num*/ v8 = t.x += getNum();
+  var /*@type=double*/ v9 = t.x += getDouble();
+  var /*@type=int*/ v10 = ++t.x;
+  var /*@type=int*/ v11 = t.x++;
+}
+
+void test5(Test<num, num> t) {
+  var /*@type=int*/ v1 = t.x = getInt();
+  var /*@type=num*/ v2 = t.x = getNum();
+  var /*@type=double*/ v3 = t.x = getDouble();
+  var /*@type=num*/ v4 = t.x ??= getInt();
+  var /*@type=num*/ v5 = t.x ??= getNum();
+  var /*@type=num*/ v6 = t.x ??= getDouble();
+  var /*@type=num*/ v7 = t.x += getInt();
+  var /*@type=num*/ v8 = t.x += getNum();
+  var /*@type=num*/ v9 = t.x += getDouble();
+  var /*@type=num*/ v10 = ++t.x;
+  var /*@type=num*/ v11 = t.x++;
+}
+
+void test8(Test<double, num> t) {
+  var /*@type=int*/ v1 = t.x = getInt();
+  var /*@type=num*/ v2 = t.x = getNum();
+  var /*@type=double*/ v3 = t.x = getDouble();
+  var /*@type=num*/ v4 = t.x ??= getInt();
+  var /*@type=num*/ v5 = t.x ??= getNum();
+  var /*@type=double*/ v6 = t.x ??= getDouble();
+  var /*@type=double*/ v7 = t.x += getInt();
+  var /*@type=double*/ v8 = t.x += getNum();
+  var /*@type=double*/ v9 = t.x += getDouble();
+  var /*@type=double*/ v10 = ++t.x;
+  var /*@type=double*/ v11 = t.x++;
+}
+
+void test9(Test<double, double> t) {
+  var /*@type=num*/ v2 = t.x = getNum();
+  var /*@type=double*/ v3 = t.x = getDouble();
+  var /*@type=num*/ v5 = t.x ??= getNum();
+  var /*@type=double*/ v6 = t.x ??= getDouble();
+  var /*@type=double*/ v7 = t.x += getInt();
+  var /*@type=double*/ v8 = t.x += getNum();
+  var /*@type=double*/ v9 = t.x += getDouble();
+  var /*@type=double*/ v10 = ++t.x;
+  var /*@type=double*/ v11 = t.x++;
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+
+    var unit = analysisResult.unit;
+    _assertTypeAnnotations(code, unit);
+  }
+
+  test_compoundAssignment_propertyAccess() async {
+    var t1 = 'new Test<int, int>()';
+    var t2 = 'new Test<int, num>()';
+    var t5 = 'new Test<num, num>()';
+    var t8 = 'new Test<double, num>()';
+    var t9 = 'new Test<double, double>()';
+    var code = '''
+int getInt() => 0;
+num getNum() => 0;
+double getDouble() => 0.0;
+
+class Test<T extends U, U> {
+  T get x => null;
+  void set x(U _) {}
+}
+
+void test1() {
+  var /*@type=int*/ v1 = $t1.x = getInt();
+  var /*@type=num*/ v2 = $t1.x = getNum();
+  var /*@type=int*/ v4 = $t1.x ??= getInt();
+  var /*@type=num*/ v5 = $t1.x ??= getNum();
+  var /*@type=int*/ v7 = $t1.x += getInt();
+  var /*@type=num*/ v8 = $t1.x += getNum();
+  var /*@type=int*/ v10 = ++$t1.x;
+  var /*@type=int*/ v11 = $t1.x++;
+}
+
+void test2() {
+  var /*@type=int*/ v1 = $t2.x = getInt();
+  var /*@type=num*/ v2 = $t2.x = getNum();
+  var /*@type=double*/ v3 = $t2.x = getDouble();
+  var /*@type=int*/ v4 = $t2.x ??= getInt();
+  var /*@type=num*/ v5 = $t2.x ??= getNum();
+  var /*@type=num*/ v6 = $t2.x ??= getDouble();
+  var /*@type=int*/ v7 = $t2.x += getInt();
+  var /*@type=num*/ v8 = $t2.x += getNum();
+  var /*@type=double*/ v9 = $t2.x += getDouble();
+  var /*@type=int*/ v10 = ++$t2.x;
+  var /*@type=int*/ v11 = $t2.x++;
+}
+
+void test5() {
+  var /*@type=int*/ v1 = $t5.x = getInt();
+  var /*@type=num*/ v2 = $t5.x = getNum();
+  var /*@type=double*/ v3 = $t5.x = getDouble();
+  var /*@type=num*/ v4 = $t5.x ??= getInt();
+  var /*@type=num*/ v5 = $t5.x ??= getNum();
+  var /*@type=num*/ v6 = $t5.x ??= getDouble();
+  var /*@type=num*/ v7 = $t5.x += getInt();
+  var /*@type=num*/ v8 = $t5.x += getNum();
+  var /*@type=num*/ v9 = $t5.x += getDouble();
+  var /*@type=num*/ v10 = ++$t5.x;
+  var /*@type=num*/ v11 = $t5.x++;
+}
+
+void test8() {
+  var /*@type=int*/ v1 = $t8.x = getInt();
+  var /*@type=num*/ v2 = $t8.x = getNum();
+  var /*@type=double*/ v3 = $t8.x = getDouble();
+  var /*@type=num*/ v4 = $t8.x ??= getInt();
+  var /*@type=num*/ v5 = $t8.x ??= getNum();
+  var /*@type=double*/ v6 = $t8.x ??= getDouble();
+  var /*@type=double*/ v7 = $t8.x += getInt();
+  var /*@type=double*/ v8 = $t8.x += getNum();
+  var /*@type=double*/ v9 = $t8.x += getDouble();
+  var /*@type=double*/ v10 = ++$t8.x;
+  var /*@type=double*/ v11 = $t8.x++;
+}
+
+void test9() {
+  var /*@type=num*/ v2 = $t9.x = getNum();
+  var /*@type=double*/ v3 = $t9.x = getDouble();
+  var /*@type=num*/ v5 = $t9.x ??= getNum();
+  var /*@type=double*/ v6 = $t9.x ??= getDouble();
+  var /*@type=double*/ v7 = $t9.x += getInt();
+  var /*@type=double*/ v8 = $t9.x += getNum();
+  var /*@type=double*/ v9 = $t9.x += getDouble();
+  var /*@type=double*/ v10 = ++$t9.x;
+  var /*@type=double*/ v11 = $t9.x++;
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+
+    var unit = analysisResult.unit;
+    _assertTypeAnnotations(code, unit);
+  }
+
+  test_compoundAssignment_simpleIdentifier() async {
+    var code = r'''
+int getInt() => 0;
+num getNum() => 0;
+double getDouble() => 0.0;
+
+class Test<T extends U, U> {
+  T get x => null;
+  void set x(U _) {}
+}
+
+class Test1 extends Test<int, int> {
+  void test1() {
+    var /*@type=int*/ v1 = x = getInt();
+    var /*@type=num*/ v2 = x = getNum();
+    var /*@type=int*/ v4 = x ??= getInt();
+    var /*@type=num*/ v5 = x ??= getNum();
+    var /*@type=int*/ v7 = x += getInt();
+    var /*@type=num*/ v8 = x += getNum();
+    var /*@type=int*/ v10 = ++x;
+    var /*@type=int*/ v11 = x++;
+  }
+}
+
+class Test2 extends Test<int, num> {
+  void test2() {
+    var /*@type=int*/ v1 = x = getInt();
+    var /*@type=num*/ v2 = x = getNum();
+    var /*@type=double*/ v3 = x = getDouble();
+    var /*@type=int*/ v4 = x ??= getInt();
+    var /*@type=num*/ v5 = x ??= getNum();
+    var /*@type=num*/ v6 = x ??= getDouble();
+    var /*@type=int*/ v7 = x += getInt();
+    var /*@type=num*/ v8 = x += getNum();
+    var /*@type=double*/ v9 = x += getDouble();
+    var /*@type=int*/ v10 = ++x;
+    var /*@type=int*/ v11 = x++;
+  }
+}
+
+class Test5 extends Test<num, num> {
+  void test5() {
+    var /*@type=int*/ v1 = x = getInt();
+    var /*@type=num*/ v2 = x = getNum();
+    var /*@type=double*/ v3 = x = getDouble();
+    var /*@type=num*/ v4 = x ??= getInt();
+    var /*@type=num*/ v5 = x ??= getNum();
+    var /*@type=num*/ v6 = x ??= getDouble();
+    var /*@type=num*/ v7 = x += getInt();
+    var /*@type=num*/ v8 = x += getNum();
+    var /*@type=num*/ v9 = x += getDouble();
+    var /*@type=num*/ v10 = ++x;
+    var /*@type=num*/ v11 = x++;
+  }
+}
+
+class Test8 extends Test<double, num> {
+  void test8() {
+    var /*@type=int*/ v1 = x = getInt();
+    var /*@type=num*/ v2 = x = getNum();
+    var /*@type=double*/ v3 = x = getDouble();
+    var /*@type=num*/ v4 = x ??= getInt();
+    var /*@type=num*/ v5 = x ??= getNum();
+    var /*@type=double*/ v6 = x ??= getDouble();
+    var /*@type=double*/ v7 = x += getInt();
+    var /*@type=double*/ v8 = x += getNum();
+    var /*@type=double*/ v9 = x += getDouble();
+    var /*@type=double*/ v10 = ++x;
+    var /*@type=double*/ v11 = x++;
+  }
+}
+
+class Test9 extends Test<double, double> {
+  void test9() {
+    var /*@type=num*/ v2 = x = getNum();
+    var /*@type=double*/ v3 = x = getDouble();
+    var /*@type=num*/ v5 = x ??= getNum();
+    var /*@type=double*/ v6 = x ??= getDouble();
+    var /*@type=double*/ v7 = x += getInt();
+    var /*@type=double*/ v8 = x += getNum();
+    var /*@type=double*/ v9 = x += getDouble();
+    var /*@type=double*/ v10 = ++x;
+    var /*@type=double*/ v11 = x++;
+  }
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+
+    var unit = analysisResult.unit;
+    _assertTypeAnnotations(code, unit);
+  }
+
+  test_compoundAssignment_simpleIdentifier_topLevel() async {
+    var code = r'''
+class A {}
+
+class B extends A {
+  B operator +(int i) => this;
+}
+
+B get topLevel => new B();
+
+void set topLevel(A value) {}
+
+main() {
+  var /*@type=B*/ v = topLevel += 1;
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+
+    var unit = analysisResult.unit;
+    _assertTypeAnnotations(code, unit);
+  }
+
+  test_forIn() async {
+    var code = r'''
+T f<T>() => null;
+
+void test(Iterable<num> iter) {
+  for (var w in f()) {} // 1
+  for (var x in iter) {} // 2
+  for (num y in f()) {} // 3
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    {
+      var node = EngineTestCase.findSimpleIdentifier(unit, code, 'w in');
+      VariableElement element = node.staticElement;
+      expect(node.staticType, typeProvider.dynamicType);
+      expect(element.type, typeProvider.dynamicType);
+
+      var invocation = _findMethodInvocation(unit, code, 'f()) {} // 1');
+      expect(invocation.staticType.toString(), 'Iterable<dynamic>');
+    }
+
+    {
+      var node = EngineTestCase.findSimpleIdentifier(unit, code, 'x in');
+      VariableElement element = node.staticElement;
+      expect(node.staticType, typeProvider.numType);
+      expect(element.type, typeProvider.numType);
+    }
+
+    {
+      var node = EngineTestCase.findSimpleIdentifier(unit, code, 'y in');
+      VariableElement element = node.staticElement;
+
+      expect(node.staticType, typeProvider.numType);
+      expect(element.type, typeProvider.numType);
+
+      var invocation = _findMethodInvocation(unit, code, 'f()) {} // 3');
+      expect(invocation.staticType.toString(), 'Iterable<num>');
+    }
+  }
+
+  test_forIn_identifier() async {
+    var code = r'''
+T f<T>() => null;
+
+class A {}
+
+A aTopLevel;
+void set aTopLevelSetter(A value) {}
+
+class C {
+  A aField;
+  void set aSetter(A value) {}
+  void test() {
+    A aLocal;
+    for (aLocal in f()) {} // local
+    for (aField in f()) {} // field
+    for (aSetter in f()) {} // setter
+    for (aTopLevel in f()) {} // top variable
+    for (aTopLevelSetter in f()) {} // top setter
+  }
+}''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    void assertType(String prefix) {
+      var invocation = _findMethodInvocation(unit, code, prefix);
+      expect(invocation.staticType.toString(), 'Iterable<A>');
+    }
+
+    assertType('f()) {} // local');
+    assertType('f()) {} // field');
+    assertType('f()) {} // setter');
+    assertType('f()) {} // top variable');
+    assertType('f()) {} // top setter');
+  }
+
+  test_implicitVoidReturnType_default() async {
+    var code = r'''
+class C {
+  set x(_) {}
+  operator []=(int index, double value) => null;
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    ClassElement c = unit.element.getType('C');
+
+    PropertyAccessorElement x = c.accessors[0];
+    expect(x.returnType, VoidTypeImpl.instance);
+
+    MethodElement operator = c.methods[0];
+    expect(operator.displayName, '[]=');
+    expect(operator.returnType, VoidTypeImpl.instance);
+  }
+
+  test_implicitVoidReturnType_derived() async {
+    var code = r'''
+class Base {
+  dynamic set x(_) {}
+  dynamic operator[]=(int x, int y) => null;
+}
+class Derived extends Base {
+  set x(_) {}
+  operator[]=(int x, int y) {}
+}''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    ClassElement c = unit.element.getType('Derived');
+
+    PropertyAccessorElement x = c.accessors[0];
+    expect(x.returnType, VoidTypeImpl.instance);
+
+    MethodElement operator = c.methods[0];
+    expect(operator.displayName, '[]=');
+    expect(operator.returnType, VoidTypeImpl.instance);
+  }
+
+  test_inferObject_whenDownwardNull() async {
+    var code = r'''
+int f(void Function(Null) f2) {}
+void main() {
+  f((x) {});
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+    var xNode = EngineTestCase.findSimpleIdentifier(unit, code, 'x) {}');
+    VariableElement xElement = xNode.staticElement;
+    expect(xNode.staticType, typeProvider.objectType);
+    expect(xElement.type, typeProvider.objectType);
+  }
+
+  test_listMap_empty() async {
+    var code = r'''
+var x = [];
+var y = {};
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    SimpleIdentifier x = _findExpression(unit, code, 'x = ');
+    expect(x.staticType.toString(), 'List<dynamic>');
+
+    SimpleIdentifier y = _findExpression(unit, code, 'y = ');
+    expect(y.staticType.toString(), 'Map<dynamic, dynamic>');
+  }
+
+  test_listMap_null() async {
+    var code = r'''
+var x = [null];
+var y = {null: null};
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    SimpleIdentifier x = _findExpression(unit, code, 'x = ');
+    expect(x.staticType.toString(), 'List<Null>');
+
+    SimpleIdentifier y = _findExpression(unit, code, 'y = ');
+    expect(y.staticType.toString(), 'Map<Null, Null>');
+  }
+
+  test_switchExpression_asContext_forCases() async {
+    var code = r'''
+class C<T> {
+  const C();
+}
+
+void test(C<int> x) {
+  switch (x) {
+    case const C():
+      break;
+    default:
+      break;
+  }
+}''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    var node = _findInstanceCreation(unit, code, 'const C():');
+    expect(node.staticType.toString(), 'C<int>');
+  }
+
+  test_voidType_method() async {
+    var code = r'''
+class C {
+  void m() {}
+}
+var x = new C().m();
+main() {
+  var y = new C().m();
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    SimpleIdentifier x = _findExpression(unit, code, 'x = ');
+    expect(x.staticType, VoidTypeImpl.instance);
+
+    SimpleIdentifier y = _findExpression(unit, code, 'y = ');
+    expect(y.staticType, VoidTypeImpl.instance);
+  }
+
+  test_voidType_topLevelFunction() async {
+    var code = r'''
+void f() {}
+var x = f();
+main() {
+  var y = f();
+}
+''';
+    var source = addSource(code);
+    var analysisResult = await computeAnalysisResult(source);
+    var unit = analysisResult.unit;
+
+    SimpleIdentifier x = _findExpression(unit, code, 'x = ');
+    expect(x.staticType, VoidTypeImpl.instance);
+
+    SimpleIdentifier y = _findExpression(unit, code, 'y = ');
+    expect(y.staticType, VoidTypeImpl.instance);
+  }
+
+  void _assertTypeAnnotations(String code, CompilationUnit unit) {
+    var types = <int, String>{};
+    {
+      int lastIndex = 0;
+      while (true) {
+        const prefix = '/*@type=';
+        int openIndex = code.indexOf(prefix, lastIndex);
+        if (openIndex == -1) {
+          break;
+        }
+        int closeIndex = code.indexOf('*/', openIndex + 1);
+        expect(closeIndex, isPositive);
+        types[openIndex] =
+            code.substring(openIndex + prefix.length, closeIndex);
+        lastIndex = closeIndex;
+      }
+    }
+    unit.accept(new _TypeAnnotationsValidator(types));
+  }
+
+  Expression _findExpression(AstNode root, String code, String prefix) {
+    return EngineTestCase.findNode(root, code, prefix, (n) {
+      return n is Expression;
+    });
+  }
+
+  InstanceCreationExpression _findInstanceCreation(
+      AstNode root, String code, String prefix) {
+    return EngineTestCase.findNode(root, code, prefix, (n) {
+      return n is InstanceCreationExpression;
+    });
+  }
+
+  MethodInvocation _findMethodInvocation(
+      AstNode root, String code, String prefix) {
+    return EngineTestCase.findNode(root, code, prefix, (n) {
+      return n is MethodInvocation;
+    });
+  }
+}
+
+class _TypeAnnotationsValidator extends RecursiveAstVisitor {
+  final Map<int, String> types;
+
+  _TypeAnnotationsValidator(this.types);
+
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    Token comment = node.token.precedingComments;
+    if (comment != null) {
+      String expectedType = types[comment.offset];
+      if (expectedType != null) {
+        String actualType = node.staticType.toString();
+        expect(actualType, expectedType, reason: '@${comment.offset}');
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index ae402c1..c5187b2 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -57,8 +57,8 @@
     var mainUnit = await checkFileElement('''
 import 'dart:async';
 Future<int> futureInt = null;
-var f = () => futureInt;
-var g = () async => futureInt;
+var f = /*info:INFERRED_TYPE_CLOSURE*/() => futureInt;
+var g = /*info:INFERRED_TYPE_CLOSURE*/() async => futureInt;
 ''');
     var futureInt = mainUnit.topLevelVariables[0];
     expect(futureInt.name, 'futureInt');
@@ -72,7 +72,9 @@
   }
 
   test_asyncClosureReturnType_future() async {
-    var mainUnit = await checkFileElement('var f = () async => 0;');
+    var mainUnit = await checkFileElement('''
+var f = /*info:INFERRED_TYPE_CLOSURE*/() async => 0;
+''');
     var f = mainUnit.topLevelVariables[0];
     expect(f.name, 'f');
     expect(f.type.toString(), '() → Future<int>');
@@ -82,8 +84,8 @@
     var mainUnit = await checkFileElement('''
 import 'dart:async';
 FutureOr<int> futureOrInt = null;
-var f = () => futureOrInt;
-var g = () async => futureOrInt;
+var f = /*info:INFERRED_TYPE_CLOSURE*/() => futureOrInt;
+var g = /*info:INFERRED_TYPE_CLOSURE*/() async => futureOrInt;
 ''');
     var futureOrInt = mainUnit.topLevelVariables[0];
     expect(futureOrInt.name, 'futureOrInt');
@@ -265,7 +267,7 @@
   var f = /*info:INFERRED_TYPE_CLOSURE*/(Object x) { return null; };
   String y = f(42);
 
-  f = /*error:INVALID_CAST_FUNCTION_EXPR, info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
+  f = /*info:INFERRED_TYPE_CLOSURE*/(x) => /*error:INVALID_CAST_LITERAL*/'hello';
 
   foo(/*info:INFERRED_TYPE_CLOSURE,
         info:INFERRED_TYPE_CLOSURE*/(x) { return null; });
@@ -377,18 +379,18 @@
     // When a closure's return type is inferred from the expression `null`, the
     // inferred type is `dynamic`.
     var mainUnit = await checkFileElement('''
-var v = () => null;
+var v = /*info:INFERRED_TYPE_CLOSURE*/() => null;
 ''');
     var v = mainUnit.topLevelVariables[0];
-    expect(v.type.toString(), '() → dynamic');
-    expect(v.initializer.type.toString(), '() → () → dynamic');
+    expect(v.type.toString(), '() → Null');
+    expect(v.initializer.type.toString(), '() → () → Null');
   }
 
   @failingTest
   test_circularReference_viaClosures() async {
     var mainUnit = await checkFileElement('''
-var x = () => /*error:TOP_LEVEL_CYCLE*/y;
-var y = () => /*error:TOP_LEVEL_CYCLE*/x;
+var x = /*info:INFERRED_TYPE_CLOSURE*/() => /*error:TOP_LEVEL_CYCLE*/y;
+var y = /*info:INFERRED_TYPE_CLOSURE*/() => /*error:TOP_LEVEL_CYCLE*/x;
 ''');
     var x = mainUnit.topLevelVariables[0];
     var y = mainUnit.topLevelVariables[1];
@@ -401,8 +403,8 @@
   @failingTest
   test_circularReference_viaClosures_initializerTypes() async {
     var mainUnit = await checkFileElement('''
-var x = () => /*error:TOP_LEVEL_CYCLE*/y;
-var y = () => /*error:TOP_LEVEL_CYCLE*/x;
+var x = /*info:INFERRED_TYPE_CLOSURE*/() => /*error:TOP_LEVEL_CYCLE*/y;
+var y = /*info:INFERRED_TYPE_CLOSURE*/() => /*error:TOP_LEVEL_CYCLE*/x;
 ''');
     var x = mainUnit.topLevelVariables[0];
     var y = mainUnit.topLevelVariables[1];
@@ -917,7 +919,7 @@
 }
 void f([List<int> l = /*info:INFERRED_TYPE_LITERAL*/const [1]]) {}
 // We do this inference in an early task but don't preserve the infos.
-Function2<List<int>, String> g = /*pass should be info:INFERRED_TYPE_CLOSURE*/([llll = /*info:INFERRED_TYPE_LITERAL*/const [1]]) => "hello";
+Function2<List<int>, String> g = /*pass should be info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/([llll = /*info:INFERRED_TYPE_LITERAL*/const [1]]) => "hello";
 ''');
   }
 
@@ -1013,29 +1015,29 @@
 void main () {
   {
     Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => null;
-    Function2<int, String> l1 = (int x) => "hello";
-    Function2<int, String> l2 = /*error:INVALID_ASSIGNMENT*/(String x) => "hello";
-    Function2<int, String> l3 = /*error:INVALID_ASSIGNMENT*/(int x) => 3;
+    Function2<int, String> l1 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => "hello";
+    Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/(String x) => "hello";
+    Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;
     Function2<int, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(int x) {return /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;};
   }
   {
-    Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE*/(x) => null;
+    Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => null;
     Function2<int, String> l1 = /*info:INFERRED_TYPE_CLOSURE*/(x) => "hello";
-    Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/(x) => 3;
+    Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE*/(x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;
     Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE*/(x) {return /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;};
     Function2<int, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(x) {return /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/x;};
   }
   {
     Function2<int, List<String>> l0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => null;
-    Function2<int, List<String>> l1 = (int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
-    Function2<int, List<String>> l2 = /*error:INVALID_ASSIGNMENT*/(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
-    Function2<int, List<String>> l3 = (int x) => /*info:INFERRED_TYPE_LITERAL*/[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
+    Function2<int, List<String>> l1 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+    Function2<int, List<String>> l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+    Function2<int, List<String>> l3 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => /*info:INFERRED_TYPE_LITERAL*/[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
     Function2<int, List<String>> l4 = /*info:INFERRED_TYPE_CLOSURE*/(int x) {return /*info:INFERRED_TYPE_LITERAL*/[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];};
   }
   {
     Function2<int, int> l0 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x;
     Function2<int, int> l1 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x+1;
-    Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/(x) => x;
+    Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE*/(x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/x;
     Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE*/(x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/x./*error:UNDEFINED_METHOD*/substring(3);
     Function2<String, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x.substring(3);
   }
@@ -1049,12 +1051,12 @@
   {
     T f<T>(T x) => null;
     var v1 = f;
-    v1 = /*info:INFERRED_TYPE_CLOSURE*/<S>(x) => x;
+    v1 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<S>(x) => x;
   }
   {
     List<T> f<T>(T x) => null;
     var v2 = f;
-    v2 = /*info:INFERRED_TYPE_CLOSURE*/<S>(x) => /*info:INFERRED_TYPE_LITERAL*/[x];
+    v2 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<S>(x) => /*info:INFERRED_TYPE_LITERAL*/[x];
     Iterable<int> r = v2(42);
     Iterable<String> s = v2('hello');
     Iterable<List<int>> t = v2(<int>[]);
@@ -1148,17 +1150,17 @@
     String f<S>(int x) => null;
     var v = f;
     v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) => null;
-    v = <T>(int x) => "hello";
-    v = /*error:INVALID_ASSIGNMENT*/<T>(String x) => "hello";
-    v = /*error:INVALID_ASSIGNMENT*/<T>(int x) => 3;
+    v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) => "hello";
+    v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/<T>(String x) => "hello";
+    v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;
     v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) {return /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;};
   }
   {
     String f<S>(int x) => null;
     var v = f;
     v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => null;
-    v = /*info:INFERRED_TYPE_CLOSURE*/<T>(x) => "hello";
-    v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/<T>(x) => 3;
+    v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => "hello";
+    v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;
     v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) {return /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/3;};
     v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) {return /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/x;};
   }
@@ -1166,9 +1168,9 @@
     List<String> f<S>(int x) => null;
     var v = f;
     v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) => null;
-    v = <T>(int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
-    v = /*error:INVALID_ASSIGNMENT*/<T>(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
-    v = <T>(int x) => /*info:INFERRED_TYPE_LITERAL*/[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
+    v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+    v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/<T>(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+    v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) => /*info:INFERRED_TYPE_LITERAL*/[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
     v = /*info:INFERRED_TYPE_CLOSURE*/<T>(int x) {return /*info:INFERRED_TYPE_LITERAL*/[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];};
   }
   {
@@ -1176,13 +1178,13 @@
     String int2String<T>(int x) => null;
     String string2String<T>(String x) => null;
     var x = int2int;
-    x = /*info:INFERRED_TYPE_CLOSURE*/<T>(x) => x;
-    x = /*info:INFERRED_TYPE_CLOSURE*/<T>(x) => x+1;
+    x = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => x;
+    x = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => x+1;
     var y = int2String;
-    y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/<T>(x) => x;
+    y = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/x;
     y = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/x./*error:UNDEFINED_METHOD*/substring(3);
     var z = string2String;
-    z = /*info:INFERRED_TYPE_CLOSURE*/<T>(x) => x.substring(3);
+    z = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/<T>(x) => x.substring(3);
   }
 }
 ''');
@@ -1555,17 +1557,17 @@
 
 void main() {
   $declared f;
-  $downwards<int> t1 = f.then((_) async => await new $upwards<int>.value(3));
+  $downwards<int> t1 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async => await new $upwards<int>.value(1));
   $downwards<int> t2 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
-     return await new $upwards<int>.value(3);});
-  $downwards<int> t3 = f.then((_) async => 3);
+     return await new $upwards<int>.value(2);});
+  $downwards<int> t3 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async => 3);
   $downwards<int> t4 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
-    return 3;});
-  $downwards<int> t5 = f.then((_) => new $upwards<int>.value(3));
-  $downwards<int> t6 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) {return new $upwards<int>.value(3);});
-  $downwards<int> t7 = f.then((_) async => new $upwards<int>.value(3));
+    return 4;});
+  $downwards<int> t5 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) => new $upwards<int>.value(5));
+  $downwards<int> t6 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) {return new $upwards<int>.value(6);});
+  $downwards<int> t7 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async => new $upwards<int>.value(7));
   $downwards<int> t8 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
-    return new $upwards<int>.value(3);});
+    return new $upwards<int>.value(8);});
 }
 ''';
 
@@ -1595,12 +1597,12 @@
 
 void main() {
   $declared<bool> f;
-  $downwards<int> t1 = f.then(/*info:INFERRED_TYPE_CLOSURE*/
+  $downwards<int> t1 = f.then(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/
       (x) async => x ? 2 : await new $upwards<int>.value(3));
   $downwards<int> t2 = f.then(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) async { // TODO(leafp): Why the duplicate here?
     return /*info:DOWN_CAST_COMPOSITE*/await x ? 2 : new $upwards<int>.value(3);});
-  $downwards<int> t5 = f.then(/*info:INFERRED_TYPE_CLOSURE,error:INVALID_CAST_FUNCTION_EXPR*/
-      (x) => x ? 2 : new $upwards<int>.value(3));
+  $downwards<int> t5 = f.then(/*info:INFERRED_TYPE_CLOSURE*/
+      (x) => /*info:DOWN_CAST_COMPOSITE*/x ? 2 : new $upwards<int>.value(3));
   $downwards<int> t6 = f.then(/*info:INFERRED_TYPE_CLOSURE*/
       (x) {return /*info:DOWN_CAST_COMPOSITE*/x ? 2 : new $upwards<int>.value(3);});
 }
@@ -1626,9 +1628,9 @@
 main() {
   Future<int> f;
   Future<List<int>> b = /*info:ASSIGNMENT_CAST should be pass*/f
-      .then(/*info:INFERRED_TYPE_CLOSURE*/(x) => [])
+      .then(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => [])
       .whenComplete(/*info:INFERRED_TYPE_CLOSURE*/() {});
-  b = f.then(/*info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
+  b = f.then(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
 }
   ''');
   }
@@ -1638,14 +1640,13 @@
 import "dart:async";
 m1() {
   Future<int> f;
-  var x = f.then<Future<List<int>>>(/*info:INFERRED_TYPE_CLOSURE,
-                                      error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/
-                                    (x) => []);
+  var x = f.then<Future<List<int>>>(/*info:INFERRED_TYPE_CLOSURE*/
+                                    (x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/[]);
   Future<List<int>> y = x;
 }
 m2() {
   Future<int> f;
-  var x = f.then<List<int>>(/*info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
+  var x = f.then<List<int>>(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
   Future<List<int>> y = x;
 }
   ''');
@@ -1663,13 +1664,13 @@
 }
 
 void main() {
-  var f = foo().then((_) => 2.3);
+  var f = foo().then(/*info:INFERRED_TYPE_CLOSURE*/(_) => 2.3);
   $downwards<int> f2 = /*error:INVALID_ASSIGNMENT*/f;
 
   // The unnecessary cast is to illustrate that we inferred <double> for
   // the generic type args, even though we had a return type context.
   $downwards<num> f3 = /*info:UNNECESSARY_CAST*/foo().then(
-      (_) => 2.3) as $upwards<double>;
+      /*info:INFERRED_TYPE_CLOSURE*/(_) => 2.3) as $upwards<double>;
 }
 $declared foo() => new $declared<int>.value(1);
     ''';
@@ -1688,7 +1689,7 @@
 main() {
   Future<int> base;
   var f = base.then(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { return x == 0; });
-  var g = base.then(/*info:INFERRED_TYPE_CLOSURE*/(x) => x == 0);
+  var g = base.then(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) => x == 0);
   Future<bool> b = f;
   b = g;
 }
@@ -1743,11 +1744,11 @@
 
 $declared f;
 // Instantiates Future<int>
-$downwards<int> t1 = f.then((_) =>
+$downwards<int> t1 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) =>
    /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value($expectedError'hi'));
 
 // Instantiates List<int>
-$downwards<List<int>> t2 = f.then((_) => /*info:INFERRED_TYPE_LITERAL*/[3]);
+$downwards<List<int>> t2 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) => /*info:INFERRED_TYPE_LITERAL*/[3]);
 $downwards<List<int>> g2() async { return /*info:INFERRED_TYPE_LITERAL*/[3]; }
 $downwards<List<int>> g3() async {
   return /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value(
@@ -1940,13 +1941,13 @@
 void main() {
   List<int> o;
   int y = o.fold(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y);
-  var z = o.fold(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
+  var z = o.fold(0, /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
   y = /*info:DYNAMIC_CAST*/z;
 }
 void functionExpressionInvocation() {
   List<int> o;
   int y = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y);
-  var z = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
+  var z = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
   y = /*info:DYNAMIC_CAST*/z;
 }
 ''');
@@ -1974,7 +1975,7 @@
     await checkFileElement(r'''
 main() {
   List<String> y;
-  Iterable<String> x = y.map(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(String z) => 1.0);
+  Iterable<String> x = y.map(/*info:INFERRED_TYPE_CLOSURE*/(String z) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/1.0);
 }
   ''');
   }
@@ -2149,18 +2150,18 @@
     await checkFileElement('''
 import 'dart:async';
 
-Future<int> make(int x) => (/*info:INFERRED_TYPE_ALLOCATION*/new Future(() => x));
+Future<int> make(int x) => (/*info:INFERRED_TYPE_ALLOCATION*/new Future(/*info:INFERRED_TYPE_CLOSURE*/() => x));
 
 main() {
   Iterable<Future<int>> list = <int>[1, 2, 3].map(make);
   Future<List<int>> results = Future.wait(list);
-  Future<String> results2 = results.then((List<int> list)
+  Future<String> results2 = results.then(/*info:INFERRED_TYPE_CLOSURE*/(List<int> list)
     => list.fold('', /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/x /*error:UNDEFINED_OPERATOR*/+ y.toString()));
 
-  Future<String> results3 = results.then((List<int> list)
-    => list.fold('', /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(String x, y) => x + y.toString()));
+  Future<String> results3 = results.then(/*info:INFERRED_TYPE_CLOSURE*/(List<int> list)
+    => list.fold('', /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE, error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(String x, y) => x + y.toString()));
 
-  Future<String> results4 = results.then((List<int> list)
+  Future<String> results4 = results.then(/*info:INFERRED_TYPE_CLOSURE*/(List<int> list)
     => list.fold<String>('', /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y.toString()));
 }
 ''');
@@ -2178,7 +2179,7 @@
 main() {
   List<Trace> traces = /*info:INFERRED_TYPE_LITERAL*/[];
   var longest = traces.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(trace) {
-    return trace.frames.map(/*info:INFERRED_TYPE_CLOSURE*/(frame) => frame.location.length)
+    return trace.frames.map(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(frame) => frame.location.length)
         .fold(0, math.max);
   }).fold(0, math.max);
 }
@@ -2193,7 +2194,7 @@
 T generic<T>(a(T _), b(T _)) => null;
 
 main() {
-  var v = generic((F f) => null, (G g) => null);
+  var v = generic(/*info:INFERRED_TYPE_CLOSURE*/(F f) => null, /*info:INFERRED_TYPE_CLOSURE*/(G g) => null);
 }
 ''');
     var v = findLocalVariable(unit, 'v');
@@ -2207,7 +2208,7 @@
 
 T generic<T>(a(T _), b(T _)) => null;
 
-var v = generic((F f) => null, (G g) => null);
+var v = generic(/*info:INFERRED_TYPE_CLOSURE*/(F f) => null, /*info:INFERRED_TYPE_CLOSURE*/(G g) => null);
 ''');
     var v = mainUnit.topLevelVariables[0];
     expect(v.type.toString(), '(num) → List<int>');
@@ -2761,8 +2762,8 @@
     // Regression test for https://github.com/dart-lang/sdk/issues/26414
     var unit = await checkFile(r'''
 main() {
-  f0() => 42;
-  f1() async => 42;
+  f0 /*info:INFERRED_TYPE_CLOSURE*/() => 42;
+  f1 /*info:INFERRED_TYPE_CLOSURE*/() async => 42;
 
   f2 /*info:INFERRED_TYPE_CLOSURE*/() { return 42; }
   f3 /*info:INFERRED_TYPE_CLOSURE*/() async { return 42; }
@@ -2771,9 +2772,9 @@
 
   num f6() => 42;
 
-  f7() => f7();
-  f8() => /*error:REFERENCED_BEFORE_DECLARATION*/f9();
-  f9() => f5();
+  f7 /*info:INFERRED_TYPE_CLOSURE*/() => f7();
+  f8 /*info:INFERRED_TYPE_CLOSURE*/() => /*error:REFERENCED_BEFORE_DECLARATION*/f9();
+  f9 /*info:INFERRED_TYPE_CLOSURE*/() => f5();
 }
 ''');
     expect(findLocalFunction(unit, 'f0').type.toString(), '() → int');
@@ -3068,7 +3069,8 @@
   test_inferredType_viaClosure_multipleLevelsOfNesting() async {
     var mainUnit = await checkFileElement('''
 class C {
-  static final f = (bool b) => (int i) => /*info:INFERRED_TYPE_LITERAL*/{i: b};
+  static final f = /*info:INFERRED_TYPE_CLOSURE*/(bool b) =>
+      /*info:INFERRED_TYPE_CLOSURE*/(int i) => /*info:INFERRED_TYPE_LITERAL*/{i: b};
 }
 ''');
     var f = mainUnit.getType('C').fields[0];
@@ -3078,7 +3080,7 @@
   test_inferredType_viaClosure_typeDependsOnArgs() async {
     var mainUnit = await checkFileElement('''
 class C {
-  static final f = (bool b) => b;
+  static final f = /*info:INFERRED_TYPE_CLOSURE*/(bool b) => b;
 }
 ''');
     var f = mainUnit.getType('C').fields[0];
@@ -3088,7 +3090,7 @@
   test_inferredType_viaClosure_typeIndependentOfArgs_field() async {
     var mainUnit = await checkFileElement('''
 class C {
-  static final f = (bool b) => 1;
+  static final f = /*info:INFERRED_TYPE_CLOSURE*/(bool b) => 1;
 }
 ''');
     var f = mainUnit.getType('C').fields[0];
@@ -3096,7 +3098,9 @@
   }
 
   test_inferredType_viaClosure_typeIndependentOfArgs_topLevel() async {
-    var mainUnit = await checkFileElement('final f = (bool b) => 1;');
+    var mainUnit = await checkFileElement('''
+final f = /*info:INFERRED_TYPE_CLOSURE*/(bool b) => 1;
+''');
     var f = mainUnit.topLevelVariables[0];
     expect(f.type.toString(), '(bool) → int');
   }
@@ -3596,7 +3600,7 @@
 
 void foo() {
   List myList = getListOfString();
-  myList.map((type) => 42);
+  myList.map(/*info:INFERRED_TYPE_CLOSURE*/(type) => 42);
 }
 
 void bar() {
@@ -3606,7 +3610,7 @@
   } catch (_) {
     return;
   }
-  /*info:DYNAMIC_INVOKE*/list.map((value) => '$value');
+  /*info:DYNAMIC_INVOKE*/list.map(/*info:INFERRED_TYPE_CLOSURE*/(value) => '$value');
 }
   ''');
   }
@@ -3823,10 +3827,10 @@
 void foo(int f(Object _)) {}
 
 main() {
-  var f = (Object x) => null;
-  String y = /*info:DYNAMIC_CAST*/f(42);
+  var f = /*info:INFERRED_TYPE_CLOSURE*/(Object x) => null;
+  String y = f(42);
 
-  f = /*info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
+  f = /*info:INFERRED_TYPE_CLOSURE*/(x) => /*error:INVALID_CAST_LITERAL*/'hello';
 
   var g = null;
   g = 'hello';
@@ -3835,8 +3839,8 @@
   h = 'hello';
   (/*info:DYNAMIC_INVOKE*/h.foo());
 
-  foo(/*info:INFERRED_TYPE_CLOSURE*/(x) => null);
-  foo(/*info:INFERRED_TYPE_CLOSURE*/(x) => throw "not implemented");
+  foo(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => null);
+  foo(/*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => throw "not implemented");
 }
 ''');
   }
@@ -3994,7 +3998,7 @@
     // Regression test for https://github.com/dart-lang/sdk/issues/26962
     var unit = await checkFile('''
 main() {
-  var v = ((x) => 1.0)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
+  var v = (/*info:INFERRED_TYPE_CLOSURE*/(x) => 1.0)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
 }
 ''');
     var v = findLocalVariable(unit, 'v');
@@ -4345,6 +4349,12 @@
   @override
   bool get hasExtraTaskModelPass => false;
 
+  @failingTest
+  @override
+  test_bottom_inClosure() async {
+    await super.test_bottom_inClosure();
+  }
+
   @override
   test_circularReference_viaClosures() async {
     await super.test_circularReference_viaClosures();
@@ -4363,16 +4373,6 @@
 
   @failingTest
   @override
-  test_listLiteralsCanInferNull_topLevel() =>
-      super.test_listLiteralsCanInferNull_topLevel();
-
-  @failingTest
-  @override
-  test_mapLiteralsCanInferNull_topLevel() =>
-      super.test_mapLiteralsCanInferNull_topLevel();
-
-  @failingTest
-  @override
   test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2() async {
     await super
         .test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2();
diff --git a/pkg/analyzer/test/src/task/strong/test_all.dart b/pkg/analyzer/test/src/task/strong/test_all.dart
index 28393b8..982d879 100644
--- a/pkg/analyzer/test/src/task/strong/test_all.dart
+++ b/pkg/analyzer/test/src/task/strong/test_all.dart
@@ -5,12 +5,14 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'checker_test.dart' as checker_test;
+import 'dart2_inference_test.dart' as dart2_inference_test;
 import 'inferred_type_test.dart' as inferred_type_test;
 import 'non_null_checker_test.dart' as non_null_checker_test;
 
 main() {
   defineReflectiveSuite(() {
     checker_test.main();
+    dart2_inference_test.main();
     inferred_type_test.main();
     non_null_checker_test.main();
   }, name: 'strong');
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index 72c71cd..c65881c 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -74,7 +74,6 @@
     }
     Source source = resolutionMap.elementDeclaredByCompilationUnit(unit).source;
     fail('No class named $className in $source');
-    return null;
   }
 
   /**
@@ -94,7 +93,6 @@
       }
     }
     fail('No constructor named $constructorName in $className');
-    return null;
   }
 
   /**
@@ -116,7 +114,6 @@
       }
     }
     fail('No field named $fieldName in $className');
-    return null;
   }
 
   /**
@@ -144,7 +141,6 @@
       }
     }
     fail('No method named $methodName in $className');
-    return null;
   }
 
   /**
@@ -185,7 +181,6 @@
       }
     }
     fail('No toplevel function named $functionName found');
-    return null;
   }
 
   /**
@@ -207,7 +202,6 @@
       }
     }
     fail('No toplevel variable named $variableName found');
-    return null;
   }
 
   /**
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 5a966ec..9155d58 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -161,16 +161,6 @@
   }
 
   @override
-  void addWarning(Message message, int charOffset, int length) {
-    // Ignore warnings.
-  }
-
-  @override
-  void addNit(Message message, int charOffset) {
-    // Ignore warnings.
-  }
-
-  @override
   void beginMetadata(Token token) {
     inMetadata = true;
   }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 103d93f..9f298d5 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -643,7 +643,7 @@
       PerformanceLog log = new PerformanceLog(null);
       AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
 
-      bool enableKernelDriver = options.previewDart2;
+      bool enableKernelDriver = options.useCFE;
       file_system.Folder kernelPlatformBinariesFolder;
       if (enableKernelDriver && options.dartSdkPlatformBinariesPath != null) {
         kernelPlatformBinariesFolder =
@@ -873,7 +873,7 @@
     contextOptions.hint = !options.disableHints;
     contextOptions.generateImplicitErrors = options.showPackageWarnings;
     contextOptions.generateSdkErrors = options.showSdkWarnings;
-    if (options.previewDart2) {
+    if (options.useCFE) {
       contextOptions.useFastaParser = true;
     }
 
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 1ab9c64..cfa64ec 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -113,7 +113,10 @@
   /// (Or null if not enabled.)
   final String perfReport;
 
-  /// Whether to enable the Dart 2.0 Front End.
+  /// Whether to enable the Dart 2.0 Common Front End.
+  final bool useCFE;
+
+  /// Whether to enable the Dart 2.0 Preview.
   final bool previewDart2;
 
   /// Batch mode (for unit testing)
@@ -187,6 +190,7 @@
         log = args['log'],
         machineFormat = args['format'] == 'machine',
         perfReport = args['x-perf-report'],
+        useCFE = args['use-cfe'],
         previewDart2 = args['preview-dart-2'],
         batchMode = args['batch'],
         showPackageWarnings = args['show-package-warnings'] ||
@@ -514,8 +518,13 @@
           allowMultiple: true,
           splitCommas: false,
           hide: hide)
+      ..addFlag('use-cfe',
+          help: 'Enable the Dart 2.0 Common Front End implementation.',
+          defaultsTo: false,
+          negatable: false,
+          hide: hide)
       ..addFlag('preview-dart-2',
-          help: 'Enable the Dart 2.0 Front End implementation.',
+          help: 'Enable the Dart 2.0 preview.',
           defaultsTo: false,
           negatable: false,
           hide: hide);
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 42230ab..cd90779 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -31,10 +31,13 @@
     defineReflectiveTests(BuildModeTest);
     defineReflectiveTests(ExitCodesTest);
     defineReflectiveTests(ExitCodesTest_PreviewDart2);
+    defineReflectiveTests(ExitCodesTest_UseCFE);
     defineReflectiveTests(LinterTest);
     defineReflectiveTests(LinterTest_PreviewDart2);
+    defineReflectiveTests(LinterTest_UseCFE);
     defineReflectiveTests(OptionsTest);
     defineReflectiveTests(OptionsTest_PreviewDart2);
+    defineReflectiveTests(OptionsTest_UseCFE);
   }, name: 'Driver');
 }
 
@@ -52,6 +55,8 @@
 
   bool get usePreviewDart2 => false;
 
+  bool get useCFE => false;
+
   /// Start a driver for the given [source], optionally providing additional
   /// [args] and an [options] file path. The value of [options] defaults to an
   /// empty options file to avoid unwanted configuration from an otherwise
@@ -70,6 +75,9 @@
     if (usePreviewDart2) {
       cmd.insert(0, '--preview-dart-2');
     }
+    if (useCFE) {
+      cmd.insert(0, '--use-cfe');
+    }
     await driver.start(cmd);
   }
 
@@ -611,6 +619,19 @@
     // TODO(devoncarew): This test times out when used with @failingTest.
     return new Future.error('failing test');
   }
+}
+
+@reflectiveTest
+class ExitCodesTest_UseCFE extends ExitCodesTest {
+  @override
+  bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_fatalErrors() {
+    // TODO(devoncarew): This test times out when used with @failingTest.
+    return new Future.error('failing test');
+  }
 
   @override
   @failingTest
@@ -725,6 +746,12 @@
 }
 
 @reflectiveTest
+class LinterTest_UseCFE extends LinterTest {
+  @override
+  bool get useCFE => true;
+}
+
+@reflectiveTest
 class OptionsTest extends BaseTest {
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
@@ -788,10 +815,16 @@
     expect(outSink.toString(), contains('Avoid empty else statements'));
   }
 
-  @failingTest
   test_previewDart2() async {
     await drive('data/options_tests_project/test_file.dart',
         args: ['--preview-dart-2']);
+    expect(driver.context.analysisOptions.useFastaParser, isFalse);
+  }
+
+  @failingTest
+  test_useCFE() async {
+    await drive('data/options_tests_project/test_file.dart',
+        args: ['--use-cfe']);
     expect(driver.context.analysisOptions.useFastaParser, isTrue);
   }
 
@@ -835,6 +868,12 @@
 class OptionsTest_PreviewDart2 extends OptionsTest {
   @override
   bool get usePreviewDart2 => true;
+}
+
+@reflectiveTest
+class OptionsTest_UseCFE extends OptionsTest {
+  @override
+  bool get useCFE => true;
 
   @override
   @failingTest
@@ -856,6 +895,10 @@
   @failingTest
   test_withFlags_overrideFatalWarning() =>
       super.test_withFlags_overrideFatalWarning();
+
+  @override
+  @failingTest
+  test_previewDart2() => super.test_previewDart2();
 }
 
 class TestSource implements Source {
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index acfac62..71a1673 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -75,6 +75,7 @@
         expect(options.warningsAreFatal, isFalse);
         expect(options.strongMode, isFalse);
         expect(options.lintsAreFatal, isFalse);
+        expect(options.useCFE, isFalse);
         expect(options.previewDart2, isFalse);
       });
 
@@ -251,7 +252,13 @@
         });
       }
 
-      test('preview FE', () {
+      test('--use-cfe', () {
+        CommandLineOptions options =
+            CommandLineOptions.parse(['--use-cfe', 'foo.dart']);
+        expect(options.useCFE, isTrue);
+      });
+
+      test('--preview-dart-2', () {
         CommandLineOptions options =
             CommandLineOptions.parse(['--preview-dart-2', 'foo.dart']);
         expect(options.previewDart2, isTrue);
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index f8fa098..d585eec 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -1243,7 +1243,7 @@
     // TODO(johnniwinther): Find out why this can be null.
     if (type == null) return;
     if (outermostElement.isClassMember &&
-        rtiNeed.classNeedsRti(outermostElement.enclosingClass)) {
+        rtiNeed.classNeedsTypeArguments(outermostElement.enclosingClass)) {
       if (outermostElement.isConstructor || outermostElement.isField) {
         analyzeTypeVariables(type);
       } else if (outermostElement.isInstanceMember) {
@@ -1435,7 +1435,7 @@
       closures.add(node);
       nodeMappingCache[node] = closureData = globalizeClosure(node, closure);
       needsRti = compiler.options.enableTypeAssertions ||
-          rtiNeed.localFunctionNeedsRti(closure);
+          rtiNeed.localFunctionNeedsSignature(closure);
     } else {
       outermostElement = element;
       ThisLocal thisElement = null;
@@ -1448,7 +1448,7 @@
       memberMappingCache[element.declaration] = closureData;
       if (element is MethodElement) {
         needsRti = compiler.options.enableTypeAssertions ||
-            rtiNeed.methodNeedsRti(element);
+            rtiNeed.methodNeedsSignature(element);
       }
     }
     if (closureData.callMethod != null) {
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 7cbc7e7..95d84b7 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -17,6 +17,7 @@
   static const String disableNativeLiveTypeAnalysis =
       '--disable-native-live-type-analysis';
   static const String disableTypeInference = '--disable-type-inference';
+  static const String disableRtiOptimization = '--disable-rti-optimization';
   static const String dumpInfo = '--dump-info';
   static const String enableAssertMessage = '--assert-message';
   static const String enableCheckedMode = '--enable-checked-mode';
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 817f22f..521bdd6 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -268,10 +268,6 @@
               ErroneousElement element = elementType.element;
               reporter.reportErrorMessage(
                   node, element.messageKind, element.messageArguments);
-            } else {
-              assert(elementType is MethodTypeVariableType);
-              // Used to `reportErrorMessage` here, but with Dart 2 upcoming
-              // very soon we do not emit this message any more.
             }
           } else {
             // We need to throw an exception at runtime.
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index b016904..a17e4b3 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -390,6 +390,7 @@
     new OptionHandler('--categories=.*', setCategories),
     new OptionHandler(Flags.disableInlining, implyCompilation),
     new OptionHandler(Flags.disableTypeInference, implyCompilation),
+    new OptionHandler(Flags.disableRtiOptimization, implyCompilation),
     new OptionHandler(Flags.terse, passThrough),
     new OptionHandler('--deferred-map=.+', implyCompilation),
     new OptionHandler(Flags.dumpInfo, implyCompilation),
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index c19fefb..7d1be45 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -404,6 +404,8 @@
   TYPE_ARGUMENT_COUNT_MISMATCH,
   TYPE_VARIABLE_IN_CONSTANT,
   TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
+  TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED,
+  TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC,
   TYPEDEF_FORMAL_WITH_DEFAULT,
   UNARY_OPERATOR_BAD_ARITY,
   UNBOUND_LABEL,
@@ -1198,6 +1200,43 @@
 """
           ]),
 
+      MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED: const MessageTemplate(
+          MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED,
+          "Method type variables do not have a runtime value.",
+          howToFix: "Try using the upper bound of the type variable, "
+              "or refactor the code to avoid needing this runtime value.",
+          examples: const [
+            """
+// Method type variables are not reified, so they cannot be returned.
+Type f<T>() => T;
+
+main() => f<int>();
+""",
+            """
+// Method type variables are not reified, so they cannot be tested dynamically.
+bool f<T>(Object o) => o is T;
+
+main() => f<int>(42);
+"""
+          ]),
+
+      MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC:
+          const MessageTemplate(
+              MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC,
+              "Method type variables are treated as `dynamic` in `as` "
+              "expressions.",
+              howToFix:
+                  "Try using the upper bound of the type variable, or check "
+                  "that the blind success of the test does not introduce bugs.",
+              examples: const [
+            """
+// Method type variables are not reified, so they cannot be tested dynamically.
+bool f<T>(Object o) => o as T;
+
+main() => f<int>(42);
+"""
+          ]),
+
       MessageKind.INVALID_TYPE_VARIABLE_BOUND: const MessageTemplate(
           MessageKind.INVALID_TYPE_VARIABLE_BOUND,
           "'#{typeArgument}' is not a subtype of bound '#{bound}' for "
diff --git a/pkg/compiler/lib/src/elements/resolution_types.dart b/pkg/compiler/lib/src/elements/resolution_types.dart
index 8df0252..0ebbe2fb 100644
--- a/pkg/compiler/lib/src/elements/resolution_types.dart
+++ b/pkg/compiler/lib/src/elements/resolution_types.dart
@@ -394,7 +394,7 @@
             typeArguments.length == element.typeVariables.length;
       }
       return true;
-    },
+    }(),
         failedAt(
             element,
             'Invalid type argument count on ${element.thisType}. '
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 35bb230..b69771e 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -2506,7 +2506,7 @@
       js.Node target = targets[node];
       return target is js.Loop ||
           (target is js.LabeledStatement && target.body is js.Loop);
-    });
+    }());
     return false;
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index b2b61c8..48f1182 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -368,7 +368,9 @@
     return result;
   }
 
-  RuntimeTypesImpl _rti;
+  RuntimeTypesChecksBuilder _rtiChecksBuilder;
+
+  RuntimeTypesSubstitutions _rtiSubstitutions;
 
   RuntimeTypesEncoder _rtiEncoder;
 
@@ -532,22 +534,22 @@
 
   RuntimeTypesChecksBuilder get rtiChecksBuilder {
     assert(
-        _rti != null,
+        _rtiChecksBuilder != null,
         failedAt(NO_LOCATION_SPANNABLE,
             "RuntimeTypesChecksBuilder has not been created yet."));
     assert(
-        !_rti.rtiChecksBuilderClosed,
+        !_rtiChecksBuilder.rtiChecksBuilderClosed,
         failedAt(NO_LOCATION_SPANNABLE,
             "RuntimeTypesChecks has already been computed."));
-    return _rti;
+    return _rtiChecksBuilder;
   }
 
   RuntimeTypesSubstitutions get rtiSubstitutions {
     assert(
-        _rti != null,
+        _rtiSubstitutions != null,
         failedAt(NO_LOCATION_SPANNABLE,
             "RuntimeTypesSubstitutions has not been created yet."));
-    return _rti;
+    return _rtiSubstitutions;
   }
 
   RuntimeTypesEncoder get rtiEncoder {
@@ -595,9 +597,11 @@
       ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) {
     return compiler.options.enableMinification
         ? compiler.options.useFrequencyNamer
-            ? new FrequencyBasedNamer(closedWorld, codegenWorldBuilder)
-            : new MinifyNamer(closedWorld, codegenWorldBuilder)
-        : new Namer(closedWorld, codegenWorldBuilder);
+            ? new FrequencyBasedNamer(
+                closedWorld, codegenWorldBuilder, compiler.options)
+            : new MinifyNamer(
+                closedWorld, codegenWorldBuilder, compiler.options)
+        : new Namer(closedWorld, codegenWorldBuilder, compiler.options);
   }
 
   void validateInterceptorImplementsAllObjectMethods(
@@ -979,8 +983,18 @@
     // TODO(johnniwinther): Share the impact object created in
     // createCodegenEnqueuer.
     BackendImpacts impacts = new BackendImpacts(closedWorld.commonElements);
-    _rti = new RuntimeTypesImpl(
-        closedWorld.elementEnvironment, closedWorld.dartTypes);
+    if (compiler.options.disableRtiOptimization) {
+      _rtiSubstitutions = new TrivialRuntimeTypesSubstitutions(
+          closedWorld.elementEnvironment, closedWorld.dartTypes);
+      _rtiChecksBuilder =
+          new TrivialRuntimeTypesChecksBuilder(closedWorld, _rtiSubstitutions);
+    } else {
+      RuntimeTypesImpl runtimeTypesImpl = new RuntimeTypesImpl(
+          closedWorld.elementEnvironment, closedWorld.dartTypes);
+      _rtiChecksBuilder = runtimeTypesImpl;
+      _rtiSubstitutions = runtimeTypesImpl;
+    }
+
     _codegenImpactTransformer = new CodegenImpactTransformer(
         compiler.options,
         closedWorld.elementEnvironment,
diff --git a/pkg/compiler/lib/src/js_backend/codegen_listener.dart b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
index a5a2ac3..dd98494 100644
--- a/pkg/compiler/lib/src/js_backend/codegen_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
@@ -55,7 +55,7 @@
     impactBuilder
         .addImpact(_impacts.memberClosure.createImpact(_elementEnvironment));
     FunctionType type = _elementEnvironment.getFunctionType(element);
-    if (type.containsTypeVariables && _rtiNeed.methodNeedsRti(element)) {
+    if (type.containsTypeVariables && _rtiNeed.methodNeedsSignature(element)) {
       impactBuilder.addImpact(_registerComputeSignature());
     }
     return impactBuilder;
@@ -231,7 +231,7 @@
       ClassEntity cls = member.enclosingClass;
       if (member.name == Identifiers.call &&
           _elementEnvironment.isGenericClass(cls) &&
-          _rtiNeed.methodNeedsRti(member)) {
+          _rtiNeed.methodNeedsSignature(member)) {
         worldImpact.addImpact(_registerComputeSignature());
       }
     }
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index d52f2f0..1ca83e4 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -341,7 +341,7 @@
       InterfaceType type, jsAst.Expression value) {
     if (type is InterfaceType &&
         !type.treatAsRaw &&
-        _rtiNeed.classNeedsRti(type.element)) {
+        _rtiNeed.classNeedsTypeArguments(type.element)) {
       return new jsAst.Call(
           getHelperProperty(_commonElements.setRuntimeTypeInfo),
           [value, _reifiedTypeArguments(type)]);
diff --git a/pkg/compiler/lib/src/js_backend/frequency_namer.dart b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
index 854405a..511bb03 100644
--- a/pkg/compiler/lib/src/js_backend/frequency_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
@@ -28,9 +28,9 @@
   jsAst.Name get staticsPropertyName =>
       _staticsPropertyName ??= getFreshName(instanceScope, 'static');
 
-  FrequencyBasedNamer(
-      ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder)
-      : super(closedWorld, codegenWorldBuilder) {
+  FrequencyBasedNamer(ClosedWorld closedWorld,
+      CodegenWorldBuilder codegenWorldBuilder, CompilerOptions options)
+      : super(closedWorld, codegenWorldBuilder, options) {
     fieldRegistry = new _FieldNamingRegistry(this);
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 8dbb47f..887befd 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -292,15 +292,15 @@
     if (!type.isInterfaceType) return;
     InterfaceType interfaceType = type;
     // If [argument] has type variables or is a type variable, this method
-    // registers a RTI dependency between the class where the type variable is
-    // defined (that is the enclosing class of the current element being
-    // resolved) and the class of [type]. If the class of [type] requires RTI,
-    // then the class of the type variable does too.
-    ClassEntity contextClass = DartTypes.getClassContext(interfaceType);
-    if (contextClass != null) {
-      _rtiNeedBuilder.registerRtiDependency(
-          interfaceType.element, contextClass);
-    }
+    // registers a RTI dependency between the entity that introduced the type
+    // variable and the class of [type]. If the class of [type] requires type
+    // arguments at runtime, then the entity that introduced the type variable
+    // does too.
+    interfaceType.forEachTypeVariable((TypeVariableType typeVariable) {
+      Entity typeDeclaration = typeVariable.element.typeDeclaration;
+      _rtiNeedBuilder.registerTypeArgumentDependency(
+          interfaceType.element, typeDeclaration);
+    });
   }
 
   // TODO(johnniwinther): Maybe split this into [onAssertType] and [onTestType].
@@ -428,11 +428,11 @@
     for (StaticUse staticUse in impact.staticUses) {
       if (staticUse.kind == StaticUseKind.CALL_METHOD) {
         FunctionEntity callMethod = staticUse.element;
-        if (_rtiNeed.methodNeedsRti(callMethod)) {
+        if (_rtiNeed.methodNeedsSignature(callMethod)) {
           _impacts.computeSignature
               .registerImpact(transformed, _elementEnvironment);
         } else if (callMethod is SynthesizedCallMethodElementX) {
-          if (_rtiNeed.localFunctionNeedsRti(callMethod.expression)) {
+          if (_rtiNeed.localFunctionNeedsSignature(callMethod.expression)) {
             _impacts.computeSignature
                 .registerImpact(transformed, _elementEnvironment);
           }
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 517e3bb..6be7b26 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -12,8 +12,9 @@
         _MinifiedFieldNamer,
         _MinifyConstructorBodyNamer,
         _MinifiedOneShotInterceptorNamer {
-  MinifyNamer(ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder)
-      : super(closedWorld, codegenWorldBuilder) {
+  MinifyNamer(ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder,
+      CompilerOptions options)
+      : super(closedWorld, codegenWorldBuilder, options) {
     reserveBackendNames();
     fieldRegistry = new _FieldNamingRegistry(this);
   }
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 492087c..7d2e799 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -6,6 +6,7 @@
 
 import 'dart:collection' show HashMap;
 
+import 'package:front_end/src/fasta/scanner/characters.dart';
 import 'package:js_runtime/shared/embedded_names.dart' show JsGetName;
 
 import '../closure.dart';
@@ -29,10 +30,10 @@
 import '../elements/types.dart';
 import '../js/js.dart' as jsAst;
 import '../js_model/closure.dart';
+import '../options.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart' show Selector, SelectorKind;
 import '../universe/world_builder.dart' show CodegenWorldBuilder;
-import 'package:front_end/src/fasta/scanner/characters.dart';
 import '../util/util.dart';
 import '../world.dart' show ClosedWorld;
 import 'backend.dart';
@@ -501,6 +502,7 @@
 
   final ClosedWorld _closedWorld;
   final CodegenWorldBuilder _codegenWorldBuilder;
+  final CompilerOptions _options;
 
   RuntimeTypesEncoder _rtiEncoder;
   RuntimeTypesEncoder get rtiEncoder {
@@ -571,7 +573,7 @@
   final Map<LibraryEntity, String> _libraryKeys =
       new HashMap<LibraryEntity, String>();
 
-  Namer(this._closedWorld, this._codegenWorldBuilder) {
+  Namer(this._closedWorld, this._codegenWorldBuilder, this._options) {
     _literalAsyncPrefix = new StringBackedName(asyncPrefix);
     _literalGetterPrefix = new StringBackedName(getterPrefix);
     _literalSetterPrefix = new StringBackedName(setterPrefix);
@@ -811,7 +813,11 @@
   /// This is used for the annotated names of `call`, and for the proposed name
   /// for other instance methods.
   List<String> callSuffixForStructure(CallStructure callStructure) {
-    List<String> suffixes = ['${callStructure.argumentCount}'];
+    List<String> suffixes = [];
+    if (_options.strongMode) {
+      suffixes.add('${callStructure.typeArgumentCount}');
+    }
+    suffixes.add('${callStructure.argumentCount}');
     suffixes.addAll(callStructure.getOrderedNamedArguments());
     return suffixes;
   }
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 7e65a2f..d47916d 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -375,7 +375,7 @@
       _registerBackendImpact(impactBuilder, _impacts.mapClass);
       // For map literals, the dependency between the implementation class
       // and [Map] is not visible, so we have to add it manually.
-      _rtiNeedBuilder.registerRtiDependency(
+      _rtiNeedBuilder.registerTypeArgumentDependency(
           _commonElements.mapLiteralClass, cls);
     } else if (cls == _commonElements.boundClosureClass) {
       _registerBackendImpact(impactBuilder, _impacts.boundClosureClass);
@@ -469,6 +469,12 @@
     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.
+      _registerBackendImpact(impactBuilder, _impacts.computeSignature);
+      _registerBackendImpact(impactBuilder, _impacts.getRuntimeTypeArgument);
+    }
 
     if (JavaScriptBackend.TRACE_CALLS) {
       _registerBackendImpact(impactBuilder, _impacts.traceHelper);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index dcadac5..6fd95da 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -36,22 +36,97 @@
 
 /// Interface for the classes and methods that need runtime types.
 abstract class RuntimeTypesNeed {
-  bool classNeedsRti(ClassEntity cls);
+  /// Returns `true` if [cls] needs type arguments at runtime type.
+  ///
+  /// This is for instance the case for generic classes used in a type test:
+  ///
+  ///   class C<T> {}
+  ///   main() {
+  ///     new C<int>() is C<int>;
+  ///     new C<String>() is C<String>;
+  ///   }
+  ///
+  bool classNeedsTypeArguments(ClassEntity cls);
+
+  /// Returns `true` if [method] needs type arguments at runtime type.
+  ///
+  /// This is for instance the case for generic methods that uses type tests:
+  ///
+  ///   method<T>(T t) => t is T;
+  ///   main() {
+  ///     method<int>(0);
+  ///     method<String>('');
+  ///   }
+  ///
+  bool methodNeedsTypeArguments(FunctionEntity method);
+
   bool classNeedsRtiField(ClassEntity cls);
-  bool methodNeedsRti(FunctionEntity function);
-  bool methodNeedsGenericRti(FunctionEntity function);
+
+  /// Returns `true` if a signature is needed for [method].
+  ///
+  /// A signature is a runtime method type descriptor function that creates
+  /// a runtime representation of the type of the method.
+  ///
+  /// This is for instance needed for instance methods of generic classes that
+  /// are torn off and whose type therefore potentially is used in a type test:
+  ///
+  ///     class C<T> {
+  ///       method(T t) {}
+  ///     }
+  ///     main() {
+  ///       new C<int>().method is void Function(int);
+  ///       new C<String>().method is void Function(String);
+  ///     }
+  ///
+  /// Since type of the method depends on the type argument of its enclosing
+  /// class, the type of the method is a JavaScript function like:
+  ///
+  ///    signature: function (T) {
+  ///      return {'func': true, params: [T]};
+  ///    }
+  ///
+  bool methodNeedsSignature(FunctionEntity method);
+
+  /// Returns `true` if a signature is needed for the call-method created for
+  /// [localFunction].
+  ///
+  /// See [methodNeedsSignature] for more information on what a signature is
+  /// and when it is needed.
   // TODO(redemption): Remove this when the old frontend is deleted.
-  bool localFunctionNeedsRti(Local function);
+  bool localFunctionNeedsSignature(Local localFunction);
+
   bool classUsesTypeVariableExpression(ClassEntity cls);
 }
 
+class TrivialRuntimeTypesNeed implements RuntimeTypesNeed {
+  const TrivialRuntimeTypesNeed();
+
+  @override
+  bool classNeedsTypeArguments(ClassEntity cls) => true;
+
+  @override
+  bool classUsesTypeVariableExpression(ClassEntity cls) => true;
+
+  @override
+  bool localFunctionNeedsSignature(Local localFunction) => true;
+
+  @override
+  bool methodNeedsSignature(FunctionEntity method) => true;
+
+  @override
+  bool classNeedsRtiField(ClassEntity cls) => true;
+
+  @override
+  bool methodNeedsTypeArguments(FunctionEntity method) => true;
+}
+
 /// Interface for computing classes and methods that need runtime types.
 abstract class RuntimeTypesNeedBuilder {
   /// Registers that [cls] contains a type variable literal.
   void registerClassUsingTypeVariableExpression(ClassEntity cls);
 
-  /// Registers that if [element] needs reified runtime type information then so
-  /// does [dependency].
+  /// Registers that if [element] needs type arguments at runtime then so does
+  /// [dependency].
   ///
   /// For instance:
   ///
@@ -61,9 +136,19 @@
   ///     class B<T> {}
   ///     main() => new A<String>().m() is B<int>;
   ///
-  /// Here `A` need reified runtime type information because `B` needs it in
-  /// order to generate the check against `B<int>`.
-  void registerRtiDependency(ClassEntity element, ClassEntity dependency);
+  /// Here `A` need type arguments at runtime because `B` needs it in order to
+  /// generate the check against `B<int>`.
+  ///
+  /// This can also involve generic methods:
+  ///
+  ///    class A<T> {}
+  ///    method<T>() => new A<T>();
+  ///    main() => method<int>() is A<int>();
+  ///
+  /// Here `method` need type arguments at runtime because `A` needs it in order
+  /// to generate the check against `A<int>`.
+  ///
+  void registerTypeArgumentDependency(Entity element, Entity dependency);
 
   /// Computes the [RuntimeTypesNeed] for the data registered with this builder.
   RuntimeTypesNeed computeRuntimeTypesNeed(
@@ -71,6 +156,23 @@
       {bool enableTypeAssertions});
 }
 
+class TrivialRuntimeTypesNeedBuilder implements RuntimeTypesNeedBuilder {
+  const TrivialRuntimeTypesNeedBuilder();
+
+  @override
+  void registerClassUsingTypeVariableExpression(ClassEntity cls) {}
+
+  @override
+  RuntimeTypesNeed computeRuntimeTypesNeed(
+      ResolutionWorldBuilder resolutionWorldBuilder, ClosedWorld closedWorld,
+      {bool enableTypeAssertions}) {
+    return const TrivialRuntimeTypesNeed();
+  }
+
+  @override
+  void registerTypeArgumentDependency(Entity element, Entity dependency) {}
+}
+
 /// Interface for the needed runtime type checks.
 abstract class RuntimeTypesChecks {
   /// Returns the required runtime type checks.
@@ -84,6 +186,23 @@
   Set<ClassEntity> getRequiredArgumentClasses();
 }
 
+class TrivialTypesChecks implements RuntimeTypesChecks {
+  final TypeChecks _typeChecks;
+  final Set<ClassEntity> _allClasses;
+
+  TrivialTypesChecks(this._typeChecks)
+      : _allClasses = _typeChecks.classes.toSet();
+
+  @override
+  TypeChecks get requiredChecks => _typeChecks;
+
+  @override
+  Set<ClassEntity> getRequiredArgumentClasses() => _allClasses;
+
+  @override
+  Set<ClassEntity> getReferencedClasses(FunctionType type) => _allClasses;
+}
+
 /// Interface for computing the needed runtime type checks.
 abstract class RuntimeTypesChecksBuilder {
   void registerTypeVariableBoundsSubtypeCheck(
@@ -99,6 +218,185 @@
   /// This function must be called after all is-checks have been registered.
   void registerImplicitChecks(Set<InterfaceType> instantiatedTypes,
       Iterable<ClassEntity> classesUsingChecks, Set<DartType> implicitIsChecks);
+
+  bool get rtiChecksBuilderClosed;
+}
+
+class TrivialRuntimeTypesChecksBuilder implements RuntimeTypesChecksBuilder {
+  final ClosedWorld _closedWorld;
+  final TrivialRuntimeTypesSubstitutions _substitutions;
+  bool rtiChecksBuilderClosed = false;
+
+  TrivialRuntimeTypesChecksBuilder(this._closedWorld, this._substitutions);
+
+  ElementEnvironment get _elementEnvironment => _closedWorld.elementEnvironment;
+
+  @override
+  void registerTypeVariableBoundsSubtypeCheck(
+      DartType typeArgument, DartType bound) {}
+
+  @override
+  void registerImplicitChecks(
+      Set<InterfaceType> instantiatedTypes,
+      Iterable<ClassEntity> classesUsingChecks,
+      Set<DartType> implicitIsChecks) {}
+
+  @override
+  RuntimeTypesChecks computeRequiredChecks(
+      CodegenWorldBuilder codegenWorldBuilder, Set<DartType> implicitIsChecks) {
+    Set<ClassEntity> classes = _closedWorld
+        .getClassSet(_closedWorld.commonElements.objectClass)
+        .subtypes()
+        .toSet();
+    rtiChecksBuilderClosed = true;
+    TypeChecks typeChecks = _substitutions._requiredChecks = _substitutions
+        ._computeChecks(/*collector.*/ classes, /*collector.*/ classes);
+    return new TrivialTypesChecks(typeChecks);
+  }
+}
+
+class ClassCollector extends ArgumentCollector {
+  final ElementEnvironment _elementEnvironment;
+
+  ClassCollector(this._elementEnvironment);
+
+  void addClass(ClassEntity cls) {
+    if (classes.add(cls)) {
+      _elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
+        collect(type, isTypeArgument: true);
+      });
+    }
+  }
+}
+
+abstract class RuntimeTypesSubstitutionsMixin
+    implements RuntimeTypesSubstitutions {
+  ElementEnvironment get _elementEnvironment;
+  DartTypes get _types;
+  TypeChecks get _requiredChecks;
+
+  TypeChecks _computeChecks(
+      Set<ClassEntity> instantiated, Set<ClassEntity> checked) {
+    // Run through the combination of instantiated and checked
+    // arguments and record all combination where the element of a checked
+    // argument is a superclass of the element of an instantiated type.
+    TypeCheckMapping result = new TypeCheckMapping();
+    for (ClassEntity element in instantiated) {
+      if (checked.contains(element)) {
+        result.add(element, element, null);
+      }
+      // Find all supertypes of [element] in [checkedArguments] and add checks
+      // and precompute the substitutions for them.
+      for (InterfaceType supertype in _types.getSupertypes(element)) {
+        ClassEntity superelement = supertype.element;
+        if (checked.contains(superelement)) {
+          Substitution substitution =
+              computeSubstitution(element, superelement);
+          result.add(element, superelement, substitution);
+        }
+      }
+    }
+    return result;
+  }
+
+  @override
+  Set<ClassEntity> getClassesUsedInSubstitutions(TypeChecks checks) {
+    Set<ClassEntity> instantiated = new Set<ClassEntity>();
+    ArgumentCollector collector = new ArgumentCollector();
+    for (ClassEntity target in checks.classes) {
+      instantiated.add(target);
+      for (TypeCheck check in checks[target]) {
+        Substitution substitution = check.substitution;
+        if (substitution != null) {
+          collector.collectAll(substitution.arguments);
+        }
+      }
+    }
+    return instantiated..addAll(collector.classes);
+
+    // TODO(sra): This computation misses substitutions for reading type
+    // parameters.
+  }
+
+  // TODO(karlklose): maybe precompute this value and store it in typeChecks?
+  @override
+  bool isTrivialSubstitution(ClassEntity cls, ClassEntity check) {
+    if (cls.isClosure) {
+      // TODO(karlklose): handle closures.
+      return true;
+    }
+
+    // If there are no type variables or the type is the same, we do not need
+    // a substitution.
+    if (!_elementEnvironment.isGenericClass(check) || cls == check) {
+      return true;
+    }
+
+    InterfaceType originalType = _elementEnvironment.getThisType(cls);
+    InterfaceType type = _types.asInstanceOf(originalType, check);
+    // [type] is not a subtype of [check]. we do not generate a check and do not
+    // need a substitution.
+    if (type == null) return true;
+
+    // Run through both lists of type variables and check if the type variables
+    // are identical at each position. If they are not, we need to calculate a
+    // substitution function.
+    List<DartType> variables = originalType.typeArguments;
+    List<DartType> arguments = type.typeArguments;
+    if (variables.length != arguments.length) {
+      return false;
+    }
+    for (int index = 0; index < variables.length; index++) {
+      if (variables[index] != arguments[index]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  Substitution getSubstitution(ClassEntity cls, ClassEntity other) {
+    // Look for a precomputed check.
+    for (TypeCheck check in _requiredChecks[cls]) {
+      if (check.cls == other) {
+        return check.substitution;
+      }
+    }
+    // There is no precomputed check for this pair (because the check is not
+    // done on type arguments only.  Compute a new substitution.
+    return computeSubstitution(cls, other);
+  }
+
+  Substitution computeSubstitution(ClassEntity cls, ClassEntity check,
+      {bool alwaysGenerateFunction: false}) {
+    if (isTrivialSubstitution(cls, check)) return null;
+
+    // Unnamed mixin application classes do not need substitutions, because they
+    // are never instantiated and their checks are overwritten by the class that
+    // they are mixed into.
+    InterfaceType type = _elementEnvironment.getThisType(cls);
+    InterfaceType target = _types.asInstanceOf(type, check);
+    List<DartType> typeVariables = type.typeArguments;
+    if (typeVariables.isEmpty && !alwaysGenerateFunction) {
+      return new Substitution.list(target.typeArguments);
+    } else {
+      return new Substitution.function(target.typeArguments, typeVariables);
+    }
+  }
+}
+
+class TrivialRuntimeTypesSubstitutions extends RuntimeTypesSubstitutionsMixin {
+  final ElementEnvironment _elementEnvironment;
+  final DartTypes _types;
+  TypeChecks _requiredChecks;
+
+  TrivialRuntimeTypesSubstitutions(this._elementEnvironment, this._types);
+
+  @override
+  TypeChecks computeChecks(
+      Set<ClassEntity> instantiated, Set<ClassEntity> checked) {
+    return _requiredChecks;
+  }
 }
 
 /// Interface for computing substitutions need for runtime type checks.
@@ -219,9 +517,11 @@
 class RuntimeTypesNeedImpl implements RuntimeTypesNeed {
   final ElementEnvironment _elementEnvironment;
   final BackendUsage _backendUsage;
-  final Set<ClassEntity> classesNeedingRti;
-  final Set<FunctionEntity> methodsNeedingRti;
-  final Set<Local> localFunctionsNeedingRti;
+  final Set<ClassEntity> classesNeedingTypeArguments;
+  final Set<FunctionEntity> methodsNeedingSignature;
+  final Set<FunctionEntity> methodsNeedingTypeArguments;
+  final Set<Local> localFunctionsNeedingSignature;
+  final Set<Local> localFunctionsNeedingTypeArguments;
 
   /// The set of classes that use one of their type variables as expressions
   /// to get the runtime type.
@@ -230,41 +530,49 @@
   RuntimeTypesNeedImpl(
       this._elementEnvironment,
       this._backendUsage,
-      this.classesNeedingRti,
-      this.methodsNeedingRti,
-      this.localFunctionsNeedingRti,
+      this.classesNeedingTypeArguments,
+      this.methodsNeedingSignature,
+      this.methodsNeedingTypeArguments,
+      this.localFunctionsNeedingSignature,
+      this.localFunctionsNeedingTypeArguments,
       this.classesUsingTypeVariableExpression);
 
   bool checkClass(covariant ClassEntity cls) => true;
 
-  bool classNeedsRti(ClassEntity cls) {
+  bool classNeedsTypeArguments(ClassEntity cls) {
     assert(checkClass(cls));
     if (_backendUsage.isRuntimeTypeUsed) return true;
-    return classesNeedingRti.contains(cls);
+    return classesNeedingTypeArguments.contains(cls);
   }
 
   bool classNeedsRtiField(ClassEntity cls) {
     assert(checkClass(cls));
     if (!_elementEnvironment.isGenericClass(cls)) return false;
     if (_backendUsage.isRuntimeTypeUsed) return true;
-    return classesNeedingRti.contains(cls);
+    return classesNeedingTypeArguments.contains(cls);
   }
 
-  bool methodNeedsRti(FunctionEntity function) {
-    return methodsNeedingRti.contains(function) ||
-        _backendUsage.isRuntimeTypeUsed;
+  bool methodNeedsSignature(FunctionEntity function) {
+    return _backendUsage.isRuntimeTypeUsed ||
+        methodsNeedingSignature.contains(function);
   }
 
   // TODO(johnniwinther): Optimize to only include generic methods that really
   // need the RTI.
-  bool methodNeedsGenericRti(FunctionEntity function) => true;
+  bool methodNeedsTypeArguments(FunctionEntity function) {
+    if (function.parameterStructure.typeParameters == 0) return false;
+    if (_backendUsage.isRuntimeTypeUsed) return true;
+    // TODO(johnniwinther): Include instance members in analysis.
+    if (function.isInstanceMember) return true;
+    return methodsNeedingTypeArguments.contains(function);
+  }
 
-  bool localFunctionNeedsRti(Local function) {
-    if (localFunctionsNeedingRti == null) {
+  bool localFunctionNeedsSignature(Local function) {
+    if (localFunctionsNeedingSignature == null) {
       // [localFunctionNeedsRti] is only used by the old frontend.
       throw new UnsupportedError('RuntimeTypesNeed.localFunctionsNeedingRti');
     }
-    return localFunctionsNeedingRti.contains(function) ||
+    return localFunctionsNeedingSignature.contains(function) ||
         _backendUsage.isRuntimeTypeUsed;
   }
 
@@ -280,14 +588,18 @@
       BackendUsage backendUsage,
       Set<ClassEntity> classesNeedingRti,
       Set<FunctionEntity> methodsNeedingRti,
+      Set<FunctionEntity> methodsNeedingGenericRti,
       Set<Local> localFunctionsNeedingRti,
+      Set<Local> localFunctionsNeedingTypeArguments,
       Set<ClassEntity> classesUsingTypeVariableExpression)
       : super(
             elementEnvironment,
             backendUsage,
             classesNeedingRti,
             methodsNeedingRti,
+            methodsNeedingGenericRti,
             localFunctionsNeedingRti,
+            localFunctionsNeedingTypeArguments,
             classesUsingTypeVariableExpression);
 
   bool checkClass(ClassElement cls) => cls.isDeclaration;
@@ -297,8 +609,8 @@
     implements RuntimeTypesNeedBuilder {
   final ElementEnvironment _elementEnvironment;
 
-  final Map<ClassEntity, Set<ClassEntity>> rtiDependencies =
-      <ClassEntity, Set<ClassEntity>>{};
+  final Map<Entity, Set<Entity>> typeArgumentDependencies =
+      <Entity, Set<Entity>>{};
 
   final Set<ClassEntity> classesUsingTypeVariableExpression =
       new Set<ClassEntity>();
@@ -320,11 +632,10 @@
   }
 
   @override
-  void registerRtiDependency(ClassEntity element, ClassEntity dependency) {
-    // We're not dealing with typedef for now.
+  void registerTypeArgumentDependency(Entity element, Entity dependency) {
     assert(element != null);
-    Set<ClassEntity> classes =
-        rtiDependencies.putIfAbsent(element, () => new Set<ClassEntity>());
+    Set<Entity> classes =
+        typeArgumentDependencies.putIfAbsent(element, () => new Set<Entity>());
     classes.add(dependency);
   }
 
@@ -333,30 +644,39 @@
       ResolutionWorldBuilder resolutionWorldBuilder, ClosedWorld closedWorld,
       {bool enableTypeAssertions}) {
     isChecks = new Set<DartType>.from(resolutionWorldBuilder.isChecks);
-    Set<ClassEntity> classesNeedingRti = new Set<ClassEntity>();
-    Set<FunctionEntity> methodsNeedingRti = new Set<FunctionEntity>();
-    Set<Local> localFunctionsNeedingRti = new Set<Local>();
+    Set<ClassEntity> classesNeedingTypeArguments = new Set<ClassEntity>();
+    Set<FunctionEntity> methodsNeedingSignature = new Set<FunctionEntity>();
+    Set<FunctionEntity> methodsNeedingTypeArguments = new Set<FunctionEntity>();
+    Set<Local> localFunctionsNeedingSignature = new Set<Local>();
+    Set<Local> localFunctionsNeedingTypeArguments = new Set<Local>();
 
-    // Find the classes that need runtime type information. Such
+    // Find the classes that need type arguments at runtime. Such
     // classes are:
-    // (1) used in a is check with type variables,
+    // (1) used in an is check with type variables,
     // (2) dependencies of classes in (1),
     // (3) subclasses of (2) and (3).
-    void potentiallyAddForRti(ClassEntity cls) {
-      assert(checkClass(cls));
-      if (!_elementEnvironment.isGenericClass(cls)) return;
-      if (classesNeedingRti.contains(cls)) return;
-      classesNeedingRti.add(cls);
+    void potentiallyNeedTypeArguments(Entity entity) {
+      if (entity is ClassEntity) {
+        ClassEntity cls = entity;
+        assert(checkClass(cls));
+        if (!_elementEnvironment.isGenericClass(cls)) return;
+        if (classesNeedingTypeArguments.contains(cls)) return;
+        classesNeedingTypeArguments.add(cls);
 
-      // TODO(ngeoffray): This should use subclasses, not subtypes.
-      closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity sub) {
-        potentiallyAddForRti(sub);
-      });
+        // TODO(ngeoffray): This should use subclasses, not subtypes.
+        closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity sub) {
+          potentiallyNeedTypeArguments(sub);
+        });
+      } else if (entity is FunctionEntity) {
+        methodsNeedingTypeArguments.add(entity);
+      } else {
+        localFunctionsNeedingTypeArguments.add(entity);
+      }
 
-      Set<ClassEntity> dependencies = rtiDependencies[cls];
+      Set<Entity> dependencies = typeArgumentDependencies[entity];
       if (dependencies != null) {
-        dependencies.forEach((ClassEntity other) {
-          potentiallyAddForRti(other);
+        dependencies.forEach((Entity other) {
+          potentiallyNeedTypeArguments(other);
         });
       }
     }
@@ -384,7 +704,8 @@
     // TODO(karlklose): make this dependency visible from code.
     if (closedWorld.commonElements.jsArrayClass != null) {
       ClassEntity listClass = closedWorld.commonElements.listClass;
-      registerRtiDependency(closedWorld.commonElements.jsArrayClass, listClass);
+      registerTypeArgumentDependency(
+          closedWorld.commonElements.jsArrayClass, listClass);
     }
 
     // Check local functions and closurized members.
@@ -395,7 +716,7 @@
             (potentialSubtypeOf == null ||
                 closedWorld.dartTypes
                     .isPotentialSubtype(functionType, potentialSubtypeOf))) {
-          potentiallyAddForRti(contextClass);
+          potentiallyNeedTypeArguments(contextClass);
           return true;
         }
         return false;
@@ -405,13 +726,13 @@
           in resolutionWorldBuilder.localFunctionsWithFreeTypeVariables) {
         if (checkFunctionType(
             _elementEnvironment.getLocalFunctionType(function))) {
-          localFunctionsNeedingRti.add(function);
+          localFunctionsNeedingSignature.add(function);
         }
       }
       for (FunctionEntity function
           in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
         if (checkFunctionType(_elementEnvironment.getFunctionType(function))) {
-          methodsNeedingRti.add(function);
+          methodsNeedingSignature.add(function);
         }
       }
     }
@@ -424,16 +745,15 @@
         if (type.isInterfaceType) {
           InterfaceType itf = type;
           if (!itf.treatAsRaw) {
-            potentiallyAddForRti(itf.element);
+            potentiallyNeedTypeArguments(itf.element);
           }
         } else {
-          ClassEntity contextClass = DartTypes.getClassContext(type);
-          if (contextClass != null) {
-            // [type] contains type variables (declared in [contextClass]) if
-            // [contextClass] is non-null. This handles checks against type
-            // variables and function types containing type variables.
-            potentiallyAddForRti(contextClass);
-          }
+          type.forEachTypeVariable((TypeVariableType typeVariable) {
+            // This handles checks against type variables and function types
+            // containing type variables.
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            potentiallyNeedTypeArguments(typeDeclaration);
+          });
           if (type.isFunctionType) {
             checkClosures(potentialSubtypeOf: type);
           }
@@ -450,30 +770,36 @@
 
     // Add the classes that need RTI because they use a type variable as
     // expression.
-    classesUsingTypeVariableExpression.forEach(potentiallyAddForRti);
+    classesUsingTypeVariableExpression.forEach(potentiallyNeedTypeArguments);
 
     return _createRuntimeTypesNeed(
         _elementEnvironment,
         closedWorld.backendUsage,
-        classesNeedingRti,
-        methodsNeedingRti,
-        localFunctionsNeedingRti,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        localFunctionsNeedingSignature,
+        localFunctionsNeedingTypeArguments,
         classesUsingTypeVariableExpression);
   }
 
   RuntimeTypesNeed _createRuntimeTypesNeed(
       ElementEnvironment elementEnvironment,
       BackendUsage backendUsage,
-      Set<ClassEntity> classesNeedingRti,
-      Set<FunctionEntity> methodsNeedingRti,
-      Set<Local> localFunctionsNeedingRti,
+      Set<ClassEntity> classesNeedingTypeArguments,
+      Set<FunctionEntity> methodsNeedingSignature,
+      Set<FunctionEntity> methodsNeedingTypeArguments,
+      Set<Local> localFunctionsNeedingSignature,
+      Set<Local> localFunctionsNeedingTypeArguments,
       Set<ClassEntity> classesUsingTypeVariableExpression) {
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
         backendUsage,
-        classesNeedingRti,
-        methodsNeedingRti,
-        localFunctionsNeedingRti,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        localFunctionsNeedingSignature,
+        localFunctionsNeedingTypeArguments,
         classesUsingTypeVariableExpression);
   }
 }
@@ -489,16 +815,20 @@
   RuntimeTypesNeed _createRuntimeTypesNeed(
       ElementEnvironment elementEnvironment,
       BackendUsage backendUsage,
-      Set<ClassEntity> classesNeedingRti,
-      Set<FunctionEntity> methodsNeedingRti,
-      Set<Local> localFunctionsNeedingRti,
+      Set<ClassEntity> classesNeedingTypeArguments,
+      Set<FunctionEntity> methodsNeedingSignature,
+      Set<FunctionEntity> methodsNeedingTypeArguments,
+      Set<Local> localFunctionsNeedingSignature,
+      Set<Local> localFunctionsNeedingTypeArguments,
       Set<ClassEntity> classesUsingTypeVariableExpression) {
     return new _ResolutionRuntimeTypesNeed(
         _elementEnvironment,
         backendUsage,
-        classesNeedingRti,
-        methodsNeedingRti,
-        localFunctionsNeedingRti,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        localFunctionsNeedingSignature,
+        localFunctionsNeedingTypeArguments,
         classesUsingTypeVariableExpression);
   }
 }
@@ -530,7 +860,8 @@
 }
 
 class RuntimeTypesImpl extends _RuntimeTypesBase
-    implements RuntimeTypesChecksBuilder, RuntimeTypesSubstitutions {
+    with RuntimeTypesSubstitutionsMixin
+    implements RuntimeTypesChecksBuilder {
   final ElementEnvironment _elementEnvironment;
 
   // The set of type arguments tested against type variable bounds.
@@ -544,6 +875,9 @@
 
   RuntimeTypesImpl(this._elementEnvironment, DartTypes types) : super(types);
 
+  @override
+  TypeChecks get _requiredChecks => cachedRequiredChecks;
+
   Set<ClassEntity> directlyInstantiatedArguments;
   Set<ClassEntity> allInstantiatedArguments;
   Set<ClassEntity> checkedArguments;
@@ -555,31 +889,6 @@
     checkedBounds.add(bound);
   }
 
-  @override
-  TypeChecks computeChecks(
-      Set<ClassEntity> instantiated, Set<ClassEntity> checked) {
-    // Run through the combination of instantiated and checked
-    // arguments and record all combination where the element of a checked
-    // argument is a superclass of the element of an instantiated type.
-    TypeCheckMapping result = new TypeCheckMapping();
-    for (ClassEntity element in instantiated) {
-      if (checked.contains(element)) {
-        result.add(element, element, null);
-      }
-      // Find all supertypes of [element] in [checkedArguments] and add checks
-      // and precompute the substitutions for them.
-      for (InterfaceType supertype in _types.getSupertypes(element)) {
-        ClassEntity superelement = supertype.element;
-        if (checked.contains(superelement)) {
-          Substitution substitution =
-              computeSubstitution(element, superelement);
-          result.add(element, superelement, substitution);
-        }
-      }
-    }
-    return result;
-  }
-
   RuntimeTypesChecks computeRequiredChecks(
       CodegenWorldBuilder codegenWorldBuilder, Set<DartType> implicitIsChecks) {
     Set<DartType> isChecks =
@@ -706,88 +1015,9 @@
   }
 
   @override
-  Set<ClassEntity> getClassesUsedInSubstitutions(TypeChecks checks) {
-    Set<ClassEntity> instantiated = new Set<ClassEntity>();
-    ArgumentCollector collector = new ArgumentCollector();
-    for (ClassEntity target in checks.classes) {
-      instantiated.add(target);
-      for (TypeCheck check in checks[target]) {
-        Substitution substitution = check.substitution;
-        if (substitution != null) {
-          collector.collectAll(substitution.arguments);
-        }
-      }
-    }
-    return instantiated..addAll(collector.classes);
-
-    // TODO(sra): This computation misses substitutions for reading type
-    // parameters.
-  }
-
-  // TODO(karlklose): maybe precompute this value and store it in typeChecks?
-  @override
-  bool isTrivialSubstitution(ClassEntity cls, ClassEntity check) {
-    if (cls.isClosure) {
-      // TODO(karlklose): handle closures.
-      return true;
-    }
-
-    // If there are no type variables or the type is the same, we do not need
-    // a substitution.
-    if (!_elementEnvironment.isGenericClass(check) || cls == check) {
-      return true;
-    }
-
-    InterfaceType originalType = _elementEnvironment.getThisType(cls);
-    InterfaceType type = _types.asInstanceOf(originalType, check);
-    // [type] is not a subtype of [check]. we do not generate a check and do not
-    // need a substitution.
-    if (type == null) return true;
-
-    // Run through both lists of type variables and check if the type variables
-    // are identical at each position. If they are not, we need to calculate a
-    // substitution function.
-    List<DartType> variables = originalType.typeArguments;
-    List<DartType> arguments = type.typeArguments;
-    if (variables.length != arguments.length) {
-      return false;
-    }
-    for (int index = 0; index < variables.length; index++) {
-      if (variables[index] != arguments[index]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @override
-  Substitution getSubstitution(ClassEntity cls, ClassEntity other) {
-    // Look for a precomputed check.
-    for (TypeCheck check in cachedRequiredChecks[cls]) {
-      if (check.cls == other) {
-        return check.substitution;
-      }
-    }
-    // There is no precomputed check for this pair (because the check is not
-    // done on type arguments only.  Compute a new substitution.
-    return computeSubstitution(cls, other);
-  }
-
-  Substitution computeSubstitution(ClassEntity cls, ClassEntity check,
-      {bool alwaysGenerateFunction: false}) {
-    if (isTrivialSubstitution(cls, check)) return null;
-
-    // Unnamed mixin application classes do not need substitutions, because they
-    // are never instantiated and their checks are overwritten by the class that
-    // they are mixed into.
-    InterfaceType type = _elementEnvironment.getThisType(cls);
-    InterfaceType target = _types.asInstanceOf(type, check);
-    List<DartType> typeVariables = type.typeArguments;
-    if (typeVariables.isEmpty && !alwaysGenerateFunction) {
-      return new Substitution.list(target.typeArguments);
-    } else {
-      return new Substitution.function(target.typeArguments, typeVariables);
-    }
+  TypeChecks computeChecks(
+      Set<ClassEntity> instantiated, Set<ClassEntity> checked) {
+    return _computeChecks(instantiated, checked);
   }
 }
 
@@ -1215,8 +1445,8 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     for (ClassEntity holder in classes) {
-      for (ClassEntity check in [holder]) {
-        sb.write('${holder.name}.' '${check.name}, ');
+      for (TypeCheck check in this[holder]) {
+        sb.write('${holder.name} <: ${check.cls.name}, ');
       }
     }
     return '[$sb]';
@@ -1226,6 +1456,10 @@
 class ArgumentCollector extends ResolutionDartTypeVisitor<dynamic, bool> {
   final Set<ClassEntity> classes = new Set<ClassEntity>();
 
+  void addClass(ClassEntity cls) {
+    classes.add(cls);
+  }
+
   collect(DartType type, {bool isTypeArgument: false}) {
     visit(type, isTypeArgument);
   }
@@ -1243,7 +1477,7 @@
   }
 
   visitInterfaceType(InterfaceType type, bool isTypeArgument) {
-    if (isTypeArgument) classes.add(type.element);
+    if (isTypeArgument) addClass(type.element);
     collectAll(type.typeArguments, isTypeArgument: true);
   }
 
@@ -1310,6 +1544,9 @@
         parameters = const <DartType>[];
 
   Substitution.function(this.arguments, this.parameters) : isFunction = true;
+
+  String toString() => 'Substitution(isFunction=$isFunction,'
+      'arguments=$arguments,parameters=$parameters)';
 }
 
 /**
@@ -1323,4 +1560,6 @@
   static int _nextHash = 0;
 
   TypeCheck(this.cls, this.substitution);
+
+  String toString() => 'TypeCheck(cls=$cls,substitution=$substitution)';
 }
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 c96a17c..4cd7014 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -851,7 +851,7 @@
     jsAst.Expression laziesAccess =
         generateEmbeddedGlobalAccess(embeddedNames.LAZIES);
 
-    return js.statement('''
+    return js.statement("""
       function init() {
         $isolatePropertiesName = Object.create(null);
         #allClasses = map();
@@ -955,7 +955,7 @@
           return Isolate;
       }
 
-      }''', {
+      }""", {
       'allClasses': allClassesAccess,
       'getTypeFromName': getTypeFromNameAccess,
       'interceptorsByTag': interceptorsByTagAccess,
@@ -1735,49 +1735,59 @@
           generateEmbeddedGlobalAccess(embeddedNames.DEFERRED_INITIALIZED)
     }));
 
-    // Write a javascript mapping from Deferred import load ids (derrived
-    // from the import prefix.) to a list of lists of uris of hunks to load,
-    // and a corresponding mapping to a list of hashes used by
-    // INITIALIZE_LOADED_HUNK and IS_HUNK_LOADED.
-    Map<String, List<jsAst.LiteralString>> deferredLibraryUris =
-        new Map<String, List<jsAst.LiteralString>>();
-    Map<String, List<_DeferredOutputUnitHash>> deferredLibraryHashes =
-        new Map<String, List<_DeferredOutputUnitHash>>();
-    compiler.deferredLoadTask.hunksToLoad
-        .forEach((String loadId, List<OutputUnit> outputUnits) {
-      List<jsAst.LiteralString> uris = new List<jsAst.LiteralString>();
-      List<_DeferredOutputUnitHash> hashes =
-          new List<_DeferredOutputUnitHash>();
-      deferredLibraryHashes[loadId] = new List<_DeferredOutputUnitHash>();
-      for (OutputUnit outputUnit in outputUnits) {
-        uris.add(js.escapedString(
-            compiler.deferredLoadTask.deferredPartFileName(outputUnit.name)));
-        hashes.add(deferredLoadHashes[outputUnit]);
+    void store(
+        jsAst.Expression map, jsAst.Expression uris, jsAst.Expression hashes) {
+      void assign(String name, jsAst.Expression value) {
+        parts.add(
+            js.statement('# = #', [generateEmbeddedGlobalAccess(name), value]));
       }
 
-      deferredLibraryUris[loadId] = uris;
-      deferredLibraryHashes[loadId] = hashes;
-    });
-
-    void emitMapping(String name, Map<String, List<jsAst.Expression>> mapping) {
-      List<jsAst.Property> properties = new List<jsAst.Property>();
-      mapping.forEach((String key, List<jsAst.Expression> values) {
-        properties.add(new jsAst.Property(
-            js.escapedString(key), new jsAst.ArrayInitializer(values)));
-      });
-      jsAst.Node initializer =
-          new jsAst.ObjectInitializer(properties, isOneLiner: true);
-
-      jsAst.Node globalName = generateEmbeddedGlobalAccess(name);
-      parts.add(js.statement("# = #", [globalName, initializer]));
+      assign(embeddedNames.DEFERRED_LIBRARY_PARTS, map);
+      assign(embeddedNames.DEFERRED_PART_URIS, uris);
+      assign(embeddedNames.DEFERRED_PART_HASHES, hashes);
     }
 
-    emitMapping(embeddedNames.DEFERRED_LIBRARY_URIS, deferredLibraryUris);
-    emitMapping(embeddedNames.DEFERRED_LIBRARY_HASHES, deferredLibraryHashes);
+    createDeferredLoadingData(
+        compiler.deferredLoadTask.hunksToLoad, deferredLoadHashes, store);
 
     return new jsAst.Block(parts);
   }
 
+  // Create data used for loading and initializing the hunks for a deferred
+  // import. There are three parts: a map from loadId to list of parts, where
+  // parts are represented as an index; an array of uris indexed by part; and an
+  // array of hashes indexed by part.
+  void createDeferredLoadingData(
+      Map<String, List<OutputUnit>> loadMap,
+      Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes,
+      void finish(jsAst.Expression map, jsAst.Expression uris,
+          jsAst.Expression hashes)) {
+    Map<OutputUnit, int> fragmentIndexes = <OutputUnit, int>{};
+    var uris = <jsAst.Expression>[];
+    var hashes = <jsAst.Expression>[];
+
+    List<jsAst.Property> libraryPartsMapEntries = <jsAst.Property>[];
+
+    loadMap.forEach((String loadId, List<OutputUnit> fragmentList) {
+      List<jsAst.Expression> indexes = <jsAst.Expression>[];
+      for (OutputUnit fragment in fragmentList) {
+        int index = fragmentIndexes[fragment];
+        if (index == null) {
+          index = fragmentIndexes[fragment] = fragmentIndexes.length;
+          uris.add(js.escapedString(
+              compiler.deferredLoadTask.deferredPartFileName(fragment.name)));
+          hashes.add(deferredLoadHashes[fragment]);
+        }
+        indexes.add(js.number(index));
+      }
+      libraryPartsMapEntries.add(new jsAst.Property(
+          js.string(loadId), new jsAst.ArrayInitializer(indexes)));
+    });
+
+    finish(new jsAst.ObjectInitializer(libraryPartsMapEntries),
+        new jsAst.ArrayInitializer(uris), new jsAst.ArrayInitializer(hashes));
+  }
+
   Map<OutputUnit, jsAst.Program> buildOutputAstForDeferredCode(
       Program program) {
     if (!program.isSplit) return const <OutputUnit, jsAst.Program>{};
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 4473469..c3207c7 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -319,7 +319,7 @@
   int get superclassHolderIndex =>
       (superclass == null) ? 0 : superclass.holder.index;
 
-  String toString() => 'Class(name=${name},element=$element)';
+  String toString() => 'Class(name=${name.key},element=$element)';
 }
 
 class MixinApplication extends Class {
@@ -524,7 +524,7 @@
       : super(element, name, code);
 
   String toString() {
-    return 'StubMethod(name=${name},element=${element}'
+    return 'StubMethod(name=${name.key},element=${element}'
         ',code=${js.nodeToString(code)})';
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index a296b45..db80fe3 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -6,6 +6,7 @@
 
 import '../constants/values.dart';
 import '../elements/entities.dart';
+import '../elements/types.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../js_backend/namer.dart' show Namer;
@@ -60,13 +61,17 @@
     CallStructure callStructure = selector.callStructure;
     ParameterStructure parameterStructure = member.parameterStructure;
     int positionalArgumentCount = callStructure.positionalArgumentCount;
-    if (positionalArgumentCount == parameterStructure.totalParameters) {
+    bool needsTypeArguments =
+        callStructure.typeArgumentCount != parameterStructure.typeParameters;
+    if (positionalArgumentCount == parameterStructure.totalParameters &&
+        !needsTypeArguments) {
       assert(callStructure.isUnnamed);
       return null;
     }
     if (parameterStructure.namedParameters.isNotEmpty &&
         callStructure.namedArgumentCount ==
-            parameterStructure.namedParameters.length) {
+            parameterStructure.namedParameters.length &&
+        !needsTypeArguments) {
       // If the selector has the same number of named arguments as the element,
       // we don't need to add a stub. The call site will hit the method
       // directly.
@@ -89,7 +94,9 @@
         new List<jsAst.Parameter>(selector.argumentCount + extraArgumentCount);
     // The arguments that will be passed to the real method.
     List<jsAst.Expression> argumentsBuffer = new List<jsAst.Expression>(
-        parameterStructure.totalParameters + extraArgumentCount);
+        parameterStructure.totalParameters +
+            extraArgumentCount +
+            parameterStructure.typeParameters);
 
     int count = 0;
     if (isInterceptedMethod) {
@@ -134,6 +141,15 @@
       }
       count++;
     });
+    if (needsTypeArguments) {
+      // ignore: unused_local_variable
+      for (TypeVariableType typeVariable
+          in _closedWorld.elementEnvironment.getFunctionTypeVariables(member)) {
+        argumentsBuffer[count++] =
+            // TODO(johnniwinther): Insert the type variable bound instead.
+            _emitter.constantReference(new NullConstantValue());
+      }
+    }
 
     var body; // List or jsAst.Statement.
     if (_nativeData.hasFixedBackendName(member)) {
@@ -210,7 +226,7 @@
     // The set of selectors that apply to `member`. For example, for
     // a member `foo(x, [y])` the following selectors may apply:
     // `foo(x)`, and `foo(x, y)`.
-    Map<Selector, SelectorConstraints> selectors;
+    Map<Selector, SelectorConstraints> liveSelectors;
     // The set of selectors that apply to `member` if it's name was `call`.
     // This happens when a member is torn off. In that case calls to the
     // function use the name `call`, and we must be able to handle every
@@ -221,7 +237,7 @@
 
     // Only instance members (not static methods) need stubs.
     if (member.isInstanceMember) {
-      selectors = _codegenWorldBuilder.invocationsByName(member.name);
+      liveSelectors = _codegenWorldBuilder.invocationsByName(member.name);
     }
 
     if (canTearOff) {
@@ -230,13 +246,14 @@
     }
 
     assert(emptySelectorSet.isEmpty);
-    if (selectors == null) selectors = const <Selector, SelectorConstraints>{};
+    if (liveSelectors == null)
+      liveSelectors = const <Selector, SelectorConstraints>{};
     if (callSelectors == null)
       callSelectors = const <Selector, SelectorConstraints>{};
 
     List<ParameterStubMethod> stubs = <ParameterStubMethod>[];
 
-    if (selectors.isEmpty && callSelectors.isEmpty) {
+    if (liveSelectors.isEmpty && callSelectors.isEmpty) {
       return stubs;
     }
 
@@ -248,7 +265,7 @@
     Set<Selector> renamedCallSelectors =
         callSelectors.isEmpty ? emptySelectorSet : new Set<Selector>();
 
-    Set<Selector> untypedSelectors = new Set<Selector>();
+    Set<Selector> stubSelectors = new Set<Selector>();
 
     // Start with the callSelectors since they imply the generation of the
     // non-call version.
@@ -261,7 +278,7 @@
         continue;
       }
 
-      if (untypedSelectors.add(renamedSelector)) {
+      if (stubSelectors.add(renamedSelector)) {
         ParameterStubMethod stub =
             generateParameterStub(member, renamedSelector, selector);
         if (stub != null) {
@@ -273,14 +290,14 @@
     // Now run through the actual member selectors (eg. `foo$2(x, y)` and not
     // `call$2(x, y)`. Some of them have already been generated because of the
     // call-selectors (and they are in the renamedCallSelectors set.
-    for (Selector selector in selectors.keys) {
+    for (Selector selector in liveSelectors.keys) {
       if (renamedCallSelectors.contains(selector)) continue;
       if (!selector.appliesUnnamed(member)) continue;
-      if (!selectors[selector].applies(member, selector, _closedWorld)) {
+      if (!liveSelectors[selector].applies(member, selector, _closedWorld)) {
         continue;
       }
 
-      if (untypedSelectors.add(selector)) {
+      if (stubSelectors.add(selector)) {
         ParameterStubMethod stub =
             generateParameterStub(member, selector, null);
         if (stub != null) {
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 4a14cc2..33b9496 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
@@ -844,7 +844,8 @@
   }
 
   bool _methodNeedsStubs(FunctionEntity method) {
-    return method.parameterStructure.optionalParameters != 0;
+    return method.parameterStructure.optionalParameters != 0 ||
+        method.parameterStructure.typeParameters != 0;
   }
 
   bool _methodCanBeReflected(FunctionEntity method) {
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 9828718..10308c1 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -312,7 +312,7 @@
       // TODO(karlklose): move the computation of these checks to
       // RuntimeTypeInformation.
       while (superclass != null) {
-        if (_rtiNeed.classNeedsRti(superclass)) {
+        if (_rtiNeed.classNeedsTypeArguments(superclass)) {
           generateSubstitution(superclass, emitNull: true);
           generated.add(superclass);
         }
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 13cfaef..0214083 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
@@ -705,7 +705,7 @@
         return method.needsTearOff || method.parameterStubs.isEmpty;
       }
       return true;
-    });
+    }());
     jsMethods[method.name] = method.code;
 
     return jsMethods;
@@ -1256,32 +1256,6 @@
 
     List<js.Property> globals = <js.Property>[];
 
-    js.ArrayInitializer fragmentUris(List<Fragment> fragments) {
-      return js.stringArray(fragments.map((Fragment fragment) =>
-          "${fragment.outputFileName}.${ModelEmitter.deferredExtension}"));
-    }
-
-    js.ArrayInitializer fragmentHashes(List<Fragment> fragments) {
-      return new js.ArrayInitializer(fragments
-          .map((fragment) => deferredLoadHashes[fragment])
-          .toList(growable: false));
-    }
-
-    List<js.Property> uris = new List<js.Property>(loadMap.length);
-    List<js.Property> hashes = new List<js.Property>(loadMap.length);
-    int count = 0;
-    loadMap.forEach((String loadId, List<Fragment> fragmentList) {
-      uris[count] =
-          new js.Property(js.string(loadId), fragmentUris(fragmentList));
-      hashes[count] =
-          new js.Property(js.string(loadId), fragmentHashes(fragmentList));
-      count++;
-    });
-
-    globals.add(new js.Property(
-        js.string(DEFERRED_LIBRARY_URIS), new js.ObjectInitializer(uris)));
-    globals.add(new js.Property(
-        js.string(DEFERRED_LIBRARY_HASHES), new js.ObjectInitializer(hashes)));
     globals.add(new js.Property(
         js.string(DEFERRED_INITIALIZED), js.js("Object.create(null)")));
 
@@ -1316,9 +1290,51 @@
     globals.add(new js.Property(
         js.string(INITIALIZE_LOADED_HUNK), initializeLoadedHunkFunction));
 
+    createDeferredLoadingData(loadMap, deferredLoadHashes,
+        (js.Expression map, js.Expression uris, js.Expression hashes) {
+      globals.add(new js.Property(js.string(DEFERRED_LIBRARY_PARTS), map));
+      globals.add(new js.Property(js.string(DEFERRED_PART_URIS), uris));
+      globals.add(new js.Property(js.string(DEFERRED_PART_HASHES), hashes));
+    });
+
     return globals;
   }
 
+  // Create data used for loading and initializing the hunks for a deferred
+  // import. There are three parts: a map from loadId to list of parts, where
+  // parts are represented as an index; an array of uris indexed by part; and an
+  // array of hashes indexed by part.
+  static void createDeferredLoadingData(
+      Map<String, List<Fragment>> loadMap,
+      Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes,
+      void finish(
+          js.Expression map, js.Expression uris, js.Expression hashes)) {
+    Map<Fragment, int> fragmentIndexes = <Fragment, int>{};
+    List<String> fragmentUris = <String>[];
+    List<js.Expression> fragmentHashes = <js.Expression>[];
+
+    List<js.Property> libraryPartsMapEntries = <js.Property>[];
+
+    loadMap.forEach((String loadId, List<Fragment> fragmentList) {
+      List<js.Expression> indexes = <js.Expression>[];
+      for (Fragment fragment in fragmentList) {
+        int index = fragmentIndexes[fragment];
+        if (index == null) {
+          index = fragmentIndexes[fragment] = fragmentIndexes.length;
+          fragmentUris.add(
+              "${fragment.outputFileName}.${ModelEmitter.deferredExtension}");
+          fragmentHashes.add(deferredLoadHashes[fragment]);
+        }
+        indexes.add(js.number(index));
+      }
+      libraryPartsMapEntries.add(
+          new js.Property(js.string(loadId), new js.ArrayInitializer(indexes)));
+    });
+
+    finish(new js.ObjectInitializer(libraryPartsMapEntries),
+        js.stringArray(fragmentUris), new js.ArrayInitializer(fragmentHashes));
+  }
+
   /// Emits the [MANGLED_GLOBAL_NAMES] embedded global.
   ///
   /// This global maps minified names for selected classes (some important
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 9f50a9b..86f5d3d 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
@@ -13,8 +13,9 @@
         CLASS_ID_EXTRACTOR,
         CREATE_NEW_ISOLATE,
         DEFERRED_INITIALIZED,
-        DEFERRED_LIBRARY_URIS,
-        DEFERRED_LIBRARY_HASHES,
+        DEFERRED_LIBRARY_PARTS,
+        DEFERRED_PART_URIS,
+        DEFERRED_PART_HASHES,
         GET_TYPE_FROM_NAME,
         INITIALIZE_EMPTY_INSTANCE,
         INITIALIZE_LOADED_HUNK,
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index b34cd47..4d20f75 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -202,8 +202,8 @@
         info, node.parent, localFunctionsNeedingRti, classesNeedingRti, member);
     KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
     KernelClosureClassInfo closureClassInfo =
-        closedWorldBuilder.buildClosureClass(member, node, member.library,
-            boxedVariables, info, node.location, localsMap);
+        closedWorldBuilder.buildClosureClass(
+            member, node, member.library, boxedVariables, info, localsMap);
 
     // We want the original declaration where that function is used to point
     // to the correct closure class.
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 0ee5d63..55bda1b 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -265,29 +265,44 @@
         map.toBackendMemberSet(closedWorld.processedMembers);
 
     RuntimeTypesNeedImpl kernelRtiNeed = closedWorld.rtiNeed;
-    Set<ir.Node> localFunctionsNodes = new Set<ir.Node>();
+    Set<ir.Node> localFunctionsNodesNeedingSignature = new Set<ir.Node>();
     for (KLocalFunction localFunction
-        in kernelRtiNeed.localFunctionsNeedingRti) {
-      localFunctionsNodes.add(localFunction.node);
+        in kernelRtiNeed.localFunctionsNeedingSignature) {
+      localFunctionsNodesNeedingSignature.add(localFunction.node);
+    }
+    Set<ir.Node> localFunctionsNodesNeedingTypeArguments = new Set<ir.Node>();
+    for (KLocalFunction localFunction
+        in kernelRtiNeed.localFunctionsNeedingTypeArguments) {
+      localFunctionsNodesNeedingTypeArguments.add(localFunction.node);
     }
 
-    var classesNeedingRti =
-        map.toBackendClassSet(kernelRtiNeed.classesNeedingRti);
+    Set<ClassEntity> classesNeedingTypeArguments =
+        map.toBackendClassSet(kernelRtiNeed.classesNeedingTypeArguments);
     Iterable<FunctionEntity> callMethods =
         _closureConversionTask.createClosureEntities(
             this,
             map.toBackendMemberMap(closureModels, identity),
-            localFunctionsNodes,
-            classesNeedingRti);
+            localFunctionsNodesNeedingSignature,
+            classesNeedingTypeArguments);
 
-    List<FunctionEntity> callMethodsNeedingRti = <FunctionEntity>[];
-    for (ir.Node node in localFunctionsNodes) {
-      callMethodsNeedingRti
+    List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
+    for (ir.Node node in localFunctionsNodesNeedingSignature) {
+      callMethodsNeedingSignature
+          .add(_closureConversionTask.getClosureInfo(node).callMethod);
+    }
+    List<FunctionEntity> callMethodsNeedingTypeArguments = <FunctionEntity>[];
+    for (ir.Node node in localFunctionsNodesNeedingTypeArguments) {
+      callMethodsNeedingTypeArguments
           .add(_closureConversionTask.getClosureInfo(node).callMethod);
     }
 
-    RuntimeTypesNeed rtiNeed = _convertRuntimeTypesNeed(map, backendUsage,
-        kernelRtiNeed, callMethodsNeedingRti, classesNeedingRti);
+    RuntimeTypesNeed rtiNeed = _convertRuntimeTypesNeed(
+        map,
+        backendUsage,
+        kernelRtiNeed,
+        callMethodsNeedingSignature,
+        callMethodsNeedingTypeArguments,
+        classesNeedingTypeArguments);
 
     NoSuchMethodDataImpl oldNoSuchMethodData = closedWorld.noSuchMethodData;
     NoSuchMethodData noSuchMethodData = new NoSuchMethodDataImpl(
@@ -457,18 +472,24 @@
       JsToFrontendMap map,
       BackendUsage backendUsage,
       RuntimeTypesNeedImpl rtiNeed,
-      List<FunctionEntity> callMethodsNeedingRti,
-      Set<ClassEntity> classesNeedingRti) {
-    Set<FunctionEntity> methodsNeedingRti =
-        map.toBackendFunctionSet(rtiNeed.methodsNeedingRti);
-    methodsNeedingRti.addAll(callMethodsNeedingRti);
+      List<FunctionEntity> callMethodsNeedingSignature,
+      List<FunctionEntity> callMethodsNeedingTypeArguments,
+      Set<ClassEntity> classesNeedingTypeArguments) {
+    Set<FunctionEntity> methodsNeedingSignature =
+        map.toBackendFunctionSet(rtiNeed.methodsNeedingSignature);
+    methodsNeedingSignature.addAll(callMethodsNeedingSignature);
+    Set<FunctionEntity> methodsNeedingTypeArguments =
+        map.toBackendFunctionSet(rtiNeed.methodsNeedingTypeArguments);
+    methodsNeedingTypeArguments.addAll(callMethodsNeedingTypeArguments);
     Set<ClassEntity> classesUsingTypeVariableExpression =
         map.toBackendClassSet(rtiNeed.classesUsingTypeVariableExpression);
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
         backendUsage,
-        classesNeedingRti,
-        methodsNeedingRti,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        null,
         null,
         classesUsingTypeVariableExpression);
   }
@@ -481,7 +502,6 @@
       JLibrary enclosingLibrary,
       Map<Local, JRecordField> boxedVariables,
       KernelScopeInfo info,
-      ir.Location location,
       KernelToLocalsMap localsMap) {
     ClassEntity superclass = _commonElements.closureClass;
 
@@ -491,7 +511,6 @@
         enclosingLibrary,
         boxedVariables,
         info,
-        location,
         localsMap,
         new InterfaceType(superclass, const []));
 
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index 4e09ba2..48a03a8 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -299,9 +299,10 @@
   @override
   visitSwitchStatement(ir.SwitchStatement node) {
     node.expression.accept(this);
-    if (node.cases.isNotEmpty && !node.cases.last.isDefault) {
-      // Ensure that [node] has a corresponding target. We generate a break in
-      // case of a missing break on the last case if it isn't a default case.
+    if (node.cases.isNotEmpty) {
+      // Ensure that [node] has a corresponding target. We generate a break if:
+      //   - a switch case calls a function that always throws
+      //   - there's a missing break on the last case if it isn't a default case
       _getJumpTarget(node);
     }
     super.visitSwitchStatement(node);
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index f9d46c3..0117c71 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -145,16 +145,16 @@
       constants.add(elementMap.getConstantValue(node));
 
   @override
-  void visitIntLiteral(ir.IntLiteral literal) {}
+  void visitIntLiteral(ir.IntLiteral literal) => add(literal);
 
   @override
-  void visitDoubleLiteral(ir.DoubleLiteral literal) {}
+  void visitDoubleLiteral(ir.DoubleLiteral literal) => add(literal);
 
   @override
-  void visitBoolLiteral(ir.BoolLiteral literal) {}
+  void visitBoolLiteral(ir.BoolLiteral literal) => add(literal);
 
   @override
-  void visitStringLiteral(ir.StringLiteral literal) {}
+  void visitStringLiteral(ir.StringLiteral literal) => add(literal);
 
   @override
   void visitSymbolLiteral(ir.SymbolLiteral literal) => add(literal);
@@ -190,16 +190,6 @@
   }
 
   @override
-  void visitFunctionDeclaration(ir.FunctionDeclaration node) {
-    // Do not recurse - closures are visited separately.
-  }
-
-  @override
-  void visitFunctionExpression(ir.FunctionExpression node) {
-    // Do not recurse - closures are visited separately.
-  }
-
-  @override
   void visitTypeLiteral(ir.TypeLiteral node) {
     if (node.type is! ir.TypeParameterType) add(node);
   }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index b01eea5..c212e70 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -810,8 +810,16 @@
   Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{};
   Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{};
   Map<ir.Typedef, IndexedTypedef> _typedefMap = <ir.Typedef, IndexedTypedef>{};
-  Map<ir.TypeParameter, IndexedTypeVariable> _typeVariableMap =
-      <ir.TypeParameter, IndexedTypeVariable>{};
+
+  /// Map from [ir.TypeParameter] nodes to the corresponding
+  /// [TypeVariableEntity].
+  ///
+  /// Normally the type variables are [IndexedTypeVariable]s, but for type
+  /// parameters on local function (in the frontend) these are _not_ since
+  /// their type declaration is neither a class nor a member. In the backend,
+  /// these type parameters belong to the call-method and are therefore indexed.
+  Map<ir.TypeParameter, TypeVariableEntity> _typeVariableMap =
+      <ir.TypeParameter, TypeVariableEntity>{};
   Map<ir.Member, IndexedConstructor> _constructorMap =
       <ir.Member, IndexedConstructor>{};
   Map<ir.Procedure, IndexedFunction> _methodMap =
@@ -822,6 +830,7 @@
   Name getName(ir.Name node);
   FunctionType getFunctionType(ir.FunctionNode node);
   MemberEntity getMember(ir.Member node);
+  Entity getClosure(ir.FunctionDeclaration node);
 
   Iterable<LibraryEntity> get _libraryList {
     if (_env.length != _libraryMap.length) {
@@ -890,8 +899,7 @@
           ir.Constructor constructor = func.parent;
           ir.Class cls = constructor.enclosingClass;
           return _getTypeVariable(cls.typeParameters[index]);
-        }
-        if (func.parent is ir.Procedure) {
+        } else if (func.parent is ir.Procedure) {
           ir.Procedure procedure = func.parent;
           if (procedure.kind == ir.ProcedureKind.Factory) {
             ir.Class cls = procedure.enclosingClass;
@@ -1162,6 +1170,11 @@
     return true;
   }
 
+  DartType _getTypeVariableBound(TypeVariableEntity typeVariable) {
+    if (typeVariable is KLocalTypeVariable) return typeVariable.bound;
+    return super._getTypeVariableBound(typeVariable);
+  }
+
   @override
   void _forEachNestedClosure(
       MemberEntity member, void f(FunctionEntity closure)) {
@@ -1206,12 +1219,18 @@
   }
 
   @override
+  Entity getClosure(ir.FunctionDeclaration node) {
+    return getLocalFunction(node);
+  }
+
+  @override
   Local getLocalFunction(ir.TreeNode node) {
     assert(
         node is ir.FunctionDeclaration || node is ir.FunctionExpression,
         failedAt(
             CURRENT_ELEMENT_SPANNABLE, 'Invalid local function node: $node'));
-    return _localFunctionMap.putIfAbsent(node, () {
+    KLocalFunction localFunction = _localFunctionMap[node];
+    if (localFunction == null) {
       MemberEntity memberContext;
       Entity executableContext;
       ir.TreeNode parent = node.parent;
@@ -1230,16 +1249,25 @@
         parent = parent.parent;
       }
       String name;
-      FunctionType functionType;
+      ir.FunctionNode function;
       if (node is ir.FunctionDeclaration) {
         name = node.variable.name;
-        functionType = getFunctionType(node.function);
+        function = node.function;
       } else if (node is ir.FunctionExpression) {
-        functionType = getFunctionType(node.function);
+        function = node.function;
       }
-      return new KLocalFunction(
-          name, memberContext, executableContext, functionType, node);
-    });
+      localFunction = _localFunctionMap[node] =
+          new KLocalFunction(name, memberContext, executableContext, node);
+      int index = 0;
+      for (ir.TypeParameter typeParameter in function.typeParameters) {
+        KLocalTypeVariable typeVariable = _typeVariableMap[typeParameter] =
+            new KLocalTypeVariable(localFunction, typeParameter.name, index);
+        typeVariable.bound = getDartType(typeParameter.bound);
+        index++;
+      }
+      localFunction.functionType = getFunctionType(function);
+    }
+    return localFunction;
   }
 
   bool _implementsFunction(IndexedClass cls) {
@@ -2045,9 +2073,14 @@
     return _backend._members.getEntity(member.memberIndex);
   }
 
-  TypeVariableEntity toBackendTypeVariable(
-      covariant IndexedTypeVariable typeVariable) {
-    return _backend._typeVariables.getEntity(typeVariable.typeVariableIndex);
+  TypeVariableEntity toBackendTypeVariable(TypeVariableEntity typeVariable) {
+    if (typeVariable is KLocalTypeVariable) {
+      failedAt(
+          typeVariable, "Local function type variables are not supported.");
+    }
+    IndexedTypeVariable indexedTypeVariable = typeVariable;
+    return _backend._typeVariables
+        .getEntity(indexedTypeVariable.typeVariableIndex);
   }
 }
 
@@ -2133,9 +2166,11 @@
       if (oldTypeVariable.typeDeclaration is ClassEntity) {
         IndexedClass cls = oldTypeVariable.typeDeclaration;
         newTypeDeclaration = _classes.getEntity(cls.classIndex);
-      } else {
+      } else if (oldTypeVariable.typeDeclaration is MemberEntity) {
         IndexedMember member = oldTypeVariable.typeDeclaration;
         newTypeDeclaration = _members.getEntity(member.memberIndex);
+      } else {
+        assert(oldTypeVariable.typeDeclaration is Local);
       }
       IndexedTypeVariable newTypeVariable = createTypeVariable(
           newTypeDeclaration, oldTypeVariable.name, oldTypeVariable.index);
@@ -2147,6 +2182,11 @@
   }
 
   @override
+  Entity getClosure(ir.FunctionDeclaration node) {
+    throw new UnsupportedError('JsKernelToElementMap.getClosure');
+  }
+
+  @override
   void _forEachNestedClosure(
       MemberEntity member, void f(FunctionEntity closure)) {
     assert(checkFamily(member));
@@ -2358,7 +2398,6 @@
       JLibrary enclosingLibrary,
       Map<Local, JRecordField> recordFieldsVisibleInScope,
       KernelScopeInfo info,
-      ir.Location location,
       KernelToLocalsMap localsMap,
       InterfaceType supertype) {
     InterfaceType memberThisType = member.enclosingClass != null
@@ -2418,6 +2457,13 @@
     _nestedClosureMap
         .putIfAbsent(member, () => <FunctionEntity>[])
         .add(callMethod);
+    int index = 0;
+    for (ir.TypeParameter typeParameter in node.typeParameters) {
+      _typeVariableMap[typeParameter] = _typeVariables.register(
+          createTypeVariable(callMethod, typeParameter.name, index),
+          new TypeVariableData(typeParameter));
+      index++;
+    }
     _members.register<IndexedFunction, FunctionData>(
         callMethod,
         new ClosureFunctionData(
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index 6f14b6e..3b18fbc 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.dart
@@ -278,12 +278,24 @@
   final String name;
   final MemberEntity memberContext;
   final Entity executableContext;
-  final FunctionType functionType;
   final ir.Node node;
+  FunctionType functionType;
 
-  KLocalFunction(this.name, this.memberContext, this.executableContext,
-      this.functionType, this.node);
+  KLocalFunction(
+      this.name, this.memberContext, this.executableContext, this.node);
 
   String toString() => '${kElementPrefix}local_function'
       '(${memberContext.name}.${name ?? '<anonymous>'})';
 }
+
+class KLocalTypeVariable implements TypeVariableEntity {
+  final Entity typeDeclaration;
+  final String name;
+  final int index;
+  DartType bound;
+
+  KLocalTypeVariable(this.typeDeclaration, this.name, this.index);
+
+  String toString() =>
+      '${kElementPrefix}local_type_variable(${typeDeclaration.name}.$name)';
+}
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 825c81f..2146eba 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -134,8 +134,10 @@
   }
 
   RuntimeTypesNeedBuilder createRuntimeTypesNeedBuilder() {
-    return _runtimeTypesNeedBuilder ??=
-        new RuntimeTypesNeedBuilderImpl(elementEnvironment, _elementMap.types);
+    return _runtimeTypesNeedBuilder ??= _options.disableRtiOptimization
+        ? const TrivialRuntimeTypesNeedBuilder()
+        : new RuntimeTypesNeedBuilderImpl(
+            elementEnvironment, _elementMap.types);
   }
 
   RuntimeTypesNeedBuilder get runtimeTypesNeedBuilderForTesting =>
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 73650f6..26c7d71 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -128,6 +128,9 @@
   /// Whether to disable global type inference.
   final bool disableTypeInference;
 
+  /// Whether to disable optimization for need runtime type information.
+  final bool disableRtiOptimization;
+
   /// Whether to emit a .json file with a summary of the information used by the
   /// compiler during optimization. This includes resolution details,
   /// dependencies between elements, results of type inference, and the output
@@ -303,6 +306,8 @@
             _extractOptionalCsvOption(options, Flags.showPackageWarnings),
         disableInlining: _hasOption(options, Flags.disableInlining),
         disableTypeInference: _hasOption(options, Flags.disableTypeInference),
+        disableRtiOptimization:
+            _hasOption(options, Flags.disableRtiOptimization),
         dumpInfo: _hasOption(options, Flags.dumpInfo),
         enableExperimentalMirrors:
             _hasOption(options, Flags.enableExperimentalMirrors),
@@ -374,6 +379,7 @@
       List<String> shownPackageWarnings: null,
       bool disableInlining: false,
       bool disableTypeInference: false,
+      bool disableRtiOptimization: false,
       bool dumpInfo: false,
       bool enableAssertMessage: true,
       bool enableExperimentalMirrors: false,
@@ -454,6 +460,7 @@
         shownPackageWarnings: shownPackageWarnings,
         disableInlining: disableInlining,
         disableTypeInference: disableTypeInference,
+        disableRtiOptimization: disableRtiOptimization,
         dumpInfo: dumpInfo,
         enableAssertMessage: enableAssertMessage,
         enableExperimentalMirrors: enableExperimentalMirrors,
@@ -508,6 +515,7 @@
       List<String> shownPackageWarnings: null,
       this.disableInlining: false,
       this.disableTypeInference: false,
+      this.disableRtiOptimization: false,
       this.dumpInfo: false,
       this.enableAssertMessage: true,
       this.enableExperimentalMirrors: false,
@@ -568,6 +576,7 @@
       List<String> shownPackageWarnings,
       disableInlining,
       disableTypeInference,
+      disableRtiOptimization,
       dumpInfo,
       enableAssertMessage,
       enableExperimentalMirrors,
@@ -630,6 +639,8 @@
         disableInlining: disableInlining ?? options.disableInlining,
         disableTypeInference:
             disableTypeInference ?? options.disableTypeInference,
+        disableRtiOptimization:
+            disableRtiOptimization ?? options.disableRtiOptimization,
         dumpInfo: dumpInfo ?? options.dumpInfo,
         enableAssertMessage: enableAssertMessage ?? options.enableAssertMessage,
         enableExperimentalMirrors:
diff --git a/pkg/compiler/lib/src/resolution/member_impl.dart b/pkg/compiler/lib/src/resolution/member_impl.dart
index ac37087..e454c83 100644
--- a/pkg/compiler/lib/src/resolution/member_impl.dart
+++ b/pkg/compiler/lib/src/resolution/member_impl.dart
@@ -149,7 +149,7 @@
       // substituted into the context of [newInstance] in the created member.
       ClassElement contextClass = DartTypes.getClassContext(instance);
       return contextClass == null || contextClass == newInstance.element;
-    },
+    }(),
         failedAt(
             declaration.element,
             "Context mismatch: Context class "
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index d939a65..0cc75e9 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -1131,6 +1131,13 @@
       sendStructure = new IsStructure(type);
     }
 
+    // GENERIC_METHODS: Method type variables are not reified so we must warn
+    // about the error which will occur at runtime.
+    if (type is MethodTypeVariableType) {
+      reporter.reportWarningMessage(
+          node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+    }
+
     registry.registerTypeUse(new TypeUse.isCheck(type));
     registry.registerSendStructure(node, sendStructure);
     return const NoneResult();
@@ -1145,6 +1152,13 @@
     ResolutionDartType type =
         resolveTypeAnnotation(typeNode, registerCheckedModeCheck: false);
 
+    // GENERIC_METHODS: Method type variables are not reified, so we must inform
+    // the developer about the potentially bug-inducing semantics.
+    if (type is MethodTypeVariableType) {
+      reporter.reportHintMessage(
+          node, MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC);
+    }
+
     registry.registerTypeUse(new TypeUse.asCast(type));
     registry.registerSendStructure(node, new AsStructure(type));
     return const NoneResult();
@@ -1913,6 +1927,12 @@
       // TODO(johnniwinther): Clean up registration of elements and selectors
       // for this case.
     } else {
+      // GENERIC_METHODS: Method type variables are not reified so we must warn
+      // about the error which will occur at runtime.
+      if (element.type is MethodTypeVariableType) {
+        reporter.reportWarningMessage(
+            node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+      }
       semantics = new StaticAccess.typeParameterTypeLiteral(element);
     }
 
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index c245e30..c036637 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -602,7 +602,8 @@
             currentlyResolvedTypeDeclaration;
         currentlyResolvedTypeDeclaration = element;
         var result = resolveTypeDeclaration();
-        if (previousResolvedTypeDeclaration == null) {
+        currentlyResolvedTypeDeclaration = previousResolvedTypeDeclaration;
+        if (currentlyResolvedTypeDeclaration == null) {
           do {
             while (!pendingClassesToBeResolved.isEmpty) {
               pendingClassesToBeResolved
@@ -617,7 +618,6 @@
           assert(pendingClassesToBeResolved.isEmpty);
           assert(pendingClassesToBePostProcessed.isEmpty);
         }
-        currentlyResolvedTypeDeclaration = previousResolvedTypeDeclaration;
         return result;
       });
     });
diff --git a/pkg/compiler/lib/src/resolution/resolution_strategy.dart b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
index fd5efea..8d64db4 100644
--- a/pkg/compiler/lib/src/resolution/resolution_strategy.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
@@ -129,8 +129,9 @@
       new MirrorsResolutionAnalysisImpl(backend, _compiler.resolution);
 
   RuntimeTypesNeedBuilder createRuntimeTypesNeedBuilder() {
-    return _runtimeTypesNeedBuilder ??=
-        new ResolutionRuntimeTypesNeedBuilderImpl(
+    return _runtimeTypesNeedBuilder ??= _compiler.options.disableRtiOptimization
+        ? const TrivialRuntimeTypesNeedBuilder()
+        : new ResolutionRuntimeTypesNeedBuilderImpl(
             elementEnvironment, dartTypes);
   }
 
diff --git a/pkg/compiler/lib/src/resolution/tree_elements.dart b/pkg/compiler/lib/src/resolution/tree_elements.dart
index c68b64d..f2f43be 100644
--- a/pkg/compiler/lib/src/resolution/tree_elements.dart
+++ b/pkg/compiler/lib/src/resolution/tree_elements.dart
@@ -139,7 +139,7 @@
         return analyzedElement.implementationLibrary.isPatch;
       }
       return true;
-    }, failedAt(node));
+    }(), failedAt(node));
     // TODO(ahe): Investigate why the invariant below doesn't hold.
     // assert(
     //     getTreeElement(node) == element ||
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 0c2ea28..bca2447 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -873,7 +873,7 @@
 
     ClassElement enclosing = function.enclosingClass;
     if ((function.isConstructor || function.isGenerativeConstructorBody) &&
-        rtiNeed.classNeedsRti(enclosing)) {
+        rtiNeed.classNeedsTypeArguments(enclosing)) {
       enclosing.typeVariables.forEach((_typeVariable) {
         ResolutionTypeVariableType typeVariable = _typeVariable;
         HInstruction argument = compiledArguments[argumentIndex++];
@@ -961,7 +961,7 @@
         ClassElement enclosingClass = member.enclosingClass;
         if (!includedClasses.add(enclosingClass)) return;
 
-        if (rtiNeed.classNeedsRti(enclosingClass)) {
+        if (rtiNeed.classNeedsTypeArguments(enclosingClass)) {
           // If [enclosingClass] needs RTI, we have to give a value to its
           // type parameters.
           // For a super constructor call, the type is the supertype of
@@ -1402,7 +1402,7 @@
 
       // Type variables arguments must come after the box (if there is one).
       ClassElement currentClass = constructor.enclosingClass;
-      if (rtiNeed.classNeedsRti(currentClass)) {
+      if (rtiNeed.classNeedsTypeArguments(currentClass)) {
         // If [currentClass] needs RTI, we add the type variables as
         // parameters of the generative constructor body.
         currentClass.typeVariables.forEach((_argument) {
@@ -1473,7 +1473,7 @@
     // may contain references to type variables.
     ClassElement cls = element.enclosingClass;
     if ((element.isConstructor || element.isGenerativeConstructorBody) &&
-        rtiNeed.classNeedsRti(cls)) {
+        rtiNeed.classNeedsTypeArguments(cls)) {
       cls.typeVariables.forEach((_typeVariable) {
         ResolutionTypeVariableType typeVariable = _typeVariable;
         HParameterValue param =
@@ -3383,7 +3383,7 @@
 
   HInstruction handleListConstructor(ResolutionInterfaceType type,
       HInstruction newObject, SourceInformation sourceInformation) {
-    if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) {
+    if (!rtiNeed.classNeedsTypeArguments(type.element) || type.treatAsRaw) {
       return newObject;
     }
     List<HInstruction> inputs = <HInstruction>[];
@@ -3623,7 +3623,7 @@
     // not know about the type argument. Therefore we special case
     // this constructor to have the setRuntimeTypeInfo called where
     // the 'new' is done.
-    if (rtiNeed.classNeedsRti(commonElements.listClass) &&
+    if (rtiNeed.classNeedsTypeArguments(commonElements.listClass) &&
         (isFixedListConstructorCall ||
             isGrowableListConstructorCall ||
             isJSArrayTypedConstructor)) {
@@ -3645,7 +3645,7 @@
   void potentiallyAddTypeArguments(List<HInstruction> inputs, ClassElement cls,
       ResolutionInterfaceType expectedType,
       {SourceInformation sourceInformation}) {
-    if (!rtiNeed.classNeedsRti(cls)) return;
+    if (!rtiNeed.classNeedsTypeArguments(cls)) return;
     assert(cls.typeVariables.length == expectedType.typeArguments.length);
     expectedType.typeArguments.forEach((ResolutionDartType argument) {
       inputs.add(typeBuilder.analyzeTypeArgument(argument, sourceElement,
@@ -5247,7 +5247,7 @@
     }
 
     ClassElement targetClass = targetConstructor.enclosingClass;
-    if (rtiNeed.classNeedsRti(targetClass)) {
+    if (rtiNeed.classNeedsTypeArguments(targetClass)) {
       ClassElement cls = redirectingConstructor.enclosingClass;
       ResolutionDartType targetType =
           redirectingConstructor.computeEffectiveTargetType(cls.thisType);
@@ -5367,7 +5367,7 @@
       HInstruction object, ast.Node node, SourceInformation sourceInformation) {
     ResolutionInterfaceType type =
         localsHandler.substInContext(elements.getType(node));
-    if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) {
+    if (!rtiNeed.classNeedsTypeArguments(type.element) || type.treatAsRaw) {
       return object;
     }
     List<HInstruction> arguments = <HInstruction>[];
@@ -5841,7 +5841,8 @@
     ClassElement cls = listConstructor.enclosingClass;
 
     MethodElement createFunction = listConstructor;
-    if (expectedType is ResolutionInterfaceType && rtiNeed.classNeedsRti(cls)) {
+    if (expectedType is ResolutionInterfaceType &&
+        rtiNeed.classNeedsTypeArguments(cls)) {
       List<HInstruction> typeInputs = <HInstruction>[];
       expectedType.typeArguments.forEach((ResolutionDartType argument) {
         typeInputs
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index aae6afd..424bc55 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -356,11 +356,11 @@
     if (thisType.typeArguments.isEmpty) {
       return;
     }
-    bool needsRti = rtiNeed.classNeedsRti(cls);
+    bool needsTypeArguments = rtiNeed.classNeedsTypeArguments(cls);
     thisType.typeArguments.forEach((DartType _typeVariable) {
       TypeVariableType typeVariableType = _typeVariable;
       HInstruction param;
-      if (needsRti) {
+      if (needsTypeArguments) {
         param = addParameter(typeVariableType.element, commonMasks.nonNullType);
       } else {
         // Unused, so bind to `dynamic`.
@@ -385,10 +385,10 @@
     if (typeVariables.isEmpty) {
       return;
     }
-    bool needsRti = rtiNeed.methodNeedsGenericRti(member);
+    bool needsTypeArguments = rtiNeed.methodNeedsTypeArguments(member);
     typeVariables.forEach((TypeVariableType typeVariableType) {
       HInstruction param;
-      if (needsRti) {
+      if (needsTypeArguments) {
         param = addParameter(typeVariableType.element, commonMasks.nonNullType);
       } else {
         // Unused, so bind to `dynamic`.
@@ -556,7 +556,8 @@
 
         // Pass type arguments.
         ClassEntity inlinedConstructorClass = inlinedConstructor.enclosingClass;
-        if (closedWorld.rtiNeed.classNeedsRti(inlinedConstructorClass)) {
+        if (closedWorld.rtiNeed
+            .classNeedsTypeArguments(inlinedConstructorClass)) {
           InterfaceType thisType = _elementMap.elementEnvironment
               .getThisType(inlinedConstructorClass);
           for (DartType typeVariable in thisType.typeArguments) {
@@ -620,7 +621,7 @@
   void _collectFieldValues(ir.Class clazz, ConstructorData constructorData) {
     void ensureTypeVariablesForInitializers(ClassEntity enclosingClass) {
       if (!constructorData.includedClasses.add(enclosingClass)) return;
-      if (rtiNeed.classNeedsRti(enclosingClass)) {
+      if (rtiNeed.classNeedsTypeArguments(enclosingClass)) {
         // If [enclosingClass] needs RTI, we have to give a value to its type
         // parameters. For a super constructor call, the type is the supertype
         // of current class. For a redirecting constructor, the type is the
@@ -2378,7 +2379,7 @@
   /// Set the runtime type information if necessary.
   HInstruction _setListRuntimeTypeInfoIfNeeded(HInstruction object,
       InterfaceType type, SourceInformation sourceInformation) {
-    if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) {
+    if (!rtiNeed.classNeedsTypeArguments(type.element) || type.treatAsRaw) {
       return object;
     }
     List<HInstruction> arguments = <HInstruction>[];
@@ -2457,7 +2458,7 @@
         _elementMap.getDartType(node.valueType)));
     ClassEntity cls = constructor.enclosingClass;
 
-    if (rtiNeed.classNeedsRti(cls)) {
+    if (rtiNeed.classNeedsTypeArguments(cls)) {
       List<HInstruction> typeInputs = <HInstruction>[];
       type.typeArguments.forEach((DartType argument) {
         typeInputs
@@ -2768,18 +2769,23 @@
   /// defaulted arguments, so (unlike static targets) we do not add the default
   /// values.
   List<HInstruction> _visitArgumentsForDynamicTarget(
-      Selector selector, ir.Arguments arguments) {
+      Selector selector, ir.Arguments arguments,
+      [SourceInformation sourceInformation]) {
     List<HInstruction> values = _visitPositionalArguments(arguments);
 
-    if (arguments.named.isEmpty) return values;
-
-    var namedValues = <String, HInstruction>{};
-    for (ir.NamedExpression argument in arguments.named) {
-      argument.value.accept(this);
-      namedValues[argument.name] = pop();
+    if (arguments.named.isNotEmpty) {
+      Map<String, HInstruction> namedValues = <String, HInstruction>{};
+      for (ir.NamedExpression argument in arguments.named) {
+        argument.value.accept(this);
+        namedValues[argument.name] = pop();
+      }
+      for (String name in selector.callStructure.getOrderedNamedArguments()) {
+        values.add(namedValues[name]);
+      }
     }
-    for (String name in selector.callStructure.getOrderedNamedArguments()) {
-      values.add(namedValues[name]);
+
+    if (selector.callStructure.typeArgumentCount > 0) {
+      _addTypeArguments(values, arguments, sourceInformation);
     }
 
     return values;
@@ -2919,7 +2925,8 @@
         ? _visitArgumentsForNativeStaticTarget(target.function, node.arguments)
         : _visitArgumentsForStaticTarget(
             target.function, node.arguments, sourceInformation,
-            addFunctionTypeArguments: rtiNeed.methodNeedsGenericRti(function));
+            addFunctionTypeArguments:
+                rtiNeed.methodNeedsTypeArguments(function));
 
     // Error in the arguments provided. Do not process further.
     if (arguments == null) {
@@ -3057,14 +3064,16 @@
       // TODO(sra): Instead of calling the identity-like factory constructor,
       // simply select the single argument.
       // Factory constructors take type parameters.
-      if (closedWorld.rtiNeed.classNeedsRti(function.enclosingClass)) {
+      if (closedWorld.rtiNeed
+          .classNeedsTypeArguments(function.enclosingClass)) {
         _addTypeArguments(arguments, invocation.arguments, sourceInformation);
       }
       _pushStaticInvocation(function, arguments, typeMask,
           sourceInformation: sourceInformation);
     } else {
       // Factory constructors take type parameters.
-      if (closedWorld.rtiNeed.classNeedsRti(function.enclosingClass)) {
+      if (closedWorld.rtiNeed
+          .classNeedsTypeArguments(function.enclosingClass)) {
         _addTypeArguments(arguments, invocation.arguments, sourceInformation);
       }
       instanceType = localsHandler.substInContext(instanceType);
@@ -3083,7 +3092,7 @@
       graph.allocatedFixedLists.add(newInstance);
     }
 
-    if (rtiNeed.classNeedsRti(commonElements.listClass) &&
+    if (rtiNeed.classNeedsTypeArguments(commonElements.listClass) &&
         (isFixedListConstructorCall ||
             isGrowableListConstructorCall ||
             isJSArrayTypedConstructor)) {
@@ -4078,7 +4087,7 @@
     if (commonElements.isSymbolConstructor(constructor)) {
       constructor = commonElements.symbolValidatedConstructor;
     }
-    if (closedWorld.rtiNeed.classNeedsRti(cls)) {
+    if (closedWorld.rtiNeed.classNeedsTypeArguments(cls)) {
       _addTypeArguments(arguments, node.arguments, sourceInformation);
     }
     addImplicitInstantiation(instanceType);
@@ -4558,7 +4567,9 @@
     List<String> selectorArgumentNames =
         selector.callStructure.getOrderedNamedArguments();
     List<HInstruction> compiledArguments = new List<HInstruction>(
-        parameterStructure.totalParameters + 1); // Plus one for receiver.
+        parameterStructure.totalParameters +
+            parameterStructure.typeParameters +
+            1); // Plus one for receiver.
 
     compiledArguments[0] = providedArguments[0]; // Receiver.
     int index = 1;
@@ -4602,6 +4613,24 @@
       }
       index++;
     });
+    if (rtiNeed.methodNeedsTypeArguments(function)) {
+      if (selector.callStructure.typeArgumentCount ==
+          parameterStructure.typeParameters) {
+        // Pass explicit type arguments.
+        for (int i = 0; i < parameterStructure.typeParameters; i++) {
+          compiledArguments[index] = providedArguments[index];
+          index++;
+        }
+      } else {
+        assert(selector.callStructure.typeArgumentCount == 0);
+        // Pass type variable bounds as type arguments.
+        for (int i = 0; i < parameterStructure.typeParameters; i++) {
+          // TODO(johnniwinther): Pass type variable bounds.
+          compiledArguments[index] = graph.addConstantNull(closedWorld);
+          index++;
+        }
+      }
+    }
     return compiledArguments;
   }
 
@@ -4662,7 +4691,7 @@
 
     ClassEntity enclosing = function.enclosingClass;
     if ((function.isConstructor || function is ConstructorBodyEntity) &&
-        rtiNeed.classNeedsRti(enclosing)) {
+        rtiNeed.classNeedsTypeArguments(enclosing)) {
       InterfaceType thisType =
           _elementMap.elementEnvironment.getThisType(enclosing);
       thisType.typeArguments.forEach((_typeVariable) {
@@ -4672,7 +4701,7 @@
             localsHandler.getTypeVariableAsLocal(typeVariable), argument);
       });
     }
-    if (rtiNeed.methodNeedsGenericRti(function) && options.strongMode) {
+    if (rtiNeed.methodNeedsTypeArguments(function) && options.strongMode) {
       for (TypeVariableType typeVariable in _elementMap.elementEnvironment
           .getFunctionTypeVariables(function)) {
         HInstruction argument = compiledArguments[argumentIndex++];
@@ -4680,7 +4709,12 @@
             localsHandler.getTypeVariableAsLocal(typeVariable), argument);
       }
     }
-    assert(argumentIndex == compiledArguments.length);
+    assert(
+        argumentIndex == compiledArguments.length,
+        failedAt(
+            function,
+            "Only ${argumentIndex} of ${compiledArguments.length} "
+            "arguments have been read from: ${compiledArguments}"));
 
     _returnType =
         _elementMap.elementEnvironment.getFunctionType(function).returnType;
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index 6d9a6ba..9abf34d 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -254,7 +254,7 @@
       List<HInstruction> rtiInputs,
       HInstruction newObject,
       SourceInformation sourceInformation) {
-    if (!rtiNeed.classNeedsRti(type.element)) {
+    if (!rtiNeed.classNeedsTypeArguments(type.element)) {
       return newObject;
     }
 
@@ -299,6 +299,8 @@
         return options.useContentSecurityPolicy;
       case 'IS_FULL_EMITTER':
         return !options.useStartupEmitter;
+      case 'STRONG_MODE':
+        return options.strongMode;
       default:
         return null;
     }
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 767e633..9c972af 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -492,9 +492,9 @@
         // TODO(ngeoffray): If the method has optional parameters,
         // we should pass the default values.
         ParameterStructure parameters = method.parameterStructure;
-        if (parameters.optionalParameters == 0 ||
-            parameters.requiredParameters + parameters.optionalParameters ==
-                node.selector.argumentCount) {
+        if (parameters.totalParameters == node.selector.argumentCount &&
+            parameters.typeParameters ==
+                node.selector.callStructure.typeArgumentCount) {
           node.element = method;
         }
       }
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index c08d246..c6dabbe 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -97,6 +97,10 @@
   bool isMemberProcessed(MemberEntity member);
   void registerProcessedMember(MemberEntity member);
   Iterable<MemberEntity> get processedMembers;
+
+  /// Registers that [type] is checked in this world builder. The unaliased type
+  /// is returned.
+  void registerIsCheck(DartType type);
 }
 
 /// The type and kind of an instantiation registered through
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index a5b2922..330d84f 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -186,8 +186,4 @@
   /// instantiated classes.
   // TODO(johnniwinther): Improve semantic precision.
   Iterable<InterfaceType> get instantiatedTypes;
-
-  /// Registers that [type] is checked in this world builder. The unaliased type
-  /// is returned.
-  void registerIsCheck(DartType type);
 }
diff --git a/pkg/compiler/tool/status_files/update_all.sh b/pkg/compiler/tool/status_files/update_all.sh
index 52ed57f..96453a2 100755
--- a/pkg/compiler/tool/status_files/update_all.sh
+++ b/pkg/compiler/tool/status_files/update_all.sh
@@ -16,6 +16,9 @@
     --with-fast-startup|--fast-startup)
       fast_startup=true
       ;;
+    --strong)
+      strong=true
+      ;;
     --with-checked-mode|--checked-mode|--checked)
       checked_mode=true
       ;;
@@ -31,7 +34,11 @@
 done
 
 if [ -z "$suites" ]; then
-  suites="dart2js_native dart2js_extra language language_2 corelib corelib_2 html"
+  if [[ "$strong" == true ]]; then
+    suites="language_2 corelib_2"
+  else
+    suites="dart2js_native dart2js_extra language corelib html"
+  fi
 fi
 
 repodir=$(cd $(dirname ${BASH_SOURCE[0]})/../../../../; pwd)
@@ -41,6 +48,23 @@
 
 tmp=$(mktemp -d)
 
+function update_suite_with_flags {
+  local name=$1
+  local suite=$2
+  shift 2
+  local args=$@
+  if [[ "$strong" == true ]]; then
+    name="$name-strong"
+    args="--strong $args"
+  fi
+
+  echo "  - $name tests"
+  ./tools/test.py -m release -c dart2js -r $runtime --dart2js-batch \
+      --dart2js-with-kernel $args $suite > $tmp/$suite-$name.txt
+  echo $tmp/$suite-$name.txt
+  $dart $update_script $name $tmp/$suite-$name.txt
+}
+
 function update_suite {
   local suite=$1
   local runtime="d8"
@@ -48,39 +72,13 @@
     runtime="drt"
   fi
   echo -e "\nupdate suite: $suite"
-  echo "  - minified tests"
-  ./tools/test.py -m release -c dart2js -r $runtime --dart2js-batch \
-      --use-sdk --minified --dart2js-with-kernel \
-      $suite > $tmp/$suite-minified.txt
-  $dart $update_script minified $tmp/$suite-minified.txt
-
-
-  echo "  - host-checked tests"
-  ./tools/test.py -m release -c dart2js -r $runtime --dart2js-batch \
-    --host-checked \
-    --dart2js-options="--platform-binaries=$binaries_dir" \
-    --dart2js-with-kernel \
-    $suite > $tmp/$suite-host-checked.txt
-  $dart $update_script host-checked $tmp/$suite-host-checked.txt
-
+  update_suite_with_flags minified $suite "--minified --use-sdk"
+  update_suite_with_flags host-checked $suite "--host-checked"
   if [ "$fast_startup" = true ]; then
-    echo "  - fast-startup tests"
-    ./tools/test.py -m release -c dart2js -r $runtime --dart2js-batch \
-      --fast-startup \
-      --dart2js-options="--platform-binaries=$binaries_dir" \
-      --dart2js-with-kernel \
-      $suite > $tmp/$suite-fast-startup.txt
-    $dart $update_script fast-startup $tmp/$suite-fast-startup.txt
+    update_suite_with_flags fast-startup $suite "--fast-startup"
   fi
-
   if [ "$checked_mode" = true ]; then
-    echo "  - checked mode tests"
-    ./tools/test.py -m release -c dart2js -r $runtime --dart2js-batch \
-      --checked \
-      --dart2js-options="--platform-binaries=$binaries_dir" \
-      --dart2js-with-kernel \
-      $suite > $tmp/$suite-checked-mode.txt
-    $dart $update_script checked-mode $tmp/$suite-checked-mode.txt
+    update_suite_with_flags checked-mode $suite "--checked"
   fi
 }
 
diff --git a/pkg/compiler/tool/status_files/update_from_log.dart b/pkg/compiler/tool/status_files/update_from_log.dart
index c2fc283..af5afdb 100644
--- a/pkg/compiler/tool/status_files/update_from_log.dart
+++ b/pkg/compiler/tool/status_files/update_from_log.dart
@@ -33,10 +33,18 @@
   'host-checked':
       r'[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]',
   'minified': r'[ $compiler == dart2js && $dart2js_with_kernel && $minified ]',
+  'host-checked-strong':
+      r'[ $compiler == dart2js && $dart2js_with_kernel && $host_checked && $strong ]',
+  'minified-strong':
+      r'[ $compiler == dart2js && $dart2js_with_kernel && $minified && $strong ]',
   'fast-startup':
       r'[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]',
+  'fast-startup-strong':
+      r'[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup && $strong ]',
   'checked-mode':
       r'[ $compiler == dart2js && $checked && $dart2js_with_kernel ]',
+  'checked-mode-strong':
+      r'[ $compiler == dart2js && $checked && $dart2js_with_kernel && $strong ]',
 };
 
 final dart2jsStatusFiles = {
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 030011b..bb2c765 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -4730,7 +4730,10 @@
   int _asIntInRange(Expression expr, int low, int high) {
     expr = expr.unParenthesized;
     if (expr is IntegerLiteral) {
-      if (expr.value >= low && expr.value <= high) return expr.value;
+      var value = expr.value;
+      if (value != null && value >= low && value <= high) {
+        return expr.value;
+      }
       return null;
     }
 
@@ -4753,7 +4756,7 @@
 
   bool _isDefinitelyNonNegative(Expression expr) {
     expr = expr.unParenthesized;
-    if (expr is IntegerLiteral) {
+    if (expr is IntegerLiteral && expr.value != null) {
       return expr.value >= 0;
     }
     if (_nodeIsBitwiseOperation(expr)) return true;
@@ -4786,7 +4789,7 @@
     /// Determines how many bits are required to hold result of evaluation
     /// [expr].  [depth] is used to bound exploration of huge expressions.
     int bitWidth(Expression expr, int depth) {
-      if (expr is IntegerLiteral) {
+      if (expr is IntegerLiteral && expr.value != null) {
         return expr.value >= 0 ? expr.value.bitLength : MAX;
       }
       if (++depth > 5) return MAX;
@@ -5563,7 +5566,18 @@
   }
 
   @override
-  visitIntegerLiteral(IntegerLiteral node) => js.number(node.value);
+  visitIntegerLiteral(IntegerLiteral node) {
+    // The analyzer is using int.parse and, in the the VM's new
+    // 64-bit mode, it's silently failing if the Literal is out of bounds.
+    // If the value is null, fall back on the string representation.  This
+    // is also fudging the number, but consistent with the old behavior.
+    // Ideally, this is a static error.
+    // TODO(vsm): Remove this hack.
+    if (node.value != null) {
+      return js.number(node.value);
+    }
+    return new JS.LiteralNumber('${node.literal}');
+  }
 
   @override
   visitDoubleLiteral(DoubleLiteral node) => js.number(node.value);
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index e719f1d..120a36b 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -118,6 +118,7 @@
     // TODO(vsm): Should this be hardcoded?
     context.declaredVariables.define('dart.library.html', 'true');
     context.declaredVariables.define('dart.library.io', 'false');
+    context.declaredVariables.define('dart.library.ui', 'false');
 
     if (!context.analysisOptions.strongMode) {
       throw new ArgumentError('AnalysisContext must be strong mode');
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 1d5f990..ca2474d 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -8,7 +8,7 @@
 
 import 'package:args/args.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:front_end/src/multi_root_file_system.dart';
 import 'package:kernel/core_types.dart';
@@ -153,7 +153,8 @@
       .toList();
 
   var sdkSummaryPath = argResults['dart-sdk-summary'] ??
-      path.absolute(ddcPath, 'gen', 'sdk', 'ddc_sdk.dill');
+      path.join(path.dirname(path.dirname(Platform.resolvedExecutable)), 'lib',
+          '_internal', 'ddc_sdk.dill');
 
   var packageFile =
       argResults['packages'] ?? path.absolute(ddcPath, '..', '..', '.packages');
@@ -164,11 +165,7 @@
 
   var succeeded = true;
   void errorHandler(fe.CompilationMessage error) {
-    // TODO(jmesserly): front end warning levels do not seem to follow the
-    // Strong Mode/Dart 2 spec. So for now, we treat all warnings as
-    // compile time errors.
-    if (error.severity == fe.Severity.error ||
-        error.severity == fe.Severity.warning) {
+    if (error.severity == fe.Severity.error) {
       succeeded = false;
     }
   }
@@ -179,7 +176,7 @@
   // the correct location and keeps the real file location hidden from the
   // front end.
   var fileSystem = new MultiRootFileSystem(
-      customScheme, multiRoots, PhysicalFileSystem.instance);
+      customScheme, multiRoots, StandardFileSystem.instance);
 
   compilerState = await fe.initializeCompiler(
       compilerState,
@@ -367,5 +364,14 @@
       i++;
     }
   }
+
+  // Add platform defined variables
+  declaredVariables['dart.isVM'] = 'false';
+
+  // TODO(vsm): Should this be hardcoded?
+  declaredVariables['dart.library.html'] = 'true';
+  declaredVariables['dart.library.io'] = 'false';
+  declaredVariables['dart.library.ui'] = 'false';
+
   return declaredVariables;
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 024bcb1..4f76e3e 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -398,7 +398,7 @@
     if (bootstrap) _emitLibraryProcedures(library);
 
     library.classes.forEach(_emitClass);
-    _moduleItems.addAll(library.typedefs.map(_emitTypedef));
+    library.typedefs.forEach(_emitTypedef);
     if (bootstrap) {
       _moduleItems.add(_emitInternalSdkFields(library.fields));
     } else {
@@ -1884,7 +1884,7 @@
     var jsMethods = <JS.Method>[];
     if (field.isStatic) return jsMethods;
 
-    var name = getAnnotationName(field, isJSName) ?? field.name;
+    var name = getAnnotationName(field, isJSName) ?? field.name.name;
     // Generate getter
     var fn = new JS.Fun([], js.statement('{ return this.#; }', [name]));
     var method = new JS.Method(_declareMemberName(field), fn, isGetter: true);
@@ -2012,16 +2012,18 @@
     return js.statement('# = #;', [_emitTopLevelName(c), jsTypeName]);
   }
 
-  JS.Statement _emitTypedef(Typedef t) {
+  void _emitTypedef(Typedef t) {
     var body = _callHelper(
         'typedef(#, () => #)', [js.string(t.name, "'"), _emitType(t.type)]);
 
+    JS.Statement result;
     if (t.typeParameters.isNotEmpty) {
-      return _defineClassTypeArguments(
+      result = _defineClassTypeArguments(
           t, t.typeParameters, js.statement('const # = #;', [t.name, body]));
     } else {
-      return js.statement('# = #;', [_emitTopLevelName(t), body]);
+      result = js.statement('# = #;', [_emitTopLevelName(t), body]);
     }
+    _moduleItems.add(result);
   }
 
   /// Treat dart:_runtime fields as safe to eagerly evaluate.
@@ -2057,11 +2059,7 @@
     for (var field in fields) {
       var name = field.name.name;
       var access = _emitStaticMemberName(name);
-      accessors.add(new JS.Method(
-          access,
-          js.call('function() { return #; }',
-                  _visitInitializer(field.initializer, field.annotations))
-              as JS.Fun,
+      accessors.add(new JS.Method(access, _emitStaticFieldInitializer(field),
           isGetter: true));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
@@ -2077,6 +2075,20 @@
     return _callHelperStatement('defineLazy(#, { # });', [objExpr, accessors]);
   }
 
+  JS.Fun _emitStaticFieldInitializer(Field field) {
+    var savedLetVariables = _letVariables;
+    _letVariables = [];
+
+    var body = [
+      new JS.Return(_visitInitializer(field.initializer, field.annotations))
+    ];
+    _initTempVars(body);
+
+    _letVariables = savedLetVariables;
+
+    return new JS.Fun([], new JS.Block(body));
+  }
+
   JS.PropertyAccess _emitTopLevelName(NamedNode n, {String suffix: ''}) {
     return _emitJSInterop(n) ?? _emitTopLevelNameNoInterop(n, suffix: suffix);
   }
@@ -4324,56 +4336,64 @@
 
   @override
   visitConstructorInvocation(ConstructorInvocation node) {
-    var target = node.target;
-    var targetName = target.name;
+    var ctor = node.target;
     var args = node.arguments;
+    var ctorClass = ctor.enclosingClass;
+    if (_isObjectLiteral(ctorClass)) return _emitObjectLiteral(args);
 
-    var enclosingClass = target.enclosingClass;
-    if (node.isConst &&
-        targetName.name == 'fromEnvironment' &&
-        target.enclosingLibrary == coreTypes.coreLibrary &&
-        args.positional.length == 1) {
-      var varName = (args.positional[0] as StringLiteral).value;
-      var value = declaredVariables[varName];
-      var defaultArg = args.named.isNotEmpty ? args.named[0].value : null;
-      if (enclosingClass == coreTypes.stringClass) {
-        value ??= (defaultArg as StringLiteral)?.value;
-        return value != null ? js.escapedString(value) : new JS.LiteralNull();
-      } else if (enclosingClass == coreTypes.intClass) {
-        var intValue = int.parse(value ?? '',
-            onError: (_) => (defaultArg as IntLiteral)?.value);
-        return intValue != null ? js.number(intValue) : new JS.LiteralNull();
-      } else if (enclosingClass == coreTypes.boolClass) {
-        if (value == "true") return js.boolean(true);
-        if (value == "false") return js.boolean(false);
-        return js
-            .boolean(defaultArg != null && (defaultArg as BoolLiteral)?.value);
-      } else {
-        return _emitInvalidNode(
-            node, '${enclosingClass}.fromEnvironment constant');
-      }
+    JS.Expression emitNew() {
+      return new JS.New(_emitConstructorName(node.constructedType, ctor),
+          _emitArgumentList(args, types: false));
     }
-    return _emitConstructorInvocation(
-        target, node.constructedType, args, node.isConst);
+
+    return node.isConst ? _emitConst(emitNew) : emitNew();
   }
 
   JS.Expression _emitFactoryInvocation(StaticInvocation node) {
     var args = node.arguments;
-    var target = node.target;
-    var c = target.enclosingClass;
-    var type =
-        c.typeParameters.isEmpty ? c.rawType : new InterfaceType(c, args.types);
+    var ctor = node.target;
+    var ctorClass = ctor.enclosingClass;
+    var type = ctorClass.typeParameters.isEmpty
+        ? ctorClass.rawType
+        : new InterfaceType(ctorClass, args.types);
+
+    if (node.isConst &&
+        ctor.name.name == 'fromEnvironment' &&
+        ctor.enclosingLibrary == coreTypes.coreLibrary &&
+        args.positional.length == 1 &&
+        // TODO(jmesserly): this does not correctly handle when the arguments to
+        // fromEnvironment are constant non-literal values.
+        args.positional[0] is BasicLiteral &&
+        (args.named.isEmpty || args.named[0].value is BasicLiteral)) {
+      var varName = (args.positional[0] as StringLiteral).value;
+      var value = declaredVariables[varName];
+      var defaultArg = args.named.isNotEmpty ? args.named[0].value : null;
+      if (ctorClass == coreTypes.stringClass) {
+        if (value != null) return js.escapedString(value);
+        return _visitExpression(defaultArg) ?? new JS.LiteralNull();
+      } else if (ctorClass == coreTypes.intClass) {
+        var intValue = int.parse(value ?? '', onError: (_) => null);
+        if (intValue != null) return js.number(intValue);
+        return _visitExpression(defaultArg) ?? new JS.LiteralNull();
+      } else if (ctorClass == coreTypes.boolClass) {
+        if (value == "true") return js.boolean(true);
+        if (value == "false") return js.boolean(false);
+        return _visitExpression(defaultArg) ?? js.boolean(false);
+      } else {
+        return _emitInvalidNode(node, '$ctorClass.fromEnvironment constant');
+      }
+    }
     if (args.positional.isEmpty &&
         args.named.isEmpty &&
-        c.enclosingLibrary.importUri.scheme == 'dart') {
+        ctorClass.enclosingLibrary.importUri.scheme == 'dart') {
       // Skip the slow SDK factory constructors when possible.
-      switch (c.name) {
+      switch (ctorClass.name) {
         case 'Map':
         case 'HashMap':
         case 'LinkedHashMap':
-          if (target.name == '') {
+          if (ctor.name == '') {
             return js.call('new #.new()', _emitMapImplType(type));
-          } else if (target.name == 'identity') {
+          } else if (ctor.name == 'identity') {
             return js.call(
                 'new #.new()', _emitMapImplType(type, identity: true));
           }
@@ -4381,15 +4401,15 @@
         case 'Set':
         case 'HashSet':
         case 'LinkedHashSet':
-          if (target.name == '') {
+          if (ctor.name == '') {
             return js.call('new #.new()', _emitSetImplType(type));
-          } else if (target.name == 'identity') {
+          } else if (ctor.name == 'identity') {
             return js.call(
                 'new #.new()', _emitSetImplType(type, identity: true));
           }
           break;
         case 'List':
-          if (target.name == '' && type is InterfaceType) {
+          if (ctor.name == '' && type is InterfaceType) {
             return _emitList(type.typeArguments[0], []);
           }
           break;
@@ -4398,28 +4418,13 @@
 
     JS.Expression emitNew() {
       // Native factory constructors are JS constructors - use new here.
-      return new JS.Call(_emitConstructorName(type, target),
+      return new JS.Call(_emitConstructorName(type, ctor),
           _emitArgumentList(args, types: false));
     }
 
     return node.isConst ? _emitConst(emitNew) : emitNew();
   }
 
-  JS.Expression _emitConstructorInvocation(
-      Constructor ctor, InterfaceType type, Arguments arguments, bool isConst) {
-    var enclosingClass = ctor.enclosingClass;
-    if (_isObjectLiteral(enclosingClass)) {
-      return _emitObjectLiteral(arguments);
-    }
-
-    JS.Expression emitNew() {
-      return new JS.New(_emitConstructorName(type, ctor),
-          _emitArgumentList(arguments, types: false));
-    }
-
-    return isConst ? _emitConst(emitNew) : emitNew();
-  }
-
   JS.Expression _emitMapImplType(InterfaceType type, {bool identity}) {
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
diff --git a/pkg/dev_compiler/test/sourcemap/README.md b/pkg/dev_compiler/test/sourcemap/README.md
index 8562f98..a855144 100644
--- a/pkg/dev_compiler/test/sourcemap/README.md
+++ b/pkg/dev_compiler/test/sourcemap/README.md
@@ -7,7 +7,7 @@
 
 Running the tests likely requires the compilation of the correct targets. DDK currently also
 requires `ddc_sdk.dill` inside
-`{sdkroot}/{out,xcodebuild}/ReleaseX64/gen/utils/dartdevc/ddc_sdk.dill`.
+`{sdkroot}/{out,xcodebuild}/ReleaseX64/gen/utils/dartdevc/kernel/ddc_sdk.dill`.
 
 Except for that, running them should simply be a matter of executing the `*_suite.dart` files.
 
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index 9ce07ce..1658cf7 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -52,7 +52,7 @@
     File sdkJsFile = findInOutDir("gen/utils/dartdevc/js/es6/dart_sdk.js");
     var jsSdkPath = sdkJsFile.uri;
 
-    File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/ddc_sdk.dill");
+    File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/kernel/ddc_sdk.dill");
 
     var ddc = getDdcDir().uri.resolve("bin/dartdevk.dart");
 
diff --git a/pkg/dev_compiler/test/string_to_uri_test.dart b/pkg/dev_compiler/test/string_to_uri_test.dart
index b27303f..43eaa8b 100755
--- a/pkg/dev_compiler/test/string_to_uri_test.dart
+++ b/pkg/dev_compiler/test/string_to_uri_test.dart
@@ -15,9 +15,13 @@
   expect(stringToUri("C:/full/windows/path.foo", windows: true).toString(),
       "file:///C:/full/windows/path.foo");
 
+  // Get current dir, making sure we use "/" and start with "/".
+  String currentDir = Directory.current.path.replaceAll(r'\', r'/');
+  if (!currentDir.startsWith(r'/')) currentDir = "/$currentDir";
+
   // Relative Windows path
   expect(stringToUri("partial\\windows\\path.foo", windows: true).toString(),
-      "file://${Directory.current.path}/partial/windows/path.foo");
+      "file://$currentDir/partial/windows/path.foo");
 
   // Full Unix path
   expect(stringToUri("/full/path/to/foo.bar", windows: false).toString(),
@@ -25,5 +29,5 @@
 
   // Relative Unix path
   expect(stringToUri("partial/path/to/foo.bar", windows: false).toString(),
-      "file://${Directory.current.path}/partial/path/to/foo.bar");
+      "file://$currentDir/partial/path/to/foo.bar");
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index e85d898..41af78b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -1109,10 +1109,17 @@
     throw new ArgumentError('Cannot extract type of null instance.');
   }
   var type = unwrapType(T);
-  if (type is AbstractFunctionType) {
+  if (type is AbstractFunctionType || _isFutureOr(type)) {
     throw new ArgumentError('Cannot extract from non-class type ($type).');
   }
-  List typeArgs = _extractTypes(getReifiedType(instance), type);
+  var typeArguments = getGenericArgs(type);
+  if (typeArguments.isEmpty) {
+    throw new ArgumentError('Cannot extract from non-generic type ($type).');
+  }
+  List typeArgs = _extractTypes(getReifiedType(instance), type, typeArguments);
+  // The signature of this method guarantees that instance is a T, so we
+  // should have a valid non-empty list at this point.
+  assert(typeArgs != null && typeArgs.isNotEmpty);
   return _checkAndCall(
       f, _getRuntimeType(f), JS('', 'void 0'), typeArgs, [], 'call');
 }
@@ -1130,8 +1137,7 @@
 // [String] depending on which it hits first.
 //
 // TODO(vsm): Consider merging with similar isClassSubType logic.
-List _extractTypes(Type t1, Type t2) => JS('', '''(() => {
-  let typeArguments2 = $getGenericArgs($t2);
+List _extractTypes(Type t1, Type t2, List typeArguments2) => JS('', '''(() => {
   if ($t1 == $t2) return typeArguments2;
 
   if ($t1 == $Object) return null;
@@ -1146,15 +1152,10 @@
   if (raw1 != null && raw1 == raw2) {
     let typeArguments1 = $getGenericArgs($t1);
     let length = typeArguments1.length;
-    if (typeArguments2.length == 0) {
-      // t2 is the raw form of t1
-      return typeArguments1;
-    } else if (length == 0) {
-      // t1 is raw, but t2 is not
-      if (typeArguments2.every($_isTop)) return typeArguments2;
-      return null;
-    }
-    if (length != typeArguments2.length) $assertFailed();
+    if (length == 0 || length != typeArguments2.length) $assertFailed();
+    // TODO(vsm): Remove this subtyping check if/when we eliminate the ability
+    // to implement multiple versions of the same interface
+    // (e.g., Foo<int>, Foo<String>).
     for (let i = 0; i < length; ++i) {
       let result =
           $_isSubtype(typeArguments1[i], typeArguments2[i], true);
@@ -1165,13 +1166,13 @@
     return typeArguments1;
   }
 
-  var result = $_extractTypes($t1.__proto__, $t2);
+  var result = $_extractTypes($t1.__proto__, $t2, $typeArguments2);
   if (result) return result;
 
   // Check mixin.
   let m1 = $getMixin($t1);
   if (m1 != null) {
-    result = $_extractTypes(m1, $t2);
+    result = $_extractTypes(m1, $t2, $typeArguments2);
     if (result) return result;
   }
 
@@ -1179,7 +1180,7 @@
   let getInterfaces = $getImplements($t1);
   if (getInterfaces) {
     for (let i1 of getInterfaces()) {
-      result = $_extractTypes(i1, $t2);
+      result = $_extractTypes(i1, $t2, $typeArguments2);
       if (result) return result;
     }
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index 68a1c71..96879ad 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -32,6 +32,8 @@
   static const skipDart = const JsonMLConfig("skipDart");
   static const keyToString = const JsonMLConfig("keyToString");
   static const asClass = const JsonMLConfig("asClass");
+  static const asObject = const JsonMLConfig("asObject");
+  toString() => "JsonMLConfig($name)";
 }
 
 int _maxSpanLength = 100;
@@ -454,6 +456,7 @@
     // The order of formatters matters as formatters earlier in the list take
     // precedence.
     _formatters = [
+      new ObjectInternalsFormatter(),
       new ClassFormatter(),
       new TypeFormatter(),
       new NamedConstructorFormatter(),
@@ -555,15 +558,33 @@
     var type = dart.getType(object);
     var ret = new LinkedHashSet<NameValuePair>();
     // We use a Set rather than a List to avoid duplicates.
-    var properties = new Set<NameValuePair>();
-    addPropertiesFromSignature(dart.getFields(type), properties, object, true);
-    addPropertiesFromSignature(dart.getGetters(type), properties, object, true);
-    ret.addAll(sortProperties(properties));
+    var fields = new Set<NameValuePair>();
+    addPropertiesFromSignature(dart.getFields(type), fields, object, true);
+    var getters = new Set<NameValuePair>();
+    addPropertiesFromSignature(dart.getGetters(type), getters, object, true);
+    ret.addAll(sortProperties(fields));
+    ret.addAll(sortProperties(getters));
     addMetadataChildren(object, ret);
     return ret.toList();
   }
 }
 
+/// Show the object instance members and a reduced preview.
+///
+/// Used as a sub-entry to show the internals of objects that have a different
+/// primary format. For example, a Map shows the key-value pairs, but this makes
+/// the internals of the map visible for debugging.
+class ObjectInternalsFormatter extends ObjectFormatter {
+  bool accept(object, config) =>
+      super.accept(object, config) && config == JsonMLConfig.asObject;
+
+  // A minimal preview because we expect a full preview is already shown in a
+  // parent formatter.
+  String preview(object) {
+    return getObjectTypeName(object);
+  }
+}
+
 /// Formatter for module Dart Library objects.
 class LibraryModuleFormatter implements Formatter {
   accept(object, config) => dart.getModuleName(object) != null;
@@ -674,9 +695,20 @@
       entries.add(new NameValuePair(
           name: entries.length.toString(), value: entryWrapper));
     });
+    addInstanceMembers(object, entries);
     addMetadataChildren(object, entries);
     return entries.toList();
   }
+
+  // We've formatted as a Map, but we may want to see the internals
+  // of the Map, particularly for domain objects that implement Map.
+  // Add an ObjectFormatter view underneath.
+  void addInstanceMembers(object, Set<NameValuePair> ret) {
+    ret.add(new NameValuePair(
+        name: "[[instance members]]",
+        value: object,
+        config: JsonMLConfig.asObject));
+  }
 }
 
 /// Formatter for Dart Iterable objects including List and Set.
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index b16bd46..b94a9bb 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -3,8 +3,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
 import 'dart:async';
+import 'dart:convert' show JSON;
+import 'dart:io';
 import 'package:args/args.dart' show ArgParser;
 import 'package:dev_compiler/src/compiler/module_builder.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
@@ -17,17 +18,14 @@
 
 Future main(List<String> args) async {
   // Parse flags.
-  var parser = new ArgParser()
-    ..addFlag('generate-javascript',
-        help: 'Generate JavaScript (in addition to dill)', abbr: 'g');
+  var parser = new ArgParser();
   var parserOptions = parser.parse(args);
-  var generateJS = parserOptions['generate-javascript'] as bool;
   var rest = parserOptions.rest;
 
   Directory.current = path.dirname(path.dirname(path.fromUri(Platform.script)));
 
   var outputPath =
-      path.absolute(rest.length > 0 ? rest[0] : 'gen/sdk/ddc_sdk.dill');
+      path.absolute(rest.length > 0 ? rest[0] : 'gen/sdk/kernel/ddc_sdk.dill');
 
   patch_sdk.main(['../..', 'tool/input_sdk', 'gen/patched_sdk']);
 
@@ -43,14 +41,25 @@
   var inputs = target.extraRequiredLibraries.map(Uri.parse).toList();
   var program = await kernelForBuildUnit(inputs, options);
 
-  // Useful for debugging:
-  // writeProgramToText(program);
+  var outputDir = path.dirname(outputPath);
+  await new Directory(outputDir).create(recursive: true);
   await writeProgramToBinary(program, outputPath);
 
-  if (generateJS) {
-    var jsModule = compileToJSModule(program, [], [], {});
-    var jsPath = path.join(path.basename(outputPath), 'dart_sdk.kernel.js');
-    new File(jsPath)
-        .writeAsStringSync(jsProgramToCode(jsModule, ModuleFormat.es6).code);
+  var jsModule = compileToJSModule(program, [], [], {});
+  var moduleFormats = {
+    'amd': ModuleFormat.amd,
+    'common': ModuleFormat.common,
+    'es6': ModuleFormat.es6,
+    'legacy': ModuleFormat.legacy,
+  };
+
+  for (var name in moduleFormats.keys) {
+    var format = moduleFormats[name];
+    var jsDir = path.join(outputDir, name);
+    var jsPath = path.join(jsDir, 'dart_sdk.js');
+    await new Directory(jsDir).create();
+    var jsCode = jsProgramToCode(jsModule, format);
+    await new File(jsPath).writeAsString(jsCode.code);
+    await new File('$jsPath.map').writeAsString(JSON.encode(jsCode.sourceMap));
   }
 }
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 30eca21..ccfe2ea 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -13,7 +13,7 @@
 
 import 'compilation_message.dart';
 import 'file_system.dart';
-import 'physical_file_system.dart';
+import 'standard_file_system.dart';
 
 /// Callback used to report errors encountered during compilation.
 typedef void ErrorHandler(CompilationMessage error);
@@ -115,7 +115,7 @@
   /// mechanism, with one exception: if no value is specified for
   /// [packagesFileUri], the packages file is located using the actual physical
   /// file system.  TODO(paulberry): fix this.
-  FileSystem fileSystem = PhysicalFileSystem.instance;
+  FileSystem fileSystem = StandardFileSystem.instance;
 
   /// The byte storage to access serialized data.
   ByteStore byteStore = new NullByteStore();
diff --git a/pkg/front_end/lib/src/api_prototype/physical_file_system.dart b/pkg/front_end/lib/src/api_prototype/physical_file_system.dart
deleted file mode 100644
index 083f802..0000000
--- a/pkg/front_end/lib/src/api_prototype/physical_file_system.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library front_end.physical_file_system;
-
-import 'dart:async';
-import 'dart:io' as io;
-
-import 'file_system.dart';
-
-/// Concrete implementation of [FileSystem] which performs its operations using
-/// I/O.
-///
-/// Not intended to be implemented or extended by clients.
-class PhysicalFileSystem implements FileSystem {
-  static final PhysicalFileSystem instance = new PhysicalFileSystem._();
-
-  PhysicalFileSystem._();
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    if (uri.scheme != 'file' && uri.scheme != '') {
-      throw new FileSystemException(
-          uri, 'PhysicalFileSystem only supports file:* URIs');
-    }
-    return new _PhysicalFileSystemEntity(Uri.base.resolveUri(uri));
-  }
-}
-
-/// Concrete implementation of [FileSystemEntity] for use by
-/// [PhysicalFileSystem].
-class _PhysicalFileSystemEntity implements FileSystemEntity {
-  @override
-  final Uri uri;
-
-  _PhysicalFileSystemEntity(this.uri);
-
-  @override
-  int get hashCode => uri.hashCode;
-
-  @override
-  bool operator ==(Object other) =>
-      other is _PhysicalFileSystemEntity && other.uri == uri;
-
-  @override
-  Future<bool> exists() async {
-    if (await io.FileSystemEntity.isFile(uri.toFilePath())) {
-      return new io.File.fromUri(uri).exists();
-    } else {
-      return new io.Directory.fromUri(uri).exists();
-    }
-  }
-
-  @override
-  Future<List<int>> readAsBytes() async {
-    try {
-      return await new io.File.fromUri(uri).readAsBytes();
-    } on io.FileSystemException catch (exception) {
-      throw _toFileSystemException(exception);
-    }
-  }
-
-  @override
-  Future<String> readAsString() async {
-    try {
-      return await new io.File.fromUri(uri).readAsString();
-    } on io.FileSystemException catch (exception) {
-      throw _toFileSystemException(exception);
-    }
-  }
-
-  /**
-   * Return the [FileSystemException] for the given I/O exception.
-   */
-  FileSystemException _toFileSystemException(io.FileSystemException exception) {
-    String message = exception.message;
-    String osMessage = exception.osError?.message;
-    if (osMessage != null && osMessage.isNotEmpty) {
-      message = osMessage;
-    }
-    return new FileSystemException(uri, message);
-  }
-}
diff --git a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
new file mode 100644
index 0000000..c64cfd8
--- /dev/null
+++ b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
@@ -0,0 +1,119 @@
+// 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.
+
+library front_end.standard_file_system;
+
+import 'dart:async';
+import 'dart:io' as io;
+
+import 'file_system.dart';
+
+/// Concrete implementation of [FileSystem] handling standard URI schemes.
+///
+/// file: URIs are handled using file I/O.
+/// data: URIs return their data contents.
+///
+/// Not intended to be implemented or extended by clients.
+class StandardFileSystem implements FileSystem {
+  static final StandardFileSystem instance = new StandardFileSystem._();
+
+  StandardFileSystem._();
+
+  @override
+  FileSystemEntity entityForUri(Uri uri) {
+    if (uri.scheme == 'file' || uri.scheme == '') {
+      // TODO(askesc): Empty schemes should have been handled elsewhere.
+      return new _IoFileSystemEntity(Uri.base.resolveUri(uri));
+    } else if (uri.scheme == 'data') {
+      return new _DataFileSystemEntity(Uri.base.resolveUri(uri));
+    } else {
+      throw new FileSystemException(
+          uri, 'StandardFileSystem only supports file:* and data:* URIs');
+    }
+  }
+}
+
+/// Concrete implementation of [FileSystemEntity] for file: URIs.
+class _IoFileSystemEntity implements FileSystemEntity {
+  @override
+  final Uri uri;
+
+  _IoFileSystemEntity(this.uri);
+
+  @override
+  int get hashCode => uri.hashCode;
+
+  @override
+  bool operator ==(Object other) =>
+      other is _IoFileSystemEntity && other.uri == uri;
+
+  @override
+  Future<bool> exists() async {
+    if (await io.FileSystemEntity.isFile(uri.toFilePath())) {
+      return new io.File.fromUri(uri).exists();
+    } else {
+      return new io.Directory.fromUri(uri).exists();
+    }
+  }
+
+  @override
+  Future<List<int>> readAsBytes() async {
+    try {
+      return await new io.File.fromUri(uri).readAsBytes();
+    } on io.FileSystemException catch (exception) {
+      throw _toFileSystemException(exception);
+    }
+  }
+
+  @override
+  Future<String> readAsString() async {
+    try {
+      return await new io.File.fromUri(uri).readAsString();
+    } on io.FileSystemException catch (exception) {
+      throw _toFileSystemException(exception);
+    }
+  }
+
+  /**
+   * Return the [FileSystemException] for the given I/O exception.
+   */
+  FileSystemException _toFileSystemException(io.FileSystemException exception) {
+    String message = exception.message;
+    String osMessage = exception.osError?.message;
+    if (osMessage != null && osMessage.isNotEmpty) {
+      message = osMessage;
+    }
+    return new FileSystemException(uri, message);
+  }
+}
+
+/// Concrete implementation of [FileSystemEntity] for data: URIs.
+class _DataFileSystemEntity implements FileSystemEntity {
+  @override
+  final Uri uri;
+
+  _DataFileSystemEntity(this.uri);
+
+  @override
+  int get hashCode => uri.hashCode;
+
+  @override
+  bool operator ==(Object other) =>
+      other is _DataFileSystemEntity && other.uri == uri;
+
+  @override
+  Future<bool> exists() async {
+    return true;
+  }
+
+  @override
+  Future<List<int>> readAsBytes() async {
+    return uri.data.contentAsBytes();
+  }
+
+  @override
+  Future<String> readAsString() async {
+    return uri.data.contentAsString();
+  }
+}
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 14bc14c..5e0cf2c 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -5,7 +5,7 @@
 import 'dart:async' show Future;
 
 import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/kernel_generator_impl.dart';
 import 'package:kernel/kernel.dart' show Program;
@@ -65,7 +65,7 @@
     ..packagesFileUri = packagesFile
     ..inputSummaries = inputSummaries
     ..target = target
-    ..fileSystem = fileSystem ?? PhysicalFileSystem.instance
+    ..fileSystem = fileSystem ?? StandardFileSystem.instance
     ..chaseDependencies = true
     ..reportMessages = true;
 
diff --git a/pkg/front_end/lib/src/api_unstable/summary_worker.dart b/pkg/front_end/lib/src/api_unstable/summary_worker.dart
index b34fc82..d5c8b18 100644
--- a/pkg/front_end/lib/src/api_unstable/summary_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/summary_worker.dart
@@ -17,7 +17,7 @@
 
 export 'compiler_state.dart';
 
-export '../api_prototype/physical_file_system.dart' show PhysicalFileSystem;
+export '../api_prototype/standard_file_system.dart' show StandardFileSystem;
 export '../fasta/fasta_codes.dart' show LocatedMessage;
 export '../fasta/severity.dart' show Severity;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 48d6b74..7043564 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -32,6 +32,9 @@
     extends TypeDeclarationBuilder<T, R> {
   final List<TypeVariableBuilder> typeVariables;
 
+  /// List of type arguments provided by instantiate to bound.
+  List<TypeBuilder> get calculatedBounds => null;
+
   T supertype;
 
   List<T> interfaces;
@@ -219,11 +222,7 @@
     library.addCompileTimeError(message, charOffset, fileUri, context: context);
   }
 
-  void addWarning(Message message, int charOffset, {LocatedMessage context}) {
-    library.addWarning(message, charOffset, fileUri, context: context);
-  }
-
-  void addNit(Message message, int charOffset, {LocatedMessage context}) {
-    library.addNit(message, charOffset, fileUri, context: context);
+  void addProblem(Message message, int charOffset, {LocatedMessage context}) {
+    library.addProblem(message, charOffset, fileUri, context: context);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
index 3ea7514..eb2b923 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
@@ -59,7 +59,7 @@
           suffix ?? "", charOffset, fileUri, accessingLibrary);
     }
     if (target == null) {
-      accessingLibrary.addWarning(
+      accessingLibrary.addProblem(
           templateConstructorNotFound.withArguments(fullNameForErrors),
           charOffset,
           fileUri);
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
index 347d208..710e5e3 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
@@ -18,6 +18,9 @@
 
   final List<TypeVariableBuilder> typeVariables;
 
+  /// List of type arguments provided by instantiate to bound.
+  List<TypeBuilder> get calculatedBounds;
+
   FunctionTypeAliasBuilder(List<MetadataBuilder> metadata, String name,
       this.typeVariables, this.type, LibraryBuilder parent, int charOffset)
       : super(metadata, null, name, parent, charOffset);
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index dbbc106..e9f701a 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -83,16 +83,11 @@
         wasHandled: wasHandled, context: context);
   }
 
-  void addWarning(Message message, int charOffset, Uri fileUri,
+  /// Add a problem with a severity determined by the severity of the message.
+  void addProblem(Message message, int charOffset, Uri fileUri,
       {LocatedMessage context}) {
     fileUri ??= this.fileUri;
-    loader.addWarning(message, charOffset, fileUri, context: context);
-  }
-
-  void addNit(Message message, int charOffset, Uri fileUri,
-      {LocatedMessage context}) {
-    fileUri ??= this.fileUri;
-    loader.addNit(message, charOffset, fileUri, context: context);
+    loader.addProblem(message, charOffset, fileUri, context: context);
   }
 
   /// Returns true if the export scope was modified.
diff --git a/pkg/front_end/lib/src/fasta/command_line_reporting.dart b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
index aeeaca7..2f48cb8 100644
--- a/pkg/front_end/lib/src/fasta/command_line_reporting.dart
+++ b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
@@ -23,7 +23,7 @@
 
 import 'messages.dart' show getLocation, getSourceLine, isVerbose;
 
-import 'problems.dart' show unhandled;
+import 'problems.dart' show unexpected;
 
 import 'severity.dart' show Severity;
 
@@ -59,6 +59,9 @@
         case Severity.warning:
           text = magenta(text);
           break;
+
+        default:
+          return unexpected("$severity", "formatInternal", -1, null);
       }
     }
 
@@ -102,8 +105,10 @@
 
     case Severity.warning:
       return hideWarnings;
+
+    default:
+      return unexpected("$severity", "isHidden", -1, null);
   }
-  return unhandled("$severity", "isHidden", -1, null);
 }
 
 /// Are problems of [severity] fatal? That is, should the compiler terminate
@@ -121,8 +126,10 @@
 
     case Severity.warning:
       return CompilerContext.current.options.throwOnWarningsForDebugging;
+
+    default:
+      return unexpected("$severity", "shouldThrowOn", -1, null);
   }
-  return unhandled("$severity", "shouldThrowOn", -1, null);
 }
 
 /// Convert [severity] to a name that can be used to prefix a message.
@@ -139,8 +146,10 @@
 
     case Severity.warning:
       return capitalized ? "Warning" : "warning";
+
+    default:
+      return unexpected("$severity", "severityName", -1, null);
   }
-  return unhandled("$severity", "severityName", -1, null);
 }
 
 /// Print a formatted message and throw when errors are treated as fatal.
diff --git a/pkg/front_end/lib/src/fasta/dill/built_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/dill/built_type_variable_builder.dart
deleted file mode 100644
index 0776650..0000000
--- a/pkg/front_end/lib/src/fasta/dill/built_type_variable_builder.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library fasta.built_type_variable_builder;
-
-import 'package:kernel/ast.dart'
-    show DartType, TypeParameter, TypeParameterType;
-
-import '../kernel/kernel_builder.dart'
-    show
-        TypeVariableBuilder,
-        KernelTypeBuilder,
-        LibraryBuilder,
-        KernelNamedTypeBuilder,
-        KernelLibraryBuilder;
-
-class BuiltTypeVariableBuilder
-    extends TypeVariableBuilder<KernelTypeBuilder, DartType> {
-  final TypeParameter builtTypeParameter;
-
-  TypeParameter get target => builtTypeParameter;
-
-  BuiltTypeVariableBuilder(String name, this.builtTypeParameter,
-      KernelLibraryBuilder compilationUnit, int charOffset,
-      [KernelTypeBuilder bound])
-      : super(name, bound, compilationUnit, charOffset);
-
-  DartType buildType(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    // TODO(dmitryas): Do we need a check for [arguments] here?
-    return new TypeParameterType(builtTypeParameter);
-  }
-
-  DartType buildTypesWithBuiltArguments(
-      LibraryBuilder library, List<DartType> arguments) {
-    // TODO(dmitryas): Do we need a check for [arguments] here?
-    return new TypeParameterType(builtTypeParameter);
-  }
-
-  KernelTypeBuilder asTypeBuilder() {
-    return new KernelNamedTypeBuilder(name, null)..bind(this);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 8605dcb..caa23e7 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -16,7 +16,7 @@
         KernelClassBuilder,
         KernelTypeBuilder,
         Scope,
-        TypeVariableBuilder;
+        TypeBuilder;
 
 import '../modifier.dart' show abstractMask;
 
@@ -24,8 +24,6 @@
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
-import 'built_type_variable_builder.dart' show BuiltTypeVariableBuilder;
-
 import 'built_type_builder.dart' show BuiltTypeBuilder;
 
 class DillClassBuilder extends KernelClassBuilder {
@@ -62,22 +60,24 @@
     }
   }
 
-  List<TypeVariableBuilder> get typeVariables {
+  List<TypeBuilder> get calculatedBounds {
+    if (super.calculatedBounds != null) {
+      return super.calculatedBounds;
+    }
     DillLibraryBuilder parentLibraryBuilder = parent;
     DillClassBuilder objectClassBuilder =
         parentLibraryBuilder.loader.coreLibrary["Object"];
     Class objectClass = objectClassBuilder.cls;
     List<TypeParameter> targetTypeParameters = target.typeParameters;
-    List<DartType> calculatedBounds =
+    List<DartType> calculatedBoundTypes =
         calculateBounds(targetTypeParameters, objectClass);
-    List<TypeVariableBuilder> typeVariables =
-        new List<BuiltTypeVariableBuilder>(targetTypeParameters.length);
-    for (int i = 0; i < typeVariables.length; i++) {
-      TypeParameter parameter = targetTypeParameters[i];
-      typeVariables[i] = new BuiltTypeVariableBuilder(parameter.name, parameter,
-          null, charOffset, new BuiltTypeBuilder(calculatedBounds[i]));
+    List<TypeBuilder> result =
+        new List<BuiltTypeBuilder>(targetTypeParameters.length);
+    for (int i = 0; i < result.length; i++) {
+      result[i] = new BuiltTypeBuilder(calculatedBoundTypes[i]);
     }
-    return typeVariables;
+    super.calculatedBounds = result;
+    return super.calculatedBounds;
   }
 
   /// Returns true if this class is the result of applying a mixin to its
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
index 66b097c..7f9ba1b 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
@@ -14,7 +14,7 @@
         KernelFunctionTypeBuilder,
         LibraryBuilder,
         MetadataBuilder,
-        TypeVariableBuilder;
+        TypeBuilder;
 
 import '../problems.dart' show unimplemented;
 
@@ -22,8 +22,6 @@
 
 import 'dill_class_builder.dart' show DillClassBuilder;
 
-import 'built_type_variable_builder.dart' show BuiltTypeVariableBuilder;
-
 import 'built_type_builder.dart' show BuiltTypeBuilder;
 
 class DillFunctionTypeAliasBuilder extends KernelFunctionTypeAliasBuilder {
@@ -35,23 +33,24 @@
     return unimplemented("metadata", -1, null);
   }
 
-  @override
-  List<TypeVariableBuilder> get typeVariables {
+  List<TypeBuilder> get calculatedBounds {
+    if (super.calculatedBounds != null) {
+      return super.calculatedBounds;
+    }
     DillLibraryBuilder parentLibraryBuilder = parent;
     DillClassBuilder objectClassBuilder =
         parentLibraryBuilder.loader.coreLibrary["Object"];
     Class objectClass = objectClassBuilder.cls;
     List<TypeParameter> targetTypeParameters = target.typeParameters;
-    List<DartType> calculatedBounds =
+    List<DartType> calculatedBoundTypes =
         calculateBounds(targetTypeParameters, objectClass);
-    List<TypeVariableBuilder> typeVariables =
-        new List<BuiltTypeVariableBuilder>(targetTypeParameters.length);
-    for (int i = 0; i < typeVariables.length; i++) {
-      TypeParameter parameter = targetTypeParameters[i];
-      typeVariables[i] = new BuiltTypeVariableBuilder(parameter.name, parameter,
-          null, charOffset, new BuiltTypeBuilder(calculatedBounds[i]));
+    List<TypeBuilder> result =
+        new List<BuiltTypeBuilder>(targetTypeParameters.length);
+    for (int i = 0; i < result.length; i++) {
+      result[i] = new BuiltTypeBuilder(calculatedBoundTypes[i]);
     }
-    return typeVariables;
+    super.calculatedBounds = result;
+    return super.calculatedBounds;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes.dart b/pkg/front_end/lib/src/fasta/fasta_codes.dart
index 59eee7e..5e36e3d 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes.dart
@@ -10,6 +10,8 @@
 
 import '../scanner/token.dart' show Token;
 
+import 'severity.dart' show Severity;
+
 import 'util/relativize.dart' as util show relativizeUri;
 
 part 'fasta_codes_generated.dart';
@@ -23,7 +25,10 @@
 
   final String dart2jsCode;
 
-  const Code(this.name, this.template, {this.analyzerCode, this.dart2jsCode});
+  final Severity severity;
+
+  const Code(this.name, this.template,
+      {this.analyzerCode, this.dart2jsCode, this.severity});
 
   String toString() => name;
 }
@@ -50,8 +55,15 @@
   final String tip;
 
   const MessageCode(String name,
-      {String analyzerCode, String dart2jsCode, this.message, this.tip})
-      : super(name, null, analyzerCode: analyzerCode, dart2jsCode: dart2jsCode);
+      {String analyzerCode,
+      String dart2jsCode,
+      Severity severity,
+      this.message,
+      this.tip})
+      : super(name, null,
+            analyzerCode: analyzerCode,
+            dart2jsCode: dart2jsCode,
+            severity: severity);
 
   Map<String, dynamic> get arguments => const <String, dynamic>{};
 
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 f84087b..4eaf799 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -20,9 +20,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeAbstractClassInstantiation =
     const Code<Message Function(String name)>(
-  "AbstractClassInstantiation",
-  templateAbstractClassInstantiation,
-);
+        "AbstractClassInstantiation", templateAbstractClassInstantiation,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAbstractClassInstantiation(String name) {
@@ -65,9 +64,9 @@
 const Code<Message Function(String name)>
     codeAbstractRedirectedClassInstantiation =
     const Code<Message Function(String name)>(
-  "AbstractRedirectedClassInstantiation",
-  templateAbstractRedirectedClassInstantiation,
-);
+        "AbstractRedirectedClassInstantiation",
+        templateAbstractRedirectedClassInstantiation,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAbstractRedirectedClassInstantiation(String name) {
@@ -229,6 +228,7 @@
 const Code<Message Function(Token token)> codeBuiltInIdentifierInDeclaration =
     const Code<Message Function(Token token)>("BuiltInIdentifierInDeclaration",
         templateBuiltInIdentifierInDeclaration,
+        analyzerCode: "BUILT_IN_IDENTIFIER_IN_DECLARATION",
         dart2jsCode: "GENERIC");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -348,9 +348,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String string)> codeCantInferTypeDueToCircularity =
     const Code<Message Function(String string)>(
-  "CantInferTypeDueToCircularity",
-  templateCantInferTypeDueToCircularity,
-);
+        "CantInferTypeDueToCircularity", templateCantInferTypeDueToCircularity,
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCantInferTypeDueToCircularity(String string) {
@@ -428,9 +427,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeConflictsWithConstructor =
     const Code<Message Function(String name)>(
-  "ConflictsWithConstructor",
-  templateConflictsWithConstructor,
-);
+        "ConflictsWithConstructor", templateConflictsWithConstructor,
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithConstructor(String name) {
@@ -448,9 +446,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeConflictsWithFactory =
     const Code<Message Function(String name)>(
-  "ConflictsWithFactory",
-  templateConflictsWithFactory,
-);
+        "ConflictsWithFactory", templateConflictsWithFactory,
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithFactory(String name) {
@@ -468,9 +465,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeConflictsWithMember =
     const Code<Message Function(String name)>(
-  "ConflictsWithMember",
-  templateConflictsWithMember,
-);
+        "ConflictsWithMember", templateConflictsWithMember,
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithMember(String name) {
@@ -479,6 +475,25 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateConflictsWithMemberWarning =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""Conflicts with member '#name'.""",
+        withArguments: _withArgumentsConflictsWithMemberWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeConflictsWithMemberWarning =
+    const Code<Message Function(String name)>(
+        "ConflictsWithMemberWarning", templateConflictsWithMemberWarning,
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConflictsWithMemberWarning(String name) {
+  return new Message(codeConflictsWithMemberWarning,
+      message: """Conflicts with member '$name'.""", arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConflictsWithSetter =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Conflicts with setter '#name'.""",
@@ -487,9 +502,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeConflictsWithSetter =
     const Code<Message Function(String name)>(
-  "ConflictsWithSetter",
-  templateConflictsWithSetter,
-);
+        "ConflictsWithSetter", templateConflictsWithSetter,
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithSetter(String name) {
@@ -499,6 +513,25 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
+    templateConflictsWithSetterWarning =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""Conflicts with setter '#name'.""",
+        withArguments: _withArgumentsConflictsWithSetterWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeConflictsWithSetterWarning =
+    const Code<Message Function(String name)>(
+        "ConflictsWithSetterWarning", templateConflictsWithSetterWarning,
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConflictsWithSetterWarning(String name) {
+  return new Message(codeConflictsWithSetterWarning,
+      message: """Conflicts with setter '$name'.""", arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
     templateConflictsWithTypeVariable =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Conflicts with type variable '#name'.""",
@@ -507,9 +540,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeConflictsWithTypeVariable =
     const Code<Message Function(String name)>(
-  "ConflictsWithTypeVariable",
-  templateConflictsWithTypeVariable,
-);
+        "ConflictsWithTypeVariable", templateConflictsWithTypeVariable,
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithTypeVariable(String name) {
@@ -525,6 +557,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConflictsWithTypeVariableCause = const MessageCode(
     "ConflictsWithTypeVariableCause",
+    severity: Severity.error,
     message: r"""This is the type variable.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -655,9 +688,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeConstructorNotFound =
     const Code<Message Function(String name)>(
-  "ConstructorNotFound",
-  templateConstructorNotFound,
-);
+        "ConstructorNotFound", templateConstructorNotFound,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstructorNotFound(String name) {
@@ -938,9 +970,10 @@
 const Code<Message Function(String name, Uri uri_, Uri uri2_)>
     codeDuplicatedExport =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
-  "DuplicatedExport",
-  templateDuplicatedExport,
-);
+        "DuplicatedExport", templateDuplicatedExport,
+        analyzerCode: "AMBIGUOUS_EXPORT",
+        dart2jsCode: "*ignored*",
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedExport(String name, Uri uri_, Uri uri2_) {
@@ -953,6 +986,30 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, Uri uri_, Uri uri2_)>
+    templateDuplicatedExportInType =
+    const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
+        messageTemplate:
+            r"""'#name' is exported from both '#uri' and '#uri2'.""",
+        withArguments: _withArgumentsDuplicatedExportInType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, Uri uri_, Uri uri2_)>
+    codeDuplicatedExportInType =
+    const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
+        "DuplicatedExportInType", templateDuplicatedExportInType,
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedExportInType(String name, Uri uri_, Uri uri2_) {
+  String uri = relativizeUri(uri_);
+  String uri2 = relativizeUri(uri2_);
+  return new Message(codeDuplicatedExportInType,
+      message: """'$name' is exported from both '$uri' and '$uri2'.""",
+      arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, Uri uri_, Uri uri2_)>
     templateDuplicatedImport =
     const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
         messageTemplate:
@@ -963,9 +1020,8 @@
 const Code<Message Function(String name, Uri uri_, Uri uri2_)>
     codeDuplicatedImport =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
-  "DuplicatedImport",
-  templateDuplicatedImport,
-);
+        "DuplicatedImport", templateDuplicatedImport,
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedImport(String name, Uri uri_, Uri uri2_) {
@@ -977,6 +1033,30 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, Uri uri_, Uri uri2_)>
+    templateDuplicatedImportInType =
+    const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
+        messageTemplate:
+            r"""'#name' is imported from both '#uri' and '#uri2'.""",
+        withArguments: _withArgumentsDuplicatedImportInType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, Uri uri_, Uri uri2_)>
+    codeDuplicatedImportInType =
+    const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
+        "DuplicatedImportInType", templateDuplicatedImportInType,
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedImportInType(String name, Uri uri_, Uri uri2_) {
+  String uri = relativizeUri(uri_);
+  String uri2 = relativizeUri(uri2_);
+  return new Message(codeDuplicatedImportInType,
+      message: """'$name' is imported from both '$uri' and '$uri2'.""",
+      arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""The modifier '#lexeme' was already specified.""",
@@ -1325,7 +1405,9 @@
 const Code<Message Function(Token token)> codeExpectedIdentifier =
     const Code<Message Function(Token token)>(
         "ExpectedIdentifier", templateExpectedIdentifier,
-        analyzerCode: "MISSING_IDENTIFIER", dart2jsCode: "*fatal*");
+        analyzerCode: "MISSING_IDENTIFIER",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedIdentifier(Token token) {
@@ -1432,9 +1514,8 @@
 const Code<Message Function(String name, Uri uri_, Uri uri2_)>
     codeExportHidesExport =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
-  "ExportHidesExport",
-  templateExportHidesExport,
-);
+        "ExportHidesExport", templateExportHidesExport,
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExportHidesExport(String name, Uri uri_, Uri uri2_) {
@@ -1485,9 +1566,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeExtendingRestricted =
     const Code<Message Function(String name)>(
-  "ExtendingRestricted",
-  templateExtendingRestricted,
-);
+        "ExtendingRestricted", templateExtendingRestricted,
+        analyzerCode: "EXTENDS_DISALLOWED_CLASS", dart2jsCode: "*ignored*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExtendingRestricted(String name) {
@@ -1809,9 +1889,9 @@
 const Code<Message Function(String name)>
     codeFinalInstanceVariableAlreadyInitialized =
     const Code<Message Function(String name)>(
-  "FinalInstanceVariableAlreadyInitialized",
-  templateFinalInstanceVariableAlreadyInitialized,
-);
+        "FinalInstanceVariableAlreadyInitialized",
+        templateFinalInstanceVariableAlreadyInitialized,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalInstanceVariableAlreadyInitialized(String name) {
@@ -1833,9 +1913,9 @@
 const Code<Message Function(String name)>
     codeFinalInstanceVariableAlreadyInitializedCause =
     const Code<Message Function(String name)>(
-  "FinalInstanceVariableAlreadyInitializedCause",
-  templateFinalInstanceVariableAlreadyInitializedCause,
-);
+        "FinalInstanceVariableAlreadyInitializedCause",
+        templateFinalInstanceVariableAlreadyInitializedCause,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalInstanceVariableAlreadyInitializedCause(
@@ -1873,9 +1953,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeGetterNotFound =
     const Code<Message Function(String name)>(
-  "GetterNotFound",
-  templateGetterNotFound,
-);
+        "GetterNotFound", templateGetterNotFound,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsGetterNotFound(String name) {
@@ -2026,9 +2105,8 @@
 const Code<Message Function(String name, Uri uri_, Uri uri2_)>
     codeImportHidesImport =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
-  "ImportHidesImport",
-  templateImportHidesImport,
-);
+        "ImportHidesImport", templateImportHidesImport,
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsImportHidesImport(String name, Uri uri_, Uri uri2_) {
@@ -2096,6 +2174,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInternalProblemAlreadyInitialized = const MessageCode(
     "InternalProblemAlreadyInitialized",
+    severity: Severity.internalProblem,
     message: r"""Attempt to set initializer on field without initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2105,6 +2184,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInternalProblemBodyOnAbstractMethod =
     const MessageCode("InternalProblemBodyOnAbstractMethod",
+        severity: Severity.internalProblem,
         message: r"""Attempting to set body on abstract method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2118,9 +2198,9 @@
 const Code<Message Function(String name, Uri uri_)>
     codeInternalProblemConstructorNotFound =
     const Code<Message Function(String name, Uri uri_)>(
-  "InternalProblemConstructorNotFound",
-  templateInternalProblemConstructorNotFound,
-);
+        "InternalProblemConstructorNotFound",
+        templateInternalProblemConstructorNotFound,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemConstructorNotFound(
@@ -2138,6 +2218,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInternalProblemExtendingUnmodifiableScope =
     const MessageCode("InternalProblemExtendingUnmodifiableScope",
+        severity: Severity.internalProblem,
         message: r"""Can't extend an unmodifiable scope.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2147,11 +2228,33 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInternalProblemMissingContext = const MessageCode(
     "InternalProblemMissingContext",
+    severity: Severity.internalProblem,
     message: r"""Compiler cannot run without a compiler context.""",
     tip:
         r"""Are calls to the compiler wrapped in CompilerContext.runInContext?""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)>
+    templateInternalProblemMissingSeverity =
+    const Template<Message Function(String string)>(
+        messageTemplate: r"""Message code missing severity: #string""",
+        withArguments: _withArgumentsInternalProblemMissingSeverity);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeInternalProblemMissingSeverity =
+    const Code<Message Function(String string)>(
+        "InternalProblemMissingSeverity",
+        templateInternalProblemMissingSeverity,
+        severity: Severity.internalProblem);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInternalProblemMissingSeverity(String string) {
+  return new Message(codeInternalProblemMissingSeverity,
+      message: """Message code missing severity: $string""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateInternalProblemNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Couldn't find '#name'.""",
@@ -2160,9 +2263,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeInternalProblemNotFound =
     const Code<Message Function(String name)>(
-  "InternalProblemNotFound",
-  templateInternalProblemNotFound,
-);
+        "InternalProblemNotFound", templateInternalProblemNotFound,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemNotFound(String name) {
@@ -2181,9 +2283,8 @@
 const Code<Message Function(String name, String name2)>
     codeInternalProblemNotFoundIn =
     const Code<Message Function(String name, String name2)>(
-  "InternalProblemNotFoundIn",
-  templateInternalProblemNotFoundIn,
-);
+        "InternalProblemNotFoundIn", templateInternalProblemNotFoundIn,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemNotFoundIn(String name, String name2) {
@@ -2199,6 +2300,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInternalProblemPreviousTokenNotFound =
     const MessageCode("InternalProblemPreviousTokenNotFound",
+        severity: Severity.internalProblem,
         message: r"""Couldn't find previous token.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2212,9 +2314,9 @@
 const Code<Message Function(String name)>
     codeInternalProblemPrivateConstructorAccess =
     const Code<Message Function(String name)>(
-  "InternalProblemPrivateConstructorAccess",
-  templateInternalProblemPrivateConstructorAccess,
-);
+        "InternalProblemPrivateConstructorAccess",
+        templateInternalProblemPrivateConstructorAccess,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemPrivateConstructorAccess(String name) {
@@ -2230,6 +2332,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInternalProblemProvidedBothCompileSdkAndSdkSummary =
     const MessageCode("InternalProblemProvidedBothCompileSdkAndSdkSummary",
+        severity: Severity.internalProblem,
         message:
             r"""The compileSdk and sdkSummary options are mutually exclusive""");
 
@@ -2244,9 +2347,8 @@
 const Code<Message Function(String name, String string)>
     codeInternalProblemStackNotEmpty =
     const Code<Message Function(String name, String string)>(
-  "InternalProblemStackNotEmpty",
-  templateInternalProblemStackNotEmpty,
-);
+        "InternalProblemStackNotEmpty", templateInternalProblemStackNotEmpty,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemStackNotEmpty(String name, String string) {
@@ -2266,9 +2368,9 @@
 const Code<Message Function(String name)>
     codeInternalProblemSuperclassNotFound =
     const Code<Message Function(String name)>(
-  "InternalProblemSuperclassNotFound",
-  templateInternalProblemSuperclassNotFound,
-);
+        "InternalProblemSuperclassNotFound",
+        templateInternalProblemSuperclassNotFound,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemSuperclassNotFound(String name) {
@@ -2287,9 +2389,8 @@
 const Code<Message Function(String string, String string2)>
     codeInternalProblemUnexpected =
     const Code<Message Function(String string, String string2)>(
-  "InternalProblemUnexpected",
-  templateInternalProblemUnexpected,
-);
+        "InternalProblemUnexpected", templateInternalProblemUnexpected,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnexpected(String string, String string2) {
@@ -2309,9 +2410,8 @@
 const Code<Message Function(String string, String string2)>
     codeInternalProblemUnhandled =
     const Code<Message Function(String string, String string2)>(
-  "InternalProblemUnhandled",
-  templateInternalProblemUnhandled,
-);
+        "InternalProblemUnhandled", templateInternalProblemUnhandled,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnhandled(String string, String string2) {
@@ -2330,9 +2430,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String string)> codeInternalProblemUnimplemented =
     const Code<Message Function(String string)>(
-  "InternalProblemUnimplemented",
-  templateInternalProblemUnimplemented,
-);
+        "InternalProblemUnimplemented", templateInternalProblemUnimplemented,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnimplemented(String string) {
@@ -2350,9 +2449,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeInternalProblemUnsupported =
     const Code<Message Function(String name)>(
-  "InternalProblemUnsupported",
-  templateInternalProblemUnsupported,
-);
+        "InternalProblemUnsupported", templateInternalProblemUnsupported,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnsupported(String name) {
@@ -2370,10 +2468,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(Uri uri_)> codeInternalProblemUriMissingScheme =
-    const Code<Message Function(Uri uri_)>(
-  "InternalProblemUriMissingScheme",
-  templateInternalProblemUriMissingScheme,
-);
+    const Code<Message Function(Uri uri_)>("InternalProblemUriMissingScheme",
+        templateInternalProblemUriMissingScheme,
+        severity: Severity.internalProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUriMissingScheme(Uri uri_) {
@@ -2835,6 +2932,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageListLiteralTooManyTypeArguments = const MessageCode(
     "ListLiteralTooManyTypeArguments",
+    severity: Severity.errorLegacyWarning,
     message: r"""Too many type arguments on List literal.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2844,6 +2942,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageListLiteralTypeArgumentMismatch = const MessageCode(
     "ListLiteralTypeArgumentMismatch",
+    severity: Severity.errorLegacyWarning,
     message: r"""Map literal requires two type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2858,9 +2957,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(Uri uri_)> codeLoadLibraryHidesMember =
     const Code<Message Function(Uri uri_)>(
-  "LoadLibraryHidesMember",
-  templateLoadLibraryHidesMember,
-);
+        "LoadLibraryHidesMember", templateLoadLibraryHidesMember,
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsLoadLibraryHidesMember(Uri uri_) {
@@ -2879,6 +2977,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLoadLibraryTakesNoArguments = const MessageCode(
     "LoadLibraryTakesNoArguments",
+    severity: Severity.errorLegacyWarning,
     message: r"""'loadLibrary' takes no arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2893,9 +2992,8 @@
 const Code<Message Function(String name, Uri uri_)>
     codeLocalDefinitionHidesExport =
     const Code<Message Function(String name, Uri uri_)>(
-  "LocalDefinitionHidesExport",
-  templateLocalDefinitionHidesExport,
-);
+        "LocalDefinitionHidesExport", templateLocalDefinitionHidesExport,
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsLocalDefinitionHidesExport(String name, Uri uri_) {
@@ -2917,9 +3015,8 @@
 const Code<Message Function(String name, Uri uri_)>
     codeLocalDefinitionHidesImport =
     const Code<Message Function(String name, Uri uri_)>(
-  "LocalDefinitionHidesImport",
-  templateLocalDefinitionHidesImport,
-);
+        "LocalDefinitionHidesImport", templateLocalDefinitionHidesImport,
+        severity: Severity.nit);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsLocalDefinitionHidesImport(String name, Uri uri_) {
@@ -2957,9 +3054,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeMethodNotFound =
     const Code<Message Function(String name)>(
-  "MethodNotFound",
-  templateMethodNotFound,
-);
+        "MethodNotFound", templateMethodNotFound,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMethodNotFound(String name) {
@@ -3258,6 +3354,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonInstanceTypeVariableUse = const MessageCode(
     "NonInstanceTypeVariableUse",
+    severity: Severity.errorLegacyWarning,
     message: r"""Can only use type variables in instance methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3281,7 +3378,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeNotAType =
     const Code<Message Function(String name)>("NotAType", templateNotAType,
-        analyzerCode: "NOT_A_TYPE");
+        analyzerCode: "NOT_A_TYPE",
+        dart2jsCode: "*ignored*",
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNotAType(String name) {
@@ -3443,9 +3542,8 @@
 const Code<Message Function(String name, String name2)>
     codeOverrideFewerNamedArguments =
     const Code<Message Function(String name, String name2)>(
-  "OverrideFewerNamedArguments",
-  templateOverrideFewerNamedArguments,
-);
+        "OverrideFewerNamedArguments", templateOverrideFewerNamedArguments,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideFewerNamedArguments(String name, String name2) {
@@ -3470,9 +3568,9 @@
 const Code<Message Function(String name, String name2)>
     codeOverrideFewerPositionalArguments =
     const Code<Message Function(String name, String name2)>(
-  "OverrideFewerPositionalArguments",
-  templateOverrideFewerPositionalArguments,
-);
+        "OverrideFewerPositionalArguments",
+        templateOverrideFewerPositionalArguments,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideFewerPositionalArguments(
@@ -3499,9 +3597,9 @@
 const Code<Message Function(String name, String name2, String name3)>
     codeOverrideMismatchNamedParameter =
     const Code<Message Function(String name, String name2, String name3)>(
-  "OverrideMismatchNamedParameter",
-  templateOverrideMismatchNamedParameter,
-);
+        "OverrideMismatchNamedParameter",
+        templateOverrideMismatchNamedParameter,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideMismatchNamedParameter(
@@ -3527,9 +3625,8 @@
 const Code<Message Function(String name, String name2)>
     codeOverrideMoreRequiredArguments =
     const Code<Message Function(String name, String name2)>(
-  "OverrideMoreRequiredArguments",
-  templateOverrideMoreRequiredArguments,
-);
+        "OverrideMoreRequiredArguments", templateOverrideMoreRequiredArguments,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideMoreRequiredArguments(String name, String name2) {
@@ -3645,9 +3742,8 @@
 const Code<Message Function(String name, String name2)>
     codeOverrideTypeVariablesMismatch =
     const Code<Message Function(String name, String name2)>(
-  "OverrideTypeVariablesMismatch",
-  templateOverrideTypeVariablesMismatch,
-);
+        "OverrideTypeVariablesMismatch", templateOverrideTypeVariablesMismatch,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideTypeVariablesMismatch(String name, String name2) {
@@ -3696,9 +3792,8 @@
 const Code<Message Function(Uri uri_, String name, String name2)>
     codePartOfLibraryNameMismatch =
     const Code<Message Function(Uri uri_, String name, String name2)>(
-  "PartOfLibraryNameMismatch",
-  templatePartOfLibraryNameMismatch,
-);
+        "PartOfLibraryNameMismatch", templatePartOfLibraryNameMismatch,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartOfLibraryNameMismatch(
@@ -3743,9 +3838,8 @@
 const Code<Message Function(Uri uri_, Uri uri2_, Uri uri3_)>
     codePartOfUriMismatch =
     const Code<Message Function(Uri uri_, Uri uri2_, Uri uri3_)>(
-  "PartOfUriMismatch",
-  templatePartOfUriMismatch,
-);
+        "PartOfUriMismatch", templatePartOfUriMismatch,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartOfUriMismatch(Uri uri_, Uri uri2_, Uri uri3_) {
@@ -3776,9 +3870,8 @@
 const Code<Message Function(Uri uri_, Uri uri2_, String name)>
     codePartOfUseUri =
     const Code<Message Function(Uri uri_, Uri uri2_, String name)>(
-  "PartOfUseUri",
-  templatePartOfUseUri,
-);
+        "PartOfUseUri", templatePartOfUseUri,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartOfUseUri(Uri uri_, Uri uri2_, String name) {
@@ -3978,9 +4071,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeRedirectionTargetNotFound =
     const Code<Message Function(String name)>(
-  "RedirectionTargetNotFound",
-  templateRedirectionTargetNotFound,
-);
+        "RedirectionTargetNotFound", templateRedirectionTargetNotFound,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectionTargetNotFound(String name) {
@@ -4010,6 +4102,7 @@
 const MessageCode messageReturnTypeFunctionExpression = const MessageCode(
     "ReturnTypeFunctionExpression",
     dart2jsCode: "*ignored*",
+    severity: Severity.errorLegacyWarning,
     message: r"""A function expression can't have a return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4090,9 +4183,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeSetterNotFound =
     const Code<Message Function(String name)>(
-  "SetterNotFound",
-  templateSetterNotFound,
-);
+        "SetterNotFound", templateSetterNotFound,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSetterNotFound(String name) {
@@ -4301,9 +4393,10 @@
 const Code<Message Function(String name)>
     codeSuperclassHasNoDefaultConstructor =
     const Code<Message Function(String name)>(
-  "SuperclassHasNoDefaultConstructor",
-  templateSuperclassHasNoDefaultConstructor,
-);
+        "SuperclassHasNoDefaultConstructor",
+        templateSuperclassHasNoDefaultConstructor,
+        analyzerCode: "NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT",
+        dart2jsCode: "*ignored*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoDefaultConstructor(String name) {
@@ -4322,9 +4415,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeSuperclassHasNoGetter =
     const Code<Message Function(String name)>(
-  "SuperclassHasNoGetter",
-  templateSuperclassHasNoGetter,
-);
+        "SuperclassHasNoGetter", templateSuperclassHasNoGetter,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoGetter(String name) {
@@ -4343,7 +4435,9 @@
 const Code<Message Function(String name)> codeSuperclassHasNoMethod =
     const Code<Message Function(String name)>(
         "SuperclassHasNoMethod", templateSuperclassHasNoMethod,
-        analyzerCode: "UNDEFINED_SUPER_METHOD");
+        analyzerCode: "UNDEFINED_SUPER_METHOD",
+        dart2jsCode: "*ignored*",
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoMethod(String name) {
@@ -4361,9 +4455,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeSuperclassHasNoSetter =
     const Code<Message Function(String name)>(
-  "SuperclassHasNoSetter",
-  templateSuperclassHasNoSetter,
-);
+        "SuperclassHasNoSetter", templateSuperclassHasNoSetter,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoSetter(String name) {
@@ -4385,9 +4478,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeSuperclassMethodArgumentMismatch =
     const Code<Message Function(String name)>(
-  "SuperclassMethodArgumentMismatch",
-  templateSuperclassMethodArgumentMismatch,
-);
+        "SuperclassMethodArgumentMismatch",
+        templateSuperclassMethodArgumentMismatch,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassMethodArgumentMismatch(String name) {
@@ -4452,6 +4545,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSwitchCaseFallThrough = const MessageCode(
     "SwitchCaseFallThrough",
+    severity: Severity.errorLegacyWarning,
     message: r"""Switch case may fall through to the next case.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4543,9 +4637,8 @@
 const Code<Message Function(String name, String string)>
     codeTypeArgumentMismatch =
     const Code<Message Function(String name, String string)>(
-  "TypeArgumentMismatch",
-  templateTypeArgumentMismatch,
-);
+        "TypeArgumentMismatch", templateTypeArgumentMismatch,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeArgumentMismatch(String name, String string) {
@@ -4565,9 +4658,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeTypeArgumentsOnTypeVariable =
     const Code<Message Function(String name)>(
-  "TypeArgumentsOnTypeVariable",
-  templateTypeArgumentsOnTypeVariable,
-);
+        "TypeArgumentsOnTypeVariable", templateTypeArgumentsOnTypeVariable,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeArgumentsOnTypeVariable(String name) {
@@ -4585,9 +4677,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeTypeNotFound =
     const Code<Message Function(String name)>(
-  "TypeNotFound",
-  templateTypeNotFound,
-);
+        "TypeNotFound", templateTypeNotFound,
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeNotFound(String name) {
@@ -4632,6 +4723,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableInStaticContext = const MessageCode(
     "TypeVariableInStaticContext",
+    severity: Severity.errorLegacyWarning,
     message: r"""Type variables can't be used in static members.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4792,6 +4884,16 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeUnimplementedBoundsOnTypeVariables =
+    messageUnimplementedBoundsOnTypeVariables;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageUnimplementedBoundsOnTypeVariables = const MessageCode(
+    "UnimplementedBoundsOnTypeVariables",
+    severity: Severity.warning,
+    message: r"""Unimplemented bounds on type variables.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string, Token token)>
     templateUnmatchedToken =
     const Template<Message Function(String string, Token token)>(
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 6184d00..e2d9584 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4,6 +4,9 @@
 
 library fasta.body_builder;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
 
 import 'package:kernel/type_algebra.dart' show instantiateToBounds;
@@ -1053,7 +1056,8 @@
         ? fasta.templateSuperclassHasNoGetter.withArguments(name.name)
         : fasta.templateGetterNotFound.withArguments(name.name);
     if (reportWarning) {
-      addWarning(message, charOffset, name.name.length, context: context);
+      addProblemErrorIfConst(message, charOffset, name.name.length,
+          context: context);
     }
     return message;
   }
@@ -1065,7 +1069,8 @@
         ? fasta.templateSuperclassHasNoSetter.withArguments(name.name)
         : fasta.templateSetterNotFound.withArguments(name.name);
     if (reportWarning) {
-      addWarning(message, charOffset, name.name.length, context: context);
+      addProblemErrorIfConst(message, charOffset, name.name.length,
+          context: context);
     }
     return message;
   }
@@ -1077,14 +1082,15 @@
         ? fasta.templateSuperclassHasNoMethod.withArguments(name.name)
         : fasta.templateMethodNotFound.withArguments(name.name);
     if (reportWarning) {
-      addWarning(message, charOffset, name.name.length, context: context);
+      addProblemErrorIfConst(message, charOffset, name.name.length,
+          context: context);
     }
     return message;
   }
 
   @override
   void warnTypeArgumentsMismatch(String name, int expected, int charOffset) {
-    addWarning(
+    addProblemErrorIfConst(
         fasta.templateTypeArgumentMismatch.withArguments(name, '${expected}'),
         charOffset,
         name.length);
@@ -1363,8 +1369,10 @@
       // Contains more than just \' or \".
       if (first.lexeme.length > 1) {
         String value = unescapeFirstStringPart(first.lexeme, quote);
-        expressions.add(
-            new ShadowStringLiteral(value)..fileOffset = offsetForToken(first));
+        if (value.isNotEmpty) {
+          expressions.add(new ShadowStringLiteral(value)
+            ..fileOffset = offsetForToken(first));
+        }
       }
       for (int i = 1; i < parts.length - 1; i++) {
         var part = parts[i];
@@ -1381,8 +1389,10 @@
       // Contains more than just \' or \".
       if (last.lexeme.length > 1) {
         String value = unescapeLastStringPart(last.lexeme, quote);
-        expressions.add(
-            new ShadowStringLiteral(value)..fileOffset = offsetForToken(last));
+        if (value.isNotEmpty) {
+          expressions.add(new ShadowStringLiteral(value)
+            ..fileOffset = offsetForToken(last));
+        }
       }
       push(new ShadowStringConcatenation(expressions)
         ..fileOffset = offsetForToken(endToken));
@@ -1714,7 +1724,7 @@
       typeArgument = typeArguments.first;
       if (typeArguments.length > 1) {
         typeArgument = null;
-        warningNotError(fasta.messageListLiteralTooManyTypeArguments,
+        addProblem(fasta.messageListLiteralTooManyTypeArguments,
             beginToken.charOffset);
       } else {
         typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
@@ -1763,7 +1773,7 @@
       if (typeArguments.length != 2) {
         keyType = null;
         valueType = null;
-        warningNotError(fasta.messageListLiteralTypeArgumentMismatch,
+        addProblem(fasta.messageListLiteralTypeArgumentMismatch,
             beginToken.charOffset);
       } else {
         keyType = instantiateToBounds(typeArguments[0], coreTypes.objectClass);
@@ -1835,7 +1845,7 @@
             isQualified: true, prefix: prefix);
       } else {
         String displayName = debugName(getNodeName(prefix), suffix.name);
-        warningNotError(fasta.templateNotAType.withArguments(displayName),
+        addProblem(fasta.templateNotAType.withArguments(displayName),
             beginToken.charOffset);
         push(const InvalidType());
         return;
@@ -1844,13 +1854,13 @@
     if (name is TypeDeclarationAccessor) {
       push(name.buildType(arguments));
     } else if (name is FastaAccessor) {
-      warningNotError(fasta.templateNotAType.withArguments(beginToken.lexeme),
+      addProblem(fasta.templateNotAType.withArguments(beginToken.lexeme),
           beginToken.charOffset);
       push(const InvalidType());
     } else if (name is TypeBuilder) {
       push(name.build(library));
     } else if (name is PrefixBuilder) {
-      warningNotError(fasta.templateNotAType.withArguments(name.name),
+      addProblem(fasta.templateNotAType.withArguments(name.name),
           beginToken.charOffset);
       push(const InvalidType());
     } else {
@@ -3219,9 +3229,9 @@
     DartType bound = pop();
     if (bound != null) {
       // TODO(ahe): To handle F-bounded types, this needs to be a TypeBuilder.
-      warningNotError(
-          fasta.templateInternalProblemUnimplemented
-              .withArguments("bounds on type variables"),
+      // TODO(askesc): Remove message type when no longer needed.
+      // https://github.com/dart-lang/sdk/issues/31766
+      addProblem(fasta.messageUnimplementedBoundsOnTypeVariables,
           offsetForToken(extendsOrSuper.next));
     }
     Identifier name = pop();
@@ -3323,7 +3333,7 @@
   }
 
   Expression buildFallThroughError(int charOffset) {
-    warningNotError(fasta.messageSwitchCaseFallThrough, charOffset);
+    addProblem(fasta.messageSwitchCaseFallThrough, charOffset);
 
     Location location = messages.getLocationFromUri(uri, charOffset);
 
@@ -3339,7 +3349,7 @@
   Expression buildAbstractClassInstantiationError(
       Message message, String className,
       [int charOffset = -1]) {
-    addWarning(message, charOffset, className.length);
+    addProblemErrorIfConst(message, charOffset, className.length);
     Builder constructor = library.loader.getAbstractClassInstantiationError();
     return new Throw(buildStaticInvocation(constructor.target,
         new ShadowArguments(<Expression>[new StringLiteral(className)])));
@@ -3399,11 +3409,11 @@
       if (builder.isFinal && builder.hasInitializer) {
         // TODO(ahe): If CL 2843733002 is landed, this becomes a compile-time
         // error. Also, this is a compile-time error in strong mode.
-        warningNotError(
+        addProblem(
             fasta.templateFinalInstanceVariableAlreadyInitialized
                 .withArguments(name),
             offset);
-        warningNotError(
+        addProblem(
             fasta.templateFinalInstanceVariableAlreadyInitializedCause
                 .withArguments(name),
             builder.charOffset);
@@ -3500,7 +3510,7 @@
       if (nonInstanceAccessIsError) {
         addCompileTimeError(message, offset, length);
       } else {
-        addWarning(message, offset, length);
+        addProblemErrorIfConst(message, offset, length);
       }
       return const InvalidType();
     } else if (constantExpressionRequired) {
@@ -3553,7 +3563,7 @@
           warnUnresolvedMethod(name, offset, isSuper: true);
         } else if (!areArgumentsCompatible(target.function, arguments)) {
           target = null;
-          addWarning(
+          addProblemErrorIfConst(
               fasta.templateSuperclassMethodArgumentMismatch
                   .withArguments(name.name),
               offset,
@@ -3594,26 +3604,24 @@
     library.addCompileTimeError(message, charOffset, uri);
   }
 
-  void warningNotError(Message message, int charOffset) {
-    library.addWarning(message, charOffset, uri);
+  void addProblem(Message message, int charOffset) {
+    library.addProblem(message, charOffset, uri);
   }
 
   @override
-  void addWarning(Message message, int charOffset, int length,
+  void addProblemErrorIfConst(Message message, int charOffset, int length,
       {LocatedMessage context}) {
+    // TODO(askesc): Instead of deciding on the severity, this method should
+    // take two messages: one to use when a constant expression is
+    // required and one to use otherwise.
     if (constantExpressionRequired) {
       addCompileTimeError(message, charOffset, length);
     } else {
-      library.addWarning(message, charOffset, uri, context: context);
+      library.addProblem(message, charOffset, uri, context: context);
     }
   }
 
   @override
-  void addNit(Message message, int charOffset) {
-    library.addNit(message, charOffset, uri);
-  }
-
-  @override
   void debugEvent(String name) {
     // printEvent('BodyBuilder: $name');
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
index 2dc4f3b..e76982b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -149,7 +149,7 @@
   DartType validatedTypeVariableUse(
       TypeParameterType type, int offset, bool nonInstanceAccessIsError);
 
-  void addWarning(Message message, int charOffset, int length);
+  void addProblemErrorIfConst(Message message, int charOffset, int length);
 
   Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
 
@@ -672,7 +672,7 @@
 
   Expression doInvocation(int offset, Arguments arguments) {
     return helper.buildMethodInvocation(
-        buildSimpleRead(), callName, arguments, offset,
+        buildSimpleRead(), callName, arguments, arguments.fileOffset,
         isImplicitCall: true);
   }
 
@@ -814,7 +814,7 @@
 
   Expression doInvocation(int offset, Arguments arguments) {
     if (arguments.positional.length > 0 || arguments.named.length > 0) {
-      helper.addWarning(
+      helper.addProblemErrorIfConst(
           messageLoadLibraryTakesNoArguments, offset, 'loadLibrary'.length);
     }
     return builder.createLoadLibrary(offset);
@@ -1043,7 +1043,7 @@
       int offset = offsetForToken(token);
       if (declaration is KernelInvalidTypeBuilder) {
         KernelInvalidTypeBuilder declaration = this.declaration;
-        helper.addWarning(
+        helper.addProblemErrorIfConst(
             declaration.message.messageObject, offset, token.length);
         super.expression = new Throw(
             new StringLiteral(declaration.message.message)
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 98a27ca..20555a2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -66,6 +66,7 @@
         ProcedureBuilder,
         Scope,
         TypeVariableBuilder,
+        TypeBuilder,
         computeDefaultTypeArguments;
 
 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
@@ -74,6 +75,9 @@
     extends ClassBuilder<KernelTypeBuilder, InterfaceType> {
   KernelClassBuilder actualOrigin;
 
+  @override
+  List<TypeBuilder> calculatedBounds;
+
   KernelClassBuilder(
       List<MetadataBuilder> metadata,
       int modifiers,
@@ -120,6 +124,7 @@
 
   InterfaceType buildType(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    arguments ??= calculatedBounds;
     List<DartType> typeArguments;
     if (arguments != null) {
       typeArguments = buildTypeArguments(library, arguments);
@@ -167,7 +172,7 @@
               if (builder.isConst) {
                 addCompileTimeError(message, builder.charOffset);
               } else {
-                addWarning(message, builder.charOffset);
+                addProblem(message, builder.charOffset);
               }
               // CoreTypes aren't computed yet, and this is the outline
               // phase. So we can't and shouldn't create a method body.
@@ -225,6 +230,16 @@
           checkMethodOverride(
               hierarchy, typeEnvironment, declaredMember, interfaceMember);
         }
+        if (declaredMember.kind == ProcedureKind.Getter &&
+            interfaceMember.kind == ProcedureKind.Getter) {
+          checkGetterOverride(
+              hierarchy, typeEnvironment, declaredMember, interfaceMember);
+        }
+        if (declaredMember.kind == ProcedureKind.Setter &&
+            interfaceMember.kind == ProcedureKind.Setter) {
+          checkSetterOverride(
+              hierarchy, typeEnvironment, declaredMember, interfaceMember);
+        }
       }
       // TODO(ahe): Handle other cases: accessors, operators, and fields.
     });
@@ -251,7 +266,7 @@
     }
     if (declaredFunction?.typeParameters?.length !=
         interfaceFunction?.typeParameters?.length) {
-      addWarning(
+      addProblem(
           templateOverrideTypeVariablesMismatch.withArguments(
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
@@ -364,7 +379,7 @@
             interfaceFunction.requiredParameterCount ||
         declaredFunction.positionalParameters.length <
             interfaceFunction.positionalParameters.length) {
-      addWarning(
+      addProblem(
           templateOverrideFewerPositionalArguments.withArguments(
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
@@ -377,7 +392,7 @@
     }
     if (interfaceFunction.requiredParameterCount <
         declaredFunction.requiredParameterCount) {
-      addWarning(
+      addProblem(
           templateOverrideMoreRequiredArguments.withArguments(
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
@@ -409,7 +424,7 @@
     }
     if (declaredFunction.namedParameters.length <
         interfaceFunction.namedParameters.length) {
-      addWarning(
+      addProblem(
           templateOverrideFewerNamedArguments.withArguments(
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
@@ -430,7 +445,7 @@
       while (declaredNamedParameters.current.name !=
           interfaceNamedParameters.current.name) {
         if (!declaredNamedParameters.moveNext()) {
-          addWarning(
+          addProblem(
               templateOverrideMismatchNamedParameter.withArguments(
                   "$name::${declaredMember.name.name}",
                   interfaceNamedParameters.current.name,
@@ -457,6 +472,51 @@
     }
   }
 
+  void checkGetterOverride(
+      ClassHierarchy hierarchy,
+      TypeEnvironment typeEnvironment,
+      Procedure declaredMember,
+      Procedure interfaceMember) {
+    if (declaredMember.enclosingClass != cls) {
+      // TODO(paulberry): Include these checks as well, but the message needs to
+      // explain that [declaredMember] is inherited.
+      return;
+    }
+    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
+        hierarchy, declaredMember, interfaceMember, null, null);
+    var declaredType = declaredMember.getterType;
+    var interfaceType = interfaceMember.getterType;
+    _checkTypes(typeEnvironment, interfaceSubstitution, declaredMember,
+        interfaceMember, declaredType, interfaceType, false, null);
+  }
+
+  void checkSetterOverride(
+      ClassHierarchy hierarchy,
+      TypeEnvironment typeEnvironment,
+      Procedure declaredMember,
+      Procedure interfaceMember) {
+    if (declaredMember.enclosingClass != cls) {
+      // TODO(paulberry): Include these checks as well, but the message needs to
+      // explain that [declaredMember] is inherited.
+      return;
+    }
+    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
+        hierarchy, declaredMember, interfaceMember, null, null);
+    var declaredType = declaredMember.setterType;
+    var interfaceType = interfaceMember.setterType;
+    var declaredParameter = declaredMember.function.positionalParameters[0];
+    bool isCovariant = declaredParameter.isCovariant;
+    _checkTypes(
+        typeEnvironment,
+        interfaceSubstitution,
+        declaredMember,
+        interfaceMember,
+        declaredType,
+        interfaceType,
+        isCovariant,
+        declaredParameter);
+  }
+
   String get fullNameForErrors {
     return isMixinApplication
         ? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
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 263fef7..6cd24dd 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
@@ -26,6 +26,7 @@
         LibraryBuilder,
         MetadataBuilder,
         TypeVariableBuilder,
+        TypeBuilder,
         computeDefaultTypeArguments;
 
 class KernelFunctionTypeAliasBuilder
@@ -34,6 +35,9 @@
 
   DartType thisType;
 
+  @override
+  List<TypeBuilder> calculatedBounds;
+
   KernelFunctionTypeAliasBuilder(
       List<MetadataBuilder> metadata,
       String name,
@@ -96,6 +100,7 @@
   @override
   DartType buildType(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    arguments ??= calculatedBounds;
     var thisType = buildThisType(library);
     if (thisType is DynamicType) return thisType;
     FunctionType result = thisType;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
index 2784668..68c8f62 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
@@ -30,7 +30,7 @@
   /// [Arguments] have already been built.
   DartType buildTypesWithBuiltArguments(
       LibraryBuilder library, List<DartType> arguments) {
-    library.addWarning(message.messageObject, message.charOffset, message.uri);
+    library.addProblem(message.messageObject, message.charOffset, message.uri);
     return const InvalidType();
   }
 }
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 0060ec9..22dcea1 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
@@ -20,7 +20,9 @@
         messageTypeVariableSameNameAsEnclosing,
         templateConflictsWithTypeVariable,
         templateDuplicatedExport,
+        templateDuplicatedExportInType,
         templateDuplicatedImport,
+        templateDuplicatedImportInType,
         templateExportHidesExport,
         templateIllegalMethodName,
         templateImportHidesImport,
@@ -75,7 +77,6 @@
         QualifiedName,
         Scope,
         TypeBuilder,
-        TypeDeclarationBuilder,
         TypeVariableBuilder,
         VoidTypeBuilder,
         compareProcedures,
@@ -924,14 +925,15 @@
         var template = isExport
             ? templateLocalDefinitionHidesExport
             : templateLocalDefinitionHidesImport;
-        addNit(template.withArguments(name, hiddenUri), charOffset, fileUri);
+        addProblem(
+            template.withArguments(name, hiddenUri), charOffset, fileUri);
       } else if (isLoadLibrary) {
-        addNit(templateLoadLibraryHidesMember.withArguments(preferredUri),
+        addProblem(templateLoadLibraryHidesMember.withArguments(preferredUri),
             charOffset, fileUri);
       } else {
         var template =
             isExport ? templateExportHidesExport : templateImportHidesImport;
-        addNit(template.withArguments(name, preferredUri, hiddenUri),
+        addProblem(template.withArguments(name, preferredUri, hiddenUri),
             charOffset, fileUri);
       }
       return preferred;
@@ -951,8 +953,12 @@
     var template =
         isExport ? templateDuplicatedExport : templateDuplicatedImport;
     Message message = template.withArguments(name, uri, otherUri);
-    addNit(message, charOffset, fileUri);
-    return new KernelInvalidTypeBuilder(name, charOffset, fileUri, message);
+    addProblem(message, charOffset, fileUri);
+    var builderTemplate = isExport
+        ? templateDuplicatedExportInType
+        : templateDuplicatedImportInType;
+    return new KernelInvalidTypeBuilder(name, charOffset, fileUri,
+        builderTemplate.withArguments(name, uri, otherUri));
   }
 
   int finishDeferredLoadTearoffs() {
@@ -1009,34 +1015,24 @@
     return count;
   }
 
-  /// Instantiates the type parameters in all raw generic types in [types] to
-  /// their bounds.  The list of types is cleared when done.
   int instantiateToBound(TypeBuilder dynamicType, ClassBuilder objectClass) {
     int count = 0;
 
-    for (var type in types) {
-      if (type.builder is! NamedTypeBuilder) {
-        continue;
-      }
-      NamedTypeBuilder typeBuilder = type.builder as NamedTypeBuilder;
-      TypeDeclarationBuilder typeDeclarationBuilder = typeBuilder.builder;
-      List<TypeVariableBuilder> typeParameters;
-
-      if (typeDeclarationBuilder is KernelClassBuilder) {
-        typeParameters = typeDeclarationBuilder.typeVariables;
-      } else if (typeDeclarationBuilder is KernelFunctionTypeAliasBuilder) {
-        typeParameters = typeDeclarationBuilder.typeVariables;
-      }
-
-      if (typeParameters != null &&
-          typeParameters.length > 0 &&
-          typeBuilder.arguments == null) {
-        typeBuilder.arguments =
-            calculateBounds(typeParameters, dynamicType, objectClass);
-        count += typeParameters.length;
+    for (var declarationBuilder in libraryDeclaration.members.values) {
+      if (declarationBuilder is KernelClassBuilder) {
+        if (declarationBuilder.typeVariables != null) {
+          declarationBuilder.calculatedBounds = calculateBounds(
+              declarationBuilder.typeVariables, dynamicType, objectClass);
+          count += declarationBuilder.calculatedBounds.length;
+        }
+      } else if (declarationBuilder is KernelFunctionTypeAliasBuilder) {
+        if (declarationBuilder.typeVariables != null) {
+          declarationBuilder.calculatedBounds = calculateBounds(
+              declarationBuilder.typeVariables, dynamicType, objectClass);
+          count += declarationBuilder.calculatedBounds.length;
+        }
       }
     }
-    types.clear();
 
     return count;
   }
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 c2ee7b3..b6c0c8d 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
@@ -184,7 +184,7 @@
               substitution[parameter] = const DynamicType();
             }
           }
-          library.addWarning(
+          library.addProblem(
               messageNonInstanceTypeVariableUse, charOffset, fileUri);
           return substitute(type, substitution);
         }
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 ab33cc1..beb24cf 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
@@ -17,6 +17,10 @@
 /// This means that in some cases multiple shadow classes may extend the same
 /// kernel class, because multiple constructs in Dart may desugar to a tree
 /// with the same kind of root node.
+
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import 'package:front_end/src/base/instrumentation.dart';
 import 'package:front_end/src/fasta/kernel/body_builder.dart';
 import 'package:front_end/src/fasta/kernel/fasta_accessors.dart';
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 3244bb5..1495999 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -342,6 +342,7 @@
           (LocatedMessage message) => new ExpressionStatement(new Throw(
               new StringLiteral(context.format(message, Severity.error)))))));
     }
+    loader.libraries.add(library.library);
     library.build(loader.coreLibrary);
     return link(<Library>[library.library]);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index 0f1c5ac..867d27b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -45,7 +45,7 @@
     if (arguments != null) {
       int charOffset = -1; // TODO(ahe): Provide these.
       Uri fileUri = null; // TODO(ahe): Provide these.
-      library.addWarning(
+      library.addProblem(
           templateTypeArgumentsOnTypeVariable.withArguments(name),
           charOffset,
           fileUri);
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 576e2a6..8c40e68 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -19,8 +19,11 @@
         SummaryTemplate,
         Template,
         messagePlatformPrivateLibraryAccess,
+        templateInternalProblemMissingSeverity,
         templateSourceBodySummary;
 
+import 'problems.dart' show internalProblem;
+
 import 'severity.dart' show Severity;
 
 import 'target_implementation.dart' show TargetImplementation;
@@ -191,22 +194,29 @@
   /// otherwise it is added to [unhandledErrors].
   void addCompileTimeError(Message message, int charOffset, Uri fileUri,
       {bool wasHandled: false, LocatedMessage context}) {
-    if (addMessage(message, charOffset, fileUri, Severity.error,
-        context: context)) {
-      (wasHandled ? handledErrors : unhandledErrors)
-          .add(message.withLocation(fileUri, charOffset));
+    addMessage(message, charOffset, fileUri, Severity.error,
+        wasHandled: wasHandled, context: context);
+  }
+
+  /// Register [message] as a problem with a severity determined by the
+  /// intrinsic severity of the message.
+  void addProblem(Message message, int charOffset, Uri fileUri,
+      {LocatedMessage context}) {
+    Severity severity = message.code.severity;
+    if (severity == null) {
+      addMessage(message, charOffset, fileUri, Severity.error,
+          context: context);
+      internalProblem(
+          templateInternalProblemMissingSeverity
+              .withArguments(message.code.name),
+          charOffset,
+          fileUri);
     }
-  }
-
-  void addWarning(Message message, int charOffset, Uri fileUri,
-      {LocatedMessage context}) {
-    addMessage(message, charOffset, fileUri, Severity.warning,
-        context: context);
-  }
-
-  void addNit(Message message, int charOffset, Uri fileUri,
-      {LocatedMessage context}) {
-    addMessage(message, charOffset, fileUri, Severity.nit, context: context);
+    if (severity == Severity.errorLegacyWarning) {
+      severity =
+          target.backendTarget.strongMode ? Severity.error : Severity.warning;
+    }
+    addMessage(message, charOffset, fileUri, severity, context: context);
   }
 
   /// All messages reported by the compiler (errors, warnings, etc.) are routed
@@ -217,7 +227,7 @@
   /// three times by `OutlineBuilder`, `DietListener`, and `BodyBuilder`.
   bool addMessage(
       Message message, int charOffset, Uri fileUri, Severity severity,
-      {LocatedMessage context}) {
+      {bool wasHandled: false, LocatedMessage context}) {
     String trace = """
 message: ${message.message}
 charOffset: $charOffset
@@ -230,6 +240,10 @@
       target.context.report(context, severity);
     }
     recordMessage(severity, message, charOffset, fileUri, context: context);
+    if (severity == Severity.error) {
+      (wasHandled ? handledErrors : unhandledErrors)
+          .add(message.withLocation(fileUri, charOffset));
+    }
     return true;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
index b371988..ad8d6e5 100644
--- a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -31,6 +31,50 @@
   return true;
 }
 
+/// Parse modifiers in the token stream, and return a context with information
+/// about what was parsed. [start] is the last token consumed by the parser
+/// prior to calling this method and [context.lastModifier] is the last token
+/// consumed by this method when this method returns. If no modifiers were
+/// parsed, then [context.lastModifier] will be the same as [start].
+///
+/// This method is used in most locations where modifiers can occur. However,
+/// it isn't used when parsing a class or when parsing the modifiers of a
+/// member function (non-local), but is used when parsing their formal
+/// parameters.
+///
+/// When parsing the formal parameters of any function, [parameterKind] is
+/// non-null.
+ModifierContext parseModifiersOpt(
+    Parser parser,
+    Token start,
+    MemberKind memberKind,
+    FormalParameterKind parameterKind,
+    bool isVarAllowed,
+    TypeContinuation typeContiunation) {
+  ModifierContext context = new ModifierContext(
+      parser, memberKind, parameterKind, isVarAllowed, typeContiunation);
+  Token token = context.parseOpt(start);
+
+  // If the next token is a modifier,
+  // then it's probably out of order and we need to recover from that.
+  if (isModifier(token.next)) {
+    // Recovery
+    context = new ModifierRecoveryContext(
+        parser, memberKind, parameterKind, isVarAllowed, typeContiunation);
+    token = context.parseOpt(start);
+  }
+
+  parser.listener.handleModifiers(context.modifierCount);
+
+  context.typeContinuation ??=
+      (isVarAllowed || context.memberKind == MemberKind.GeneralizedFunctionType)
+          ? TypeContinuation.Required
+          : TypeContinuation.Optional;
+  context.lastModifier = token;
+
+  return context;
+}
+
 class ModifierContext {
   final Parser parser;
   MemberKind memberKind;
@@ -38,6 +82,11 @@
   final bool isVarAllowed;
   TypeContinuation typeContinuation;
   int modifierCount = 0;
+  Token varFinalOrConst;
+
+  /// The last token consumed by the [parseOpt] method, or the same token
+  /// that was passed into the [parseOpt] method if no tokens were consumed.
+  Token lastModifier;
 
   ModifierContext(this.parser, this.memberKind, this.parameterKind,
       this.isVarAllowed, this.typeContinuation);
@@ -88,6 +137,7 @@
       // return token.next;
     }
     typeContinuation ??= TypeContinuation.Optional;
+    varFinalOrConst ??= next;
     modifierCount++;
     return parser.parseModifier(token);
   }
@@ -147,12 +197,14 @@
 
   Token parseFinal(Token token) {
     Token next = token.next;
+    assert(optional('final', next));
     if (!isVarAllowed && parameterKind == null) {
       parser.reportRecoverableErrorWithToken(
           next, fasta.templateExtraneousModifier);
       return next;
     }
     typeContinuation ??= TypeContinuation.Optional;
+    varFinalOrConst ??= next;
     modifierCount++;
     return parser.parseModifier(token);
   }
@@ -188,8 +240,9 @@
   }
 
   Token parseVar(Token token) {
+    Token next = token.next;
+    assert(optional('var', next));
     if (!isVarAllowed && parameterKind == null) {
-      Token next = token.next;
       parser.reportRecoverableErrorWithToken(
           next, fasta.templateExtraneousModifier);
       return next;
@@ -212,6 +265,7 @@
         typeContinuation = TypeContinuation.OptionalAfterVar;
         break;
     }
+    varFinalOrConst ??= next;
     modifierCount++;
     return parser.parseModifier(token);
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 786d564..35a452c 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -79,9 +79,9 @@
         ClassMethodModifierContext,
         FactoryModifierContext,
         ModifierContext,
-        ModifierRecoveryContext,
         TopLevelMethodModifierContext,
-        isModifier;
+        isModifier,
+        parseModifiersOpt;
 
 import 'recovery_listeners.dart'
     show ClassHeaderRecoveryListener, ImportRecoveryListener;
@@ -1152,8 +1152,19 @@
       Token token, FormalParameterKind parameterKind, MemberKind memberKind) {
     token = parseMetadataStar(token);
     listener.beginFormalParameter(token.next, memberKind);
-    token = parseModifiers(token, memberKind, parameterKind: parameterKind);
-    return token;
+    ModifierContext modifierContext = parseModifiersOpt(
+        this,
+        token,
+        memberKind,
+        parameterKind,
+        false,
+        typeContiunationFromFormalParameterKind(parameterKind));
+    TypeContinuation typeContinuation = modifierContext.typeContinuation;
+    memberKind = modifierContext.memberKind;
+    token = modifierContext.lastModifier;
+    modifierContext = null;
+
+    return parseType(token, typeContinuation, null, memberKind);
   }
 
   /// ```
@@ -2525,11 +2536,18 @@
           token = token.next;
         } else if (!nameToken.isIdentifier) {
           if (optional('.', nameToken)) {
+            // Recovery:
             // Looks like a prefixed type, but missing the type and param names.
             // Set the nameToken so that a synthetic identifier is inserted
             // after the `.` token.
             beforeToken = beforeNameToken = nameToken;
             token = nameToken = nameToken.next;
+          } else if (context == IdentifierContext.prefixedTypeReference) {
+            // Recovery:
+            // Looks like a prefixed type, but missing the parameter name.
+            beforeToken = nameToken =
+                insertSyntheticIdentifier(beforeNameToken, nameContext);
+            token = beforeToken.next;
           } else {
             untyped = true;
             beforeNameToken = beforeBegin;
@@ -2700,7 +2718,7 @@
         // but missing a variable name.
         insertSyntheticIdentifier(
             token, IdentifierContext.topLevelVariableDeclaration);
-        return parseFields(beforeStart, const Link<Token>(), token, true);
+        return parseFields(beforeStart, token, true);
       } else {
         return reportInvalidTopLevelDeclaration(token);
       }
@@ -2761,27 +2779,27 @@
     Token afterModifiers =
         identifiers.isNotEmpty ? identifiers.head.next.next : beforeStart.next;
     return isField
-        ? parseFields(beforeStart, identifiers.reverse(), beforeName, true)
+        ? parseFields(beforeStart, beforeName, true)
         : parseTopLevelMethod(
             beforeStart, afterModifiers, beforeType, getOrSet, beforeName);
   }
 
-  Token parseFields(
-      Token start, Link<Token> modifiers, Token beforeName, bool isTopLevel) {
-    Token varFinalOrConst = null;
-    for (Token beforeModifier in modifiers) {
-      Token modifier = beforeModifier.next;
-      if (optional("var", modifier) ||
-          optional("final", modifier) ||
-          optional("const", modifier)) {
-        varFinalOrConst = modifier;
-        break;
-      }
-    }
-    Token token = parseModifiers(start,
-            isTopLevel ? MemberKind.TopLevelField : MemberKind.NonStaticField,
-            isVarAllowed: true)
-        .next;
+  Token parseFields(Token start, Token beforeName, bool isTopLevel) {
+    ModifierContext modifierContext = parseModifiersOpt(
+        this,
+        start,
+        isTopLevel ? MemberKind.TopLevelField : MemberKind.NonStaticField,
+        null,
+        true,
+        typeContiunationFromFormalParameterKind(null));
+    TypeContinuation typeContinuation = modifierContext.typeContinuation;
+    MemberKind memberKind = modifierContext.memberKind;
+    Token varFinalOrConst = modifierContext.varFinalOrConst;
+    Token token = modifierContext.lastModifier;
+    modifierContext = null;
+
+    token = parseType(token, typeContinuation, null, memberKind);
+    token = token.next;
 
     Token name = beforeName.next;
     if (token != name) {
@@ -3361,45 +3379,6 @@
     return token;
   }
 
-  /// This method is used in most locations where modifiers can occur. However,
-  /// it isn't used when parsing a class or when parsing the modifiers of a
-  /// member function (non-local), but is used when parsing their formal
-  /// parameters.
-  ///
-  /// When parsing the formal parameters of any function, [parameterKind] is
-  /// non-null.
-  Token parseModifiers(Token token, MemberKind memberKind,
-      {FormalParameterKind parameterKind, bool isVarAllowed: false}) {
-    ModifierContext context = new ModifierContext(
-        this,
-        memberKind,
-        parameterKind,
-        isVarAllowed,
-        typeContiunationFromFormalParameterKind(parameterKind));
-
-    Token previous = token;
-    token = context.parseOpt(token);
-
-    // If the next token is a modifier,
-    // then it's probably out of order and we need to recover from that.
-    if (isModifier(token.next)) {
-      // Recovery
-      context = new ModifierRecoveryContext(this, memberKind, parameterKind,
-          isVarAllowed, typeContiunationFromFormalParameterKind(parameterKind));
-      token = context.parseOpt(previous);
-    }
-    listener.handleModifiers(context.modifierCount);
-
-    memberKind = context.memberKind;
-    context.typeContinuation ??=
-        (isVarAllowed || memberKind == MemberKind.GeneralizedFunctionType)
-            ? TypeContinuation.Required
-            : TypeContinuation.Optional;
-
-    token = parseType(token, context.typeContinuation, null, memberKind);
-    return token;
-  }
-
   Token parseNativeClause(Token token) {
     Token nativeToken = token = token.next;
     assert(optional('native', nativeToken));
@@ -3571,7 +3550,7 @@
 
     Token lastModifier = identifiers.isNotEmpty ? identifiers.head.next : start;
     token = isField
-        ? parseFields(start, identifiers.reverse(), beforeName, false)
+        ? parseFields(start, beforeName, false)
         : parseMethod(start, lastModifier, beforeType, getOrSet, beforeName);
     listener.endMember();
     return token;
@@ -5348,7 +5327,14 @@
   Token parseVariablesDeclarationMaybeSemicolon(
       Token token, bool endWithSemicolon) {
     token = parseMetadataStar(token);
-    token = parseModifiers(token, MemberKind.Local, isVarAllowed: true);
+    ModifierContext modifierContext =
+        parseModifiersOpt(this, token, MemberKind.Local, null, true, null);
+    token = modifierContext.lastModifier;
+    TypeContinuation typeContinuation = modifierContext.typeContinuation;
+    MemberKind memberKind = modifierContext.memberKind;
+    modifierContext = null;
+
+    token = parseType(token, typeContinuation, null, memberKind);
     return parseVariablesDeclarationMaybeSemicolonRest(token, endWithSemicolon);
   }
 
@@ -6021,20 +6007,20 @@
           next.next, IdentifierContext.fieldDeclaration)) {
         // Looks like a field declaration but missing a field name.
         insertSyntheticIdentifier(next, IdentifierContext.fieldDeclaration);
-        return parseFields(start, const Link<Token>(), next, false);
+        return parseFields(start, next, false);
       } else if (next.next.isKeywordOrIdentifier &&
           isPostIdentifierForRecovery(
               next.next.next, IdentifierContext.fieldDeclaration)) {
         // Looks like a field declaration but missing a semicolon
         // which parseFields will insert.
-        return parseFields(start, const Link<Token>(), next, false);
+        return parseFields(start, next, false);
       }
     } else if (token != start &&
         isPostIdentifierForRecovery(next, IdentifierContext.fieldDeclaration)) {
       // If there is at least one modifier, then
       // looks like the start of a field but missing field name.
       insertSyntheticIdentifier(token, IdentifierContext.fieldDeclaration);
-      return parseFields(start, const Link<Token>(), token, false);
+      return parseFields(start, token, false);
     }
     return reportUnrecoverableErrorWithToken(
         start, fasta.templateExpectedClassMember);
diff --git a/pkg/front_end/lib/src/fasta/severity.dart b/pkg/front_end/lib/src/fasta/severity.dart
index 7147e33..b0c4add 100644
--- a/pkg/front_end/lib/src/fasta/severity.dart
+++ b/pkg/front_end/lib/src/fasta/severity.dart
@@ -9,4 +9,5 @@
   internalProblem,
   nit,
   warning,
+  errorLegacyWarning,
 }
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 607dc45..68e94df 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -788,14 +788,8 @@
     library.addCompileTimeError(message, charOffset, uri);
   }
 
-  @override
-  void addWarning(Message message, int charOffset, int length) {
-    library.addWarning(message, charOffset, uri);
-  }
-
-  @override
-  void addNit(Message message, int charOffset) {
-    library.addNit(message, charOffset, uri);
+  void addProblem(Message message, int charOffset, int length) {
+    library.addProblem(message, charOffset, uri);
   }
 
   @override
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 1bfbc7c..23c24c9 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1034,14 +1034,8 @@
     library.addCompileTimeError(message, charOffset, uri);
   }
 
-  @override
-  void addWarning(Message message, int charOffset, int length) {
-    library.addWarning(message, charOffset, uri);
-  }
-
-  @override
-  void addNit(Message message, int charOffset) {
-    library.addNit(message, charOffset, uri);
+  void addProblem(Message message, int charOffset, int length) {
+    library.addProblem(message, charOffset, uri);
   }
 
   /// Return the documentation comment for the entity that starts at the
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 161b0b4..76f5e9d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -19,7 +19,9 @@
         templateConflictsWithConstructor,
         templateConflictsWithFactory,
         templateConflictsWithMember,
-        templateConflictsWithSetter;
+        templateConflictsWithMemberWarning,
+        templateConflictsWithSetter,
+        templateConflictsWithSetterWarning;
 
 import '../kernel/kernel_builder.dart'
     show
@@ -168,13 +170,17 @@
       Builder member = scopeBuilder[name];
       if (member == null || !member.isField || member.isFinal) return;
       // TODO(ahe): charOffset is missing.
-      var report = member.isInstanceMember != setter.isInstanceMember
-          ? addWarning
-          : addCompileTimeError;
-      report(
-          templateConflictsWithMember.withArguments(name), setter.charOffset);
-      report(
-          templateConflictsWithSetter.withArguments(name), member.charOffset);
+      if (member.isInstanceMember == setter.isInstanceMember) {
+        addProblem(
+            templateConflictsWithMember.withArguments(name), setter.charOffset);
+        addProblem(
+            templateConflictsWithSetter.withArguments(name), member.charOffset);
+      } else {
+        addProblem(templateConflictsWithMemberWarning.withArguments(name),
+            setter.charOffset);
+        addProblem(templateConflictsWithSetterWarning.withArguments(name),
+            member.charOffset);
+      }
     });
 
     cls.procedures.sort(compareProcedures);
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 e62a87d..a7765da 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
@@ -499,7 +499,7 @@
     if (part.partOfUri != null) {
       if (uriIsValid(part.partOfUri) && part.partOfUri != uri) {
         // This is a warning, but the part is still included.
-        addWarning(
+        addProblem(
             templatePartOfUriMismatch.withArguments(
                 part.fileUri, uri, part.partOfUri),
             -1,
@@ -509,7 +509,7 @@
       if (name != null) {
         if (part.partOfName != name) {
           // This is a warning, but the part is still included.
-          addWarning(
+          addProblem(
               templatePartOfLibraryNameMismatch.withArguments(
                   part.fileUri, name, part.partOfName),
               -1,
@@ -517,7 +517,7 @@
         }
       } else {
         // This is a warning, but the part is still included.
-        addWarning(
+        addProblem(
             templatePartOfUseUri.withArguments(
                 part.fileUri, fileUri, part.partOfName),
             -1,
@@ -582,13 +582,14 @@
     }
   }
 
-  /// Resolves all unresolved types in [types]. The list of types is retained
-  /// and is used in [KernelLibraryBuilder.instantiateToBound] later.
+  /// Resolves all unresolved types in [types]. The list of types is cleared
+  /// when done.
   int resolveTypes() {
     int typeCount = types.length;
     for (UnresolvedType<T> t in types) {
       t.resolveIn(scope);
     }
+    types.clear();
     return typeCount;
   }
 
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 c3a81e6..0a200c4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -710,6 +710,12 @@
       case Severity.warning:
         severityString = "warning";
         break;
+
+      case Severity.errorLegacyWarning:
+        // Should have been resolved to either error or warning at this point.
+        // Use a property name expressing that, in case it slips through.
+        severityString = "unresolved severity";
+        break;
     }
     instrumentation.record(
         fileUri,
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 7586246..e9ff8ac 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -342,10 +342,6 @@
   }
 
   void addCompileTimeError(Message message, int charOffset, int length);
-
-  void addWarning(Message message, int charOffset, int length);
-
-  void addNit(Message message, int charOffset);
 }
 
 class Stack {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 25f7ae3..5cdc260 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -411,6 +411,7 @@
     }
     function.body = new ReturnStatement(superCall)..parent = function;
     procedure.transformerFlags |= TransformerFlag.superCalls;
+    procedure.forwardingStubSuperTarget = superTarget.reference;
   }
 
   /// Creates a forwarding stub based on the given [target].
diff --git a/pkg/front_end/lib/src/incremental/unlinked_unit.dart b/pkg/front_end/lib/src/incremental/unlinked_unit.dart
index 645349f..12bccce 100644
--- a/pkg/front_end/lib/src/incremental/unlinked_unit.dart
+++ b/pkg/front_end/lib/src/incremental/unlinked_unit.dart
@@ -46,7 +46,9 @@
       continue;
     }
     // The token is outside of a function body, add it.
-    apiSignature.addString(token.lexeme);
+    if (token is! ErrorToken) {
+      apiSignature.addString(token.lexeme);
+    }
   }
 
   return new UnlinkedUnitBuilder(
diff --git a/pkg/front_end/lib/src/testing/hybrid_file_system.dart b/pkg/front_end/lib/src/testing/hybrid_file_system.dart
index 18a7558..ba2a2fe 100644
--- a/pkg/front_end/lib/src/testing/hybrid_file_system.dart
+++ b/pkg/front_end/lib/src/testing/hybrid_file_system.dart
@@ -10,13 +10,13 @@
 
 import 'package:front_end/src/api_prototype/file_system.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 
 /// A file system that mixes files from memory and a physical file system. All
 /// memory entities take priotity over file system entities.
 class HybridFileSystem implements FileSystem {
   final MemoryFileSystem memory;
-  final PhysicalFileSystem physical = PhysicalFileSystem.instance;
+  final StandardFileSystem physical = StandardFileSystem.instance;
 
   HybridFileSystem(this.memory);
 
@@ -37,7 +37,8 @@
   Future<FileSystemEntity> get delegate async {
     if (_delegate != null) return _delegate;
     FileSystemEntity entity = _fs.memory.entityForUri(uri);
-    if (uri.scheme != 'file' || await entity.exists()) {
+    if ((uri.scheme != 'file' && uri.scheme != 'data') ||
+        await entity.exists()) {
       _delegate = entity;
       return _delegate;
     }
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 62d7386..ebab622 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -237,6 +237,7 @@
 
 ExpectedIdentifier:
   template: "Expected an identifier, but got '#lexeme'."
+  severity: ERROR
   analyzerCode: MISSING_IDENTIFIER
   dart2jsCode: "*fatal*"
   script: "do() {} main() {}"
@@ -745,6 +746,7 @@
 
 BuiltInIdentifierInDeclaration:
   template: "Can't use '#lexeme' as a name here."
+  analyzerCode: BUILT_IN_IDENTIFIER_IN_DECLARATION
   dart2jsCode: GENERIC
 
 AwaitForNotAsync:
@@ -869,27 +871,34 @@
 
 ConstructorNotFound:
   template: "Couldn't find constructor '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 RedirectionTargetNotFound:
   template: "Redirection constructor target not found: '#name'"
+  severity: ERROR_LEGACY_WARNING
 
 CyclicTypedef:
   template: "The typedef '#name' has a reference to itself."
 
 TypeNotFound:
   template: "Type '#name' not found."
+  severity: ERROR_LEGACY_WARNING
 
 NonInstanceTypeVariableUse:
   template: "Can only use type variables in instance methods."
+  severity: ERROR_LEGACY_WARNING
 
 GetterNotFound:
   template: "Getter not found: '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 SetterNotFound:
   template: "Setter not found: '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 MethodNotFound:
   template: "Method not found: '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 CandidateFound:
   template: "Found this candidate, but the arguments don't match."
@@ -899,29 +908,37 @@
 
 AbstractClassInstantiation:
   template: "The class '#name' is abstract and can't be instantiated."
+  severity: ERROR_LEGACY_WARNING
 
 AbstractRedirectedClassInstantiation:
   template: "Factory redirects to class '#name', which is abstract and can't be instantiated."
+  severity: ERROR_LEGACY_WARNING
 
 ListLiteralTooManyTypeArguments:
   template: "Too many type arguments on List literal."
+  severity: ERROR_LEGACY_WARNING
 
 ListLiteralTypeArgumentMismatch:
   template: "Map literal requires two type arguments."
+  severity: ERROR_LEGACY_WARNING
 
 LoadLibraryTakesNoArguments:
   template: "'loadLibrary' takes no arguments."
+  severity: ERROR_LEGACY_WARNING
 
 LoadLibraryHidesMember:
   template: "The library '#uri' defines a top-level member named 'loadLibrary'. This member is hidden by the special member 'loadLibrary' that the language adds to support deferred loading."
   tip: "Try to rename or hide the member."
+  severity: NIT
 
 TypeArgumentMismatch:
   # TODO(sigmund): #string should be a number instead.
   template: "'#name' expects #string type arguments."
+  severity: ERROR_LEGACY_WARNING
 
 NotAType:
   template: "'#name' isn't a type."
+  severity: ERROR_LEGACY_WARNING
   analyzerCode: NOT_A_TYPE
   dart2jsCode: "*ignored*"
 
@@ -1003,59 +1020,87 @@
 
 ReturnTypeFunctionExpression:
   template: "A function expression can't have a return type."
+  severity: ERROR_LEGACY_WARNING
   dart2jsCode: "*ignored*"
 
 InternalProblemUnhandled:
   template: "Unhandled #string in #string2."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemUnimplemented:
   template: "Unimplemented #string."
+  severity: INTERNAL_PROBLEM
+
+UnimplementedBoundsOnTypeVariables:
+  # Has its own message to make it just a warning.
+  # TODO(askesc): Remove when no longer needed.
+  template: "Unimplemented bounds on type variables."
+  severity: WARNING
 
 InternalProblemUnexpected:
   template: "Expected '#string', but got '#string2'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemUnsupported:
   template: "Unsupported operation: '#name'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemSuperclassNotFound:
   template: "Superclass not found '#name'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemNotFound:
   template: "Couldn't find '#name'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemNotFoundIn:
   template: "Couldn't find '#name' in '#name2'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemPrivateConstructorAccess:
   template: "Can't access private constructor '#name'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemConstructorNotFound:
   template: "No constructor named '#name' in '#uri'."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemExtendingUnmodifiableScope:
   template: "Can't extend an unmodifiable scope."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemPreviousTokenNotFound:
   template: "Couldn't find previous token."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemStackNotEmpty:
   template: "#name.stack isn't empty:\n  #string"
+  severity: INTERNAL_PROBLEM
 
 InternalProblemAlreadyInitialized:
   template: "Attempt to set initializer on field without initializer."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemBodyOnAbstractMethod:
   template: "Attempting to set body on abstract method."
+  severity: INTERNAL_PROBLEM
 
 InternalProblemMissingContext:
   template: "Compiler cannot run without a compiler context."
   tip: "Are calls to the compiler wrapped in CompilerContext.runInContext?"
+  severity: INTERNAL_PROBLEM
 
 InternalProblemProvidedBothCompileSdkAndSdkSummary:
   template: "The compileSdk and sdkSummary options are mutually exclusive"
+  severity: INTERNAL_PROBLEM
 
 InternalProblemUriMissingScheme:
   template: "The URI '#uri' has no scheme."
+  severity: INTERNAL_PROBLEM
+
+InternalProblemMissingSeverity:
+  template: "Message code missing severity: #string"
+  severity: INTERNAL_PROBLEM
 
 InternalVerificationError:
   template: |
@@ -1064,15 +1109,19 @@
 
 LocalDefinitionHidesExport:
   template: "Local definition of '#name' hides export from '#uri'."
+  severity: NIT
 
 LocalDefinitionHidesImport:
   template: "Local definition of '#name' hides import from '#uri'."
+  severity: NIT
 
 ExportHidesExport:
   template: "Export of '#name' (from '#uri') hides export from '#uri2'."
+  severity: NIT
 
 ImportHidesImport:
   template: "Import of '#name' (from '#uri') hides import from '#uri2'."
+  severity: NIT
 
 MissingPrefixInDeferredImport:
   template: "Deferred imports should have a prefix."
@@ -1106,9 +1155,21 @@
 
 DuplicatedExport:
   template: "'#name' is exported from both '#uri' and '#uri2'."
+  severity: NIT
+  analyzerCode: AMBIGUOUS_EXPORT
+  dart2jsCode: "*ignored*"
+
+DuplicatedExportInType:
+  template: "'#name' is exported from both '#uri' and '#uri2'."
+  severity: ERROR_LEGACY_WARNING
 
 DuplicatedImport:
   template: "'#name' is imported from both '#uri' and '#uri2'."
+  severity: NIT
+
+DuplicatedImportInType:
+  template: "'#name' is imported from both '#uri' and '#uri2'."
+  severity: ERROR_LEGACY_WARNING
 
 CyclicClassHierarchy:
   template: "'#name' is a supertype of itself via '#string'."
@@ -1118,6 +1179,8 @@
 
 ExtendingRestricted:
   template: "'#name' is restricted and can't be extended or implemented."
+  analyzerCode: EXTENDS_DISALLOWED_CLASS
+  dart2jsCode: "*ignored*"
 
 NoUnnamedConstructorInObject:
   template: "'Object' has no unnamed constructor."
@@ -1130,42 +1193,61 @@
 
 ConflictsWithConstructor:
   template: "Conflicts with constructor '#name'."
+  severity: ERROR
 
 ConflictsWithFactory:
   template: "Conflicts with factory '#name'."
+  severity: ERROR
 
 ConflictsWithMember:
   template: "Conflicts with member '#name'."
+  severity: ERROR
+
+ConflictsWithMemberWarning:
+  template: "Conflicts with member '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 ConflictsWithSetter:
   template: "Conflicts with setter '#name'."
+  severity: ERROR
+
+ConflictsWithSetterWarning:
+  template: "Conflicts with setter '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 ConflictsWithTypeVariable:
   template: "Conflicts with type variable '#name'."
+  severity: ERROR
 
 ConflictsWithTypeVariableCause:
   template:  "This is the type variable."
+  severity: ERROR
 
 IllegalMixin:
   template: "The type '#name' can't be mixed in."
 
 OverrideTypeVariablesMismatch:
   template: "Declared type variables of '#name' doesn't match those on overridden method '#name2'."
+  severity: ERROR_LEGACY_WARNING
 
 OverriddenMethodCause:
   template: "This is the overriden method ('#name')."
 
 OverrideMismatchNamedParameter:
   template: "The method '#name' doesn't have the named parameter '#name2' of overriden method '#name3'."
+  severity: ERROR_LEGACY_WARNING
 
 OverrideFewerNamedArguments:
   template: "The method '#name' has fewer named arguments than those of overridden method '#name2'."
+  severity: ERROR_LEGACY_WARNING
 
 OverrideFewerPositionalArguments:
   template: "The method '#name' has fewer positional arguments than those of overridden method '#name2'."
+  severity: ERROR_LEGACY_WARNING
 
 OverrideMoreRequiredArguments:
   template: "The method '#name' has more required arguments than those of overridden method '#name2'."
+  severity: ERROR_LEGACY_WARNING
 
 OverrideTypeMismatchParameter:
   template: "The parameter '#name' of the method '#name2' has type #type, which does not match the corresponding type in the overridden method (#type2)."
@@ -1366,6 +1448,7 @@
 
 TypeArgumentsOnTypeVariable:
   template: "Can't use type arguments with type variable '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 DuplicatedDefinition:
   template: "Duplicated definition of '#name'."
@@ -1423,13 +1506,16 @@
 
 PartOfLibraryNameMismatch:
   template: "Using '#uri' as part of '#name' but its 'part of' declaration says '#name2'."
+  severity: ERROR_LEGACY_WARNING
 
 PartOfUseUri:
   template: "Using '#uri' as part of '#uri2' but its 'part of' declaration says '#name'."
   tip: "Try changing the 'part of' declaration to use a relative file name."
+  severity: ERROR_LEGACY_WARNING
 
 PartOfUriMismatch:
   template: "Using '#uri' as part of '#uri2' but its 'part of' declaration says '#uri3'."
+  severity: ERROR_LEGACY_WARNING
 
 MissingMain:
   template: "No 'main' method found."
@@ -1483,32 +1569,42 @@
 
 SwitchCaseFallThrough:
   template: "Switch case may fall through to the next case."
+  severity: ERROR_LEGACY_WARNING
 
 FinalInstanceVariableAlreadyInitialized:
   template: "'#name' is a final instance variable that has already been initialized."
+  severity: ERROR_LEGACY_WARNING
 
 FinalInstanceVariableAlreadyInitializedCause:
   template: "'#name' was initialized here."
+  severity: ERROR_LEGACY_WARNING
 
 TypeVariableInStaticContext:
   template: "Type variables can't be used in static members."
+  severity: ERROR_LEGACY_WARNING
 
 SuperclassMethodArgumentMismatch:
   template: "Superclass doesn't have a method named '#name' with matching arguments."
+  severity: ERROR_LEGACY_WARNING
 
 SuperclassHasNoGetter:
   template: "Superclass has no getter named '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 SuperclassHasNoSetter:
   template: "Superclass has no setter named '#name'."
+  severity: ERROR_LEGACY_WARNING
 
 SuperclassHasNoMethod:
   template: "Superclass has no method named '#name'."
+  severity: ERROR_LEGACY_WARNING
   analyzerCode: UNDEFINED_SUPER_METHOD
   dart2jsCode: "*ignored*"
 
 SuperclassHasNoDefaultConstructor:
   template: "The superclass, '#name', has no unnamed constructor that takes no arguments."
+  analyzerCode: NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+  dart2jsCode: "*ignored*"
 
 ConstConstructorNonFinalField:
   template: "Constructor is marked 'const' so all fields must be final."
@@ -1715,3 +1811,4 @@
 CantInferTypeDueToCircularity:
   template: "Can't infer the type of '#string': circularity found during type inference."
   tip: "Specify the type explicitly."
+  severity: ERROR
diff --git a/pkg/front_end/test/fasta/testing/analyzer_loader.dart b/pkg/front_end/test/fasta/testing/analyzer_loader.dart
index 2d229b3..d73819d 100644
--- a/pkg/front_end/test/fasta/testing/analyzer_loader.dart
+++ b/pkg/front_end/test/fasta/testing/analyzer_loader.dart
@@ -4,7 +4,7 @@
 
 library fasta.analyzer_loader;
 
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:kernel/ast.dart' show Program;
 
 import 'package:front_end/src/fasta/builder/builder.dart' show LibraryBuilder;
@@ -25,7 +25,7 @@
 
 class AnalyzerLoader<L> extends SourceLoader<L> {
   AnalyzerLoader(TargetImplementation target)
-      : super(PhysicalFileSystem.instance, false, target);
+      : super(StandardFileSystem.instance, false, target);
 
   @override
   void computeHierarchy(Program program) {
diff --git a/pkg/front_end/test/fasta/testing/analyzer_target.dart b/pkg/front_end/test/fasta/testing/analyzer_target.dart
index f3dc25e..45bda44 100644
--- a/pkg/front_end/test/fasta/testing/analyzer_target.dart
+++ b/pkg/front_end/test/fasta/testing/analyzer_target.dart
@@ -4,7 +4,7 @@
 
 library fasta.analyzer_target;
 
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:kernel/ast.dart' show Library, Source;
 
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
@@ -20,7 +20,7 @@
   AnalyzerTarget(
       DillTarget dillTarget, UriTranslator uriTranslator, bool strongMode,
       [Map<Uri, Source> uriToSource])
-      : super(PhysicalFileSystem.instance, false, dillTarget, uriTranslator,
+      : super(StandardFileSystem.instance, false, dillTarget, uriTranslator,
             uriToSource: uriToSource);
 
   @override
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index dc9da3d..21ea7b3 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -10,8 +10,8 @@
 
 import 'dart:convert' show JSON;
 
-import 'package:front_end/src/api_prototype/physical_file_system.dart'
-    show PhysicalFileSystem;
+import 'package:front_end/src/api_prototype/standard_file_system.dart'
+    show StandardFileSystem;
 
 import 'package:front_end/src/base/libraries_specification.dart'
     show TargetLibrariesSpecification;
@@ -242,7 +242,10 @@
     StdioProcess process;
     try {
       var args = ['--kernel-binaries=${context.platformBinaries.toFilePath()}'];
-      if (context.strongMode) args.add('--strong');
+      if (context.strongMode) {
+        args.add('--strong');
+        args.add('--reify-generic-functions');
+      }
       args.add(generated.path);
       process = await StdioProcess.run(context.vm.toFilePath(), args);
       print(process.output);
@@ -291,7 +294,7 @@
       KernelTarget sourceTarget = astKind == AstKind.Analyzer
           ? new AnalyzerTarget(dillTarget, uriTranslator, strongMode)
           : new KernelTarget(
-              PhysicalFileSystem.instance, false, dillTarget, uriTranslator);
+              StandardFileSystem.instance, false, dillTarget, uriTranslator);
 
       Program p;
       try {
diff --git a/pkg/front_end/test/physical_file_system_test.dart b/pkg/front_end/test/standard_file_system_test.dart
similarity index 79%
rename from pkg/front_end/test/physical_file_system_test.dart
rename to pkg/front_end/test/standard_file_system_test.dart
index 0b4438d..e78a3c7 100644
--- a/pkg/front_end/test/physical_file_system_test.dart
+++ b/pkg/front_end/test/standard_file_system_test.dart
@@ -3,23 +3,25 @@
 // BSD-style license that can be found in the LICENSE file.
 // SharedOptions=--supermixin
 
-library front_end.test.physical_file_system_test;
+library front_end.test.standard_file_system_test;
 
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io' as io;
+import 'dart:math' show Random;
 
 import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(PhysicalFileSystemTest);
+    defineReflectiveTests(StandardFileSystemTest);
     defineReflectiveTests(FileTest);
     defineReflectiveTests(DirectoryTest);
+    defineReflectiveTests(DataTest);
   });
 }
 
@@ -34,7 +36,7 @@
   setUp() {
     super.setUp();
     path = p.join(tempPath, 'dir');
-    dir = PhysicalFileSystem.instance.entityForUri(p.toUri(path));
+    dir = StandardFileSystem.instance.entityForUri(p.toUri(path));
   }
 
   test_equals_differentPaths() {
@@ -72,7 +74,7 @@
   setUp() {
     super.setUp();
     path = p.join(tempPath, 'file.txt');
-    file = PhysicalFileSystem.instance.entityForUri(p.toUri(path));
+    file = StandardFileSystem.instance.entityForUri(p.toUri(path));
   }
 
   test_equals_differentPaths() {
@@ -140,7 +142,7 @@
 }
 
 @reflectiveTest
-class PhysicalFileSystemTest extends _BaseTest {
+class StandardFileSystemTest extends _BaseTest {
   Uri tempUri;
 
   setUp() {
@@ -170,14 +172,14 @@
 
   test_entityForUri() {
     expect(
-        PhysicalFileSystem.instance
+        StandardFileSystem.instance
             .entityForUri(Uri.parse('${tempUri}file.txt'))
             .uri,
         p.toUri(p.join(tempPath, 'file.txt')));
   }
 
   test_entityForUri_bareUri_absolute() {
-    expect(PhysicalFileSystem.instance.entityForUri(Uri.parse('/file.txt')).uri,
+    expect(StandardFileSystem.instance.entityForUri(Uri.parse('/file.txt')).uri,
         Uri.parse('file:///file.txt'));
   }
 
@@ -194,7 +196,7 @@
       Uri.parse('file:///file.txt')
     ]) {
       if (!uri.path.startsWith('/')) {
-        expect(() => PhysicalFileSystem.instance.entityForUri(uri),
+        expect(() => StandardFileSystem.instance.entityForUri(uri),
             throwsA(new isInstanceOf<Error>()));
       }
     }
@@ -202,14 +204,14 @@
 
   test_entityForUri_nonFileUri() {
     expect(
-        () => PhysicalFileSystem.instance
+        () => StandardFileSystem.instance
             .entityForUri(Uri.parse('package:foo/bar.dart')),
         _throwsFileSystemException);
   }
 
   test_entityForUri_normalize_dot() {
     expect(
-        PhysicalFileSystem.instance
+        StandardFileSystem.instance
             .entityForUri(Uri.parse('${tempUri}./file.txt'))
             .uri,
         p.toUri(p.join(tempPath, 'file.txt')));
@@ -217,7 +219,7 @@
 
   test_entityForUri_normalize_dotDot() {
     expect(
-        PhysicalFileSystem.instance
+        StandardFileSystem.instance
             .entityForUri(Uri.parse('${tempUri}foo/../file.txt'))
             .uri,
         p.toUri(p.join(tempPath, 'file.txt')));
@@ -229,7 +231,7 @@
   String tempPath;
 
   FileSystemEntity entityForPath(String path) =>
-      PhysicalFileSystem.instance.entityForUri(p.toUri(path));
+      StandardFileSystem.instance.entityForUri(p.toUri(path));
 
   setUp() {
     tempDirectory = io.Directory.systemTemp.createTempSync('test_file_system');
@@ -248,3 +250,23 @@
     }
   }
 }
+
+@reflectiveTest
+class DataTest {
+  test_Data_URIs() async {
+    String string = "<{[DART]}>";
+    Uri string_uri = new Uri.dataFromString(string, base64: false);
+    Uri string_uri_base64 = new Uri.dataFromString(string, base64: true);
+
+    Random random = new Random(123);
+    List<int> bytes = new List.generate(1000, (index) => random.nextInt(256));
+    Uri bytes_uri = new Uri.dataFromBytes(bytes, percentEncoded: true);
+    Uri bytes_uri_base64 = new Uri.dataFromBytes(bytes, percentEncoded: false);
+
+    StandardFileSystem fs = StandardFileSystem.instance;
+    expect(string, await fs.entityForUri(string_uri).readAsString());
+    expect(string, await fs.entityForUri(string_uri_base64).readAsString());
+    expect(bytes, await fs.entityForUri(bytes_uri).readAsBytes());
+    expect(bytes, await fs.entityForUri(bytes_uri_base64).readAsBytes());
+  }
+}
diff --git a/pkg/front_end/testcases/accessors.dart.direct.expect b/pkg/front_end/testcases/accessors.dart.direct.expect
index 89faf22..7b53204 100644
--- a/pkg/front_end/testcases/accessors.dart.direct.expect
+++ b/pkg/front_end/testcases/accessors.dart.direct.expect
@@ -39,7 +39,7 @@
 }
 static method main() → dynamic {
   try {
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
     throw "No error thrown";
   }
   on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect b/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
index f165ac6..5d084af 100644
--- a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
+++ b/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
@@ -4,6 +4,6 @@
 
 static method foo() → dynamic {}
 static method test() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <dynamic>[], <dynamic>[null].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], <dynamic>[null].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index 33cc33c..8ce4a34 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -9,10 +9,10 @@
 annotation_top: Crash
 argument_mismatch: Crash
 bad_setter_abstract: Crash
-call: Crash
 cascade: Crash
 classes: Crash
 duplicated_named_args_3: Crash
+dynamic_and_void: Fail
 expressions: Crash
 function_type_is_check: Crash
 function_type_recovery: Crash
@@ -55,6 +55,7 @@
 inference/infer_correctly_on_multiple_variables_declared_together: Crash
 inference/infer_from_complex_expressions_if_outer_most_value_is_precise: Crash
 inference/infer_local_function_referenced_before_declaration: Crash
+inference/infer_method_missing_params: Fail
 inference/infer_rethrow: Crash
 inference/instantiate_tearoff: Crash
 inference/instantiate_tearoff_after_contravariance_check: Crash
@@ -62,7 +63,6 @@
 inference/lambda_does_not_have_propagated_type_hint: Crash
 inference/super_initializer: Crash
 inference/super_initializer_substitution: Crash
-inference/switch_continue: Crash
 inference/top_level_return_and_yield: Fail
 inference/try_catch: Crash
 inference/try_catch_finally: Crash
@@ -71,22 +71,26 @@
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Crash
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Fail
+inference_new/dependency_only_if_generic_method: Fail
+inference_new/for_each_identifier_downwards: Crash
 invalid_cast: Crash
 invocations: Crash
 metadata_enum: Crash
 metadata_named_mixin_application: Crash
 micro: Crash
 native_as_name: Crash
+override_check_accessor_after_inference: Fail
+override_check_accessor_basic: Fail
+override_check_accessor_with_covariant_modifier: Fail
 override_check_after_inference: Fail
 override_check_basic: Fail
+override_check_two_substitutions: Fail
 override_check_with_covariant_modifier: Fail
 qualified: Crash
 rasta/abstract_constructor: Crash
-rasta/bad_continue: Crash
 rasta/bad_default_constructor: Crash
 rasta/bad_interpolation: Crash
 rasta/bad_redirection: Crash
-rasta/breaking_bad: Crash
 rasta/class_hierarchy: Crash
 rasta/deferred_load: Crash
 rasta/generic_factory: Crash
@@ -98,7 +102,6 @@
 rasta/issue_000039: VerificationError
 rasta/issue_000042: Crash
 rasta/issue_000044: Crash
-rasta/issue_000045: Crash
 rasta/issue_000067: Crash
 rasta/issue_000068: Crash
 rasta/issue_000069: Crash
@@ -109,7 +112,6 @@
 rasta/static: Crash
 rasta/super_initializer: Crash
 rasta/supports_reflection: VerificationError
-rasta/try_label: Crash
 rasta/type_literals: Crash
 rasta/typedef: Crash
 rasta/unresolved: Crash
@@ -142,3 +144,4 @@
 super_call: Crash
 type_variable_as_super: Crash
 uninitialized_fields: Crash
+warn_unresolved_sends: Fail
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
index bc2a67d..82533c2 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
@@ -20,7 +20,7 @@
   set d(dynamic #synthetic) → void
     let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.\nTry adding {}.\nset b();\n       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.\nTry adding {}.\nset c(x, y);\n           ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.\nTry adding {}.\nset b();\n       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.\nTry adding {}.\nset c(x, y);\n           ^", "pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.\n    new B();\n        ^"]/* from null */;
 static set b(dynamic #synthetic) → void
   let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.\nset b();\n     ^";
 static set c(dynamic #synthetic) → void
diff --git a/pkg/front_end/testcases/expressions.dart.direct.expect b/pkg/front_end/testcases/expressions.dart.direct.expect
index d2e2cac..9e197a7 100644
--- a/pkg/front_end/testcases/expressions.dart.direct.expect
+++ b/pkg/front_end/testcases/expressions.dart.direct.expect
@@ -69,7 +69,7 @@
   core::print(core::int);
   core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
   try {
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#toString, 32, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
     throw "Shouldn't work";
   }
   on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
diff --git a/pkg/front_end/testcases/expressions.dart.strong.expect b/pkg/front_end/testcases/expressions.dart.strong.expect
new file mode 100644
index 0000000..c2bd441
--- /dev/null
+++ b/pkg/front_end/testcases/expressions.dart.strong.expect
@@ -0,0 +1,80 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'toString'.\n    print(int?.toString());\n               ^"]/* from null */;
+static method foo({dynamic fisk = null}) → dynamic {
+  core::print(fisk);
+}
+static method caller(dynamic f) → dynamic {
+  f.call();
+}
+static method main() → dynamic {
+  core::int i = 0;
+  core::print(i.{core::num::==}(1) ?{core::String} "bad" : "good");
+  core::print("${i}");
+  core::print("'${i}'");
+  core::print(" '${i}' ");
+  core::print(" '${i}' '${i}'");
+  core::print(" '${i}' '${i}'");
+  core::print("foobar");
+  core::print(" '${i}' '${i}' '${i}' '${i}'");
+  try {
+    throw "fisk";
+  }
+  on core::String catch(final core::String e, final core::StackTrace s) {
+    core::print(e);
+    if(!s.{core::Object::==}(null))
+      core::print(s);
+  }
+  for (; false; ) {
+  }
+  core::List<core::String> list = <core::String>["Hello, World!"];
+  core::print(list.{core::List::[]}(i));
+  list.{core::List::[]=}(i, "Hello, Brave New World!");
+  core::print(list.{core::List::[]}(i));
+  i = 87;
+  core::print(i.{core::int::unary-}());
+  core::print(i.{core::int::~}());
+  core::print(!i.{core::num::==}(42));
+  core::print(i = i.{core::num::-}(1));
+  core::print(i = i.{core::num::+}(1));
+  core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::-}(1) in #t1);
+  core::print(let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(const core::Object::•());
+  core::print(core::List::_internal<core::String>(2).{core::Object::runtimeType});
+  self::foo(fisk: "Blorp gulp");
+  function f() → core::Null {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → core::Null {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = null]) → core::Null {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = null]) → core::Null {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = null}) → core::Null {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = null}) → core::Null {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int.{core::Object::toString}());
+  core::print(core::int);
+  core::print(let final core::Type #t5 = core::int in let final dynamic #t6 = #t5.{core::Object::toString}() in #t5);
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw "Shouldn't work";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("As expected: ${e}");
+  }
+  core::print(core::int::parse("42"));
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
index 6382d87..c615c82 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
@@ -10,6 +10,7 @@
 }
 
 class D extends C {
+/*@error=OverrideTypeVariablesMismatch*/
 /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
           /*@topType=dynamic*/ x) =>
       x;
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
index a111385..1091d40 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
@@ -16,7 +16,7 @@
   method m(dynamic x) → dynamic
     return x;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).\nChange to a subtype of test::C::m::T.\n/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(\n                                                               ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.\n/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(\n                                                               ^", "pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).\nChange to a subtype of test::C::m::T.\n/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(\n                                                               ^"]/* from null */;
 static method main() → dynamic {
   core::int y = new self::D::•().{self::D::m}<core::int>(42) as{TypeError} core::int;
   core::print(y);
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
index df04cb8..b1f78be 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
@@ -11,8 +11,12 @@
 }
 
 class D extends C {
-  T m<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;
-  T g<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;
+  T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
+          T /*@error=OverrideTypeMismatchParameter*/ x) =>
+      x;
+  T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
+          T /*@error=OverrideTypeMismatchParameter*/ x) =>
+      x;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
index 5cd40dd..6cbf87b 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
@@ -20,7 +20,7 @@
   method g<T extends core::Object>(self::D::g::T x) → self::D::g::T
     return x;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:53: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).\nChange to a supertype of dynamic (or, for a covariant parameter, a subtype).\n  T m<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;\n                                                    ^", "pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:53: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).\nChange to a supertype of dart.core::int (or, for a covariant parameter, a subtype).\n  T g<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;\n                                                    ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.\n  T /*@error=OverrideTypeVariablesMismatch*/ m<T>(\n                                             ^", "pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).\nChange to a supertype of dynamic (or, for a covariant parameter, a subtype).\n          T /*@error=OverrideTypeMismatchParameter*/ x) =>\n                                                     ^", "pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.\n  T /*@error=OverrideTypeVariablesMismatch*/ g<T>(\n                                             ^", "pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).\nChange to a supertype of dart.core::int (or, for a covariant parameter, a subtype).\n          T /*@error=OverrideTypeMismatchParameter*/ x) =>\n                                                     ^"]/* from null */;
 static method main() → dynamic {
   core::int y = (new self::D::•() as self::C).{self::C::m}(42) as{TypeError} core::int;
   core::print(y);
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
index cd30187..9970876 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
@@ -16,8 +16,8 @@
     ;
 }
 static field dynamic a = new self::A::•();
-static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
-static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))];
+static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
 static field dynamic c2 = const <dynamic>[];
 static field dynamic d = <dynamic, dynamic>{"a": "b"};
 static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 90366c9..26a46a1 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -16,8 +16,8 @@
     ;
 }
 static field self::A a = new self::A::•();
-static field self::B b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
-static field core::List<dynamic> c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))];
+static field self::B b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field core::List<dynamic> c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
 static field core::List<dynamic> c2 = const <dynamic>[];
 static field core::Map<dynamic, dynamic> d = <dynamic, dynamic>{"a": "b"};
 static field self::A e = let final self::A #t1 = new self::A::•() in let final dynamic #t2 = #t1.{self::A::x} = 3 in #t1;
@@ -26,6 +26,7 @@
 static field self::B h = new self::A::•().{self::A::+}(3);
 static field dynamic i = let final dynamic #t3 = new self::A::•() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.\nTry correcting the name to the name of an existing method, or defining a method named 'unary-'.\nvar /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();\n                                                                              ^";
 static field self::B j = null as self::B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.\nvar /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations\n                                                            ^", "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.\n  /*error:UNDEFINED_IDENTIFIER*/ x\n                                 ^"]/* from null */;
 static method test1() → dynamic {
   self::a = let final dynamic #t4 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\n  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
   self::a = new self::B::•(3);
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
index 6724aed..3d75d52 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
@@ -5,7 +5,7 @@
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Previous use of 'g'.\n  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();\n                                                                         ^"]/* from null */;
 static method test() → dynamic {
   function f() → dynamic
-    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
   invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.\n  g() => 0;\n  ^";
   dynamic v = f;
 }
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
index 748504a..292334d 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Previous use of 'g'.\n  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();\n                                                                         ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.\n  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();\n                                                                         ^", "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Previous use of 'g'.\n  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();\n                                                                         ^"]/* from null */;
 static method test() → dynamic {
   function f() → dynamic
-    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
   invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.\n  g() => 0;\n  ^";
   () → dynamic v = f;
 }
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart b/pkg/front_end/testcases/inference/infer_method_missing_params.dart
index 57a5515..18bc5e3 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart
@@ -20,7 +20,7 @@
 }
 
 abstract class C implements A, B {
-  /*@topType=int*/ f(
+  /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
       /*@topType=int*/ x,
       /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
   /*@topType=int*/ g(/*@topType=int*/ x,
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
index c07237e..98d3037 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -26,5 +26,5 @@
   abstract method g(core::int x, [dynamic y = null]) → core::int;
   abstract method h(core::int x, {dynamic y = null}) → core::int;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);\n                                                                              ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});\n                                                                               ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);\n                                                                               ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);\n                                                                              ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});\n                                                                               ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);\n                                                                               ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C::f' has more required arguments than those of overridden method 'B::f'.\n  /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(\n                                                            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
index a0f1707..0e26ccb 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
@@ -14,6 +14,7 @@
     dynamic v5 = let final core::int #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Error: Superclass has no method named 'foo'.\n    var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());\n                                     ^", "pkg/front_end/testcases/inference/unresolved_super.dart:13:38: Error: Superclass has no getter named 'bar'.\n    var /*@type=dynamic*/ v2 = super.bar;\n                                     ^", "pkg/front_end/testcases/inference/unresolved_super.dart:14:37: Error: Superclass has no method named '[]'.\n    var /*@type=dynamic*/ v3 = super[0];\n                                    ^", "pkg/front_end/testcases/inference/unresolved_super.dart:15:38: Error: Superclass has no setter named 'bar'.\n    var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();\n                                     ^", "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.\n    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();\n                                    ^"]/* from null */;
 static method f<T extends core::Object>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
new file mode 100644
index 0000000..8b79005
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*@testedFeatures=inference,error*/
+library test;
+
+T f<T>() => null;
+
+class A {}
+
+A aTopLevel;
+void set aTopLevelSetter(A value) {}
+
+class C {
+  A aField;
+  void set aSetter(A value) {}
+  void test() {
+    A aLocal;
+    for (aLocal in /*@typeArgs=Iterable<A>*/ f()) {}
+    // Note: "/*@target=C::aField*/" appears twice due to dartbug.com/31790.
+    for (/*@target=C::aField*/ /*@target=C::aField*/ aField
+        in /*@typeArgs=Iterable<A>*/ f()) {}
+    // Note: "/*@target=C::aSetter*/" appears twice due to dartbug.com/31790.
+    for (/*@target=C::aSetter*/ /*@target=C::aSetter*/ aSetter
+        in /*@typeArgs=Iterable<A>*/ f()) {}
+    for (aTopLevel in /*@typeArgs=Iterable<A>*/ f()) {}
+    for (aTopLevelSetter in /*@typeArgs=Iterable<A>*/ f()) {}
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
new file mode 100644
index 0000000..7e8a4d4
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::A aField = null;
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set aSetter(self::A value) → void {}
+  method test() → void {
+    self::A aLocal;
+    for (final dynamic #t1 in self::f<dynamic>()) {
+      aLocal = #t1;
+    }
+    for (final dynamic #t2 in self::f<dynamic>()) {
+      this.{self::C::aField} = #t2;
+    }
+    for (final dynamic #t3 in self::f<dynamic>()) {
+      this.{self::C::aSetter} = #t3;
+    }
+    for (final dynamic #t4 in self::f<dynamic>()) {
+      self::aTopLevel = #t4;
+    }
+    for (final dynamic #t5 in self::f<dynamic>()) {
+      self::aTopLevelSetter = #t5;
+    }
+  }
+}
+static field self::A aTopLevel;
+static method f<T extends core::Object>() → self::f::T
+  return null;
+static set aTopLevelSetter(self::A value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
new file mode 100644
index 0000000..5a371a8
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  field self::A aField;
+  default constructor •() → void
+    ;
+  set aSetter(self::A value) → void
+    ;
+  method test() → void
+    ;
+}
+static field self::A aTopLevel;
+static method f<T extends core::Object>() → self::f::T
+  ;
+static set aTopLevelSetter(self::A value) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
new file mode 100644
index 0000000..d87176d
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::A aField = null;
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set aSetter(self::A value) → void {}
+  method test() → void {
+    self::A aLocal;
+    for (final self::A #t1 in self::f<core::Iterable<self::A>>()) {
+      aLocal = #t1;
+    }
+    for (final self::A #t2 in self::f<core::Iterable<self::A>>()) {
+      this.{self::C::aField} = #t2;
+    }
+    for (final self::A #t3 in self::f<core::Iterable<self::A>>()) {
+      this.{self::C::aSetter} = #t3;
+    }
+    for (final self::A #t4 in self::f<core::Iterable<self::A>>()) {
+      self::aTopLevel = #t4;
+    }
+    for (final self::A #t5 in self::f<core::Iterable<self::A>>()) {
+      self::aTopLevelSetter = #t5;
+    }
+  }
+}
+static field self::A aTopLevel;
+static method f<T extends core::Object>() → self::f::T
+  return null;
+static set aTopLevelSetter(self::A value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart
new file mode 100644
index 0000000..93170b9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides missing type arguments to
+// raw interface types that refer to classes imported from compiled dill files.
+
+import 'dart:collection';
+
+LinkedListEntry y;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect
new file mode 100644
index 0000000..2a54655
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:collection" as col;
+
+static field col::LinkedListEntry<col::LinkedListEntry<dynamic>> y;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart
new file mode 100644
index 0000000..314743f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.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.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// interface types that are used in the module outline.
+
+class A<T extends num> {}
+
+class B {
+  foo(A a) => null;
+  A bar() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
new file mode 100644
index 0000000..d6193c5
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo(self::A<core::num> a) → dynamic
+    return null;
+  method bar() → self::A<core::num>
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart
new file mode 100644
index 0000000..5d026c9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// interface types that are themselves used as type arguments of literal lists.
+
+class A<T extends num> {}
+
+var a = <A>[];
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
new file mode 100644
index 0000000..c620a46
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field core::List<self::A<core::num>> a = <self::A<core::num>>[];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart
new file mode 100644
index 0000000..ad3d94c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart
@@ -0,0 +1,16 @@
+// 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 test checks that instantiate to bound leaves interface types that have
+// their type arguments defined by the programmer intact in cases when those
+// interface types are used as type arguments of literal lists.
+
+class A<T> {}
+
+class B<S> {
+  final List<A<S>> foo = <A<S>>[];
+  final List<A<num>> bar = <A<num>>[];
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
new file mode 100644
index 0000000..84a4ce2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<S extends core::Object> extends core::Object {
+  final field core::List<self::A<self::B::S>> foo = <self::A<self::B::S>>[];
+  final field core::List<self::A<core::num>> bar = <self::A<core::num>>[];
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart
new file mode 100644
index 0000000..febfe6a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// interface types that are themselves used as type arguments of literal maps.
+
+class A<T extends num> {}
+
+var a = <A, A>{};
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
new file mode 100644
index 0000000..1b12e12
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart
new file mode 100644
index 0000000..09a8efa
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides `dynamic` as the type
+// argument for those positions in type argument lists of interface types that
+// have the bound omitted in the corresponding type parameter, regardless of
+// whether the classes that are referred to by the interface types are imported
+// from compiled dill libraries or are defined within the source files being
+// compiled.
+
+import 'dart:collection';
+
+class A<T> {}
+
+A a;
+DoubleLinkedQueue c;
+
+class C {
+  A foo() => null;
+  DoubleLinkedQueue baz() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
new file mode 100644
index 0000000..65538cb
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class A<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → self::A<dynamic>
+    return null;
+  method baz() → col::DoubleLinkedQueue<dynamic>
+    return null;
+}
+static field self::A<dynamic> a;
+static field col::DoubleLinkedQueue<dynamic> c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart
new file mode 100644
index 0000000..772113a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// interface types that are themselves used as bounds of type parameters.
+
+class A<T extends num> {}
+
+class B<T extends A> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
new file mode 100644
index 0000000..837cc64
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<T extends self::A<core::num>> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart
new file mode 100644
index 0000000..05f120a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound produces correct super-bounded
+// types from raw interface types that refer to F-bounded classes.
+
+class A<T extends A<T>> {}
+
+A a;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
new file mode 100644
index 0000000..d8c359c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends self::A<self::A::T>> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field self::A<self::A<dynamic>> a;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart
new file mode 100644
index 0000000..ae8725e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.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.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// typedef types that are used in the module outline.
+
+typedef A<T extends num>(T p);
+
+class B {
+  foo(A a) => null;
+  A bar() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
new file mode 100644
index 0000000..5f28d03
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::num> = (T) → dynamic;
+class B extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo((core::num) → dynamic a) → dynamic
+    return null;
+  method bar() → (core::num) → dynamic
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart
new file mode 100644
index 0000000..fb2e07e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// typedef types that are themselves used as type arguments of literal lists.
+
+typedef A<T extends num>(T p);
+
+var a = <A>[];
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
new file mode 100644
index 0000000..6194fc1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::num> = (T) → dynamic;
+static field core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart
new file mode 100644
index 0000000..222f8ed
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart
@@ -0,0 +1,16 @@
+// 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 test checks that instantiate to bound leaves typedef types that have
+// their arguments defined by the programmer intact in cases when those typedef
+// types are used as type arguments of literal lists.
+
+typedef A<T>(T p);
+
+class B<S> {
+  final List<A<S>> foo = <A<S>>[];
+  final List<A<num>> bar = <A<num>>[];
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
new file mode 100644
index 0000000..c4e1521
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object> = (T) → dynamic;
+class B<S extends core::Object> extends core::Object {
+  generic-contravariant final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
+  final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart
new file mode 100644
index 0000000..f49c235
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// typedef types that are themselves used as type arguments of literal maps.
+
+typedef A<T extends num>(T p);
+
+var a = <A, A>{};
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
new file mode 100644
index 0000000..c2e8007
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::num> = (T) → dynamic;
+static field core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart
new file mode 100644
index 0000000..cc7372b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart
@@ -0,0 +1,17 @@
+// 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 test checks that instantiate to bound provides `dynamic` as the type
+// argument for those positions in type argument lists of typedef types that
+// have the bound omitted in the corresponding type parameter.
+
+typedef A<T>(T p);
+
+A a;
+
+class C {
+  A foo() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
new file mode 100644
index 0000000..451edbe
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object> = (T) → dynamic;
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → (dynamic) → dynamic
+    return null;
+}
+static field (dynamic) → dynamic a;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart
new file mode 100644
index 0000000..9b32686
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that instantiate to bound provides type arguments to raw
+// typedef types that are themselves used as bounds of type parameters.
+
+typedef A<T extends num>(T p);
+
+class B<T extends A> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
new file mode 100644
index 0000000..875fc1a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::num> = (T) → dynamic;
+class B<T extends (core::num) → dynamic> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart
new file mode 100644
index 0000000..e446ea4
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.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.
+
+// This test checks that instantiate to bound produces correct super-bounded
+// types from raw typedef types that refer to F-bounded typedefs.
+
+typedef A<T>(T p);
+
+typedef B<S extends A<S>>(S p);
+
+B b;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
new file mode 100644
index 0000000..7f1e93d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object> = (T) → dynamic;
+typedef B<S extends (S) → dynamic> = (S) → dynamic;
+static field ((core::Null) → dynamic) → dynamic b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart b/pkg/front_end/testcases/override_check_accessor_after_inference.dart
new file mode 100644
index 0000000..94bf861
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*@testedFeatures=error*/
+
+class A {}
+
+class B extends A {}
+
+class C {
+  void set x(A value) {}
+  B get y => null;
+}
+
+class D extends C {
+  void set x(value) {} // Inferred type: A
+  get y => null; // Inferred type: B
+}
+
+class E extends D {
+  void set x(A value) {} // Ok
+  B get y => null; // Ok
+}
+
+class F extends D {
+  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
+  A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect
new file mode 100644
index 0000000..84d7aaa
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect
@@ -0,0 +1,47 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::B
+    return null;
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x(dynamic value) → void {}
+  get y() → dynamic
+    return null;
+}
+class E extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::B
+    return null;
+}
+class F extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  set x(self::B value) → void {}
+  get y() → self::A
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.outline.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.outline.expect
new file mode 100644
index 0000000..ae273b2
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  set x(self::A value) → void
+    ;
+  get y() → self::B
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  set x(dynamic value) → void
+    ;
+  get y() → dynamic
+    ;
+}
+class E extends self::D {
+  default constructor •() → void
+    ;
+  set x(self::A value) → void
+    ;
+  get y() → self::B
+    ;
+}
+class F extends self::D {
+  default constructor •() → void
+    ;
+  set x(self::B value) → void
+    ;
+  get y() → self::A
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
new file mode 100644
index 0000000..d8d285d
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
@@ -0,0 +1,48 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::B
+    return null;
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::B
+    return null;
+}
+class E extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::B
+    return null;
+}
+class F extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  set x(self::B value) → void {}
+  get y() → self::A
+    return null;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).\nChange to a subtype of #lib1::B.\n  A get /*@error=OverrideTypeMismatchReturnType*/ y => null;\n                                                  ^", "pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}\n                                                        ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart b/pkg/front_end/testcases/override_check_accessor_basic.dart
new file mode 100644
index 0000000..a5391b2
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart
@@ -0,0 +1,26 @@
+// 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.
+
+/*@testedFeatures=error*/
+
+class A {}
+
+class B extends A {}
+
+class C {
+  void set x(A value) {}
+  A get y => null;
+}
+
+class D extends C {
+  void set x(Object value) {} // Ok
+  B get y => null; // Ok
+}
+
+class E extends C {
+  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
+  Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect
new file mode 100644
index 0000000..f819e53
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::A
+    return null;
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x(core::Object value) → void {}
+  get y() → self::B
+    return null;
+}
+class E extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x(self::B value) → void {}
+  get y() → core::Object
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect
new file mode 100644
index 0000000..1e00014
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  set x(self::A value) → void
+    ;
+  get y() → self::A
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  set x(core::Object value) → void
+    ;
+  get y() → self::B
+    ;
+}
+class E extends self::C {
+  default constructor •() → void
+    ;
+  set x(self::B value) → void
+    ;
+  get y() → core::Object
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
new file mode 100644
index 0000000..0a96296
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set x(self::A value) → void {}
+  get y() → self::A
+    return null;
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x(core::Object value) → void {}
+  get y() → self::B
+    return null;
+}
+class E extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x(self::B value) → void {}
+  get y() → core::Object
+    return null;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).\nChange to a subtype of #lib1::A.\n  Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;\n                                                       ^", "pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}\n                                                        ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart
new file mode 100644
index 0000000..a679cb1
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*@testedFeatures=error*/
+
+class A {}
+
+class B extends A {}
+
+class C {
+  void set x1(covariant A value) {}
+  void set x2(A value) {}
+  void set x3(covariant A value) {}
+  void set x4(A value) {}
+  void set x5(covariant A value) {}
+  void set x6(covariant B value) {}
+}
+
+class D extends C {
+  void set x1(B value) {} // Ok because covariant is inherited
+  void set x2(covariant B value) {} // Ok because covariant
+  void set x3(covariant B value) {} // Ok because covariant
+  void set x4(
+      B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
+  void set x5(
+      covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
+  void set x6(covariant A value) {} // Always ok
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect
new file mode 100644
index 0000000..bccda69
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set x1(covariant self::A value) → void {}
+  set x2(self::A value) → void {}
+  set x3(covariant self::A value) → void {}
+  set x4(self::A value) → void {}
+  set x5(covariant self::A value) → void {}
+  set x6(covariant self::B value) → void {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x1(self::B value) → void {}
+  set x2(covariant self::B value) → void {}
+  set x3(covariant self::B value) → void {}
+  set x4(self::B value) → void {}
+  set x5(covariant core::String value) → void {}
+  set x6(covariant self::A value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.outline.expect
new file mode 100644
index 0000000..71f151e
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  set x1(covariant self::A value) → void
+    ;
+  set x2(self::A value) → void
+    ;
+  set x3(covariant self::A value) → void
+    ;
+  set x4(self::A value) → void
+    ;
+  set x5(covariant self::A value) → void
+    ;
+  set x6(covariant self::B value) → void
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  set x1(self::B value) → void
+    ;
+  set x2(covariant self::B value) → void
+    ;
+  set x3(covariant self::B value) → void
+    ;
+  set x4(self::B value) → void
+    ;
+  set x5(covariant core::String value) → void
+    ;
+  set x6(covariant self::A value) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
new file mode 100644
index 0000000..09e0a0c
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set x1(covariant self::A value) → void {}
+  set x2(self::A value) → void {}
+  set x3(covariant self::A value) → void {}
+  set x4(self::A value) → void {}
+  set x5(covariant self::A value) → void {}
+  set x6(covariant self::B value) → void {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  set x1(covariant self::B value) → void {}
+  set x2(covariant self::B value) → void {}
+  set x3(covariant self::B value) → void {}
+  set x4(self::B value) → void {}
+  set x5(covariant core::String value) → void {}
+  set x6(covariant self::A value) → void {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n      B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant\n                                                 ^", "pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n      covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}\n                                                                ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 8540a0d..a597b6f 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -25,7 +25,7 @@
   static factory b<T extends core::Object>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.\nclass Bad extends lib.Missing {\n      ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.\n  lib.Missing method() {}\n  ^", "pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.\nclass Bad extends lib.Missing {\n      ^", "pkg/front_end/testcases/qualified.dart: Error: Couldn't find constructor 'WrongName'."]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
index 394313b..6e09914 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
@@ -23,6 +23,7 @@
   method publicMethod() → dynamic
     return this.{self::Mixin::_privateMethod}();
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.\n  foo() => super.foo() + f();\n                 ^"]/* from null */;
 static method f() → dynamic
   return 2;
 static method V() → dynamic
diff --git a/pkg/front_end/testcases/rasta/static.dart.direct.expect b/pkg/front_end/testcases/rasta/static.dart.direct.expect
index cad665f..487ec3e 100644
--- a/pkg/front_end/testcases/rasta/static.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.direct.expect
@@ -27,28 +27,28 @@
     self::use(self::Foo::staticFunction);
     self::Foo::staticGetter;
     self::use(self::Foo::staticGetter);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[self::Foo::staticConstant.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[#t1.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) in #t1);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[self::Foo::staticConstant.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[#t1.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
     self::Foo::staticField = self::Foo::staticField.+(1);
     self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[self::Foo::staticFunction.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[#t5.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) in #t5);
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[self::Foo::staticGetter.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[#t7.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) in #t7);
-    self::Foo::staticSetter = (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).+(1);
-    self::use(let final dynamic #t9 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[self::Foo::staticConstant.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[self::Foo::staticConstant.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[self::Foo::staticFunction.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[#t5.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[self::Foo::staticGetter.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[#t7.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
+    self::Foo::staticSetter = (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
+    self::use(let final dynamic #t9 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[self::Foo::staticConstant.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[self::Foo::staticConstant.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
     self::Foo::staticField = self::Foo::staticField.+(1);
     self::use(self::Foo::staticField = self::Foo::staticField.+(1));
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[self::Foo::staticFunction.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[self::Foo::staticFunction.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[self::Foo::staticGetter.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[self::Foo::staticGetter.+(1)].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
-    self::Foo::staticSetter = (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).+(1);
-    self::use(self::Foo::staticSetter = (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).+(1));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[self::Foo::staticFunction.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[self::Foo::staticFunction.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[self::Foo::staticGetter.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[self::Foo::staticGetter.+(1)].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticSetter = (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
+    self::use(self::Foo::staticSetter = (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
     self::Foo::staticConstant.call();
     self::use(self::Foo::staticConstant.call());
     self::Foo::staticField.call();
@@ -57,28 +57,28 @@
     self::use(self::Foo::staticFunction());
     self::Foo::staticGetter.call();
     self::use(self::Foo::staticGetter.call());
-    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).call();
-    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).call());
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
+    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
     self::Foo::staticField = 87;
     self::use(self::Foo::staticField = 87);
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
     self::Foo::staticSetter = 87;
     self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) : null;
-    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) : #t11);
+    self::Foo::staticConstant.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
     self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
     self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) : null;
-    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) : #t13);
-    self::Foo::staticGetter.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) : null;
-    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <dynamic>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) : #t14);
-    (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
-    self::use(let final dynamic #t15 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
+    self::Foo::staticFunction.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
+    self::Foo::staticGetter.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], <dynamic>[87].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
+    (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t15 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
   }
   on core::NoSuchMethodError catch(no-exception-var) {
   }
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 5430f1d..d54ccec 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -253,7 +253,7 @@
     self::use(super.{self::A::n} = let final dynamic #t79 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.n -= 42);\n                ^");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.\nTry removing '+'.\n    +super;\n    ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.\nTry removing '+'.\n    use(+super);\n        ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.\nTry removing '+'.\n    +super;\n    ^", "pkg/front_end/testcases/rasta/super.dart:43:5: Error: Getter not found: ''.\n    +super;\n    ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.\nTry removing '+'.\n    use(+super);\n        ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: Getter not found: ''.\n    use(+super);\n        ^", "pkg/front_end/testcases/rasta/super.dart:62:11: Error: Superclass has no getter named 'g'.\n    super.g;\n          ^", "pkg/front_end/testcases/rasta/super.dart:63:15: Error: Superclass has no getter named 'g'.\n    use(super.g);\n              ^", "pkg/front_end/testcases/rasta/super.dart:83:11: Error: Superclass has no setter named 'e'.\n    super.e++;\n          ^", "pkg/front_end/testcases/rasta/super.dart:84:15: Error: Superclass has no setter named 'e'.\n    use(super.e++);\n              ^", "pkg/front_end/testcases/rasta/super.dart:85:11: Error: Superclass has no setter named 'f'.\n    super.f++;\n          ^", "pkg/front_end/testcases/rasta/super.dart:86:15: Error: Superclass has no setter named 'f'.\n    use(super.f++);\n              ^", "pkg/front_end/testcases/rasta/super.dart:87:11: Error: Superclass has no getter named 'g'.\n    super.g++;\n          ^", "pkg/front_end/testcases/rasta/super.dart:88:15: Error: Superclass has no getter named 'g'.\n    use(super.g++);\n              ^", "pkg/front_end/testcases/rasta/super.dart:95:11: Error: Superclass has no setter named 'm'.\n    super.m++;\n          ^", "pkg/front_end/testcases/rasta/super.dart:96:15: Error: Superclass has no setter named 'm'.\n    use(super.m++);\n              ^", "pkg/front_end/testcases/rasta/super.dart:108:13: Error: Superclass has no setter named 'e'.\n    ++super.e;\n            ^", "pkg/front_end/testcases/rasta/super.dart:109:17: Error: Superclass has no setter named 'e'.\n    use(++super.e);\n                ^", "pkg/front_end/testcases/rasta/super.dart:110:13: Error: Superclass has no setter named 'f'.\n    ++super.f;\n            ^", "pkg/front_end/testcases/rasta/super.dart:111:17: Error: Superclass has no setter named 'f'.\n    use(++super.f);\n                ^", "pkg/front_end/testcases/rasta/super.dart:112:13: Error: Superclass has no getter named 'g'.\n    ++super.g;\n            ^", "pkg/front_end/testcases/rasta/super.dart:113:17: Error: Superclass has no getter named 'g'.\n    use(++super.g);\n                ^", "pkg/front_end/testcases/rasta/super.dart:120:13: Error: Superclass has no setter named 'm'.\n    ++super.m;\n            ^", "pkg/front_end/testcases/rasta/super.dart:121:17: Error: Superclass has no setter named 'm'.\n    use(++super.m);\n                ^", "pkg/front_end/testcases/rasta/super.dart:137:11: Error: Superclass has no method named 'g'.\n    super.g();\n          ^", "pkg/front_end/testcases/rasta/super.dart:138:15: Error: Superclass has no method named 'g'.\n    use(super.g());\n              ^", "pkg/front_end/testcases/rasta/super.dart:160:11: Error: Superclass has no setter named 'e'.\n    super.e = 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:161:15: Error: Superclass has no setter named 'e'.\n    use(super.e = 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:162:11: Error: Superclass has no setter named 'f'.\n    super.f = 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:163:15: Error: Superclass has no setter named 'f'.\n    use(super.f = 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:172:11: Error: Superclass has no setter named 'm'.\n    super.m = 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:173:15: Error: Superclass has no setter named 'm'.\n    use(super.m = 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:185:11: Error: Superclass has no setter named 'e'.\n    super.e ??= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:186:15: Error: Superclass has no setter named 'e'.\n    use(super.e ??= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:187:11: Error: Superclass has no setter named 'f'.\n    super.f ??= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:188:15: Error: Superclass has no setter named 'f'.\n    use(super.f ??= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:189:11: Error: Superclass has no getter named 'g'.\n    super.g ??= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:190:15: Error: Superclass has no getter named 'g'.\n    use(super.g ??= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:197:11: Error: Superclass has no setter named 'm'.\n    super.m ??= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:198:15: Error: Superclass has no setter named 'm'.\n    use(super.m ??= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:210:11: Error: Superclass has no setter named 'e'.\n    super.e += 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:211:15: Error: Superclass has no setter named 'e'.\n    use(super.e += 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:212:11: Error: Superclass has no setter named 'f'.\n    super.f += 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:213:15: Error: Superclass has no setter named 'f'.\n    use(super.f += 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:214:11: Error: Superclass has no getter named 'g'.\n    super.g += 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:215:15: Error: Superclass has no getter named 'g'.\n    use(super.g += 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:222:11: Error: Superclass has no setter named 'm'.\n    super.m += 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:223:15: Error: Superclass has no setter named 'm'.\n    use(super.m += 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:235:11: Error: Superclass has no setter named 'e'.\n    super.e -= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:236:15: Error: Superclass has no setter named 'e'.\n    use(super.e -= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:237:11: Error: Superclass has no setter named 'f'.\n    super.f -= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:238:15: Error: Superclass has no setter named 'f'.\n    use(super.f -= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:239:11: Error: Superclass has no getter named 'g'.\n    super.g -= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:240:15: Error: Superclass has no getter named 'g'.\n    use(super.g -= 42);\n              ^", "pkg/front_end/testcases/rasta/super.dart:247:11: Error: Superclass has no setter named 'm'.\n    super.m -= 42;\n          ^", "pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.\n    use(super.m -= 42);\n              ^"]/* from null */;
 static method use(dynamic x) → dynamic {
   if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
     throw "Shouldn't happen";
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
index f961b10..52fa5f8 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -41,6 +41,7 @@
   abstract forwarding-stub method g(generic-covariant-impl dynamic a) → dynamic;
   abstract forwarding-stub set t(generic-covariant-impl dynamic _) → void;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.\n  foo() => super.foo() + f();\n                 ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::C::•<dynamic>().{mix::Mixin::foo}());
   core::print(new self::C2::•<dynamic>().{mix::Mixin::foo}());
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
index 6741aa0..469dce3 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
@@ -13,14 +13,14 @@
       core::print(this.key);
     }
     for (final dynamic #t2 in x) {
-      let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <dynamic>[], <dynamic>[#t2].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+      let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], <dynamic>[#t2].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
       core::print(self::Fisk);
     }
     for (final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: Expected lvalue, but got Instance of 'PrefixBuilder'\n    for (collection in x) {\n         ^" in x) {
       core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart: Error: A library can't be used as an expression.");
     }
     for (final dynamic #t4 in x) {
-      let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <dynamic>[], <dynamic>[#t4].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+      let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], <dynamic>[#t4].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
       core::print(() → void);
     }
     for (final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected lvalue, but got 1\n    for (1 in x) {\n         ^" in x) {
@@ -31,21 +31,21 @@
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
   for (final dynamic #t6 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <dynamic>[], <dynamic>[#t6].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], <dynamic>[#t6].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
   }
   for (final dynamic #t7 in arguments) {
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <dynamic>[], <dynamic>[#t7].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], <dynamic>[#t7].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
     core::print(self::Fisk);
   }
   for (final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: Expected lvalue, but got Instance of 'PrefixBuilder'\n  for (collection in arguments) {\n       ^" in arguments) {
     core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart: Error: A library can't be used as an expression.");
   }
   for (final dynamic #t9 in arguments) {
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <dynamic>[], <dynamic>[#t9].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], <dynamic>[#t9].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
     core::print(() → void);
   }
   for (final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected lvalue, but got 1\n  for (1 in arguments) {\n       ^" in arguments) {
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
index 3c97f77..0e11a3b 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' isn't a type.\n  a.b c = null;\n  ^"]/* from null */;
 static method main() → dynamic {
   core::String a = "";
   invalid-type c = null;
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
index 186616b..6b2f5d7 100644
--- a/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
 
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' isn't a type.\n  s.bool x = null;\n  ^"]/* from null */;
 static method main() → dynamic {
   invalid-type x = null;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
index 15d1958..7489747 100644
--- a/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
 
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' isn't a type.\n  x.y z;\n  ^"]/* from null */;
 static method main() → dynamic {
   invalid-type z;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
index dc9b4c9..563ed03 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -8,6 +8,7 @@
     : super core::Object::•()
     ;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: 'C' expects 1 type arguments.\n  C<String, String> field;\n  ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::C::•<dynamic>());
 }
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
index 544ffb8..61cfc01 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Getter not found: 'missing'.\n  return missing;\n         ^", "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: Getter not found: 'dummy'.\ng() sync* => dummy;\n             ^"]/* from null */;
 static method f() → dynamic sync* {
   invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.\n  return missing;\n  ^";
 }
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
index 6dd3ecf..ba78c35 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.\n  for (int i = i;; false) {}\n               ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.\n  for (int i = i;; false) {}\n               ^", "pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.\n  for (int i = i;; false) {}\n               ^"]/* from null */;
 static method bad() → dynamic {
   for (final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.\n  for (int i = i;; false) {}\n           ^"; ; false) {
   }
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
index 3ffb8ac..822d218 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
@@ -4,6 +4,6 @@
 
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.\nTry using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).\n  \u55357\u56603\n  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.\n}\n^"]/* from null */;
 static method bad() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
index 3ffb8ac..02c3c1e4 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.\nTry using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).\n  \u55357\u56603\n  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.\n}\n^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.\nTry using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).\n  \u55357\u56603\n  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.\n}\n^", "pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '\u55357\u56603'.\n  \u55357\u56603\n  ^"]/* from null */;
 static method bad() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
index 7175ccd..8ee7c79 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
@@ -4,7 +4,7 @@
 
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.\n  for (int i = 0, i > 10; i++) {}\n                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.\n  for (int i = 0, i > 10; i++) {}\n                    ^"]/* from null */;
 static method bad() → dynamic {
-  for (core::int i = 0, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^"; (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).>(10); i = i.+(1)) {
+  for (core::int i = 0, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^"; (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).>(10); i = i.+(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
index 0177011..f51f3b2 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.\n  for (int i = 0, i > 10; i++) {}\n                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.\n  for (int i = 0, i > 10; i++) {}\n                    ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.\n  for (int i = 0, i > 10; i++) {}\n                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.\n  for (int i = 0, i > 10; i++) {}\n                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Getter not found: ''.\n  for (int i = 0, i > 10; i++) {}\n                    ^"]/* from null */;
 static method bad() → dynamic {
-  for (core::int i = 0, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^"; (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+  for (core::int i = 0, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^"; (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
index 3886969..2b3bb2c 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
@@ -8,4 +8,5 @@
     : super core::Object::•()
     ;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31190.dart: Error: Can't use type arguments with type variable 'T'.", "pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.\n  T<U> v;\n    ^", "pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: 'T' expects 0 type arguments.\n  T<U> v;\n  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index abc2724..6c33f11 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -8,7 +8,7 @@
 
 DeltaBlue: Fail
 accessors: Fail
-argument_mismatch: TypeCheckError
+argument_mismatch: Fail # Test assumes Dart 1.0 semantics
 async_function: Fail
 await: Fail
 bug21938: TypeCheckError
@@ -22,8 +22,8 @@
 covariant_generic: Fail
 cycles: Fail
 default_values: Fail
+dynamic_and_void: Fail # Test assumes Dart 1.0 semantics
 escape: Fail
-expressions: Fail
 external: Fail
 fallthrough: Fail
 fibonacci: Fail
@@ -41,6 +41,9 @@
 null_aware: Fail
 operators: Fail
 optional: Fail
+override_check_accessor_after_inference: TypeCheckError # Issue #31620
+override_check_accessor_basic: TypeCheckError # Issue #31620
+override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
 override_check_after_inference: TypeCheckError # Issue #31620
 override_check_basic: TypeCheckError # Issue #31620
 override_check_with_covariant_modifier: TypeCheckError # Issue #31620
@@ -63,10 +66,9 @@
 uninitialized_fields: Fail
 unused_methods: Fail
 void_methods: Fail
-warn_unresolved_sends: RuntimeError # Test assumes Dart 1.0 semantics
+warn_unresolved_sends: Fail # Test assumes Dart 1.0 semantics
 
 inference/abstract_class_instantiation: Fail # Issue #30040
-inference/block_bodied_lambdas_infer_bottom_async_star: RuntimeError
 inference/conflicts_can_happen: TypeCheckError
 inference/conflicts_can_happen2: TypeCheckError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
@@ -99,7 +101,6 @@
 inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
 inference/generic_methods_infer_js_builtin: Fail # Issue #30029
 inference/generic_methods_nested_generic_instantiation: RuntimeError # Issue #31304
-inference/generic_methods_uses_greatest_lower_bound: RuntimeError
 inference/infer_field_override_multiple: TypeCheckError
 inference/infer_method_missing_params: TypeCheckError
 inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
@@ -118,6 +119,10 @@
 inference_new/infer_field_getter_setter_mismatch: TypeCheckError
 inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
 
+instantiate_to_bound/typedef_literal_map: Fail
+instantiate_to_bound/typedef_literal_list: Fail
+instantiate_to_bound/typedef_super_bounded_type: Fail
+
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
 rasta/bad_continue: Fail
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 3460d49..8ed214a 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -233,6 +233,7 @@
     self::use(super.m = let final dynamic #t66 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:232:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.m -= 42);\n                ^");
   }
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/super_rasta_copy.dart:60:11: Error: Superclass has no getter named 'g'.\n    super.g;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:61:15: Error: Superclass has no getter named 'g'.\n    use(super.g);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:79:11: Error: Superclass has no setter named 'e'.\n    super.e++;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:80:15: Error: Superclass has no setter named 'e'.\n    use(super.e++);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:81:11: Error: Superclass has no setter named 'f'.\n    super.f++;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:82:15: Error: Superclass has no setter named 'f'.\n    use(super.f++);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:83:11: Error: Superclass has no getter named 'g'.\n    super.g++;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:84:15: Error: Superclass has no getter named 'g'.\n    use(super.g++);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:91:11: Error: Superclass has no setter named 'm'.\n    super.m++;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:92:15: Error: Superclass has no setter named 'm'.\n    use(super.m++);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:102:13: Error: Superclass has no setter named 'e'.\n    ++super.e;\n            ^", "pkg/front_end/testcases/super_rasta_copy.dart:103:17: Error: Superclass has no setter named 'e'.\n    use(++super.e);\n                ^", "pkg/front_end/testcases/super_rasta_copy.dart:104:13: Error: Superclass has no setter named 'f'.\n    ++super.f;\n            ^", "pkg/front_end/testcases/super_rasta_copy.dart:105:17: Error: Superclass has no setter named 'f'.\n    use(++super.f);\n                ^", "pkg/front_end/testcases/super_rasta_copy.dart:106:13: Error: Superclass has no getter named 'g'.\n    ++super.g;\n            ^", "pkg/front_end/testcases/super_rasta_copy.dart:107:17: Error: Superclass has no getter named 'g'.\n    use(++super.g);\n                ^", "pkg/front_end/testcases/super_rasta_copy.dart:114:13: Error: Superclass has no setter named 'm'.\n    ++super.m;\n            ^", "pkg/front_end/testcases/super_rasta_copy.dart:115:17: Error: Superclass has no setter named 'm'.\n    use(++super.m);\n                ^", "pkg/front_end/testcases/super_rasta_copy.dart:129:11: Error: Superclass has no method named 'g'.\n    super.g();\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:130:15: Error: Superclass has no method named 'g'.\n    use(super.g());\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:150:11: Error: Superclass has no setter named 'e'.\n    super.e = 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:151:15: Error: Superclass has no setter named 'e'.\n    use(super.e = 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:152:11: Error: Superclass has no setter named 'f'.\n    super.f = 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:153:15: Error: Superclass has no setter named 'f'.\n    use(super.f = 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:162:11: Error: Superclass has no setter named 'm'.\n    super.m = 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:163:15: Error: Superclass has no setter named 'm'.\n    use(super.m = 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:173:11: Error: Superclass has no setter named 'e'.\n    super.e ??= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:174:15: Error: Superclass has no setter named 'e'.\n    use(super.e ??= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:175:11: Error: Superclass has no setter named 'f'.\n    super.f ??= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:176:15: Error: Superclass has no setter named 'f'.\n    use(super.f ??= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:177:11: Error: Superclass has no getter named 'g'.\n    super.g ??= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:178:15: Error: Superclass has no getter named 'g'.\n    use(super.g ??= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:185:11: Error: Superclass has no setter named 'm'.\n    super.m ??= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:186:15: Error: Superclass has no setter named 'm'.\n    use(super.m ??= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:196:11: Error: Superclass has no setter named 'e'.\n    super.e += 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:197:15: Error: Superclass has no setter named 'e'.\n    use(super.e += 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:198:11: Error: Superclass has no setter named 'f'.\n    super.f += 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:199:15: Error: Superclass has no setter named 'f'.\n    use(super.f += 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:200:11: Error: Superclass has no getter named 'g'.\n    super.g += 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:201:15: Error: Superclass has no getter named 'g'.\n    use(super.g += 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:208:11: Error: Superclass has no setter named 'm'.\n    super.m += 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:209:15: Error: Superclass has no setter named 'm'.\n    use(super.m += 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:219:11: Error: Superclass has no setter named 'e'.\n    super.e -= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:220:15: Error: Superclass has no setter named 'e'.\n    use(super.e -= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:221:11: Error: Superclass has no setter named 'f'.\n    super.f -= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:222:15: Error: Superclass has no setter named 'f'.\n    use(super.f -= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:223:11: Error: Superclass has no getter named 'g'.\n    super.g -= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:224:15: Error: Superclass has no getter named 'g'.\n    use(super.g -= 42);\n              ^", "pkg/front_end/testcases/super_rasta_copy.dart:231:11: Error: Superclass has no setter named 'm'.\n    super.m -= 42;\n          ^", "pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.\n    use(super.m -= 42);\n              ^"]/* from null */;
 static method use(dynamic x) → dynamic {
   if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
     throw "Shouldn't happen";
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
index 2d5d17c..e232826 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -9,6 +9,7 @@
   method method() → invalid-type
     return let final dynamic #t1 = "Hello, World!" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.\nTry changing the type of the left hand side, or casting the right hand side to 'invalid-type'.\n  T.String method() => \"Hello, World!\";\n                       ^";
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: Type 'T.String' not found.\n  T.String method() => \"Hello, World!\";\n  ^"]/* from null */;
 static method main() → dynamic {
   core::String s = let final dynamic #t2 = new self::C::•<dynamic>().{self::C::method}() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  T.String s = new C().method();\n                       ^";
   core::print(s);
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 5af82b0..baadc31 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -52,7 +52,8 @@
         "/testcases/.*_part[0-9]*\\.dart$",
         "/testcases/.*_lib[0-9]*\\.dart$",
         "/testcases/dartino/",
-        "/testcases/shaker/"
+        "/testcases/shaker/",
+        "/testcases/instantiate_to_bound/"
       ]
     },
 
@@ -69,7 +70,8 @@
         "/testcases/.*_part[0-9]*\\.dart$",
         "/testcases/.*_lib[0-9]*\\.dart$",
         "/testcases/dartino/",
-        "/testcases/shaker/"
+        "/testcases/shaker/",
+        "/testcases/instantiate_to_bound/"
       ]
     },
 
diff --git a/pkg/front_end/tool/_fasta/bulk_compile.dart b/pkg/front_end/tool/_fasta/bulk_compile.dart
index 30940de..6a8c52a 100644
--- a/pkg/front_end/tool/_fasta/bulk_compile.dart
+++ b/pkg/front_end/tool/_fasta/bulk_compile.dart
@@ -12,8 +12,8 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
-import 'package:front_end/src/api_prototype/physical_file_system.dart'
-    show PhysicalFileSystem;
+import 'package:front_end/src/api_prototype/standard_file_system.dart'
+    show StandardFileSystem;
 
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
@@ -80,7 +80,7 @@
       }
       return entity;
     } else {
-      return PhysicalFileSystem.instance.entityForUri(uri);
+      return StandardFileSystem.instance.entityForUri(uri);
     }
   }
 }
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 93ffb3b..f7977c4 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -10,6 +10,14 @@
 
 import 'package:dart_style/dart_style.dart' show DartFormatter;
 
+Map<String, String> severityEnumNames = <String, String>{
+  'NIT': 'nit',
+  'WARNING': 'warning',
+  'ERROR': 'error',
+  'ERROR_LEGACY_WARNING': 'errorLegacyWarning',
+  'INTERNAL_PROBLEM': 'internalProblem',
+};
+
 main(List<String> arguments) async {
   var port = new ReceivePort();
   Uri messagesFile = Platform.script.resolve("../../messages.yaml");
@@ -40,7 +48,7 @@
       throw "No 'template:' in key $name.";
     }
     sb.writeln(compileTemplate(name, map['template'], map['tip'],
-        map['analyzerCode'], map['dart2jsCode']));
+        map['analyzerCode'], map['dart2jsCode'], map['severity']));
   }
 
   String dartfmtedText = new DartFormatter().format("$sb");
@@ -55,7 +63,7 @@
 final RegExp placeholderPattern = new RegExp("#[a-zA-Z0-9_]+");
 
 String compileTemplate(String name, String template, String tip,
-    String analyzerCode, String dart2jsCode) {
+    String analyzerCode, String dart2jsCode, String severity) {
   if (template == null) {
     print('Error: missing template for message: $name');
     exitCode = 1;
@@ -187,6 +195,13 @@
   if (dart2jsCode != null) {
     codeArguments.add('dart2jsCode: "$dart2jsCode"');
   }
+  if (severity != null) {
+    String severityEnumName = severityEnumNames[severity];
+    if (severityEnumName == null) {
+      throw "Unknown severity '$severity'";
+    }
+    codeArguments.add('severity: Severity.$severityEnumName');
+  }
 
   if (parameters.isEmpty && conversions.isEmpty && arguments.isEmpty) {
     if (template != null) {
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index 9584a54..dcb5c0b 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -53,7 +53,7 @@
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/byte_store/protected_file_byte_store.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
@@ -218,7 +218,7 @@
 class OverlayFileSystem implements FileSystem {
   final MemoryFileSystem memory =
       new MemoryFileSystem(Uri.parse('org-dartlang-overlay:///'));
-  final PhysicalFileSystem physical = PhysicalFileSystem.instance;
+  final StandardFileSystem physical = StandardFileSystem.instance;
 
   @override
   FileSystemEntity entityForUri(Uri uri) {
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index acd2da2..06fbbd8 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -98,7 +98,11 @@
       program = coq.transformProgram(coreTypes, program);
       break;
     case 'constants':
-      final VmConstantsBackend backend = new VmConstantsBackend(coreTypes);
+      // We use the -D defines supplied to this VM instead of explicitly using a
+      // constructed map of constants.
+      final Map<String, String> defines = null;
+      final VmConstantsBackend backend =
+          new VmConstantsBackend(defines, coreTypes);
       program = constants.transformProgram(program, backend);
       break;
     case 'treeshake':
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 848fa2f..f307f05 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -354,6 +354,8 @@
   // An absolute path URI to the .dart file from which the class was created.
   UriReference fileUri;
   List<Expression> annotations;
+  // Only present if the 'isForwardingStub' flag is set.
+  Option<MemberReference> forwardingStubSuperTarget;
   // Can only be absent if abstract, but tag is there anyway.
   Option<FunctionNode> function;
 }
@@ -367,8 +369,8 @@
   Name name;
   UriReference fileUri;
   List<Expression> annotations;
-  List<DartType> typeArguments;
   MemberReference targetReference;
+  List<DartType> typeArguments;
   List<TypeParameter> typeParameters;
   UInt parameterCount; // positionalParameters.length + namedParameters.length.
   UInt requiredParameterCount;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index e655f93..89a1643 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1490,6 +1490,8 @@
   /// The uri of the source file this procedure was loaded from.
   Uri fileUri;
 
+  Reference forwardingStubSuperTarget;
+
   Procedure(Name name, this.kind, this.function,
       {bool isAbstract: false,
       bool isStatic: false,
@@ -1499,7 +1501,8 @@
       bool isForwardingSemiStub: false,
       int transformerFlags: 0,
       this.fileUri,
-      Reference reference})
+      Reference reference,
+      this.forwardingStubSuperTarget})
       : super(name, reference) {
     function?.parent = this;
     this.isAbstract = isAbstract;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index be7788c..83c5af1 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.ast_from_binary;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
 import 'dart:convert';
 import 'dart:typed_data';
 
@@ -928,6 +930,8 @@
     bool readFunctionNodeNow =
         (kind == ProcedureKind.Factory && functionNodeSize <= 50) ||
             _disableLazyReading;
+    var forwardingStubSuperTarget =
+        readAndCheckOptionTag() ? readMemberReference() : null;
     var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
     var transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
@@ -942,6 +946,10 @@
       node.function = function;
       function?.parent = node;
       node.setTransformerFlagsWithoutLazyLoading(transformerFlags);
+      node.forwardingStubSuperTarget = forwardingStubSuperTarget;
+
+      assert((node.forwardingStubSuperTarget != null) ||
+          !(node.isForwardingStub && node.function.body != null));
     }
     _byteOffset = endOffset;
     return node;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 38fbba4..3d12707 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.ast_to_binary;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import '../ast.dart';
 import 'tag.dart';
 import 'dart:convert';
@@ -226,6 +229,15 @@
     }
   }
 
+  void writeOptionalReference(Reference ref) {
+    if (ref == null) {
+      writeByte(Tag.Nothing);
+    } else {
+      writeByte(Tag.Something);
+      writeReference(ref);
+    }
+  }
+
   void writeLinkTable(Program program) {
     _binaryOffsetForLinkTable = getBufferOffset();
     writeList(_canonicalNameList, writeCanonicalNameEntry);
@@ -753,8 +765,12 @@
     writeName(node.name ?? '');
     writeUriReference(node.fileUri);
     writeAnnotationList(node.annotations);
+    writeOptionalReference(node.forwardingStubSuperTarget);
     writeOptionalNode(node.function);
     _variableIndexer = null;
+
+    assert((node.forwardingStubSuperTarget != null) ||
+        !(node.isForwardingStub && node.function.body != null));
   }
 
   visitField(Field node) {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 420a756..e461650 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.clone;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import 'ast.dart';
 import 'type_algebra.dart';
 
@@ -400,7 +403,8 @@
         isForwardingStub: node.isForwardingStub,
         isForwardingSemiStub: node.isForwardingSemiStub,
         transformerFlags: node.transformerFlags,
-        fileUri: node.fileUri)
+        fileUri: node.fileUri,
+        forwardingStubSuperTarget: node.forwardingStubSuperTarget)
       ..fileEndOffset = node.fileEndOffset
       ..isGenericContravariant = node.isGenericContravariant;
   }
diff --git a/pkg/kernel/lib/target/vm.dart b/pkg/kernel/lib/target/vm.dart
index 00fae71..eefe395 100644
--- a/pkg/kernel/lib/target/vm.dart
+++ b/pkg/kernel/lib/target/vm.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.target.vm;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import '../ast.dart';
 import '../class_hierarchy.dart';
 import '../core_types.dart';
@@ -84,9 +87,11 @@
         new Arguments(<Expression>[
           new StringLiteral(name)..fileOffset = offset,
           _fixedLengthList(
+              coreTypes.typeClass.rawType,
               arguments.types.map((t) => new TypeLiteral(t)).toList(),
               arguments.fileOffset),
-          _fixedLengthList(arguments.positional, arguments.fileOffset),
+          _fixedLengthList(
+              const DynamicType(), arguments.positional, arguments.fileOffset),
           new StaticInvocation(
               coreTypes.mapUnmodifiable,
               new Arguments([
@@ -96,7 +101,7 @@
                       new SymbolLiteral(arg.name)..fileOffset = arg.fileOffset,
                       arg.value)
                     ..fileOffset = arg.fileOffset;
-                })))
+                })), keyType: coreTypes.symbolClass.rawType)
                   ..isConst = (arguments.named.length == 0)
                   ..fileOffset = arguments.fileOffset
               ]))
@@ -140,9 +145,11 @@
                 new SymbolLiteral(name)..fileOffset = offset,
                 new IntLiteral(type)..fileOffset = offset,
                 _fixedLengthList(
+                    coreTypes.typeClass.rawType,
                     arguments.types.map((t) => new TypeLiteral(t)).toList(),
                     arguments.fileOffset),
-                _fixedLengthList(arguments.positional, arguments.fileOffset),
+                _fixedLengthList(const DynamicType(), arguments.positional,
+                    arguments.fileOffset),
                 new StaticInvocation(
                     coreTypes.mapUnmodifiable,
                     new Arguments([
@@ -153,11 +160,11 @@
                               ..fileOffset = arg.fileOffset,
                             arg.value)
                           ..fileOffset = arg.fileOffset;
-                      })))
+                      })), keyType: coreTypes.symbolClass.rawType)
                         ..isConst = (arguments.named.length == 0)
                         ..fileOffset = arguments.fileOffset
                     ], types: [
-                      new DynamicType(),
+                      coreTypes.symbolClass.rawType,
                       new DynamicType()
                     ]))
                   ..fileOffset = offset
@@ -234,7 +241,8 @@
     return type;
   }
 
-  Expression _fixedLengthList(List<Expression> elements, int offset) {
+  Expression _fixedLengthList(
+      DartType typeArgument, List<Expression> elements, int offset) {
     // TODO(ahe): It's possible that it would be better to create a fixed-length
     // list first, and then populate it. That would create fewer objects. But as
     // this is currently only used in (statically resolved) no-such-method
@@ -242,11 +250,12 @@
 
     // The 0-element list must be exactly 'const[]'.
     if (elements.length == 0) {
-      return new ListLiteral([])..isConst = true;
+      return new ListLiteral([], typeArgument: typeArgument)..isConst = true;
     }
 
     return new MethodInvocation(
-        new ListLiteral(elements)..fileOffset = offset,
+        new ListLiteral(elements, typeArgument: typeArgument)
+          ..fileOffset = offset,
         new Name("toList"),
         new Arguments(<Expression>[], named: <NamedExpression>[
           new NamedExpression("growable", new BoolLiteral(false))
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 0218fe3..3578de3 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.ast_to_text;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import '../ast.dart';
 import '../import_table.dart';
 
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index 9a87069..aa5f0cf 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -2,23 +2,63 @@
 // for 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 library implements a kernel2kernel constant evaluation transformation.
+///
+/// Even though it is expected that the frontend does not emit kernel AST which
+/// contains compile-time errors, this transformation still performs some
+/// valiation and throws a [ConstantEvaluationError] if there was a compile-time
+/// errors.
+///
+/// Due to the lack information which is is only available in the front-end,
+/// this validation is incomplete (e.g. whether an integer literal used the
+/// hexadecimal syntax or not).
+///
+/// Furthermore due to the lowering of certain constructs in the front-end
+/// (e.g. '??') we need to support a super-set of the normal constant expression
+/// language.  Issue(http://dartbug.com/31799)
 library kernel.transformations.constants;
 
 import '../kernel.dart';
 import '../ast.dart';
+import '../core_types.dart';
 import '../type_algebra.dart';
+import '../type_environment.dart';
+import '../class_hierarchy.dart';
 import 'treeshaker.dart' show findNativeName;
 
 Program transformProgram(Program program, ConstantsBackend backend,
-    {bool keepFields: false}) {
-  transformLibraries(program.libraries, backend, keepFields: keepFields);
+    {bool keepFields: false,
+    bool strongMode: false,
+    bool enableAsserts: false,
+    CoreTypes coreTypes,
+    ClassHierarchy hierarchy}) {
+  coreTypes ??= new CoreTypes(program);
+  hierarchy ??= new ClosedWorldClassHierarchy(program);
+
+  final typeEnvironment =
+      new TypeEnvironment(coreTypes, hierarchy, strongMode: strongMode);
+
+  transformLibraries(program.libraries, backend, coreTypes, typeEnvironment,
+      keepFields: keepFields,
+      strongMode: strongMode,
+      enableAsserts: enableAsserts);
   return program;
 }
 
 void transformLibraries(List<Library> libraries, ConstantsBackend backend,
-    {bool keepFields: false, bool keepVariables: false}) {
-  final ConstantsTransformer constantsTransformer =
-      new ConstantsTransformer(backend, keepFields, keepVariables);
+    CoreTypes coreTypes, TypeEnvironment typeEnvironment,
+    {bool keepFields: false,
+    bool keepVariables: false,
+    bool strongMode: false,
+    bool enableAsserts: false}) {
+  final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
+      backend,
+      keepFields,
+      keepVariables,
+      coreTypes,
+      typeEnvironment,
+      strongMode,
+      enableAsserts);
   for (final Library library in libraries) {
     for (final Field field in library.fields.toList()) {
       constantsTransformer.convertField(field);
@@ -39,19 +79,39 @@
         constantsTransformer.convertConstructor(constructor);
       }
     }
+    for (final Typedef td in library.typedefs) {
+      constantsTransformer.convertTypedef(td);
+    }
+
+    if (!keepFields) {
+      // The transformer API does not iterate over `Library.additionalExports`,
+      // so we manually delete the references to shaken nodes.
+      library.additionalExports.removeWhere((Reference reference) {
+        return reference.canonicalName == null;
+      });
+    }
   }
 }
 
 class ConstantsTransformer extends Transformer {
   final ConstantEvaluator constantEvaluator;
+  final CoreTypes coreTypes;
+  final TypeEnvironment typeEnvironment;
 
   /// Whether to preserve constant [Field]s.  All use-sites will be rewritten.
   final bool keepFields;
   final bool keepVariables;
 
   ConstantsTransformer(
-      ConstantsBackend backend, this.keepFields, this.keepVariables)
-      : constantEvaluator = new ConstantEvaluator(backend);
+      ConstantsBackend backend,
+      this.keepFields,
+      this.keepVariables,
+      this.coreTypes,
+      this.typeEnvironment,
+      bool strongMode,
+      bool enableAsserts)
+      : constantEvaluator = new ConstantEvaluator(
+            backend, typeEnvironment, coreTypes, strongMode, enableAsserts);
 
   // Transform the library/class members:
 
@@ -79,6 +139,13 @@
     });
   }
 
+  void convertTypedef(Typedef td) {
+    // A typedef can have annotations on variables which are constants.
+    constantEvaluator.withNewEnvironment(() {
+      td.accept(this);
+    });
+  }
+
   // Handle definition of constants:
 
   visitVariableDeclaration(VariableDeclaration node) {
@@ -166,6 +233,10 @@
 
 class ConstantEvaluator extends RecursiveVisitor {
   final ConstantsBackend backend;
+  final CoreTypes coreTypes;
+  final TypeEnvironment typeEnvironment;
+  final bool strongMode;
+  final bool enableAsserts;
 
   final Map<Constant, Constant> canonicalizationCache;
   final Map<Node, Constant> nodeCache;
@@ -177,7 +248,8 @@
   InstanceBuilder instanceBuilder;
   EvaluationEnvironment env;
 
-  ConstantEvaluator(this.backend)
+  ConstantEvaluator(this.backend, this.typeEnvironment, this.coreTypes,
+      this.strongMode, this.enableAsserts)
       : canonicalizationCache = <Constant, Constant>{},
         nodeCache = <Node, Constant>{};
 
@@ -204,6 +276,8 @@
   }
 
   visitIntLiteral(IntLiteral node) {
+    // The frontend will ensure the integer literals are in signed 64-bit range
+    // in strong mode.
     return canonicalize(new IntConstant(node.value));
   }
 
@@ -335,6 +409,21 @@
               typeArguments,
               evaluatePositionalArguments(init.arguments),
               evaluateNamedArguments(init.arguments));
+        } else if (init is AssertInitializer) {
+          if (enableAsserts) {
+            final Constant condition = init.statement.condition.accept(this);
+
+            if (condition is BoolConstant) {
+              if (!condition.value) {
+                final Constant message = init.statement.message?.accept(this);
+                throw new ConstantEvaluationError(
+                    'Assert initializer condition failed with message: $message.');
+              }
+            } else {
+              throw new ConstantEvaluationError(
+                  'Assert initializer did not evaluate to a boolean condition.');
+            }
+          }
         } else {
           throw new ConstantEvaluationError(
               'Cannot evaluate constant with [${init.runtimeType}].');
@@ -353,15 +442,19 @@
 
     // Handle == and != first (it's common between all types).
     if (arguments.length == 1 && node.name.name == '==') {
-      ensurePrimitiveConstant(receiver);
+      // TODO(http://dartbug.com/31799): Re-enable these checks.
+      //ensurePrimitiveConstant(receiver);
       final right = arguments[0];
-      ensurePrimitiveConstant(right);
+      // TODO(http://dartbug.com/31799): Re-enable these checks.
+      //ensurePrimitiveConstant(right);
       return receiver == right ? trueConstant : falseConstant;
     }
     if (arguments.length == 1 && node.name.name == '!=') {
-      ensurePrimitiveConstant(receiver);
+      // TODO(http://dartbug.com/31799): Re-enable these checks.
+      //ensurePrimitiveConstant(receiver);
       final right = arguments[0];
-      ensurePrimitiveConstant(right);
+      // TODO(http://dartbug.com/31799): Re-enable these checks.
+      //ensurePrimitiveConstant(right);
       return receiver != right ? trueConstant : falseConstant;
     }
 
@@ -498,12 +591,14 @@
   }
 
   visitConditionalExpression(ConditionalExpression node) {
-    final BoolConstant constant = evaluate(node.condition);
+    final Constant constant = evaluate(node.condition);
     if (constant == trueConstant) {
       return evaluate(node.then);
-    } else {
-      assert(constant == falseConstant);
+    } else if (constant == falseConstant) {
       return evaluate(node.otherwise);
+    } else {
+      throw new ConstantEvaluationError(
+          'Cannot use $constant as condition in a conditional expression.');
     }
   }
 
@@ -593,14 +688,19 @@
       } else if (target.name.name == 'identical') {
         // Ensure the "identical()" function comes from dart:core.
         final parent = target.parent;
-        if (parent is Library && parent.importUri == 'dart:core') {
+        if (parent is Library && parent == coreTypes.coreLibrary) {
           final positionalArguments =
               evaluatePositionalArguments(node.arguments);
-          final left = positionalArguments[0];
-          ensurePrimitiveConstant(left);
-          final right = positionalArguments[1];
-          ensurePrimitiveConstant(right);
-          return left == right ? trueConstant : falseConstant;
+          final Constant left = positionalArguments[0];
+          // TODO(http://dartbug.com/31799): Re-enable these checks.
+          //ensurePrimitiveConstant(left);
+          final Constant right = positionalArguments[1];
+          // TODO(http://dartbug.com/31799): Re-enable these checks.
+          //ensurePrimitiveConstant(right);
+          // Since we canonicalize constants during the evaluation, we can use
+          // identical here.
+          assert(left == right);
+          return identical(left, right) ? trueConstant : falseConstant;
         }
       }
     }
@@ -609,8 +709,63 @@
         'Calling "$target" during constant evaluation is disallowed.');
   }
 
+  visitAsExpression(AsExpression node) {
+    final Constant constant = node.operand.accept(this);
+    ensureIsSubtype(constant, evaluateDartType(node.type));
+    return constant;
+  }
+
+  visitNot(Not node) {
+    final Constant constant = node.operand.accept(this);
+    if (constant is BoolConstant) {
+      return constant == trueConstant ? falseConstant : trueConstant;
+    }
+    throw new ConstantEvaluationError(
+        'A not expression must have a boolean operand.');
+  }
+
+  visitSymbolLiteral(SymbolLiteral node) {
+    final value = canonicalize(new StringConstant(node.value));
+    return canonicalize(backend.buildSymbolConstant(value));
+  }
+
   // Helper methods:
 
+  void ensureIsSubtype(Constant constant, DartType type) {
+    DartType constantType;
+    if (constant is NullConstant) {
+      constantType = new InterfaceType(coreTypes.nullClass);
+    } else if (constant is BoolConstant) {
+      constantType = new InterfaceType(coreTypes.boolClass);
+    } else if (constant is IntConstant) {
+      constantType = new InterfaceType(coreTypes.intClass);
+    } else if (constant is DoubleConstant) {
+      constantType = new InterfaceType(coreTypes.doubleClass);
+    } else if (constant is StringConstant) {
+      constantType = new InterfaceType(coreTypes.stringClass);
+    } else if (constant is MapConstant) {
+      constantType = new InterfaceType(
+          coreTypes.mapClass, <DartType>[constant.keyType, constant.valueType]);
+    } else if (constant is ListConstant) {
+      constantType = new InterfaceType(
+          coreTypes.stringClass, <DartType>[constant.typeArgument]);
+    } else if (constant is InstanceConstant) {
+      constantType = new InterfaceType(constant.klass, constant.typeArguments);
+    } else if (constant is TearOffConstant) {
+      constantType = constant.procedure.function.functionType;
+    } else if (constant is TypeLiteralConstant) {
+      constantType = new InterfaceType(coreTypes.typeClass);
+    } else {
+      throw new ConstantEvaluationError(
+          'No support for obtaining the type of $constant.');
+    }
+
+    if (!typeEnvironment.isSubtypeOf(constantType, type)) {
+      throw new ConstantEvaluationError(
+          'Constant $constant is not a subtype of ${type}.');
+    }
+  }
+
   List<DartType> evaluateTypeArguments(Arguments arguments) {
     return evaluateDartTypes(arguments.types);
   }
@@ -686,7 +841,7 @@
         result = a - b;
         break;
       case '*':
-        result = a - b;
+        result = a * b;
         break;
       case '/':
         result = a / b;
@@ -695,13 +850,13 @@
         result = a ~/ b;
         break;
       case '%':
-        result = a ~/ b;
+        result = a % b;
         break;
     }
 
     if (result != null) {
       return canonicalize(result is int
-          ? new IntConstant(result)
+          ? new IntConstant(_wrapAroundInteger(result))
           : new DoubleConstant(result as double));
     }
 
@@ -719,6 +874,16 @@
     throw new ConstantEvaluationError(
         'Binary operation "$op" on num is disallowed.');
   }
+
+  int _wrapAroundInteger(int value) {
+    if (strongMode) {
+      return value.toSigned(64);
+    }
+    return value;
+  }
+
+  static const kMaxInt64 = (1 << 63) - 1;
+  static const kMinInt64 = -(1 << 63);
 }
 
 /// Holds the necessary information for a constant object, namely
@@ -798,6 +963,7 @@
       List<DartType> typeArguments,
       List<Constant> positionalArguments,
       Map<String, Constant> namedArguments);
+  Constant buildSymbolConstant(StringConstant value);
 
   Constant lowerListConstant(ListConstant constant);
   Constant lowerMapConstant(MapConstant constant);
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index bfbf8f9..0eb36d1 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.ast.visitor;
 
+// ignore: UNDEFINED_HIDDEN_NAME
+import 'dart:core' hide MapEntry;
+
 import 'ast.dart';
 
 abstract class ExpressionVisitor<R> {
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index b49184a..dd9078b 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -9,16 +9,34 @@
 import '../core_types.dart';
 
 class VmConstantsBackend implements ConstantsBackend {
+  final Map<String, String> defines;
+
   final Class immutableMapClass;
+  final Class internalSymbolClass;
+  final Field symbolNameField;
 
-  VmConstantsBackend._(this.immutableMapClass);
+  VmConstantsBackend._(this.defines, this.immutableMapClass,
+      this.internalSymbolClass, this.symbolNameField);
 
-  factory VmConstantsBackend(CoreTypes coreTypes) {
+  /// If [defines] is not `null` it will be used for handling
+  /// `const {bool,...}.fromEnvironment()` otherwise the current VM's values
+  /// will be used.
+  factory VmConstantsBackend(Map<String, String> defines, CoreTypes coreTypes) {
     final Library coreLibrary = coreTypes.coreLibrary;
     final Class immutableMapClass = coreLibrary.classes
         .firstWhere((Class klass) => klass.name == '_ImmutableMap');
     assert(immutableMapClass != null);
-    return new VmConstantsBackend._(immutableMapClass);
+
+    final Class internalSymbolClass = coreTypes.internalSymbolClass;
+    assert(internalSymbolClass != null);
+
+    final Field symbolNameField =
+        internalSymbolClass.fields.where((Field field) {
+      return field.isInstanceMember && field.name.name == '_name';
+    }).single;
+
+    return new VmConstantsBackend._(
+        defines, immutableMapClass, internalSymbolClass, symbolNameField);
   }
 
   Constant buildConstantForNative(
@@ -29,31 +47,54 @@
     switch (nativeName) {
       case 'Bool_fromEnvironment':
         final String name = (positionalArguments[0] as StringConstant).value;
-        final Constant constant = namedArguments['defaultValue'];
-        final bool defaultValue =
-            constant is BoolConstant ? constant.value : false;
-        return new BoolConstant(
-            new bool.fromEnvironment(name, defaultValue: defaultValue));
+        final BoolConstant constant = namedArguments['defaultValue'];
+        final bool defaultValue = constant != null ? constant.value : false;
+        bool value;
+        if (defines != null) {
+          value = defines[name] == 'true'
+              ? true
+              : (defines[name] == 'false' ? false : defaultValue);
+        } else {
+          value = new bool.fromEnvironment(name, defaultValue: defaultValue);
+        }
+        return new BoolConstant(value);
       case 'Integer_fromEnvironment':
         final String name = (positionalArguments[0] as StringConstant).value;
         final Constant constant = namedArguments['defaultValue'];
         final int defaultValue =
             constant is IntConstant ? constant.value : null;
-        final int value =
-            new int.fromEnvironment(name, defaultValue: defaultValue);
+        int value;
+        if (defines != null) {
+          value = defines.containsKey(name)
+              ? int.parse(defines[name], onError: (_) => defaultValue)
+              : defaultValue;
+        } else {
+          value = new int.fromEnvironment(name, defaultValue: defaultValue);
+        }
         return value != null ? new IntConstant(value) : new NullConstant();
       case 'String_fromEnvironment':
         final String name = (positionalArguments[0] as StringConstant).value;
         final Constant constant = namedArguments['defaultValue'];
         final String defaultValue =
             constant is StringConstant ? constant.value : null;
-        final String value =
-            new String.fromEnvironment(name, defaultValue: defaultValue);
+        String value;
+        if (defines != null) {
+          value = defines[name] ?? defaultValue;
+        } else {
+          value = new String.fromEnvironment(name, defaultValue: defaultValue);
+        }
         return value == null ? new NullConstant() : new StringConstant(value);
     }
     throw 'No native effect registered for constant evaluation: $nativeName';
   }
 
+  Constant buildSymbolConstant(StringConstant value) {
+    return new InstanceConstant(
+        internalSymbolClass.reference,
+        const <DartType>[],
+        <Reference, Constant>{symbolNameField.reference: value});
+  }
+
   Constant lowerMapConstant(MapConstant constant) {
     // The _ImmutableMap class is implemented via one field pointing to a list
     // of key/value pairs -- see runtime/lib/immutable_map.dart!
diff --git a/pkg/pkg.status b/pkg/pkg.status
index b210ee2..c39de25 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -36,6 +36,11 @@
 
 # Skip dev_compiler codegen tests
 dev_compiler/test/codegen/*: Skip
+dev_compiler/test/codegen_test: Skip
+dev_compiler/test/options/*: Skip
+dev_compiler/test/sourcemap/*: SkipByDesign
+dev_compiler/test/sourcemap/testfiles/*: SkipByDesign
+dev_compiler/test/worker/*: Skip
 dev_compiler/gen/*: SkipByDesign
 
 # Anything in rasta is input to fasta unit tests and shouldn't be run as tests.
@@ -79,11 +84,11 @@
 [ $compiler == dart2analyzer && $builder_tag == strong ]
 *: Skip # Issue 28649
 
-# Analyze dev_compiler but don't run its tests
-[ $compiler != dart2analyzer ]
+# Analyze dev_compiler but only run its tests on the vm
+[ $compiler != dart2analyzer && $runtime != vm ]
 dev_compiler/test/*: Skip
 
-[ $compiler == dart2analyzer ]
+[ $compiler == dart2analyzer || $runtime != vm ]
 dev_compiler/test/options/*: SkipByDesign
 
 [ $compiler == none && $runtime == drt ]
@@ -95,9 +100,15 @@
 analysis_server/test/completion_test: Pass, Slow
 analysis_server/test/integration/completion: Pass, Slow
 analysis_server/test/integration/search/find_top_level_declarations_test: Pass, RuntimeError # 31571
+analysis_server/test/integration/edit/format_test: Pass, Slow
+analysis_server/test/integration/analysis/error_test: Pass, Slow
+analysis_server/test/integration/analysis/lint_test: Pass, Slow
+analysis_server/test/integration/edit/import_elements_test: Pass, Slow
+analysis_server/test/integration/edit/organize_directives_test: Pass, Slow
 
 [ $runtime == vm && $checked ]
 analysis_server/test/completion_test: Pass, Slow
+analysis_server/test/integration/edit/sort_members_test: Pass, Slow
 analysis_server/test/services/correction/fix_test: Pass, Slow
 analysis_server/test/socket_server_test: Skip # Pass, Slow
 analyzer/test/generated/non_error_resolver_kernel_test: Skip # Timing out even with Pass, Slow: Issue 30796
@@ -117,9 +128,6 @@
 front_end/test/src/incremental/hot_reload_e2e_test: Skip # Issue 28629
 kernel/test/metadata_test: Skip # Issue 28629
 
-[ $runtime == vm && ! $use_sdk ]
-front_end/tool/perf_test: Skip # Issue 28698
-
 [ $runtime == vm && $use_sdk ]
 front_end/tool/fasta_perf_test: SkipByDesign # depends on patched_sdk which is not built into the sdk
 front_end/test/kernel_generator_test: SkipByDesign # depends on patched_sdk which is not built into the sdk
@@ -152,7 +160,7 @@
 front_end/test/incremental_resolved_ast_generator_test: SkipByDesign # Uses dart:io
 front_end/test/memory_file_system_test: CompileTimeError # Issue 23773
 front_end/test/dependency_grapher_test: SkipByDesign # Uses dart:io
-front_end/test/physical_file_system_test: SkipByDesign # Uses dart:io
+front_end/test/standard_file_system_test: SkipByDesign # Uses dart:io
 front_end/test/src/base/file_repository_test: SkipByDesign # Uses dart:io
 front_end/test/src/base/libraries_reader_test: SkipByDesign # Uses dart:io
 front_end/test/src/base/processed_options_test: SkipByDesign # Uses dart:io
@@ -219,7 +227,7 @@
 [ $browser || $jscl ]
 kernel/test/*: SkipByDesign # Uses dart:io and bigints.
 
-[ $runtime == vm && ($arch == simarm64 || $arch == simarm || $arch == simarmv6 || $arch == simarmv5te || $arch == armv6 || $arch == armv5te) ]
+[ $runtime == vm && ($arch == simarm64 || $arch == simarm || $arch == simarmv6 || $arch == simarmv5te || $arch == armv6 || $arch == armv5te || $arch == simdbc64) ]
 # Timeout. These are not unit tests. They do not run efficiently on our
 # simulator or low-end devices.
 *: Skip
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 13be81e..46a4c7c 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -29,7 +29,7 @@
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 import 'package:front_end/src/fasta/kernel/utils.dart';
@@ -72,6 +72,7 @@
           (message, Severity severity, String formatted, int line, int column) {
         switch (severity) {
           case Severity.error:
+          case Severity.errorLegacyWarning:
           case Severity.internalProblem:
             // TODO(sigmund): support emitting code with errors as long as they
             // are handled in the generated code (issue #30194).
@@ -156,7 +157,7 @@
     }
   } else {
     final FileSystem fileSystem = sourceFiles == null
-        ? PhysicalFileSystem.instance
+        ? StandardFileSystem.instance
         : _buildFileSystem(sourceFiles);
 
     // TODO(aam): IncrementalCompiler instance created below have to be
@@ -203,7 +204,7 @@
         suppressWarnings: suppressWarnings);
   } else {
     final FileSystem fileSystem = sourceFiles == null
-        ? PhysicalFileSystem.instance
+        ? StandardFileSystem.instance
         : _buildFileSystem(sourceFiles);
     compiler = new SingleShotCompiler(fileSystem, platformKernel,
         requireMain: sourceFiles == null,
@@ -256,7 +257,7 @@
 /// The [namedSources] list interleaves file name string and
 /// raw file content Uint8List.
 ///
-/// The result can be used instead of PhysicalFileSystem.instance by the
+/// The result can be used instead of StandardFileSystem.instance by the
 /// frontend.
 FileSystem _buildFileSystem(List namedSources) {
   MemoryFileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///'));
diff --git a/pkg/vm/lib/transformations/devirtualization.dart b/pkg/vm/lib/transformations/devirtualization.dart
index 9d8685b..7cca514 100644
--- a/pkg/vm/lib/transformations/devirtualization.dart
+++ b/pkg/vm/lib/transformations/devirtualization.dart
@@ -65,6 +65,10 @@
     return true;
   }
 
+  bool hasExtraTargetForNull(DirectCallMetadata directCall) =>
+      directCall.checkReceiverForNull &&
+      _objectMemberNames.contains(directCall.target.name);
+
   DirectCallMetadata getDirectCall(TreeNode node, Member target,
       {bool setter = false});
 
@@ -90,15 +94,14 @@
     super.visitMethodInvocation(node);
 
     Member target = node.interfaceTarget;
-    if ((target != null) &&
-        isMethod(target) &&
-        !_objectMemberNames.contains(target.name)) {
+    if ((target != null) && isMethod(target)) {
       DirectCallMetadata directCall = getDirectCall(node, target);
       // TODO(dartbug.com/30480): Convert _isLegalTargetForMethodInvocation()
       // check into an assertion once front-end implements override checks.
       if ((directCall != null) &&
           isMethod(directCall.target) &&
-          isLegalTargetForMethodInvocation(directCall.target, node.arguments)) {
+          isLegalTargetForMethodInvocation(directCall.target, node.arguments) &&
+          !hasExtraTargetForNull(directCall)) {
         makeDirectCall(node, target, directCall);
       }
     }
@@ -109,11 +112,11 @@
     super.visitPropertyGet(node);
 
     Member target = node.interfaceTarget;
-    if ((target != null) &&
-        isFieldOrGetter(target) &&
-        !_objectMemberNames.contains(target.name)) {
+    if ((target != null) && isFieldOrGetter(target)) {
       DirectCallMetadata directCall = getDirectCall(node, target);
-      if ((directCall != null) && isFieldOrGetter(directCall.target)) {
+      if ((directCall != null) &&
+          isFieldOrGetter(directCall.target) &&
+          !hasExtraTargetForNull(directCall)) {
         makeDirectCall(node, target, directCall);
       }
     }
diff --git a/pkg/vm/tool/dart2.bat b/pkg/vm/tool/dart2.bat
new file mode 100644
index 0000000..739671a
--- /dev/null
+++ b/pkg/vm/tool/dart2.bat
@@ -0,0 +1,36 @@
+@echo off
+REM Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+REM for details. All rights reserved. Use of this source code is governed by a
+REM BSD-style license that can be found in the LICENSE file.
+
+REM Script for running JIT mode VM with Dart 2 pipeline: using Fasta in DFE
+REM isolate and strong mode semantics.
+
+set SCRIPTPATH=%~dp0
+
+REM Does the path have a trailing slash? If so, remove it.
+if %SCRIPTPATH:~-1%==\ set SCRIPTPATH=%SCRIPTPATH:~0,-1%
+
+set OUT_DIR=%SCRIPTPATH%/../../../out/
+
+REM Remove trailing spaces
+set DART_CONFIGURATION=%DART_CONFIGURATION: =%
+
+if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
+if "%DART_USE_SDK%"=="" set DART_USE_SDK=0
+set BUILD_DIR=%OUT_DIR%%DART_CONFIGURATION%
+
+if not "_%DART_VM_OPTIONS%_" == "__" (
+  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% %DART_VM_OPTIONS%
+)
+
+if "%DART_USE_SDK%"=="1" (
+  set DART_BINARY=%BUILD_DIR%/dart-sdk/bin/dart
+  set KERNEL_BINARIES_DIR=%BUILD_DIR%/dart-sdk/lib/_internal
+) else (
+  set DART_BINARY=%BUILD_DIR%/dart
+  set KERNEL_BINARIES_DIR=%BUILD_DIR%
+)
+set KERNEL_SERVICE_SNAPSHOT=%BUILD_DIR%/gen/kernel-service.dart.snapshot
+
+"%DART_BINARY%" --strong --reify-generic-functions --limit-ints-to-64-bits --dfe="%KERNEL_SERVICE_SNAPSHOT%" --kernel-binaries="%KERNEL_BINARIES_DIR%" %*
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 4be5a13..d6dbafa 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -339,4 +339,7 @@
     "--input",
     rebase_path("vm/version_in.cc", root_build_dir),
   ]
+  if (!dart_version_git_info) {
+    args += [ "--ignore_svn_revision" ]
+  }
 }
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 56139f95..f5e48a8 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -1226,7 +1226,7 @@
   Dart_Handle result;
 
   // Precompile with specified embedder entry points
-  result = Dart_Precompile(standalone_entry_points, NULL, 0);
+  result = Dart_Precompile(standalone_entry_points);
   CHECK_RESULT(result);
 
   // Create a precompiled snapshot.
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index c030a71..f50e9ccd 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -803,27 +803,7 @@
     }
 
     if (Options::gen_snapshot_kind() == kAppAOT) {
-      uint8_t* feedback_buffer = NULL;
-      intptr_t feedback_length = 0;
-      if (Options::load_feedback_filename() != NULL) {
-        File* file =
-            File::Open(NULL, Options::load_feedback_filename(), File::kRead);
-        if (file == NULL) {
-          ErrorExit(kErrorExitCode, "Failed to read JIT feedback.\n");
-        }
-        feedback_length = file->Length();
-        feedback_buffer = reinterpret_cast<uint8_t*>(malloc(feedback_length));
-        if (!file->ReadFully(feedback_buffer, feedback_length)) {
-          ErrorExit(kErrorExitCode, "Failed to read JIT feedback.\n");
-        }
-        file->Release();
-      }
-
-      result = Dart_Precompile(standalone_entry_points, feedback_buffer,
-                               feedback_length);
-      if (feedback_buffer != NULL) {
-        free(feedback_buffer);
-      }
+      result = Dart_Precompile(standalone_entry_points);
       CHECK_RESULT(result);
 
       if (Options::obfuscate() &&
@@ -893,14 +873,6 @@
       }
       CHECK_RESULT(result);
 
-      if (Options::save_feedback_filename() != NULL) {
-        uint8_t* buffer = NULL;
-        intptr_t size = 0;
-        result = Dart_SaveJITFeedback(&buffer, &size);
-        CHECK_RESULT(result);
-        WriteFile(Options::save_feedback_filename(), buffer, size);
-      }
-
       if (Options::save_compilation_trace_filename() != NULL) {
         uint8_t* buffer = NULL;
         intptr_t size = 0;
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 142e636..793d3d8 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -24,8 +24,6 @@
   V(save_obfuscation_map, obfuscation_map_filename)                            \
   V(save_compilation_trace, save_compilation_trace_filename)                   \
   V(load_compilation_trace, load_compilation_trace_filename)                   \
-  V(save_feedback, save_feedback_filename)                                     \
-  V(load_feedback, load_feedback_filename)                                     \
   V(root_certs_file, root_certs_file)                                          \
   V(root_certs_cache, root_certs_cache)                                        \
   V(namespace, namespc)
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c5e0999..5cc3992 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3186,44 +3186,17 @@
  */
 
 /**
- * Saves a serialized version of the information collected for use by the
- * optimizing compiler, such as type feedback and usage counters. When this
- * information is passed to Dart_Precompile, the AOT compiler may use it to
- * produce faster and smaller code. The feedback is only used if the JIT that
- * created it and the AOT compiler consuming it
- *   - are running the same Dart program
- *   - are built from the same version of the VM
- *   - agree on whether type checks and assertions are enabled
- *
- * \return Returns an error handler if the VM was built in a mode that does not
- * support saving JIT feedback.
- */
-DART_EXPORT Dart_Handle Dart_SaveJITFeedback(uint8_t** buffer,
-                                             intptr_t* buffer_length);
-
-/**
  * Compiles all functions reachable from the provided entry points and marks
  * the isolate to disallow future compilation.
  *
  * \param entry_points A list of functions that may be invoked through the
  * embedding API, e.g. Dart_Invoke/GetField/SetField/New/InvokeClosure.
  *
- * \param reset_fields Controls whether static fields are reset. Fields without
- * an initializer will be set to null, and fields with an initializer will have
- * their initializer run the next time they are accessed.
- *
- * reset_fields is true when we are about to create a precompilated snapshot.
- * Some fields are already been initialized as part of the loading logic, and
- * we want them to be reinitialized in the new process that will load the
- * snapshot.
- *
  * \return An error handle if a compilation error or runtime error running const
  * constructors was encountered.
  */
 DART_EXPORT Dart_Handle
-Dart_Precompile(Dart_QualifiedFunctionName entry_points[],
-                uint8_t* jit_feedback,
-                intptr_t jit_feedback_length);
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[]);
 
 /**
  *  Creates a precompiled snapshot.
diff --git a/runtime/lib/developer.dart b/runtime/lib/developer.dart
index 6d47e33..f9ef541 100644
--- a/runtime/lib/developer.dart
+++ b/runtime/lib/developer.dart
@@ -76,7 +76,7 @@
     SendPort replyPort,
     Object id,
     bool trace_service) {
-  var parameters = {};
+  var parameters = <String, String>{};
   for (var i = 0; i < parameterKeys.length; i++) {
     parameters[parameterKeys[i]] = parameterValues[i];
   }
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index 39dc5b5..e89d074 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -279,7 +279,7 @@
     var doms = _graph._doms;
 
     var parentId = _id;
-    var domChildren = [];
+    var domChildren = <ObjectVertex>[];
 
     for (var childId = ROOT; childId <= N; childId++) {
       if (doms[childId] == parentId) {
diff --git a/runtime/observatory/lib/src/debugger/debugger_location.dart b/runtime/observatory/lib/src/debugger/debugger_location.dart
index ba05ed5..9ba4bac 100644
--- a/runtime/observatory/lib/src/debugger/debugger_location.dart
+++ b/runtime/observatory/lib/src/debugger/debugger_location.dart
@@ -113,14 +113,14 @@
 
   static Future<List<Script>> _lookupScript(Isolate isolate, String name,
       {bool allowPrefix: false}) {
-    var pending = [];
+    var pending = <Future>[];
     for (var lib in isolate.libraries) {
       if (!lib.loaded) {
         pending.add(lib.load());
       }
     }
     return Future.wait(pending).then((_) {
-      List matches = [];
+      var matches = <Script>[];
       for (var lib in isolate.libraries) {
         for (var script in lib.scripts) {
           if (allowPrefix) {
@@ -140,7 +140,7 @@
 
   static List<ServiceFunction> _lookupFunction(Isolate isolate, String name,
       {bool allowPrefix: false}) {
-    var matches = [];
+    var matches = <ServiceFunction>[];
     for (var lib in isolate.libraries) {
       assert(lib.loaded);
       for (var function in lib.functions) {
@@ -163,7 +163,7 @@
     if (isolate == null) {
       return [];
     }
-    var pending = [];
+    var pending = <Future>[];
     for (var lib in isolate.libraries) {
       assert(lib.loaded);
       for (var cls in lib.classes) {
@@ -173,7 +173,7 @@
       }
     }
     await Future.wait(pending);
-    var matches = [];
+    var matches = <Class>[];
     for (var lib in isolate.libraries) {
       for (var cls in lib.classes) {
         if (allowPrefix) {
@@ -260,7 +260,7 @@
 
   /// Completes a partial source location description.
   static Future<List<String>> complete(Debugger debugger, String locDesc) {
-    List<Future<List<String>>> pending = [];
+    var pending = <Future<List<String>>>[];
     var match = partialFunctionMatcher.firstMatch(locDesc);
     if (match != null) {
       pending.add(_completeFunction(debugger, match));
@@ -272,7 +272,7 @@
     }
 
     return Future.wait(pending).then((List<List<String>> responses) {
-      var completions = [];
+      var completions = <String>[];
       for (var response in responses) {
         completions.addAll(response);
       }
@@ -289,7 +289,7 @@
 
     if (qualifier == null) {
       return _lookupClass(isolate, base, allowPrefix: true).then((classes) {
-        var completions = [];
+        var completions = <String>[];
 
         // Complete top-level function names.
         var functions = _lookupFunction(isolate, base, allowPrefix: true);
@@ -306,7 +306,7 @@
       });
     } else {
       return _lookupClass(isolate, base, allowPrefix: false).then((classes) {
-        var completions = [];
+        var completions = <String>[];
         for (var cls in classes) {
           for (var function in cls.functions) {
             if (function.kind == M.FunctionKind.constructor) {
@@ -375,7 +375,7 @@
       // The script name is incomplete.  Complete it.
       var scripts =
           await _lookupScript(debugger.isolate, scriptName, allowPrefix: true);
-      List completions = [];
+      var completions = <String>[];
       for (var script in scripts) {
         completions.add(script.name + ':');
       }
@@ -393,7 +393,7 @@
       if (!lineStrComplete) {
         // Complete the line.
         var sharedPrefix = '${script.name}:';
-        List completions = [];
+        var completions = <String>[];
         var report = await script.isolate
             .getSourceReport([Isolate.kPossibleBreakpointsReport], script);
         Set<int> possibleBpts = getPossibleBreakpointLines(report, script);
@@ -410,7 +410,7 @@
         int lineNum = int.parse(lineStr);
         var scriptLine = script.getLine(lineNum);
         var sharedPrefix = '${script.name}:${lineStr}:';
-        List completions = [];
+        var completions = <String>[];
         int maxCol = scriptLine.text.trimRight().runes.length;
         for (int i = 1; i <= maxCol; i++) {
           var currentColStr = i.toString();
diff --git a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
index 7e56fd9..c14bff7b 100644
--- a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
@@ -49,7 +49,7 @@
 
   Future<List<MergedVertex>> buildMergedVertices(
       S.Isolate isolate, ObjectGraph graph, signal) async {
-    final cidToMergedVertex = {};
+    final cidToMergedVertex = <int, MergedVertex>{};
 
     int count = 0;
     final Stopwatch watch = new Stopwatch();
@@ -104,7 +104,7 @@
 
   buildOwnershipClasses(S.Isolate isolate, ObjectGraph graph) {
     var numCids = graph.numCids;
-    var classes = new List();
+    var classes = new List<HeapSnapshotOwnershipClass>();
     for (var cid = 0; cid < numCids; cid++) {
       var size = graph.getOwnedByCid(cid);
       if (size != 0) {
@@ -144,8 +144,8 @@
     if (_preloaded != null) {
       return new Future.value(_preloaded);
     } else {
-      return isolate.getObjectByAddress(v.address).then((S.HeapObject obj) {
-        return _preloaded = obj;
+      return isolate.getObjectByAddress(v.address).then((S.ServiceObject obj) {
+        return _preloaded = obj as S.HeapObject;
       });
     }
   }
diff --git a/runtime/observatory/lib/src/models/objects/instance.dart b/runtime/observatory/lib/src/models/objects/instance.dart
index e85e861f..982d6d8 100644
--- a/runtime/observatory/lib/src/models/objects/instance.dart
+++ b/runtime/observatory/lib/src/models/objects/instance.dart
@@ -323,7 +323,7 @@
   ///   Int32x4List
   ///   Float32x4List
   ///   Float64x2List
-  Iterable<dynamic> get typedElements;
+  List<dynamic> get typedElements;
 
   /// [optional] The native fields of this Instance.
   Iterable<NativeField> get nativeFields;
diff --git a/runtime/observatory/lib/src/sample_profile/sample_profile.dart b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
index db9c060..a116563 100644
--- a/runtime/observatory/lib/src/sample_profile/sample_profile.dart
+++ b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
@@ -134,7 +134,7 @@
   FunctionCallTreeNodeCode(this.code, this.ticks);
 }
 
-class FunctionCallTreeNode extends CallTreeNode {
+class FunctionCallTreeNode extends CallTreeNode<FunctionCallTreeNode> {
   final ProfileFunction profileFunction;
   final codes = new List<FunctionCallTreeNodeCode>();
   int _totalCodeTicks = 0;
@@ -210,7 +210,7 @@
 typedef bool CallTreeNodeFilter(CallTreeNode node);
 
 /// Build a filter version of a FunctionCallTree.
-abstract class _FilteredCallTreeBuilder {
+abstract class _FilteredCallTreeBuilder<NodeT extends CallTreeNode> {
   /// The filter.
   final CallTreeNodeFilter filter;
 
@@ -235,14 +235,15 @@
 
   CallTreeNode _findInChildren(CallTreeNode current, CallTreeNode needle) {
     for (var child in current.children) {
-      if (child.profileData == needle.profileData) {
+      if ((child as CallTreeNode).profileData ==
+          (needle as CallTreeNode).profileData) {
         return child;
       }
     }
     return null;
   }
 
-  CallTreeNode _copyNode(CallTreeNode node);
+  NodeT _copyNode(NodeT node);
 
   /// Add all nodes in [_currentPath].
   FunctionCallTreeNode _addCurrentPath() {
@@ -320,7 +321,8 @@
   }
 }
 
-class _FilteredFunctionCallTreeBuilder extends _FilteredCallTreeBuilder {
+class _FilteredFunctionCallTreeBuilder
+    extends _FilteredCallTreeBuilder<FunctionCallTreeNode> {
   _FilteredFunctionCallTreeBuilder(
       CallTreeNodeFilter filter, FunctionCallTree tree)
       : super(
@@ -329,8 +331,8 @@
             new FunctionCallTree(
                 tree.inclusive,
                 new FunctionCallTreeNode(
-                    tree.root.profileData,
-                    tree.root.count,
+                    (tree.root as CallTreeNode).profileData,
+                    (tree.root as CallTreeNode).count,
                     tree.root.inclusiveNativeAllocations,
                     tree.root.exclusiveNativeAllocations)));
 
@@ -340,7 +342,8 @@
   }
 }
 
-class _FilteredCodeCallTreeBuilder extends _FilteredCallTreeBuilder {
+class _FilteredCodeCallTreeBuilder
+    extends _FilteredCallTreeBuilder<CodeCallTreeNode> {
   _FilteredCodeCallTreeBuilder(CallTreeNodeFilter filter, CodeCallTree tree)
       : super(
             filter,
@@ -359,7 +362,8 @@
   }
 }
 
-class FunctionCallTree extends CallTree implements M.FunctionCallTree {
+class FunctionCallTree extends CallTree<FunctionCallTreeNode>
+    implements M.FunctionCallTree {
   FunctionCallTree(bool inclusive, FunctionCallTreeNode root)
       : super(inclusive, root) {
     if ((root.inclusiveNativeAllocations != null) &&
@@ -439,7 +443,7 @@
 
   _markFunctionCalls() {
     for (var child in root.children) {
-      _markFunctionCallsInner(null, child);
+      _markFunctionCallsInner(null, child as FunctionCallTreeNode);
     }
   }
 }
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 5379315..1b9159b 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -108,7 +108,8 @@
     return o1.name.compareTo(o2.name);
   }
 
-  List removeDuplicatesAndSortLexical(List<ServiceObject> list) {
+  List<T> removeDuplicatesAndSortLexical<T extends ServiceObject>(
+      List<T> list) {
     return list.toSet().toList()..sort(LexicalSortName);
   }
 
@@ -451,7 +452,7 @@
   /// be [loaded].
   ServiceObject getFromMap(Map map);
 
-  Future<M.Object> invokeRpc(String method, Map params);
+  Future<ServiceObject> invokeRpc(String method, Map params);
 }
 
 abstract class Location implements M.Location {
@@ -821,7 +822,7 @@
   Future<Map> invokeRpcRaw(String method, Map params);
 
   Future<Map> invokeRpcNoUpgrade(String method, Map params) {
-    return invokeRpcRaw(method, params).then((Map response) {
+    return invokeRpcRaw(method, params).then<Map>((Map response) {
       var map = response;
       if (Tracer.current != null) {
         Tracer.current
@@ -832,15 +833,16 @@
             "Response is missing the 'type' field", map);
         return new Future.error(exception);
       }
-      return new Future.value(map);
+      return new Future<Map>.value(map);
     }).catchError((e) {
       // Errors pass through.
-      return new Future.error(e);
+      return new Future<Map>.error(e);
     });
   }
 
-  Future<dynamic> invokeRpc(String method, Map params) {
-    return invokeRpcNoUpgrade(method, params).then((Map response) {
+  Future<ServiceObject> invokeRpc(String method, Map params) {
+    return invokeRpcNoUpgrade(method, params)
+        .then<ServiceObject>((Map response) {
       var obj = new ServiceObject._fromMap(this, response);
       if ((obj != null) && obj.canCache) {
         String objId = obj.id;
@@ -848,7 +850,7 @@
       }
       return obj;
     }).catchError((e) {
-      return new Future.error(e);
+      return new Future<ServiceObject>.error(e);
     });
   }
 
@@ -994,7 +996,7 @@
 
   // Reload all isolates.
   Future reloadIsolates() {
-    var reloads = [];
+    var reloads = <Future>[];
     for (var isolate in isolates) {
       var reload = isolate.reload().catchError((e) {
         Logger.root.info('Bulk reloading of isolates failed: $e');
@@ -1362,7 +1364,7 @@
 
   Future<ServiceMap> getSourceReport(List<String> report_kinds,
       [Script script, int startPos, int endPos]) {
-    var params = {'reports': report_kinds};
+    var params = <String, dynamic>{'reports': report_kinds};
     if (script != null) {
       params['scriptId'] = script.id;
     }
@@ -1389,7 +1391,7 @@
     }
     return invokeRpc('reloadSources', params).then((result) {
       _cache.clear();
-      return result;
+      return result as ServiceMap;
     });
   }
 
@@ -1405,10 +1407,10 @@
 
   /// Fetches and builds the class hierarchy for this isolate. Returns the
   /// Object class object.
-  Future<Class> getClassHierarchy() {
-    return invokeRpc('getClassList', {})
-        .then(_loadClasses)
-        .then(_buildClassHierarchy);
+  Future<Class> getClassHierarchy() async {
+    var classRefs = await invokeRpc('getClassList', {});
+    var classes = await _loadClasses(classRefs);
+    return _buildClassHierarchy(classes);
   }
 
   Future<ServiceObject> getPorts() {
@@ -1422,7 +1424,7 @@
   Future<List<Class>> getClassRefs() async {
     ServiceMap classList = await invokeRpc('getClassList', {});
     assert(classList.type == 'ClassList');
-    var classRefs = [];
+    var classRefs = <Class>[];
     for (var cls in classList['classes']) {
       // Skip over non-class classes.
       if (cls is Class) {
@@ -1436,7 +1438,7 @@
   /// Given the class list, loads each class.
   Future<List<Class>> _loadClasses(ServiceMap classList) {
     assert(classList.type == 'ClassList');
-    var futureClasses = [];
+    var futureClasses = <Future<Class>>[];
     for (var cls in classList['classes']) {
       // Skip over non-class classes.
       if (cls is Class) {
@@ -1495,7 +1497,7 @@
     return vm.invokeRpcNoUpgrade(method, params);
   }
 
-  Future<dynamic> invokeRpc(String method, Map params) {
+  Future<ServiceObject> invokeRpc(String method, Map params) {
     return invokeRpcNoUpgrade(method, params).then((Map response) {
       return getFromMap(response);
     });
@@ -1671,7 +1673,7 @@
     error = map['error'];
 
     libraries.clear();
-    libraries.addAll(map['libraries']);
+    for (Library l in map['libraries']) libraries.add(l);
     libraries.sort(ServiceObject.LexicalSortName);
     if (savedStartTime == null) {
       vm._buildIsolateList();
@@ -1679,12 +1681,12 @@
 
     extensionRPCs.clear();
     if (map['extensionRPCs'] != null) {
-      extensionRPCs.addAll(map['extensionRPCs']);
+      for (String e in map['extensionRPCs']) extensionRPCs.add(e);
     }
 
     threads.clear();
     if (map['_threads'] != null) {
-      threads.addAll(map['_threads']);
+      for (Thread t in map['_threads']) threads.add(t);
     }
 
     int currentZoneHighWatermark = 0;
@@ -1792,7 +1794,7 @@
     }
   }
 
-  Future<ServiceObject> addBreakpoint(Script script, int line, [int col]) {
+  Future<Breakpoint> addBreakpoint(Script script, int line, [int col]) {
     Map params = {
       'scriptId': script.id,
       'line': line,
@@ -1800,11 +1802,11 @@
     if (col != null) {
       params['column'] = col;
     }
-    return invokeRpc('addBreakpoint', params);
+    return invokeRpc('addBreakpoint', params)
+        .then((result) => result as Breakpoint);
   }
 
-  Future<ServiceObject> addBreakpointByScriptUri(String uri, int line,
-      [int col]) {
+  Future<Breakpoint> addBreakpointByScriptUri(String uri, int line, [int col]) {
     Map params = {
       'scriptUri': uri,
       'line': line.toString(),
@@ -1812,15 +1814,18 @@
     if (col != null) {
       params['column'] = col.toString();
     }
-    return invokeRpc('addBreakpointWithScriptUri', params);
+    return invokeRpc('addBreakpointWithScriptUri', params)
+        .then((result) => result as Breakpoint);
   }
 
-  Future<ServiceObject> addBreakpointAtEntry(ServiceFunction function) {
-    return invokeRpc('addBreakpointAtEntry', {'functionId': function.id});
+  Future<Breakpoint> addBreakpointAtEntry(ServiceFunction function) {
+    return invokeRpc('addBreakpointAtEntry', {'functionId': function.id})
+        .then((result) => result as Breakpoint);
   }
 
-  Future<ServiceObject> addBreakOnActivation(Instance closure) {
-    return invokeRpc('_addBreakpointAtActivation', {'objectId': closure.id});
+  Future<Breakpoint> addBreakOnActivation(Instance closure) {
+    return invokeRpc('_addBreakpointAtActivation', {'objectId': closure.id})
+        .then((result) => result as Breakpoint);
   }
 
   Future removeBreakpoint(Breakpoint bpt) {
@@ -1864,7 +1869,7 @@
   }
 
   Future<ServiceMap> getStack() {
-    return invokeRpc('getStack', {});
+    return invokeRpc('getStack', {}).then((response) => response as ServiceMap);
   }
 
   Future<ObjectStore> getObjectStore() {
@@ -1952,12 +1957,13 @@
     return invokeRpc('_getInstances', params);
   }
 
-  Future<ServiceObject> getObjectByAddress(String address, [bool ref = true]) {
+  Future<HeapObject> getObjectByAddress(String address, [bool ref = true]) {
     Map params = {
       'address': address,
       'ref': ref,
     };
-    return invokeRpc('_getObjectByAddress', params);
+    return invokeRpc('_getObjectByAddress', params)
+        .then((result) => result as HeapObject);
   }
 
   final Map<String, ServiceMetric> dartMetrics = <String, ServiceMetric>{};
@@ -1967,7 +1973,7 @@
   Future<Map<String, ServiceMetric>> _refreshMetrics(
       String metricType, Map<String, ServiceMetric> metricsMap) {
     return invokeRpc('_getIsolateMetricList', {'type': metricType})
-        .then((result) {
+        .then((dynamic result) {
       // Clear metrics map.
       metricsMap.clear();
       // Repopulate metrics map.
@@ -2206,7 +2212,7 @@
       breakpoint = map['breakpoint'];
     }
     if (map['pauseBreakpoints'] != null) {
-      pauseBreakpoints = map['pauseBreakpoints'];
+      pauseBreakpoints = new List<Breakpoint>.from(map['pauseBreakpoints']);
       if (pauseBreakpoints.length > 0) {
         breakpoint = pauseBreakpoints[0];
       }
@@ -2389,11 +2395,11 @@
 
 class Library extends HeapObject implements M.Library {
   String uri;
-  final dependencies = <LibraryDependency>[];
-  final scripts = <Script>[];
-  final classes = <Class>[];
-  final variables = <Field>[];
-  final functions = <ServiceFunction>[];
+  final List<LibraryDependency> dependencies = <LibraryDependency>[];
+  final List<Script> scripts = <Script>[];
+  final List<Class> classes = <Class>[];
+  final List<Field> variables = <Field>[];
+  final List<ServiceFunction> functions = <ServiceFunction>[];
   bool _debuggable;
   bool get debuggable => _debuggable;
   bool get immutable => false;
@@ -2425,17 +2431,20 @@
     _loaded = true;
     _debuggable = map['debuggable'];
     dependencies.clear();
-    dependencies.addAll(map["dependencies"].map(LibraryDependency._fromMap));
+    for (var dependency in map["dependencies"]) {
+      dependencies.add(LibraryDependency._fromMap(dependency));
+    }
     scripts.clear();
-    scripts.addAll(removeDuplicatesAndSortLexical(map['scripts']));
+    scripts.addAll(
+        removeDuplicatesAndSortLexical(new List<Script>.from(map['scripts'])));
     classes.clear();
-    classes.addAll(map['classes']);
+    for (Class c in map['classes']) classes.add(c);
     classes.sort(ServiceObject.LexicalSortName);
     variables.clear();
-    variables.addAll(map['variables']);
+    for (Field v in map['variables']) variables.add(v);
     variables.sort(ServiceObject.LexicalSortName);
     functions.clear();
-    functions.addAll(map['functions']);
+    for (ServiceFunction f in map['functions']) functions.add(f);
     functions.sort(ServiceObject.LexicalSortName);
   }
 
@@ -2520,12 +2529,12 @@
   bool get hasAllocations => newSpace.notEmpty || oldSpace.notEmpty;
   bool get hasNoAllocations => newSpace.empty && oldSpace.empty;
   bool traceAllocations = false;
-  final fields = <Field>[];
-  final functions = <ServiceFunction>[];
+  final List<Field> fields = <Field>[];
+  final List<ServiceFunction> functions = <ServiceFunction>[];
 
   Class superclass;
-  final interfaces = <Instance>[];
-  final subclasses = <Class>[];
+  final List<Instance> interfaces = <Instance>[];
+  final List<Class> subclasses = <Class>[];
 
   Instance superType;
   Instance mixin;
@@ -2572,19 +2581,19 @@
     isImplemented = map['_implemented'];
 
     subclasses.clear();
-    subclasses.addAll(map['subclasses']);
+    for (Class c in map['subclasses']) subclasses.add(c);
     subclasses.sort(ServiceObject.LexicalSortName);
 
     interfaces.clear();
-    interfaces.addAll(map['interfaces']);
+    for (Instance i in map['interfaces']) interfaces.add(i);
     interfaces.sort(ServiceObject.LexicalSortName);
 
     fields.clear();
-    fields.addAll(map['fields']);
+    for (Field f in map['fields']) fields.add(f);
     fields.sort(ServiceObject.LexicalSortName);
 
     functions.clear();
-    functions.addAll(map['functions']);
+    for (ServiceFunction f in map['functions']) functions.add(f);
     functions.sort(ServiceObject.LexicalSortName);
 
     superclass = map['super'];
@@ -2711,7 +2720,7 @@
   throw new FallThroughError();
 }
 
-class Guarded<T> implements M.Guarded<T> {
+class Guarded<T extends ServiceObject> implements M.Guarded<T> {
   bool get isValue => asValue != null;
   bool get isSentinel => asSentinel != null;
   final Sentinel asSentinel;
@@ -2772,7 +2781,7 @@
   var nativeFields;
   Iterable<Guarded<HeapObject>> elements; // If a List.
   Iterable<MapAssociation> associations; // If a Map.
-  Iterable<dynamic> typedElements; // If a TypedData.
+  List<dynamic> typedElements; // If a TypedData.
   HeapObject referent; // If a MirrorReference.
   Instance key; // If a WeakProperty.
   Instance value; // If a WeakProperty.
@@ -2874,9 +2883,11 @@
     twoByteBytecode = map['_twoByteBytecode'];
 
     if (map['fields'] != null) {
-      fields = map['fields']
-          .map((f) => new BoundField(f['decl'], f['value']))
-          .toList();
+      var fields = new List<BoundField>();
+      for (var f in map['fields']) {
+        fields.add(new BoundField(f['decl'], f['value']));
+      }
+      this.fields = fields;
     } else {
       fields = null;
     }
@@ -2890,8 +2901,11 @@
       // Should be:
       // elements = map['elements'].map((e) => new Guarded<Instance>(e)).toList();
       // some times we obtain object that are not InstanceRef
-      elements =
-          map['elements'].map((e) => new Guarded<ServiceObject>(e)).toList();
+      var localElements = new List<Guarded<HeapObject>>();
+      for (var element in map['elements']) {
+        localElements.add(new Guarded<HeapObject>(element));
+      }
+      elements = localElements;
     } else {
       elements = null;
     }
@@ -3003,8 +3017,15 @@
       return;
     }
 
-    variables = (map['variables'] ?? const [])
-        .map((element) => new ContextElement(element));
+    if (map['variables'] == null) {
+      variables = <ContextElement>[];
+    } else {
+      var localVariables = new List<ContextElement>();
+      for (var element in map['variables']) {
+        localVariables.add(new ContextElement(element));
+      }
+      variables = localVariables;
+    }
 
     // We are fully loaded.
     _loaded = true;
@@ -4043,7 +4064,7 @@
     if (mapIsRef) {
       return;
     }
-    types = map['types'];
+    types = new List<Instance>.from(map['types']);
   }
 }
 
@@ -4566,7 +4587,11 @@
     this.function = map['function'];
     this.location = map['location'];
     this.code = map['code'];
-    this.variables = map['vars'] ?? [];
+    if (map['vars'] == null) {
+      this.variables = <ServiceMap>[];
+    } else {
+      this.variables = new List<ServiceMap>.from(map['vars']);
+    }
   }
 
   M.FrameKind _fromString(String frameKind) {
diff --git a/runtime/observatory/tests/service/allocations_test.dart b/runtime/observatory/tests/service/allocations_test.dart
index e36bc97..c6975dc 100644
--- a/runtime/observatory/tests/service/allocations_test.dart
+++ b/runtime/observatory/tests/service/allocations_test.dart
@@ -18,17 +18,17 @@
 }
 
 var tests = <IsolateTest>[
-  (Isolate isolate) => isolate.rootLibrary.load().then((Library lib) {
-        expect(lib.uri.endsWith('allocations_test.dart'), isTrue);
-        expect(lib.classes.length, equals(1));
-        return lib.classes.first.load().then((Class fooClass) {
-          expect(fooClass.name, equals('Foo'));
-          expect(
-              fooClass.newSpace.current.instances +
-                  fooClass.oldSpace.current.instances,
-              equals(3));
-        });
-      }),
+  (Isolate isolate) async {
+    Library lib = await isolate.rootLibrary.load();
+    expect(lib.uri.endsWith('allocations_test.dart'), isTrue);
+    expect(lib.classes.length, equals(1));
+    Class fooClass = await lib.classes.first.load();
+    expect(fooClass.name, equals('Foo'));
+    expect(
+        fooClass.newSpace.current.instances +
+            fooClass.oldSpace.current.instances,
+        equals(3));
+  },
 ];
 
 main(args) => runIsolateTests(args, tests, testeeBefore: script);
diff --git a/runtime/observatory/tests/service/async_scope_test.dart b/runtime/observatory/tests/service/async_scope_test.dart
index 0a2f816..faf02b4 100644
--- a/runtime/observatory/tests/service/async_scope_test.dart
+++ b/runtime/observatory/tests/service/async_scope_test.dart
@@ -3,14 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
+import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
-const int LINE_A = 19;
-const int LINE_B = 25;
+const int LINE_A = 20;
+const int LINE_B = 26;
 
 foo() {}
 
@@ -34,7 +35,7 @@
   });
 }
 
-checkAsyncVarDescriptors(Isolate isolate) async {
+Future checkAsyncVarDescriptors(Isolate isolate) async {
   ServiceMap stack = await isolate.getStack();
   expect(stack.type, equals('Stack'));
   expect(stack['frames'].length, greaterThanOrEqualTo(1));
@@ -43,7 +44,7 @@
   expect(vars, equals('param1 local1')); // no :async_op et al
 }
 
-checkAsyncStarVarDescriptors(Isolate isolate) async {
+Future checkAsyncStarVarDescriptors(Isolate isolate) async {
   ServiceMap stack = await isolate.getStack();
   expect(stack.type, equals('Stack'));
   expect(stack['frames'].length, greaterThanOrEqualTo(1));
diff --git a/runtime/observatory/tests/service/break_on_activation_test.dart b/runtime/observatory/tests/service/break_on_activation_test.dart
index 4cc8503..904ce63 100644
--- a/runtime/observatory/tests/service/break_on_activation_test.dart
+++ b/runtime/observatory/tests/service/break_on_activation_test.dart
@@ -49,7 +49,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load();
 
     var breaksHit = 0;
 
@@ -93,7 +93,7 @@
     await cancelFutureSubscription(subscriptionFuture);
   },
   (Isolate isolate) async {
-    var rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load();
 
     var breaksHit = 0;
 
@@ -137,7 +137,7 @@
     await cancelFutureSubscription(subscriptionFuture);
   },
   (Isolate isolate) async {
-    var rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load();
 
     var breaksHit = 0;
 
diff --git a/runtime/observatory/tests/service/break_on_function_test.dart b/runtime/observatory/tests/service/break_on_function_test.dart
index 3886aef..6367906 100644
--- a/runtime/observatory/tests/service/break_on_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_test.dart
@@ -32,7 +32,7 @@
 
 // Add breakpoint
   (Isolate isolate) async {
-    var rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load();
     var function =
         rootLib.functions.singleWhere((f) => f.name == 'testFunction');
 
diff --git a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
index 52e452c..5979085 100644
--- a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
@@ -33,7 +33,7 @@
 
 // Add breakpoints.
   (Isolate isolate) async {
-    var rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load();
     var script = rootLib.scripts[0];
 
     var bpt1 = await isolate.addBreakpoint(script, LINE_A);
diff --git a/runtime/observatory/tests/service/contexts_test.dart b/runtime/observatory/tests/service/contexts_test.dart
index 680d8a4..07ebb09 100644
--- a/runtime/observatory/tests/service/contexts_test.dart
+++ b/runtime/observatory/tests/service/contexts_test.dart
@@ -50,72 +50,61 @@
 }
 
 var tests = <IsolateTest>[
-  (Isolate isolate) => isolate.rootLibrary.load().then((Library lib) {
-        Field field = lib.variables.singleWhere((v) => v.name == 'cleanBlock');
-        return field.load().then((_) {
-          return field.staticValue.load().then((Instance block) {
-            expect(block.isClosure, isTrue);
-            expect(block.closureContext, isNull);
-          });
-        });
-      }),
-  (Isolate isolate) => isolate.rootLibrary.load().then((Library lib) {
-        Field field =
-            lib.variables.singleWhere((v) => v.name == 'copyingBlock');
-        return field.load().then((_) {
-          return field.staticValue.load().then((Instance block) {
-            expect(block.isClosure, isTrue);
-            expect(block.closureContext.isContext, isTrue);
-            expect(block.closureContext.length, equals(1));
-            return block.closureContext.load().then((Context ctxt) {
-              expect(ctxt.variables.single.value.asValue.isString, isTrue);
-              expect(ctxt.variables.single.value.asValue.valueAsString,
-                  equals('I could be copied into the block'));
-              expect(ctxt.parentContext, isNull);
-            });
-          });
-        });
-      }),
-  (Isolate isolate) => isolate.rootLibrary.load().then((Library lib) {
-        Field field = lib.variables.singleWhere((v) => v.name == 'fullBlock');
-        return field.load().then((_) {
-          return field.staticValue.load().then((Instance block) {
-            expect(block.isClosure, isTrue);
-            expect(block.closureContext.isContext, isTrue);
-            expect(block.closureContext.length, equals(1));
-            return block.closureContext.load().then((Context ctxt) {
-              expect(ctxt.variables.single.value.asValue.isInt, isTrue);
-              expect(ctxt.variables.single.value.asValue.valueAsString,
-                  equals('43'));
-              expect(ctxt.parentContext, isNull);
-            });
-          });
-        });
-      }),
-  (Isolate isolate) => isolate.rootLibrary.load().then((Library lib) {
-        Field field =
-            lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain');
-        return field.load().then((_) {
-          return field.staticValue.load().then((Instance block) {
-            expect(block.isClosure, isTrue);
-            expect(block.closureContext.isContext, isTrue);
-            expect(block.closureContext.length, equals(1));
-            return block.closureContext.load().then((Context ctxt) {
-              expect(ctxt.variables.single.value.asValue.isInt, isTrue);
-              expect(ctxt.variables.single.value.asValue.valueAsString,
-                  equals('4201'));
-              expect(ctxt.parentContext.isContext, isTrue);
-              expect(ctxt.parentContext.length, equals(1));
-              return ctxt.parentContext.load().then((Context outerCtxt) {
-                expect(outerCtxt.variables.single.value.asValue.isInt, isTrue);
-                expect(outerCtxt.variables.single.value.asValue.valueAsString,
-                    equals('421'));
-                expect(outerCtxt.parentContext, isNull);
-              });
-            });
-          });
-        });
-      }),
+  (Isolate isolate) async {
+    Library lib = await isolate.rootLibrary.load();
+    Field field = lib.variables.singleWhere((v) => v.name == 'cleanBlock');
+    await field.load();
+    Instance block = await field.staticValue.load();
+    expect(block.isClosure, isTrue);
+    expect(block.closureContext, isNull);
+  },
+  (Isolate isolate) async {
+    Library lib = await isolate.rootLibrary.load();
+    Field field = lib.variables.singleWhere((v) => v.name == 'copyingBlock');
+    await field.load();
+    Instance block = await field.staticValue.load();
+    expect(block.isClosure, isTrue);
+    expect(block.closureContext.isContext, isTrue);
+    expect(block.closureContext.length, equals(1));
+    Context ctxt = await block.closureContext.load();
+    expect(ctxt.variables.single.value.asValue.isString, isTrue);
+    expect(ctxt.variables.single.value.asValue.valueAsString,
+        equals('I could be copied into the block'));
+    expect(ctxt.parentContext, isNull);
+  },
+  (Isolate isolate) async {
+    Library lib = await isolate.rootLibrary.load();
+    Field field = lib.variables.singleWhere((v) => v.name == 'fullBlock');
+    await field.load();
+    Instance block = await field.staticValue.load();
+    expect(block.isClosure, isTrue);
+    expect(block.closureContext.isContext, isTrue);
+    expect(block.closureContext.length, equals(1));
+    Context ctxt = await block.closureContext.load();
+    expect(ctxt.variables.single.value.asValue.isInt, isTrue);
+    expect(ctxt.variables.single.value.asValue.valueAsString, equals('43'));
+    expect(ctxt.parentContext, isNull);
+  },
+  (Isolate isolate) async {
+    Library lib = await isolate.rootLibrary.load();
+    Field field =
+        lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain');
+    await field.load();
+    Instance block = await field.staticValue.load();
+    expect(block.isClosure, isTrue);
+    expect(block.closureContext.isContext, isTrue);
+    expect(block.closureContext.length, equals(1));
+    Context ctxt = await block.closureContext.load();
+    expect(ctxt.variables.single.value.asValue.isInt, isTrue);
+    expect(ctxt.variables.single.value.asValue.valueAsString, equals('4201'));
+    expect(ctxt.parentContext.isContext, isTrue);
+    expect(ctxt.parentContext.length, equals(1));
+    Context outerCtxt = await ctxt.parentContext.load();
+    expect(outerCtxt.variables.single.value.asValue.isInt, isTrue);
+    expect(
+        outerCtxt.variables.single.value.asValue.valueAsString, equals('421'));
+    expect(outerCtxt.parentContext, isNull);
+  },
 ];
 
 main(args) => runIsolateTests(args, tests, testeeBefore: script);
diff --git a/runtime/observatory/tests/service/dominator_tree_user_test.dart b/runtime/observatory/tests/service/dominator_tree_user_test.dart
index b0a4f35..186b983 100644
--- a/runtime/observatory/tests/service/dominator_tree_user_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_user_test.dart
@@ -113,7 +113,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    final rootLib = await isolate.rootLibrary.load();
+    final Library rootLib = await isolate.rootLibrary.load();
     final raw =
         await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.user, false).last;
     final snapshot = new HeapSnapshot();
diff --git a/runtime/observatory/tests/service/dominator_tree_vm_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
index 1c59f2a..0ea9ad5 100644
--- a/runtime/observatory/tests/service/dominator_tree_vm_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
@@ -113,7 +113,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    final rootLib = await isolate.rootLibrary.load();
+    final Library rootLib = await isolate.rootLibrary.load();
     final raw =
         await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.vm, false).last;
     final snapshot = new HeapSnapshot();
diff --git a/runtime/observatory/tests/service/eval_test.dart b/runtime/observatory/tests/service/eval_test.dart
index 77e48b2..7753d04 100644
--- a/runtime/observatory/tests/service/eval_test.dart
+++ b/runtime/observatory/tests/service/eval_test.dart
@@ -33,42 +33,39 @@
   hasStoppedAtBreakpoint,
 
 // Evaluate against library, class, and instance.
-  (Isolate isolate) {
-    return isolate.getStack().then((ServiceMap stack) {
-      // Make sure we are in the right place.
-      expect(stack.type, equals('Stack'));
-      expect(stack['frames'].length, greaterThanOrEqualTo(2));
-      expect(stack['frames'][0].function.name, equals('method'));
-      expect(stack['frames'][0].function.dartOwner.name, equals('MyClass'));
+  (Isolate isolate) async {
+    ServiceMap stack = await isolate.getStack();
 
-      var lib = isolate.rootLibrary;
-      var cls = stack['frames'][0].function.dartOwner;
-      var instance = stack['frames'][0].variables[0]['value'];
+    // Make sure we are in the right place.
+    expect(stack.type, equals('Stack'));
+    expect(stack['frames'].length, greaterThanOrEqualTo(2));
+    expect(stack['frames'][0].function.name, equals('method'));
+    expect(stack['frames'][0].function.dartOwner.name, equals('MyClass'));
 
-      List evals = [];
-      evals.add(lib.evaluate('globalVar + 5').then((result) {
-        print(result);
-        expect(result.valueAsString, equals('105'));
-      }));
-      evals.add(lib.evaluate('globalVar + staticVar + 5').then((result) {
-        expect(result.type, equals('Error'));
-      }));
-      evals.add(cls.evaluate('globalVar + staticVar + 5').then((result) {
-        print(result);
-        expect(result.valueAsString, equals('1105'));
-      }));
-      evals.add(cls.evaluate('this + 5').then((result) {
-        expect(result.type, equals('Error'));
-      }));
-      evals.add(instance.evaluate('this + 5').then((result) {
-        print(result);
-        expect(result.valueAsString, equals('10005'));
-      }));
-      evals.add(instance.evaluate('this + frog').then((result) {
-        expect(result.type, equals('Error'));
-      }));
-      return Future.wait(evals);
-    });
+    var lib = isolate.rootLibrary;
+    var cls = stack['frames'][0].function.dartOwner;
+    var instance = stack['frames'][0].variables[0]['value'];
+
+    dynamic result = await lib.evaluate('globalVar + 5');
+    print(result);
+    expect(result.valueAsString, equals('105'));
+
+    result = await lib.evaluate('globalVar + staticVar + 5');
+    expect(result.type, equals('Error'));
+
+    result = await cls.evaluate('globalVar + staticVar + 5');
+    print(result);
+    expect(result.valueAsString, equals('1105'));
+
+    result = await cls.evaluate('this + 5');
+    expect(result.type, equals('Error'));
+
+    result = await instance.evaluate('this + 5');
+    print(result);
+    expect(result.valueAsString, equals('10005'));
+
+    result = await instance.evaluate('this + frog');
+    expect(result.type, equals('Error'));
   },
 ];
 
diff --git a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
index 3b8c7ce..4c7e9b0 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
@@ -35,14 +35,14 @@
     expect(stack['frames'].length, greaterThanOrEqualTo(1));
     expect(stack['frames'][0].function.name, equals('foo'));
 
-    var lib = await isolate.rootLibrary.load();
-    var thing1 =
-        (await lib.variables.singleWhere((v) => v.name == "thing1").load())
-            .staticValue;
+    Library lib = await isolate.rootLibrary.load();
+    Field thing1Field =
+        await lib.variables.singleWhere((v) => v.name == "thing1").load();
+    var thing1 = thing1Field.staticValue;
     print(thing1);
-    var thing2 =
-        (await lib.variables.singleWhere((v) => v.name == "thing2").load())
-            .staticValue;
+    Field thing2Field =
+        await lib.variables.singleWhere((v) => v.name == "thing2").load();
+    var thing2 = thing2Field.staticValue;
     print(thing2);
 
     var result = await isolate
diff --git a/runtime/observatory/tests/service/evaluate_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
index 702cb66..c2d8aff 100644
--- a/runtime/observatory/tests/service/evaluate_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
@@ -17,14 +17,14 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var lib = await isolate.rootLibrary.load();
-    var thing1 =
-        (await lib.variables.singleWhere((v) => v.name == "thing1").load())
-            .staticValue;
+    Library lib = await isolate.rootLibrary.load();
+    Field thing1Field =
+        await lib.variables.singleWhere((v) => v.name == "thing1").load();
+    var thing1 = thing1Field.staticValue;
     print(thing1);
-    var thing2 =
-        (await lib.variables.singleWhere((v) => v.name == "thing2").load())
-            .staticValue;
+    Field thing2Field =
+        await lib.variables.singleWhere((v) => v.name == "thing2").load();
+    var thing2 = thing2Field.staticValue;
     print(thing2);
 
     var result = await lib.evaluate("x + y", scope: {"x": thing1, "y": thing2});
diff --git a/runtime/observatory/tests/service/get_allocation_samples_test.dart b/runtime/observatory/tests/service/get_allocation_samples_test.dart
index 26da1e1..62522a4 100644
--- a/runtime/observatory/tests/service/get_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_samples_test.dart
@@ -55,7 +55,7 @@
     var fooClass = await getClassFromRootLib(isolate, 'Foo');
     await fooClass.reload();
     expect(fooClass.traceAllocations, isTrue);
-    var profileResponse = await fooClass.getAllocationSamples();
+    dynamic profileResponse = await fooClass.getAllocationSamples();
     expect(profileResponse, isNotNull);
     expect(profileResponse['type'], equals('_CpuProfile'));
     await fooClass.setTraceAllocations(false);
diff --git a/runtime/observatory/tests/service/get_ports_rpc_test.dart b/runtime/observatory/tests/service/get_ports_rpc_test.dart
index 36685b8..ca8eff5 100644
--- a/runtime/observatory/tests/service/get_ports_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_ports_rpc_test.dart
@@ -39,7 +39,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var result = await isolate.invokeRpc('_getPorts', {});
+    dynamic result = await isolate.invokeRpc('_getPorts', {});
     expect(result['type'], equals('_Ports'));
     expect(result['ports'], isList);
     var ports = result['ports'];
diff --git a/runtime/observatory/tests/service/get_stack_rpc_test.dart b/runtime/observatory/tests/service/get_stack_rpc_test.dart
index 297b219..5efdb1b 100644
--- a/runtime/observatory/tests/service/get_stack_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_stack_rpc_test.dart
@@ -85,7 +85,7 @@
     expect(msgHandlerObjectId, isNotNull);
 
     // Get object.
-    var object = await isolate.getObject(msgHandlerObjectId);
+    Instance object = await isolate.getObject(msgHandlerObjectId);
     expect(object.valueAsString, equals('34'));
   }
 ];
diff --git a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
index 8ffb61b..58c4596 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -27,11 +27,11 @@
   Timeline.finishSync();
 }
 
-List<Map> filterForDartEvents(List<Map> events) {
+List filterForDartEvents(List events) {
   return events.where((event) => event['cat'] == 'Dart').toList();
 }
 
-bool eventsContains(List<Map> events, String phase, String name) {
+bool eventsContains(List events, String phase, String name) {
   for (Map event in events) {
     if ((event['ph'] == phase) && (event['name'] == name)) {
       return true;
@@ -40,7 +40,7 @@
   return false;
 }
 
-int timeOrigin(List<Map> events) {
+int timeOrigin(List events) {
   if (events.length == 0) {
     return 0;
   }
@@ -54,7 +54,7 @@
   return smallest;
 }
 
-int timeDuration(List<Map> events, int timeOrigin) {
+int timeDuration(List events, int timeOrigin) {
   if (events.length == 0) {
     return 0;
   }
@@ -69,7 +69,7 @@
   return biggestDuration;
 }
 
-void allEventsHaveIsolateNumber(List<Map> events) {
+void allEventsHaveIsolateNumber(List events) {
   for (Map event in events) {
     if (event['ph'] == 'M') {
       // Skip meta-data events.
@@ -99,7 +99,7 @@
     expect(result['type'], equals('_Timeline'));
     expect(result['traceEvents'], new isInstanceOf<List>());
     final int numEvents = result['traceEvents'].length;
-    List<Map> dartEvents = filterForDartEvents(result['traceEvents']);
+    List dartEvents = filterForDartEvents(result['traceEvents']);
     expect(dartEvents.length, equals(11));
     allEventsHaveIsolateNumber(dartEvents);
     allEventsHaveIsolateNumber(result['traceEvents']);
@@ -121,7 +121,7 @@
     // Verify that we received fewer events than before.
     expect(result['traceEvents'].length, lessThan(numEvents));
     // Verify that we have the same number of Dart events.
-    List<Map> dartEvents2 = filterForDartEvents(result['traceEvents']);
+    List dartEvents2 = filterForDartEvents(result['traceEvents']);
     expect(dartEvents2.length, dartEvents.length);
   },
 ];
diff --git a/runtime/observatory/tests/service/implicit_getter_setter_test.dart b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
index f3b8d8c..25423e3 100644
--- a/runtime/observatory/tests/service/implicit_getter_setter_test.dart
+++ b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
@@ -4,6 +4,7 @@
 
 library implicit_getter_setter_test;
 
+import 'dart:async';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
@@ -18,7 +19,7 @@
   }
 }
 
-testGetter(Isolate isolate) async {
+Future testGetter(Isolate isolate) async {
   Library rootLibrary = await isolate.rootLibrary.load();
   expect(rootLibrary.classes.length, equals(1));
   Class classA = await rootLibrary.classes[0].load();
@@ -40,7 +41,7 @@
   expect(classDouble.name, equals('_Double'));
 }
 
-testSetter(Isolate isolate) async {
+Future testSetter(Isolate isolate) async {
   Library rootLibrary = await isolate.rootLibrary.load();
   expect(rootLibrary.classes.length, equals(1));
   Class classA = await rootLibrary.classes[0].load();
diff --git a/runtime/observatory/tests/service/inbound_references_test.dart b/runtime/observatory/tests/service/inbound_references_test.dart
index 2df380f..af310c0 100644
--- a/runtime/observatory/tests/service/inbound_references_test.dart
+++ b/runtime/observatory/tests/service/inbound_references_test.dart
@@ -28,8 +28,8 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var lib = await isolate.rootLibrary.load();
-    var field = lib.variables.where((v) => v.name == 'e').single;
+    Library lib = await isolate.rootLibrary.load();
+    Field field = lib.variables.where((v) => v.name == 'e').single;
     await field.load();
     Instance e = field.staticValue;
     ServiceMap response = await isolate.getInboundReferences(e, 100);
diff --git a/runtime/observatory/tests/service/library_dependency_test.dart b/runtime/observatory/tests/service/library_dependency_test.dart
index 1998ef1..2e5d2fa 100644
--- a/runtime/observatory/tests/service/library_dependency_test.dart
+++ b/runtime/observatory/tests/service/library_dependency_test.dart
@@ -13,7 +13,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load();
     // Use mirrors to shutup the analyzer.
     mirrors.currentMirrorSystem();
     importOf(String uri) {
diff --git a/runtime/observatory/tests/service/mirror_references_test.dart b/runtime/observatory/tests/service/mirror_references_test.dart
index 9b9b155..a7fc685 100644
--- a/runtime/observatory/tests/service/mirror_references_test.dart
+++ b/runtime/observatory/tests/service/mirror_references_test.dart
@@ -27,7 +27,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load();
     Field fooField = lib.variables.singleWhere((v) => v.name == 'foo');
     await fooField.load();
     Instance foo = fooField.staticValue;
@@ -38,7 +38,7 @@
     expect(foo.isMirrorReference, isFalse);
     expect(ref.isMirrorReference, isTrue);
     expect(ref.referent, isNull);
-    var loadedRef = await ref.load();
+    Instance loadedRef = await ref.load();
     expect(loadedRef.referent, isNotNull);
     expect(loadedRef.referent.name, equals('Foo'));
     expect(loadedRef.referent, equals(foo.clazz));
diff --git a/runtime/observatory/tests/service/next_through_implicit_call_test.dart b/runtime/observatory/tests/service/next_through_implicit_call_test.dart
new file mode 100644
index 0000000..35762fa
--- /dev/null
+++ b/runtime/observatory/tests/service/next_through_implicit_call_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 18;
+const String file = "next_through_implicit_call_test.dart";
+
+int _fooCallNumber = 0;
+foo() {
+  ++_fooCallNumber;
+  print("Foo call #$_fooCallNumber!");
+}
+
+code() {
+  foo();
+  (foo)();
+  var a = [foo];
+  a[0]();
+  (a[0])();
+  var b = [
+    [foo, foo]
+  ];
+  b[0][1]();
+  (b[0][1])();
+}
+
+List<String> stops = [];
+List<String> expected = [
+  "$file:${LINE+0}:3", // on 'foo'
+  "$file:${LINE+1}:8", // on '(' (in '()')
+  "$file:${LINE+2}:11", // on '['
+  "$file:${LINE+3}:4", // on '['
+  "$file:${LINE+3}:7", // on '('
+  "$file:${LINE+4}:5", // on '['
+  "$file:${LINE+4}:9", // on '(' (in '()')
+  "$file:${LINE+6}:5", // on '[' (inner one)
+  "$file:${LINE+5}:11", // on '[' (outer one)
+  "$file:${LINE+8}:4", // on first '['
+  "$file:${LINE+8}:7", // on second '['
+  "$file:${LINE+8}:10", // on '('
+  "$file:${LINE+9}:5", // on first '['
+  "$file:${LINE+9}:8", // on second '['
+  "$file:${LINE+9}:12", // on '(' (in '()')
+  "$file:${LINE+10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtLine(LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/object_graph_stack_reference_test.dart b/runtime/observatory/tests/service/object_graph_stack_reference_test.dart
index 44828c9..aaf24eb 100644
--- a/runtime/observatory/tests/service/object_graph_stack_reference_test.dart
+++ b/runtime/observatory/tests/service/object_graph_stack_reference_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
+import 'dart:async';
 import 'dart:developer';
 
 import 'test_helper.dart';
@@ -23,7 +24,7 @@
   print(stackSlot); // Prevent optimizing away the stack slot.
 }
 
-checkForStackReferent(Isolate isolate) async {
+Future checkForStackReferent(Isolate isolate) async {
   Library corelib =
       isolate.libraries.singleWhere((lib) => lib.uri == 'dart:core');
   await corelib.load();
diff --git a/runtime/observatory/tests/service/pause_on_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
index 34bc53b..5089a99 100644
--- a/runtime/observatory/tests/service/pause_on_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
@@ -26,7 +26,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var lib = await isolate.rootLibrary.reload();
+    Library lib = await isolate.rootLibrary.reload();
 
     var onPaused = null;
     var onResume = null;
@@ -75,7 +75,7 @@
         await t.future;
       }
 
-      var res = await fres;
+      dynamic res = await fres;
       print(res);
       if (shouldBeCaught) {
         expect(res.isInstance, isTrue);
diff --git a/runtime/observatory/tests/service/process_service_test.dart b/runtime/observatory/tests/service/process_service_test.dart
index 233e4b0..8a22291 100644
--- a/runtime/observatory/tests/service/process_service_test.dart
+++ b/runtime/observatory/tests/service/process_service_test.dart
@@ -64,12 +64,12 @@
     return new Future.value(new ServiceExtensionResponse.result(result));
   }
 
-  Future<ServiceExtensionResponse> closeStdin(ignored_a, ignored_b) async {
+  Future<ServiceExtensionResponse> closeStdin(ignored_a, ignored_b) {
     process3.stdin.close();
-    var result = JSON.encode({'type': 'foobar'});
-    var returnValue =
-        new Future.value(new ServiceExtensionResponse.result(result));
-    return process3.exitCode.then((int exit) => returnValue);
+    return process3.exitCode.then<ServiceExtensionResponse>((int exit) {
+      var result = JSON.encode({'type': 'foobar'});
+      return new ServiceExtensionResponse.result(result);
+    });
   }
 
   registerExtension('ext.dart.io.cleanup', cleanup);
diff --git a/runtime/observatory/tests/service/reachable_size_test.dart b/runtime/observatory/tests/service/reachable_size_test.dart
index b53a1fb..67c3bf7 100644
--- a/runtime/observatory/tests/service/reachable_size_test.dart
+++ b/runtime/observatory/tests/service/reachable_size_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
+import 'dart:async';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
@@ -27,16 +28,14 @@
   p1.y = p2.y = new List();
 }
 
-getReachableSize(ServiceObject obj) {
-  return obj.isolate.getReachableSize(obj).then((Instance obj) {
-    return int.parse(obj.valueAsString);
-  });
+Future<int> getReachableSize(ServiceObject obj) async {
+  Instance size = await obj.isolate.getReachableSize(obj);
+  return int.parse(size.valueAsString);
 }
 
-getRetainedSize(ServiceObject obj) {
-  return obj.isolate.getRetainedSize(obj).then((Instance obj) {
-    return int.parse(obj.valueAsString);
-  });
+Future<int> getRetainedSize(ServiceObject obj) async {
+  Instance size = await obj.isolate.getRetainedSize(obj);
+  return int.parse(size.valueAsString);
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/rewind_optimized_out_test.dart b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
index d41a09d..b2b8e74 100644
--- a/runtime/observatory/tests/service/rewind_optimized_out_test.dart
+++ b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
@@ -53,7 +53,7 @@
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // We are at our breakpoint with global=100.
-    var result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global');
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
diff --git a/runtime/observatory/tests/service/rewind_test.dart b/runtime/observatory/tests/service/rewind_test.dart
index 812febd..7f0d590 100644
--- a/runtime/observatory/tests/service/rewind_test.dart
+++ b/runtime/observatory/tests/service/rewind_test.dart
@@ -79,14 +79,14 @@
   },
   (Isolate isolate) async {
     // We are at our breakpoint with global=100.
-    var result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global');
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
 
     // Rewind the top stack frame.
-    result = await isolate.rewind(1);
-    expect(result['type'], equals('Success'));
+    var result2 = await isolate.rewind(1);
+    expect(result2['type'], equals('Success'));
   },
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_B),
@@ -98,52 +98,52 @@
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // global still is equal to 100.  We did not execute "global++".
-    var result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global');
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
 
     // Resume again, for fun.
-    result = await isolate.resume();
-    expect(result['type'], equals('Success'));
+    var result2 = await isolate.resume();
+    expect(result2['type'], equals('Success'));
   },
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // global is now 101.
-    var result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global');
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('101'));
 
     // Rewind up to 'test'/
-    result = await isolate.rewind(3);
-    expect(result['type'], equals('Success'));
+    var result2 = await isolate.rewind(3);
+    expect(result2['type'], equals('Success'));
   },
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_D),
   (Isolate isolate) async {
     // Reset global to 0 and start again.
-    var result = await isolate.rootLibrary.evaluate('global=0');
+    Instance result = await isolate.rootLibrary.evaluate('global=0');
     print('set global to $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('0'));
 
-    result = await isolate.resume();
-    expect(result['type'], equals('Success'));
+    var result2 = await isolate.resume();
+    expect(result2['type'], equals('Success'));
   },
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // We are at our breakpoint with global=100.
-    var result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global');
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
 
     // Rewind the top 2 stack frames.
-    result = await isolate.rewind(2);
-    expect(result['type'], equals('Success'));
+    var result2 = await isolate.rewind(2);
+    expect(result2['type'], equals('Success'));
   },
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_C),
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 48773d6..b7b125ce 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -23,6 +23,7 @@
 next_through_closure_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 next_through_create_list_and_map_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 next_through_for_each_loop_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
+next_through_implicit_call_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 pause_on_unhandled_async_exceptions2_test: Pass, RuntimeError, Timeout, Crash # Issue 29178
 set_name_rpc_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.
@@ -66,6 +67,7 @@
 # batch mode.
 [ $arch == simdbc64 && $compiler == dartk ]
 coverage_optimized_function_test: Crash # Please triage
+get_cpu_profile_timeline_rpc_test: Pass, RuntimeError # http://dartbug.com/31794
 
 [ $arch == simdbc64 && $compiler == dartk && $mode == debug ]
 eval_test: Pass, Slow
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 6bcca69..903a5a5 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -45,165 +45,81 @@
 # Issue 31587
 [ $compiler == dartk && $strong ]
 add_breakpoint_rpc_kernel_test: CompileTimeError
-allocations_test: CompileTimeError
-async_next_test: CompileTimeError
-async_scope_test: CompileTimeError
-async_single_step_exception_test: CompileTimeError
-async_single_step_into_test: CompileTimeError
-async_single_step_out_test: CompileTimeError
-async_star_single_step_into_test: CompileTimeError
-async_star_step_out_test: CompileTimeError
-async_step_out_test: CompileTimeError
-auth_token1_test: CompileTimeError
-auth_token_test: CompileTimeError
-awaiter_async_stack_contents_test: CompileTimeError
+async_next_test: RuntimeError
+async_scope_test: RuntimeError
+async_single_step_exception_test: RuntimeError
+async_single_step_into_test: RuntimeError
+awaiter_async_stack_contents_test: RuntimeError
 bad_web_socket_address_test: CompileTimeError
-break_on_activation_test: CompileTimeError
-break_on_function_test: CompileTimeError
-breakpoint_in_parts_class_test: CompileTimeError
+break_on_function_test: RuntimeError
+breakpoint_in_parts_class_test: RuntimeError
 breakpoint_two_args_checked_test: CompileTimeError
-caching_test: CompileTimeError
-causal_async_stack_contents_test: CompileTimeError
-causal_async_stack_presence_test: CompileTimeError
-causal_async_star_stack_contents_test: CompileTimeError
-causal_async_star_stack_presence_test: CompileTimeError
-code_test: CompileTimeError
-collect_all_garbage_test: CompileTimeError
+caching_test: RuntimeError
+causal_async_stack_contents_test: RuntimeError
+causal_async_stack_presence_test: RuntimeError
+causal_async_star_stack_contents_test: RuntimeError
+causal_async_star_stack_presence_test: RuntimeError
+code_test: RuntimeError
 command_test: CompileTimeError
-contexts_test: CompileTimeError
-coverage_leaf_function_test: CompileTimeError
-coverage_optimized_function_test: CompileTimeError
-crash_dump_test: CompileTimeError
-debugger_inspect_test: CompileTimeError
-debugger_location_second_test: CompileTimeError
-debugger_location_test: CompileTimeError
-debugging_inlined_finally_test: CompileTimeError
-debugging_test: CompileTimeError
-dev_fs_http_put_test: CompileTimeError
-dev_fs_http_put_weird_char_test: CompileTimeError
-dev_fs_spawn_test: CompileTimeError
-dev_fs_test: CompileTimeError
-dev_fs_uri_test: CompileTimeError
-dev_fs_weird_char_test: CompileTimeError
-developer_server_control_test: CompileTimeError
-developer_service_get_isolate_id_test: CompileTimeError
-dominator_tree_user_test: CompileTimeError
-dominator_tree_vm_test: CompileTimeError
-echo_test: CompileTimeError
-eval_test: CompileTimeError
+debugger_location_second_test: RuntimeError
+debugger_location_test: RuntimeError
+debugging_inlined_finally_test: RuntimeError
+debugging_test: RuntimeError
+dev_fs_spawn_test: RuntimeError
+developer_service_get_isolate_id_test: RuntimeError
 external_service_asynchronous_invocation_test: CompileTimeError
 external_service_disappear_test: CompileTimeError
 external_service_notification_invocation_test: CompileTimeError
 external_service_registration_test: CompileTimeError
 external_service_registration_via_notification_test: CompileTimeError
 external_service_synchronous_invocation_test: CompileTimeError
-field_script_test: CompileTimeError
-file_service_test: CompileTimeError
-gc_test: CompileTimeError
-get_allocation_profile_rpc_test: CompileTimeError
-get_allocation_samples_test: CompileTimeError
-get_cpu_profile_timeline_rpc_test: CompileTimeError
-get_flag_list_rpc_test: CompileTimeError
-get_heap_map_rpc_test: CompileTimeError
-get_instances_rpc_test: CompileTimeError
-get_isolate_after_async_error_test: CompileTimeError
-get_isolate_after_stack_overflow_error_test: CompileTimeError
-get_isolate_after_sync_error_test: CompileTimeError
-get_isolate_rpc_test: CompileTimeError
-get_object_rpc_test: CompileTimeError
-get_object_store_rpc_test: CompileTimeError
-get_ports_rpc_test: CompileTimeError
-get_retained_size_rpc_test: CompileTimeError
-get_retaining_path_rpc_test: CompileTimeError
-get_source_report_test: CompileTimeError
-get_stack_rpc_test: CompileTimeError
-get_user_level_retaining_path_rpc_test: CompileTimeError
-get_version_rpc_test: CompileTimeError
-get_vm_rpc_test: CompileTimeError
-get_vm_timeline_rpc_test: CompileTimeError
-get_zone_memory_info_rpc_test: CompileTimeError
-implicit_getter_setter_test: CompileTimeError
-inbound_references_test: CompileTimeError
-instance_field_order_rpc_test: CompileTimeError
-isolate_lifecycle_test: CompileTimeError
+get_object_rpc_test: RuntimeError
+get_object_store_rpc_test: RuntimeError
+get_stack_rpc_test: RuntimeError
 issue_25465_test: CompileTimeError
-issue_27238_test: CompileTimeError
-issue_27287_test: CompileTimeError
-issue_30555_test: CompileTimeError
-local_variable_declaration_test: CompileTimeError
-logging_test: CompileTimeError
-malformed_test: CompileTimeError
-metrics_test: CompileTimeError
-mirror_references_test: CompileTimeError
-mixin_break_test: CompileTimeError
-native_metrics_test: CompileTimeError
-next_through_assign_call_test: CompileTimeError
-next_through_assign_int_test: CompileTimeError
-next_through_call_on_field_in_class_test: CompileTimeError
-next_through_call_on_field_test: CompileTimeError
-next_through_call_on_static_field_in_class_test: CompileTimeError
-next_through_catch_test: CompileTimeError
-next_through_closure_test: CompileTimeError
-next_through_create_list_and_map_test: CompileTimeError
-next_through_for_each_loop_test: CompileTimeError
-next_through_for_loop_with_break_and_continue_test: CompileTimeError
-next_through_function_expression_test: CompileTimeError
-next_through_is_and_as_test: CompileTimeError
-next_through_multi_catch_test: CompileTimeError
-next_through_new_test: CompileTimeError
-next_through_operator_bracket_on_super_test: CompileTimeError
-next_through_operator_bracket_on_this_test: CompileTimeError
-next_through_operator_bracket_test: CompileTimeError
-next_through_simple_async_with_returns_test: CompileTimeError
-next_through_simple_linear_2_test: CompileTimeError
-next_through_simple_linear_test: CompileTimeError
-object_graph_stack_reference_test: CompileTimeError
-object_graph_user_test: CompileTimeError
-object_graph_vm_test: CompileTimeError
-observatory_assets_test: CompileTimeError
-parameters_in_scope_at_entry_test: CompileTimeError
-pause_idle_isolate_test: CompileTimeError
-pause_on_exceptions_test: CompileTimeError
-pause_on_start_and_exit_test: CompileTimeError
-pause_on_start_then_step_test: CompileTimeError
-pause_on_unhandled_async_exceptions2_test: CompileTimeError
-pause_on_unhandled_async_exceptions_test: CompileTimeError
-pause_on_unhandled_exceptions_test: CompileTimeError
-positive_token_pos_test: CompileTimeError
-process_service_test: CompileTimeError
-reachable_size_test: CompileTimeError
-regexp_function_test: CompileTimeError
-regress_28443_test: CompileTimeError
-regress_28980_test: CompileTimeError
-reload_sources_test: CompileTimeError
-rewind_optimized_out_test: CompileTimeError
-rewind_test: CompileTimeError
-set_library_debuggable_rpc_test: CompileTimeError
-set_library_debuggable_test: CompileTimeError
-set_name_rpc_test: CompileTimeError
-set_vm_name_rpc_test: CompileTimeError
-steal_breakpoint_test: CompileTimeError
-step_into_async_no_await_test: CompileTimeError
-step_over_await_test: CompileTimeError
-step_test: CompileTimeError
-step_through_arithmetic_test: CompileTimeError
-step_through_constructor_calls_test: CompileTimeError
-step_through_function_2_test: CompileTimeError
-step_through_function_test: CompileTimeError
-step_through_getter_test: CompileTimeError
-step_through_property_get_test: CompileTimeError
-step_through_property_set_test: CompileTimeError
-step_through_setter_test: CompileTimeError
-step_through_switch_test: CompileTimeError
-step_through_switch_with_continue_test: CompileTimeError
-string_escaping_test: CompileTimeError
-tcp_socket_closing_service_test: CompileTimeError
-tcp_socket_service_test: CompileTimeError
-type_arguments_test: CompileTimeError
-typed_data_test: CompileTimeError
-udp_socket_service_test: CompileTimeError
-vm_test: CompileTimeError
-vm_timeline_events_test: CompileTimeError
-vm_timeline_flags_test: CompileTimeError
-weak_properties_test: CompileTimeError
-
+issue_27238_test: RuntimeError
+issue_27287_test: RuntimeError
+local_variable_declaration_test: RuntimeError
+mixin_break_test: RuntimeError
+next_through_assign_call_test: RuntimeError
+next_through_assign_int_test: RuntimeError
+next_through_call_on_field_in_class_test: RuntimeError
+next_through_call_on_field_test: RuntimeError
+next_through_call_on_static_field_in_class_test: RuntimeError
+next_through_catch_test: RuntimeError
+next_through_closure_test: RuntimeError
+next_through_create_list_and_map_test: RuntimeError
+next_through_for_each_loop_test: RuntimeError
+next_through_for_loop_with_break_and_continue_test: RuntimeError
+next_through_function_expression_test: RuntimeError
+next_through_implicit_call_test: RuntimeError
+next_through_is_and_as_test: RuntimeError
+next_through_multi_catch_test: RuntimeError
+next_through_new_test: RuntimeError
+next_through_operator_bracket_on_super_test: RuntimeError
+next_through_operator_bracket_on_this_test: RuntimeError
+next_through_operator_bracket_test: RuntimeError
+next_through_simple_async_with_returns_test: RuntimeError
+next_through_simple_linear_2_test: RuntimeError
+next_through_simple_linear_test: RuntimeError
+parameters_in_scope_at_entry_test: RuntimeError
+positive_token_pos_test: RuntimeError
+regress_28443_test: RuntimeError
+regress_28980_test: RuntimeError
+rewind_optimized_out_test: RuntimeError
+rewind_test: RuntimeError
+set_library_debuggable_test: RuntimeError
+steal_breakpoint_test: RuntimeError
+step_into_async_no_await_test: RuntimeError
+step_over_await_test: RuntimeError
+step_through_arithmetic_test: RuntimeError
+step_through_constructor_calls_test: RuntimeError
+step_through_constructor_test: RuntimeError
+step_through_function_2_test: RuntimeError
+step_through_function_test: RuntimeError
+step_through_getter_test: RuntimeError
+step_through_property_get_test: RuntimeError
+step_through_property_set_test: RuntimeError
+step_through_setter_test: RuntimeError
+step_through_switch_test: RuntimeError
+step_through_switch_with_continue_test: RuntimeError
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 4a739e5..254ee14 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -269,7 +269,7 @@
     ServiceMap stack = await isolate.getStack();
     expect(stack.type, equals('Stack'));
 
-    List<Frame> frames = stack['frames'];
+    List/*<Frame>*/ frames = stack['frames'];
     expect(frames.length, greaterThanOrEqualTo(1));
 
     Frame top = frames[0];
@@ -297,7 +297,7 @@
     ServiceMap stack = await isolate.getStack();
     expect(stack.type, equals('Stack'));
 
-    List<Frame> frames = stack['frames'];
+    List/*<Frame>*/ frames = stack['frames'];
     expect(frames.length, greaterThanOrEqualTo(1));
 
     Frame topFrame = stack['frames'][0];
@@ -387,8 +387,7 @@
 
 Future<Class> getClassFromRootLib(Isolate isolate, String className) async {
   Library rootLib = await isolate.rootLibrary.load();
-  for (var i = 0; i < rootLib.classes.length; i++) {
-    Class cls = rootLib.classes[i];
+  for (Class cls in rootLib.classes) {
     if (cls.name == className) {
       return cls;
     }
@@ -445,7 +444,7 @@
         // We are paused: Resume after recording.
         ServiceMap stack = await isolate.getStack();
         expect(stack.type, equals('Stack'));
-        List<Frame> frames = stack['frames'];
+        List/*<Frame>*/ frames = stack['frames'];
         expect(frames.length, greaterThanOrEqualTo(2));
         Frame frame = frames[0];
         String brokeAt = await frame.location.toUserString();
diff --git a/runtime/observatory/tests/service/type_arguments_test.dart b/runtime/observatory/tests/service/type_arguments_test.dart
index d8ce2c9..c97d680 100644
--- a/runtime/observatory/tests/service/type_arguments_test.dart
+++ b/runtime/observatory/tests/service/type_arguments_test.dart
@@ -9,7 +9,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) =>
-      isolate.getTypeArgumentsList(false).then((ServiceMap allTypeArgs) {
+      isolate.getTypeArgumentsList(false).then((dynamic allTypeArgs) {
         var allTypeArgsTableSize =
             allTypeArgs['canonicalTypeArgumentsTableSize'];
         var allTypeArgsTableUsed =
@@ -21,22 +21,23 @@
             allTypeArgsTableSize, greaterThanOrEqualTo(allTypeArgsTableUsed));
         return isolate
             .getTypeArgumentsList(true)
-            .then((ServiceMap instantiatedTypeARgs) {
+            .then((dynamic instantiatedTypeArgs) {
           var instantiatedTypeArgsTableSize =
-              instantiatedTypeARgs['canonicalTypeArgumentsTableSize'];
+              instantiatedTypeArgs['canonicalTypeArgumentsTableSize'];
           var instantiatedTypeArgsTableUsed =
-              instantiatedTypeARgs['canonicalTypeArgumentsTableUsed'];
+              instantiatedTypeArgs['canonicalTypeArgumentsTableUsed'];
           // Check size >= used.
           expect(instantiatedTypeArgsTableSize,
               greaterThanOrEqualTo(instantiatedTypeArgsTableUsed));
           // Check that |instantiated| <= |all|
-          var instantiatedTypeArgsList = instantiatedTypeARgs['typeArguments'];
+          var instantiatedTypeArgsList = instantiatedTypeArgs['typeArguments'];
           expect(instantiatedTypeArgsList, isNotNull);
           expect(allTypeArgsList.length,
               greaterThanOrEqualTo(instantiatedTypeArgsList.length));
           // Check that we can 'get' this object again.
           var firstType = allTypeArgsList[0];
-          return isolate.getObject(firstType.id).then((TypeArguments type) {
+          return isolate.getObject(firstType.id).then((ServiceObject object) {
+            TypeArguments type = object;
             expect(firstType.name, type.name);
           });
         });
diff --git a/runtime/observatory/tests/service/typed_data_test.dart b/runtime/observatory/tests/service/typed_data_test.dart
index 2265045..7c34f32 100644
--- a/runtime/observatory/tests/service/typed_data_test.dart
+++ b/runtime/observatory/tests/service/typed_data_test.dart
@@ -79,7 +79,7 @@
 var tests = <IsolateTest>[
   (Isolate isolate) async {
     script();
-    var lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load();
 
     // Pre-load all the fields so we don't use await below and get better
     // stacktraces.
diff --git a/runtime/observatory/tests/service/vm_timeline_events_test.dart b/runtime/observatory/tests/service/vm_timeline_events_test.dart
index ffe6368..d6eec71 100644
--- a/runtime/observatory/tests/service/vm_timeline_events_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_events_test.dart
@@ -17,9 +17,9 @@
   }
 }
 
-bool isDart(Map event) => event['cat'] == 'Dart';
+bool isDart(event) => event['cat'] == 'Dart';
 
-List<Map> filterEvents(List<Map> events, filter) {
+List filterEvents(List events, filter) {
   return events.where(filter).toList();
 }
 
diff --git a/runtime/observatory/tests/service/vm_timeline_flags_test.dart b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
index 0d93ac7..d32c291 100644
--- a/runtime/observatory/tests/service/vm_timeline_flags_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
@@ -17,12 +17,12 @@
   }
 }
 
-bool isDart(Map event) => event['cat'] == 'Dart';
-bool isMetaData(Map event) => event['ph'] == 'M';
-bool isNotMetaData(Map event) => !isMetaData(event);
-bool isNotDartAndMetaData(Map event) => !isDart(event) && !isMetaData(event);
+bool isDart(event) => event['cat'] == 'Dart';
+bool isMetaData(event) => event['ph'] == 'M';
+bool isNotMetaData(event) => !isMetaData(event);
+bool isNotDartAndMetaData(event) => !isDart(event) && !isMetaData(event);
 
-List<Map> filterEvents(List<Map> events, filter) {
+List filterEvents(List events, filter) {
   return events.where(filter).toList();
 }
 
diff --git a/runtime/observatory/tests/service/weak_properties_test.dart b/runtime/observatory/tests/service/weak_properties_test.dart
index 2bd9c95..4114aeb 100644
--- a/runtime/observatory/tests/service/weak_properties_test.dart
+++ b/runtime/observatory/tests/service/weak_properties_test.dart
@@ -37,7 +37,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    var lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load();
     Field keyField = lib.variables.singleWhere((v) => v.name == 'key');
     await keyField.load();
     Instance key = keyField.staticValue;
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index 44c705f..23a8c5e2 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -52,4 +52,8 @@
   # core-jit snapshot breaks the ability to change various flags that affect
   # code generation.
   dart_core_snapshot_kind = "core"
+
+  # Whether the Dart binary version string should include the git hash and
+  # git commit time.
+  dart_version_git_info = true
 }
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 9b7d730..d2ec7b8 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -296,12 +296,7 @@
 cc/SourceReport_PossibleBreakpoints_Simple: Fail
 cc/StackTraceFormat: Fail
 cc/UseDartApi: Fail
-dart/data_uri_import_test/base64: CompileTimeError
-dart/data_uri_import_test/nocharset: CompileTimeError
-dart/data_uri_import_test/nomime: CompileTimeError
-dart/data_uri_import_test/percentencoded: Fail
-dart/data_uri_import_test/wrongmime: CompileTimeError
-dart/data_uri_spawn_test: RuntimeError
+dart/data_uri_import_test/utf16: MissingRuntimeError # UTF-16 data URIs work in dartk
 dart/redirection_type_shuffling_test/00: Crash
 dart/redirection_type_shuffling_test/none: Crash
 dart/spawn_shutdown_test: SkipSlow
@@ -335,24 +330,22 @@
 dart/optimized_stacktrace_line_and_column_test: CompileTimeError # Issue 31586
 dart/optimized_stacktrace_line_test: CompileTimeError # Issue 31586
 
+[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+dart/spawn_infinite_loop_test: RuntimeError
+
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
 dart/data_uri_spawn_test: Skip # Please triage.
 dart/snapshot_version_test: RuntimeError # Please triage.
-dart/spawn_infinite_loop_test: Crash # Please triage.
+dart/spawn_infinite_loop_test: Crash
 
 [ $compiler == dartkp && !$strong ]
 dart/truncating_ints_test: Skip # This test cannot be run in dartkp/legacy mode (gen_kernel does not pass --limit-ints-to-64-bits in legacy mode).
 
 [ $compiler == dartkp && ($runtime == dart_precompiled || $runtime == vm) ]
-dart/data_uri_import_test/base64: CompileTimeError
-dart/data_uri_import_test/nocharset: CompileTimeError
-dart/data_uri_import_test/nomime: CompileTimeError
-dart/data_uri_import_test/percentencoded: CompileTimeError
-dart/data_uri_import_test/wrongmime: CompileTimeError
-dart/data_uri_spawn_test: RuntimeError
+dart/data_uri_import_test/utf16: MissingRuntimeError # UTF-16 data URIs work in dartk
 dart/redirection_type_shuffling_test: SkipByDesign # Includes dart:mirrors.
 dart/spawn_shutdown_test: SkipSlow
 
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index 8f2d97a..784c9af 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -16,17 +16,15 @@
                                                      intptr_t size)
     : address_(address), size_(size) {
   if (FLAG_write_protect_code) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
-                                         VirtualMemory::kReadWrite);
-    ASSERT(status);
+    VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
+                           VirtualMemory::kReadWrite);
   }
 }
 
 WritableInstructionsScope::~WritableInstructionsScope() {
   if (FLAG_write_protect_code) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address_),
-                                         size_, VirtualMemory::kReadExecute);
-    ASSERT(status);
+    VirtualMemory::Protect(reinterpret_cast<void*>(address_), size_,
+                           VirtualMemory::kReadExecute);
   }
 }
 
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index b07b481..e7efe16 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -28,7 +28,6 @@
 #include "vm/flags.h"
 #include "vm/hash_table.h"
 #include "vm/isolate.h"
-#include "vm/json_parser.h"
 #include "vm/json_writer.h"
 #include "vm/log.h"
 #include "vm/longjump.h"
@@ -222,13 +221,10 @@
 }
 
 RawError* Precompiler::CompileAll(
-    Dart_QualifiedFunctionName embedder_entry_points[],
-    uint8_t* jit_feedback,
-    intptr_t jit_feedback_length) {
+    Dart_QualifiedFunctionName embedder_entry_points[]) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     Precompiler precompiler(Thread::Current());
-    precompiler.LoadFeedback(jit_feedback, jit_feedback_length);
     precompiler.DoCompileAll(embedder_entry_points);
     return Error::null();
   } else {
@@ -335,7 +331,6 @@
     : thread_(thread),
       zone_(NULL),
       isolate_(thread->isolate()),
-      jit_feedback_(NULL),
       changed_(false),
       retain_root_library_caches_(false),
       function_count_(0),
@@ -363,46 +358,6 @@
       error_(Error::Handle()),
       get_runtime_type_is_unique_(false) {}
 
-void Precompiler::LoadFeedback(uint8_t* buffer, intptr_t length) {
-  if (buffer == NULL) {
-    if (FLAG_trace_precompiler) {
-      THR_Print("Precompiler running without JIT feedback\n");
-    }
-
-    // Flags affecting compilation only:
-    // There is no counter feedback in precompilation, so ignore the counter
-    // when making inlining decisions.
-    FLAG_inlining_hotness = 0;
-    // Use smaller thresholds in precompilation as we are compiling everything
-    // with the optimizing compiler instead of only hot functions.
-    FLAG_inlining_size_threshold = 5;
-    FLAG_inline_getters_setters_smaller_than = 5;
-    FLAG_inlining_callee_size_threshold = 20;
-    FLAG_inlining_depth_threshold = 4;
-    FLAG_inlining_caller_size_threshold = 1000;
-    FLAG_inlining_constant_arguments_max_size_threshold = 100;
-    FLAG_inlining_constant_arguments_min_size_threshold = 30;
-    return;
-  }
-
-  if (FLAG_trace_precompiler) {
-    THR_Print("Loading JIT feedback\n");
-  }
-
-  JSONParser parser(reinterpret_cast<const char*>(buffer), length,
-                    Thread::Current()->zone());
-  ParsedJSONValue* root = parser.ParseValue();
-  if (root->IsError()) {
-    ParsedJSONError* error = static_cast<ParsedJSONError*>(root);
-    THR_Print("Error parsing JIT feedback: %s:%" Pd "\n", error->message(),
-              error->position());
-  } else if (!root->IsObject()) {
-    THR_Print("Error parsing JIT feedback: object expected\n");
-  } else {
-    jit_feedback_ = static_cast<ParsedJSONObject*>(root);
-  }
-}
-
 void Precompiler::DoCompileAll(
     Dart_QualifiedFunctionName embedder_entry_points[]) {
   ASSERT(I->compilation_allowed());
@@ -421,7 +376,6 @@
 
       ClassFinalizer::SortClasses();
       TypeRangeCache trc(this, T, I->class_table()->NumCids());
-      VerifyJITFeedback();
 
       // Precompile static initializers to compute result type information.
       PrecompileStaticInitializers();
@@ -2181,6 +2135,10 @@
   Array& dict = Array::Handle(Z);
   Object& entry = Object::Handle(Z);
 
+  Array& scripts = Array::Handle(Z);
+  Script& script = Script::Handle(Z);
+  KernelProgramInfo& program_info = KernelProgramInfo::Handle(Z);
+
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
     lib ^= libraries_.At(i);
 
@@ -2218,6 +2176,17 @@
           (lib.raw() == I->object_store()->root_library()))) {
       lib.DropDependenciesAndCaches();
     }
+
+    scripts = lib.LoadedScripts();
+    if (!scripts.IsNull()) {
+      for (intptr_t i = 0; i < scripts.Length(); ++i) {
+        script = Script::RawCast(scripts.At(i));
+        program_info = script.kernel_program_info();
+        if (!program_info.IsNull()) {
+          program_info.set_constants(Array::null_array());
+        }
+      }
+    }
   }
 }
 
@@ -2609,171 +2578,6 @@
   I->set_all_classes_finalized(true);
 }
 
-void Precompiler::VerifyJITFeedback() {
-  if (jit_feedback_ == NULL) return;
-
-  ParsedJSONString* js_vmversion = jit_feedback_->StringAt("vmVersion");
-  if ((js_vmversion == NULL) ||
-      strcmp(js_vmversion->value(), Version::CommitString()) != 0) {
-    THR_Print(
-        "JIT feedback contains invalid vm version "
-        "(saw %s, expected %s).\n",
-        js_vmversion->value(), Version::CommitString());
-    jit_feedback_ = NULL;
-    return;
-  }
-  ParsedJSONBoolean* js_asserts = jit_feedback_->BooleanAt("asserts");
-  if ((js_asserts == NULL) || (FLAG_enable_asserts != js_asserts->value())) {
-    THR_Print("JIT feedback contains invalid FLAG_enable_asserts\n");
-    jit_feedback_ = NULL;
-    return;
-  }
-  ParsedJSONBoolean* js_typechecks = jit_feedback_->BooleanAt("typeChecks");
-  if ((js_typechecks == NULL) ||
-      (FLAG_enable_type_checks != js_typechecks->value())) {
-    THR_Print("JIT feedback contains invalid FLAG_enable_type_checks\n");
-    jit_feedback_ = NULL;
-    return;
-  }
-
-  ParsedJSONArray* js_scripts = jit_feedback_->ArrayAt("scripts");
-  ASSERT(js_scripts != NULL);
-  Script& script = Script::Handle(Z);
-  for (intptr_t i = 0; i < js_scripts->Length(); i++) {
-    ParsedJSONObject* js_script = js_scripts->ObjectAt(i);
-    ASSERT(js_script != NULL);
-    ParsedJSONString* js_uri = js_script->StringAt("uri");
-    ASSERT(js_uri != NULL);
-    ParsedJSONNumber* js_fp = js_script->NumberAt("checksum");
-    ASSERT(js_fp != NULL);
-    script = LookupScript(js_uri->value());
-    if (script.IsNull()) {
-      THR_Print("Cannot find script %s\n", js_uri->value());
-      continue;
-    }
-    intptr_t fp = script.SourceFingerprint();
-    if (fp != js_fp->value()) {
-      THR_Print(
-          "Fingerprint has changed for %s. Continuing without JIT "
-          "feedback.\n",
-          js_uri->value());
-      jit_feedback_ = NULL;
-      return;
-    }
-  }
-
-  ParsedJSONArray* js_classes = jit_feedback_->ArrayAt("classes");
-  ASSERT(js_classes != NULL);
-  Library& lib = Library::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  String& str = String::Handle(Z);
-  for (intptr_t i = 0; i < js_classes->Length(); i++) {
-    ParsedJSONObject* js_class = js_classes->ObjectAt(i);
-    ASSERT(js_class != NULL);
-    ParsedJSONString* js_uri = js_class->StringAt("uri");
-    ASSERT(js_uri != NULL);
-    ParsedJSONString* js_name = js_class->StringAt("name");
-    ASSERT(js_name != NULL);
-    ParsedJSONNumber* js_cid = js_class->NumberAt("cid");
-    ASSERT(js_cid != NULL);
-
-    str = String::New(js_uri->value());
-    lib = Library::LookupLibrary(T, str);
-    if (lib.IsNull()) {
-      THR_Print("Cannot find library %s\n", js_uri->value());
-      continue;
-    }
-    str = String::New(js_name->value());
-    if (str.Equals(Symbols::TopLevel())) {
-      cls = lib.toplevel_class();
-    } else {
-      cls = lib.LookupClassAllowPrivate(str);
-    }
-    if (cls.IsNull()) {
-      THR_Print("Missing class %s\n", js_name->value());
-      continue;
-    }
-
-    feedback_cid_map_.Insert(IntptrPair(js_cid->value(), cls.id()));
-  }
-
-  ParsedJSONArray* js_functions = jit_feedback_->ArrayAt("functions");
-  ASSERT(js_functions != NULL);
-  for (intptr_t i = 0; i < js_functions->Length(); i++) {
-    ParsedJSONObject* js_function = js_functions->ObjectAt(i);
-    ASSERT(js_function != NULL);
-    ParsedJSONString* js_name = js_function->StringAt("name");
-    ASSERT(js_name != NULL);
-    ParsedJSONNumber* js_cid = js_function->NumberAt("class");
-    ASSERT(js_cid != NULL);
-    ParsedJSONNumber* js_token = js_function->NumberAt("tokenPos");
-    ASSERT(js_token != NULL);
-    ParsedJSONNumber* js_kind = js_function->NumberAt("kind");
-    ASSERT(js_kind != NULL);
-    function_feedback_map_.Insert(FunctionFeedbackPair(
-        FunctionFeedbackKey(MapCid(js_cid->value()), js_token->value(),
-                            js_kind->value()),
-        js_function));
-  }
-
-  class ApplyUsageVisitor : public FunctionVisitor {
-   public:
-    explicit ApplyUsageVisitor(Precompiler* precompiler)
-        : precompiler_(precompiler) {}
-    void Visit(const Function& function) {
-      ParsedJSONObject* js_function = precompiler_->LookupFeedback(function);
-      if (js_function == NULL) {
-        function.set_usage_counter(0);
-      } else {
-        ParsedJSONNumber* js_usage = js_function->NumberAt("usageCounter");
-        ASSERT(js_usage != NULL);
-        function.set_usage_counter(js_usage->value());
-      }
-    }
-
-   private:
-    Precompiler* precompiler_;
-  };
-
-  ApplyUsageVisitor visitor(this);
-  ProgramVisitor::VisitFunctions(&visitor);
-}
-
-ParsedJSONObject* Precompiler::LookupFeedback(const Function& function) {
-  const Class& owner = Class::Handle(Z, function.Owner());
-
-  FunctionFeedbackKey key(owner.id(), function.token_pos().value(),
-                          function.kind());
-  FunctionFeedbackPair* pair = function_feedback_map_.Lookup(key);
-  if (pair == NULL) {
-    return NULL;
-  }
-  return pair->value_;
-}
-
-RawScript* Precompiler::LookupScript(const char* uri) {
-  String& dart_uri = String::Handle(Z, String::New(uri));
-  Library& lib = Library::Handle(Z);
-  Script& script = Script::Handle(Z);
-  for (intptr_t i = 0; i < libraries_.Length(); i++) {
-    lib ^= libraries_.At(i);
-    script = lib.LookupScript(dart_uri);
-    if (!script.IsNull()) {
-      return script.raw();
-    }
-  }
-  return Script::null();
-}
-
-intptr_t Precompiler::MapCid(intptr_t feedback_cid) {
-  if (feedback_cid < kNumPredefinedCids) {
-    return feedback_cid;
-  }
-  IntptrPair* pair = feedback_cid_map_.Lookup(feedback_cid);
-  if (pair == NULL) return kIllegalCid;
-  return pair->value_;
-}
-
 void Precompiler::PopulateWithICData(const Function& function,
                                      FlowGraph* graph) {
   Zone* zone = Thread::Current()->zone();
@@ -2825,118 +2629,6 @@
   }
 }
 
-void Precompiler::TryApplyFeedback(const Function& function, FlowGraph* graph) {
-  ParsedJSONObject* js_function = LookupFeedback(function);
-  if (js_function == NULL) {
-    if (FLAG_trace_precompiler) {
-      THR_Print("No feedback available for %s\n",
-                function.ToQualifiedCString());
-    }
-    return;
-  }
-
-  ParsedJSONArray* js_icdatas = js_function->ArrayAt("ics");
-  ASSERT(js_icdatas != NULL);
-
-  for (BlockIterator block_it = graph->reverse_postorder_iterator();
-       !block_it.Done(); block_it.Advance()) {
-    ForwardInstructionIterator it(block_it.Current());
-    for (; !it.Done(); it.Advance()) {
-      Instruction* instr = it.Current();
-      if (instr->IsInstanceCall()) {
-        InstanceCallInstr* call = instr->AsInstanceCall();
-        TryApplyFeedback(js_icdatas, *call->ic_data());
-      } else if (instr->IsStaticCall()) {
-        StaticCallInstr* call = instr->AsStaticCall();
-        TryApplyFeedback(js_icdatas, *call->ic_data());
-      }
-    }
-  }
-}
-
-void Precompiler::TryApplyFeedback(ParsedJSONArray* js_icdatas,
-                                   const ICData& ic) {
-  for (intptr_t j = 0; j < js_icdatas->Length(); j++) {
-    ParsedJSONObject* js_icdata = js_icdatas->ObjectAt(j);
-    ASSERT(js_icdata != NULL);
-
-    ParsedJSONNumber* js_deoptid = js_icdata->NumberAt("deoptId");
-    ASSERT(js_deoptid != NULL);
-    if (js_deoptid->value() != ic.deopt_id()) continue;
-
-    ParsedJSONBoolean* js_isstaticcall = js_icdata->BooleanAt("isStaticCall");
-    ASSERT(js_isstaticcall != NULL);
-    if (js_isstaticcall->value() != ic.is_static_call()) return;
-
-    ParsedJSONNumber* js_argsTested = js_icdata->NumberAt("argsTested");
-    ASSERT(js_argsTested != NULL);
-    if (js_argsTested->value() != ic.NumArgsTested()) return;
-
-    ParsedJSONString* js_selector = js_icdata->StringAt("selector");
-    ASSERT(js_selector != NULL);
-    const String& feedback_selector =
-        String::Handle(String::New(js_selector->value()));
-    const String& selector = String::Handle(ic.target_name());
-    // N.B.: EqualsIgnoringPrivateKey is not symmetric.
-    if (!String::EqualsIgnoringPrivateKey(selector, feedback_selector)) return;
-
-    ParsedJSONArray* js_entries = js_icdata->ArrayAt("entries");
-    ASSERT(js_entries != NULL);
-    if (ic.is_static_call()) {
-      // [cid [cid]] target count
-      ParsedJSONNumber* entry = js_entries->NumberAt(js_entries->Length() - 1);
-      ASSERT(entry != NULL);
-      ic.SetCountAt(0, entry->value());
-    } else {
-      // [cid [cid [cid]]] target count
-      const Array& arguments_descriptor =
-          Array::Handle(ic.arguments_descriptor());
-      const ArgumentsDescriptor args_desc(arguments_descriptor);
-
-      intptr_t num_args_checked = ic.NumArgsTested();
-      for (intptr_t k = 0; k < js_entries->Length();
-           k += num_args_checked + 1) {
-        GrowableArray<intptr_t> class_ids(num_args_checked);
-        for (intptr_t arg = 0; arg < num_args_checked; arg++) {
-          ParsedJSONNumber* entry = js_entries->NumberAt(k + arg);
-          ASSERT(entry != NULL);
-          class_ids.Add(MapCid(entry->value()));
-        }
-        ParsedJSONNumber* entry = js_entries->NumberAt(k + num_args_checked);
-        ASSERT(entry != NULL);
-        intptr_t count = entry->value();
-
-        bool has_missing_cid = false;
-        for (intptr_t arg = 0; arg < num_args_checked; arg++) {
-          if (class_ids[arg] == kIllegalCid) {
-            has_missing_cid = true;
-          }
-        }
-        if (has_missing_cid) continue;
-
-        intptr_t receiver_cid = class_ids[0];
-        const Class& receiver_cls =
-            Class::Handle(I->class_table()->At(receiver_cid));
-        if (receiver_cls.IsClass()) {
-          const Function& target =
-              Function::Handle(Resolver::ResolveDynamicForReceiverClass(
-                  receiver_cls, selector, args_desc, false));
-          // TODO(rmacnak): Create missing dispatchers.
-          if (!target.IsNull()) {
-            if (num_args_checked == 1) {
-              ic.AddReceiverCheck(receiver_cid, target, count);
-            } else {
-              ic.AddCheck(class_ids, target, count);
-            }
-          }
-        }
-      }
-    }
-
-    return;
-  }
-}
-
 void Precompiler::ResetPrecompilerState() {
   changed_ = false;
   function_count_ = 0;
@@ -3079,10 +2771,6 @@
       if (optimized()) {
         Precompiler::PopulateWithICData(parsed_function()->function(),
                                         flow_graph);
-        if (precompiler_ != NULL) {
-          precompiler_->TryApplyFeedback(parsed_function()->function(),
-                                         flow_graph);
-        }
       }
 
       const bool print_flow_graph =
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 41897b9..7bcb47e 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -323,9 +323,7 @@
 class Precompiler : public ValueObject {
  public:
   static RawError* CompileAll(
-      Dart_QualifiedFunctionName embedder_entry_points[],
-      uint8_t* jit_feedback,
-      intptr_t jit_feedback_length);
+      Dart_QualifiedFunctionName embedder_entry_points[]);
 
   static RawError* CompileFunction(Precompiler* precompiler,
                                    Thread* thread,
@@ -350,17 +348,11 @@
     type_range_cache_ = value;
   }
 
-  bool HasFeedback() const { return jit_feedback_ != NULL; }
   static void PopulateWithICData(const Function& func, FlowGraph* graph);
-  void TryApplyFeedback(const Function& func, FlowGraph* graph);
-  void TryApplyFeedback(ParsedJSONArray* js_icdatas, const ICData& ic);
 
  private:
   explicit Precompiler(Thread* thread);
 
-  void LoadFeedback(uint8_t* jit_feedback, intptr_t jit_feedback_length);
-  ParsedJSONObject* LookupFeedback(const Function& function);
-
   void DoCompileAll(Dart_QualifiedFunctionName embedder_entry_points[]);
   void AddRoots(Dart_QualifiedFunctionName embedder_entry_points[]);
   void AddEntryPoints(Dart_QualifiedFunctionName entry_points[],
@@ -409,9 +401,6 @@
   void PrecompileConstructors();
 
   void FinalizeAllClasses();
-  void VerifyJITFeedback();
-  RawScript* LookupScript(const char* uri);
-  intptr_t MapCid(intptr_t feedback_cid);
 
   Thread* thread() const { return thread_; }
   Zone* zone() const { return zone_; }
@@ -421,8 +410,6 @@
   Zone* zone_;
   Isolate* isolate_;
 
-  ParsedJSONObject* jit_feedback_;
-
   bool changed_;
   bool retain_root_library_caches_;
   intptr_t function_count_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index ecc8c5e..77fc1e3 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -93,7 +93,6 @@
   // Helpers for non-trivial source-destination combinations that cannot
   // be handled by a single instruction.
   void MoveMemoryToMemory(const Address& dst, const Address& src);
-  void StoreObject(const Address& dst, const Object& obj);
   void Exchange(Register reg, const Address& mem);
   void Exchange(const Address& mem1, const Address& mem2);
   void Exchange(Register reg, Register base_reg, intptr_t stack_offset);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 234e125..95f3a38 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -1270,44 +1270,14 @@
     }
   } else {
     ASSERT(source.IsConstant());
-    const Object& constant = source.constant();
-    if (destination.IsRegister()) {
-      if (source.constant_instruction()->representation() == kUnboxedInt32) {
-        __ LoadImmediate(destination.reg(), Smi::Cast(constant).Value());
-      } else {
-        __ LoadObject(destination.reg(), constant);
-      }
-    } else if (destination.IsFpuRegister()) {
-      const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
-      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) &&
-          TargetCPUFeatures::neon_supported()) {
-        QRegister qdst = destination.fpu_reg();
-        __ veorq(qdst, qdst, qdst);
-      } else {
-        __ LoadObject(TMP, constant);
-        __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
-        __ vldrd(dst, Address(TMP, 0));
-      }
-    } else if (destination.IsDoubleStackSlot()) {
-      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) &&
-          TargetCPUFeatures::neon_supported()) {
-        __ veorq(QTMP, QTMP, QTMP);
-      } else {
-        __ LoadObject(TMP, constant);
-        __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
-        __ vldrd(DTMP, Address(TMP, 0));
-      }
-      const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ StoreDToOffset(DTMP, destination.base_reg(), dest_offset);
+
+    if (destination.IsFpuRegister() || destination.IsDoubleStackSlot() ||
+        destination.IsStackSlot()) {
+      ScratchRegisterScope scratch(this, kNoRegister);
+      source.constant_instruction()->EmitMoveToLocation(compiler_, destination,
+                                                        scratch.reg());
     } else {
-      ASSERT(destination.IsStackSlot());
-      const intptr_t dest_offset = destination.ToStackSlotOffset();
-      if (source.constant_instruction()->representation() == kUnboxedInt32) {
-        __ LoadImmediate(TMP, Smi::Cast(constant).Value());
-      } else {
-        __ LoadObject(TMP, constant);
-      }
-      __ StoreToOffset(kWord, TMP, destination.base_reg(), dest_offset);
+      source.constant_instruction()->EmitMoveToLocation(compiler_, destination);
     }
   }
 
@@ -1417,10 +1387,6 @@
   UNREACHABLE();
 }
 
-void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
-  UNREACHABLE();
-}
-
 // Do not call or implement this function. Instead, use the form below that
 // uses an offset from the frame pointer instead of an Address.
 void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 1bbed6c..b94296b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -1216,46 +1216,12 @@
     }
   } else {
     ASSERT(source.IsConstant());
-    const Object& constant = source.constant();
-    if (destination.IsRegister()) {
-      if (constant.IsSmi() &&
-          (source.constant_instruction()->representation() == kUnboxedInt32)) {
-        __ LoadImmediate(destination.reg(),
-                         static_cast<int32_t>(Smi::Cast(constant).Value()));
-      } else {
-        __ LoadObject(destination.reg(), constant);
-      }
-    } else if (destination.IsFpuRegister()) {
-      const VRegister dst = destination.fpu_reg();
-      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
-        __ veor(dst, dst, dst);
-      } else {
-        ScratchRegisterScope tmp(this, kNoRegister);
-        __ LoadObject(tmp.reg(), constant);
-        __ LoadDFieldFromOffset(dst, tmp.reg(), Double::value_offset());
-      }
-    } else if (destination.IsDoubleStackSlot()) {
-      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
-        __ veor(VTMP, VTMP, VTMP);
-      } else {
-        ScratchRegisterScope tmp(this, kNoRegister);
-        __ LoadObject(tmp.reg(), constant);
-        __ LoadDFieldFromOffset(VTMP, tmp.reg(), Double::value_offset());
-      }
-      const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ StoreDToOffset(VTMP, destination.base_reg(), dest_offset);
+    if (destination.IsStackSlot()) {
+      ScratchRegisterScope scratch(this, kNoRegister);
+      source.constant_instruction()->EmitMoveToLocation(compiler_, destination,
+                                                        scratch.reg());
     } else {
-      ASSERT(destination.IsStackSlot());
-      const intptr_t dest_offset = destination.ToStackSlotOffset();
-      ScratchRegisterScope tmp(this, kNoRegister);
-      if (constant.IsSmi() &&
-          (source.constant_instruction()->representation() == kUnboxedInt32)) {
-        __ LoadImmediate(tmp.reg(),
-                         static_cast<int32_t>(Smi::Cast(constant).Value()));
-      } else {
-        __ LoadObject(tmp.reg(), constant);
-      }
-      __ StoreToOffset(tmp.reg(), destination.base_reg(), dest_offset);
+      source.constant_instruction()->EmitMoveToLocation(compiler_, destination);
     }
   }
 
@@ -1355,10 +1321,6 @@
   UNREACHABLE();
 }
 
-void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
-  UNREACHABLE();
-}
-
 // Do not call or implement this function. Instead, use the form below that
 // uses an offset from the frame pointer instead of an Address.
 void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index e11a330..749da72 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -433,10 +433,6 @@
   UNREACHABLE();
 }
 
-void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
-  UNREACHABLE();
-}
-
 // Do not call or implement this function. Instead, use the form below that
 // uses an offset from the frame pointer instead of an Address.
 void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 56c93d4..d2b918b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -1186,56 +1186,7 @@
     }
   } else {
     ASSERT(source.IsConstant());
-    if (destination.IsRegister()) {
-      const Object& constant = source.constant();
-      if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
-        __ xorl(destination.reg(), destination.reg());
-      } else if (constant.IsSmi() &&
-                 (source.constant_instruction()->representation() ==
-                  kUnboxedInt32)) {
-        __ movl(destination.reg(), Immediate(Smi::Cast(constant).Value()));
-      } else {
-        __ LoadObjectSafely(destination.reg(), constant);
-      }
-    } else if (destination.IsFpuRegister()) {
-      const Double& constant = Double::Cast(source.constant());
-      uword addr = FlowGraphBuilder::FindDoubleConstant(constant.value());
-      if (addr == 0) {
-        __ pushl(EAX);
-        __ LoadObject(EAX, constant);
-        __ movsd(destination.fpu_reg(),
-                 FieldAddress(EAX, Double::value_offset()));
-        __ popl(EAX);
-      } else if (Utils::DoublesBitEqual(constant.value(), 0.0)) {
-        __ xorps(destination.fpu_reg(), destination.fpu_reg());
-      } else {
-        __ movsd(destination.fpu_reg(), Address::Absolute(addr));
-      }
-    } else if (destination.IsDoubleStackSlot()) {
-      const Double& constant = Double::Cast(source.constant());
-      uword addr = FlowGraphBuilder::FindDoubleConstant(constant.value());
-      if (addr == 0) {
-        __ pushl(EAX);
-        __ LoadObject(EAX, constant);
-        __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
-        __ popl(EAX);
-      } else if (Utils::DoublesBitEqual(constant.value(), 0.0)) {
-        __ xorps(XMM0, XMM0);
-      } else {
-        __ movsd(XMM0, Address::Absolute(addr));
-      }
-      __ movsd(destination.ToStackSlotAddress(), XMM0);
-    } else {
-      ASSERT(destination.IsStackSlot());
-      const Object& constant = source.constant();
-      if (constant.IsSmi() &&
-          (source.constant_instruction()->representation() == kUnboxedInt32)) {
-        __ movl(destination.ToStackSlotAddress(),
-                Immediate(Smi::Cast(constant).Value()));
-      } else {
-        StoreObject(destination.ToStackSlotAddress(), source.constant());
-      }
-    }
+    source.constant_instruction()->EmitMoveToLocation(compiler_, destination);
   }
 
   move->Eliminate();
@@ -1323,16 +1274,6 @@
   __ movl(dst, ensure_scratch.reg());
 }
 
-void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
-  if (Assembler::IsSafeSmi(obj) || obj.IsNull()) {
-    __ movl(dst, Immediate(reinterpret_cast<int32_t>(obj.raw())));
-  } else {
-    ScratchRegisterScope ensure_scratch(this, kNoRegister);
-    __ LoadObjectSafely(ensure_scratch.reg(), obj);
-    __ movl(dst, ensure_scratch.reg());
-  }
-}
-
 void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
   ScratchRegisterScope ensure_scratch(this, reg);
   __ movl(ensure_scratch.reg(), mem);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index ffa97bd..b9de1f8 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -1176,42 +1176,12 @@
     }
   } else {
     ASSERT(source.IsConstant());
-    const Object& constant = source.constant();
-    if (destination.IsRegister()) {
-      if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
-        __ xorl(destination.reg(), destination.reg());
-      } else if (constant.IsSmi() &&
-                 (source.constant_instruction()->representation() ==
-                  kUnboxedInt32)) {
-        __ movl(destination.reg(), Immediate(Smi::Cast(constant).Value()));
-      } else {
-        __ LoadObject(destination.reg(), constant);
-      }
-    } else if (destination.IsFpuRegister()) {
-      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
-        __ xorps(destination.fpu_reg(), destination.fpu_reg());
-      } else {
-        __ LoadObject(TMP, constant);
-        __ movsd(destination.fpu_reg(),
-                 FieldAddress(TMP, Double::value_offset()));
-      }
-    } else if (destination.IsDoubleStackSlot()) {
-      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
-        __ xorps(XMM0, XMM0);
-      } else {
-        __ LoadObject(TMP, constant);
-        __ movsd(XMM0, FieldAddress(TMP, Double::value_offset()));
-      }
-      __ movsd(destination.ToStackSlotAddress(), XMM0);
+    if (destination.IsFpuRegister() || destination.IsDoubleStackSlot()) {
+      ScratchRegisterScope scratch(this, kNoRegister);
+      source.constant_instruction()->EmitMoveToLocation(compiler_, destination,
+                                                        scratch.reg());
     } else {
-      ASSERT(destination.IsStackSlot());
-      if (constant.IsSmi() &&
-          (source.constant_instruction()->representation() == kUnboxedInt32)) {
-        __ movl(destination.ToStackSlotAddress(),
-                Immediate(Smi::Cast(constant).Value()));
-      } else {
-        StoreObject(destination.ToStackSlotAddress(), constant);
-      }
+      source.constant_instruction()->EmitMoveToLocation(compiler_, destination);
     }
   }
 
@@ -1298,10 +1268,6 @@
   __ MoveMemoryToMemory(dst, src);
 }
 
-void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
-  __ StoreObject(dst, obj);
-}
-
 void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
   __ Exchange(reg, mem);
 }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 353764f..5982b24 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -424,11 +424,12 @@
            constant_function_type_args->value().IsTypeArguments());
 
     Zone* Z = Thread::Current()->zone();
-    TypeArguments& instantiator_type_args = TypeArguments::Handle(Z);
-    instantiator_type_args ^= constant_instantiator_type_args->value().raw();
+    const TypeArguments& instantiator_type_args = TypeArguments::Handle(
+        Z,
+        TypeArguments::RawCast(constant_instantiator_type_args->value().raw()));
 
-    TypeArguments& function_type_args = TypeArguments::Handle(Z);
-    function_type_args ^= constant_function_type_args->value().raw();
+    const TypeArguments& function_type_args = TypeArguments::Handle(
+        Z, TypeArguments::RawCast(constant_function_type_args->value().raw()));
 
     Error& error_bound = Error::Handle(Z);
 
@@ -2145,15 +2146,21 @@
            constant_instantiator_type_args->value().IsTypeArguments());
     ASSERT(constant_function_type_args->value().IsNull() ||
            constant_function_type_args->value().IsTypeArguments());
-    TypeArguments& instantiator_type_args = TypeArguments::Handle();
-    instantiator_type_args ^= constant_instantiator_type_args->value().raw();
-    TypeArguments& function_type_args = TypeArguments::Handle();
-    function_type_args ^= constant_function_type_args->value().raw();
-    Error& bound_error = Error::Handle();
-    AbstractType& new_dst_type =
-        AbstractType::Handle(dst_type().InstantiateFrom(
-            instantiator_type_args, function_type_args, kAllFree, &bound_error,
-            NULL, NULL, Heap::kOld));
+
+    Zone* Z = Thread::Current()->zone();
+    const TypeArguments& instantiator_type_args = TypeArguments::Handle(
+        Z,
+        TypeArguments::RawCast(constant_instantiator_type_args->value().raw()));
+
+    const TypeArguments& function_type_args = TypeArguments::Handle(
+        Z, TypeArguments::RawCast(constant_function_type_args->value().raw()));
+
+    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));
     if (new_dst_type.IsMalformedOrMalbounded() || !bound_error.IsNull()) {
       return this;
     }
@@ -2362,6 +2369,33 @@
   return this;
 }
 
+Definition* UnboxInt64Instr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* replacement = UnboxIntegerInstr::Canonicalize(flow_graph);
+  if (replacement != this) {
+    return replacement;
+  }
+
+// Currently we perform this only on 64-bit architectures and not on simdbc64
+// (on simdbc64 the [UnboxedConstantInstr] handling is only implemented for
+//  doubles and causes a bailout for everthing else)
+#if !defined(TARGET_ARCH_DBC)
+  if (kBitsPerWord == 64) {
+    ConstantInstr* c = value()->definition()->AsConstant();
+    if (c != NULL && (c->value().IsSmi() || c->value().IsMint())) {
+      UnboxedConstantInstr* uc =
+          new UnboxedConstantInstr(c->value(), kUnboxedInt64);
+      if (c->range() != NULL) {
+        uc->set_range(*c->range());
+      }
+      flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
+      return uc;
+    }
+  }
+#endif  // !defined(TARGET_ARCH_DBC)
+
+  return this;
+}
+
 Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) {
   if (!HasUses()) return NULL;
 
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 7e391d9..3f14be9 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -2717,6 +2717,21 @@
 
   virtual TokenPosition token_pos() const { return token_pos_; }
 
+  bool IsUnboxedSignedIntegerConstant() const {
+    return representation() == kUnboxedInt32 ||
+           representation() == kUnboxedInt64;
+  }
+
+  int64_t GetUnboxedSignedIntegerConstantValue() const {
+    ASSERT(IsUnboxedSignedIntegerConstant());
+    return value_.IsSmi() ? Smi::Cast(value_).Value()
+                          : Mint::Cast(value_).value();
+  }
+
+  void EmitMoveToLocation(FlowGraphCompiler* compiler,
+                          const Location& destination,
+                          Register tmp = kNoRegister);
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -5351,6 +5366,8 @@
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
   DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt64)
 
  private:
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 4b77db1..09a1915 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -323,6 +323,49 @@
   }
 }
 
+void ConstantInstr::EmitMoveToLocation(FlowGraphCompiler* compiler,
+                                       const Location& destination,
+                                       Register tmp) {
+  if (destination.IsRegister()) {
+    if (representation() == kUnboxedInt32) {
+      __ LoadImmediate(destination.reg(), Smi::Cast(value_).Value());
+    } else {
+      ASSERT(representation() == kTagged);
+      __ LoadObject(destination.reg(), value_);
+    }
+  } else if (destination.IsFpuRegister()) {
+    const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0) &&
+        TargetCPUFeatures::neon_supported()) {
+      QRegister qdst = destination.fpu_reg();
+      __ veorq(qdst, qdst, qdst);
+    } else {
+      ASSERT(tmp != kNoRegister);
+      __ LoadDImmediate(dst, Double::Cast(value_).value(), tmp);
+    }
+  } else if (destination.IsDoubleStackSlot()) {
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0) &&
+        TargetCPUFeatures::neon_supported()) {
+      __ veorq(QTMP, QTMP, QTMP);
+    } else {
+      ASSERT(tmp != kNoRegister);
+      __ LoadDImmediate(DTMP, Double::Cast(value_).value(), tmp);
+    }
+    const intptr_t dest_offset = destination.ToStackSlotOffset();
+    __ StoreDToOffset(DTMP, destination.base_reg(), dest_offset);
+  } else {
+    ASSERT(destination.IsStackSlot());
+    ASSERT(tmp != kNoRegister);
+    const intptr_t dest_offset = destination.ToStackSlotOffset();
+    if (representation() == kUnboxedInt32) {
+      __ LoadImmediate(tmp, Smi::Cast(value_).Value());
+    } else {
+      __ LoadObject(tmp, value_);
+    }
+    __ StoreToOffset(kWord, tmp, destination.base_reg(), dest_offset);
+  }
+}
+
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
@@ -344,25 +387,9 @@
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-    switch (representation_) {
-      case kUnboxedDouble:
-        if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0) &&
-            TargetCPUFeatures::neon_supported()) {
-          const QRegister dst = locs()->out(0).fpu_reg();
-          __ veorq(dst, dst, dst);
-        } else {
-          const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg());
-          const Register temp = locs()->temp(0).reg();
-          __ LoadDImmediate(dst, Double::Cast(value()).value(), temp);
-        }
-        break;
-      case kUnboxedInt32:
-        __ LoadImmediate(locs()->out(0).reg(), Smi::Cast(value()).Value());
-        break;
-      default:
-        UNREACHABLE();
-        break;
-    }
+    const Register scratch =
+        locs()->temp_count() == 0 ? kNoRegister : locs()->temp(0).reg();
+    EmitMoveToLocation(compiler, locs()->out(0), scratch);
   }
 }
 
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 15d8cf1..fa52fc8 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -50,7 +50,7 @@
   ASSERT(instr->RequiredInputRepresentation(
              StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
   __ add(TMP, instr->base_reg(), Operand(index, LSL, 2));
-  __ ldr(value, Address(TMP, instr->offset()));
+  __ str(value, Address(TMP, instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -320,35 +320,74 @@
   }
 }
 
+void ConstantInstr::EmitMoveToLocation(FlowGraphCompiler* compiler,
+                                       const Location& destination,
+                                       Register tmp) {
+  if (destination.IsRegister()) {
+    if (representation() == kUnboxedInt32 ||
+        representation() == kUnboxedInt64) {
+      const int64_t value = value_.IsSmi() ? Smi::Cast(value_).Value()
+                                           : Mint::Cast(value_).value();
+      __ LoadImmediate(destination.reg(), value);
+    } else {
+      ASSERT(representation() == kTagged);
+      __ LoadObject(destination.reg(), value_);
+    }
+  } else if (destination.IsFpuRegister()) {
+    const VRegister dst = destination.fpu_reg();
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
+      __ veor(dst, dst, dst);
+    } else {
+      __ LoadDImmediate(dst, Double::Cast(value_).value());
+    }
+  } else if (destination.IsDoubleStackSlot()) {
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
+      __ veor(VTMP, VTMP, VTMP);
+    } else {
+      __ LoadDImmediate(VTMP, Double::Cast(value_).value());
+    }
+    const intptr_t dest_offset = destination.ToStackSlotOffset();
+    __ StoreDToOffset(VTMP, destination.base_reg(), dest_offset);
+  } else {
+    ASSERT(destination.IsStackSlot());
+    ASSERT(tmp != kNoRegister);
+    const intptr_t dest_offset = destination.ToStackSlotOffset();
+    if (value_.IsSmi() && representation() == kUnboxedInt32) {
+      __ LoadImmediate(tmp, static_cast<int32_t>(Smi::Cast(value_).Value()));
+    } else {
+      __ LoadObject(tmp, value_);
+    }
+    __ StoreToOffset(tmp, destination.base_reg(), dest_offset);
+  }
+}
+
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const Location out = (representation_ == kUnboxedInt32)
-                           ? Location::RequiresRegister()
-                           : Location::RequiresFpuRegister();
-  return LocationSummary::Make(zone, kNumInputs, out, LocationSummary::kNoCall);
+  const intptr_t kNumTemps = IsUnboxedSignedIntegerConstant() ? 0 : 1;
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  switch (representation()) {
+    case kUnboxedDouble:
+      locs->set_out(0, Location::RequiresFpuRegister());
+      locs->set_temp(0, Location::RequiresRegister());
+      break;
+    case kUnboxedInt32:
+    case kUnboxedInt64:
+      locs->set_out(0, Location::RequiresRegister());
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return locs;
 }
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!locs()->out(0).IsInvalid()) {
-    switch (representation_) {
-      case kUnboxedDouble:
-        if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
-          const VRegister dst = locs()->out(0).fpu_reg();
-          __ veor(dst, dst, dst);
-        } else {
-          const VRegister dst = locs()->out(0).fpu_reg();
-          __ LoadDImmediate(dst, Double::Cast(value()).value());
-        }
-        break;
-      case kUnboxedInt32:
-        __ LoadImmediate(locs()->out(0).reg(),
-                         static_cast<int32_t>(Smi::Cast(value()).Value()));
-        break;
-      default:
-        UNREACHABLE();
-        break;
-    }
+    const Register scratch =
+        IsUnboxedSignedIntegerConstant() ? kNoRegister : locs()->temp(0).reg();
+    EmitMoveToLocation(compiler, locs()->out(0), scratch);
   }
 }
 
@@ -490,20 +529,34 @@
   }
 }
 
-static Condition EmitSmiComparisonOp(FlowGraphCompiler* compiler,
-                                     LocationSummary* locs,
-                                     Token::Kind kind) {
+static Condition EmitInt64ComparisonOp(FlowGraphCompiler* compiler,
+                                       LocationSummary* locs,
+                                       Token::Kind kind) {
   Location left = locs->in(0);
   Location right = locs->in(1);
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   Condition true_condition = TokenKindToSmiCondition(kind);
+  if (left.IsConstant() || right.IsConstant()) {
+    // Ensure constant is on the right.
+    ConstantInstr* right_constant = NULL;
+    if (left.IsConstant()) {
+      right_constant = left.constant_instruction();
+      Location tmp = right;
+      right = left;
+      left = tmp;
+      true_condition = FlipCondition(true_condition);
+    } else {
+      right_constant = right.constant_instruction();
+    }
 
-  if (left.IsConstant()) {
-    __ CompareObject(right.reg(), left.constant());
-    true_condition = FlipCondition(true_condition);
-  } else if (right.IsConstant()) {
-    __ CompareObject(left.reg(), right.constant());
+    if (right_constant->IsUnboxedSignedIntegerConstant()) {
+      __ CompareImmediate(
+          left.reg(), right_constant->GetUnboxedSignedIntegerConstantValue());
+    } else {
+      ASSERT(right_constant->representation() == kTagged);
+      __ CompareObject(left.reg(), right.constant());
+    }
   } else {
     __ CompareRegisters(left.reg(), right.reg());
   }
@@ -522,7 +575,7 @@
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
-  if (operation_cid() == kSmiCid) {
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -578,8 +631,8 @@
 
 Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                    BranchLabels labels) {
-  if (operation_cid() == kSmiCid) {
-    return EmitSmiComparisonOp(compiler, locs(), kind());
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
+    return EmitInt64ComparisonOp(compiler, locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, locs(), labels, kind());
@@ -679,23 +732,27 @@
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
-  ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RegisterOrConstant(left()));
-  // Only one input can be a constant operand. The case of two constant
-  // operands should be handled by constant propagation.
-  summary->set_in(1, summary->in(0).IsConstant()
-                         ? Location::RequiresRegister()
-                         : Location::RegisterOrConstant(right()));
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RegisterOrConstant(left()));
+    // Only one input can be a constant operand. The case of two constant
+    // operands should be handled by constant propagation.
+    summary->set_in(1, summary->in(0).IsConstant()
+                           ? Location::RequiresRegister()
+                           : Location::RegisterOrConstant(right()));
+    summary->set_out(0, Location::RequiresRegister());
+    return summary;
+  }
+
+  UNREACHABLE();
+  return NULL;
 }
 
 Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                 BranchLabels labels) {
-  if (operation_cid() == kSmiCid) {
-    return EmitSmiComparisonOp(compiler, locs(), kind());
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
+    return EmitInt64ComparisonOp(compiler, locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, locs(), labels, kind());
@@ -2940,7 +2997,7 @@
 Condition CheckedSmiComparisonInstr::EmitComparisonCode(
     FlowGraphCompiler* compiler,
     BranchLabels labels) {
-  return EmitSmiComparisonOp(compiler, locs(), kind());
+  return EmitInt64ComparisonOp(compiler, locs(), kind());
 }
 
 #define EMIT_SMI_CHECK                                                         \
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index b839563..cb56455 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -12,6 +12,7 @@
 #include "vm/compiler/backend/locations.h"
 #include "vm/compiler/backend/locations_helpers.h"
 #include "vm/compiler/backend/range_analysis.h"
+#include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
 #include "vm/instructions.h"
@@ -180,6 +181,65 @@
   }
 }
 
+void ConstantInstr::EmitMoveToLocation(FlowGraphCompiler* compiler,
+                                       const Location& destination,
+                                       Register tmp) {
+  if (destination.IsRegister()) {
+    if (value_.IsSmi() && Smi::Cast(value_).Value() == 0) {
+      __ xorl(destination.reg(), destination.reg());
+    } else if (value_.IsSmi() && (representation() == kUnboxedInt32)) {
+      __ movl(destination.reg(), Immediate(Smi::Cast(value_).Value()));
+    } else {
+      ASSERT(representation() == kTagged);
+      __ LoadObjectSafely(destination.reg(), value_);
+    }
+  } else if (destination.IsFpuRegister()) {
+    const double value_as_double = Double::Cast(value_).value();
+    uword addr = FlowGraphBuilder::FindDoubleConstant(value_as_double);
+    if (addr == 0) {
+      __ pushl(EAX);
+      __ LoadObject(EAX, value_);
+      __ movsd(destination.fpu_reg(),
+               FieldAddress(EAX, Double::value_offset()));
+      __ popl(EAX);
+    } else if (Utils::DoublesBitEqual(value_as_double, 0.0)) {
+      __ xorps(destination.fpu_reg(), destination.fpu_reg());
+    } else {
+      __ movsd(destination.fpu_reg(), Address::Absolute(addr));
+    }
+  } else if (destination.IsDoubleStackSlot()) {
+    const double value_as_double = Double::Cast(value_).value();
+    uword addr = FlowGraphBuilder::FindDoubleConstant(value_as_double);
+    if (addr == 0) {
+      __ pushl(EAX);
+      __ LoadObject(EAX, value_);
+      __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
+      __ popl(EAX);
+    } else if (Utils::DoublesBitEqual(value_as_double, 0.0)) {
+      __ xorps(XMM0, XMM0);
+    } else {
+      __ movsd(XMM0, Address::Absolute(addr));
+    }
+    __ movsd(destination.ToStackSlotAddress(), XMM0);
+  } else {
+    ASSERT(destination.IsStackSlot());
+    if (value_.IsSmi() && representation() == kUnboxedInt32) {
+      __ movl(destination.ToStackSlotAddress(),
+              Immediate(Smi::Cast(value_).Value()));
+    } else {
+      if (Assembler::IsSafeSmi(value_) || value_.IsNull()) {
+        __ movl(destination.ToStackSlotAddress(),
+                Immediate(reinterpret_cast<int32_t>(value_.raw())));
+      } else {
+        __ pushl(EAX);
+        __ LoadObjectSafely(EAX, value_);
+        __ movl(destination.ToStackSlotAddress(), EAX);
+        __ popl(EAX);
+      }
+    }
+  }
+}
+
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
@@ -202,26 +262,7 @@
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-    switch (representation()) {
-      case kUnboxedDouble: {
-        XmmRegister result = locs()->out(0).fpu_reg();
-        if (constant_address() == 0) {
-          Register boxed = locs()->temp(0).reg();
-          __ LoadObjectSafely(boxed, value());
-          __ movsd(result, FieldAddress(boxed, Double::value_offset()));
-        } else if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
-          __ xorps(result, result);
-        } else {
-          __ movsd(result, Address::Absolute(constant_address()));
-        }
-        break;
-      }
-      case kUnboxedInt32:
-        __ movl(locs()->out(0).reg(), Immediate(Smi::Cast(value()).Value()));
-        break;
-      default:
-        UNREACHABLE();
-    }
+    EmitMoveToLocation(compiler, locs()->out(0));
   }
 }
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 3f4b9f4..5fcdd8e 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -282,17 +282,65 @@
   }
 }
 
+void ConstantInstr::EmitMoveToLocation(FlowGraphCompiler* compiler,
+                                       const Location& destination,
+                                       Register tmp) {
+  if (destination.IsRegister()) {
+    if (representation() == kUnboxedInt32 ||
+        representation() == kUnboxedInt64) {
+      const int64_t value = value_.IsSmi() ? Smi::Cast(value_).Value()
+                                           : Mint::Cast(value_).value();
+      if (value == 0) {
+        __ xorl(destination.reg(), destination.reg());
+      } else {
+        __ movq(destination.reg(), Immediate(value));
+      }
+    } else {
+      ASSERT(representation() == kTagged);
+      __ LoadObject(destination.reg(), value_);
+    }
+  } else if (destination.IsFpuRegister()) {
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
+      __ xorps(destination.fpu_reg(), destination.fpu_reg());
+    } else {
+      ASSERT(tmp != kNoRegister);
+      __ LoadObject(tmp, value_);
+      __ movsd(destination.fpu_reg(),
+               FieldAddress(tmp, Double::value_offset()));
+    }
+  } else if (destination.IsDoubleStackSlot()) {
+    if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
+      __ xorps(XMM0, XMM0);
+    } else {
+      ASSERT(tmp != kNoRegister);
+      __ LoadObject(tmp, value_);
+      __ movsd(XMM0, FieldAddress(tmp, Double::value_offset()));
+    }
+    __ movsd(destination.ToStackSlotAddress(), XMM0);
+  } else {
+    ASSERT(destination.IsStackSlot());
+    if (value_.IsSmi() && representation() == kUnboxedInt32) {
+      __ movl(destination.ToStackSlotAddress(),
+              Immediate(Smi::Cast(value_).Value()));
+    } else {
+      __ StoreObject(destination.ToStackSlotAddress(), value_);
+    }
+  }
+}
+
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 0;
+  const intptr_t kNumTemps = IsUnboxedSignedIntegerConstant() ? 0 : 1;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   switch (representation()) {
     case kUnboxedDouble:
       locs->set_out(0, Location::RequiresFpuRegister());
+      locs->set_temp(0, Location::RequiresRegister());
       break;
     case kUnboxedInt32:
+    case kUnboxedInt64:
       locs->set_out(0, Location::RequiresRegister());
       break;
     default:
@@ -305,24 +353,9 @@
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-    switch (representation()) {
-      case kUnboxedDouble: {
-        XmmRegister result = locs()->out(0).fpu_reg();
-        if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
-          __ xorps(result, result);
-        } else {
-          __ LoadObject(TMP, value());
-          __ movsd(result, FieldAddress(TMP, Double::value_offset()));
-        }
-        break;
-      }
-      case kUnboxedInt32:
-        __ movl(locs()->out(0).reg(),
-                Immediate(static_cast<int32_t>(Smi::Cast(value()).Value())));
-        break;
-      default:
-        UNREACHABLE();
-    }
+    const Register scratch =
+        IsUnboxedSignedIntegerConstant() ? kNoRegister : locs()->temp(0).reg();
+    EmitMoveToLocation(compiler, locs()->out(0), scratch);
   }
 }
 
@@ -421,15 +454,6 @@
 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
-  if (operation_cid() == kMintCid) {
-    const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new (zone)
-        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresRegister());
-    locs->set_in(1, Location::RequiresRegister());
-    locs->set_out(0, Location::RequiresRegister());
-    return locs;
-  }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
@@ -439,7 +463,7 @@
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
-  if (operation_cid() == kSmiCid) {
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -529,12 +553,26 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   Condition true_condition = TokenKindToIntCondition(kind);
+  if (left.IsConstant() || right.IsConstant()) {
+    // Ensure constant is on the right.
+    ConstantInstr* constant = NULL;
+    if (left.IsConstant()) {
+      constant = left.constant_instruction();
+      Location tmp = right;
+      right = left;
+      left = tmp;
+      true_condition = FlipCondition(true_condition);
+    } else {
+      constant = right.constant_instruction();
+    }
 
-  if (left.IsConstant()) {
-    __ CompareObject(right.reg(), left.constant());
-    true_condition = FlipCondition(true_condition);
-  } else if (right.IsConstant()) {
-    __ CompareObject(left.reg(), right.constant());
+    if (constant->IsUnboxedSignedIntegerConstant()) {
+      __ cmpq(left.reg(),
+              Immediate(constant->GetUnboxedSignedIntegerConstantValue()));
+    } else {
+      ASSERT(constant->representation() == kTagged);
+      __ CompareObject(left.reg(), right.constant());
+    }
   } else if (right.IsStackSlot()) {
     __ cmpq(left.reg(), right.ToStackSlotAddress());
   } else {
@@ -708,30 +746,26 @@
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
-  } else if (operation_cid() == kMintCid) {
+  }
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::RequiresRegister());
+    summary->set_in(0, Location::RegisterOrConstant(left()));
+    // Only one input can be a constant operand. The case of two constant
+    // operands should be handled by constant propagation.
+    summary->set_in(1, summary->in(0).IsConstant()
+                           ? Location::RequiresRegister()
+                           : Location::RegisterOrConstant(right()));
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
-  ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RegisterOrConstant(left()));
-  // Only one input can be a constant operand. The case of two constant
-  // operands should be handled by constant propagation.
-  summary->set_in(1, summary->in(0).IsConstant()
-                         ? Location::RequiresRegister()
-                         : Location::RegisterOrConstant(right()));
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
+  UNREACHABLE();
+  return NULL;
 }
 
 Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                 BranchLabels labels) {
-  if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) {
+  if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
     return EmitInt64ComparisonOp(compiler, *locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
@@ -5125,24 +5159,30 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrConstant(right()));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
 
 void BinaryInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register left = locs()->in(0).reg();
-  const Register right = locs()->in(1).reg();
-  const Register out = locs()->out(0).reg();
-
-  ASSERT(out == left);
-
   Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
   }
+  const Location left = locs()->in(0);
+  const Location right = locs()->in(1);
+  const Location out = locs()->out(0);
+  ASSERT(out.reg() == left.reg());
 
-  EmitInt64Arithmetic(compiler, op_kind(), left, right, deopt);
+  if (right.IsConstant()) {
+    ConstantInstr* constant_instr = right.constant_instruction();
+    const int64_t value =
+        constant_instr->GetUnboxedSignedIntegerConstantValue();
+    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), Immediate(value),
+                        deopt);
+  } else {
+    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), right.reg(), deopt);
+  }
 }
 
 LocationSummary* UnaryInt64OpInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 0e4cb55..5b2837a 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -832,15 +832,6 @@
       return false;
     }
 
-    if ((inliner_->precompiler_ != NULL) &&
-        inliner_->precompiler_->HasFeedback() &&
-        (function.usage_counter() <= 0) && !inliner_->AlwaysInline(function)) {
-      TRACE_INLINING(THR_Print("     Bailout: not compiled yet\n"));
-      PRINT_INLINING_TREE("Not compiled", &call_data->caller, &function,
-                          call_data->call);
-      return false;
-    }
-
     // Type feedback may have been cleared for this function (ClearICDataArray),
     // but we need it for inlining.
     if (!FLAG_precompiled_mode && (function.ic_data_array() == Array::null())) {
@@ -980,10 +971,6 @@
         if (FLAG_precompiled_mode) {
           Precompiler::PopulateWithICData(parsed_function->function(),
                                           callee_graph);
-          if (inliner_->precompiler_ != NULL) {
-            inliner_->precompiler_->TryApplyFeedback(
-                parsed_function->function(), callee_graph);
-          }
         }
 #endif
 
@@ -2216,10 +2203,6 @@
   }
 
   intptr_t inlining_depth_threshold = FLAG_inlining_depth_threshold;
-  if ((precompiler_ != NULL) && precompiler_->HasFeedback() &&
-      (top.usage_counter() <= 0)) {
-    inlining_depth_threshold = 1;
-  }
 
   CallSiteInliner inliner(this, inlining_depth_threshold);
   inliner.InlineCalls();
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index d83c8365..13adddf 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -226,6 +226,11 @@
       }
       if (++next_read_ == field) return;
     }
+    case kForwardingStubSuperTarget:
+      if (builder_->ReadTag() == kSomething) {
+        forwarding_stub_super_target_ = builder_->ReadCanonicalNameReference();
+      }
+      if (++next_read_ == field) return;
     case kFunction:
       if (builder_->ReadTag() == kSomething)
         builder_->SkipFunctionNode();  // read function node.
@@ -3437,7 +3442,7 @@
   }
 }
 
-void StreamingFlowGraphBuilder::ReadUntilFunctionNode() {
+void StreamingFlowGraphBuilder::ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub) {
   const Tag tag = PeekTag();
   if (tag == kProcedure) {
     ProcedureHelper procedure_helper(this);
@@ -3446,7 +3451,12 @@
       // Running a procedure without a function node doesn't make sense.
       UNREACHABLE();
     }
-    return;
+    if (set_forwarding_stub != NULL && flow_graph_builder_ && procedure_helper.IsForwardingStub() &&
+        !procedure_helper.IsAbstract()) {
+      ASSERT(procedure_helper.forwarding_stub_super_target_ != -1);
+      set_forwarding_stub->MarkForwardingStub(
+          procedure_helper.forwarding_stub_super_target_);
+    }
     // Now at start of FunctionNode.
   } else if (tag == kConstructor) {
     ConstructorHelper constructor_helper(this);
@@ -3460,7 +3470,6 @@
     H.ReportError("Unsupported tag at this point: %d.", tag);
     UNREACHABLE();
   }
-  return;
 }
 
 StringIndex StreamingFlowGraphBuilder::GetNameFromVariableDeclaration(
@@ -4095,13 +4104,35 @@
     AlternativeReadingScope _(reader_);
     SetOffset(type_parameters_offset);
 
+    const Function* forwarding_target = NULL;
+    if (parsed_function()->is_forwarding_stub()) {
+      NameIndex target_name = parsed_function()->forwarding_stub_super_target();
+      const String& name = dart_function.IsSetterFunction()
+                               ? H.DartSetterName(target_name)
+                               : H.DartProcedureName(target_name);
+      forwarding_target =
+          &Function::ZoneHandle(Z, LookupMethodByMember(target_name, name));
+      ASSERT(!forwarding_target->IsNull());
+    }
+
     // Type parameters
     intptr_t list_length = ReadListLength();
+    TypeArguments& forwarding_params = TypeArguments::Handle(Z);
+    if (forwarding_target != NULL) {
+        forwarding_params = forwarding_target->type_parameters();
+        ASSERT(forwarding_params.Length() == list_length);
+    }
+    TypeParameter& forwarding_param = TypeParameter::Handle(Z);
     for (intptr_t i = 0; i < list_length; ++i) {
       ReadFlags();                                         // skip flags
       SkipListOfExpressions();                             // skip annotations
       String& name = H.DartSymbol(ReadStringReference());  // read name
-      const AbstractType& bound = T.BuildType();           // read bound
+      AbstractType& bound = T.BuildType();                 // read bound
+
+      if (forwarding_target != NULL) {
+        forwarding_param ^= forwarding_params.TypeAt(i);
+        bound = forwarding_param.bound();
+      }
 
       if (I->strong() && !bound.IsObjectType() &&
           (I->reify_generic_functions() || dart_function.IsFactory())) {
@@ -4126,10 +4157,20 @@
 
     // Positional.
     list_length = ReadListLength();
+    const intptr_t positional_length = list_length;
+    const intptr_t kFirstParameterOffset = 1;
     for (intptr_t i = 0; i < list_length; ++i) {
       // ith variable offset.
-      body += LoadLocal(LookupVariable(ReaderOffset() + data_program_offset_));
-      body += CheckArgumentType(ReaderOffset() + data_program_offset_);
+      const intptr_t offset = ReaderOffset();
+      LocalVariable* param = LookupVariable(offset + data_program_offset_);
+      const AbstractType* target_type = &param->type();
+      if (forwarding_target != NULL) {
+        // We add 1 to the parameter index to account for the receiver.
+        target_type = &AbstractType::ZoneHandle(Z,
+            forwarding_target->ParameterTypeAt(kFirstParameterOffset + i));
+      }
+      body += LoadLocal(param);
+      body += CheckArgumentType(param, *target_type);
       body += Drop();
       SkipVariableDeclaration();  // read ith variable.
     }
@@ -4138,8 +4179,16 @@
     list_length = ReadListLength();
     for (intptr_t i = 0; i < list_length; ++i) {
       // ith variable offset.
-      body += LoadLocal(LookupVariable(ReaderOffset() + data_program_offset_));
-      body += CheckArgumentType(ReaderOffset() + data_program_offset_);
+      LocalVariable* param =
+          LookupVariable(ReaderOffset() + data_program_offset_);
+      body += LoadLocal(param);
+      const AbstractType* target_type = &param->type();
+      if (forwarding_target != NULL) {
+        // We add 1 to the parameter index to account for the receiver.
+        target_type = &AbstractType::ZoneHandle(Z,
+            forwarding_target->ParameterTypeAt(positional_length + i + 1));
+      }
+      body += CheckArgumentType(param, *target_type);
       body += Drop();
       SkipVariableDeclaration();  // read ith variable.
     }
@@ -4343,14 +4392,14 @@
     case RawFunction::kRegularFunction:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction: {
-      ReadUntilFunctionNode();  // read until function node.
+      ReadUntilFunctionNode(parsed_function());  // read until function node.
       if (function.IsImplicitClosureFunction()) {
         return BuildGraphOfImplicitClosureFunction(function);
       }
       return BuildGraphOfFunction(false);
     }
     case RawFunction::kConstructor: {
-      ReadUntilFunctionNode();  // read until function node.
+      ReadUntilFunctionNode(parsed_function());  // read until function node.
       return BuildGraphOfFunction(!function.IsFactory());
     }
     case RawFunction::kImplicitGetter:
@@ -5752,10 +5801,9 @@
 }
 
 Fragment StreamingFlowGraphBuilder::CheckArgumentType(
-    intptr_t variable_kernel_position) {
-  LocalVariable* variable = LookupVariable(variable_kernel_position);
-  return flow_graph_builder_->CheckAssignable(variable->type(),
-                                              variable->name());
+    LocalVariable* variable,
+    const AbstractType& type) {
+  return flow_graph_builder_->CheckAssignable(type, variable->name());
 }
 
 Fragment StreamingFlowGraphBuilder::CheckTypeArgumentBound(
@@ -9432,14 +9480,16 @@
         temp_instance_ = Instance::New(temp_class_, Heap::kOld);
 
         const intptr_t number_of_type_arguments = builder_.ReadUInt();
-        if (number_of_type_arguments > 0) {
+        if (temp_class_.NumTypeArguments() > 0) {
           temp_type_arguments_ =
               TypeArguments::New(number_of_type_arguments, Heap::kOld);
           for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
             temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
           }
-          InstantiateTypeArguments(list_class, &temp_type_arguments_);
+          InstantiateTypeArguments(temp_class_, &temp_type_arguments_);
           temp_instance_.SetTypeArguments(temp_type_arguments_);
+        } else {
+          ASSERT(number_of_type_arguments == 0);
         }
 
         const intptr_t number_of_fields = builder_.ReadUInt();
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index c3da1c1..96d73be 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -245,6 +245,7 @@
     kName,
     kSourceUriIndex,
     kAnnotations,
+    kForwardingStubSuperTarget,
     kFunction,
     kEnd,
   };
@@ -262,6 +263,7 @@
     kAbstract = 1 << 1,
     kExternal = 1 << 2,
     kConst = 1 << 3,  // Only for external const factories.
+    kForwardingStub = 1 << 4,
   };
 
   explicit ProcedureHelper(StreamingFlowGraphBuilder* builder) {
@@ -282,6 +284,7 @@
   bool IsAbstract() { return (flags_ & kAbstract) != 0; }
   bool IsExternal() { return (flags_ & kExternal) != 0; }
   bool IsConst() { return (flags_ & kConst) != 0; }
+  bool IsForwardingStub() { return (flags_ & kForwardingStub) != 0; }
 
   NameIndex canonical_name_;
   TokenPosition position_;
@@ -291,6 +294,9 @@
   intptr_t source_uri_index_;
   intptr_t annotation_count_;
 
+  // Only valid if the 'isForwardingStub' flag is set.
+  NameIndex forwarding_stub_super_target_;
+
  private:
   StreamingFlowGraphBuilder* builder_;
   intptr_t next_read_;
@@ -927,7 +933,11 @@
   String& GetSourceFor(intptr_t index);
   RawTypedData* GetLineStartsFor(intptr_t index);
   void SetOffset(intptr_t offset);
-  void ReadUntilFunctionNode();
+
+  // If a 'ParsedFunction' is provided for 'set_forwarding_stub', this method
+  // will attach the forwarding stub target reference to the parsed function if
+  // it crosses a procedure node for a concrete forwarding stub.
+  void ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub = NULL);
   intptr_t ReadListLength();
 
   enum DispatchCategory { Interface, ViaThis, Closure, DynamicDispatch };
@@ -954,6 +964,7 @@
   Fragment BuildInitializers(const Class& parent_class);
   FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
   FlowGraph* BuildGraphOfFunction(bool constructor);
+  FlowGraph* BuildGraphOfForwardingStub(const Function& function);
 
   intptr_t GetOffsetForSourceInfo(intptr_t index);
 
@@ -1142,7 +1153,7 @@
   Fragment CheckBooleanInCheckedMode();
   Fragment CheckAssignableInCheckedMode(const AbstractType& dst_type,
                                         const String& dst_name);
-  Fragment CheckArgumentType(intptr_t variable_kernel_position);
+  Fragment CheckArgumentType(LocalVariable* variable, const AbstractType& type);
   Fragment CheckTypeArgumentBound(const AbstractType& parameter,
                                   const AbstractType& bound,
                                   const String& dst_name);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index df541f8..acc162c 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6339,162 +6339,6 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-DART_EXPORT
-Dart_Handle Dart_SaveJITFeedback(uint8_t** buffer, intptr_t* buffer_length) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("No JIT feedback to save on an AOT runtime.");
-#elif defined(PRODUCT)
-  // TOOD(rmacnak): We'd need to include the JSON printing code again.
-  return Api::NewError("Dart_SaveJITFeedback not supported in PRODUCT mode.");
-#else
-  Thread* thread = Thread::Current();
-  DARTSCOPE(thread);
-  Isolate* isolate = thread->isolate();
-  Zone* zone = thread->zone();
-
-  if (buffer == NULL) {
-    RETURN_NULL_ERROR(buffer);
-  }
-  if (buffer_length == NULL) {
-    RETURN_NULL_ERROR(buffer_length);
-  }
-
-  JSONStream js_stream;
-  {
-    JSONObject js_profile(&js_stream);
-    js_profile.AddProperty("vmVersion", Version::CommitString());
-    js_profile.AddProperty("asserts", FLAG_enable_asserts);
-    js_profile.AddProperty("typeChecks", FLAG_enable_type_checks);
-
-    {
-      JSONArray js_scripts(&js_profile, "scripts");
-
-      const GrowableObjectArray& libraries = GrowableObjectArray::Handle(
-          zone, isolate->object_store()->libraries());
-      Library& library = Library::Handle(zone);
-      Array& scripts = Array::Handle(zone);
-      Script& script = Script::Handle(zone);
-      String& uri = String::Handle(zone);
-      for (intptr_t i = 0; i < libraries.Length(); i++) {
-        library ^= libraries.At(i);
-        scripts = library.LoadedScripts();
-        for (intptr_t j = 0; j < scripts.Length(); j++) {
-          script ^= scripts.At(j);
-          JSONObject js_script(&js_scripts);
-          uri = script.url();
-          js_script.AddProperty("uri", uri.ToCString());
-          int64_t fp = script.SourceFingerprint();
-          js_script.AddProperty64("checksum", fp);
-        }
-      }
-    }
-
-    {
-      JSONArray js_classes(&js_profile, "classes");
-
-      ClassTable* classes = isolate->class_table();
-      Class& cls = Class::Handle(zone);
-      Library& library = Library::Handle(zone);
-      String& uri = String::Handle(zone);
-      String& name = String::Handle(zone);
-      for (intptr_t cid = kNumPredefinedCids; cid < classes->NumCids(); cid++) {
-        if (!classes->HasValidClassAt(cid)) continue;
-        cls ^= classes->At(cid);
-        library = cls.library();
-        JSONObject js_class(&js_classes);
-        js_class.AddProperty("cid", cid);
-        uri = library.url();
-        js_class.AddProperty("uri", uri.ToCString());
-        name = cls.Name();
-        name = String::RemovePrivateKey(name);
-        js_class.AddProperty("name", name.ToCString());
-      }
-    }
-
-    {
-      JSONArray js_functions(&js_profile, "functions");
-
-      class JITFeedbackFunctionVisitor : public FunctionVisitor {
-       public:
-        JITFeedbackFunctionVisitor(JSONArray* js_functions, Zone* zone)
-            : js_functions_(js_functions),
-              function_(Function::Handle(zone)),
-              owner_(Class::Handle(zone)),
-              name_(String::Handle(zone)),
-              ic_datas_(Array::Handle(zone)),
-              ic_data_(ICData::Handle(zone)),
-              entry_(Object::Handle(zone)) {}
-
-        void Visit(const Function& function) {
-          if (function.usage_counter() == 0) return;
-
-          JSONObject js_function(js_functions_);
-          name_ = function.name();
-          name_ = String::RemovePrivateKey(name_);
-          js_function.AddProperty("name", name_.ToCString());
-          owner_ ^= function.Owner();
-          js_function.AddProperty("class", owner_.id());
-          js_function.AddProperty("tokenPos", function.token_pos().value());
-          js_function.AddProperty("kind",
-                                  static_cast<intptr_t>(function.kind()));
-          intptr_t usage = function.usage_counter();
-          if (usage < 0) {
-            // Function was in the background compiler's queue.
-            usage = FLAG_optimization_counter_threshold;
-          }
-          js_function.AddProperty("usageCounter", usage);
-
-          ic_datas_ = function.ic_data_array();
-          JSONArray js_icdatas(&js_function, "ics");
-          if (ic_datas_.IsNull()) return;
-
-          for (intptr_t j = 0; j < ic_datas_.Length(); j++) {
-            entry_ = ic_datas_.At(j);
-            if (!entry_.IsICData()) continue;  // Skip edge counters.
-            ic_data_ ^= entry_.raw();
-
-            JSONObject js_icdata(&js_icdatas);
-            js_icdata.AddProperty("deoptId", ic_data_.deopt_id());
-            name_ = ic_data_.target_name();
-            name_ = String::RemovePrivateKey(name_);
-            js_icdata.AddProperty("selector", name_.ToCString());
-            js_icdata.AddProperty("isStaticCall", ic_data_.is_static_call());
-            intptr_t num_args_checked = ic_data_.NumArgsTested();
-            js_icdata.AddProperty("argsTested", num_args_checked);
-            JSONArray js_entries(&js_icdata, "entries");
-            const intptr_t number_of_checks = ic_data_.NumberOfChecks();
-            for (intptr_t check = 0; check < number_of_checks; check++) {
-              GrowableArray<intptr_t> class_ids(num_args_checked);
-              ic_data_.GetClassIdsAt(check, &class_ids);
-              for (intptr_t k = 0; k < num_args_checked; k++) {
-                ASSERT(class_ids[k] != kIllegalCid);
-                js_entries.AddValue(class_ids[k]);
-              }
-              js_entries.AddValue(ic_data_.GetCountAt(check));
-            }
-          }
-        }
-
-       private:
-        JSONArray* js_functions_;
-        Function& function_;
-        Class& owner_;
-        String& name_;
-        Array& ic_datas_;
-        ICData& ic_data_;
-        Object& entry_;
-      };
-
-      JITFeedbackFunctionVisitor visitor(&js_functions, zone);
-      ProgramVisitor::VisitFunctions(&visitor);
-    }
-  }
-
-  js_stream.Steal(reinterpret_cast<char**>(buffer), buffer_length);
-  return Api::Success();
-#endif
-}
-
 DART_EXPORT Dart_Handle Dart_SortClasses() {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
@@ -6512,9 +6356,7 @@
 }
 
 DART_EXPORT Dart_Handle
-Dart_Precompile(Dart_QualifiedFunctionName entry_points[],
-                uint8_t* jit_feedback,
-                intptr_t jit_feedback_length) {
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[]) {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("AOT compilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
@@ -6533,8 +6375,7 @@
     return result;
   }
   CHECK_CALLBACK_STATE(T);
-  const Error& error = Error::Handle(
-      Precompiler::CompileAll(entry_points, jit_feedback, jit_feedback_length));
+  const Error& error = Error::Handle(Precompiler::CompileAll(entry_points));
   if (!error.IsNull()) {
     return Api::NewHandle(T, error.raw());
   }
diff --git a/runtime/vm/freelist.cc b/runtime/vm/freelist.cc
index 6143580..6e5dded 100644
--- a/runtime/vm/freelist.cc
+++ b/runtime/vm/freelist.cc
@@ -77,9 +77,8 @@
   if ((index != kNumLists) && free_map_.Test(index)) {
     FreeListElement* element = DequeueElement(index);
     if (is_protected) {
-      bool status = VirtualMemory::Protect(reinterpret_cast<void*>(element),
-                                           size, VirtualMemory::kReadWrite);
-      ASSERT(status);
+      VirtualMemory::Protect(reinterpret_cast<void*>(element), size,
+                             VirtualMemory::kReadWrite);
     }
     return reinterpret_cast<uword>(element);
   }
@@ -99,10 +98,8 @@
         intptr_t remainder_size = element->Size() - size;
         intptr_t region_size =
             size + FreeListElement::HeaderSizeFor(remainder_size);
-        bool status =
-            VirtualMemory::Protect(reinterpret_cast<void*>(element),
-                                   region_size, VirtualMemory::kReadWrite);
-        ASSERT(status);
+        VirtualMemory::Protect(reinterpret_cast<void*>(element), region_size,
+                               VirtualMemory::kReadWrite);
       }
       SplitElementAfterAndEnqueue(element, size, is_protected);
       return reinterpret_cast<uword>(element);
@@ -132,10 +129,8 @@
         // Make the allocated block and the header of the remainder element
         // writable.  The remainder will be non-writable if necessary after
         // the call to SplitElementAfterAndEnqueue.
-        bool status =
-            VirtualMemory::Protect(reinterpret_cast<void*>(current),
-                                   region_size, VirtualMemory::kReadWrite);
-        ASSERT(status);
+        VirtualMemory::Protect(reinterpret_cast<void*>(current), region_size,
+                               VirtualMemory::kReadWrite);
       }
 
       if (previous == NULL) {
@@ -155,17 +150,13 @@
               !VirtualMemory::InSamePage(target_address, writable_end);
         }
         if (target_is_protected) {
-          bool status =
-              VirtualMemory::Protect(reinterpret_cast<void*>(target_address),
-                                     kWordSize, VirtualMemory::kReadWrite);
-          ASSERT(status);
+          VirtualMemory::Protect(reinterpret_cast<void*>(target_address),
+                                 kWordSize, VirtualMemory::kReadWrite);
         }
         previous->set_next(current->next());
         if (target_is_protected) {
-          bool status =
-              VirtualMemory::Protect(reinterpret_cast<void*>(target_address),
-                                     kWordSize, VirtualMemory::kReadExecute);
-          ASSERT(status);
+          VirtualMemory::Protect(reinterpret_cast<void*>(target_address),
+                                 kWordSize, VirtualMemory::kReadExecute);
         }
       }
       SplitElementAfterAndEnqueue(current, size, is_protected);
@@ -366,10 +357,8 @@
   // remainder element will be protected when the allocated one is).
   if (is_protected &&
       !VirtualMemory::InSamePage(remainder_address - 1, remainder_address)) {
-    bool status =
-        VirtualMemory::Protect(reinterpret_cast<void*>(remainder_address),
-                               remainder_size, VirtualMemory::kReadExecute);
-    ASSERT(status);
+    VirtualMemory::Protect(reinterpret_cast<void*>(remainder_address),
+                           remainder_size, VirtualMemory::kReadExecute);
   }
 }
 
diff --git a/runtime/vm/freelist_test.cc b/runtime/vm/freelist_test.cc
index 689b7df..63137f1 100644
--- a/runtime/vm/freelist_test.cc
+++ b/runtime/vm/freelist_test.cc
@@ -11,9 +11,8 @@
 static uword Allocate(FreeList* free_list, intptr_t size, bool is_protected) {
   uword result = free_list->TryAllocate(size, is_protected);
   if (result && is_protected) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(result), size,
-                                         VirtualMemory::kReadExecute);
-    ASSERT(status);
+    VirtualMemory::Protect(reinterpret_cast<void*>(result), size,
+                           VirtualMemory::kReadExecute);
   }
   return result;
 }
@@ -23,15 +22,13 @@
                  intptr_t size,
                  bool is_protected) {
   if (is_protected) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
-                                         VirtualMemory::kReadWrite);
-    ASSERT(status);
+    VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
+                           VirtualMemory::kReadWrite);
   }
   free_list->Free(address, size);
   if (is_protected) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
-                                         VirtualMemory::kReadExecute);
-    ASSERT(status);
+    VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
+                           VirtualMemory::kReadExecute);
   }
 }
 
diff --git a/runtime/vm/json_parser.h b/runtime/vm/json_parser.h
deleted file mode 100644
index 6b254d6..0000000
--- a/runtime/vm/json_parser.h
+++ /dev/null
@@ -1,331 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef RUNTIME_VM_JSON_PARSER_H_
-#define RUNTIME_VM_JSON_PARSER_H_
-
-#include "vm/allocation.h"
-#include "vm/growable_array.h"
-#include "vm/zone.h"
-
-namespace dart {
-
-class ParsedJSONArray;
-
-class ParsedJSONValue : public ZoneAllocated {
- public:
-  virtual ~ParsedJSONValue() {}
-
-  virtual bool IsObject() const { return false; }
-  virtual bool IsArray() const { return false; }
-  virtual bool IsString() const { return false; }
-  virtual bool IsNumber() const { return false; }
-  virtual bool IsBoolean() const { return false; }
-  virtual bool IsError() const { return false; }
-};
-
-class ParsedJSONString : public ParsedJSONValue {
- public:
-  explicit ParsedJSONString(const char* value) : value_(value) {}
-  bool Equals(const char* other) { return strcmp(value_, other) == 0; }
-  const char* value() { return value_; }
-  virtual bool IsString() const { return true; }
-
- private:
-  const char* value_;
-};
-
-class ParsedJSONNumber : public ParsedJSONValue {
- public:
-  explicit ParsedJSONNumber(int64_t value) : value_(value) {}
-
-  int64_t value() { return value_; }
-  virtual bool IsNumber() const { return true; }
-
- private:
-  int64_t value_;
-};
-
-class ParsedJSONBoolean : public ParsedJSONValue {
- public:
-  explicit ParsedJSONBoolean(bool value) : value_(value) {}
-
-  bool value() { return value_; }
-  virtual bool IsBoolean() const { return true; }
-
- private:
-  bool value_;
-};
-
-class ParsedJSONNull : public ParsedJSONValue {
- public:
-  virtual bool IsNull() const { return true; }
-};
-
-class ParsedJSONObject : public ParsedJSONValue {
- public:
-  ParsedJSONObject(intptr_t length, ParsedJSONValue** keys_and_values)
-      : length_(length), keys_and_values_(keys_and_values) {}
-
-  ParsedJSONValue* At(const char* key) const {
-    for (intptr_t i = 0; i < length_; i += 2) {
-      ASSERT(keys_and_values_[i]->IsString());
-      ParsedJSONString* jskey =
-          static_cast<ParsedJSONString*>(keys_and_values_[i]);
-      if (jskey->Equals(key)) {
-        return keys_and_values_[i + 1];
-      }
-    }
-    return NULL;
-  }
-
-  virtual bool IsObject() const { return true; }
-
-  ParsedJSONNumber* NumberAt(const char* key) {
-    ParsedJSONValue* member = At(key);
-    if ((member == NULL) || !member->IsNumber()) {
-      return NULL;
-    }
-    return static_cast<ParsedJSONNumber*>(member);
-  }
-
-  ParsedJSONString* StringAt(const char* key) {
-    ParsedJSONValue* member = At(key);
-    if ((member == NULL) || !member->IsString()) {
-      return NULL;
-    }
-    return static_cast<ParsedJSONString*>(member);
-  }
-
-  ParsedJSONBoolean* BooleanAt(const char* key) {
-    ParsedJSONValue* member = At(key);
-    if ((member == NULL) || !member->IsBoolean()) {
-      return NULL;
-    }
-    return static_cast<ParsedJSONBoolean*>(member);
-  }
-
-  inline ParsedJSONArray* ArrayAt(const char* key);
-
- private:
-  intptr_t length_;
-  ParsedJSONValue** keys_and_values_;
-};
-
-class ParsedJSONArray : public ParsedJSONValue {
- public:
-  ParsedJSONArray(intptr_t length, ParsedJSONValue** elements)
-      : length_(length), elements_(elements) {}
-
-  ParsedJSONValue* At(intptr_t index) const {
-    ASSERT(index < length_);
-    return elements_[index];
-  }
-
-  intptr_t Length() const { return length_; }
-
-  virtual bool IsArray() const { return true; }
-
-  ParsedJSONObject* ObjectAt(intptr_t index) {
-    ParsedJSONValue* element = At(index);
-    if ((element == NULL) || !element->IsObject()) {
-      return NULL;
-    }
-    return static_cast<ParsedJSONObject*>(element);
-  }
-
-  ParsedJSONNumber* NumberAt(intptr_t index) {
-    ParsedJSONValue* element = At(index);
-    if ((element == NULL) || !element->IsNumber()) {
-      return NULL;
-    }
-    return static_cast<ParsedJSONNumber*>(element);
-  }
-
- private:
-  intptr_t length_;
-  ParsedJSONValue** elements_;
-};
-
-class ParsedJSONError : public ParsedJSONValue {
- public:
-  explicit ParsedJSONError(const char* message, intptr_t position)
-      : message_(message), position_(position) {}
-
-  virtual bool IsError() const { return true; }
-
-  const char* message() const { return message_; }
-  intptr_t position() const { return position_; }
-
- private:
-  const char* message_;
-  intptr_t position_;
-};
-
-class JSONParser {
- public:
-  JSONParser(const char* buffer, intptr_t length, Zone* zone)
-      : buffer_(buffer), position_(0), length_(length), zone_(zone) {}
-
-  ParsedJSONValue* ParseValue() {
-    ConsumeWhitespace();
-    if (Peek() == '\"') return ParseString();
-    if (IsDigitOrMinus(Peek())) return ParseNumber();
-    if (Peek() == '{') return ParseObject();
-    if (Peek() == '[') return ParseArray();
-    if (PeekAndConsume("true")) return new (zone_) ParsedJSONBoolean(true);
-    if (PeekAndConsume("false")) return new (zone_) ParsedJSONBoolean(false);
-    if (PeekAndConsume("null")) return new (zone_) ParsedJSONNull();
-    return Error("value expected");
-  }
-
- private:
-  intptr_t Available() const { return length_ - position_; }
-  char Peek() const {
-    if (position_ < length_) return buffer_[position_];
-    return 0;
-  }
-  char Consume() {
-    ASSERT(position_ < length_);
-    return buffer_[position_++];
-  }
-  bool PeekAndConsume(const char* expected) {
-    intptr_t n = strlen(expected);
-    if (Available() < n) return false;
-    if (strncmp(&buffer_[position_], expected, n) != 0) return false;
-    position_ += n;
-    return true;
-  }
-  void ConsumeWhitespace() {
-    while ((Available() > 0) && (buffer_[position_] < ' '))
-      position_++;
-  }
-  bool IsDigit(char c) { return c >= '0' && c <= '9'; }
-  bool IsDigitOrMinus(char c) { return (c == '-') || (c >= '0' && c <= '9'); }
-
-  ParsedJSONValue* ParseString() {
-    ConsumeWhitespace();
-    if (Peek() != '\"') return Error("string expected");
-    Consume();
-    intptr_t start = position_;
-    for (;;) {
-      if (Available() == 0) return Error("unterminated string");
-      if (Consume() == '\"') break;
-    }
-    intptr_t end = position_ - 1;
-
-    char* cstr = zone_->Alloc<char>(end - start + 1);
-    intptr_t dst_pos = 0;
-    for (intptr_t src_pos = start; src_pos < end; src_pos++) {
-      if (buffer_[src_pos] == '\\') {
-        src_pos++;
-      }
-      cstr[dst_pos++] = buffer_[src_pos];
-    }
-    cstr[dst_pos] = '\0';
-
-    return new (zone_) ParsedJSONString(cstr);
-  }
-
-  ParsedJSONValue* ParseNumber() {
-    ConsumeWhitespace();
-    bool negate = false;
-    if (Peek() == '-') {
-      Consume();
-      negate = true;
-    }
-    if (!IsDigit(Peek())) return Error("number expected");
-    int64_t value = 0;
-    for (;;) {
-      if (!IsDigit(Peek())) break;
-      char c = Consume();
-      value *= 10;
-      value += (c - '0');
-    }
-    if (negate) {
-      value = -value;
-    }
-    return new (zone_) ParsedJSONNumber(value);
-  }
-
-  ParsedJSONValue* ParseObject() {
-    ConsumeWhitespace();
-    if (Peek() != '{') return Error("object expected");
-    Consume();
-    ConsumeWhitespace();
-    if (Peek() == '}') return new (zone_) ParsedJSONObject(0, NULL);
-    ZoneGrowableArray<ParsedJSONValue*>* keys_and_values =
-        new (zone_) ZoneGrowableArray<ParsedJSONValue*>(zone_, 6);
-    for (;;) {
-      ParsedJSONValue* key = ParseString();
-      if (key->IsError()) return key;
-      ConsumeWhitespace();
-      if (Consume() != ':') return Error(": expected");
-      ConsumeWhitespace();
-      ParsedJSONValue* value = ParseValue();
-      if (value->IsError()) return value;
-      ConsumeWhitespace();
-
-      keys_and_values->Add(key);
-      keys_and_values->Add(value);
-
-      char c = Consume();
-      if (c == '}') break;
-      if (c != ',') return Error(", expected (object)");
-      ConsumeWhitespace();
-    }
-
-    return new (zone_)
-        ParsedJSONObject(keys_and_values->length(), keys_and_values->data());
-  }
-
-  ParsedJSONValue* ParseArray() {
-    ConsumeWhitespace();
-    if (Peek() != '[') return Error("array expected");
-    Consume();
-    ConsumeWhitespace();
-    if (Peek() == ']') {
-      Consume();
-      return new (zone_) ParsedJSONArray(0, NULL);
-    }
-    ZoneGrowableArray<ParsedJSONValue*>* elements =
-        new (zone_) ZoneGrowableArray<ParsedJSONValue*>(zone_, 6);
-    for (;;) {
-      ParsedJSONValue* element = ParseValue();
-      if (element->IsError()) return element;
-      ConsumeWhitespace();
-
-      elements->Add(element);
-
-      char c = Consume();
-      if (c == ']') break;
-      if (c != ',') return Error(", expected (array)");
-      ConsumeWhitespace();
-    }
-
-    return new (zone_) ParsedJSONArray(elements->length(), elements->data());
-  }
-
- private:
-  ParsedJSONError* Error(const char* message) {
-    return new (zone_) ParsedJSONError(message, position_);
-  }
-
-  const char* const buffer_;
-  intptr_t position_;
-  intptr_t length_;
-  Zone* zone_;
-};
-
-ParsedJSONArray* ParsedJSONObject::ArrayAt(const char* key) {
-  ParsedJSONValue* member = At(key);
-  if ((member == NULL) || !member->IsArray()) {
-    return NULL;
-  }
-  return static_cast<ParsedJSONArray*>(member);
-}
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_JSON_PARSER_H_
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 1452e5c..30fe483 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -5,7 +5,6 @@
 #ifndef RUNTIME_VM_KERNEL_H_
 #define RUNTIME_VM_KERNEL_H_
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
 #include "platform/assert.h"
 #include "vm/allocation.h"
 #include "vm/globals.h"
@@ -14,6 +13,22 @@
 #include "vm/token_position.h"
 
 namespace dart {
+namespace kernel {
+class NameIndex {
+ public:
+  NameIndex() : value_(-1) {}
+  explicit NameIndex(int value) : value_(value) {}
+
+  operator int() const { return value_; }
+
+ private:
+  int value_;
+};
+} // kernel
+} // dart
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+namespace dart {
 
 class Field;
 class ParsedFunction;
@@ -34,17 +49,6 @@
   int value_;
 };
 
-class NameIndex {
- public:
-  NameIndex() : value_(-1) {}
-  explicit NameIndex(int value) : value_(value) {}
-
-  operator int() const { return value_; }
-
- private:
-  int value_;
-};
-
 const uint8_t kNativeYieldFlags = 0x2;
 
 enum LogicalOperator { kAnd, kOr };
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 99454e3..c8344d0 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9350,6 +9350,9 @@
 RawString* Script::Source() const {
   String& source = String::Handle(raw_ptr()->source_);
   if (source.IsNull()) {
+    if (kind() == RawScript::kKernelTag) {
+      return String::null();
+    }
     return GenerateSource();
   }
   return raw_ptr()->source_;
@@ -14530,10 +14533,8 @@
 
     if (FLAG_write_protect_code) {
       uword address = RawObject::ToAddr(instrs.raw());
-      bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                                           instrs.raw()->Size(),
-                                           VirtualMemory::kReadExecute);
-      ASSERT(status);
+      VirtualMemory::Protect(reinterpret_cast<void*>(address),
+                             instrs.raw()->Size(), VirtualMemory::kReadExecute);
     }
   }
   code.set_comments(assembler->GetCodeComments());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 5b9fdea..235b297 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -128,7 +128,7 @@
     return reinterpret_cast<const object&>(obj);                               \
   }                                                                            \
   static Raw##object* RawCast(RawObject* raw) {                                \
-    ASSERT(Object::Handle(raw).Is##object());                                  \
+    ASSERT(Object::Handle(raw).IsNull() || Object::Handle(raw).Is##object());  \
     return reinterpret_cast<Raw##object*>(raw);                                \
   }                                                                            \
   static Raw##object* null() {                                                 \
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 55e90f3..4fce257 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -156,8 +156,7 @@
   } else {
     prot = VirtualMemory::kReadWrite;
   }
-  bool status = memory_->Protect(prot);
-  ASSERT(status);
+  memory_->Protect(prot);
 }
 
 // The initial estimate of how many words we can mark per microsecond (usage
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index ad9283e..12d0557 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -190,6 +190,15 @@
 
   void record_await() { have_seen_await_expr_ = true; }
   bool have_seen_await() const { return have_seen_await_expr_; }
+  bool is_forwarding_stub() const {
+    return forwarding_stub_super_target_ != -1;
+  }
+  kernel::NameIndex forwarding_stub_super_target() const {
+    return forwarding_stub_super_target_;
+  }
+  void MarkForwardingStub(kernel::NameIndex target) {
+    forwarding_stub_super_target_ = target;
+  }
 
   Thread* thread() const { return thread_; }
   Isolate* isolate() const { return thread_->isolate(); }
@@ -235,6 +244,7 @@
   int num_stack_locals_;
   bool have_seen_await_expr_;
 
+  kernel::NameIndex forwarding_stub_super_target_;
   kernel::ScopeBuildingResult* kernel_scopes_;
 
   friend class Parser;
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 723c071..f918b24 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -321,9 +321,8 @@
 
 void SemiSpace::WriteProtect(bool read_only) {
   if (reserved_ != NULL) {
-    bool success = reserved_->Protect(read_only ? VirtualMemory::kReadOnly
-                                                : VirtualMemory::kReadWrite);
-    ASSERT(success);
+    reserved_->Protect(read_only ? VirtualMemory::kReadOnly
+                                 : VirtualMemory::kReadWrite);
   }
 }
 
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index 6e23292..62dbcbb 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -34,8 +34,8 @@
   bool Contains(uword addr) const { return region_.Contains(addr); }
 
   // Changes the protection of the virtual memory area.
-  static bool Protect(void* address, intptr_t size, Protection mode);
-  bool Protect(Protection mode) { return Protect(address(), size(), mode); }
+  static void Protect(void* address, intptr_t size, Protection mode);
+  void Protect(Protection mode) { return Protect(address(), size(), mode); }
 
   // Reserves and commits a virtual memory segment with size. If a segment of
   // the requested size cannot be allocated, NULL is returned.
diff --git a/runtime/vm/virtual_memory_android.cc b/runtime/vm/virtual_memory_android.cc
index 06989ea..5f0b0de 100644
--- a/runtime/vm/virtual_memory_android.cc
+++ b/runtime/vm/virtual_memory_android.cc
@@ -7,13 +7,15 @@
 
 #include "vm/virtual_memory.h"
 
-#include <sys/mman.h>  // NOLINT
-#include <unistd.h>    // NOLINT
+#include <errno.h>
+#include <sys/mman.h>
+#include <unistd.h>
 
 #include "platform/assert.h"
 #include "platform/utils.h"
 
 #include "vm/isolate.h"
+#include "vm/profiler.h"
 
 namespace dart {
 
@@ -34,7 +36,12 @@
   }
 
   if (munmap(address, size) != 0) {
-    FATAL("munmap failed\n");
+    int error = errno;
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
+    FATAL2("munmap error: %d (%s)", error,
+           Utils::StrError(error, error_buf, kBufferSize));
   }
 }
 
@@ -96,7 +103,7 @@
   return true;
 }
 
-bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
+void VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
   ASSERT(Thread::Current()->IsMutatorThread() ||
          Isolate::Current()->mutator_thread()->IsAtSafepoint());
   uword start_address = reinterpret_cast<uword>(address);
@@ -120,8 +127,15 @@
       prot = PROT_READ | PROT_WRITE | PROT_EXEC;
       break;
   }
-  return (mprotect(reinterpret_cast<void*>(page_address),
-                   end_address - page_address, prot) == 0);
+  if (mprotect(reinterpret_cast<void*>(page_address),
+               end_address - page_address, prot) != 0) {
+    int error = errno;
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
+    FATAL2("mprotect error: %d (%s)", error,
+           Utils::StrError(error, error_buf, kBufferSize));
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index bd7a486..fbcccb5 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -63,10 +63,11 @@
   status = zx_vmar_map(zx_vmar_root_self(), 0, vmo, 0, size, flags, &address);
   zx_handle_close(vmo);
   if (status != ZX_OK) {
-    LOG_ERR("zx_vmar_map(%ld, %ld, %u) failed: %s\n", offset, size, flags,
+    LOG_ERR("zx_vmar_map(%ld, %u) failed: %s\n", size, flags,
             zx_status_get_string(status));
     return NULL;
   }
+  LOG_INFO("zx_vmar_map(%ld, %u) success\n", size, flags);
 
   MemoryRegion region(reinterpret_cast<void*>(address), size);
   return new VirtualMemory(region, region);
@@ -99,7 +100,7 @@
   status = zx_vmar_map(vmar, 0u, vmo, 0u, allocated_size, flags, &base);
   zx_handle_close(vmo);
   if (status != ZX_OK) {
-    LOG_ERR("zx_vmar_map(%ld, %ld, %u) failed: %s\n", offset, size, flags,
+    LOG_ERR("zx_vmar_map(%ld, %u) failed: %s\n", size, flags,
             zx_status_get_string(status));
     return NULL;
   }
@@ -129,12 +130,16 @@
 }
 
 VirtualMemory::~VirtualMemory() {
-  if (vm_owns_region()) {
+  // Reserved region may be empty due to VirtualMemory::Truncate.
+  if (vm_owns_region() && reserved_.size() != 0) {
     zx_status_t status =
         zx_vmar_unmap(zx_vmar_root_self(), reserved_.start(), reserved_.size());
     if (status != ZX_OK) {
-      FATAL1("zx_vmar_unmap failed: %s\n", zx_status_get_string(status));
+      FATAL3("zx_vmar_unmap(%lx, %lx) failed: %s\n", reserved_.start(),
+             reserved_.size(), zx_status_get_string(status));
     }
+    LOG_INFO("zx_vmar_unmap(%lx, %lx) success\n", reserved_.start(),
+             reserved_.size());
   }
 }
 
@@ -142,13 +147,15 @@
   zx_status_t status = zx_vmar_unmap(
       zx_vmar_root_self(), reinterpret_cast<uintptr_t>(address), size);
   if (status != ZX_OK) {
-    LOG_ERR("zx_vmar_unmap failed: %s\n", zx_status_get_string(status));
+    LOG_ERR("zx_vmar_unmap(%p, %lx) failed: %s\n", address, size,
+            zx_status_get_string(status));
     return false;
   }
+  LOG_INFO("zx_vmar_unmap(%p, %lx) success\n", address, size);
   return true;
 }
 
-bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
+void VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
   ASSERT(Thread::Current()->IsMutatorThread() ||
          Isolate::Current()->mutator_thread()->IsAtSafepoint());
   const uword start_address = reinterpret_cast<uword>(address);
@@ -176,13 +183,11 @@
   zx_status_t status = zx_vmar_protect(zx_vmar_root_self(), page_address,
                                        end_address - page_address, prot);
   if (status != ZX_OK) {
-    LOG_ERR("zx_vmar_protect(%lx, %lx, %x) success: %s\n", page_address,
-            end_address - page_address, prot, zx_status_get_string(status));
-    return false;
+    FATAL3("zx_vmar_protect(%lx, %lx) failed: %s\n", page_address,
+           end_address - page_address, zx_status_get_string(status));
   }
   LOG_INFO("zx_vmar_protect(%lx, %lx, %x) success\n", page_address,
            end_address - page_address, prot);
-  return true;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory_linux.cc b/runtime/vm/virtual_memory_linux.cc
index 17def9c..f07eb8e 100644
--- a/runtime/vm/virtual_memory_linux.cc
+++ b/runtime/vm/virtual_memory_linux.cc
@@ -7,13 +7,15 @@
 
 #include "vm/virtual_memory.h"
 
-#include <sys/mman.h>  // NOLINT
-#include <unistd.h>    // NOLINT
+#include <errno.h>
+#include <sys/mman.h>
+#include <unistd.h>
 
 #include "platform/assert.h"
 #include "platform/utils.h"
 
 #include "vm/isolate.h"
+#include "vm/profiler.h"
 
 namespace dart {
 
@@ -34,7 +36,12 @@
   }
 
   if (munmap(address, size) != 0) {
-    FATAL("munmap failed\n");
+    int error = errno;
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
+    FATAL2("munmap error: %d (%s)", error,
+           Utils::StrError(error, error_buf, kBufferSize));
   }
 }
 
@@ -96,7 +103,7 @@
   return true;
 }
 
-bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
+void VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
   ASSERT(Thread::Current()->IsMutatorThread() ||
          Isolate::Current()->mutator_thread()->IsAtSafepoint());
   uword start_address = reinterpret_cast<uword>(address);
@@ -120,8 +127,15 @@
       prot = PROT_READ | PROT_WRITE | PROT_EXEC;
       break;
   }
-  return (mprotect(reinterpret_cast<void*>(page_address),
-                   end_address - page_address, prot) == 0);
+  if (mprotect(reinterpret_cast<void*>(page_address),
+               end_address - page_address, prot) != 0) {
+    int error = errno;
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
+    FATAL2("mprotect error: %d (%s)", error,
+           Utils::StrError(error, error_buf, kBufferSize));
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory_macos.cc b/runtime/vm/virtual_memory_macos.cc
index 8b8fc3f..dbb680e 100644
--- a/runtime/vm/virtual_memory_macos.cc
+++ b/runtime/vm/virtual_memory_macos.cc
@@ -7,13 +7,15 @@
 
 #include "vm/virtual_memory.h"
 
-#include <sys/mman.h>  // NOLINT
-#include <unistd.h>    // NOLINT
+#include <errno.h>
+#include <sys/mman.h>
+#include <unistd.h>
 
 #include "platform/assert.h"
 #include "platform/utils.h"
 
 #include "vm/isolate.h"
+#include "vm/profiler.h"
 
 namespace dart {
 
@@ -34,7 +36,12 @@
   }
 
   if (munmap(address, size) != 0) {
-    FATAL("munmap failed\n");
+    int error = errno;
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
+    FATAL2("munmap error: %d (%s)", error,
+           Utils::StrError(error, error_buf, kBufferSize));
   }
 }
 
@@ -96,7 +103,7 @@
   return true;
 }
 
-bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
+void VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
   ASSERT(Thread::Current()->IsMutatorThread() ||
          Isolate::Current()->mutator_thread()->IsAtSafepoint());
   uword start_address = reinterpret_cast<uword>(address);
@@ -120,8 +127,15 @@
       prot = PROT_READ | PROT_WRITE | PROT_EXEC;
       break;
   }
-  return (mprotect(reinterpret_cast<void*>(page_address),
-                   end_address - page_address, prot) == 0);
+  if (mprotect(reinterpret_cast<void*>(page_address),
+               end_address - page_address, prot) != 0) {
+    int error = errno;
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
+    FATAL2("mprotect error: %d (%s)", error,
+           Utils::StrError(error, error_buf, kBufferSize));
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory_test.cc b/runtime/vm/virtual_memory_test.cc
index cbe111c..7d725d0 100644
--- a/runtime/vm/virtual_memory_test.cc
+++ b/runtime/vm/virtual_memory_test.cc
@@ -4,6 +4,7 @@
 
 #include "vm/virtual_memory.h"
 #include "platform/assert.h"
+#include "vm/heap.h"
 #include "vm/unit_test.h"
 
 namespace dart {
@@ -49,6 +50,20 @@
   delete vm;
 }
 
+VM_UNIT_TEST_CASE(AllocateAlignedVirtualMemory) {
+  intptr_t kHeapPageSize = kPageSize;
+  intptr_t kVirtualPageSize = 4096;
+
+  intptr_t kIterations = kHeapPageSize / kVirtualPageSize;
+  for (intptr_t i = 0; i < kIterations; i++) {
+    VirtualMemory* vm = VirtualMemory::AllocateAligned(
+        kHeapPageSize, kHeapPageSize, false, NULL);
+    EXPECT(Utils::IsAligned(vm->start(), kHeapPageSize));
+    EXPECT_EQ(kHeapPageSize, vm->size());
+    delete vm;
+  }
+}
+
 VM_UNIT_TEST_CASE(FreeVirtualMemory) {
   // Reservations should always be handed back to OS upon destruction.
   const intptr_t kVirtualMemoryBlockSize = 10 * MB;
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index 81f7ff4..15329e6 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -78,7 +78,7 @@
   return false;
 }
 
-bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
+void VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
   ASSERT(Thread::Current()->IsMutatorThread() ||
          Isolate::Current()->mutator_thread()->IsAtSafepoint());
   uword start_address = reinterpret_cast<uword>(address);
@@ -103,9 +103,10 @@
       break;
   }
   DWORD old_prot = 0;
-  bool result = VirtualProtect(reinterpret_cast<void*>(page_address),
-                               end_address - page_address, prot, &old_prot);
-  return result;
+  if (VirtualProtect(reinterpret_cast<void*>(page_address),
+                     end_address - page_address, prot, &old_prot) == 0) {
+    FATAL1("VirtualProtect failed %d\n", GetLastError());
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index c108c21..c9b6306 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -137,7 +137,6 @@
   "isolate.h",
   "isolate_reload.cc",
   "isolate_reload.h",
-  "json_parser.h",
   "json_stream.cc",
   "json_stream.h",
   "json_writer.cc",
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 0a0dd08..665d4bd 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -565,7 +565,8 @@
   ]
   gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
   sources = [
-    "$gen_dir/ddc_sdk.dill",
+    "$gen_dir/kernel/ddc_sdk.dill",
+    # TODO(vsm): Remove post CFE.
     "$gen_dir/ddc_sdk.sum",
   ]
   outputs = [
@@ -573,6 +574,9 @@
   ]
 }
 
+# TODO(vsm): Remove the old non-CFE versions of the SDK once we've completed
+# DDC to Kernel (DDK) migration.
+
 # This rule copies DDC's JS SDK and require.js to lib/dev_compiler/amd.
 copy("copy_dev_compiler_js_amd") {
   visibility = [ ":copy_dev_compiler_js" ]
@@ -640,6 +644,73 @@
   ]
 }
 
+# This rule copies DDK's JS SDK and require.js to lib/dev_compiler/kernel/amd.
+copy("copy_dev_compiler_js_amd_kernel") {
+  visibility = [ ":copy_dev_compiler_js" ]
+  deps = [
+    "../utils/dartdevc:dartdevc_sdk_kernel_summary",
+  ]
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  sources = [
+    "$gen_dir/kernel/amd/dart_sdk.js",
+    "$gen_dir/kernel/amd/dart_sdk.js.map",
+    "../third_party/requirejs/require.js",
+  ]
+  outputs = [
+    "$root_out_dir/dart-sdk/lib/dev_compiler/kernel/amd/{{source_file_part}}",
+  ]
+}
+
+# This rule copies DDK's JS SDK to lib/dev_compiler/kernel/common.
+copy("copy_dev_compiler_js_common_kernel") {
+  visibility = [ ":copy_dev_compiler_js" ]
+  deps = [
+    "../utils/dartdevc:dartdevc_sdk_kernel_summary",
+  ]
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  sources = [
+    "$gen_dir/kernel/common/dart_sdk.js",
+    "$gen_dir/kernel/common/dart_sdk.js.map",
+    "../pkg/dev_compiler/lib/js/common/run.js",
+  ]
+  outputs = [
+    "$root_out_dir/dart-sdk/lib/dev_compiler/kernel/common/{{source_file_part}}",
+  ]
+}
+
+# This rule copies DDK's JS SDK to lib/dev_compiler/kernel/es6.
+copy("copy_dev_compiler_js_es6_kernel") {
+  visibility = [ ":copy_dev_compiler_js" ]
+  deps = [
+    "../utils/dartdevc:dartdevc_sdk_kernel_summary",
+  ]
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  sources = [
+    "$gen_dir/kernel/es6/dart_sdk.js",
+    "$gen_dir/kernel/es6/dart_sdk.js.map",
+  ]
+  outputs = [
+    "$root_out_dir/dart-sdk/lib/dev_compiler/kernel/es6/{{source_file_part}}",
+  ]
+}
+
+# This rule copies DDK's JS SDK to lib/dev_compiler/kernel/legacy.
+copy("copy_dev_compiler_js_legacy_kernel") {
+  visibility = [ ":copy_dev_compiler_js" ]
+  deps = [
+    "../utils/dartdevc:dartdevc_sdk_kernel_summary",
+  ]
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  sources = [
+    "$gen_dir/kernel/legacy/dart_sdk.js",
+    "$gen_dir/kernel/legacy/dart_sdk.js.map",
+    "../pkg/dev_compiler/lib/js/legacy/dart_library.js",
+  ]
+  outputs = [
+    "$root_out_dir/dart-sdk/lib/dev_compiler/kernel/legacy/{{source_file_part}}",
+  ]
+}
+
 # Copies all of the JS artifacts needed by DDC.
 group("copy_dev_compiler_js") {
   visibility = [
@@ -651,6 +722,10 @@
     ":copy_dev_compiler_js_common",
     ":copy_dev_compiler_js_es6",
     ":copy_dev_compiler_js_legacy",
+    ":copy_dev_compiler_js_amd_kernel",
+    ":copy_dev_compiler_js_common_kernel",
+    ":copy_dev_compiler_js_es6_kernel",
+    ":copy_dev_compiler_js_legacy_kernel",
   ]
 }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index b2603af..1f58cc4 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -6,8 +6,9 @@
 
 import 'dart:_js_embedded_names'
     show
-        DEFERRED_LIBRARY_URIS,
-        DEFERRED_LIBRARY_HASHES,
+        DEFERRED_LIBRARY_PARTS,
+        DEFERRED_PART_URIS,
+        DEFERRED_PART_HASHES,
         GET_TYPE_FROM_NAME,
         GET_ISOLATE_TAG,
         INITIALIZE_LOADED_HUNK,
@@ -3192,8 +3193,7 @@
 
 stringTypeCast(value) {
   if (value is String || value == null) return value;
-  // TODO(lrn): When reified types are available, pass value.class and String.
-  throw new CastErrorImplementation(Primitives.objectTypeName(value), 'String');
+  throw new CastErrorImplementation(value, 'String');
 }
 
 doubleTypeCheck(value) {
@@ -3204,7 +3204,7 @@
 
 doubleTypeCast(value) {
   if (value is double || value == null) return value;
-  throw new CastErrorImplementation(Primitives.objectTypeName(value), 'double');
+  throw new CastErrorImplementation(value, 'double');
 }
 
 numTypeCheck(value) {
@@ -3215,7 +3215,7 @@
 
 numTypeCast(value) {
   if (value is num || value == null) return value;
-  throw new CastErrorImplementation(Primitives.objectTypeName(value), 'num');
+  throw new CastErrorImplementation(value, 'num');
 }
 
 boolTypeCheck(value) {
@@ -3226,7 +3226,7 @@
 
 boolTypeCast(value) {
   if (value is bool || value == null) return value;
-  throw new CastErrorImplementation(Primitives.objectTypeName(value), 'bool');
+  throw new CastErrorImplementation(value, 'bool');
 }
 
 intTypeCheck(value) {
@@ -3237,7 +3237,7 @@
 
 intTypeCast(value) {
   if (value is int || value == null) return value;
-  throw new CastErrorImplementation(Primitives.objectTypeName(value), 'int');
+  throw new CastErrorImplementation(value, 'int');
 }
 
 void propertyTypeError(value, property) {
@@ -3247,9 +3247,8 @@
 
 void propertyTypeCastError(value, property) {
   // Cuts the property name to the class name.
-  String actualType = Primitives.objectTypeName(value);
   String expectedType = property.substring(3, property.length);
-  throw new CastErrorImplementation(actualType, expectedType);
+  throw new CastErrorImplementation(value, expectedType);
 }
 
 /**
@@ -3378,7 +3377,7 @@
 
 listTypeCast(value) {
   if (value is List || value == null) return value;
-  throw new CastErrorImplementation(Primitives.objectTypeName(value), 'List');
+  throw new CastErrorImplementation(value, 'List');
 }
 
 listSuperTypeCheck(value, property) {
@@ -3449,14 +3448,7 @@
   if (functionTypeTest(value, functionTypeRti)) return value;
 
   var self = runtimeTypeToString(functionTypeRti);
-  var functionTypeObject = extractFunctionTypeObjectFrom(value);
-  var pretty;
-  if (functionTypeObject != null) {
-    pretty = runtimeTypeToString(functionTypeObject);
-  } else {
-    pretty = Primitives.objectTypeName(value);
-  }
-  throw new CastErrorImplementation(pretty, self);
+  throw new CastErrorImplementation(value, self);
 }
 
 checkMalformedType(value, message) {
@@ -3485,12 +3477,10 @@
 class TypeErrorImplementation extends Error implements TypeError {
   final String message;
 
-  /**
-   * Normal type error caused by a failed subtype test.
-   */
+  /// Normal type error caused by a failed subtype test.
   TypeErrorImplementation(Object value, String type)
-      : message = "type '${Primitives.objectTypeName(value)}' is not a subtype "
-            "of type '$type'";
+      : message = "TypeError: ${Error.safeToString(value)}: "
+            "type '${_typeDescription(value)}' is not a subtype of type '$type'";
 
   TypeErrorImplementation.fromMessage(String this.message);
 
@@ -3502,16 +3492,25 @@
   // TODO(lrn): Rename to CastError (and move implementation into core).
   final String message;
 
-  /**
-   * Normal cast error caused by a failed type cast.
-   */
-  CastErrorImplementation(Object actualType, Object expectedType)
-      : message = "CastError: Casting value of type '$actualType' to"
-            " incompatible type '$expectedType'";
+  /// Normal cast error caused by a failed type cast.
+  CastErrorImplementation(Object value, Object type)
+      : message = "CastError: ${Error.safeToString(value)}: "
+            "type '${_typeDescription(value)}' is not a subtype of type '$type'";
 
   String toString() => message;
 }
 
+String _typeDescription(value) {
+  if (value is Closure) {
+    var functionTypeObject = extractFunctionTypeObjectFrom(value);
+    if (functionTypeObject != null) {
+      return runtimeTypeToString(functionTypeObject);
+    }
+    return 'Closure';
+  }
+  return Primitives.objectTypeName(value);
+}
+
 class FallThroughErrorImplementation extends FallThroughError {
   FallThroughErrorImplementation();
   String toString() => 'Switch case fall-through.';
@@ -3642,14 +3641,21 @@
 DeferredLoadCallback deferredLoadHook;
 
 Future<Null> loadDeferredLibrary(String loadId) {
-  // For each loadId there is a list of hunk-uris to load, and a corresponding
-  // list of hashes. These are stored in the app-global scope.
-  var urisMap = JS_EMBEDDED_GLOBAL('', DEFERRED_LIBRARY_URIS);
-  List<String> uris = JS('JSExtendableArray|Null', '#[#]', urisMap, loadId);
-  if (uris == null) return new Future.value(null);
-
-  var hashesMap = JS_EMBEDDED_GLOBAL('', DEFERRED_LIBRARY_HASHES);
-  List<String> hashes = JS('JSExtendableArray|Null', '#[#]', hashesMap, loadId);
+  // For each loadId there is a list of parts to load. The parts are represented
+  // by an index. There are two arrays, one that maps the index into a Uri and
+  // another that maps the index to a hash.
+  var partsMap = JS_EMBEDDED_GLOBAL('', DEFERRED_LIBRARY_PARTS);
+  List indexes = JS('JSExtendableArray|Null', '#[#]', partsMap, loadId);
+  if (indexes == null) return new Future.value(null);
+  List<String> uris = <String>[];
+  List<String> hashes = <String>[];
+  List index2uri = JS_EMBEDDED_GLOBAL('JSArray', DEFERRED_PART_URIS);
+  List index2hash = JS_EMBEDDED_GLOBAL('JSArray', DEFERRED_PART_HASHES);
+  for (int i = 0; i < indexes.length; i++) {
+    int index = JS('int', '#[#]', indexes, i);
+    uris.add(JS('String', '#[#]', index2uri, index));
+    hashes.add(JS('String', '#[#]', index2hash, index));
+  }
 
   int total = hashes.length;
   assert(total == uris.length);
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 5dd9ffd..e7d9bef 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -84,15 +84,15 @@
 
 getMangledTypeName(TypeImpl type) => type._typeName;
 
-/**
- * Sets the runtime type information on [target]. [rti] is a type
- * representation of type 4 or 5, that is, either a JavaScript array or
- * `null`.
- */
+/// Sets the runtime type information on [target]. [rti] is a type
+/// representation of type 4 or 5, that is, either a JavaScript array or `null`.
+///
+/// Called from generated code.
+///
+/// This is used only for marking JavaScript Arrays (JSArray) with the element
+/// type.
 // Don't inline.  Let the JS engine inline this.  The call expression is much
 // more compact that the inlined expansion.
-// TODO(sra): For most objects it would be better to initialize the type info as
-// a field in the constructor: http://dartbug.com/22676 .
 @NoInline()
 Object setRuntimeTypeInfo(Object target, var rti) {
   assert(rti == null || isJsArray(rti));
@@ -101,10 +101,10 @@
   return target;
 }
 
-/**
- * Returns the runtime type information of [target]. The returned value is a
- * list of type representations for the type arguments.
- */
+/// Returns the runtime type information of [target]. The returned value is a
+/// list of type representations for the type arguments.
+///
+/// Called from generated code.
 getRuntimeTypeInfo(Object target) {
   if (target == null) return null;
   String rtiName = JS_GET_NAME(JsGetName.RTI_NAME);
@@ -120,10 +120,10 @@
   return substitute(substitution, getRuntimeTypeInfo(target));
 }
 
-/**
- * Returns the [index]th type argument of [target] as an instance of
- * [substitutionName].
- */
+/// Returns the [index]th type argument of [target] as an instance of
+/// [substitutionName].
+///
+/// Called from generated code.
 @NoThrows()
 @NoSideEffects()
 @NoInline()
@@ -132,6 +132,9 @@
   return arguments == null ? null : getIndex(arguments, index);
 }
 
+/// Returns the [index]th type argument of [target].
+///
+/// Called from generated code.
 @NoThrows()
 @NoSideEffects()
 @NoInline()
@@ -153,22 +156,37 @@
  * of type 4, the JavaScript array, where the first element represents the class
  * and the remaining elements represent the type arguments.
  */
-String getRuntimeTypeAsString(var rti, {String onTypeVariable(int i)}) {
+String _getRuntimeTypeAsStringV1(var rti, {String onTypeVariable(int i)}) {
   assert(isJsArray(rti));
   String className = rawRtiToJsConstructorName(getIndex(rti, 0));
-  return '$className${joinArguments(rti, 1, onTypeVariable: onTypeVariable)}';
+  return '$className${joinArgumentsV1(rti, 1, onTypeVariable: onTypeVariable)}';
 }
 
-/**
- * Returns a human-readable representation of the type representation [rti].
- */
+String _getRuntimeTypeAsStringV2(var rti, List<String> genericContext) {
+  assert(isJsArray(rti));
+  String className = rawRtiToJsConstructorName(getIndex(rti, 0));
+  return '$className${joinArgumentsV2(rti, 1, genericContext)}';
+}
+
+/// Returns a human-readable representation of the type representation [rti].
+///
+/// Called from generated code.
+///
+/// [onTypeVariable] is used only from dart:mirrors.
+@NoInline()
 String runtimeTypeToString(var rti, {String onTypeVariable(int i)}) {
+  return JS_GET_FLAG('STRONG_MODE')
+      ? runtimeTypeToStringV2(rti, null)
+      : runtimeTypeToStringV1(rti, onTypeVariable: onTypeVariable);
+}
+
+String runtimeTypeToStringV1(var rti, {String onTypeVariable(int i)}) {
   if (rti == null) {
     return 'dynamic';
   }
   if (isJsArray(rti)) {
     // A list representing a type with arguments.
-    return getRuntimeTypeAsString(rti, onTypeVariable: onTypeVariable);
+    return _getRuntimeTypeAsStringV1(rti, onTypeVariable: onTypeVariable);
   }
   if (isJsFunction(rti)) {
     // A reference to the constructor.
@@ -185,15 +203,43 @@
     String typedefPropertyName = JS_GET_NAME(JsGetName.TYPEDEF_TAG);
     var typedefInfo = JS('', '#[#]', rti, typedefPropertyName);
     if (typedefInfo != null) {
-      return runtimeTypeToString(typedefInfo, onTypeVariable: onTypeVariable);
+      return runtimeTypeToStringV1(typedefInfo, onTypeVariable: onTypeVariable);
     }
-    return _functionRtiToString(rti, onTypeVariable);
+    return _functionRtiToStringV1(rti, onTypeVariable);
   }
   // We should not get here.
   return 'unknown-reified-type';
 }
 
-String _functionRtiToString(var rti, String onTypeVariable(int i)) {
+String runtimeTypeToStringV2(var rti, List<String> genericContext) {
+  if (rti == null) {
+    return 'dynamic';
+  }
+  if (isJsArray(rti)) {
+    // A list representing a type with arguments.
+    return _getRuntimeTypeAsStringV2(rti, genericContext);
+  }
+  if (isJsFunction(rti)) {
+    // A reference to the constructor.
+    return rawRtiToJsConstructorName(rti);
+  }
+  if (isGenericFunctionTypeParameter(rti)) {
+    int index = rti;
+    if (genericContext == null || index < 0 || index >= genericContext.length) {
+      return 'unexpected-generic-index:${index}';
+    }
+    return '${genericContext[genericContext.length - index - 1]}';
+  }
+  String functionPropertyName = JS_GET_NAME(JsGetName.FUNCTION_TYPE_TAG);
+  if (JS('bool', 'typeof #[#] != "undefined"', rti, functionPropertyName)) {
+    // TODO(sra): If there is a typedef tag, use the typedef name.
+    return _functionRtiToStringV2(rti, genericContext);
+  }
+  // We should not get here.
+  return 'unknown-reified-type';
+}
+
+String _functionRtiToStringV1(var rti, String onTypeVariable(int i)) {
   String returnTypeText;
   String voidTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
   if (JS('bool', '!!#[#]', rti, voidTag)) {
@@ -202,7 +248,7 @@
     String returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
     var returnRti = JS('', '#[#]', rti, returnTypeTag);
     returnTypeText =
-        runtimeTypeToString(returnRti, onTypeVariable: onTypeVariable);
+        runtimeTypeToStringV1(returnRti, onTypeVariable: onTypeVariable);
   }
 
   String argumentsText = '';
@@ -216,7 +262,7 @@
     for (var argument in arguments) {
       argumentsText += sep;
       argumentsText +=
-          runtimeTypeToString(argument, onTypeVariable: onTypeVariable);
+          runtimeTypeToStringV1(argument, onTypeVariable: onTypeVariable);
       sep = ', ';
     }
   }
@@ -231,7 +277,7 @@
     for (var argument in optionalArguments) {
       argumentsText += sep;
       argumentsText +=
-          runtimeTypeToString(argument, onTypeVariable: onTypeVariable);
+          runtimeTypeToStringV1(argument, onTypeVariable: onTypeVariable);
       sep = ', ';
     }
     argumentsText += ']';
@@ -246,7 +292,8 @@
     sep = '';
     for (String name in extractKeys(namedArguments)) {
       argumentsText += sep;
-      argumentsText += runtimeTypeToString(JS('', '#[#]', namedArguments, name),
+      argumentsText += runtimeTypeToStringV1(
+          JS('', '#[#]', namedArguments, name),
           onTypeVariable: onTypeVariable);
       argumentsText += ' $name';
       sep = ', ';
@@ -261,12 +308,129 @@
   return '(${argumentsText}) => ${returnTypeText}';
 }
 
+// Returns a formatted String version of a function type.
+//
+// [genericContext] is list of the names of generic type parameters for generic
+// function types. The de Bruijn indexing scheme references the type variables
+// from the inner scope out. The parameters for each scope are pushed in
+// reverse, e.g.  `<P,Q>(<R,S,T>(R))` creates the list `[Q,P,T,S,R]`. This
+// allows the de Bruijn index to simply index backwards from the end of
+// [genericContext], e.g. in the outer scope index `0` is P and `1` is Q, and in
+// 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 typeParameters = '';
+  int outerContextLength;
+
+  String boundsTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_GENERIC_BOUNDS_TAG);
+  if (hasField(rti, boundsTag)) {
+    List boundsRti = JS('JSFixedArray', '#[#]', rti, boundsTag);
+    if (genericContext == null) {
+      genericContext = <String>[];
+    } else {
+      outerContextLength = genericContext.length;
+    }
+    int offset = genericContext.length;
+    for (int i = boundsRti.length; i > 0; i--) {
+      genericContext.add('T${offset + i}');
+    }
+    // All variables are in scope in the bounds.
+    String typeSep = '';
+    typeParameters = '<';
+    for (int i = 0; i < boundsRti.length; i++) {
+      typeParameters += typeSep;
+      typeParameters += genericContext[genericContext.length - i - 1];
+      typeSep = ', ';
+      var boundRti = boundsRti[i];
+      if (isInterestingBound(boundRti)) {
+        typeParameters +=
+            ' extends ' + runtimeTypeToStringV2(boundRti, genericContext);
+      }
+    }
+    typeParameters += '>';
+  }
+
+  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 = runtimeTypeToStringV2(returnRti, genericContext);
+  }
+
+  String argumentsText = '';
+  String sep = '';
+
+  String requiredParamsTag =
+      JS_GET_NAME(JsGetName.FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG);
+  if (hasField(rti, requiredParamsTag)) {
+    List arguments = JS('JSFixedArray', '#[#]', rti, requiredParamsTag);
+    for (var argument in arguments) {
+      argumentsText += sep;
+      argumentsText += runtimeTypeToStringV2(argument, genericContext);
+      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 += runtimeTypeToStringV2(argument, genericContext);
+      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 += runtimeTypeToStringV2(
+          JS('', '#[#]', namedArguments, name), genericContext);
+      argumentsText += ' $name';
+      sep = ', ';
+    }
+    argumentsText += '}';
+  }
+
+  if (outerContextLength != null) {
+    // Pop all of the generic type parameters.
+    JS('', '#.length = #', genericContext, outerContextLength);
+  }
+
+  // TODO(sra): Below is the same format as the VM. Change to:
+  //
+  //     return '${returnTypeText} Function${typeParameters}(${argumentsText})';
+  //
+  return '${typeParameters}(${argumentsText}) => ${returnTypeText}';
+}
+
 /**
  * Creates a comma-separated string of human-readable representations of the
  * type representations in the JavaScript array [types] starting at index
  * [startIndex].
  */
-String joinArguments(var types, int startIndex,
+String joinArguments(var types, int startIndex) {
+  return JS_GET_FLAG('STRONG_MODE')
+      ? joinArgumentsV2(types, startIndex, null)
+      : joinArgumentsV1(types, startIndex);
+}
+
+String joinArgumentsV1(var types, int startIndex,
     {String onTypeVariable(int i)}) {
   if (types == null) return '';
   assert(isJsArray(types));
@@ -283,7 +447,29 @@
     if (argument != null) {
       allDynamic = false;
     }
-    buffer.write(runtimeTypeToString(argument, onTypeVariable: onTypeVariable));
+    buffer
+        .write(runtimeTypeToStringV1(argument, onTypeVariable: onTypeVariable));
+  }
+  return allDynamic ? '' : '<$buffer>';
+}
+
+String joinArgumentsV2(var types, int startIndex, List<String> genericContext) {
+  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(runtimeTypeToStringV2(argument, genericContext));
   }
   return allDynamic ? '' : '<$buffer>';
 }
@@ -381,11 +567,8 @@
 Object subtypeCast(Object object, String isField, List checks, String asField) {
   if (object == null) return object;
   if (checkSubtype(object, isField, checks, asField)) return object;
-  String actualType = Primitives.objectTypeName(object);
   String typeName = computeTypeName(isField, checks);
-  // TODO(johnniwinther): Move type lookup to [CastErrorImplementation] to
-  // align with [TypeErrorImplementation].
-  throw new CastErrorImplementation(actualType, typeName);
+  throw new CastErrorImplementation(object, typeName);
 }
 
 Object assertSubtype(
@@ -503,8 +686,7 @@
 
 Object subtypeOfRuntimeTypeCast(Object object, var type) {
   if (object != null && !checkSubtypeOfRuntimeType(object, type)) {
-    String actualType = Primitives.objectTypeName(object);
-    throw new CastErrorImplementation(actualType, runtimeTypeToString(type));
+    throw new CastErrorImplementation(object, runtimeTypeToString(type));
   }
   return object;
 }
@@ -815,3 +997,11 @@
  * `null` and `undefined` (which we can avoid).
  */
 bool isNotIdentical(var s, var t) => JS('bool', '# !== #', s, t);
+
+/// 'Top' bounds are uninteresting: null/undefined and Object.
+bool isInterestingBound(rti) =>
+    rti != null &&
+    isNotIdentical(
+        rti,
+        JS_BUILTIN(
+            'depends:none;effects:none;', JsBuiltin.dartObjectConstructor));
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index e1eb66d..174333c 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -175,23 +175,34 @@
 /// This embedded global is used for deserialization in the isolate-library.
 const INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
 
-/// Returns a map from load-ids to URIs.
+/// Contains a map from load-ids to lists of part indexes.
 ///
 /// To load the deferred library that is represented by the load-id, the runtime
-/// must load all associated URIs.
+/// must load all associated URIs (named in DEFERRED_PART_URIS) and initialize
+/// all the loaded hunks (DEFERRED_PART_HASHES).
 ///
 /// This embedded global is only used for deferred loading.
-const DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
+const DEFERRED_LIBRARY_PARTS = 'deferredLibraryParts';
 
-/// Returns a map from load-ids to hashes.
+/// Contains a list of URIs (Strings), indexed by part.
+///
+/// The lists in the DEFERRED_LIBRARY_PARTS map contain indexes into this list.
+///
+/// This embedded global is only used for deferred loading.
+const DEFERRED_PART_URIS = 'deferredPartUris';
+
+/// Contains a list of hashes, indexed by part.
+///
+/// The lists in the DEFERRED_LIBRARY_PARTS map contain indexes into this list.
 ///
 /// The hashes are associated with the URIs of the load-ids (see
-/// [DEFERRED_LIBRARY_URIS]). They are MD5 (or similar) hashes of the code that
-/// must be loaded. By using cryptographic hashes we can avoid loading similar
-/// code multiple times.
+/// [DEFERRED_PART_URIS]). They are SHA1 (or similar) hashes of the code that
+/// must be loaded. By using cryptographic hashes we can (1) handle loading in
+/// the same web page the parts from multiple Dart applications (2) avoid
+/// loading similar code multiple times.
 ///
 /// This embedded global is only used for deferred loading.
-const DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
+const DEFERRED_PART_HASHES = 'deferredPartHashes';
 
 /// Initialize a loaded hunk.
 ///
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index 3d320f6..b538aae 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -63,6 +63,17 @@
   Base64Decoder get decoder => const Base64Decoder();
 
   /**
+   * Decodes [encoded].
+   *
+   * The input is decoded as if by `decoder.convert`.
+   *
+   * The returned [Uint8List] contains exactly the decoded bytes,
+   * so the [Uint8List.length] is precisely the number of decoded bytes.
+   * The [Uint8List.buffer] may be larger than the decoded bytes.
+   */
+  Uint8List decode(String encoded) => decoder.convert(encoded);
+
+  /**
    * Validates and normalizes the base64 encoded data in [source].
    *
    * Only acts on the substring from [start] to [end], with [end]
@@ -471,7 +482,17 @@
 class Base64Decoder extends Converter<String, List<int>> {
   const Base64Decoder();
 
-  List<int> convert(String input, [int start = 0, int end]) {
+  /**
+   * Decodes the characters of [input] from [start] to [end] as base64.
+   *
+   * If [start] is omitted, it defaults to the start of [input].
+   * If [end] is omitted, it defaults to the end of [input].
+   *
+   * The returned [Uint8List] contains exactly the decoded bytes,
+   * so the [Uint8List.length] is precisely the number of decoded bytes.
+   * The [Uint8List.buffer] may be larger than the decoded bytes.
+   */
+  Uint8List convert(String input, [int start = 0, int end]) {
     end = RangeError.checkValidRange(start, end, input.length);
     if (start == end) return new Uint8List(0);
     var decoder = new _Base64Decoder();
diff --git a/sdk/lib/convert/codec.dart b/sdk/lib/convert/codec.dart
index 40066c75..033e082 100644
--- a/sdk/lib/convert/codec.dart
+++ b/sdk/lib/convert/codec.dart
@@ -17,7 +17,18 @@
 abstract class Codec<S, T> {
   const Codec();
 
+  /**
+   * Encodes [input].
+   *
+   * The input is encoded as if by `encoder.convert`.
+   */
   T encode(S input) => encoder.convert(input);
+
+  /**
+   * Decodes [encoded] data.
+   *
+   * The input is decoded as if by `decoder.convert`.
+   */
   S decode(T encoded) => decoder.convert(encoded);
 
   /**
diff --git a/sdk/lib/developer/developer.dart b/sdk/lib/developer/developer.dart
index 1a2ea45..b6ec40d 100644
--- a/sdk/lib/developer/developer.dart
+++ b/sdk/lib/developer/developer.dart
@@ -4,10 +4,9 @@
 
 /// Interact with developer tools such as the debugger and inspector.
 ///
-/// The dart:developer library is _unstable_ and its API might change slightly
-/// as a result of developer feedback. This library is platform dependent and
-/// therefore it has implementations for both dart2js and the Dart VM. Both are
-/// under development and may not support all operations yet.
+/// This library is platform dependent and has separate implementations for
+/// both web and the Dart VM. A specific platform may not support all
+/// operations.
 ///
 /// To use this library in your code:
 ///
@@ -21,8 +20,8 @@
 
 part 'extension.dart';
 part 'profiler.dart';
-part 'timeline.dart';
 part 'service.dart';
+part 'timeline.dart';
 
 /// If [when] is true, stop the program as if a breakpoint were hit at the
 /// following statement.
@@ -42,19 +41,26 @@
 external Object inspect(Object object);
 
 /// Emit a log event.
-/// [message] is the log message.
-/// [time]  (optional) is the timestamp.
-/// [sequenceNumber]  (optional) is a monotonically increasing sequence number.
-/// [level]  (optional) is the severity level (value between 0 and 2000).
-/// [name]  (optional) is the name of the source of the log message.
-/// [zone]  (optional) the zone where the log was emitted
-/// [error]  (optional) an error object associated with this log event.
-/// [stackTrace]  (optional) a stack trace associated with this log event.
-external void log(String message,
-    {DateTime time,
-    int sequenceNumber,
-    int level: 0,
-    String name: '',
-    Zone zone,
-    Object error,
-    StackTrace stackTrace});
+///
+/// This function was designed to map closely to the logging information
+/// collected by `package:logging`.
+///
+/// - [message] is the log message
+/// - [time] (optional) is the timestamp
+/// - [sequenceNumber] (optional) is a monotonically increasing sequence number
+/// - [level] (optional) is the severity level (a value between 0 and 2000); see
+///   the `package:logging` `Level` class for an overview of the possible values
+/// - [name] (optional) is the name of the source of the log message
+/// - [zone] (optional) the zone where the log was emitted
+/// - [error] (optional) an error object associated with this log event
+/// - [stackTrace] (optional) a stack trace associated with this log event
+external void log(
+  String message, {
+  DateTime time,
+  int sequenceNumber,
+  int level: 0,
+  String name: '',
+  Zone zone,
+  Object error,
+  StackTrace stackTrace,
+});
diff --git a/sdk/lib/developer/extension.dart b/sdk/lib/developer/extension.dart
index d6ed598..ec316c7 100644
--- a/sdk/lib/developer/extension.dart
+++ b/sdk/lib/developer/extension.dart
@@ -73,7 +73,7 @@
 
   static String _errorCodeMessage(int errorCode) {
     _validateErrorCode(errorCode);
-    if (errorCode == kInvalidParams) {
+    if (errorCode == invalidParams) {
       return "Invalid params";
     }
     return "Server error";
@@ -92,8 +92,10 @@
     throw new ArgumentError.value(errorCode, "errorCode", "Out of range");
   }
 
+  // ignore: unused_element, called from runtime/lib/developer.dart
   bool _isError() => (_errorCode != null) && (_errorDetail != null);
 
+  // ignore: unused_element, called from runtime/lib/developer.dart
   String _toString() {
     if (_result != null) {
       return _result;
@@ -111,12 +113,11 @@
 
 /// A service protocol extension handler. Registered with [registerExtension].
 ///
-/// Must complete to a [ServiceExtensionResponse].
+/// Must complete to a [ServiceExtensionResponse]. [method] is the method name
+/// of the service protocol request, and [parameters] is a map holding the
+/// parameters to the service protocol request.
 ///
-/// [method] - the method name of the service protocol request.
-/// [parameters] - A map holding the parameters to the service protocol request.
-///
-/// *NOTE*: All parameter names and values are **encoded as strings**.
+/// *NOTE*: all parameter names and values are encoded as strings.
 typedef Future<ServiceExtensionResponse> ServiceExtensionHandler(
     String method, Map<String, String> parameters);
 
diff --git a/sdk/lib/developer/profiler.dart b/sdk/lib/developer/profiler.dart
index 76d2644..593c27f 100644
--- a/sdk/lib/developer/profiler.dart
+++ b/sdk/lib/developer/profiler.dart
@@ -134,6 +134,7 @@
     _metrics.remove(metric.name);
   }
 
+  // ignore: unused_element, called from native code
   static String _printMetric(String id) {
     var metric = _metrics[id];
     if (metric == null) {
@@ -142,6 +143,7 @@
     return json.encode(metric._toJSON());
   }
 
+  // ignore: unused_element, called from native code
   static String _printMetrics() {
     var metrics = [];
     for (var metric in _metrics.values) {
diff --git a/sdk/lib/developer/service.dart b/sdk/lib/developer/service.dart
index 65c7f73..9616963 100644
--- a/sdk/lib/developer/service.dart
+++ b/sdk/lib/developer/service.dart
@@ -4,7 +4,7 @@
 
 part of dart.developer;
 
-/// Service protocol is the protocol that a client like the observatory
+/// Service protocol is the protocol that a client like the Observatory
 /// could use to access the services provided by the Dart VM for
 /// debugging and inspecting Dart programs. This class encapsulates the
 /// version number and Uri for accessing this service.
@@ -55,7 +55,7 @@
 
   /// Control the web server that the service protocol is accessed through.
   /// The [enable] argument must be a boolean and is used as a toggle to
-  /// enable(true) or disable(false) the web server servicing requests.
+  /// enable (true) or disable (false) the web server servicing requests.
   static Future<ServiceProtocolInfo> controlWebServer(
       {bool enable: false}) async {
     if (enable is! bool) {
diff --git a/sdk/lib/developer/timeline.dart b/sdk/lib/developer/timeline.dart
index eb00c96..e374096d 100644
--- a/sdk/lib/developer/timeline.dart
+++ b/sdk/lib/developer/timeline.dart
@@ -6,7 +6,10 @@
 
 const bool _isProduct = const bool.fromEnvironment("dart.vm.product");
 
+/// A typedef for the function argument to [Timeline.timeSync].
 typedef dynamic TimelineSyncFunction();
+
+// TODO: This typedef is not used.
 typedef Future TimelineAsyncFunction();
 
 /// A class to represent Flow events.
diff --git a/sdk/lib/io/io_resource_info.dart b/sdk/lib/io/io_resource_info.dart
index eb1d295..22ff562 100644
--- a/sdk/lib/io/io_resource_info.dart
+++ b/sdk/lib/io/io_resource_info.dart
@@ -107,7 +107,7 @@
     openFiles.remove(info.id);
   }
 
-  static Iterable<Map<String, String>> getOpenFilesList() {
+  static Iterable<Map<String, dynamic>> getOpenFilesList() {
     return new List.from(openFiles.values.map((e) => e.referenceValueMap));
   }
 
@@ -177,7 +177,7 @@
     startedProcesses.remove(info.id);
   }
 
-  static Iterable<Map<String, String>> getStartedProcessesList() =>
+  static Iterable<Map<String, dynamic>> getStartedProcessesList() =>
       new List.from(startedProcesses.values.map((e) => e.referenceValueMap));
 
   static Future<ServiceExtensionResponse> getStartedProcesses(
@@ -226,7 +226,7 @@
     return '${socket.address.host}:${socket.port}$remote';
   }
 
-  static Iterable<Map<String, String>> getOpenSocketsList() {
+  static Iterable<Map<String, dynamic>> getOpenSocketsList() {
     return new List.from(openSockets.values.map((e) => e.referenceValueMap));
   }
 
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 734204a..bcc4df5 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -156,7 +156,7 @@
   external static Isolate get current;
 
   /**
-   * Returns the package root of the current isolate, if any.
+   * The location of the package configuration of the current isolate, if any.
    *
    * If the isolate is using a [packageConfig] or the isolate has not been
    * setup for package resolution, this getter returns `null`, otherwise it
@@ -166,7 +166,7 @@
   external static Future<Uri> get packageRoot;
 
   /**
-   * Returns the package root of the current isolate, if any.
+   * The package root of the current isolate, if any.
    *
    * If the isolate is using a [packageRoot] or the isolate has not been
    * setup for package resolution, this getter returns `null`, otherwise it
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index dd808c7..e6083aa 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -154,20 +154,18 @@
   // elements in the list are strings, making consumption by C++ simpler.
   // This has a side effect that boolean literal values like true become 'true'
   // and thus indistinguishable from the string literal 'true'.
-  List _makeAllString(List list) {
+  List<String> _makeAllString(List list) {
     if (list == null) {
       return null;
     }
+    var new_list = new List<String>(list.length);
     for (var i = 0; i < list.length; i++) {
-      if (list[i] is String) {
-        continue;
-      }
-      list[i] = list[i].toString();
+      new_list[i] = list[i].toString();
     }
-    return list;
+    return new_list;
   }
 
-  Future<Response> send(SendPort sendPort) {
+  Future<Response> sendToIsolate(SendPort sendPort) {
     final receivePort = new RawReceivePort();
     receivePort.handler = (value) {
       receivePort.close();
@@ -221,11 +219,11 @@
       receivePort.close();
       _setResponseFromPort(value);
     };
-    final keys = params.keys.toList(growable: false);
-    final values = params.values.toList(growable: false);
+    var keys = params.keys.toList(growable: false);
+    var values = params.values.toList(growable: false);
     if (!_methodNeedsObjectParameters(method)) {
-      _makeAllString(keys);
-      _makeAllString(values);
+      keys = _makeAllString(keys);
+      values = _makeAllString(values);
     }
 
     final request = new List(6)
diff --git a/sdk/lib/vmservice/running_isolate.dart b/sdk/lib/vmservice/running_isolate.dart
index 2aa6dc2..a1339f0 100644
--- a/sdk/lib/vmservice/running_isolate.dart
+++ b/sdk/lib/vmservice/running_isolate.dart
@@ -15,7 +15,7 @@
 
   Future<Response> routeRequest(Message message) {
     // Send message to isolate.
-    return message.send(sendPort);
+    return message.sendToIsolate(sendPort);
   }
 
   void routeResponse(Message message) {}
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index abe1e10..1ba9697 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -63,7 +63,6 @@
 # dartk: precompilation failures (debug)
 [ $compiler == dartkp && $mode == debug ]
 Language/Functions/External_Functions/not_connected_to_a_body_t01: Crash
-Language/Statements/For/Asynchronous_For_in/execution_t04: Crash
 
 [ $compiler == dartkp && $strong ]
 *: SkipByDesign
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index ddb130f..97822e1 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
@@ -90,9 +90,8 @@
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
     await runTest(useKernel: false);
-    // TODO(sigmund): Handle this for kernel.
-    //print('--test from kernel------------------------------------------------');
-    //await runTest(useKernel: true);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart
index 513d43b..b3d820a 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart
@@ -2,13 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../libs/deferred_constant1_lib1.dart' as lib1 hide C2, C3;
+import '../libs/deferred_constant1_lib1.dart';
 import '../libs/deferred_constant1_lib2.dart' deferred as lib2;
 
 /*element: main:OutputUnit(main, {})*/
 main() async {
-  lib1.C1.value;
+  C1.value;
+  print(const C(4));
+  () => print(const C(5));
   await lib2.loadLibrary();
   lib2.C2.value;
   lib2.C3.value;
+  lib2.C4.value;
+  lib2.C5.value;
+  lib2.C6;
+  lib2.C7.value;
 }
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 9a48d0c..59b43ee 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -37,8 +37,6 @@
     await checkTests(
         dataDir, computeAstOutputUnitData, computeKernelOutputUnitData,
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
-        forMainLibraryOnly: false,
-        forUserSourceFilesOnly: true,
         skipForKernel: skipForKernel,
         options: compilerOptions,
         args: args, setUpFunction: () {
@@ -143,16 +141,17 @@
         node is ir.ListLiteral ||
         node is ir.MapLiteral) {
       // Adjust the source-span to match the AST-based location. The kernel FE
-      // skips the "const" keyword for the expression offset (-6 is an
-      // approximation assuming that there is just a single space after "const",
-      // this is likely good enough for our small unit tests).
+      // skips the "const" keyword for the expression offset and any prefix in
+      // front of the constructor. The "-6" is an approximation assuming that
+      // there is just a single space after "const" and no prefix.
+      // TODO(sigmund): offsets should be fixed in the FE instead.
       span = new SourceSpan(span.uri, span.begin - 6, span.end - 6);
     }
     _registerValue(
         new NodeId(span.begin, IdKind.node),
         outputUnitString(data.outputUnitForConstant(constant)),
         member,
-        computeSourceSpanFromTreeNode(node),
+        span,
         actualMap,
         compiler.reporter);
   }
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart
index 7758772..8965ddf 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart
@@ -4,31 +4,4 @@
 
 library deferred_constants1_lib1;
 
-class C {
-  /*element: C.value:OutputUnit(main, {})*/
-  final value;
-  /*element: C.:OutputUnit(main, {})*/
-  const C(this.value);
-}
-
-/// ---------------------------------------------------------------------------
-/// Constant used from main: not deferred.
-/// ---------------------------------------------------------------------------
-
-/*element: C1:OutputUnit(main, {})*/
-const C1 = /*OutputUnit(main, {})*/ const C(1);
-
-/// ---------------------------------------------------------------------------
-/// Constant completely deferred.
-/// ---------------------------------------------------------------------------
-
-/*element: C2:OutputUnit(1, {lib2})*/
-const C2 = /*OutputUnit(1, {lib2})*/ const C(2);
-
-/// ---------------------------------------------------------------------------
-/// Constant field not used from main, but the constant value is: so the field
-/// and the constant value are in different output units.
-/// ---------------------------------------------------------------------------
-
-/*element: C3:OutputUnit(1, {lib2})*/
-const C3 = /*OutputUnit(main, {})*/ const C(1);
+export 'deferred_constant1_lib3.dart' show C, C1;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart
index d21aec4..ca606bb 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart
@@ -4,4 +4,4 @@
 
 library deferred_constants1_lib2;
 
-export 'deferred_constant1_lib1.dart' show C2, C3;
+export 'deferred_constant1_lib3.dart' show C2, C3, C4, C5, C6, C7;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
new file mode 100644
index 0000000..a3a279d
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants1_lib3;
+
+class C {
+  /*element: C.value:OutputUnit(main, {})*/
+  final value;
+  /*element: C.:OutputUnit(main, {})*/
+  const C(this.value);
+}
+
+/// ---------------------------------------------------------------------------
+/// Constant used from main: not deferred.
+/// ---------------------------------------------------------------------------
+
+/*element: C1:OutputUnit(main, {})*/
+const C1 = /*OutputUnit(main, {})*/ const C(1);
+
+/// ---------------------------------------------------------------------------
+/// Constant completely deferred.
+/// ---------------------------------------------------------------------------
+
+/*element: C2:OutputUnit(1, {lib2})*/
+const C2 = /*OutputUnit(1, {lib2})*/ const C(2);
+
+/// ---------------------------------------------------------------------------
+/// Constant fields not used from main, but the constant value are: so the field
+/// and the constants are in different output units.
+/// ---------------------------------------------------------------------------
+
+/*element: C3:OutputUnit(1, {lib2})*/
+const C3 = /*OutputUnit(main, {})*/ const C(1);
+
+/*element: C4:OutputUnit(1, {lib2})*/
+const C4 = /*OutputUnit(main, {})*/ const C(4);
+
+/// ---------------------------------------------------------------------------
+/// Constant value used form a closure within main.
+/// ---------------------------------------------------------------------------
+
+/*element: C5:OutputUnit(1, {lib2})*/
+const C5 = /*OutputUnit(main, {})*/ const C(5);
+
+/// ---------------------------------------------------------------------------
+/// Deferred constants, used after a deferred load.
+/// ---------------------------------------------------------------------------
+
+/*element: C6:OutputUnit(1, {lib2})*/
+const C6 = /*OutputUnit(1, {lib2})*/ "string6";
+
+/*element: C7:OutputUnit(1, {lib2})*/
+const C7 = /*OutputUnit(1, {lib2})*/ const C(const C(7));
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
index 1967a3c..dc59b97 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
@@ -4,15 +4,6 @@
 
 library deferred_constants2_lib;
 
-class MyClass {
-  const MyClass();
-
-  foo(x) {
-    print('MyClass.foo($x)');
-    return (x - 3) ~/ 2;
-  }
-}
-
 class Constant {
   /*element: Constant.value:OutputUnit(1, {lib})*/
   final value;
@@ -27,27 +18,3 @@
 
 /*element: C1:OutputUnit(1, {lib})*/
 const C1 = /*OutputUnit(1, {lib})*/ const Constant(499);
-
-const C2 = const [const Constant(99)];
-
-foo([x = const Constant(42)]) => x;
-bar() => const Constant(777);
-
-class Gee {
-  get value => c.value;
-  final c;
-
-  Gee([this.c = const Constant(111)]);
-  const Gee.n321([this.c = const Constant(321)]);
-  Gee.n135({arg: const Constant(135)}) : this.c = arg;
-  const Gee.n246({arg: const Constant(246)}) : this.c = arg;
-  const Gee.n888() : this.c = const Constant(888);
-  const Gee.constant(this.c);
-}
-
-class Gee2 extends Gee {
-  Gee2() : super(const Constant(979));
-  const Gee2.n321() : super.n321();
-  const Gee2.n151() : super.constant(const Constant(151));
-  const Gee2.n888() : super.n888();
-}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
index 14e96f5..5f3267e 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
@@ -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 "dont_inline_deferred_constants_main.dart" show C;
 import "dont_inline_deferred_constants_main.dart" as main;
 
 /*element: C1:OutputUnit(1, {lib1})*/
@@ -10,8 +11,8 @@
 /*element: C2:OutputUnit(1, {lib1})*/
 const C2 = /*OutputUnit(1, {lib1})*/ 1010;
 
-class C {
-  /*element: C.C3:OutputUnit(1, {lib1})*/
+class D {
+  /*element: D.C3:OutputUnit(1, {lib1})*/
   static const C3 = /*OutputUnit(1, {lib1})*/ "string2";
 }
 
@@ -19,10 +20,10 @@
 const C4 = /*OutputUnit(main, {})*/ "string4";
 
 /*element: C5:OutputUnit(1, {lib1})*/
-const C5 = /*OutputUnit(main, {})*/ const main.C(1);
+const C5 = /*OutputUnit(main, {})*/ const C(1);
 
 /*element: C6:OutputUnit(1, {lib1})*/
-const C6 = /*OutputUnit(2, {lib1, lib2})*/ const main.C(2);
+const C6 = /*OutputUnit(2, {lib1, lib2})*/ const C(2);
 
 /*element: foo:OutputUnit(1, {lib1})*/
 foo() {
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart
index 16ed499..c53f32a 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart
@@ -2,16 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dont_inline_deferred_constants_main.dart" show C;
 import "dont_inline_deferred_constants_main.dart" as main;
 
 /*element: C4:OutputUnit(3, {lib2})*/
 const C4 = /*OutputUnit(main, {})*/ "string4";
 
 /*element: C5:OutputUnit(3, {lib2})*/
-const C5 = /*OutputUnit(main, {})*/ const main.C(1);
+const C5 = /*OutputUnit(main, {})*/ const C(1);
 
 /*element: C6:OutputUnit(3, {lib2})*/
-const C6 = /*OutputUnit(2, {lib1, lib2})*/ const main.C(2);
+const C6 = /*OutputUnit(2, {lib1, lib2})*/ const C(2);
 
 /*element: foo:OutputUnit(3, {lib2})*/
 foo() {
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
index 8d3ed21..4e781f5 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
@@ -27,7 +27,7 @@
       lib2.foo();
       print(lib1.C1);
       print(lib1.C2);
-      print(lib1.C.C3);
+      print(lib1.D.C3);
       print(c);
       print(lib1.C4);
       print(lib2.C4);
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence.dart b/tests/compiler/dart2js/equivalence/id_equivalence.dart
index 2d0a4ed..d46fd7f 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence.dart
@@ -15,6 +15,7 @@
 
 enum IdKind {
   element,
+  cls,
   node,
   invoke,
   update,
@@ -47,6 +48,9 @@
       case IdKind.element:
         ElementId elementId = id;
         return '$elementPrefix${elementId.name}:$value';
+      case IdKind.cls:
+        ClassId classId = id;
+        return '$classPrefix${classId.name}:$value';
       case IdKind.node:
         return value;
       case IdKind.invoke:
@@ -64,6 +68,7 @@
   }
 
   static const String elementPrefix = "element: ";
+  static const String classPrefix = "class: ";
   static const String invokePrefix = "invoke: ";
   static const String updatePrefix = "update: ";
   static const String iteratorPrefix = "iterator: ";
@@ -79,6 +84,12 @@
       if (colonPos == -1) throw "Invalid element id: '$text'";
       id = new ElementId(text.substring(0, colonPos));
       expected = text.substring(colonPos + 1);
+    } else if (text.startsWith(classPrefix)) {
+      text = text.substring(classPrefix.length);
+      int colonPos = text.indexOf(':');
+      if (colonPos == -1) throw "Invalid class id: '$text'";
+      id = new ClassId(text.substring(0, colonPos));
+      expected = text.substring(colonPos + 1);
     } else if (text.startsWith(invokePrefix)) {
       id = new NodeId(offset, IdKind.invoke);
       expected = text.substring(invokePrefix.length);
@@ -102,8 +113,7 @@
   }
 }
 
-/// Id for an element with type inference information.
-// TODO(johnniwinther): Support local variables, functions and parameters.
+/// Id for an member element.
 class ElementId implements Id {
   final String className;
   final String memberName;
@@ -132,7 +142,28 @@
 
   String get name => className != null ? '$className.$memberName' : memberName;
 
-  String toString() => name;
+  String toString() => 'element:$name';
+}
+
+/// Id for a class.
+class ClassId implements Id {
+  final String className;
+
+  ClassId(this.className);
+
+  int get hashCode => className.hashCode * 13;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! ClassId) return false;
+    return className == other.className;
+  }
+
+  IdKind get kind => IdKind.cls;
+
+  String get name => className;
+
+  String toString() => 'class:$name';
 }
 
 /// Id for a code point with type inference information.
@@ -161,6 +192,15 @@
 
   ActualData(this.value, this.sourceSpan, this.object);
 
+  int get offset {
+    Id id = value.id;
+    if (id is NodeId) {
+      return id.value;
+    } else {
+      return sourceSpan.begin;
+    }
+  }
+
   String toString() =>
       'ActualData(value=$value,sourceSpan=$sourceSpan,object=$object)';
 }
@@ -438,6 +478,7 @@
   visitSendSet(ast.SendSet node) {
     dynamic sendStructure = elements.getSendStructure(node);
     if (sendStructure != null) {
+      outer:
       switch (sendStructure.kind) {
         case SendStructureKind.SET:
           ast.Node position =
@@ -452,8 +493,22 @@
         case SendStructureKind.COMPOUND_INDEX_SET:
         case SendStructureKind.INDEX_PREFIX:
         case SendStructureKind.INDEX_POSTFIX:
-          computeForNode(node, createAccessId(node.selector));
           computeForNode(node, createInvokeId(node.assignmentOperator));
+          switch (sendStructure.semantics.kind) {
+            case AccessKind.UNRESOLVED_SUPER:
+              break outer;
+            case AccessKind.COMPOUND:
+              switch (sendStructure.semantics.compoundAccessKind) {
+                case CompoundAccessKind.SUPER_GETTER_SETTER:
+                case CompoundAccessKind.UNRESOLVED_SUPER_GETTER:
+                case CompoundAccessKind.UNRESOLVED_SUPER_SETTER:
+                  break outer;
+                default:
+              }
+              break;
+            default:
+          }
+          computeForNode(node, createAccessId(node.selector));
           computeForNode(node, createUpdateId(node.selector));
           break;
         case SendStructureKind.PREFIX:
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 939543a..24f265c 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -72,6 +72,14 @@
     Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
     {bool verbose});
 
+/// Function that computes a data mapping for [cls].
+///
+/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
+/// for the data origin.
+typedef void ComputeClassDataFunction(
+    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+    {bool verbose});
+
 const String stopAfterTypeInference = 'stopAfterTypeInference';
 
 /// Compute actual data for all members defined in the program with the
@@ -84,10 +92,10 @@
     ComputeMemberDataFunction computeMemberData,
     {List<String> options: const <String>[],
     bool verbose: false,
-    bool forMainLibraryOnly: true,
+    bool forUserLibrariesOnly: true,
     bool skipUnprocessedMembers: false,
     bool skipFailedCompilations: false,
-    bool forUserSourceFilesOnly: false}) async {
+    ComputeClassDataFunction computeClassData}) async {
   CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
@@ -145,22 +153,23 @@
     computeMemberData(compiler, member, actualMapFor(member), verbose: verbose);
   }
 
-  if (forMainLibraryOnly && !forUserSourceFilesOnly) {
-    LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
-    elementEnvironment.forEachClass(mainLibrary, (ClassEntity cls) {
-      if (!elementEnvironment.isEnumClass(cls)) {
-        elementEnvironment.forEachConstructor(cls, processMember);
-      }
-      elementEnvironment.forEachLocalClassMember(cls, processMember);
-    });
-    elementEnvironment.forEachLibraryMember(mainLibrary, processMember);
-  } else if (forUserSourceFilesOnly) {
-    closedWorld.processedMembers
-        .where((MemberEntity member) =>
-            userFiles.contains(member.library.canonicalUri.pathSegments.last))
-        .forEach(processMember);
-  } else {
-    closedWorld.processedMembers.forEach(processMember);
+  bool excludeLibrary(LibraryEntity library) {
+    return forUserLibrariesOnly &&
+        (library.canonicalUri.scheme == 'dart' ||
+            library.canonicalUri.scheme == 'package');
+  }
+
+  if (computeClassData != null) {
+    for (LibraryEntity library in elementEnvironment.libraries) {
+      if (excludeLibrary(library)) continue;
+      elementEnvironment.forEachClass(library, (ClassEntity cls) {
+        computeClassData(compiler, cls, actualMapFor(cls), verbose: verbose);
+      });
+    }
+  }
+  for (MemberEntity member in closedWorld.processedMembers) {
+    if (excludeLibrary(member.library)) continue;
+    processMember(member);
   }
 
   return new CompiledData(compiler, elementEnvironment, entryPoint, actualMaps);
@@ -181,7 +190,7 @@
     thisMap.forEach((Id id, ActualData data1) {
       String value1 = '${data1.value}';
       annotations
-          .putIfAbsent(data1.sourceSpan.begin, () => [])
+          .putIfAbsent(data1.offset, () => [])
           .add(colorizeSingle(value1));
     });
     return annotations;
@@ -197,23 +206,20 @@
       if (data1.value != data2?.value) {
         String value2 = '${data2?.value ?? '---'}';
         annotations
-            .putIfAbsent(data1.sourceSpan.begin, () => [])
+            .putIfAbsent(data1.offset, () => [])
             .add(colorizeDiff(value1, ' | ', value2));
       } else if (includeMatches) {
         annotations
-            .putIfAbsent(data1.sourceSpan.begin, () => [])
+            .putIfAbsent(data1.offset, () => [])
             .add(colorizeMatch(value1));
       }
     });
     otherMap.forEach((Id id, ActualData data2) {
       if (!thisMap.containsKey(id)) {
-        int offset = compiler.reporter
-            .spanFromSpannable(computeSpannable(elementEnvironment, uri, id))
-            .begin;
         String value1 = '---';
         String value2 = '${data2.value}';
         annotations
-            .putIfAbsent(offset, () => [])
+            .putIfAbsent(data2.offset, () => [])
             .add(colorizeDiff(value1, ' | ', value2));
       }
     });
@@ -348,15 +354,16 @@
 /// file and any supporting libraries.
 Future checkTests(Directory dataDir, ComputeMemberDataFunction computeFromAst,
     ComputeMemberDataFunction computeFromKernel,
-    {List<String> skipforAst: const <String>[],
+    {List<String> skipForAst: const <String>[],
     List<String> skipForKernel: const <String>[],
     bool filterActualData(IdValue idValue, ActualData actualData),
     List<String> options: const <String>[],
     List<String> args: const <String>[],
     Directory libDirectory: null,
-    bool forMainLibraryOnly: true,
-    bool forUserSourceFilesOnly: false,
-    Callback setUpFunction}) async {
+    bool forUserLibrariesOnly: true,
+    Callback setUpFunction,
+    ComputeClassDataFunction computeClassDataFromAst,
+    ComputeClassDataFunction computeClassDataFromKernel}) async {
   args = args.toList();
   bool verbose = args.remove('-v');
 
@@ -413,16 +420,16 @@
 
     if (setUpFunction != null) setUpFunction();
 
-    if (skipforAst.contains(name)) {
+    if (skipForAst.contains(name)) {
       print('--skipped for ast-----------------------------------------------');
     } else {
       print('--from ast------------------------------------------------------');
       CompiledData compiledData1 = await computeData(
           entryPoint, memorySourceFiles, computeFromAst,
+          computeClassData: computeClassDataFromAst,
           options: testOptions,
           verbose: verbose,
-          forMainLibraryOnly: forMainLibraryOnly,
-          forUserSourceFilesOnly: forUserSourceFilesOnly);
+          forUserLibrariesOnly: forUserLibrariesOnly);
       await checkCode(code, expectedMaps[astMarker], compiledData1);
     }
     if (skipForKernel.contains(name)) {
@@ -431,10 +438,10 @@
       print('--from kernel---------------------------------------------------');
       CompiledData compiledData2 = await computeData(
           entryPoint, memorySourceFiles, computeFromKernel,
+          computeClassData: computeClassDataFromKernel,
           options: [Flags.useKernel]..addAll(testOptions),
           verbose: verbose,
-          forMainLibraryOnly: forMainLibraryOnly,
-          forUserSourceFilesOnly: forUserSourceFilesOnly);
+          forUserLibrariesOnly: forUserLibrariesOnly);
       await checkCode(code, expectedMaps[kernelMarker], compiledData2,
           filterActualData: filterActualData);
     }
@@ -551,6 +558,14 @@
       }
       return member;
     }
+  } else if (id is ClassId) {
+    LibraryEntity library = elementEnvironment.lookupLibrary(mainUri);
+    ClassEntity cls =
+        elementEnvironment.lookupClass(library, id.className, required: true);
+    if (cls == null) {
+      throw new ArgumentError("No class '${id.className}' in $mainUri.");
+    }
+    return cls;
   }
   throw new UnsupportedError('Unsupported id $id.');
 }
@@ -594,7 +609,7 @@
     ComputeMemberDataFunction computeAstData,
     ComputeMemberDataFunction computeIrData,
     {List<String> options: const <String>[],
-    bool forMainLibraryOnly: true,
+    bool forUserLibrariesOnly: true,
     bool skipUnprocessedMembers: false,
     bool skipFailedCompilations: false,
     bool verbose: false,
@@ -603,7 +618,7 @@
   CompiledData data1 = await computeData(
       entryPoint, memorySourceFiles, computeAstData,
       options: options,
-      forMainLibraryOnly: forMainLibraryOnly,
+      forUserLibrariesOnly: forUserLibrariesOnly,
       skipUnprocessedMembers: skipUnprocessedMembers,
       skipFailedCompilations: skipFailedCompilations);
   if (data1 == null) return false;
@@ -611,13 +626,13 @@
   CompiledData data2 = await computeData(
       entryPoint, memorySourceFiles, computeIrData,
       options: [Flags.useKernel]..addAll(options),
-      forMainLibraryOnly: forMainLibraryOnly,
+      forUserLibrariesOnly: forUserLibrariesOnly,
       skipUnprocessedMembers: skipUnprocessedMembers,
       skipFailedCompilations: skipFailedCompilations);
   if (data2 == null) return false;
   await compareCompiledData(data1, data2,
       whiteList: whiteList,
-      skipMissingUris: !forMainLibraryOnly,
+      skipMissingUris: !forUserLibrariesOnly,
       verbose: verbose);
   return true;
 }
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_test.dart b/tests/compiler/dart2js/equivalence/id_equivalence_test.dart
index 93646f7..b4441ed 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_test.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_test.dart
@@ -32,6 +32,13 @@
   'closure_tracer.dart',
   'closure_tracer_28919.dart',
   'index_call.dart',
+  'map_tracer_const.dart',
+  // Id equivalence doesn't support libraries.
+  'mixin_constructor_default_parameter_values.dart',
+  // Id equivalence doesn't support unused constructors.
+  'final_field2.dart',
+  // TODO(johnniwinther): Fix ast equivalence on instance fields in for.
+  'field_type.dart',
 ];
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index aa46e75..d37f502 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -19,6 +19,7 @@
   ArgParser argParser = new ArgParser(allowTrailingOptions: true);
   argParser.addFlag('verbose', negatable: true, defaultsTo: false);
   argParser.addFlag('colors', negatable: true);
+  argParser.addFlag('all', negatable: false, defaultsTo: false);
   argParser.addFlag('use-kernel', negatable: false, defaultsTo: false);
   ArgResults argResults = argParser.parse(args);
   if (argResults.wasParsed('colors')) {
@@ -29,12 +30,14 @@
 
   InferrerEngineImpl.useSorterForTesting = true;
   String file = argResults.rest.first;
+  Uri entryPoint = Uri.base.resolve(nativeToUriPath(file));
   List<String> show;
   if (argResults.rest.length > 1) {
     show = argResults.rest.skip(1).toList();
+  } else {
+    show = [entryPoint.pathSegments.last];
   }
 
-  Uri entryPoint = Uri.base.resolve(nativeToUriPath(file));
   List<String> options = <String>[];
   if (useKernel) {
     options.add(Flags.useKernel);
@@ -42,7 +45,7 @@
   CompiledData data = await computeData(
       entryPoint, const {}, useKernel ? computeKernelData : computeAstData,
       options: options,
-      forMainLibraryOnly: false,
+      forUserLibrariesOnly: false,
       skipUnprocessedMembers: true,
       skipFailedCompilations: true,
       verbose: verbose);
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index 1de091b..ce8349f 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -20,19 +20,19 @@
 test(o) => o is double || o is String || o is int;
 
 @noInline
-genericMethod1<T>(T t) {
+method1<T>(T t) {
   test(t);
-  print('genericMethod1:');
+  print('method1:');
   print('$t is $T = ${t is T}');
   print('"foo" is $T = ${"foo" is T}');
   print('');
 }
 
 @noInline
-genericMethod2<T, S>(S s, T t) {
+method2<T, S>(S s, T t) {
   test(t);
   test(s);
-  print('genericMethod2:');
+  print('method2:');
   print('$t is $T = ${t is T}');
   print('$s is $T = ${s is T}');
   print('$t is $S = ${t is S}');
@@ -41,10 +41,10 @@
 }
 
 @tryInline
-genericMethod3<T, S>(T t, S s) {
+method3<T, S>(T t, S s) {
   test(t);
   test(s);
-  print('genericMethod3:');
+  print('method3:');
   print('$t is $T = ${t is T}');
   print('$s is $T = ${s is T}');
   print('$t is $S = ${t is S}');
@@ -52,30 +52,118 @@
   print('');
 }
 
-main() {
-  genericMethod1<int>(0);
-  genericMethod2<String, double>(0.5, 'foo');
-  genericMethod3<double, String>(1.5, 'bar');
+class Class1<T> {
+  final int index;
+
+  Class1(this.index);
+
+  String toString() => 'c$index';
+}
+
+method4<T>(int index) => new Class1<T>(index);
+
+testMethod4() {
+  print('method4:');
+  var c1 = method4<int>(1);
+  var c2 = method4<String>(2);
+  print('$c1 is Class1<int> = ${c1 is Class1<int>}');
+  print('$c2 is Class1<int> = ${c2 is Class1<int>}');
+  print('$c1 is Class1<String> = ${c1 is Class1<String>}');
+  print('$c2 is Class1<String> = ${c2 is Class1<String>}');
+  print('');
+}
+
+class Class2 {
+  @tryInline
+  method5<T>(T t) {
+    test(t);
+    print('Class2.method5:');
+    print('$t is $T = ${t is T}');
+    print('"foo" is $T = ${"foo" is T}');
+    print('');
+  }
+
+  @noInline
+  method6(o) {
+    print('Class2.method6:');
+    print('$o is int = ${o is int}');
+    print('$o is String = ${o is String}');
+    print('');
+  }
+}
+
+class Class3 {
+  @noInline
+  method6<T>(T t) {
+    test(t);
+    print('Class3.method6:');
+    print('$t is $T = ${t is T}');
+    print('"foo" is $T = ${"foo" is T}');
+    print('');
+  }
+}
+
+main(args) {
+  method1<int>(0);
+  method2<String, double>(0.5, 'foo');
+  method3<double, String>(1.5, 'bar');
+  testMethod4();
+  new Class2().method5<int>(0);
+  new Class3().method6<int>(0);
+  dynamic c3 = args != null ? new Class3() : new Class2();
+  c3.method6(0); // Missing type arguments.
+  try {
+    dynamic c2 = args == null ? new Class3() : new Class2();
+    c2.method6(0); // Valid call.
+    c2.method6<int>(0); // Extra type arguments.
+  } catch (e) {
+    print('noSuchMethod: Class2.method6<int>');
+    print('');
+  }
 }
 ''';
 
 const String OUTPUT = r'''
-genericMethod1:
+method1:
 0 is int = true
 "foo" is int = false
 
-genericMethod2:
+method2:
 foo is String = true
 0.5 is String = false
 foo is double = false
 0.5 is double = true
 
-genericMethod3:
+method3:
 1.5 is double = true
 bar is double = false
 1.5 is String = false
 bar is String = true
 
+method4:
+c1 is Class1<int> = true
+c2 is Class1<int> = false
+c1 is Class1<String> = false
+c2 is Class1<String> = true
+
+Class2.method5:
+0 is int = true
+"foo" is int = false
+
+Class3.method6:
+0 is int = true
+"foo" is int = false
+
+Class3.method6:
+0 is dynamic = true
+"foo" is dynamic = true
+
+Class2.method6:
+0 is int = true
+0 is String = false
+
+noSuchMethod: Class2.method6<int>
+
 ''';
 
 main(List<String> args) {
@@ -88,16 +176,28 @@
     ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
 
-    void checkMethod(String name, int expectedParameterCount) {
-      FunctionEntity function = elementEnvironment.lookupLibraryMember(
-          elementEnvironment.mainLibrary, name);
-      Expect.isNotNull(function, "Method '$name' not found.");
-      js.Fun fun = compiler.backend.generatedCode[function];
+    void checkMethod(String methodName,
+        {String className, int expectedParameterCount}) {
+      FunctionEntity method;
+      if (className != null) {
+        ClassEntity cls = elementEnvironment.lookupClass(
+            elementEnvironment.mainLibrary, className);
+        Expect.isNotNull(cls, "Class '$className' not found.");
+        method = elementEnvironment.lookupClassMember(cls, methodName);
+        Expect.isNotNull(method, "Method '$methodName' not found in $cls.");
+      } else {
+        method = elementEnvironment.lookupLibraryMember(
+            elementEnvironment.mainLibrary, methodName);
+        Expect.isNotNull(method, "Method '$methodName' not found.");
+      }
+      js.Fun fun = compiler.backend.generatedCode[method];
       Expect.equals(expectedParameterCount, fun.params.length,
-          "Unexpected parameter count for $function:\n${js.nodeToString(fun)}");
+          "Unexpected parameter count for $method:\n${js.nodeToString(fun)}");
     }
 
-    checkMethod('genericMethod1', 2);
-    checkMethod('genericMethod2', 4);
+    checkMethod('method1', expectedParameterCount: 2);
+    checkMethod('method2', expectedParameterCount: 4);
+    checkMethod('method6', className: 'Class2', expectedParameterCount: 1);
+    checkMethod('method6', className: 'Class3', expectedParameterCount: 2);
   });
 }
diff --git a/tests/compiler/dart2js/generic_methods/world_test.dart b/tests/compiler/dart2js/generic_methods/world_test.dart
new file mode 100644
index 0000000..77af52d
--- /dev/null
+++ b/tests/compiler/dart2js/generic_methods/world_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/universe/call_structure.dart';
+import 'package:compiler/src/universe/world_builder.dart';
+import 'package:expect/expect.dart';
+
+import '../memory_compiler.dart';
+
+const String code = r'''
+import 'package:meta/dart2js.dart';
+
+class Class1 {
+  @noInline
+  method1<T>() {}
+
+  @noInline
+  method2<T>() {}
+
+  @noInline
+  method3<T>() {}
+
+  @noInline
+  method4<T>() {}
+
+  @noInline
+  method5<T>() {}
+}
+
+class Class2 {}
+
+class Class3 implements Class1 {
+  @noInline
+  method1<T>() {}
+
+  @noInline
+  method2<T>() {}
+
+  @noInline
+  method3<T>() {}
+
+  @noInline
+  method4<T>() {}
+
+  @noInline
+  method5<T>() {}
+}
+
+main(args) {
+  dynamic c1 = args != null ? new Class1() : new Class2();
+  c1.method1(); // No type arguments are inferred here.
+
+  dynamic c2 = args != null ? new Class1() : new Class2();
+  c2.method2<int>();
+
+  var c3 = args != null ? new Class1() : new Class3();
+  c3.method3(); // Type arguments are inferred here.
+
+  var c4 = args != null ? new Class1() : new Class3();
+  c4.method4<int>();
+
+  dynamic c5 = args != null ? new Class1() : new Class2();
+  c5.method5(); // No type arguments are inferred here.
+
+  var c6 = args != null ? new Class1() : new Class3();
+  c6.method5();  // Type arguments are inferred here.
+}
+''';
+
+main() {
+  asyncTest(() async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': code},
+        options: [Flags.useKernel, Flags.strongMode]);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    CodegenWorldBuilder worldBuilder = compiler.codegenWorldBuilder;
+
+    CallStructure noTypeArguments = new CallStructure(0, [], 0);
+    CallStructure oneTypeArgument = new CallStructure(0, [], 1);
+
+    Iterable<CallStructure> getCallStructures(String name) {
+      return worldBuilder
+              .invocationsByName(name)
+              ?.keys
+              ?.map((s) => s.callStructure) ??
+          [];
+    }
+
+    void checkInvocationsFor(
+        String methodName, List<CallStructure> expectedCallStructures) {
+      Iterable<CallStructure> actualCallStructures =
+          getCallStructures(methodName);
+      Expect.setEquals(
+          expectedCallStructures,
+          actualCallStructures,
+          "Unexpected call structures for '$methodName'. "
+          "Expected ${expectedCallStructures}, "
+          "actual ${actualCallStructures}.");
+    }
+
+    checkInvocationsFor('method1', [noTypeArguments]);
+    checkInvocationsFor('method2', [oneTypeArgument]);
+    checkInvocationsFor('method3', [oneTypeArgument]);
+    checkInvocationsFor('method4', [oneTypeArgument]);
+    checkInvocationsFor('method5', [noTypeArguments, oneTypeArgument]);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/data/and_or.dart b/tests/compiler/dart2js/inference/data/and_or.dart
new file mode 100644
index 0000000..e1b9c27
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/and_or.dart
@@ -0,0 +1,133 @@
+// 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.
+
+/*element: X.:[exact=X]*/
+class X {}
+
+/*element: returnDyn1:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn1() {
+  var a;
+  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) ||
+      ((a = 'foo') /*invoke: Value([exact=JSString], value: "foo")*/ == true);
+  return a;
+}
+
+/*element: returnDyn2:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn2() {
+  var a;
+  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) &&
+      ((a = 'foo') /*invoke: Value([exact=JSString], value: "foo")*/ == true);
+  return a;
+}
+
+/*element: returnDyn3:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn3() {
+  var a;
+  a = a == 54 ? 'foo' : 31;
+  return a;
+}
+
+/*element: returnDyn4:Union([exact=JSUInt31], [exact=X])*/
+returnDyn4() {
+  var a;
+  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) ||
+      ((a = new X()) /*invoke: [exact=X]*/ == true);
+  return a;
+}
+
+/*element: returnDyn5:Union([exact=JSUInt31], [exact=X])*/
+returnDyn5() {
+  var a;
+  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) &&
+      ((a = new X()) /*invoke: [exact=X]*/ == true);
+  return a;
+}
+
+/*element: returnDyn6:Union([exact=JSString], [exact=X])*/
+returnDyn6() {
+  var a;
+  a = a == 54 ? 'foo' : new X();
+  return a;
+}
+
+/*element: returnDyn7b:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn7b(
+    /*Union([exact=JSString], [exact=JSUInt31])*/ x) {
+  return x;
+}
+
+/*element: returnDyn7:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn7() {
+  dynamic a = "foo";
+  if (a. /*Value([exact=JSString], value: "foo")*/ length
+      /*invoke: [subclass=JSInt]*/ ==
+      3) {
+    a = 52;
+  }
+  if ((a is int) || (a is String && true)) returnDyn7b(a);
+  return a;
+}
+
+/*element: returnDyn8:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn8(
+    /*Union([exact=JSString], [exact=JSUInt31])*/ x) {
+  return x;
+}
+
+/*element: test8:Union([exact=JSUInt31], [null|exact=JSString])*/ test8() {
+  dynamic a = "foo";
+  if (a. /*Value([exact=JSString], value: "foo")*/ length
+      /*invoke: [subclass=JSInt]*/ ==
+      3) {
+    a = 52;
+  }
+  // ignore: dead_code
+  if ((false && a is! String) || returnDyn8(a)) return a;
+}
+
+/*element: returnDyn9:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn9(
+    /*Union([exact=JSString], [exact=JSUInt31])*/ x) {
+  return x;
+}
+
+/*element: test9:[null]*/
+test9() {
+  dynamic a = "foo";
+  if (a. /*Value([exact=JSString], value: "foo")*/ length
+      /*invoke: [subclass=JSInt]*/ ==
+      3) {
+    a = 52;
+  }
+  if (!(a is bool && a is bool)) returnDyn9(a);
+}
+
+/*element: returnString:[exact=JSString]*/ returnString(
+        /*[exact=JSString]*/ x) =>
+    x;
+
+/*element: test10:[null]*/
+test10() {
+  dynamic a = "foo";
+  if (a. /*Value([exact=JSString], value: "foo")*/ length
+      /*invoke: [subclass=JSInt]*/ ==
+      3) {
+    a = 52;
+  }
+  if (!(a is num) && a is String) returnString(a);
+}
+
+/*element: main:[null]*/
+main() {
+  returnDyn1();
+  returnDyn2();
+  returnDyn3();
+  returnDyn4();
+  returnDyn5();
+  returnDyn6();
+  returnDyn7();
+  test8();
+  test9();
+  test10();
+}
diff --git a/tests/compiler/dart2js/inference/data/closure2.dart b/tests/compiler/dart2js/inference/data/closure2.dart
new file mode 100644
index 0000000..285ff02
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closure2.dart
@@ -0,0 +1,135 @@
+// 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.
+
+/*element: returnInt1:[exact=JSUInt31]*/
+returnInt1() {
+  var a = 42;
+  // ignore: unused_local_variable
+  var f = /*[exact=JSUInt31]*/ () {
+    return a;
+  };
+  return a;
+}
+
+/*element: returnDyn1:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+returnDyn1() {
+  dynamic a = 42;
+  // ignore: unused_local_variable
+  var f = /*[null]*/ () {
+    a = {};
+  };
+  return a;
+}
+
+/*element: returnInt2:[exact=JSUInt31]*/
+returnInt2() {
+  var a = 42;
+  // ignore: unused_local_variable
+  var f = /*[null]*/ () {
+    a = 54;
+  };
+  return a;
+}
+
+/*element: returnDyn2:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+returnDyn2() {
+  dynamic a = 42;
+  // ignore: unused_local_variable
+  var f = /*[null]*/ () {
+    a = 54;
+  };
+  // ignore: unused_local_variable
+  var g = /*[null]*/ () {
+    a = {};
+  };
+  return a;
+}
+
+/*element: returnInt3:[exact=JSUInt31]*/
+returnInt3() {
+  var a = 42;
+  if (a /*invoke: [exact=JSUInt31]*/ == 53) {
+    // ignore: unused_local_variable
+    var f = /*[exact=JSUInt31]*/ () {
+      return a;
+    };
+  }
+  return a;
+}
+
+/*element: returnDyn3:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+returnDyn3() {
+  dynamic a = 42;
+  if (a /*invoke: Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/ == 53) {
+    // ignore: unused_local_variable
+    var f = /*[null]*/ () {
+      a = {};
+    };
+  }
+  return a;
+}
+
+/*element: returnInt4:[exact=JSUInt31]*/
+returnInt4() {
+  var a = 42;
+  /*[exact=JSUInt31]*/ g() {
+    return a;
+  }
+
+  return g();
+}
+
+/*element: returnNum1:Union([exact=JSDouble], [exact=JSUInt31])*/
+returnNum1() {
+  dynamic a = 42.5;
+  try {
+    /*[exact=JSUInt31]*/ g() {
+      dynamic b = {};
+      b = 42;
+      return b;
+    }
+
+    a = g();
+  } finally {}
+  return a;
+}
+
+/*element: returnIntOrNull:[null|exact=JSUInt31]*/
+returnIntOrNull() {
+  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+  /*current: [exact=ArrayIterator]*/
+  /*moveNext: [exact=ArrayIterator]*/
+  for (
+      // ignore: unused_local_variable
+      var b in [42]) {
+    var bar = 42;
+    /*[null|exact=JSUInt31]*/ f() => bar;
+    bar = null;
+    return f();
+  }
+  return 42;
+}
+
+/*element: A.:[exact=A]*/
+class A {
+  /*element: A.foo:[exact=A]*/
+  foo() {
+    /*[exact=A]*/ f() => this;
+    return f();
+  }
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt1();
+  returnDyn1();
+  returnInt2();
+  returnDyn2();
+  returnInt3();
+  returnDyn3();
+  returnInt4();
+  returnNum1();
+  returnIntOrNull();
+  new A(). /*invoke: [exact=A]*/ foo();
+}
diff --git a/tests/compiler/dart2js/inference/data/const_closure.dart b/tests/compiler/dart2js/inference/data/const_closure.dart
new file mode 100644
index 0000000..137c2b7
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/const_closure.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: method1:[exact=JSUInt31]*/
+method1() {
+  return 42;
+}
+
+/*element: method2:[exact=JSUInt31]*/
+method2(/*[exact=JSUInt31]*/ a) {
+  // Called only via [foo2] with a small integer.
+  return a;
+}
+
+/*element: foo1:[subclass=Closure]*/
+const foo1 = method1;
+
+/*element: foo2:[subclass=Closure]*/
+const foo2 = method2;
+
+/*element: returnInt1:[null|subclass=Object]*/
+returnInt1() {
+  return foo1();
+}
+
+/*element: returnInt2:[null|subclass=Object]*/
+returnInt2() {
+  return foo2(54);
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt1();
+  returnInt2();
+}
diff --git a/tests/compiler/dart2js/inference/data/const_closure2.dart b/tests/compiler/dart2js/inference/data/const_closure2.dart
new file mode 100644
index 0000000..26b76ff
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/const_closure2.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.
+
+/*element: method:Union([exact=JSDouble], [exact=JSUInt31])*/
+// Called via [foo] with integer then double.
+method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
+  return a;
+}
+
+/*element: foo:[subclass=Closure]*/
+const foo = method;
+
+/*element: returnNum:[null|subclass=Object]*/
+returnNum(/*Union([exact=JSDouble], [exact=JSUInt31])*/ x) {
+  return foo(x);
+}
+
+/*element: main:[null]*/
+main() {
+  returnNum(10);
+  returnNum(10.5);
+}
diff --git a/tests/compiler/dart2js/inference/data/const_closure3.dart b/tests/compiler/dart2js/inference/data/const_closure3.dart
new file mode 100644
index 0000000..74b97a0
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/const_closure3.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: method:[exact=JSUInt31]*/
+// Called only via [foo2] with a small integer.
+method(/*[exact=JSUInt31]*/ a) {
+  return a;
+}
+
+/*element: foo:[subclass=Closure]*/
+const foo = method;
+
+/*element: returnInt:[null|subclass=Object]*/
+returnInt() {
+  return foo(54);
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt();
+}
diff --git a/tests/compiler/dart2js/inference/data/const_closure4.dart b/tests/compiler/dart2js/inference/data/const_closure4.dart
new file mode 100644
index 0000000..26b76ff
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/const_closure4.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.
+
+/*element: method:Union([exact=JSDouble], [exact=JSUInt31])*/
+// Called via [foo] with integer then double.
+method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
+  return a;
+}
+
+/*element: foo:[subclass=Closure]*/
+const foo = method;
+
+/*element: returnNum:[null|subclass=Object]*/
+returnNum(/*Union([exact=JSDouble], [exact=JSUInt31])*/ x) {
+  return foo(x);
+}
+
+/*element: main:[null]*/
+main() {
+  returnNum(10);
+  returnNum(10.5);
+}
diff --git a/tests/compiler/dart2js/inference/data/const_closure5.dart b/tests/compiler/dart2js/inference/data/const_closure5.dart
new file mode 100644
index 0000000..3055295
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/const_closure5.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.
+
+/*element: method:Union([exact=JSDouble], [exact=JSUInt31])*/
+// Called only via [foo2] with a small integer.
+method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
+  return a;
+}
+
+/*element: foo:[subclass=Closure]*/
+const foo = method;
+
+/*element: returnInt:[null|subclass=Object]*/
+returnInt() {
+  return foo(54);
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt();
+  method(55.2);
+}
diff --git a/tests/compiler/dart2js/inference/data/const_closure_default.dart b/tests/compiler/dart2js/inference/data/const_closure_default.dart
new file mode 100644
index 0000000..3217dcb
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/const_closure_default.dart
@@ -0,0 +1,54 @@
+// 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.
+
+// [defaultFn_i] is called only via [foo_i]'s default value with a small integer.
+
+/*element: defaultFn1:[exact=JSUInt31]*/
+defaultFn1(/*[exact=JSUInt31]*/ a) => a;
+
+/*element: defaultFn2:[exact=JSUInt31]*/
+defaultFn2(/*[exact=JSUInt31]*/ a) => a;
+
+/*element: defaultFn3:[exact=JSUInt31]*/
+defaultFn3(/*[exact=JSUInt31]*/ a) => a;
+
+/*element: defaultFn4:[exact=JSUInt31]*/
+defaultFn4(/*[exact=JSUInt31]*/ a) => a;
+
+/*element: defaultFn5:[exact=JSUInt31]*/
+defaultFn5(/*[exact=JSUInt31]*/ a) => a;
+
+/*element: defaultFn6:[exact=JSUInt31]*/
+defaultFn6(/*[exact=JSUInt31]*/ a) => a;
+
+/*element: foo1:[null|subclass=Object]*/
+foo1([/*[subclass=Closure]*/ fn = defaultFn1]) => fn(54);
+
+/*element: foo2:[null|subclass=Object]*/
+foo2({/*[subclass=Closure]*/ fn: defaultFn2}) => fn(54);
+
+/*element: foo3:[null|subclass=Object]*/
+foo3([/*[subclass=Closure]*/ fn = defaultFn3]) => fn(54);
+
+/*element: foo4:[null|subclass=Object]*/
+foo4({/*[subclass=Closure]*/ fn: defaultFn4}) => fn(54);
+
+/*element: foo5:[null|subclass=Object]*/
+foo5([/*[null|subclass=Object]*/ fn = defaultFn5]) => fn(54);
+
+/*element: foo6:[null|subclass=Object]*/
+foo6({/*[null|subclass=Object]*/ fn: defaultFn6}) => fn(54);
+
+/*element: main:[null]*/
+main() {
+  // Direct calls.
+  foo1();
+  foo2();
+  // Indirect calls.
+  (foo3)();
+  (foo4)();
+  // Calls via Function.apply.
+  Function.apply(foo5, []);
+  Function.apply(foo6, []);
+}
diff --git a/tests/compiler/dart2js/inference/data/field_type.dart b/tests/compiler/dart2js/inference/data/field_type.dart
new file mode 100644
index 0000000..6936a0e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/field_type.dart
@@ -0,0 +1,767 @@
+// 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.
+
+/*element: main:[null]*/
+main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+  test7();
+  test8();
+  test9();
+  test10();
+  test11();
+  test12();
+  test13();
+  test14();
+  test15();
+  test16();
+  test17();
+  test18();
+  test19();
+  test20();
+  test21();
+  test22();
+  test23();
+  test24();
+  test25();
+  test26();
+  test27();
+  test28();
+  test29();
+  test30();
+}
+
+/*element: A1.:[exact=A1]*/
+class A1 {
+  /*element: A1.f1:[null]*/
+  int f1;
+}
+
+/*element: test1:[null]*/
+test1() {
+  new A1();
+}
+
+/*element: A2.:[exact=A2]*/
+class A2 {
+  /*element: A2.f2a:[null]*/
+  int f2a;
+
+  /*element: A2.f2b:[exact=JSUInt31]*/
+  int f2b = 1;
+}
+
+/*element: test2:[null]*/
+test2() {
+  new A2();
+}
+
+class A3 {
+  /*element: A3.f3a:[exact=JSUInt31]*/
+  int f3a;
+
+  /*element: A3.f3b:[null|exact=JSUInt31]*/
+  int f3b;
+
+  /*element: A3.:[exact=A3]*/
+  A3() : f3a = 1;
+}
+
+/*element: test3:[null]*/
+test3() {
+  new A3(). /*update: [exact=A3]*/ f3b = 2;
+}
+
+class A4 {
+  /*element: A4.f4a:Union([exact=JSString], [exact=JSUInt31])*/
+  dynamic f4a;
+
+  /*element: A4.f4b:Value([null|exact=JSString], value: "a")*/
+  dynamic f4b;
+
+  /*element: A4.:[exact=A4]*/
+  A4() : f4a = 1;
+}
+
+/*element: test4:[null]*/
+test4() {
+  A4 a = new A4();
+  a. /*update: [exact=A4]*/ f4a = "a";
+  a. /*update: [exact=A4]*/ f4b = "a";
+}
+
+class A5 {
+  /*element: A5.f5a:Union([exact=JSString], [exact=JSUInt31])*/
+  dynamic f5a = 1;
+
+  /*element: A5.f5b:Union([exact=JSString], [exact=JSUInt31])*/
+  dynamic f5b = 1;
+
+  /*element: A5.:[exact=A5]*/
+  A5(/*[exact=JSBool]*/ x) {
+    /*update: [exact=A5]*/ f5a = "1";
+    if (x) {
+      /*update: [exact=A5]*/ f5b = "1";
+    } else {
+      /*update: [exact=A5]*/ f5b = "2";
+    }
+  }
+}
+
+/*element: test5:[null]*/
+test5() {
+  new A5(true);
+  new A5(false);
+}
+
+class A6 {
+  /*element: A6.f6a:Union([exact=JSString], [exact=JSUInt31])*/
+  dynamic f6a = 1;
+
+  /*element: A6.f6b:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
+  dynamic f6b = 1;
+
+  /*element: A6.:[exact=A6]*/
+  A6(/*[exact=JSBool]*/ x) {
+    /*update: [exact=A6]*/ f6a = "1";
+    if (x) {
+      /*update: [exact=A6]*/ f6b = "1";
+    } else {
+      /*update: [exact=A6]*/ f6b = "2";
+    }
+    if (x) {
+      /*update: [exact=A6]*/ f6b = new List();
+    } else {
+      /*update: [exact=A6]*/ f6b = new List();
+    }
+  }
+}
+
+/*element: test6:[null]*/
+test6() {
+  new A6(true);
+  new A6(false);
+}
+
+class A7 {
+  /*element: A7.f7a:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
+  dynamic f7a = 1;
+
+  /*element: A7.f7b:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
+  dynamic f7b = 1;
+
+  /*element: A7.:[exact=A7]*/
+  A7(/*[exact=JSBool]*/ x) {
+    /*update: [exact=A7]*/ f7a = "1";
+    if (x) {
+      /*update: [exact=A7]*/ f7b = "1";
+    } else {
+      /*update: [exact=A7]*/ f7b = "2";
+    }
+    if (x) {
+      /*update: [exact=A7]*/ f7a = new List();
+      /*update: [exact=A7]*/ f7b = new List();
+    } else {
+      /*update: [exact=A7]*/ f7b = new List();
+    }
+  }
+}
+
+/*element: test7:[null]*/
+test7() {
+  new A7(true);
+  new A7(false);
+}
+
+class A8 {
+  /*element: A8.f8:Value([null|exact=JSString], value: "1")*/
+  dynamic f8;
+
+  /*element: A8.:[exact=A8]*/
+  A8(/*[exact=JSBool]*/ x) {
+    if (x) {
+      /*update: [exact=A8]*/ f8 = "1";
+    } else {}
+  }
+}
+
+/*element: test8:[null]*/
+test8() {
+  new A8(true);
+  new A8(false);
+}
+
+class A9 {
+  /*element: A9.f9:Value([null|exact=JSString], value: "1")*/
+  dynamic f9;
+
+  /*element: A9.:[exact=A9]*/
+  A9(/*[exact=JSBool]*/ x) {
+    if (x) {} else {
+      /*update: [exact=A9]*/ f9 = "1";
+    }
+  }
+}
+
+/*element: test9:[null]*/
+test9() {
+  new A9(true);
+  new A9(false);
+}
+
+class A10 {
+  /*element: A10.f10:[exact=JSUInt31]*/
+  int f10;
+
+  /*element: A10.:[exact=A10]*/
+  A10() {
+    /*update: [exact=A10]*/ f10 = 1;
+  }
+  /*element: A10.m10:[subclass=JSUInt32]*/
+  m10() => /*[exact=A10]*/ f10 /*invoke: [exact=JSUInt31]*/ + 1;
+}
+
+/*element: f10:[null]*/
+void f10(/*[null]*/ x) {
+  x. /*update: [null]*/ f10 = "2";
+}
+
+/*element: test10:[null]*/
+test10() {
+  A10 a;
+  f10(a);
+  a = new A10();
+  a. /*invoke: [exact=A10]*/ m10();
+}
+
+/*element: S11.:[exact=S11]*/
+class S11 {
+  /*element: S11.fs11:[exact=JSUInt31]*/
+  int fs11 = 1;
+
+  /*element: S11.ms11:[null]*/
+  ms11() {
+    /*update: [exact=A11]*/ fs11 = 1;
+  }
+}
+
+/*element: A11.:[exact=A11]*/
+class A11 extends S11 {
+  /*element: A11.m11:[null]*/
+  m11() {
+    /*invoke: [exact=A11]*/ ms11();
+  }
+}
+
+/*element: test11:[null]*/
+test11() {
+  A11 a = new A11();
+  a. /*invoke: [exact=A11]*/ m11();
+}
+
+class S12 {
+  /*element: S12.fs12:Union([exact=JSString], [exact=JSUInt31])*/
+  dynamic fs12 = 1;
+
+  /*element: S12.:[exact=S12]*/
+  S12() {
+    /*update: [exact=A12]*/ fs12 = "2";
+  }
+}
+
+/*element: A12.:[exact=A12]*/
+class A12 extends S12 {}
+
+/*element: test12:[null]*/
+test12() {
+  new A12();
+}
+
+class S13 {
+/*element: S13.fs13:[exact=JSUInt31]*/
+  int fs13;
+
+  /*element: S13.:[exact=S13]*/
+  S13() {
+    /*update: [exact=A13]*/ fs13 = 1;
+  }
+}
+
+class A13 extends S13 {
+  /*element: A13.:[exact=A13]*/
+  A13() {
+    /*update: [exact=A13]*/ fs13 = 1;
+  }
+}
+
+/*element: test13:[null]*/
+test13() {
+  new A13();
+}
+
+class A14 {
+  /*element: A14.f14:[exact=JSUInt31]*/
+  var f14;
+
+  /*element: A14.:[exact=A14]*/
+  A14() {
+    /*update: [exact=A14]*/ f14 = 1;
+  }
+  /*element: A14.other:[exact=A14]*/
+  A14.other() {
+    /*update: [exact=A14]*/ f14 = 2;
+  }
+}
+
+/*element: test14:[null]*/
+test14() {
+  // ignore: unused_local_variable
+  A14 a = new A14();
+  a = new A14.other();
+}
+
+class A15 {
+  /*element: A15.f15:Union([exact=JSExtendableArray], [exact=JSString])*/
+  var f15;
+
+  /*element: A15.:[exact=A15]*/
+  A15() {
+    /*update: [exact=A15]*/ f15 = "1";
+  }
+
+  /*element: A15.other:[exact=A15]*/
+  A15.other() {
+    /*update: [exact=A15]*/ f15 = new List();
+  }
+}
+
+/*element: test15:[null]*/
+test15() {
+  // ignore: unused_local_variable
+  A15 a = new A15();
+  a = new A15.other();
+}
+
+class A16 {
+  // TODO(johnniwinther): Investigate with these differ.
+  /*ast.element: A16.f16:Union([exact=JSString], [exact=JSUInt31])*/
+  /*kernel.element: A16.f16:Union([exact=JSString], [null|exact=JSUInt31])*/
+  var f16;
+
+  /*element: A16.:[exact=A16]*/
+  A16() {
+    /*update: [exact=A16]*/ f16 = "1";
+  }
+
+  /*element: A16.other:[exact=A16]*/
+  A16.other() : f16 = 1 {}
+}
+
+/*element: test16:[null]*/
+test16() {
+  // ignore: unused_local_variable
+  A16 a = new A16();
+  a = new A16.other();
+}
+
+/*element: g17:[exact=JSUInt31]*/
+g17([/*[exact=A17]*/ p]) => p. /*update: [exact=A17]*/ f17 = 1;
+
+class A17 {
+/*element: A17.f17:[null|exact=JSUInt31]*/
+  var f17;
+
+  /*element: A17.:[exact=A17]*/
+  A17(/*[exact=JSBool]*/ x) {
+    var a;
+    if (x) {
+      a = this;
+    } else {
+      a = g17;
+    }
+    a(this);
+  }
+}
+
+/*element: test17:[null]*/
+test17() {
+  new A17(true);
+  new A17(false);
+}
+
+class A18 {
+  /*element: A18.f18a:[exact=JSUInt31]*/
+  var f18a;
+
+  /*element: A18.f18b:Value([exact=JSString], value: "1")*/
+  var f18b;
+
+  /*element: A18.f18c:Union([exact=JSUInt31], [null|exact=A18])*/
+  var f18c;
+
+  /*element: A18.:[exact=A18]*/
+  A18(/*[exact=JSBool]*/ x) {
+    /*update: [exact=A18]*/ f18a = 1;
+    var a;
+    if (x) {
+      /*update: [exact=A18]*/ f18b = "1";
+      a = this;
+    } else {
+      a = 1;
+      /*update: [exact=A18]*/ f18b = "1";
+    }
+    /*update: [exact=A18]*/ f18c = a;
+  }
+}
+
+/*element: test18:[null]*/
+test18() {
+  new A18(true);
+  new A18(false);
+}
+
+class A19 {
+  /*element: A19.f19a:[exact=JSUInt31]*/
+  var f19a;
+
+  /*element: A19.f19b:Value([exact=JSString], value: "1")*/
+  var f19b;
+
+  /*element: A19.f19c:Union([exact=JSUInt31], [null|exact=A19])*/
+  var f19c;
+
+  /*element: A19.:[exact=A19]*/
+  A19(/*[exact=JSBool]*/ x) {
+    /*update: [exact=A19]*/ f19a = 1;
+    var a;
+    if (x) {
+      /*update: [exact=A19]*/ f19b = "1";
+      a = this;
+    } else {
+      a = 1;
+      /*update: [exact=A19]*/ f19b = "1";
+    }
+    /*update: [exact=A19]*/ f19c = a;
+    a();
+  }
+}
+
+/*element: test19:[null]*/
+test19() {
+  new A19(true);
+  new A19(false);
+}
+
+class A20 {
+  /*element: A20.f20:[null|exact=JSUInt31]*/
+  var f20;
+
+  /*element: A20.:[exact=A20]*/
+  A20() {
+    // TODO(johnniwinther): Fix ast equivalence on instance fields in for.
+    /*iterator: [exact=A20]*/
+    /*current: [exact=A20]*/
+    /*moveNext: [exact=A20]*/
+    for (/*kernel.update: [exact=A20]*/ f20 in
+        // ignore: for_in_of_invalid_type
+        this) {}
+  }
+
+  /*element: A20.iterator:[exact=A20]*/
+  get iterator => this;
+
+  /*element: A20.current:[exact=JSUInt31]*/
+  get current => 42;
+
+  /*element: A20.moveNext:Value([exact=JSBool], value: false)*/
+  bool moveNext() => false;
+}
+
+/*element: test20:[null]*/
+test20() {
+  new A20();
+}
+
+class A21 {
+  /*element: A21.f21:[null|exact=JSUInt31]*/
+  var f21;
+
+  /*element: A21.:[exact=A21]*/
+  A21() {
+    /*iterator: [exact=A21]*/
+    /*current: [null]*/
+    /*moveNext: [null]*/
+    for (
+        // ignore: unused_local_variable
+        var i
+        // ignore: for_in_of_invalid_type
+        in this) {}
+    /*update: [exact=A21]*/ f21 = 42;
+  }
+  /*element: A21.iterator:[null]*/
+  get iterator => null;
+}
+
+/*element: test21:[null]*/
+test21() {
+  new A21();
+}
+
+class A22 {
+  /*element: A22.f22a:[exact=JSUInt31]*/
+  var f22a;
+
+  /*element: A22.f22b:[exact=JSUInt31]*/
+  var f22b;
+
+  /*element: A22.f22c:Value([null|exact=JSString], value: "foo")*/
+  var f22c;
+
+  /*element: A22.:[exact=A22]*/
+  A22() {
+    /*update: [exact=A22]*/ f22a = 42;
+    /*update: [exact=A22]*/ f22b = /*[exact=A22]*/ f22a == null
+        ? 42
+        : /*[exact=A22]*/ f22c == null ? 41 : 43;
+    /*update: [exact=A22]*/ f22c = 'foo';
+  }
+}
+
+/*element: test22:[null]*/
+test22() {
+  new A22();
+}
+
+class A23 {
+  /*element: A23.f23a:[null|exact=JSUInt31]*/
+  var f23a = 42;
+
+  /*element: A23.f23b:[null|exact=JSUInt31]*/
+  var f23b = 42;
+
+  /*element: A23.f23c:[null|exact=JSUInt31]*/
+  var f23c = 42;
+
+  /*element: A23.f23d:[null|exact=JSUInt31]*/
+  var f23d = 42;
+
+  /*element: A23.:[exact=A23]*/
+  A23() {
+    // Test string interpolation.
+    '${/*update: [exact=A23]*/f23a = null}';
+    // Test string juxtaposition.
+    ''
+        '${/*update: [exact=A23]*/f23b = null}';
+    // Test list literal.
+    [/*update: [exact=A23]*/ f23c = null];
+    // Test map literal.
+    // ignore: unused_local_variable
+    var c = {'foo': /*update: [exact=A23]*/ f23d = null};
+  }
+}
+
+/*element: test23:[null]*/
+test23() {
+  new A23();
+}
+
+class A24 {
+  /*element: A24.f24a:[subclass=JSPositiveInt]*/
+  var f24a = 42;
+
+  /*element: A24.f24b:[subclass=JSPositiveInt]*/
+  var f24b = 42;
+
+  /*element: A24.f24c:[exact=JSUInt31]*/
+  var f24c = 42;
+
+  /*element: A24.f24d:[exact=JSUInt31]*/
+  final f24d;
+
+  /*element: A24.f24e:Union([exact=JSUInt31], [null|exact=JSDouble])*/
+  var f24e;
+
+/*element: A24.f24f:Value([null|exact=JSString], value: "foo")*/
+  var f24f = null;
+
+  /*element: A24.:[exact=A24]*/
+  A24() : f24d = 42 {
+    /*[subclass=A24]*/ /*update: [subclass=A24]*/ f24a
+        /*invoke: [subclass=JSPositiveInt]*/ ++;
+    /*[subclass=A24]*/ /*update: [subclass=A24]*/ f24b
+        /*invoke: [subclass=JSPositiveInt]*/ += 42;
+    var f24f = 'foo';
+    this. /*update: [subclass=A24]*/ f24f = f24f;
+  }
+
+  /*element: A24.foo:[exact=A24]*/
+  A24.foo(/*[subclass=A24]*/ other)
+      : f24c = other. /*[subclass=A24]*/ f24c,
+        f24d = other. /*[subclass=A24]*/ f24d,
+        f24e = other
+            . /*invoke: [subclass=A24]*/
+            bar24();
+
+  /*element: A24.+:Value([exact=JSString], value: "foo")*/
+  operator +(/*[exact=JSUInt31]*/ other) => 'foo';
+
+  /*element: A24.bar24:[exact=JSDouble]*/
+  bar24() => 42.5;
+}
+
+/*element: B24.:[exact=B24]*/
+class B24 extends A24 {
+  /*element: B24.bar24:[exact=JSUInt31]*/
+  bar24() => 42;
+}
+
+/*element: test24:[null]*/
+test24() {
+  new A24();
+  new A24.foo(new A24());
+  new A24.foo(new B24());
+}
+
+/*element: A25.:[exact=A25]*/
+class A25 {
+  /*element: A25.f25:[exact=JSUInt31]*/
+  var f25 = 42;
+}
+
+/*element: B25.:[exact=B25]*/
+class B25 {
+  /*element: B25.f25:Value([exact=JSString], value: "42")*/
+  var f25 = '42';
+}
+
+/*element: test25:[null]*/
+test25() {
+  new B25();
+  new A25(). /*update: [exact=A25]*/ f25 = new A25(). /*[exact=A25]*/ f25;
+}
+
+/*element: A26.:[exact=A26]*/
+class A26 {
+  /*element: A26.f26:[subclass=JSPositiveInt]*/
+  var f26 = 42;
+}
+
+/*element: B26.:[exact=B26]*/
+class B26 {
+  /*element: B26.f26:[exact=JSUInt31]*/
+  var f26 = 54;
+}
+
+/*element: test26:[null]*/
+test26() {
+  new A26(). /*update: [exact=A26]*/ f26 = [new B26(), new A26()]
+              /*Container([exact=JSExtendableArray], element: Union([exact=A26], [exact=B26]), length: 2)*/
+              [0]
+          // ignore: undefined_getter
+          . /*Union([exact=A26], [exact=B26])*/ f26
+      /*invoke: [subclass=JSPositiveInt]*/ +
+      42;
+}
+
+class A27 {
+  /*element: A27.f27a:[exact=JSUInt31]*/
+  var f27a;
+
+  /*element: A27.f27b:[null|exact=JSUInt31]*/
+  var f27b;
+
+  /*element: A27.:[exact=A27]*/
+  A27() {
+    this. /*update: [subclass=A27]*/ f27a = 42;
+    this. /*update: [subclass=A27]*/ f27b = 42;
+  }
+}
+
+/*element: B27.:[exact=B27]*/
+class B27 extends A27 {
+  set f27b(/*[exact=JSUInt31]*/ value) {}
+}
+
+/*element: test27:[null]*/
+test27() {
+  new A27();
+  new B27();
+}
+
+class A28 {
+  /*element: A28.f28a:[exact=JSUInt31]*/
+  var f28a;
+
+  /*element: A28.f28b:[null|exact=JSUInt31]*/
+  var f28b;
+
+  /*element: A28.:[exact=A28]*/
+  A28(/*[exact=JSUInt31]*/ x) {
+    this. /*update: [exact=A28]*/ f28a = x;
+    if (x /*invoke: [exact=JSUInt31]*/ == 0) return;
+    this. /*update: [exact=A28]*/ f28b = x;
+  }
+}
+
+/*element: test28:[null]*/
+test28() {
+  new A28(0);
+  new A28(1);
+}
+
+class A29 {
+  /*element: A29.f29a:[exact=JSUInt31]*/
+  var f29a;
+
+  /*element: A29.f29b:[null|exact=JSUInt31]*/
+  var f29b;
+
+  /*element: A29.:[exact=A29]*/
+  A29(/*[exact=JSUInt31]*/ x) {
+    this. /*update: [exact=A29]*/ f29a = x;
+    if (x /*invoke: [exact=JSUInt31]*/ == 0) {} else {
+      return;
+    }
+    this. /*update: [exact=A29]*/ f29b = x;
+  }
+}
+
+/*element: test29:[null]*/
+test29() {
+  new A29(0);
+  new A29(1);
+}
+
+class A30 {
+  /*element: A30.f30a:[exact=JSUInt31]*/
+  var f30a;
+
+  /*element: A30.f30b:[exact=JSUInt31]*/
+  var f30b;
+
+  /*element: A30.f30c:[null|exact=JSUInt31]*/
+  var f30c;
+
+  /*element: A30.:[exact=A30]*/
+  A30(/*[exact=JSUInt31]*/ x) {
+    this. /*update: [exact=A30]*/ f30a = x;
+    if (x /*invoke: [exact=JSUInt31]*/ == 0) {
+      this. /*update: [exact=A30]*/ f30b = 1;
+    } else {
+      this. /*update: [exact=A30]*/ f30b = x;
+      return;
+    }
+    this. /*update: [exact=A30]*/ f30c = x;
+  }
+}
+
+/*element: test30:[null]*/
+test30() {
+  new A30(0);
+  new A30(1);
+}
diff --git a/tests/compiler/dart2js/inference/data/final_field.dart b/tests/compiler/dart2js/inference/data/final_field.dart
new file mode 100644
index 0000000..0a1c13e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/final_field.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  /*element: A.intField:[exact=JSUInt31]*/
+  final intField;
+
+  /*element: A.giveUpField1:Union([exact=JSString], [exact=JSUInt31])*/
+  final giveUpField1;
+
+  /*element: A.giveUpField2:Union([exact=A], [exact=JSString])*/
+  final giveUpField2;
+
+  /*element: A.fieldParameter:[exact=JSUInt31]*/
+  final fieldParameter;
+
+  /*element: A.:[exact=A]*/
+  A()
+      : intField = 42,
+        giveUpField1 = 'foo',
+        giveUpField2 = 'foo',
+        fieldParameter = 54;
+
+  /*element: A.bar:[exact=A]*/
+  A.bar()
+      : intField = 54,
+        giveUpField1 = 42,
+        giveUpField2 = new A(),
+        fieldParameter = 87;
+
+  /*element: A.foo:[exact=A]*/
+  A.foo(this. /*[exact=JSUInt31]*/ fieldParameter)
+      : intField = 87,
+        giveUpField1 = 42,
+        giveUpField2 = 'foo';
+}
+
+/*element: main:[null]*/
+main() {
+  new A();
+  new A.bar();
+  new A.foo(42);
+}
diff --git a/tests/compiler/dart2js/inference/data/final_field2.dart b/tests/compiler/dart2js/inference/data/final_field2.dart
new file mode 100644
index 0000000..7b7a9aff
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/final_field2.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that a non-used generative constructor does not prevent
+// inferring types for fields.
+
+class A {
+  /*element: A.intField:[exact=JSUInt31]*/
+  final intField;
+
+  /*element: A.stringField:Value([exact=JSString], value: "foo")*/
+  final stringField;
+
+  /*element: A.:[exact=A]*/
+  A()
+      : intField = 42,
+        stringField = 'foo';
+
+  A.bar()
+      : intField = 'bar',
+        stringField = 42;
+}
+
+/*element: main:[null]*/
+main() {
+  new A();
+}
diff --git a/tests/compiler/dart2js/inference/data/final_field3.dart b/tests/compiler/dart2js/inference/data/final_field3.dart
new file mode 100644
index 0000000..f39e555
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/final_field3.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that we are analyzing field parameters correctly.
+
+class A {
+  /*element: A.dynamicField:Union([exact=JSString], [exact=JSUInt31])*/
+  final dynamicField;
+
+  /*element: A.:[exact=A]*/
+  A() : dynamicField = 42;
+
+  /*element: A.bar:[exact=A]*/
+  A.bar(this. /*Value([exact=JSString], value: "foo")*/ dynamicField);
+}
+
+/*element: main:[null]*/
+main() {
+  new A();
+  new A.bar('foo');
+}
diff --git a/tests/compiler/dart2js/inference/data/general.dart b/tests/compiler/dart2js/inference/data/general.dart
new file mode 100644
index 0000000..8616dce
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/general.dart
@@ -0,0 +1,931 @@
+// 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.
+
+/*element: returnNum1:Union([exact=JSDouble], [exact=JSUInt31])*/
+returnNum1(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a)
+    return 1;
+  else
+    return 2.5;
+}
+
+/*element: returnNum2:Union([exact=JSDouble], [exact=JSUInt31])*/
+returnNum2(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a)
+    return 1.4;
+  else
+    return 2;
+}
+
+/*element: returnInt1:[exact=JSUInt31]*/
+returnInt1(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a)
+    return 1;
+  else
+    return 2;
+}
+
+/*element: returnDouble:[exact=JSDouble]*/
+returnDouble(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a)
+    return 1.5;
+  else
+    return 2.5;
+}
+
+/*element: returnGiveUp:Union([exact=JSString], [exact=JSUInt31])*/
+returnGiveUp(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a)
+    return 1;
+  else
+    return 'foo';
+}
+
+/*element: returnInt2:[exact=JSUInt31]*/
+returnInt2() {
+  var a = 42;
+  return a /*invoke: [exact=JSUInt31]*/ ++;
+}
+
+/*element: returnInt5:[subclass=JSUInt32]*/
+returnInt5() {
+  var a = 42;
+  return /*invoke: [exact=JSUInt31]*/ ++a;
+}
+
+/*element: returnInt6:[subclass=JSUInt32]*/
+returnInt6() {
+  var a = 42;
+  a /*invoke: [exact=JSUInt31]*/ ++;
+  return a;
+}
+
+/*element: returnIntOrNull:[null|exact=JSUInt31]*/
+returnIntOrNull(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a) return 42;
+}
+
+/*element: returnInt3:[exact=JSUInt31]*/
+returnInt3(/*Value([exact=JSBool], value: true)*/ a) {
+  if (a) return 42;
+  throw 42;
+}
+
+/*element: returnInt4:[exact=JSUInt31]*/
+returnInt4() {
+  return (42);
+}
+
+/*element: returnInt7:[subclass=JSPositiveInt]*/
+returnInt7() {
+  return 42. /*invoke: [exact=JSUInt31]*/ abs();
+}
+
+/*element: returnInt8:[subclass=JSPositiveInt]*/
+returnInt8() {
+  return 42. /*invoke: [exact=JSUInt31]*/ remainder(54);
+}
+
+/*element: returnEmpty1:[empty]*/
+returnEmpty1() {
+  // Ensure that we don't intrisify a wrong call to [int.remainder].
+  // ignore: not_enough_required_arguments
+  return 42. /*invoke: [exact=JSUInt31]*/ remainder();
+}
+
+/*element: returnEmpty2:[empty]*/
+returnEmpty2() {
+  // Ensure that we don't intrisify a wrong call to [int.abs].
+  // ignore: extra_positional_arguments
+  return 42. /*invoke: [exact=JSUInt31]*/ abs(42);
+}
+
+/*element: testIsCheck1:[subclass=JSInt]*/
+testIsCheck1(/*[null|subclass=Object]*/ a) {
+  if (a is int) {
+    return a;
+  } else {
+    return 42;
+  }
+}
+
+/*element: testIsCheck2:[subclass=JSInt]*/
+testIsCheck2(/*[null|subclass=Object]*/ a) {
+  if (a is! int) {
+    return 0;
+  } else {
+    return a;
+  }
+}
+
+/*element: testIsCheck3:[null|subclass=JSInt]*/
+testIsCheck3(/*[null|subclass=Object]*/ a) {
+  if (a is! int) {
+    print('hello');
+  } else {
+    return a;
+  }
+}
+
+/*element: testIsCheck4:[subclass=JSInt]*/
+testIsCheck4(/*[null|subclass=Object]*/ a) {
+  if (a is int) {
+    return a;
+  } else {
+    return 42;
+  }
+}
+
+/*element: testIsCheck5:[subclass=JSInt]*/
+testIsCheck5(/*[null|subclass=Object]*/ a) {
+  if (a is! int) {
+    return 42;
+  } else {
+    return a;
+  }
+}
+
+/*element: testIsCheck6:[null|subclass=Object]*/
+testIsCheck6(/*[null|subclass=Object]*/ a) {
+  if (a is! int) {
+    return a;
+  } else {
+    return 42;
+  }
+}
+
+/*element: testIsCheck7:[subclass=JSInt]*/
+testIsCheck7(/*[null|subclass=Object]*/ a) {
+  if (a == 'foo' && a is int) {
+    return a;
+  } else {
+    return 42;
+  }
+}
+
+/*element: testIsCheck8:[null|subclass=Object]*/
+testIsCheck8(/*[null|subclass=Object]*/ a) {
+  if (a == 'foo' || a is int) {
+    return a;
+  } else {
+    return 42;
+  }
+}
+
+/*element: testIsCheck9:[subclass=JSInt]*/
+testIsCheck9(/*[null|subclass=Object]*/ a) {
+  return a is int ? a : 42;
+}
+
+/*element: testIsCheck10:[null|subclass=Object]*/
+testIsCheck10(/*[null|subclass=Object]*/ a) {
+  return a is! int ? a : 42;
+}
+
+/*element: testIsCheck11:[subclass=JSInt]*/
+testIsCheck11(/*[null|subclass=Object]*/ a) {
+  return a is! int ? 42 : a;
+}
+
+/*element: testIsCheck12:[null|subclass=Object]*/
+testIsCheck12(/*[null|subclass=Object]*/ a) {
+  return a is int ? 42 : a;
+}
+
+/*element: testIsCheck13:[subclass=JSInt]*/
+testIsCheck13(/*[null|subclass=Object]*/ a) {
+  while (a is int) {
+    return a;
+  }
+  return 42;
+}
+
+/*element: testIsCheck14:[null|subclass=Object]*/
+testIsCheck14(/*[null|subclass=Object]*/ a) {
+  while (a is! int) {
+    return 42;
+  }
+  return a;
+}
+
+// TODO(29309): Change to [subclass=JSInt] when 29309 is fixed.
+/*element: testIsCheck15:[null|subclass=Object]*/
+testIsCheck15(/*[null|subclass=Object]*/ a) {
+  var c = 42;
+  do {
+    if (a) return c;
+    c = topLevelGetter();
+  } while (c is int);
+  return 42;
+}
+
+/*element: testIsCheck16:[null|subclass=Object]*/
+testIsCheck16(/*[null|subclass=Object]*/ a) {
+  var c = 42;
+  do {
+    if (a) return c;
+    c = topLevelGetter();
+  } while (c is! int);
+  return 42;
+}
+
+/*element: testIsCheck17:[subclass=JSInt]*/
+testIsCheck17(/*[null|subclass=Object]*/ a) {
+  var c = 42;
+  for (; c is int;) {
+    if (a) return c;
+    c = topLevelGetter();
+  }
+  return 42;
+}
+
+/*element: testIsCheck18:[null|subclass=Object]*/
+testIsCheck18(/*[null|subclass=Object]*/ a) {
+  var c = 42;
+  for (; c is int;) {
+    if (a) return c;
+    c = topLevelGetter();
+  }
+  return c;
+}
+
+/*element: testIsCheck19:[null|subclass=Object]*/
+testIsCheck19(/*[null|subclass=Object]*/ a) {
+  var c = 42;
+  for (; c is! int;) {
+    if (a) return c;
+    c = topLevelGetter();
+  }
+  return 42;
+}
+
+/*element: testIsCheck20:Union([exact=JSString], [exact=JSUInt31])*/
+testIsCheck20() {
+  var c = topLevelGetter();
+  if (c != null && c is! bool && c is! int) {
+    return 42;
+  } else if (c is String) {
+    return c;
+  } else {
+    return 68;
+  }
+}
+
+/*element: testIsCheck21:[null|subclass=Object]*/
+testIsCheck21(/*[null|subclass=Object]*/ a) {
+  if (a is int || a is List) {
+    return a;
+  } else {
+    return 42;
+  }
+}
+
+/*element: testIsCheck22:[null|subclass=Object]*/
+testIsCheck22(/*[null|subclass=Object]*/ a) {
+  return (a is int || a is List) ? a : 42;
+}
+
+/*element: testIsCheck23:[subclass=JSInt]*/
+testIsCheck23(/*[null|subclass=Object]*/ a) {
+  if (a is! int) throw 'foo';
+  return a;
+}
+
+/*element: testIsCheck24:[subclass=JSInt]*/
+testIsCheck24(/*[null|subclass=Object]*/ a) {
+  if (a is! int) return 42;
+  return a;
+}
+
+/*element: testIsCheck25:[null|subclass=Object]*/
+testIsCheck25(/*[null|subclass=Object]*/ a) {
+  if (a is int) throw 'foo';
+  return a;
+}
+
+/*element: testIsCheck26:[subclass=JSInt]*/
+testIsCheck26(/*[null|subclass=Object]*/ a) {
+  if (a is int) {} else {
+    throw 42;
+  }
+  return a;
+}
+
+/*element: testIsCheck27:[subclass=JSInt]*/
+testIsCheck27(/*[null|subclass=Object]*/ a) {
+  if (a is int) {} else {
+    return 42;
+  }
+  return a;
+}
+
+/*element: testIsCheck28:[null|subclass=Object]*/
+testIsCheck28(/*[null|subclass=Object]*/ a) {
+  if (a is int) {} else {}
+  return a;
+}
+
+/*element: testIsCheck29:[null|subclass=Object]*/
+testIsCheck29(/*[null|subclass=Object]*/ a) {
+  if (a is int) {}
+  return a;
+}
+
+/*element: testIf1:[null|exact=JSUInt31]*/
+testIf1(/*[null|subclass=Object]*/ a) {
+  var c = null;
+  if (a) {
+    c = 10;
+  } else {}
+  return c;
+}
+
+/*element: testIf2:[null|exact=JSUInt31]*/
+testIf2(/*[null|subclass=Object]*/ a) {
+  var c = null;
+  if (a) {} else {
+    c = 10;
+  }
+  return c;
+}
+
+/*element: returnAsString:[null|exact=JSString]*/
+returnAsString() {
+  return topLevelGetter() as String;
+}
+
+/*element: returnIntAsNum:[exact=JSUInt31]*/
+returnIntAsNum() {
+  // ignore: unnecessary_cast
+  return 0 as num;
+}
+
+typedef int Foo();
+
+/*element: returnAsTypedef:[null|subclass=Closure]*/
+returnAsTypedef() {
+  return topLevelGetter() as Foo;
+}
+
+/*element: testDeadCode:[exact=JSUInt31]*/
+testDeadCode() {
+  return 42;
+  // ignore: dead_code
+  return 'foo';
+}
+
+/*element: testLabeledIf:[null|exact=JSUInt31]*/
+testLabeledIf(/*Value([exact=JSBool], value: true)*/ a) {
+  var c;
+  L1:
+  if (a /*invoke: Value([exact=JSBool], value: true)*/ > 1) {
+    if (a /*invoke: [empty]*/ == 2) {
+      break L1;
+    }
+    c = 42;
+  } else {
+    c = 38;
+  }
+  return c;
+}
+
+/*element: testSwitch1:Union([exact=JSUInt31], [null|exact=JSDouble])*/
+testSwitch1() {
+  var a = null;
+  switch (topLevelGetter) {
+    case 100:
+      a = 42.5;
+      break;
+    case 200:
+      a = 42;
+      break;
+  }
+  return a;
+}
+
+/*element: testSwitch2:[exact=JSUInt31]*/
+testSwitch2() {
+  var a = null;
+  switch (topLevelGetter) {
+    case 100:
+      a = 42;
+      break;
+    case 200:
+      a = 42;
+      break;
+    default:
+      a = 43;
+  }
+  return a;
+}
+
+/*element: testSwitch3:Union([null|exact=JSString], [subclass=JSNumber])*/
+testSwitch3() {
+  dynamic a = 42;
+  var b;
+  switch (topLevelGetter) {
+    L1:
+    case 1:
+      b = a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + 42;
+      break;
+    case 2:
+      a = 'foo';
+      continue L1;
+  }
+  return b;
+}
+
+/*element: testSwitch4:[exact=JSUInt31]*/
+testSwitch4() {
+  switch (topLevelGetter) {
+    case 1:
+      break;
+    default:
+      break;
+  }
+  return 42;
+}
+
+/*element: testSwitch5:[exact=JSUInt31]*/
+testSwitch5() {
+  switch (topLevelGetter) {
+    case 1:
+      return 1;
+    default:
+      return 2;
+  }
+}
+
+/*element: testContinue1:Union([null|exact=JSString], [subclass=JSNumber])*/
+testContinue1() {
+  dynamic a = 42;
+  var b;
+  while (true) {
+    b = a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + 54;
+    if (b /*invoke: Union([exact=JSString], [subclass=JSNumber])*/ == 42)
+      continue;
+    a = 'foo';
+  }
+  // ignore: dead_code
+  return b;
+}
+
+/*element: testBreak1:Union([null|exact=JSString], [subclass=JSUInt32])*/
+testBreak1() {
+  var a = 42;
+  var b;
+  while (true) {
+    b = a /*invoke: [exact=JSUInt31]*/ + 54;
+    if (b /*invoke: [subclass=JSUInt32]*/ == 42) break;
+    b = 'foo';
+  }
+  return b;
+}
+
+/*element: testContinue2:Union([exact=JSString], [null|subclass=JSUInt32])*/
+testContinue2() {
+  var a = 42;
+  var b;
+  while (true) {
+    b = a /*invoke: [exact=JSUInt31]*/ + 54;
+    if (b /*invoke: [subclass=JSUInt32]*/ == 42) {
+      b = 'foo';
+      continue;
+    }
+  }
+  // ignore: dead_code
+  return b;
+}
+
+/*element: testBreak2:[null|subclass=JSUInt32]*/
+testBreak2() {
+  dynamic a = 42;
+  var b;
+  while (true) {
+    b = a /*invoke: [exact=JSUInt31]*/ + 54;
+    if (b /*invoke: [subclass=JSUInt32]*/ == 42) {
+      a = 'foo';
+      break;
+    }
+  }
+  return b;
+}
+
+/*element: testReturnElementOfConstList1:[exact=JSUInt31]*/
+testReturnElementOfConstList1() {
+  return const [
+    42
+  ] /*Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/ [
+      0];
+}
+
+/*element: testReturnElementOfConstList2:[exact=JSUInt31]*/
+testReturnElementOfConstList2() {
+  return topLevelConstList /*Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/ [
+      0];
+}
+
+/*element: testReturnItselfOrInt:[exact=JSUInt31]*/
+testReturnItselfOrInt(/*[null|subclass=Object]*/ a) {
+  if (a) return 42;
+  return testReturnItselfOrInt(a);
+}
+
+/*element: testDoWhile1:Value([exact=JSString], value: "foo")*/
+testDoWhile1() {
+  dynamic a = 42;
+  do {
+    a = 'foo';
+  } while (true);
+  // ignore: dead_code
+  return a;
+}
+
+/*element: testDoWhile2:[null]*/
+testDoWhile2() {
+  dynamic a = 42;
+  do {
+    a = 'foo';
+    // ignore: mixed_return_types
+    return;
+  } while (true);
+  // ignore: dead_code,mixed_return_types
+  return a;
+}
+
+/*element: testDoWhile3:[exact=JSUInt31]*/
+testDoWhile3() {
+  dynamic a = 42;
+  do {
+    a = 'foo';
+    if (true) continue;
+    return 42;
+  } while (true);
+  // ignore: dead_code
+  return a;
+}
+
+/*element: testDoWhile4:Union([exact=JSDouble], [exact=JSUInt31])*/
+testDoWhile4() {
+  dynamic a = 'foo';
+  do {
+    a = 54;
+    if (true) break;
+    return 3.5;
+  } while (true);
+  return a;
+}
+
+/*element: testSpecialization1:[subclass=JSNumber]*/
+testSpecialization1() {
+  var a = topLevelGetter();
+  a - 42;
+  return a;
+}
+
+/*element: testSpecialization2:[null|subclass=Object]*/
+testSpecialization2() {
+  var a = topLevelGetter();
+  // Make [a] a captured variable. This should disable receiver
+  // specialization on [a].
+  (/*[null|subclass=Object]*/ () => a.toString())();
+  a - 42;
+  return a;
+}
+
+/*element: testSpecialization3:[null|exact=JSUInt31]*/
+testSpecialization3() {
+  var a = returnDynamic() ? null : 42;
+  a. /*invoke: [null|exact=JSUInt31]*/ toString();
+  // Test that calling an [Object] method on [a] will not lead to
+  // infer that [a] is not null;
+  return a;
+}
+
+/*element: testReturnNull1:[null]*/
+testReturnNull1(/*[null|subclass=Object]*/ a) {
+  if (a == null) return a;
+  return null;
+}
+
+/*element: testReturnNull2:[null]*/
+testReturnNull2(/*[null|subclass=Object]*/ a) {
+  if (a != null) return null;
+  return a;
+}
+
+/*element: testReturnNull3:[null|subclass=Object]*/
+testReturnNull3(/*[null|subclass=Object]*/ a) {
+  if (a == null) return 42;
+  return a;
+}
+
+/*element: testReturnNull4:[null]*/
+testReturnNull4() {
+  var a = topLevelGetter();
+  if (a == null) return a;
+  return null;
+}
+
+/*element: testReturnNull5:[null]*/
+testReturnNull5() {
+  var a = topLevelGetter();
+  if (a != null) return null;
+  return a;
+}
+
+/*element: testReturnNull6:[null|subclass=Object]*/
+testReturnNull6() {
+  var a = topLevelGetter();
+  if (a == null) return 42;
+  return a;
+}
+
+/*element: testReturnNotEquals:[exact=JSBool]*/
+testReturnNotEquals() {
+  return new A() /*invoke: [exact=A]*/ != 54;
+}
+
+/*element: testReturnInvokeDynamicGetter:[null|subclass=Object]*/
+testReturnInvokeDynamicGetter() => new A(). /*invoke: [exact=A]*/ myFactory();
+
+/*element: topLevelConstList:Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/
+var topLevelConstList = const [42];
+
+/*element: topLevelGetter:[exact=JSUInt31]*/
+get topLevelGetter => 42;
+
+/*element: returnDynamic:[null|subclass=Object]*/
+returnDynamic() => topLevelGetter(42);
+
+/*element: returnTopLevelGetter:[exact=JSUInt31]*/
+returnTopLevelGetter() => topLevelGetter;
+
+class A {
+  factory A() = A.generative;
+  /*element: A.generative:[exact=A]*/
+  A.generative();
+  /*element: A.==:Union([exact=JSBool], [exact=JSUInt31])*/
+  operator ==(/*Union([exact=JSString], [exact=JSUInt31])*/ other) =>
+      42 as dynamic;
+
+  /*element: A.myField:[exact=JSUInt31]*/
+  get myField => 42;
+
+  set myField(/*[subclass=JSUInt32]*/ a) {}
+
+  /*element: A.returnInt1:[subclass=JSUInt32]*/
+  returnInt1() => /*invoke: [exact=JSUInt31]*/ ++ /*[subclass=A]*/ /*update: [subclass=A]*/ myField;
+
+  /*element: A.returnInt2:[subclass=JSUInt32]*/
+  returnInt2() => /*invoke: [exact=JSUInt31]*/ ++this
+      . /*[subclass=A]*/ /*update: [subclass=A]*/ myField;
+
+  /*element: A.returnInt3:[subclass=JSUInt32]*/
+  returnInt3() =>
+      this. /*[subclass=A]*/ /*update: [subclass=A]*/ myField /*invoke: [exact=JSUInt31]*/ +=
+          42;
+
+  /*element: A.returnInt4:[subclass=JSUInt32]*/
+  returnInt4() => /*[subclass=A]*/ /*update: [subclass=A]*/ myField /*invoke: [exact=JSUInt31]*/ +=
+      42;
+
+  /*element: A.[]:[exact=JSUInt31]*/
+  operator [](/*[exact=JSUInt31]*/ index) => 42;
+
+  /*element: A.[]=:[null]*/
+  operator []=(/*[exact=JSUInt31]*/ index, /*[subclass=JSUInt32]*/ value) {}
+
+  /*element: A.returnInt5:[subclass=JSUInt32]*/
+  returnInt5() => /*invoke: [exact=JSUInt31]*/ ++this /*[subclass=A]*/ /*update: [subclass=A]*/ [
+      0];
+
+  /*element: A.returnInt6:[subclass=JSUInt32]*/
+  returnInt6() => this /*[subclass=A]*/ /*update: [subclass=A]*/ [
+      0] /*invoke: [exact=JSUInt31]*/ += 1;
+
+  /*element: A.myFactory:[subclass=Closure]*/
+  get myFactory => /*[exact=JSUInt31]*/ () => 42;
+}
+
+class B extends A {
+  /*element: B.:[exact=B]*/
+  B() : super.generative();
+
+  /*element: B.returnInt1:[subclass=JSUInt32]*/
+  returnInt1() => /*invoke: [exact=JSUInt31]*/ ++new A()
+      . /*[exact=A]*/ /*update: [exact=A]*/ myField;
+
+  /*element: B.returnInt2:[subclass=JSUInt32]*/
+  returnInt2() => new A()
+      . /*[exact=A]*/ /*update: [exact=A]*/ myField /*invoke: [exact=JSUInt31]*/ += 4;
+
+  /*element: B.returnInt3:[subclass=JSUInt32]*/
+  returnInt3() => /*invoke: [exact=JSUInt31]*/ ++new A() /*[exact=A]*/ /*update: [exact=A]*/ [
+      0];
+
+  /*element: B.returnInt4:[subclass=JSUInt32]*/
+  returnInt4() => new A() /*[exact=A]*/ /*update: [exact=A]*/ [
+      0] /*invoke: [exact=JSUInt31]*/ += 42;
+
+  /*element: B.returnInt5:[subclass=JSUInt32]*/
+  returnInt5() => /*invoke: [exact=JSUInt31]*/ ++super.myField;
+
+  /*element: B.returnInt6:[subclass=JSUInt32]*/
+  returnInt6() => super.myField /*invoke: [exact=JSUInt31]*/ += 4;
+
+  /*element: B.returnInt7:[subclass=JSUInt32]*/
+  returnInt7() => /*invoke: [exact=JSUInt31]*/ ++super[0];
+
+  /*element: B.returnInt8:[subclass=JSUInt32]*/
+  returnInt8() => super[0] /*invoke: [exact=JSUInt31]*/ += 54;
+
+  /*element: B.returnInt9:[exact=JSUInt31]*/
+  returnInt9() => super.myField;
+}
+
+class C {
+  /*element: C.myField:[subclass=JSPositiveInt]*/
+  var myField = 42;
+
+  /*element: C.:[exact=C]*/
+  C();
+
+  /*element: C.returnInt1:[subclass=JSPositiveInt]*/
+  returnInt1() => /*invoke: [subclass=JSPositiveInt]*/ ++ /*[exact=C]*/ /*update: [exact=C]*/ myField;
+
+  /*element: C.returnInt2:[subclass=JSPositiveInt]*/
+  returnInt2() => /*invoke: [subclass=JSPositiveInt]*/ ++this
+      . /*[exact=C]*/ /*update: [exact=C]*/ myField;
+
+  /*element: C.returnInt3:[subclass=JSPositiveInt]*/
+  returnInt3() =>
+      this. /*[exact=C]*/ /*update: [exact=C]*/ myField /*invoke: [subclass=JSPositiveInt]*/ +=
+          42;
+
+  /*element: C.returnInt4:[subclass=JSPositiveInt]*/
+  returnInt4() => /*[exact=C]*/ /*update: [exact=C]*/ myField /*invoke: [subclass=JSPositiveInt]*/ +=
+      42;
+
+  /*element: C.[]:[subclass=JSPositiveInt]*/
+  operator [](/*[exact=JSUInt31]*/ index) => /*[exact=C]*/ myField;
+
+  /*element: C.[]=:[null]*/
+  operator []=(
+      /*[exact=JSUInt31]*/ index,
+      /*[subclass=JSPositiveInt]*/ value) {}
+
+  /*element: C.returnInt5:[subclass=JSPositiveInt]*/
+  returnInt5() => /*invoke: [subclass=JSPositiveInt]*/ ++this /*[exact=C]*/ /*update: [exact=C]*/ [
+      0];
+
+  /*element: C.returnInt6:[subclass=JSPositiveInt]*/
+  returnInt6() => this /*[exact=C]*/ /*update: [exact=C]*/ [
+      0] /*invoke: [subclass=JSPositiveInt]*/ += 1;
+}
+
+/*element: testCascade1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
+testCascade1() {
+  return [1, 2, 3]
+    .. /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
+        add(4)
+    .. /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
+        add(5);
+}
+
+/*element: testCascade2:[exact=CascadeHelper]*/
+testCascade2() {
+  return new CascadeHelper()
+    .. /*update: [exact=CascadeHelper]*/ a = "hello"
+    .. /*update: [exact=CascadeHelper]*/ b = 42
+    .. /*[exact=CascadeHelper]*/ /*update: [exact=CascadeHelper]*/ i
+        /*invoke: [subclass=JSPositiveInt]*/ += 1;
+}
+
+/*element: CascadeHelper.:[exact=CascadeHelper]*/
+class CascadeHelper {
+  /*element: CascadeHelper.a:Value([null|exact=JSString], value: "hello")*/
+  var a;
+
+  /*element: CascadeHelper.b:[null|exact=JSUInt31]*/
+  var b;
+
+  /*element: CascadeHelper.i:[subclass=JSPositiveInt]*/
+  var i = 0;
+}
+
+/*element: main:[null]*/
+main() {
+  // Ensure a function class is being instantiated.
+  /*[exact=JSUInt31]*/ () => 42;
+  returnNum1(true);
+  returnNum2(true);
+  returnInt1(true);
+  returnInt2();
+  returnInt3(true);
+  returnInt4();
+  returnDouble(true);
+  returnGiveUp(true);
+  returnInt5();
+  returnInt6();
+  returnInt7();
+  returnInt8();
+  returnIntOrNull(true);
+  returnDynamic();
+  returnEmpty1();
+  returnEmpty2();
+  testIsCheck1(topLevelGetter());
+  testIsCheck2(topLevelGetter());
+  testIsCheck3(topLevelGetter());
+  testIsCheck4(topLevelGetter());
+  testIsCheck5(topLevelGetter());
+  testIsCheck6(topLevelGetter());
+  testIsCheck7(topLevelGetter());
+  testIsCheck8(topLevelGetter());
+  testIsCheck9(topLevelGetter());
+  testIsCheck10(topLevelGetter());
+  testIsCheck11(topLevelGetter());
+  testIsCheck12(topLevelGetter());
+  testIsCheck13(topLevelGetter());
+  testIsCheck14(topLevelGetter());
+  testIsCheck15(topLevelGetter());
+  testIsCheck16(topLevelGetter());
+  testIsCheck17(topLevelGetter());
+  testIsCheck18(topLevelGetter());
+  testIsCheck19(topLevelGetter());
+  testIsCheck20();
+  testIsCheck21(topLevelGetter());
+  testIsCheck22(topLevelGetter());
+  testIsCheck23(topLevelGetter());
+  testIsCheck24(topLevelGetter());
+  testIsCheck25(topLevelGetter());
+  testIsCheck26(topLevelGetter());
+  testIsCheck27(topLevelGetter());
+  testIsCheck28(topLevelGetter());
+  testIsCheck29(topLevelGetter());
+  testIf1(topLevelGetter());
+  testIf2(topLevelGetter());
+  returnAsString();
+  returnIntAsNum();
+  returnAsTypedef();
+  returnTopLevelGetter();
+  testDeadCode();
+  testLabeledIf(true);
+  testSwitch1();
+  testSwitch2();
+  testSwitch3();
+  testSwitch4();
+  testSwitch5();
+  testContinue1();
+  testBreak1();
+  testContinue2();
+  testBreak2();
+  testDoWhile1();
+  testDoWhile2();
+  testDoWhile3();
+  testDoWhile4();
+  new A() == null;
+  new A()
+    .. /*invoke: [exact=A]*/ returnInt1()
+    .. /*invoke: [exact=A]*/ returnInt2()
+    .. /*invoke: [exact=A]*/ returnInt3()
+    .. /*invoke: [exact=A]*/ returnInt4()
+    .. /*invoke: [exact=A]*/ returnInt5()
+    .. /*invoke: [exact=A]*/ returnInt6();
+
+  new B()
+    .. /*invoke: [exact=B]*/ returnInt1()
+    .. /*invoke: [exact=B]*/ returnInt2()
+    .. /*invoke: [exact=B]*/ returnInt3()
+    .. /*invoke: [exact=B]*/ returnInt4()
+    .. /*invoke: [exact=B]*/ returnInt5()
+    .. /*invoke: [exact=B]*/ returnInt6()
+    .. /*invoke: [exact=B]*/ returnInt7()
+    .. /*invoke: [exact=B]*/ returnInt8()
+    .. /*invoke: [exact=B]*/ returnInt9();
+
+  new C()
+    .. /*invoke: [exact=C]*/ returnInt1()
+    .. /*invoke: [exact=C]*/ returnInt2()
+    .. /*invoke: [exact=C]*/ returnInt3()
+    .. /*invoke: [exact=C]*/ returnInt4()
+    .. /*invoke: [exact=C]*/ returnInt5()
+    .. /*invoke: [exact=C]*/ returnInt6();
+  testReturnElementOfConstList1();
+  testReturnElementOfConstList2();
+  testReturnItselfOrInt(topLevelGetter());
+  testReturnInvokeDynamicGetter();
+  testCascade1();
+  testCascade2();
+  testSpecialization1();
+  testSpecialization2();
+  testSpecialization3();
+  testReturnNull1(topLevelGetter());
+  testReturnNull2(topLevelGetter());
+  testReturnNull3(topLevelGetter());
+  testReturnNull4();
+  testReturnNull5();
+  testReturnNull6();
+  testReturnNotEquals();
+}
diff --git a/tests/compiler/dart2js/inference/data/general6.dart b/tests/compiler/dart2js/inference/data/general6.dart
new file mode 100644
index 0000000..f28acc0
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/general6.dart
@@ -0,0 +1,16 @@
+// 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.
+
+/*element: foo:[exact=JSUInt31]*/
+foo() {
+  var a = [1, 2, 3];
+  return a
+      . /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
+      first;
+}
+
+/*element: main:[null]*/
+main() {
+  foo();
+}
diff --git a/tests/compiler/dart2js/inference/data/general7.dart b/tests/compiler/dart2js/inference/data/general7.dart
new file mode 100644
index 0000000..2fb6105
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/general7.dart
@@ -0,0 +1,16 @@
+// 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 file contains tests of assertions when assertions are _disabled_. The
+/// file 'general7_ea.dart' contains similar tests for when assertions are
+/// _enabled_.
+
+/*element: foo:[null]*/
+foo(/*[exact=JSUInt31]*/ x, [/*[null]*/ y]) => y;
+
+/*element: main:[null]*/
+main() {
+  assert(foo('Hi', true), foo(true));
+  foo(1);
+}
diff --git a/tests/compiler/dart2js/inference/data/general7_ea.dart b/tests/compiler/dart2js/inference/data/general7_ea.dart
new file mode 100644
index 0000000..50e5667
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/general7_ea.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This file contains tests of assertions when assertions are _enabled_. The
+/// file 'general7.dart' contains similar tests for when assertions are
+/// _disabled_.
+
+/*element: foo:Value([null|exact=JSBool], value: true)*/
+foo(
+        /*Union([exact=JSBool], [exact=JSString], [exact=JSUInt31])*/ x,
+        [/*Value([null|exact=JSBool], value: true)*/ y]) =>
+    y;
+
+/*element: main:[null]*/
+main() {
+  assert(foo('Hi', true), foo(true));
+  foo(1);
+}
diff --git a/tests/compiler/dart2js/inference/data/general8a.dart b/tests/compiler/dart2js/inference/data/general8a.dart
new file mode 100644
index 0000000..d94138e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/general8a.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.
+
+/*element: foo:Value([exact=JSBool], value: false)*/
+foo(/*Value([exact=JSBool], value: false)*/ x) {
+  return x;
+}
+
+/*element: bar:[null]*/
+bar(/*Value([exact=JSBool], value: false)*/ x) {
+  if (x) {
+    print("aaa");
+  } else {
+    print("bbb");
+  }
+}
+
+/*element: main:[null]*/
+main() {
+  bar(foo(false));
+  bar(foo(foo(false)));
+}
diff --git a/tests/compiler/dart2js/inference/data/general8b.dart b/tests/compiler/dart2js/inference/data/general8b.dart
new file mode 100644
index 0000000..594a093
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/general8b.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.
+
+/*element: foo:[exact=JSBool]*/
+foo(/*[exact=JSUInt31]*/ x) {
+  if (x /*invoke: [exact=JSUInt31]*/ > 3) return true;
+  return false;
+}
+
+/*element: bar:[null]*/
+bar(/*[exact=JSBool]*/ x) {
+  if (x) {
+    print("aaa");
+  } else {
+    print("bbb");
+  }
+}
+
+/*element: main:[null]*/ main() {
+  bar(foo(5));
+  bar(foo(6));
+}
diff --git a/tests/compiler/dart2js/inference/data/global_field_closure.dart b/tests/compiler/dart2js/inference/data/global_field_closure.dart
new file mode 100644
index 0000000..d2fd3bc
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/global_field_closure.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: method1:[exact=JSUInt31]*/
+method1() {
+  return 42;
+}
+
+/*element: method2:[exact=JSUInt31]*/
+// Called only via [foo2] with a small integer.
+method2(/*[exact=JSUInt31]*/ a) {
+  return a;
+}
+
+/*element: foo1:[null|subclass=Closure]*/
+var foo1 = method1;
+
+/*element: foo2:[null|subclass=Closure]*/
+var foo2 = method2;
+
+/*element: returnInt1:[null|subclass=Object]*/
+returnInt1() {
+  return foo1();
+}
+
+/*element: returnInt2:[null|subclass=Object]*/
+returnInt2() {
+  return foo2(54);
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt1();
+  returnInt2();
+}
diff --git a/tests/compiler/dart2js/inference/data/global_field_closure2.dart b/tests/compiler/dart2js/inference/data/global_field_closure2.dart
new file mode 100644
index 0000000..765913e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/global_field_closure2.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: method:[exact=JSUInt31]*/
+// Called only via [foo] with a small integer.
+method(/*[exact=JSUInt31]*/ a) {
+  return a;
+}
+
+/*element: foo:[null|subclass=Closure]*/
+var foo = method;
+
+/*element: returnInt:[null|subclass=Object]*/
+returnInt() {
+  return foo(54);
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt();
+}
diff --git a/tests/compiler/dart2js/inference/data/index_postfix.dart b/tests/compiler/dart2js/inference/data/index_postfix.dart
new file mode 100644
index 0000000..5eefc77
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/index_postfix.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: main:[null]*/
+main() {
+  listIndexPostfixIncrement();
+  listIndexPostfixDecrement();
+  superIndexPostfixIncrement();
+}
+
+/*element: listIndexPostfixIncrement:[subclass=JSPositiveInt]*/
+listIndexPostfixIncrement() {
+  var list = [0];
+  return list
+          /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
+          /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
+          [0]
+      /*invoke: [subclass=JSPositiveInt]*/ ++;
+}
+
+/*element: listIndexPostfixDecrement:[subclass=JSInt]*/
+listIndexPostfixDecrement() {
+  var list = [0];
+  return list
+          /*Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
+          /*update: Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
+          [0]
+      /*invoke: [subclass=JSInt]*/ --;
+}
+
+/*element: Super1.:[exact=Super1]*/
+class Super1 {
+  /*element: Super1.[]:[exact=JSUInt31]*/
+  operator [](/*[exact=JSUInt31]*/ index) => 42;
+
+  /*element: Super1.[]=:[null]*/
+  operator []=(/*[exact=JSUInt31]*/ index, /*[subclass=JSUInt32]*/ value) {}
+}
+
+/*element: Class1.:[exact=Class1]*/
+class Class1 extends Super1 {
+  /*element: Class1.method:[exact=JSUInt31]*/
+  method() => super[0] /*invoke: [exact=JSUInt31]*/ ++;
+}
+
+/*element: superIndexPostfixIncrement:[null]*/
+superIndexPostfixIncrement() {
+  new Class1(). /*invoke: [exact=Class1]*/ method();
+}
diff --git a/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart b/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
new file mode 100644
index 0000000..a042a6c
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.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 'dart:typed_data';
+
+/*element: myList:Container([null|exact=NativeFloat32List], element: [subclass=JSNumber], length: 42)*/
+var myList = new Float32List(42);
+
+/*element: myOtherList:Container([null|exact=NativeUint8List], element: [exact=JSUInt31], length: 32)*/
+var myOtherList = new Uint8List(32);
+
+/*element: main:[subclass=JSNumber]*/
+main() {
+  // ignore: unused_local_variable
+  var a = new Float32List(9);
+  return myList
+          /*Container([null|exact=NativeFloat32List], element: [subclass=JSNumber], length: 42)*/
+          [0] /*invoke: [subclass=JSNumber]*/ +
+      myOtherList
+          /*Container([null|exact=NativeUint8List], element: [exact=JSUInt31], length: 32)*/
+          [0];
+}
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_const.dart b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
new file mode 100644
index 0000000..4b2bd43
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
@@ -0,0 +1,28 @@
+// 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.
+
+/*element: closure:Union([exact=JSDouble], [exact=JSUInt31])*/
+int closure(int /*Union([exact=JSDouble], [exact=JSUInt31])*/ x) {
+  return x;
+}
+
+class A {
+  /*element: A.DEFAULT:Dictionary([subclass=ConstantMap], key: Value([exact=JSString], value: "fun"), value: [null|subclass=Closure], map: {fun: [subclass=Closure]})*/
+  static const DEFAULT = const {'fun': closure};
+
+  /*element: A.map:Dictionary([subclass=ConstantMap], key: Value([exact=JSString], value: "fun"), value: [null|subclass=Closure], map: {fun: [subclass=Closure]})*/
+  final map;
+
+  /*element: A.:[exact=A]*/
+  A([/*[null]*/ maparg]) : map = maparg == null ? DEFAULT : maparg;
+}
+
+/*element: main:[null]*/
+main() {
+  var a = new A();
+  a. /*[exact=A]*/ map
+      /*Dictionary([subclass=ConstantMap], key: Value([exact=JSString], value: "fun"), value: [null|subclass=Closure], map: {fun: [subclass=Closure]})*/
+      ['fun'](3.3);
+  print(closure(22));
+}
diff --git a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values.dart b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values.dart
new file mode 100644
index 0000000..909a33e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values.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.
+
+// Ensure that the inferrer looks at default values for parameters in
+// synthetic constructors using the correct context. If the constructor call
+// to D without optional parameters is inferred using D's context, the default
+// value `_SECRET` will not be visible and compilation will fail.
+
+import '../libs/mixin_constructor_default_parameter_values_lib.dart';
+
+class Mixin {
+  /*element: Mixin.foo:[exact=JSString]*/
+  String get foo => "Mixin:$this";
+}
+
+// ignore: MIXIN_HAS_NO_CONSTRUCTORS
+class D = C with Mixin;
+
+/*element: main:[null]*/
+main() {
+  // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
+  print(new D.a(42). /*[exact=D]*/ foo);
+  // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
+  print(new D.b(42). /*[exact=D]*/ foo);
+  // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
+  print(new D.a(42, "overt"). /*[exact=D]*/ foo);
+  // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
+  print(new D.b(42, b: "odvert"). /*[exact=D]*/ foo);
+}
diff --git a/tests/compiler/dart2js/inference/data/no_such_method1.dart b/tests/compiler/dart2js/inference/data/no_such_method1.dart
new file mode 100644
index 0000000..9bf8eba
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/no_such_method1.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:[exact=A]*/
+class A {
+  /*element: A.noSuchMethod:[exact=JSUInt31]*/
+  noSuchMethod(/*[null|subclass=Object]*/ im) => 42;
+}
+
+/*element: B.:[exact=B]*/
+class B extends A {
+  foo();
+}
+
+/*element: C.:[exact=C]*/
+class C extends B {
+  /*element: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  foo() => {};
+}
+
+/*element: a:[null|subclass=B]*/
+dynamic a = [new B(), new C()]
+    /*Container([exact=JSExtendableArray], element: [subclass=B], length: 2)*/
+    [0];
+
+/*element: test1:[exact=JSUInt31]*/
+test1() => new A()
+    // ignore: undefined_method
+    . /*invoke: [exact=A]*/ foo();
+
+/*element: test2:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+test2() => a. /*invoke: [null|subclass=B]*/ foo();
+
+/*element: test3:[exact=JSUInt31]*/
+test3() => new B(). /*invoke: [exact=B]*/ foo();
+
+/*element: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test4() => new C(). /*invoke: [exact=C]*/ foo();
+
+/*element: test5:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+test5() => (a ? new A() : new B())
+    // ignore: undefined_method
+    . /*invoke: [subclass=A]*/ foo();
+
+/*element: test6:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+test6() => (a ? new B() : new C()). /*invoke: [subclass=B]*/ foo();
+
+/*element: main:[null]*/
+main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+}
diff --git a/tests/compiler/dart2js/inference/data/no_such_method2.dart b/tests/compiler/dart2js/inference/data/no_such_method2.dart
new file mode 100644
index 0000000..434e82a
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/no_such_method2.dart
@@ -0,0 +1,99 @@
+// 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.
+
+/*element: A.:[subclass=B]*/
+abstract class A {
+  /*element: A.noSuchMethod:[exact=JSUInt31]*/
+  noSuchMethod(/*[null|subclass=Object]*/ im) => 42;
+}
+
+/*element: B.:[exact=B]*/
+class B extends A {
+  /*element: B.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  foo() => {};
+}
+
+/*element: C.:[exact=C]*/
+class C extends B {
+  /*element: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  foo() => {};
+}
+
+/*element: D.:[exact=D]*/
+class D implements A {
+  /*element: D.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  foo() => {};
+
+  /*element: D.noSuchMethod:[exact=JSDouble]*/
+  noSuchMethod(/*[null|subclass=Object]*/ im) => 42.5;
+}
+
+/*element: a:Union([exact=D], [null|subclass=B])*/
+dynamic a = [new B(), new C(), new D()]
+    /*Container([exact=JSExtendableArray], element: Union([exact=D], [subclass=B]), length: 3)*/
+    [0];
+
+/*element: test1:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test1() => a. /*invoke: Union([exact=D], [null|subclass=B])*/ foo();
+
+/*element: test2:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test2() => new B(). /*invoke: [exact=B]*/ foo();
+
+/*element: test3:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test3() => new C(). /*invoke: [exact=C]*/ foo();
+
+/*element: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test4() => (a ? new B() : new C()). /*invoke: [subclass=B]*/ foo();
+
+/*element: test5:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test5() => (a ? new B() : new D())
+    // ignore: undefined_method
+    . /*invoke: Union([exact=B], [exact=D])*/ foo();
+
+// Can hit A.noSuchMethod, D.noSuchMethod and Object.noSuchMethod.
+/*element: test6:Union([exact=JSDouble], [exact=JSUInt31])*/
+test6() => a. /*invoke: Union([exact=D], [null|subclass=B])*/ bar();
+
+// Can hit A.noSuchMethod.
+/*element: test7:[exact=JSUInt31]*/
+test7() => new B()
+    // ignore: undefined_method
+    . /*invoke: [exact=B]*/ bar();
+
+/*element: test8:[exact=JSUInt31]*/
+test8() => new C()
+    // ignore: undefined_method
+    . /*invoke: [exact=C]*/ bar();
+
+/*element: test9:[exact=JSUInt31]*/
+test9() => (a ? new B() : new C())
+    // ignore: undefined_method
+    . /*invoke: [subclass=B]*/ bar();
+
+// Can hit A.noSuchMethod and D.noSuchMethod.
+/*element: test10:Union([exact=JSDouble], [exact=JSUInt31])*/
+test10() => (a ? new B() : new D())
+    // ignore: undefined_method
+    . /*invoke: Union([exact=B], [exact=D])*/ bar();
+
+// Can hit D.noSuchMethod.
+/*element: test11:[exact=JSDouble]*/
+test11() => new D()
+    // ignore: undefined_method
+    . /*invoke: [exact=D]*/ bar();
+
+/*element: main:[null]*/
+main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+  test7();
+  test8();
+  test9();
+  test10();
+  test11();
+}
diff --git a/tests/compiler/dart2js/inference/data/no_such_method3.dart b/tests/compiler/dart2js/inference/data/no_such_method3.dart
new file mode 100644
index 0000000..2b31564
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/no_such_method3.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:[exact=A]*/
+class A {
+  // We may ignore this for type inference because syntactically it always
+  // throws an exception.
+  /*element: A.noSuchMethod:[empty]*/
+  noSuchMethod(/*[null|subclass=Object]*/ im) => throw 'foo';
+}
+
+/*element: B.:[exact=B]*/
+class B extends A {
+  /*element: B.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  foo() => {};
+}
+
+/*element: C.:[exact=C]*/
+class C extends B {
+  /*element: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  foo() => {};
+}
+
+/*element: a:[null|subclass=B]*/
+dynamic a = [new B(), new C()]
+    /*Container([exact=JSExtendableArray], element: [subclass=B], length: 2)*/
+    [0];
+/*element: test1:[empty]*/
+test1() => new A()
+    // ignore: undefined_method
+    . /*invoke: [exact=A]*/ foo();
+
+/*element: test2:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test2() => a. /*invoke: [null|subclass=B]*/ foo();
+
+/*element: test3:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test3() => new B(). /*invoke: [exact=B]*/ foo();
+
+/*element: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test4() => new C(). /*invoke: [exact=C]*/ foo();
+
+/*element: test5:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test5() => (a ? new A() : new B())
+    // ignore: undefined_method
+    . /*invoke: [subclass=A]*/ foo();
+
+/*element: test6:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test6() => (a ? new B() : new C()). /*invoke: [subclass=B]*/ foo();
+
+/*element: main:[null]*/
+main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+}
diff --git a/tests/compiler/dart2js/inference/data/no_such_method4.dart b/tests/compiler/dart2js/inference/data/no_such_method4.dart
new file mode 100644
index 0000000..1eaaf15
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/no_such_method4.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:[exact=A]*/
+class A {
+  // We may ignore this for type inference because it forwards to a default
+  // noSuchMethod implementation, which always throws an exception.
+  noSuchMethod(im) => super.noSuchMethod(im);
+}
+
+/*element: B.:[exact=B]*/
+class B extends A {
+  /*element: B.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/ foo() =>
+      {};
+}
+
+/*element: C.:[exact=C]*/
+class C extends B {
+  /*element: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/ foo() =>
+      {};
+}
+
+/*element: a:[null|subclass=B]*/
+dynamic a = [new B(), new C()]
+    /*Container([exact=JSExtendableArray], element: [subclass=B], length: 2)*/
+    [0];
+
+/*element: test1:[empty]*/
+test1() => new A()
+    // ignore: undefined_method
+    . /*invoke: [exact=A]*/ foo();
+
+/*element: test2:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test2() => a. /*invoke: [null|subclass=B]*/ foo();
+
+/*element: test3:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test3() => new B(). /*invoke: [exact=B]*/ foo();
+
+/*element: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test4() => new C(). /*invoke: [exact=C]*/ foo();
+
+/*element: test5:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test5() => (a ? new A() : new B())
+    // ignore: undefined_method
+    . /*invoke: [subclass=A]*/ foo();
+
+/*element: test6:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+test6() => (a ? new B() : new C()). /*invoke: [subclass=B]*/ foo();
+
+/*element: main:[null]*/
+main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+}
diff --git a/tests/compiler/dart2js/inference/data/postfix_prefix.dart b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
new file mode 100644
index 0000000..0e54d55
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
@@ -0,0 +1,133 @@
+// 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.
+
+/*element: A.:[exact=A]*/
+class A {
+  /*element: A.foo:Value([exact=JSString], value: "string")*/
+  get foo => 'string';
+
+  set foo(/*[subclass=JSNumber]*/ value) {}
+
+  /*element: A.[]:Value([exact=JSString], value: "string")*/
+  operator [](/*[empty]*/ index) => 'string';
+
+  /*element: A.[]=:[null]*/
+  operator []=(/*[empty]*/ index, /*[subclass=JSNumber]*/ value) {}
+
+  // TODO(johnniwinther): Investigate why these differ.
+  /*ast.element: A.returnDynamic1:Union([exact=JSString], [exact=JSUInt31])*/
+  /*kernel.element: A.returnDynamic1:[exact=JSUInt31]*/
+  returnDynamic1() => /*[subclass=A]*/ /*update: [subclass=A]*/ foo
+      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;
+
+  /*element: A.returnNum1:[subclass=JSNumber]*/
+  returnNum1() => /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --
+      /*[subclass=A]*/ /*update: [subclass=A]*/ foo;
+
+  /*element: A.returnNum2:[subclass=JSNumber]*/
+  returnNum2() => /*[subclass=A]*/ /*update: [subclass=A]*/ foo
+      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;
+
+  // TODO(johnniwinther): Investigate why these differ.
+  /*ast.element: A.returnDynamic2:Union([exact=JSString], [exact=JSUInt31])*/
+  /*kernel.element: A.returnDynamic2:[exact=JSUInt31]*/
+  returnDynamic2() => this
+          // ignore: undefined_identifier
+          /*[subclass=A]*/ /*update: [subclass=A]*/ [/*[subclass=A]*/ index]
+      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;
+
+  /*element: A.returnNum3:[subclass=JSNumber]*/
+  returnNum3() => /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --this
+      // ignore: undefined_identifier
+      /*[subclass=A]*/ /*update: [subclass=A]*/ [/*[subclass=A]*/ index];
+
+  /*element: A.returnNum4:[subclass=JSNumber]*/
+  returnNum4() => this
+          // ignore: undefined_identifier
+          /*[subclass=A]*/ /*update: [subclass=A]*/ [/*[subclass=A]*/ index]
+      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;
+
+  /*element: A.returnEmpty3:[empty]*/
+  returnEmpty3() =>
+      // ignore: undefined_setter
+      this. /*[subclass=A]*/ /*update: [subclass=A]*/ bar
+      /*invoke: [empty]*/ --;
+
+  /*element: A.returnEmpty1:[empty]*/
+  returnEmpty1() => /*invoke: [empty]*/ --this
+      // ignore: undefined_setter
+      . /*[subclass=A]*/ /*update: [subclass=A]*/ bar;
+
+  /*element: A.returnEmpty2:[empty]*/
+  returnEmpty2() => this
+          // ignore: undefined_setter
+          . /*[subclass=A]*/ /*update: [subclass=A]*/ bar
+      /*invoke: [empty]*/ -= 42;
+}
+
+/*element: B.:[exact=B]*/
+class B extends A {
+  /*element: B.foo:[exact=JSUInt31]*/
+  get foo => 42;
+  /*element: B.[]:[exact=JSUInt31]*/
+  operator [](/*[empty]*/ index) => 42;
+
+  // TODO(johnniwinther): Investigate why these differ.
+  /*ast.element: B.returnString1:Value([exact=JSString], value: "string")*/
+  /*kernel.element: B.returnString1:[empty]*/
+  returnString1() =>
+      super.foo /*invoke: Value([exact=JSString], value: "string")*/ --;
+
+  /*element: B.returnDynamic1:[empty]*/
+  returnDynamic1() =>
+      /*invoke: Value([exact=JSString], value: "string")*/
+      --super.foo;
+
+  /*element: B.returnDynamic2:[empty]*/
+  returnDynamic2() =>
+      super.foo /*invoke: Value([exact=JSString], value: "string")*/ -= 42;
+
+  // TODO(johnniwinther): Investigate why these differ.
+  /*ast.element: B.returnString2:Value([exact=JSString], value: "string")*/
+  /*kernel.element: B.returnString2:[empty]*/
+  returnString2() =>
+      // ignore: undefined_identifier
+      super[/*[exact=B]*/ index]
+      /*invoke: Value([exact=JSString], value: "string")*/ --;
+
+  /*element: B.returnDynamic3:[empty]*/
+  returnDynamic3() =>
+      /*invoke: Value([exact=JSString], value: "string")*/
+      --super
+          // ignore: undefined_identifier
+          [/*[exact=B]*/ index];
+
+  /*element: B.returnDynamic4:[empty]*/
+  returnDynamic4() =>
+      // ignore: undefined_identifier
+      super[/*[exact=B]*/ index]
+          /*invoke: Value([exact=JSString], value: "string")*/ -= 42;
+}
+
+/*element: main:[null]*/
+main() {
+  new A()
+    .. /*invoke: [exact=A]*/ returnNum1()
+    .. /*invoke: [exact=A]*/ returnNum2()
+    .. /*invoke: [exact=A]*/ returnNum3()
+    .. /*invoke: [exact=A]*/ returnNum4()
+    .. /*invoke: [exact=A]*/ returnDynamic1()
+    .. /*invoke: [exact=A]*/ returnDynamic2()
+    .. /*invoke: [exact=A]*/ returnEmpty1()
+    .. /*invoke: [exact=A]*/ returnEmpty2()
+    .. /*invoke: [exact=A]*/ returnEmpty3();
+
+  new B()
+    .. /*invoke: [exact=B]*/ returnString1()
+    .. /*invoke: [exact=B]*/ returnString2()
+    .. /*invoke: [exact=B]*/ returnDynamic1()
+    .. /*invoke: [exact=B]*/ returnDynamic2()
+    .. /*invoke: [exact=B]*/ returnDynamic3()
+    .. /*invoke: [exact=B]*/ returnDynamic4();
+}
diff --git a/tests/compiler/dart2js/inference/data/prefix.dart b/tests/compiler/dart2js/inference/data/prefix.dart
new file mode 100644
index 0000000..32118ab
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/prefix.dart
@@ -0,0 +1,163 @@
+// 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.
+
+/*element: main:[null]*/
+main() {
+  localPrefixInc();
+  localPrefixDec();
+  staticFieldPrefixInc();
+  staticFieldPrefixDec();
+  instanceFieldPrefixInc();
+  instanceFieldPrefixDec();
+  conditionalInstanceFieldPrefixInc();
+  conditionalInstanceFieldPrefixDec();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Prefix increment on local variable.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: localPrefixInc:[subclass=JSUInt32]*/
+localPrefixInc() {
+  var local;
+  if (local == null) {
+    local = 0;
+  }
+  return /*invoke: [null|exact=JSUInt31]*/ ++local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Prefix decrement on local variable.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: localPrefixDec:[subclass=JSInt]*/
+localPrefixDec() {
+  var local;
+  if (local == null) {
+    local = 0;
+  }
+  return /*invoke: [null|exact=JSUInt31]*/ --local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Prefix increment on static field.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _staticField1:[null|subclass=JSPositiveInt]*/
+var _staticField1;
+
+/*element: staticFieldPrefixInc:[subclass=JSPositiveInt]*/
+staticFieldPrefixInc() {
+  if (_staticField1 == null) {
+    _staticField1 = 0;
+  }
+  return /*invoke: [null|subclass=JSPositiveInt]*/ ++_staticField1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Prefix decrement on static field.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _staticField2:[null|subclass=JSInt]*/
+var _staticField2;
+
+/*element: staticFieldPrefixDec:[subclass=JSInt]*/
+staticFieldPrefixDec() {
+  if (_staticField2 == null) {
+    _staticField2 = 0;
+  }
+  return /*invoke: [null|subclass=JSInt]*/ --_staticField2;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Prefix increment on instance field.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1.:[exact=Class1]*/
+class Class1 {
+  /*element: Class1.field1:[null|subclass=JSPositiveInt]*/
+  var field1;
+}
+
+/*element: instanceFieldPrefixInc:[subclass=JSPositiveInt]*/
+instanceFieldPrefixInc() {
+  var c = new Class1();
+  if (c. /*[exact=Class1]*/ field1 == null) {
+    c. /*update: [exact=Class1]*/ field1 = 0;
+  }
+  return
+      /*invoke: [null|subclass=JSPositiveInt]*/ ++c.
+          /*[exact=Class1]*/
+          /*update: [exact=Class1]*/
+          field1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Prefix decrement on instance field.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2.:[exact=Class2]*/
+class Class2 {
+  /*element: Class2.field2:[null|subclass=JSInt]*/
+  var field2;
+}
+
+/*element: instanceFieldPrefixDec:[subclass=JSInt]*/
+instanceFieldPrefixDec() {
+  var c = new Class2();
+  if (c. /*[exact=Class2]*/ field2 == null) {
+    c. /*update: [exact=Class2]*/ field2 = 0;
+  }
+  return
+      /*invoke: [null|subclass=JSInt]*/ --c.
+          /*[exact=Class2]*/
+          /*update: [exact=Class2]*/
+          field2;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Conditional prefix increment on instance field.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class3.:[exact=Class3]*/
+class Class3 {
+  /*element: Class3.field3:[null|subclass=JSPositiveInt]*/
+  var field3;
+}
+
+/*element: conditionalInstanceFieldPrefixInc:[null|subclass=JSPositiveInt]*/
+conditionalInstanceFieldPrefixInc() {
+  var c = new Class3();
+  if (c. /*[exact=Class3]*/ field3 == null) {
+    c. /*update: [exact=Class3]*/ field3 = 0;
+  }
+  return
+      /*invoke: [null|subclass=JSPositiveInt]*/ ++c?.
+          /*[exact=Class3]*/
+          /*update: [exact=Class3]*/
+          field3;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Conditional prefix decrement on instance field.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class4.:[exact=Class4]*/
+class Class4 {
+  /*element: Class4.field4:[null|subclass=JSInt]*/
+  var field4;
+}
+
+/*element: conditionalInstanceFieldPrefixDec:[null|subclass=JSInt]*/
+conditionalInstanceFieldPrefixDec() {
+  var c = new Class4();
+  if (c. /*[exact=Class4]*/ field4 == null) {
+    c. /*update: [exact=Class4]*/ field4 = 0;
+  }
+  return
+      /*invoke: [null|subclass=JSInt]*/ --c?.
+          /*[exact=Class4]*/
+          /*update: [exact=Class4]*/
+          field4;
+}
diff --git a/tests/compiler/dart2js/inference/data/switch1.dart b/tests/compiler/dart2js/inference/data/switch1.dart
new file mode 100644
index 0000000..036ccba
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/switch1.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: foo:[exact=JSString]*/
+foo(int /*[subclass=JSInt]*/ x) {
+  var a = "one";
+  switch (x) {
+    case 1:
+      a = "two";
+      break;
+    case 2:
+      break;
+  }
+
+  return a;
+}
+
+/*element: main:[null]*/ main() {
+  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+}
diff --git a/tests/compiler/dart2js/inference/data/switch2.dart b/tests/compiler/dart2js/inference/data/switch2.dart
new file mode 100644
index 0000000..ed9a38e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/switch2.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: foo:Value([null|exact=JSString], value: "two")*/
+foo(int /*[subclass=JSInt]*/ x) {
+  var a;
+  switch (x) {
+    case 1:
+      a = "two";
+      break;
+    case 2:
+      break;
+  }
+
+  return a;
+}
+
+/*element: main:[null]*/
+main() {
+  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+}
diff --git a/tests/compiler/dart2js/inference/data/switch3.dart b/tests/compiler/dart2js/inference/data/switch3.dart
new file mode 100644
index 0000000..1ebcd71
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/switch3.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.
+
+/*element: foo:[null|exact=JSUInt31]*/
+foo(int /*[subclass=JSInt]*/ x) {
+  var a;
+  switch (x) {
+    // ignore: case_block_not_terminated
+    case 1:
+      a = 1;
+    case 2: // illegal fall through
+      a = 2;
+      break;
+  }
+
+  return a;
+}
+
+/*element: main:[null]*/
+main() {
+  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+}
diff --git a/tests/compiler/dart2js/inference/data/switch4.dart b/tests/compiler/dart2js/inference/data/switch4.dart
new file mode 100644
index 0000000..579bab4
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/switch4.dart
@@ -0,0 +1,25 @@
+// 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.
+
+/*element: foo:[exact=JSUInt31]*/
+foo(int /*[subclass=JSInt]*/ x) {
+  var a;
+  switch (x) {
+    // ignore: case_block_not_terminated
+    case 1:
+      a = 1;
+    case 2: // illegal fall through
+      a = 2;
+      break;
+    default:
+      a = 0;
+  }
+
+  return a;
+}
+
+/*element: main:[null]*/
+main() {
+  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+}
diff --git a/tests/compiler/dart2js/inference/data/switch5.dart b/tests/compiler/dart2js/inference/data/switch5.dart
new file mode 100644
index 0000000..1ce09a6
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/switch5.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: foo:[null|exact=JSUInt31]*/
+foo(int /*[subclass=JSInt]*/ x) {
+  var a;
+  switch (x) {
+    case 1:
+      a = 1;
+      break;
+    case 2:
+      a = 2;
+      break;
+    default:
+  }
+
+  return a;
+}
+
+/*element: main:[null]*/
+main() {
+  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+}
diff --git a/tests/compiler/dart2js/inference/data/switch6.dart b/tests/compiler/dart2js/inference/data/switch6.dart
new file mode 100644
index 0000000..8761199
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/switch6.dart
@@ -0,0 +1,26 @@
+// 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.
+
+/*element: foo:[null|exact=JSUInt31]*/
+foo(int /*[subclass=JSInt]*/ x) {
+  var a;
+  do {
+    // add extra locals scope
+    switch (x) {
+      case 1:
+        a = 1;
+        break;
+      case 2:
+        a = 2;
+        break;
+    }
+  } while (false);
+
+  return a;
+}
+
+/*element: main:[null]*/
+main() {
+  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+}
diff --git a/tests/compiler/dart2js/inference/data/try_catch.dart b/tests/compiler/dart2js/inference/data/try_catch.dart
new file mode 100644
index 0000000..b4209bb
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/try_catch.dart
@@ -0,0 +1,168 @@
+// 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.
+
+/*element: returnInt1:[exact=JSUInt31]*/
+returnInt1() {
+  var a = 42;
+  try {
+    a = 54;
+  } catch (e) {}
+  return a;
+}
+
+/*element: returnDyn1:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn1() {
+  dynamic a = 42;
+  try {
+    a = 'foo';
+  } catch (e) {}
+  return a;
+}
+
+/*element: returnInt2:[exact=JSUInt31]*/
+returnInt2() {
+  var a = 42;
+  try {
+    a = 54;
+  } catch (e) {
+    a = 2;
+  }
+  return a;
+}
+
+/*element: returnDyn2:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn2() {
+  dynamic a = 42;
+  try {
+    a = 54;
+  } catch (e) {
+    a = 'foo';
+  }
+  return a;
+}
+
+/*element: returnInt3:[exact=JSUInt31]*/
+returnInt3() {
+  dynamic a = 42;
+  try {
+    a = 54;
+  } catch (e) {
+    a = 'foo';
+  } finally {
+    a = 4;
+  }
+  return a;
+}
+
+/*element: returnDyn3:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn3() {
+  dynamic a = 42;
+  try {
+    a = 54;
+    // ignore: unused_catch_clause
+  } on String catch (e) {
+    a = 2;
+    // ignore: unused_catch_clause
+  } on Object catch (e) {
+    a = 'foo';
+  }
+  return a;
+}
+
+/*element: returnInt4:[exact=JSUInt31]*/
+returnInt4() {
+  var a = 42;
+  try {
+    a = 54;
+    // ignore: unused_catch_clause
+  } on String catch (e) {
+    a = 2;
+    // ignore: unused_catch_clause
+  } on Object catch (e) {
+    a = 32;
+  }
+  return a;
+}
+
+/*element: returnDyn4:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn4() {
+  dynamic a = 42;
+  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+    try {
+      a = 'foo';
+    } catch (e) {}
+  }
+  return a;
+}
+
+/*element: returnInt5:[exact=JSUInt31]*/
+returnInt5() {
+  var a = 42;
+  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+    try {
+      a = 42;
+    } catch (e) {}
+  }
+  return a;
+}
+
+/*element: returnDyn5:Union([exact=JSString], [exact=JSUInt31])*/
+returnDyn5() {
+  dynamic a = 42;
+  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+    try {
+      a = 'foo';
+      print(a);
+      a = 42;
+    } catch (e) {}
+  }
+  return a;
+}
+
+/*element: returnInt6:[subclass=JSInt]*/
+returnInt6() {
+  try {
+    throw 42;
+  } on int catch (e) {
+    return e;
+  }
+  // ignore: dead_code
+  return 42;
+}
+
+/*element: returnDyn6:[null|subclass=Object]*/
+returnDyn6() {
+  try {
+    throw 42;
+  } catch (e) {
+    return e;
+  }
+}
+
+/*element: returnInt7:[exact=JSUInt31]*/
+returnInt7() {
+  dynamic a = 'foo';
+  try {
+    a = 42;
+    return a;
+  } catch (e) {}
+  return 2;
+}
+
+/*element: main:[null]*/
+main() {
+  returnInt1();
+  returnDyn1();
+  returnInt2();
+  returnDyn2();
+  returnInt3();
+  returnDyn3();
+  returnInt4();
+  returnDyn4();
+  returnInt5();
+  returnDyn5();
+  returnInt6();
+  returnDyn6();
+  returnInt7();
+}
diff --git a/tests/compiler/dart2js/inference/data/unregister_call.dart b/tests/compiler/dart2js/inference/data/unregister_call.dart
new file mode 100644
index 0000000..cfe5be7
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/unregister_call.dart
@@ -0,0 +1,28 @@
+// 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.
+
+/*element: a:Value([exact=JSString], value: "")*/
+var a = '';
+
+/*element: A.:[exact=A]*/
+class A {
+  /*element: A.+:[exact=JSUInt31]*/
+  operator +(/*[exact=JSUInt31]*/ other) => other;
+}
+
+/*element: foo:[exact=JSString]*/
+foo() {
+  // The following '+' call will first say that it may call A::+,
+  // String::+, or int::+. After all methods have been analyzed, we know
+  // that a is of type String, and therefore, this method cannot call
+  // A::+. Therefore, the type of the parameter of A::+ will be the
+  // one given by the other calls.
+  return a /*invoke: Value([exact=JSString], value: "")*/ + 'foo';
+}
+
+/*element: main:[null]*/
+main() {
+  new A() /*invoke: [exact=A]*/ + 42;
+  foo();
+}
diff --git a/tests/compiler/dart2js/inference/inference_equivalence.dart b/tests/compiler/dart2js/inference/inference_equivalence.dart
index 2641692..b308a29 100644
--- a/tests/compiler/dart2js/inference/inference_equivalence.dart
+++ b/tests/compiler/dart2js/inference/inference_equivalence.dart
@@ -76,7 +76,7 @@
   return compareData(
       uri, const {}, computeMemberAstTypeMasks, computeMemberIrTypeMasks,
       options: [stopAfterTypeInference],
-      forMainLibraryOnly: false,
+      forUserLibrariesOnly: false,
       skipUnprocessedMembers: true,
       skipFailedCompilations: true,
       verbose: verbose,
diff --git a/tests/compiler/dart2js/inference/inference_test.dart b/tests/compiler/dart2js/inference/inference_test.dart
index 0d8bc02..ac40734 100644
--- a/tests/compiler/dart2js/inference/inference_test.dart
+++ b/tests/compiler/dart2js/inference/inference_test.dart
@@ -7,11 +7,20 @@
 import '../equivalence/id_equivalence_helper.dart';
 import 'inference_test_helper.dart';
 
+const List<String> skipForKernel = const <String>[
+  // TODO(johnniwinther): Remove this when issue 31767 is fixed.
+  'mixin_constructor_default_parameter_values.dart',
+];
+
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(
         dataDir, computeMemberAstTypeMasks, computeMemberIrTypeMasks,
-        args: args, options: [stopAfterTypeInference]);
+        libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
+        forUserLibrariesOnly: true,
+        args: args,
+        options: [stopAfterTypeInference],
+        skipForKernel: skipForKernel);
   });
 }
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
new file mode 100644
index 0000000..0578297
--- /dev/null
+++ b/tests/compiler/dart2js/inference/libs/mixin_constructor_default_parameter_values_lib.dart
@@ -0,0 +1,33 @@
+// 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 _SECRET {
+  /*element: _SECRET.:[exact=_SECRET]*/
+  const _SECRET();
+  /*element: _SECRET.toString:Value([exact=JSString], value: "SECRET!")*/
+  String toString() => "SECRET!";
+}
+
+class C {
+  /*element: C.x:[exact=JSUInt31]*/
+  final int x;
+
+  /*element: C.y:Union([exact=JSString], [exact=_SECRET])*/
+  final y;
+
+  /*element: C.a:[exact=C]*/
+  C.a(int /*[exact=JSUInt31]*/ x,
+      [var /*Union([exact=JSString], [exact=_SECRET])*/ b = const _SECRET()])
+      : this.x = x,
+        this.y = b;
+
+  /*element: C.b:[exact=C]*/
+  C.b(int /*[exact=JSUInt31]*/ x,
+      {var /*Union([exact=JSString], [exact=_SECRET])*/ b: const _SECRET()})
+      : this.x = x,
+        this.y = b;
+
+  /*element: C.toString:[exact=JSString]*/
+  String toString() => "C(${/*[exact=D]*/x},${/*[exact=D]*/y})";
+}
diff --git a/tests/compiler/dart2js/inference/list_tracer_typed_data_length_test.dart b/tests/compiler/dart2js/inference/list_tracer_typed_data_length_test.dart
deleted file mode 100644
index f0c9780..0000000
--- a/tests/compiler/dart2js/inference/list_tracer_typed_data_length_test.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/types/types.dart' show TypeMask, ContainerTypeMask;
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const TEST = const {
-  'main.dart': r'''
-import 'dart:typed_data';
-
-var myList = new Float32List(42);
-var myOtherList = new Uint8List(32);
-
-main() {
-  var a = new Float32List(9);
-  return myList[0] + myOtherList[0];
-}
-'''
-};
-
-void main() {
-  runTest({bool useKernel}) async {
-    var result = await runCompiler(
-        memorySourceFiles: TEST, options: useKernel ? [Flags.useKernel] : []);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var elementEnvironment = closedWorld.elementEnvironment;
-
-    checkType(String name, type, length) {
-      MemberEntity element = elementEnvironment.lookupLibraryMember(
-          elementEnvironment.mainLibrary, name);
-      TypeMask mask = typesInferrer.getTypeOfMember(element);
-      Expect.isTrue(mask.isContainer);
-      ContainerTypeMask container = mask;
-      Expect.equals(type, simplify(container.elementType, closedWorld), name);
-      Expect.equals(container.length, length);
-    }
-
-    checkType('myList', closedWorld.commonMasks.numType, 42);
-    checkType('myOtherList', closedWorld.commonMasks.uint31Type, 32);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/map_tracer_const_test.dart b/tests/compiler/dart2js/inference/map_tracer_const_test.dart
deleted file mode 100644
index 391a38e..0000000
--- a/tests/compiler/dart2js/inference/map_tracer_const_test.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = '''
-int closure(int x) {
-  return x;
-}
-
-class A {
-  static const DEFAULT = const {'fun' : closure};
-
-  final map;
-
-  A([maparg]) : map = maparg == null ? DEFAULT : maparg;
-}
-
-main() {
-  var a = new A();
-  a.map['fun'](3.3);
-  print(closure(22));
-}
-''';
-
-void main() {
-  runTest({bool useKernel}) async {
-    var result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var elementEnvironment = closedWorld.elementEnvironment;
-    var commonMasks = closedWorld.commonMasks;
-
-    MemberEntity element = elementEnvironment.lookupLibraryMember(
-        elementEnvironment.mainLibrary, 'closure');
-    var mask = typesInferrer.getReturnTypeOfMember(element);
-    Expect.equals(commonMasks.numType, simplify(mask, closedWorld));
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/mixin_constructor_default_parameter_values_test.dart b/tests/compiler/dart2js/inference/mixin_constructor_default_parameter_values_test.dart
deleted file mode 100644
index c0d8ade..0000000
--- a/tests/compiler/dart2js/inference/mixin_constructor_default_parameter_values_test.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-// Ensure that the inferrer looks at default values for parameters in
-// synthetic constructors using the correct context. If the constructor call
-// to D without optional parameters is inferred using D's context, the default
-// value `_SECRET` will not be visible and compilation will fail.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart';
-
-const Map MEMORY_SOURCE_FILES = const {
-  "main.dart": r"""
-  import "liba.dart";
-
-  class Mixin {
-      String get foo => "Mixin:$this";
-  }
-
-  class D = C with Mixin;
-
-  main() {
-    print(new D.a(42).foo);
-    print(new D.b(42).foo);
-    print(new D.a(42, "overt").foo);
-    print(new D.b(42, b:"odvert").foo);
-  }
-""",
-  "liba.dart": r"""
-  class _SECRET { const _SECRET(); String toString() => "SECRET!"; }
-
-  class C {
-    final int x;
-    final y;
-    C.a(int x, [var b = const _SECRET()]) : this.x = x, this.y = b;
-    C.b(int x, {var b : const _SECRET()}) : this.x = x, this.y = b;
-    String toString() => "C($x,$y)";
-  }
-"""
-};
-
-main() {
-  runTest({bool useKernel}) async {
-    await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: useKernel ? [Flags.useKernel] : []);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
deleted file mode 100644
index e990edb..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
+++ /dev/null
@@ -1,139 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-class X {}
-returnDyn1() {
-  var a;
-  ((a = 52) == true) || ((a = 'foo') == true);
-  return a;
-}
-
-returnDyn2() {
-  var a;
-  ((a = 52) == true) && ((a = 'foo') == true);
-  return a;
-}
-
-returnDyn3() {
-  var a;
-  a = a == 54 ? 'foo' : 31;
-  return a;
-}
-
-returnDyn4() {
-  var a;
-  ((a = 52) == true) || ((a = new X()) == true);
-  return a;
-}
-
-returnDyn5() {
-  var a;
-  ((a = 52) == true) && ((a = new X()) == true);
-  return a;
-}
-
-returnDyn6() {
-  var a;
-  a = a == 54 ? 'foo' : new X();
-  return a;
-}
-
-returnDyn7b(x) => x;
-
-returnDyn7() {
-  var a = "foo";
-  if (a.length == 3) a = 52;
-  if ((a is int) || (a is String && true)) returnDyn7b(a);
-  return a;
-}
-
-returnDyn8(x) => x;
-
-test8() {
-  var a = "foo";
-  if (a.length == 3) a = 52;
-  if ((false && a is! String) || returnDyn8(a)) return a;
-}
-
-returnDyn9(x) => x;
-
-test9() {
-  var a = "foo";
-  if (a.length == 3) a = 52;
-  if (!(a is bool && a is bool)) returnDyn9(a);
-}
-
-returnString(x) => x;
-
-test10() {
-  var a = "foo";
-  if (a.length == 3) a = 52;
-  if (!(a is num) && a is String) returnString(a);
-}
-
-main() {
-  returnDyn1();
-  returnDyn2();
-  returnDyn3();
-  returnDyn4();
-  returnDyn5();
-  returnDyn6();
-  returnDyn7();
-  test8();
-  test9();
-  test10();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    checkReturn(String name, type) {
-      MemberEntity element = findMember(closedWorld, name);
-      Expect.equals(type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
-    }
-
-    var subclassOfInterceptor = interceptorOrComparable(closedWorld);
-
-    checkReturn('returnDyn1', subclassOfInterceptor);
-    checkReturn('returnDyn2', subclassOfInterceptor);
-    checkReturn('returnDyn3', subclassOfInterceptor);
-    checkReturn(
-        'returnDyn4', closedWorld.commonMasks.dynamicType.nonNullable());
-    checkReturn(
-        'returnDyn5', closedWorld.commonMasks.dynamicType.nonNullable());
-    checkReturn(
-        'returnDyn6', closedWorld.commonMasks.dynamicType.nonNullable());
-    checkReturn('returnDyn7', subclassOfInterceptor);
-    checkReturn('returnDyn7b', subclassOfInterceptor);
-    checkReturn('returnDyn8', subclassOfInterceptor);
-    checkReturn('returnDyn9', subclassOfInterceptor);
-    checkReturn('returnString', closedWorld.commonMasks.stringType);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
deleted file mode 100644
index 915eeb4..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
+++ /dev/null
@@ -1,170 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-returnInt1() {
-  var a = 42;
-  var f = () {
-    return a;
-  };
-  return a;
-}
-
-returnDyn1() {
-  var a = 42;
-  var f = () {
-    a = {};
-  };
-  return a;
-}
-
-returnInt2() {
-  var a = 42;
-  var f = () {
-    a = 54;
-  };
-  return a;
-}
-
-returnDyn2() {
-  var a = 42;
-  var f = () {
-    a = 54;
-  };
-  var g = () {
-    a = {};
-  };
-  return a;
-}
-
-returnInt3() {
-  var a = 42;
-  if (a == 53) {
-    var f = () {
-      return a;
-    };
-  }
-  return a;
-}
-
-returnDyn3() {
-  var a = 42;
-  if (a == 53) {
-    var f = () {
-      a = {};
-    };
-  }
-  return a;
-}
-
-returnInt4() {
-  var a = 42;
-  g() { return a; }
-  return g();
-}
-
-returnNum1() {
-  var a = 42.5;
-  try {
-    g() {
-      var b = {};
-      b = 42;
-      return b;
-    }
-    a = g();
-  } finally {
-  }
-  return a;
-}
-
-returnIntOrNull() {
-  for (var b in [42]) {
-    var bar = 42;
-    f() => bar;
-    bar = null;
-    return f();
-  }
-  return 42;
-}
-
-class A {
-  foo() {
-    f() => this;
-    return f();
-  }
-}
-
-main() {
-  returnInt1();
-  returnDyn1();
-  returnInt2();
-  returnDyn2();
-  returnInt3();
-  returnDyn3();
-  returnInt4();
-  returnNum1();
-  returnIntOrNull();
-  new A().foo();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    checkReturn(String name, type) {
-      MemberEntity element = findMember(closedWorld, name);
-      Expect.equals(
-          type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
-          name);
-    }
-
-    checkReturn('returnInt1', closedWorld.commonMasks.uint31Type);
-    checkReturn('returnInt2', closedWorld.commonMasks.uint31Type);
-    checkReturn('returnInt3', closedWorld.commonMasks.uint31Type);
-    checkReturn('returnInt4', closedWorld.commonMasks.uint31Type);
-    checkReturn(
-        'returnIntOrNull', closedWorld.commonMasks.uint31Type.nullable());
-
-    checkReturn(
-        'returnDyn1', closedWorld.commonMasks.dynamicType.nonNullable());
-    checkReturn(
-        'returnDyn2', closedWorld.commonMasks.dynamicType.nonNullable());
-    checkReturn(
-        'returnDyn3', closedWorld.commonMasks.dynamicType.nonNullable());
-    checkReturn('returnNum1', closedWorld.commonMasks.numType);
-
-    checkReturnInClass(String className, String methodName, type) {
-      var element = findClassMember(closedWorld, className, methodName);
-      Expect.equals(type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
-    }
-
-    dynamic cls = findClass(closedWorld, 'A');
-    checkReturnInClass('A', 'foo', new TypeMask.nonNullExact(cls, closedWorld));
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
deleted file mode 100644
index 3b418e7..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-
-method(a) {  // Called via [foo] with integer then double.
-  return a;
-}
-
-const foo = method;
-
-returnNum(x) {
-  return foo(x);
-}
-
-main() {
-  returnNum(10);
-  returnNum(10.5);
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    checkReturn(String name, type) {
-      MemberEntity element = findMember(closedWorld, name);
-      TypeMask returnType = typesInferrer.getReturnTypeOfMember(element);
-      Expect.equals(type, simplify(returnType, closedWorld), name);
-    }
-
-    checkReturn('method', closedWorld.commonMasks.numType);
-    checkReturn('returnNum', closedWorld.commonMasks.numType);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure3_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure3_test.dart
deleted file mode 100644
index 0904d1c..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure3_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-method(a) {  // Called only via [foo2] with a small integer.
-  return a;
-}
-
-const foo = method;
-
-returnInt() {
-  return foo(54);
-}
-
-main() {
-  returnInt();
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkArgument(String functionName, type) {
-          dynamic functionElement = findElement(compiler, functionName);
-          var signature = functionElement.functionSignature;
-          var element = signature.requiredParameters.first;
-          Expect.equals(
-              type,
-              simplify(typesInferrer.getTypeOfParameter(element), closedWorld),
-              functionName);
-        }
-
-        checkArgument('method', closedWorld.commonMasks.uint31Type);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure4_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure4_test.dart
deleted file mode 100644
index 31af6f6..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure4_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-method(a) {  // Called via [foo] with integer then double.
-  return a;
-}
-
-const foo = method;
-
-returnNum(x) {
-  return foo(x);
-}
-
-main() {
-  returnNum(10);
-  returnNum(10.5);
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkArgument(String functionName, type) {
-          dynamic functionElement = findElement(compiler, functionName);
-          var signature = functionElement.functionSignature;
-          var element = signature.requiredParameters.first;
-          Expect.equals(
-              type,
-              simplify(typesInferrer.getTypeOfParameter(element), closedWorld),
-              functionName);
-        }
-
-        checkArgument('method', closedWorld.commonMasks.numType);
-        checkArgument('returnNum', closedWorld.commonMasks.numType);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure5_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure5_test.dart
deleted file mode 100644
index 3546e9c..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure5_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-method(a) {  // Called only via [foo2] with a small integer.
-  return a;
-}
-
-const foo = method;
-
-returnInt() {
-  return foo(54);
-}
-
-main() {
-  returnInt();
-  method(55.2);
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkArgument(String functionName, type) {
-          dynamic functionElement = findElement(compiler, functionName);
-          var signature = functionElement.functionSignature;
-          var element = signature.requiredParameters.first;
-          Expect.equals(
-              type,
-              simplify(typesInferrer.getTypeOfParameter(element), closedWorld),
-              functionName);
-        }
-
-        checkArgument('method', typesInferrer.closedWorld.commonMasks.numType);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure_default_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure_default_test.dart
deleted file mode 100644
index b16c576..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure_default_test.dart
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-// [defaultFn_i] is called only via [foo_i]'s default value with a small integer.
-
-defaultFn1(a) => a;
-defaultFn2(a) => a;
-defaultFn3(a) => a;
-defaultFn4(a) => a;
-defaultFn5(a) => a;
-defaultFn6(a) => a;
-
-foo1([fn = defaultFn1]) => fn(54);
-foo2({fn: defaultFn2}) => fn(54);
-foo3([fn = defaultFn3]) => fn(54);
-foo4({fn: defaultFn4}) => fn(54);
-foo5([fn = defaultFn5]) => fn(54);
-foo6({fn: defaultFn6}) => fn(54);
-
-main() {
-  // Direct calls.
-  foo1();
-  foo2();
-  // Indirect calls.
-  (foo3)();
-  (foo4)();
-  // Calls via Function.apply.
-  Function.apply(foo5, []);
-  Function.apply(foo6, []);
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkArgument(String functionName, type) {
-          dynamic functionElement = findElement(compiler, functionName);
-          var signature = functionElement.functionSignature;
-          var element = signature.requiredParameterCount > 0
-              ? signature.requiredParameters.first
-              : signature.optionalParameters.first;
-          Expect.equals(
-              type,
-              simplify(typesInferrer.getTypeOfParameter(element), closedWorld),
-              functionName);
-        }
-
-        checkArgument('foo1', closedWorld.commonMasks.functionType);
-
-        /// 01: ok
-        checkArgument('foo2', closedWorld.commonMasks.functionType);
-
-        /// 02: ok
-        checkArgument('foo3', closedWorld.commonMasks.functionType);
-
-        /// 03: ok
-        checkArgument('foo4', closedWorld.commonMasks.functionType);
-
-        /// 04: ok
-        checkArgument('foo5', closedWorld.commonMasks.dynamicType);
-
-        /// 05: ok
-        checkArgument('foo6', closedWorld.commonMasks.dynamicType);
-
-        /// 06: ok
-
-        checkArgument('defaultFn1', closedWorld.commonMasks.uint31Type);
-
-        /// 07: ok
-        checkArgument('defaultFn2', closedWorld.commonMasks.uint31Type);
-
-        /// 08: ok
-        checkArgument('defaultFn3', closedWorld.commonMasks.uint31Type);
-
-        /// 09: ok
-        checkArgument('defaultFn4', closedWorld.commonMasks.uint31Type);
-
-        /// 10: ok
-        checkArgument('defaultFn5', closedWorld.commonMasks.uint31Type);
-
-        /// 11: ok
-        checkArgument('defaultFn6', closedWorld.commonMasks.uint31Type);
-
-        /// 12: ok
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure_test.dart
deleted file mode 100644
index 0c2d202..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure_test.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-method1() {
-  return 42;
-}
-
-method2(a) {  // Called only via [foo2] with a small integer.
-  return a;
-}
-
-const foo1 = method1;
-const foo2 = method2;
-
-returnInt1() {
-  return foo1();
-}
-
-returnInt2() {
-  return foo2(54);
-}
-
-main() {
-  returnInt1();
-  returnInt2();
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          dynamic returnType = typesInferrer.getReturnTypeOfMember(element);
-          Expect.equals(type, returnType.simplify(compiler), name);
-        }
-
-        checkReturn('method1', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt1', closedWorld.commonMasks.uint31Type);
-
-        checkReturn('method2', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt2', closedWorld.commonMasks.uint31Type);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
deleted file mode 100644
index 47349b4..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
+++ /dev/null
@@ -1,57 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-// Test that a non-used generative constructor does not prevent
-// inferring types for fields.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-
-class A {
-  final intField;
-  final stringField;
-  A() : intField = 42, stringField = 'foo';
-  A.bar() : intField = 'bar', stringField = 42;
-}
-
-main() {
-  new A();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    checkFieldTypeInClass(String className, String fieldName, type) {
-      var element = findClassMember(closedWorld, className, fieldName);
-      Expect.isTrue(typesInferrer.getTypeOfMember(element).containsOnly(type));
-    }
-
-    checkFieldTypeInClass('A', 'intField',
-        typesInferrer.closedWorld.commonElements.jsUInt31Class);
-    checkFieldTypeInClass('A', 'stringField',
-        typesInferrer.closedWorld.commonElements.jsStringClass);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
deleted file mode 100644
index 613466e..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-// Test that we are analyzing field parameters correctly.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-
-class A {
-  final dynamicField;
-  A() : dynamicField = 42;
-  A.bar(this.dynamicField);
-}
-
-main() {
-  new A();
-  new A.bar('foo');
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    checkFieldTypeInClass(String className, String fieldName, type) {
-      var element = findClassMember(closedWorld, className, fieldName);
-      Expect.equals(
-          type, simplify(typesInferrer.getTypeOfMember(element), closedWorld));
-    }
-
-    checkFieldTypeInClass(
-        'A', 'dynamicField', interceptorOrComparable(closedWorld));
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_final_field_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field_test.dart
deleted file mode 100644
index 233ab02..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_final_field_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-class A {
-  final intField;
-  final giveUpField1;
-  final giveUpField2;
-  final fieldParameter;
-  A() : intField = 42, giveUpField1 = 'foo', giveUpField2 = 'foo';
-  A.bar() : intField = 54, giveUpField1 = 42, giveUpField2 = new A();
-  A.foo(this.fieldParameter);
-}
-
-main() {
-  new A();
-  new A.bar();
-  new A.foo(42);
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkFieldTypeInClass(String className, String fieldName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(fieldName);
-          Expect.equals(type,
-              simplify(typesInferrer.getTypeOfMember(element), closedWorld));
-        }
-
-        checkFieldTypeInClass(
-            'A', 'intField', closedWorld.commonMasks.uint31Type);
-        checkFieldTypeInClass(
-            'A', 'giveUpField1', closedWorld.commonMasks.interceptorType);
-        checkFieldTypeInClass('A', 'giveUpField2',
-            closedWorld.commonMasks.dynamicType.nonNullable());
-        checkFieldTypeInClass(
-            'A', 'fieldParameter', closedWorld.commonMasks.uint31Type);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure2_test.dart
deleted file mode 100644
index 45bcf56..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure2_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-method(a) {  // Called only via [foo] with a small integer.
-  return a;
-}
-
-var foo = method;
-
-returnInt() {
-  return foo(54);
-}
-
-main() {
-  returnInt();
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkArgument(String functionName, type) {
-          dynamic functionElement = findElement(compiler, functionName);
-          var signature = functionElement.functionSignature;
-          var element = signature.requiredParameters.first;
-          Expect.equals(
-              type,
-              simplify(typesInferrer.getTypeOfParameter(element), closedWorld),
-              functionName);
-        }
-
-        checkArgument('method', closedWorld.commonMasks.uint31Type);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test.dart
deleted file mode 100644
index c087cf8..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-method1() {
-  return 42;
-}
-
-method2(a) {  // Called only via [foo2] with a small integer.
-  return a;
-}
-
-var foo1 = method1;
-var foo2 = method2;
-
-returnInt1() {
-  return foo1();
-}
-
-returnInt2() {
-  return foo2(54);
-}
-
-main() {
-  returnInt1();
-  returnInt2();
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          dynamic returnType = typesInferrer.getReturnTypeOfMember(element);
-          Expect.equals(type, returnType.simplify(compiler), name);
-        }
-
-        checkReturn('method1', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt1', closedWorld.commonMasks.uint31Type);
-
-        checkReturn('method2', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt2', closedWorld.commonMasks.uint31Type);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_no_such_method_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_no_such_method_test.dart
deleted file mode 100644
index 50a2f86..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_no_such_method_test.dart
+++ /dev/null
@@ -1,243 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:expect/expect.dart';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/types/types.dart';
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST1 = """
-class A {
-  noSuchMethod(im) => 42;
-}
-
-class B extends A {
-  foo();
-}
-
-class C extends B {
-  foo() => {};
-}
-
-var a = [new B(), new C()][0];
-test1() => new A().foo();
-test2() => a.foo();
-test3() => new B().foo();
-test4() => new C().foo();
-test5() => (a ? new A() : new B()).foo();
-test6() => (a ? new B() : new C()).foo();
-
-main() {
-  test1();
-  test2();
-  test3();
-  test4();
-  test5();
-  test6();
-}
-""";
-
-const String TEST2 = """
-abstract class A {
-  noSuchMethod(im) => 42;
-}
-
-class B extends A {
-  foo() => {};
-}
-
-class C extends B {
-  foo() => {};
-}
-
-class D implements A {
-  foo() => {};
-  noSuchMethod(im) => 42.5;
-}
-
-var a = [new B(), new C(), new D()][0];
-test1() => a.foo();
-test2() => new B().foo();
-test3() => new C().foo();
-test4() => (a ? new B() : new C()).foo();
-test5() => (a ? new B() : new D()).foo();
-
-// Can hit A.noSuchMethod, D.noSuchMethod and Object.noSuchMethod.
-test6() => a.bar();
-
-// Can hit A.noSuchMethod.
-test7() => new B().bar();
-test8() => new C().bar();
-test9() => (a ? new B() : new C()).bar();
-
-// Can hit A.noSuchMethod and D.noSuchMethod.
-test10() => (a ? new B() : new D()).bar();
-
-// Can hit D.noSuchMethod.
-test11() => new D().bar();
-
-main() {
-  test1();
-  test2();
-  test3();
-  test4();
-  test5();
-  test6();
-  test7();
-  test8();
-  test9();
-  test10();
-  test11();
-}
-""";
-
-const String TEST3 = """
-class A {
-  // We may ignore this for type inference because syntactically it always
-  // throws an exception.
-  noSuchMethod(im) => throw 'foo';
-}
-
-class B extends A {
-  foo() => {};
-}
-
-class C extends B {
-  foo() => {};
-}
-
-var a = [new B(), new C()][0];
-test1() => new A().foo();
-test2() => a.foo();
-test3() => new B().foo();
-test4() => new C().foo();
-test5() => (a ? new A() : new B()).foo();
-test6() => (a ? new B() : new C()).foo();
-
-main() {
-  test1();
-  test2();
-  test3();
-  test4();
-  test5();
-  test6();
-}
-""";
-
-const String TEST4 = """
-class A {
-  // We may ignore this for type inference because it forwards to a default
-  // noSuchMethod implementation, which always throws an exception.
-  noSuchMethod(im) => super.noSuchMethod(im);
-}
-
-class B extends A {
-  foo() => {};
-}
-
-class C extends B {
-  foo() => {};
-}
-
-var a = [new B(), new C()][0];
-test1() => new A().foo();
-test2() => a.foo();
-test3() => new B().foo();
-test4() => new C().foo();
-test5() => (a ? new A() : new B()).foo();
-test6() => (a ? new B() : new C()).foo();
-
-main() {
-  test1();
-  test2();
-  test3();
-  test4();
-  test5();
-  test6();
-}
-""";
-
-checkReturn(MockCompiler compiler, String name, type) {
-  var typesInferrer = compiler.globalInference.typesInferrerInternal;
-  MemberElement element = findElement(compiler, name);
-  Expect.equals(
-      type,
-      simplify(typesInferrer.getReturnTypeOfMember(element),
-          typesInferrer.closedWorld),
-      name);
-}
-
-test1() async {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST1, uri);
-  await compiler.run(uri);
-  var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
-  checkReturn(compiler, 'test1', closedWorld.commonMasks.uint31Type);
-  checkReturn(
-      compiler, 'test2', closedWorld.commonMasks.dynamicType.nonNullable());
-  checkReturn(compiler, 'test3', closedWorld.commonMasks.uint31Type);
-  checkReturn(compiler, 'test4', closedWorld.commonMasks.mapType);
-  checkReturn(
-      compiler, 'test5', closedWorld.commonMasks.dynamicType.nonNullable());
-  checkReturn(
-      compiler, 'test6', closedWorld.commonMasks.dynamicType.nonNullable());
-}
-
-test2() async {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST2, uri);
-  await compiler.run(uri);
-  var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
-  checkReturn(compiler, 'test1', closedWorld.commonMasks.mapType.nonNullable());
-  checkReturn(compiler, 'test2', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test3', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test4', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test5', closedWorld.commonMasks.mapType);
-
-  checkReturn(compiler, 'test6', closedWorld.commonMasks.numType);
-  checkReturn(compiler, 'test7', closedWorld.commonMasks.uint31Type);
-  checkReturn(compiler, 'test8', closedWorld.commonMasks.uint31Type);
-  checkReturn(compiler, 'test9', closedWorld.commonMasks.uint31Type);
-  checkReturn(compiler, 'test10', closedWorld.commonMasks.numType);
-  checkReturn(compiler, 'test11', closedWorld.commonMasks.doubleType);
-}
-
-test3() async {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST3, uri);
-  await compiler.run(uri);
-  var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
-  checkReturn(compiler, 'test1', const TypeMask.nonNullEmpty());
-  checkReturn(compiler, 'test2', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test3', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test4', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test5', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test6', closedWorld.commonMasks.mapType);
-}
-
-test4() async {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST4, uri);
-  await compiler.run(uri);
-  var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
-  checkReturn(compiler, 'test1', const TypeMask.nonNullEmpty());
-  checkReturn(compiler, 'test2', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test3', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test4', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test5', closedWorld.commonMasks.mapType);
-  checkReturn(compiler, 'test6', closedWorld.commonMasks.mapType);
-}
-
-main() {
-  asyncTest(() async {
-    await test1();
-    await test2();
-    await test3();
-    await test4();
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_postfix_prefix_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_postfix_prefix_test.dart
deleted file mode 100644
index ff472fb..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_postfix_prefix_test.dart
+++ /dev/null
@@ -1,108 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = """
-
-class A {
-  get foo => 'string';
-  set foo(value) {}
-  operator[](index) => 'string';
-  operator[]=(index, value) {}
-
-  returnDynamic1() => foo--;
-  returnNum1() => --foo;
-  returnNum2() => foo -= 42;
-
-  returnDynamic2() => this[index]--;
-  returnNum3() => --this[index];
-  returnNum4() => this[index] -= 42;
-
-  returnEmpty3() => this.bar--;
-  returnEmpty1() => --this.bar;
-  returnEmpty2() => this.bar -= 42;
-}
-
-class B extends A {
-  get foo => 42;
-  operator[](index) => 42;
-
-  returnString1() => super.foo--;
-  returnDynamic1() => --super.foo;
-  returnDynamic2() => super.foo -= 42;
-
-  returnString2() => super[index]--;
-  returnDynamic3() => --super[index];
-  returnDynamic4() => super[index] -= 42;
-}
-
-main() {
-  new A()..returnNum1()
-         ..returnNum2()
-         ..returnNum3()
-         ..returnNum4()
-         ..returnNum5()
-         ..returnNum6()
-         ..returnDynamic1()
-         ..returnDynamic2()
-         ..returnDynamic3();
-
-  new B()..returnString1()
-         ..returnString2()
-         ..returnDynamic1()
-         ..returnDynamic2()
-         ..returnDynamic3()
-         ..returnDynamic4();
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
-
-        checkReturnInClass(String className, String methodName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(methodName);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld),
-              methodName);
-        }
-
-        var subclassOfInterceptor = commonMasks.interceptorType;
-
-        checkReturnInClass('A', 'returnNum1', commonMasks.numType);
-        checkReturnInClass('A', 'returnNum2', commonMasks.numType);
-        checkReturnInClass('A', 'returnNum3', commonMasks.numType);
-        checkReturnInClass('A', 'returnNum4', commonMasks.numType);
-        checkReturnInClass('A', 'returnEmpty1', const TypeMask.nonNullEmpty());
-        checkReturnInClass('A', 'returnEmpty2', const TypeMask.nonNullEmpty());
-        checkReturnInClass('A', 'returnDynamic1', subclassOfInterceptor);
-        checkReturnInClass('A', 'returnDynamic2', subclassOfInterceptor);
-        checkReturnInClass('A', 'returnEmpty3', const TypeMask.nonNullEmpty());
-
-        checkReturnInClass('B', 'returnString1', commonMasks.stringType);
-        checkReturnInClass('B', 'returnString2', commonMasks.stringType);
-        checkReturnInClass(
-            'B', 'returnDynamic1', const TypeMask.nonNullEmpty());
-        checkReturnInClass(
-            'B', 'returnDynamic2', const TypeMask.nonNullEmpty());
-        checkReturnInClass(
-            'B', 'returnDynamic3', const TypeMask.nonNullEmpty());
-        checkReturnInClass(
-            'B', 'returnDynamic4', const TypeMask.nonNullEmpty());
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_test.dart
deleted file mode 100644
index 97d1ff9..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_test.dart
+++ /dev/null
@@ -1,888 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-returnNum1(a) {
-  if (a) return 1;
-  else return 2.5;
-}
-
-returnNum2(a) {
-  if (a) return 1.4;
-  else return 2;
-}
-
-returnInt1(a) {
-  if (a) return 1;
-  else return 2;
-}
-
-returnDouble(a) {
-  if (a) return 1.5;
-  else return 2.5;
-}
-
-returnGiveUp(a) {
-  if (a) return 1;
-  else return 'foo';
-}
-
-returnInt2() {
-  var a = 42;
-  return a++;
-}
-
-returnInt5() {
-  var a = 42;
-  return ++a;
-}
-
-returnInt6() {
-  var a = 42;
-  a++;
-  return a;
-}
-
-returnIntOrNull(a) {
-  if (a) return 42;
-}
-
-returnInt3(a) {
-  if (a) return 42;
-  throw 42;
-}
-
-returnInt4() {
-  return (42);
-}
-
-returnInt7() {
-  return 42.abs();
-}
-
-returnInt8() {
-  return 42.remainder(54);
-}
-
-returnEmpty1() {
-  // Ensure that we don't intrisify a wrong call to [int.remainder].
-  return 42.remainder();
-}
-
-returnEmpty2() {
-  // Ensure that we don't intrisify a wrong call to [int.abs].
-  return 42.abs(42);
-}
-
-testIsCheck1(a) {
-  if (a is int) {
-    return a;
-  } else {
-    return 42;
-  }
-}
-
-testIsCheck2(a) {
-  if (a is !int) {
-    return 0;
-  } else {
-    return a;
-  }
-}
-
-testIsCheck3(a) {
-  if (a is !int) {
-    print('hello');
-  } else {
-    return a;
-  }
-}
-
-testIsCheck4(a) {
-  if (a is int) {
-    return a;
-  } else {
-    return 42;
-  }
-}
-
-testIsCheck5(a) {
-  if (a is !int) {
-    return 42;
-  } else {
-    return a;
-  }
-}
-
-testIsCheck6(a) {
-  if (a is !int) {
-    return a;
-  } else {
-    return 42;
-  }
-}
-
-testIsCheck7(a) {
-  if (a == 'foo' && a is int) {
-    return a;
-  } else {
-    return 42;
-  }
-}
-
-testIsCheck8(a) {
-  if (a == 'foo' || a is int) {
-    return a;
-  } else {
-    return 42;
-  }
-}
-
-testIsCheck9(a) {
-  return a is int ? a : 42;
-}
-
-testIsCheck10(a) {
-  return a is !int ? a : 42;
-}
-
-testIsCheck11(a) {
-  return a is !int ? 42 : a;
-}
-
-testIsCheck12(a) {
-  return a is int ? 42 : a;
-}
-
-testIsCheck13(a) {
-  while (a is int) {
-    return a;
-  }
-  return 42;
-}
-
-testIsCheck14(a) {
-  while (a is !int) {
-    return 42;
-  }
-  return a;
-}
-
-testIsCheck15(a) {
-  var c = 42;
-  do {
-    if (a) return c;
-    c = topLevelGetter();
-  } while (c is int);
-  return 42;
-}
-
-testIsCheck16(a) {
-  var c = 42;
-  do {
-    if (a) return c;
-    c = topLevelGetter();
-  } while (c is !int);
-  return 42;
-}
-
-testIsCheck17(a) {
-  var c = 42;
-  for (; c is int;) {
-    if (a) return c;
-    c = topLevelGetter();
-  }
-  return 42;
-}
-
-testIsCheck18(a) {
-  var c = 42;
-  for (; c is int;) {
-    if (a) return c;
-    c = topLevelGetter();
-  }
-  return c;
-}
-
-testIsCheck19(a) {
-  var c = 42;
-  for (; c is !int;) {
-    if (a) return c;
-    c = topLevelGetter();
-  }
-  return 42;
-}
-
-testIsCheck20() {
-  var c = topLevelGetter();
-  if (c != null && c is! bool && c is! int) {
-    return 42;
-  } else if (c is String) {
-    return c;
-  } else {
-    return 68;
-  }
-}
-
-testIsCheck21(a) {
-  if (a is int || a is List) {
-    return a;
-  } else {
-    return 42;
-  }
-}
-
-testIsCheck22(a) {
-  return (a is int || a is List) ? a : 42;
-}
-
-testIsCheck23(a) {
-  if (a is! int) throw 'foo';
-  return a;
-}
-
-testIsCheck24(a) {
-  if (a is! int) return 42;
-  return a;
-}
-
-testIsCheck25(a) {
-  if (a is int) throw 'foo';
-  return a;
-}
-
-testIsCheck26(a) {
-  if (a is int) {
-  } else {
-    throw 42;
-  }
-  return a;
-}
-
-testIsCheck27(a) {
-  if (a is int) {
-  } else {
-    return 42;
-  }
-  return a;
-}
-
-testIsCheck28(a) {
-  if (a is int) {
-  } else {
-  }
-  return a;
-}
-
-testIsCheck29(a) {
-  if (a is int) {}
-  return a;
-}
-
-testIf1(a) {
-  var c = null;
-  if (a) {
-    c = 10;
-  } else {
-  }
-  return c;
-}
-
-testIf2(a) {
-  var c = null;
-  if (a) {
-  } else {
-    c = 10;
-  }
-  return c;
-}
-
-returnAsString() {
-  return topLevelGetter() as String;
-}
-
-returnIntAsNum() {
-  return 0 as num;
-}
-
-typedef int Foo();
-
-returnAsTypedef() {
-  return topLevelGetter() as Foo;
-}
-
-testDeadCode() {
-  return 42;
-  return 'foo';
-}
-
-testLabeledIf(a) {
-  var c;
-  L1: if (a > 1) {
-    if (a == 2) {
-      break L1;
-    }
-    c = 42;
-  } else {
-    c = 38;
-  }
-  return c;
-}
-
-testSwitch1() {
-  var a = null;
-  switch (topLevelGetter) {
-    case 100: a = 42.5; break;
-    case 200: a = 42; break;
-  }
-  return a;
-}
-
-testSwitch2() {
-  var a = null;
-  switch (topLevelGetter) {
-    case 100: a = 42; break;
-    case 200: a = 42; break;
-    default:
-      a = 43;
-  }
-  return a;
-}
-
-testSwitch3() {
-  var a = 42;
-  var b;
-  switch (topLevelGetter) {
-    L1: case 1: b = a + 42; break;
-    case 2: a = 'foo'; continue L1;
-  }
-  return b;
-}
-
-testSwitch4() {
-  switch (topLevelGetter) {
-    case 1: break;
-    default: break;
-  }
-  return 42;
-}
-
-testSwitch5() {
-  switch (topLevelGetter) {
-    case 1: return 1;
-    default: return 2;
-  }
-}
-
-testContinue1() {
-  var a = 42;
-  var b;
-  while (true) {
-    b = a + 54;
-    if (b == 42) continue;
-    a = 'foo';
-  }
-  return b;
-}
-
-testBreak1() {
-  var a = 42;
-  var b;
-  while (true) {
-    b = a + 54;
-    if (b == 42) break;
-    b = 'foo';
-  }
-  return b;
-}
-
-testContinue2() {
-  var a = 42;
-  var b;
-  while (true) {
-    b = a + 54;
-    if (b == 42) {
-      b = 'foo';
-      continue;
-    }
-  }
-  return b;
-}
-
-testBreak2() {
-  var a = 42;
-  var b;
-  while (true) {
-    b = a + 54;
-    if (b == 42) {
-      a = 'foo';
-      break;
-    }
-  }
-  return b;
-}
-
-testReturnElementOfConstList1() {
-  return const [42][0];
-}
-
-testReturnElementOfConstList2() {
-  return topLevelConstList[0];
-}
-
-testReturnItselfOrInt(a) {
-  if (a) return 42;
-  return testReturnItselfOrInt(a);
-}
-
-testDoWhile1() {
-  var a = 42;
-  do {
-    a = 'foo';
-  } while (true);
-  return a;
-}
-
-testDoWhile2() {
-  var a = 42;
-  do {
-    a = 'foo';
-    return;
-  } while (true);
-  return a;
-}
-
-testDoWhile3() {
-  var a = 42;
-  do {
-    a = 'foo';
-    if (true) continue;
-    return 42;
-  } while (true);
-  return a;
-}
-
-testDoWhile4() {
-  var a = 'foo';
-  do {
-    a = 54;
-    if (true) break;
-    return 3.5;
-  } while (true);
-  return a;
-}
-
-testSpecialization1() {
-  var a = topLevelGetter();
-  a - 42;
-  return a;
-}
-
-testSpecialization2() {
-  var a = topLevelGetter();
-  // Make [a] a captured variable. This should disable receiver
-  // specialization on [a].
-  (() => a.toString())();
-  a - 42;
-  return a;
-}
-
-testSpecialization3() {
-  var a = returnDynamic() ? null : 42;
-  a.toString();
-  // Test that calling an [Object] method on [a] will not lead to
-  // infer that [a] is not null;
-  return a;
-}
-
-testReturnNull1(a) {
-  if (a == null) return a;
-  return null;
-}
-
-testReturnNull2(a) {
-  if (a != null) return null;
-  return a;
-}
-
-testReturnNull3(a) {
-  if (a == null) return 42;
-  return a;
-}
-
-testReturnNull4() {
-  var a = topLevelGetter();
-  if (a == null) return a;
-  return null;
-}
-
-testReturnNull5() {
-  var a = topLevelGetter();
-  if (a != null) return null;
-  return a;
-}
-
-testReturnNull6() {
-  var a = topLevelGetter();
-  if (a == null) return 42;
-  return a;
-}
-
-testReturnNotEquals() {
-  return new A() != 54;
-}
-
-testReturnInvokeDynamicGetter() => new A().myFactory();
-
-var topLevelConstList = const [42];
-
-get topLevelGetter => 42;
-returnDynamic() => topLevelGetter(42);
-returnTopLevelGetter() => topLevelGetter;
-
-class A {
-  factory A() = A.generative;
-  A.generative();
-  operator==(other) => 42;
-
-  get myField => 42;
-  set myField(a) {}
-  returnInt1() => ++myField;
-  returnInt2() => ++this.myField;
-  returnInt3() => this.myField += 42;
-  returnInt4() => myField += 42;
-  operator[](index) => 42;
-  operator[]= (index, value) {}
-  returnInt5() => ++this[0];
-  returnInt6() => this[0] += 1;
-
-  get myFactory => () => 42;
-}
-
-class B extends A {
-  B() : super.generative();
-  returnInt1() => ++new A().myField;
-  returnInt2() => new A().myField += 4;
-  returnInt3() => ++new A()[0];
-  returnInt4() => new A()[0] += 42;
-  returnInt5() => ++super.myField;
-  returnInt6() => super.myField += 4;
-  returnInt7() => ++super[0];
-  returnInt8() => super[0] += 54;
-  returnInt9() => super.myField;
-}
-
-class C {
-  var myField = 42;
-  C();
-
-  returnInt1() => ++myField;
-  returnInt2() => ++this.myField;
-  returnInt3() => this.myField += 42;
-  returnInt4() => myField += 42;
-  operator[](index) => myField;
-  operator[]= (index, value) {}
-  returnInt5() => ++this[0];
-  returnInt6() => this[0] += 1;
-}
-
-testCascade1() {
-  return [1, 2, 3]..add(4)..add(5);
-}
-
-testCascade2() {
-  return new CascadeHelper()
-      ..a = "hello"
-      ..b = 42
-      ..i += 1;
-}
-
-class CascadeHelper {
-  var a, b;
-  var i = 0;
-}
-
-main() {
-  // Ensure a function class is being instantiated.
-  () => 42;
-  returnNum1(true);
-  returnNum2(true);
-  returnInt1(true);
-  returnInt2();
-  returnInt3(true);
-  returnInt4();
-  returnDouble(true);
-  returnGiveUp(true);
-  returnInt5();
-  returnInt6();
-  returnInt7();
-  returnInt8();
-  returnIntOrNull(true);
-  returnDynamic();
-  returnEmpty1();
-  returnEmpty2();
-  testIsCheck1(topLevelGetter());
-  testIsCheck2(topLevelGetter());
-  testIsCheck3(topLevelGetter());
-  testIsCheck4(topLevelGetter());
-  testIsCheck5(topLevelGetter());
-  testIsCheck6(topLevelGetter());
-  testIsCheck7(topLevelGetter());
-  testIsCheck8(topLevelGetter());
-  testIsCheck9(topLevelGetter());
-  testIsCheck10(topLevelGetter());
-  testIsCheck11(topLevelGetter());
-  testIsCheck12(topLevelGetter());
-  testIsCheck13(topLevelGetter());
-  testIsCheck14(topLevelGetter());
-  testIsCheck15(topLevelGetter());
-  testIsCheck16(topLevelGetter());
-  testIsCheck17(topLevelGetter());
-  testIsCheck18(topLevelGetter());
-  testIsCheck19(topLevelGetter());
-  testIsCheck20();
-  testIsCheck21(topLevelGetter());
-  testIsCheck22(topLevelGetter());
-  testIsCheck23(topLevelGetter());
-  testIsCheck24(topLevelGetter());
-  testIsCheck25(topLevelGetter());
-  testIsCheck26(topLevelGetter());
-  testIsCheck27(topLevelGetter());
-  testIsCheck28(topLevelGetter());
-  testIsCheck29(topLevelGetter());
-  testIf1(topLevelGetter());
-  testIf2(topLevelGetter());
-  returnAsString();
-  returnIntAsNum();
-  returnAsTypedef();
-  returnTopLevelGetter();
-  testDeadCode();
-  testLabeledIf(true);
-  testSwitch1();
-  testSwitch2();
-  testSwitch3();
-  testSwitch4();
-  testSwitch5();
-  testContinue1();
-  testBreak1();
-  testContinue2();
-  testBreak2();
-  testDoWhile1();
-  testDoWhile2();
-  testDoWhile3();
-  testDoWhile4();
-  new A() == null;
-  new A()..returnInt1()
-         ..returnInt2()
-         ..returnInt3()
-         ..returnInt4()
-         ..returnInt5()
-         ..returnInt6();
-
-  new B()..returnInt1()
-         ..returnInt2()
-         ..returnInt3()
-         ..returnInt4()
-         ..returnInt5()
-         ..returnInt6()
-         ..returnInt7()
-         ..returnInt8()
-         ..returnInt9();
-
-  new C()..returnInt1()
-         ..returnInt2()
-         ..returnInt3()
-         ..returnInt4()
-         ..returnInt5()
-         ..returnInt6();
-  testReturnElementOfConstList1();
-  testReturnElementOfConstList2();
-  testReturnItselfOrInt(topLevelGetter());
-  testReturnInvokeDynamicGetter();
-  testCascade1();
-  testCascade2();
-  testSpecialization1();
-  testSpecialization2();
-  testSpecialization3();
-  testReturnNull1(topLevelGetter());
-  testReturnNull2(topLevelGetter());
-  testReturnNull3(topLevelGetter());
-  testReturnNull4();
-  testReturnNull5();
-  testReturnNull6();
-  testReturnNotEquals();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-
-    checkReturn(String name, type) {
-      MemberEntity element = findMember(closedWorld, name);
-      Expect.equals(
-          type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
-          name);
-    }
-
-    var interceptorType = commonMasks.interceptorType;
-    var interceptorOrComparableType = interceptorOrComparable(closedWorld);
-
-    checkReturn('returnNum1', commonMasks.numType);
-    checkReturn('returnNum2', commonMasks.numType);
-    checkReturn('returnInt1', commonMasks.uint31Type);
-    checkReturn('returnInt2', commonMasks.uint31Type);
-    checkReturn('returnDouble', commonMasks.doubleType);
-    checkReturn('returnGiveUp', interceptorOrComparableType);
-    checkReturn('returnInt5', commonMasks.uint32Type); // uint31+uint31->uint32
-    checkReturn('returnInt6', commonMasks.uint32Type); // uint31+uint31->uint32
-    checkReturn('returnIntOrNull', commonMasks.uint31Type.nullable());
-    checkReturn('returnInt3', commonMasks.uint31Type);
-    checkReturn('returnDynamic', commonMasks.dynamicType);
-    checkReturn('returnInt4', commonMasks.uint31Type);
-    checkReturn('returnInt7', commonMasks.positiveIntType);
-    checkReturn('returnInt8', commonMasks.positiveIntType);
-    checkReturn('returnEmpty1', const TypeMask.nonNullEmpty());
-    checkReturn('returnEmpty2', const TypeMask.nonNullEmpty());
-    TypeMask intType = new TypeMask.nonNullSubtype(
-        closedWorld.commonElements.intClass, closedWorld);
-    checkReturn('testIsCheck1', intType);
-    checkReturn('testIsCheck2', intType);
-    checkReturn('testIsCheck3', intType.nullable());
-    checkReturn('testIsCheck4', intType);
-    checkReturn('testIsCheck5', intType);
-    checkReturn('testIsCheck6', commonMasks.dynamicType);
-    checkReturn('testIsCheck7', intType);
-    checkReturn('testIsCheck8', commonMasks.dynamicType);
-    checkReturn('testIsCheck9', intType);
-    checkReturn('testIsCheck10', commonMasks.dynamicType);
-    checkReturn('testIsCheck11', intType);
-    checkReturn('testIsCheck12', commonMasks.dynamicType);
-    checkReturn('testIsCheck13', intType);
-    checkReturn('testIsCheck14', commonMasks.dynamicType);
-    // TODO(29309): Re-enable when 29309 is fixed.
-    // checkReturn('testIsCheck15', intType);
-    checkReturn('testIsCheck16', commonMasks.dynamicType);
-    checkReturn('testIsCheck17', intType);
-    checkReturn('testIsCheck18', commonMasks.dynamicType);
-    checkReturn('testIsCheck19', commonMasks.dynamicType);
-    checkReturn('testIsCheck20', interceptorOrComparableType);
-    checkReturn('testIsCheck21', commonMasks.dynamicType);
-    checkReturn('testIsCheck22', commonMasks.dynamicType);
-    checkReturn('testIsCheck23', intType);
-    checkReturn('testIsCheck24', intType);
-    checkReturn('testIsCheck25', commonMasks.dynamicType);
-    checkReturn('testIsCheck26', intType);
-    checkReturn('testIsCheck27', intType);
-    checkReturn('testIsCheck28', commonMasks.dynamicType);
-    checkReturn('testIsCheck29', commonMasks.dynamicType);
-    checkReturn('testIf1', commonMasks.uint31Type.nullable());
-    checkReturn('testIf2', commonMasks.uint31Type.nullable());
-    checkReturn(
-        'returnAsString',
-        new TypeMask.subtype(
-            closedWorld.commonElements.stringClass, closedWorld));
-    checkReturn('returnIntAsNum', commonMasks.uint31Type);
-    checkReturn('returnAsTypedef', commonMasks.functionType.nullable());
-    checkReturn('returnTopLevelGetter', commonMasks.uint31Type);
-    checkReturn('testDeadCode', commonMasks.uint31Type);
-    checkReturn('testLabeledIf', commonMasks.uint31Type.nullable());
-    checkReturn(
-        'testSwitch1',
-        simplify(
-            commonMasks.intType
-                .union(commonMasks.doubleType, closedWorld)
-                .nullable(),
-            closedWorld));
-    checkReturn('testSwitch2', commonMasks.uint31Type);
-    checkReturn('testSwitch3', interceptorOrComparableType.nullable());
-    checkReturn('testSwitch4', commonMasks.uint31Type);
-    checkReturn('testSwitch5', commonMasks.uint31Type);
-    checkReturn('testContinue1', interceptorOrComparableType.nullable());
-    checkReturn('testBreak1', interceptorOrComparableType.nullable());
-    checkReturn('testContinue2', interceptorOrComparableType.nullable());
-    checkReturn('testBreak2', commonMasks.uint32Type.nullable());
-    checkReturn('testReturnElementOfConstList1', commonMasks.uint31Type);
-    checkReturn('testReturnElementOfConstList2', commonMasks.uint31Type);
-    checkReturn('testReturnItselfOrInt', commonMasks.uint31Type);
-    checkReturn('testReturnInvokeDynamicGetter', commonMasks.dynamicType);
-
-    checkReturn('testDoWhile1', commonMasks.stringType);
-    checkReturn('testDoWhile2', commonMasks.nullType);
-    checkReturn('testDoWhile3', commonMasks.uint31Type);
-    checkReturn('testDoWhile4', commonMasks.numType);
-
-    checkReturnInClass(String className, String methodName, type) {
-      var element = findClassMember(closedWorld, className, methodName);
-      Expect.equals(
-          type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
-          '$className:$methodName');
-    }
-
-    checkReturnInClass('A', 'returnInt1', commonMasks.uint32Type);
-    checkReturnInClass('A', 'returnInt2', commonMasks.uint32Type);
-    checkReturnInClass('A', 'returnInt3', commonMasks.uint32Type);
-    checkReturnInClass('A', 'returnInt4', commonMasks.uint32Type);
-    checkReturnInClass('A', 'returnInt5', commonMasks.uint32Type);
-    checkReturnInClass('A', 'returnInt6', commonMasks.uint32Type);
-    checkReturnInClass('A', '==', interceptorType);
-
-    checkReturnInClass('B', 'returnInt1', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt2', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt3', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt4', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt5', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt6', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt7', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt8', commonMasks.uint32Type);
-    checkReturnInClass('B', 'returnInt9', commonMasks.uint31Type);
-
-    checkReturnInClass('C', 'returnInt1', commonMasks.positiveIntType);
-    checkReturnInClass('C', 'returnInt2', commonMasks.positiveIntType);
-    checkReturnInClass('C', 'returnInt3', commonMasks.positiveIntType);
-    checkReturnInClass('C', 'returnInt4', commonMasks.positiveIntType);
-    checkReturnInClass('C', 'returnInt5', commonMasks.positiveIntType);
-    checkReturnInClass('C', 'returnInt6', commonMasks.positiveIntType);
-
-    checkReturn('testCascade1', commonMasks.growableListType);
-    ClassEntity clsCascadeHelper = findClass(closedWorld, 'CascadeHelper');
-    checkReturn('testCascade2',
-        new TypeMask.nonNullExact(clsCascadeHelper, closedWorld));
-    checkReturn('testSpecialization1', commonMasks.numType);
-    checkReturn('testSpecialization2', commonMasks.dynamicType);
-    checkReturn('testSpecialization3', commonMasks.uint31Type.nullable());
-    checkReturn('testReturnNull1', commonMasks.nullType);
-    checkReturn('testReturnNull2', commonMasks.nullType);
-    checkReturn('testReturnNull3', commonMasks.dynamicType);
-    checkReturn('testReturnNull4', commonMasks.nullType);
-    checkReturn('testReturnNull5', commonMasks.nullType);
-    checkReturn('testReturnNull6', commonMasks.dynamicType);
-    checkReturn('testReturnNotEquals', commonMasks.boolType);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
deleted file mode 100644
index bfe19ca..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
+++ /dev/null
@@ -1,211 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-returnInt1() {
-  var a = 42;
-  try {
-    a = 54;
-  } catch (e){
-  }
-  return a;
-}
-
-returnDyn1() {
-  var a = 42;
-  try {
-    a = 'foo';
-  } catch (e){
-  }
-  return a;
-}
-
-returnInt2() {
-  var a = 42;
-  try {
-    a = 54;
-  } catch (e){
-    a = 2;
-  }
-  return a;
-}
-
-returnDyn2() {
-  var a = 42;
-  try {
-    a = 54;
-  } catch (e){
-    a = 'foo';
-  }
-  return a;
-}
-
-returnInt3() {
-  var a = 42;
-  try {
-    a = 54;
-  } catch (e){
-    a = 'foo';
-  } finally {
-    a = 4;
-  }
-  return a;
-}
-
-returnDyn3() {
-  var a = 42;
-  try {
-    a = 54;
-  } on String catch (e) {
-    a = 2;
-  } on Object catch (e) {
-    a = 'foo';
-  }
-  return a;
-}
-
-returnInt4() {
-  var a = 42;
-  try {
-    a = 54;
-  } on String catch (e) {
-    a = 2;
-  } on Object catch (e) {
-    a = 32;
-  }
-  return a;
-}
-
-returnDyn4() {
-  var a = 42;
-  if (a == 54) {
-    try {
-      a = 'foo';
-    } catch (e) {
-    }
-  }
-  return a;
-}
-
-returnInt5() {
-  var a = 42;
-  if (a == 54) {
-    try {
-      a = 42;
-    } catch (e) {
-    }
-  }
-  return a;
-}
-
-returnDyn5() {
-  var a = 42;
-  if (a == 54) {
-    try {
-      a = 'foo';
-      print(a);
-      a = 42;
-    } catch (e) {
-    }
-  }
-  return a;
-}
-
-returnInt6() {
-  try {
-    throw 42;
-  } on int catch (e) {
-    return e;
-  }
-  return 42;
-}
-
-returnDyn6() {
-  try {
-    throw 42;
-  } catch (e) {
-    return e;
-  }
-}
-
-returnInt7() {
-  var a = 'foo';
-  try {
-    a = 42;
-    return a;
-  } catch (e) {
-  }
-  return 2;
-}
-
-main() {
-  returnInt1();
-  returnDyn1();
-  returnInt2();
-  returnDyn2();
-  returnInt3();
-  returnDyn3();
-  returnInt4();
-  returnDyn4();
-  returnInt5();
-  returnDyn5();
-  returnInt6();
-  returnDyn6();
-  returnInt7();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-
-    checkReturn(String name, type) {
-      MemberEntity element = findMember(closedWorld, name);
-      Expect.equals(type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
-    }
-
-    checkReturn('returnInt1', commonMasks.uint31Type);
-    checkReturn('returnInt2', commonMasks.uint31Type);
-    checkReturn('returnInt3', commonMasks.uint31Type);
-    checkReturn('returnInt4', commonMasks.uint31Type);
-    checkReturn('returnInt5', commonMasks.uint31Type);
-    checkReturn(
-        'returnInt6',
-        new TypeMask.nonNullSubtype(
-            closedWorld.commonElements.intClass, closedWorld));
-
-    var subclassOfInterceptor = interceptorOrComparable(closedWorld);
-
-    checkReturn('returnDyn1', subclassOfInterceptor);
-    checkReturn('returnDyn2', subclassOfInterceptor);
-    checkReturn('returnDyn3', subclassOfInterceptor);
-    checkReturn('returnDyn4', subclassOfInterceptor);
-    checkReturn('returnDyn5', subclassOfInterceptor);
-    checkReturn('returnDyn6', commonMasks.dynamicType);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
deleted file mode 100644
index ae5835a..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
+++ /dev/null
@@ -1,59 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-var a = '';
-class A {
-  operator+(other) => other;
-}
-
-foo() {
-  // The following '+' call will first say that it may call A::+,
-  // String::+, or int::+. After all methods have been analyzed, we know
-  // that a is of type String, and therefore, this method cannot call
-  // A::+. Therefore, the type of the parameter of A::+ will be the
-  // one given by the other calls.
-  return a + 'foo';
-}
-
-main() {
-  new A() + 42;
-  foo();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    checkReturnInClass(String className, String methodName, type) {
-      var element = findClassMember(closedWorld, className, methodName);
-      Expect.equals(type, typesInferrer.getReturnTypeOfMember(element));
-    }
-
-    checkReturnInClass(
-        'A', '+', typesInferrer.closedWorld.commonMasks.uint31Type);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/type_inference6_test.dart b/tests/compiler/dart2js/inference/type_inference6_test.dart
deleted file mode 100644
index 659e104..0000000
--- a/tests/compiler/dart2js/inference/type_inference6_test.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = r"""
-foo() {
-  var a = [1, 2, 3];
-  return a.first;
-}
-
-main() {
-  foo();
-}
-""";
-
-main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-    MemberEntity element = findMember(closedWorld, "foo");
-    var mask = typesInferrer.getReturnTypeOfMember(element);
-    Expect.equals(commonMasks.uint31Type, simplify(mask, closedWorld));
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/type_inference7_test.dart b/tests/compiler/dart2js/inference/type_inference7_test.dart
deleted file mode 100644
index fd12b55..0000000
--- a/tests/compiler/dart2js/inference/type_inference7_test.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-import '../compiler_helper.dart';
-import 'type_mask_test_helper.dart';
-import 'dart:async';
-
-const String TEST = r"""
-foo(x, [y]) => y;
-
-main() {
-  assert(foo('Hi', true), foo(true));
-  foo(1);
-}
-""";
-
-Future runTest() async {
-  Uri uri = new Uri(scheme: 'source');
-  {
-    // Assertions enabled:
-    var compiler = mockCompilerFor(TEST, uri, enableUserAssertions: true);
-    await compiler.run(uri);
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-    MethodElement foo = findElement(compiler, "foo");
-    // Return type is null|bool.
-    var mask = typesInferrer.getReturnTypeOfMember(foo);
-    Expect.isTrue(mask.isNullable);
-    Expect.equals(
-        commonMasks.boolType, simplify(mask.nonNullable(), closedWorld));
-    // First parameter is uint31|String|bool.
-    dynamic mask1 = typesInferrer.getTypeOfParameter(foo.parameters[0]);
-    Expect.isTrue(mask1.isUnion);
-    var expectedTypes = new Set.from(
-        [commonMasks.uint31Type, commonMasks.stringType, commonMasks.boolType]);
-    for (var typeMask in mask1.disjointMasks) {
-      Expect.isFalse(typeMask.isNullable);
-      var simpleType = simplify(typeMask, closedWorld);
-      Expect.isTrue(expectedTypes.remove(simpleType), "$simpleType");
-    }
-    Expect.isTrue(expectedTypes.isEmpty);
-    // Second parameter is bool or null.
-    var mask2 = typesInferrer.getTypeOfParameter(foo.parameters[1]);
-    Expect.isTrue(mask2.isNullable);
-    Expect.equals(
-        commonMasks.boolType, simplify(mask2.nonNullable(), closedWorld));
-  }
-
-  {
-    // Assertions disabled:
-    var compiler = mockCompilerFor(TEST, uri, enableUserAssertions: false);
-    await compiler.run(uri);
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-    MethodElement foo = findElement(compiler, "foo");
-    // Return type is null.
-    var mask = typesInferrer.getReturnTypeOfMember(foo);
-    Expect.isTrue(mask.isNullable);
-    Expect.isTrue(mask.nonNullable().isEmpty);
-    // First parameter is uint31.
-    var mask1 = typesInferrer.getTypeOfParameter(foo.parameters[0]);
-    Expect.isFalse(mask1.isNullable);
-    Expect.equals(commonMasks.uint31Type, simplify(mask1, closedWorld));
-    // Second parameter is null.
-    var mask2 = typesInferrer.getTypeOfParameter(foo.parameters[1]);
-    Expect.isTrue(mask2.isNullable);
-    Expect.isTrue(simplify(mask2.nonNullable(), closedWorld).isEmpty);
-  }
-}
-
-main() {
-  asyncStart();
-  runTest().then((_) {
-    // Make sure that the type is still correct when we do a second compilation.
-    return runTest();
-  }).whenComplete(asyncEnd);
-}
diff --git a/tests/compiler/dart2js/inference/type_inference8_test.dart b/tests/compiler/dart2js/inference/type_inference8_test.dart
index 18c4aa7..9c37e97 100644
--- a/tests/compiler/dart2js/inference/type_inference8_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference8_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// TODO(johnniwinther): Move this test to the codegen folder.
 
 import "package:async_helper/async_helper.dart";
 import "package:compiler/src/constants/values.dart";
diff --git a/tests/compiler/dart2js/inference/type_inference_switch_test.dart b/tests/compiler/dart2js/inference/type_inference_switch_test.dart
deleted file mode 100644
index 9823a26..0000000
--- a/tests/compiler/dart2js/inference/type_inference_switch_test.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST1 = r"""
-foo(int x) {
-  var a = "one";
-  switch (x) {
-    case 1:
-      a = "two";
-      break;
-    case 2:
-      break;
-  }
-
-  return a;
-}
-
-main() {
-  foo(new DateTime.now().millisecondsSinceEpoch);
-}
-""";
-
-const String TEST2 = r"""
-foo(int x) {
-  var a;
-  switch (x) {
-    case 1:
-      a = "two";
-      break;
-    case 2:
-      break;
-  }
-
-  return a;
-}
-
-main() {
-  foo(new DateTime.now().millisecondsSinceEpoch);
-}
-""";
-
-const String TEST3 = r"""
-foo(int x) {
-  var a;
-  switch (x) {
-    case 1:
-      a = 1;
-    case 2:  // illegal fall through
-      a = 2;
-      break;
-  }
-
-  return a;
-}
-
-main() {
-  foo(new DateTime.now().millisecondsSinceEpoch);
-}
-""";
-
-const String TEST4 = r"""
-foo(int x) {
-  var a;
-  switch (x) {
-    case 1:
-      a = 1;
-    case 2:  // illegal fall through
-      a = 2;
-      break;
-    default:
-      a = 0;
-  }
-
-  return a;
-}
-
-main() {
-  foo(new DateTime.now().millisecondsSinceEpoch);
-}
-""";
-
-const String TEST5 = r"""
-foo(int x) {
-  var a;
-  switch (x) {
-    case 1:
-      a = 1;
-      break;
-    case 2:
-      a = 2;
-      break;
-    default:
-  }
-
-  return a;
-}
-
-main() {
-  foo(new DateTime.now().millisecondsSinceEpoch);
-}
-""";
-
-const String TEST6 = r"""
-foo(int x) {
-  var a;
-  do {  // add extra locals scope
-    switch (x) {
-      case 1:
-        a = 1;
-        break;
-      case 2:
-        a = 2;
-        break;
-    }
-  } while (false);
-
-  return a;
-}
-
-main() {
-  foo(new DateTime.now().millisecondsSinceEpoch);
-}
-""";
-
-main() {
-  runTests({bool useKernel}) async {
-    runTest(String test, checker) async {
-      CompilationResult result = await runCompiler(
-          memorySourceFiles: {'main.dart': test},
-          options: useKernel ? [Flags.useKernel] : []);
-      Expect.isTrue(result.isSuccess);
-      var compiler = result.compiler;
-      var typesInferrer = compiler.globalInference.typesInferrerInternal;
-      var closedWorld = typesInferrer.closedWorld;
-      var commonMasks = closedWorld.commonMasks;
-
-      checkTypeOf(String name, TypeMask type) {
-        FunctionEntity element = findMember(closedWorld, name);
-        var mask = typesInferrer.getReturnTypeOfMember(element);
-        Expect.equals(type, simplify(mask, closedWorld));
-      }
-
-      checker(commonMasks, checkTypeOf);
-    }
-
-    await runTest(TEST1, (t, c) => c("foo", t.stringType));
-    await runTest(TEST2, (t, c) => c("foo", t.stringType.nullable()));
-    await runTest(TEST3, (t, c) => c("foo", t.uint31Type.nullable()));
-    await runTest(TEST4, (t, c) => c("foo", t.uint31Type));
-    await runTest(TEST5, (t, c) => c("foo", t.uint31Type.nullable()));
-    await runTest(TEST6, (t, c) => c("foo", t.uint31Type.nullable()));
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index aeb1207..d3a6f0b 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -28,7 +28,7 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(
         dataDir, computeMemberAstInlinings, computeMemberIrInlinings,
-        args: args, skipforAst: ['external.dart'], skipForKernel: []);
+        args: args, skipForAst: ['external.dart'], skipForKernel: []);
   });
 }
 
diff --git a/tests/compiler/dart2js/mirrors/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
index f82d85d..6aa3ca8 100644
--- a/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
@@ -70,7 +70,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 477;
+    int expectedMethodCount = 478;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart b/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
index 7abf3d1..e289b2c 100644
--- a/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
@@ -37,6 +37,30 @@
   "third_party/pkg/collection/lib/src/functions.dart": const [
     "Method type variables are treated as `dynamic` in `as` expressions."
   ],
+  "pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/front_end/lib/src/fasta/kernel/body_builder.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/visitor.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/text/ast_to_text.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/target/vm.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/clone.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/binary/ast_to_binary.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/binary/ast_from_binary.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/old_frontend/analyze_test_test.dart b/tests/compiler/dart2js/old_frontend/analyze_test_test.dart
index 3cf3f42..573c380 100644
--- a/tests/compiler/dart2js/old_frontend/analyze_test_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_test_test.dart
@@ -23,6 +23,30 @@
   "pkg/kernel/lib/transformations/closure/": const [
     "Duplicated library name 'kernel.transformations.closure.converter'",
   ],
+  "pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/front_end/lib/src/fasta/kernel/body_builder.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/visitor.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/text/ast_to_text.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/target/vm.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/clone.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/binary/ast_to_binary.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/binary/ast_from_binary.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
 };
 
 const List<String> SKIP_LIST = const <String>[
diff --git a/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
index f0e1c8d..6ee6b5c 100644
--- a/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
@@ -58,6 +58,30 @@
   "pkg/kernel/lib/transformations/closure/": const [
     "Duplicated library name 'kernel.transformations.closure.converter'",
   ],
+  "pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/front_end/lib/src/fasta/kernel/body_builder.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/visitor.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/text/ast_to_text.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/target/vm.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/clone.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/binary/ast_to_binary.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
+  "pkg/kernel/lib/binary/ast_from_binary.dart": const [
+    "Library 'dart:core' doesn't export a 'MapEntry' declaration.",
+  ],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/old_frontend/method_type_variable_test.dart b/tests/compiler/dart2js/old_frontend/method_type_variable_test.dart
new file mode 100644
index 0000000..b0c0d4e
--- /dev/null
+++ b/tests/compiler/dart2js/old_frontend/method_type_variable_test.dart
@@ -0,0 +1,141 @@
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/diagnostics/messages.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+runTest(String code,
+    {List<MessageKind> expectedWarnings: const <MessageKind>[],
+    List<MessageKind> expectedHints: const <MessageKind>[]}) async {
+  print('--test--------------------------------------------------------------');
+  print(code);
+  DiagnosticCollector collector = new DiagnosticCollector();
+  await runCompiler(
+      memorySourceFiles: {'main.dart': code}, diagnosticHandler: collector);
+  Expect.equals(0, collector.errors.length, "Unexpected errors.");
+  Expect.listEquals(
+      expectedWarnings,
+      collector.warnings.map((m) => m.messageKind).toList(),
+      "Unexpected warnings.");
+  Expect.listEquals(expectedHints,
+      collector.hints.map((m) => m.messageKind).toList(), "Unexpected hints.");
+}
+
+class Test {
+  final String code;
+  final List<MessageKind> warnings;
+  final List<MessageKind> hints;
+
+  const Test(this.code,
+      {this.warnings: const <MessageKind>[],
+      this.hints: const <MessageKind>[]});
+}
+
+const List<Test> tests = const <Test>[
+  /// Is-test on method type variable in unused static method.
+  const Test('''
+method<T>(T t) => t is T;
+main() {}
+'''),
+
+  /// Is-test on method type variable in used static method.
+  const Test('''
+method<T>(T t) => t is T;
+main() => method<int>(0);
+''', warnings: const <MessageKind>[
+    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
+  ]),
+
+  /// Is-test on method type variable in unused instance method.
+  const Test('''
+class C {
+  method<T>(T t) => t is T;
+}
+main() => new C();
+'''),
+
+  /// Is-test on method type variable in used instance method.
+  const Test('''
+class C {
+  method<T>(T t) => t is T;
+}
+main() => new C().method<int>(0);
+''', warnings: const <MessageKind>[
+    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
+  ]),
+
+  /// As-cast on method type variable in unused static method.
+  const Test('''
+method<T>(T t) => t as T;
+main() {}
+'''),
+
+  /// As-cast on method type variable in used static method.
+  const Test('''
+method<T>(T t) => t as T;
+main() => method<int>(0);
+''', hints: const <MessageKind>[
+    MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC
+  ]),
+
+  /// As-cast on method type variable in unused instance method.
+  const Test('''
+class C {
+  method<T>(T t) => t as T;
+}
+main() => new C();
+'''),
+
+  /// As-cast on method type variable in used instance method.
+  const Test('''
+class C {
+  method<T>(T t) => t as T;
+}
+main() => new C().method<int>(0);
+''', hints: const <MessageKind>[
+    MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC
+  ]),
+
+  /// Method type variable literal in unused static method.
+  const Test('''
+method<T>() => T;
+main() {}
+'''),
+
+  /// Method type variable literal in used static method.
+  const Test('''
+method<T>() => T;
+main() => method<int>();
+''', warnings: const <MessageKind>[
+    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
+  ]),
+
+  /// Method type variable literal in unused instance method.
+  const Test('''
+class C {
+  method<T>() => T;
+}
+main() => new C();
+'''),
+
+  /// Method type variable literal in used instance method.
+  const Test('''
+class C {
+  method<T>() => T;
+}
+main() => new C().method<int>();
+''', warnings: const <MessageKind>[
+    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
+  ]),
+];
+
+main() {
+  asyncTest(() async {
+    for (Test test in tests) {
+      await runTest(
+        test.code,
+        expectedWarnings: test.warnings,
+        expectedHints: test.hints,
+      );
+    }
+  });
+}
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index 408d0ae..6baf68e 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -2,15 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti*/
+/*class: A:needsArgs*/
 class A<T> {
-  /*element: A.m:*/
   m() {
-    return /*methodNeedsRti*/ (T t) {};
+    return /*needsSignature*/ (T t) {};
+  }
+
+  /*element: A.f:*/
+  f() {
+    return /**/ (int t) {};
   }
 }
 
-/*element: main:*/
 main() {
   new A<int>().m() is void Function(int);
+  new A<int>().f() is void Function(int);
 }
diff --git a/tests/compiler/dart2js/rti/data/dependency.dart b/tests/compiler/dart2js/rti/data/dependency.dart
index 5c0a3e1..8dac33c 100644
--- a/tests/compiler/dart2js/rti/data/dependency.dart
+++ b/tests/compiler/dart2js/rti/data/dependency.dart
@@ -2,16 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:*/
 class A<T> {
-  /*element: A.m:*/
   m() => new B<T>();
 }
 
-/*element: B.:deps=[A]*/
+/*class: B:deps=[A]*/
 class B<T> {}
 
-/*element: main:*/
 main() {
   new A<int>().m();
 }
diff --git a/tests/compiler/dart2js/rti/data/direct.dart b/tests/compiler/dart2js/rti/data/direct.dart
index 6b322cf..e88b892b 100644
--- a/tests/compiler/dart2js/rti/data/direct.dart
+++ b/tests/compiler/dart2js/rti/data/direct.dart
@@ -2,10 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti,explicit=[A<int>]*/
+/*class: A:needsArgs,explicit=[A<int>]*/
 class A<T> {}
 
-/*element: main:*/
 main() {
   new A<int>() is A<int>;
 }
diff --git a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
new file mode 100644
index 0000000..5bb8df4
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: A:explicit=[B<A>]*/
+class A {}
+
+/*class: B:needsArgs,deps=[C],explicit=[B<A>]*/
+class B<T> {}
+
+/*class: C:needsArgs*/
+class C<T> {
+  method() => new B<T>();
+}
+
+main() {
+  new C<A>().method() is B<A>;
+}
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is.dart b/tests/compiler/dart2js/rti/data/generic_class_is.dart
new file mode 100644
index 0000000..f65ea09
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_class_is.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.
+
+/*class: A:implicit=[A]*/
+class A {}
+
+/*class: B:needsArgs,test,explicit=[B.T]*/
+class B<T> {
+  method(T t) => t is T;
+}
+
+main() {
+  new B<A>().method(new A());
+}
diff --git a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
new file mode 100644
index 0000000..55c0236
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.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.
+
+/*class: A:explicit=[B<A>]*/
+class A {}
+
+/*class: B:needsArgs,deps=[closure],explicit=[B<A>]*/
+class B<T> {}
+
+main() {
+  /*kernel.needsArgs*/ closure<T>() => new B<T>();
+
+  closure<A>() is B<A>;
+}
diff --git a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
new file mode 100644
index 0000000..9cf55c6
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
@@ -0,0 +1,17 @@
+// 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:explicit=[B<A>]*/
+class A {}
+
+/*class: B:needsArgs,deps=[method],explicit=[B<A>]*/
+class B<T> {}
+
+/*ast.element: method:*/
+/*kernel.element: method:needsArgs*/
+method<T>() => new B<T>();
+
+main() {
+  method<A>() is B<A>;
+}
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is.dart b/tests/compiler/dart2js/rti/data/generic_method_is.dart
new file mode 100644
index 0000000..7195656
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_method_is.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*ast.element: method:explicit=[method.T]*/
+/*kernel.element: method:needsArgs,explicit=[method.T]*/
+method<T>(T t) => t is T;
+
+main() {
+  method<int>(0);
+}
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable.dart b/tests/compiler/dart2js/rti/data/is_type_variable.dart
index ba682ba..f83c4b1 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti,test,explicit=[A.T]*/
+/*class: A:needsArgs,test,explicit=[A.T]*/
 class A<T> {
-  /*element: A.m:*/
   m(T t) => t is T;
 }
 
-/*element: main:*/
 main() {
   new A<int>().m(0);
 }
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
index a4569b8..a8432a9 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
@@ -2,16 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:*/
 class A<T> {}
 
-/*element: B.:classNeedsRti,test,explicit=[B.T],implicit=[B.T]*/
+/*class: B:needsArgs,test,explicit=[B.T],implicit=[B.T]*/
 class B<T> extends A<T> {
-  /*element: B.m:*/
   m(T t) => t is T;
 }
 
-/*element: main:*/
 main() {
   new B<int>().m(0);
 }
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
index c0d1f0a..83eec30 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
@@ -2,16 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:*/
 class A<T> {}
 
-/*element: B.:classNeedsRti,test,explicit=[B.T],implicit=[List<B.T>]*/
+/*class: B:needsArgs,test,explicit=[B.T],implicit=[List<B.T>]*/
 class B<T> extends A<List<T>> {
-  /*element: B.m:*/
   m(T t) => t is T;
 }
 
-/*element: main:*/
 main() {
   new B<int>().m(0);
 }
diff --git a/tests/compiler/dart2js/rti/data/subclass.dart b/tests/compiler/dart2js/rti/data/subclass.dart
index 8bb50fb..cd04108 100644
--- a/tests/compiler/dart2js/rti/data/subclass.dart
+++ b/tests/compiler/dart2js/rti/data/subclass.dart
@@ -2,13 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti,explicit=[A<int>]*/
+/*class: A:needsArgs,explicit=[A<int>]*/
 class A<T> {}
 
-/*element: B.:classNeedsRti*/
+/*class: B:needsArgs*/
 class B<T> extends A<T> {}
 
-/*element: main:*/
 main() {
   new B<int>() is A<int>;
 }
diff --git a/tests/compiler/dart2js/rti/data/subclass_fixed.dart b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
index b0c5b26..42badb5 100644
--- a/tests/compiler/dart2js/rti/data/subclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti,explicit=[A<int>]*/
+/*class: A:needsArgs,explicit=[A<int>]*/
 class A<T> {}
 
-/*element: B.:*/
 class B extends A<int> {}
 
-/*element: main:*/
 main() {
   new B() is A<int>;
 }
diff --git a/tests/compiler/dart2js/rti/data/superclass.dart b/tests/compiler/dart2js/rti/data/superclass.dart
index 49e1430..86e533c 100644
--- a/tests/compiler/dart2js/rti/data/superclass.dart
+++ b/tests/compiler/dart2js/rti/data/superclass.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:*/
 class A<T> {}
 
-/*element: B.:classNeedsRti,explicit=[B<int>]*/
+/*class: B:needsArgs,explicit=[B<int>]*/
 class B<T> extends A<T> {}
 
-/*element: main:*/
 main() {
   new B<int>() is B<int>;
 }
diff --git a/tests/compiler/dart2js/rti/data/tear_off.dart b/tests/compiler/dart2js/rti/data/tear_off.dart
index d3175aa..6aec20e 100644
--- a/tests/compiler/dart2js/rti/data/tear_off.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off.dart
@@ -2,13 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti*/
+/*class: A:needsArgs*/
 class A<T> {
-  /*element: A.m:methodNeedsRti*/
+  /*element: A.m:needsSignature*/
   void m(T t) {}
+
+  /*element: A.f:*/
+  void f(int t) {}
 }
 
-/*element: main:*/
 main() {
   new A<int>().m is void Function(int);
+  new A<int>().f is void Function(int);
 }
diff --git a/tests/compiler/dart2js/rti/data/type_literal.dart b/tests/compiler/dart2js/rti/data/type_literal.dart
index 58cf810..5e09e8a 100644
--- a/tests/compiler/dart2js/rti/data/type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: A.:classNeedsRti,exp*/
+/*class: A:needsArgs,exp*/
 class A<T> {
-  /*element: A.m:*/
   m() => T;
 }
 
-/*element: main:*/
 main() {
   new A<int>().m();
 }
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
new file mode 100644
index 0000000..5ca31af
--- /dev/null
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/runtime_types.dart';
+import 'package:compiler/src/js_emitter/model.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+const String code = '''
+class A {}
+class B<T> {}
+class C<T> implements B<T> {}
+class D<T> implements B<int> {}
+class E<T> extends B<T> {}
+class F<T> extends B<List<T>>{}
+
+main() {
+  new A();
+  new C();
+  new D();
+  new E();
+  new F();
+}
+''';
+
+const Map<String, List<String>> expectedIsChecksMap =
+    const <String, List<String>>{
+  'A': const <String>[],
+  'B': const <String>[],
+  'C': const <String>[r'$isB'],
+  'D': const <String>[r'$isB', r'$asB'],
+  'E': const <String>[],
+  'F': const <String>[r'$asB'],
+};
+
+main() {
+  asyncTest(() async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': code},
+        options: [Flags.disableRtiOptimization, Flags.disableInlining]);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+    RuntimeTypesNeed rtiNeed = closedWorld.rtiNeed;
+    ProgramLookup programLookup =
+        new ProgramLookup(compiler.backend.emitter.emitter.programForTesting);
+
+    void processMember(MemberEntity element) {
+      if (element is FunctionEntity) {
+        Expect.isTrue(rtiNeed.methodNeedsTypeArguments(element));
+        Expect.isTrue(rtiNeed.methodNeedsSignature(element));
+      }
+    }
+
+    void processClass(ClassEntity element) {
+      Expect.isTrue(closedWorld.rtiNeed.classNeedsTypeArguments(element));
+      elementEnvironment.forEachConstructor(element, processMember);
+      elementEnvironment.forEachLocalClassMember(element, processMember);
+
+      List<String> expectedIsChecks = expectedIsChecksMap[element.name];
+      if (expectedIsChecks != null) {
+        Class cls = programLookup.getClass(element);
+        List<String> isChecks = cls.isChecks.map((m) => m.name.key).toList();
+        Expect.setEquals(
+            expectedIsChecks,
+            isChecks,
+            "Unexpected is checks for $element: "
+            "Expected $expectedIsChecks, actual $isChecks.");
+      }
+    }
+
+    LibraryEntity library = elementEnvironment.mainLibrary;
+    elementEnvironment.forEachClass(library, processClass);
+    elementEnvironment.forEachLibraryMember(library, processMember);
+  });
+}
+
+class ProgramLookup {
+  final Program program;
+
+  ProgramLookup(this.program);
+
+  Map<LibraryEntity, Library> libraryMap;
+  Map<ClassEntity, Class> classMap = <ClassEntity, Class>{};
+
+  Library getLibrary(LibraryEntity element) {
+    if (libraryMap == null) {
+      libraryMap = <LibraryEntity, Library>{};
+      for (Fragment fragment in program.fragments) {
+        for (Library library in fragment.libraries) {
+          assert(!libraryMap.containsKey(library.element));
+          libraryMap[library.element] = library;
+        }
+      }
+    }
+    return libraryMap[element];
+  }
+
+  Class getClass(ClassEntity element) {
+    Class cls = classMap[element];
+    if (cls == null) {
+      Library library = getLibrary(element.library);
+      for (Class cls in library.classes) {
+        assert(!classMap.containsKey(cls.element));
+        classMap[cls.element] = cls;
+      }
+      cls = classMap[element];
+    }
+    return cls;
+  }
+}
diff --git a/tests/compiler/dart2js/rti/rti_need_test.dart b/tests/compiler/dart2js/rti/rti_need_test.dart
index 4586b74..ba20c2f 100644
--- a/tests/compiler/dart2js/rti/rti_need_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test.dart
@@ -5,6 +5,7 @@
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.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';
@@ -25,25 +26,39 @@
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeAstRtiNeed, computeKernelRtiNeed,
-        args: args);
+    await checkTests(
+        dataDir, computeAstRtiMemberNeed, computeKernelRtiMemberNeed,
+        computeClassDataFromAst: computeAstRtiClassNeed,
+        computeClassDataFromKernel: computeKernelRtiClassNeed,
+        args: args,
+        options: [Flags.strongMode]);
   });
 }
 
 /// Compute RTI need data for [_member] as a [MemberElement].
 ///
 /// Fills [actualMap] with the data.
-void computeAstRtiNeed(
+void computeAstRtiMemberNeed(
     Compiler compiler, MemberEntity _member, Map<Id, ActualData> actualMap,
-    {bool verbose: false, bool forBackend}) {
+    {bool verbose: false}) {
   MemberElement member = _member;
   ResolvedAst resolvedAst = member.resolvedAst;
   compiler.reporter.withCurrentElement(member.implementation, () {
-    new RtiNeedAstComputer(compiler.reporter, actualMap, resolvedAst, compiler)
+    new RtiMemberNeedAstComputer(
+            compiler.reporter, actualMap, resolvedAst, compiler)
         .run();
   });
 }
 
+/// Compute RTI need data for [cls] from the old frontend.
+///
+/// Fills [actualMap] with the data.
+void computeAstRtiClassNeed(
+    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  new RtiClassNeedAstComputer(compiler, actualMap).computeClassValue(cls);
+}
+
 abstract class ComputeValueMixin<T> {
   Compiler get compiler;
 
@@ -53,9 +68,68 @@
       compiler.frontendStrategy.runtimeTypesNeedBuilderForTesting;
   RuntimeTypesNeed get rtiNeed => compiler.backendClosedWorldForTesting.rtiNeed;
 
+  ClassEntity getFrontendClass(ClassEntity cls);
   MemberEntity getFrontendMember(MemberEntity member);
   Local getFrontendClosure(MemberEntity member);
 
+  String findChecks(StringBuffer sb, String comma, String prefix, Entity entity,
+      Set<DartType> checks) {
+    Set<DartType> types = new Set<DartType>();
+    FindTypeVisitor finder = new FindTypeVisitor(entity);
+    for (DartType type in checks) {
+      if (type.accept(finder, null)) {
+        types.add(type);
+      }
+    }
+    List<String> list = types.map((t) => t.toString()).toList()..sort();
+    if (list.isNotEmpty) {
+      sb.write('${comma}$prefix=[${list.join('')}]');
+      comma = ',';
+    }
+    return comma;
+  }
+
+  String findDependencies(StringBuffer sb, String comma, Entity entity) {
+    Iterable<String> dependencies;
+    if (rtiNeedBuilder.typeArgumentDependencies.containsKey(entity)) {
+      dependencies = rtiNeedBuilder.typeArgumentDependencies[entity]
+          .map((d) => d.name)
+          .toList()
+            ..sort();
+    }
+    if (dependencies != null && dependencies.isNotEmpty) {
+      sb.write('${comma}deps=[${dependencies.join(',')}]');
+      comma = ',';
+    }
+    return comma;
+  }
+
+  String getClassValue(ClassEntity backendClass) {
+    StringBuffer sb = new StringBuffer();
+    String comma = '';
+
+    if (rtiNeed.classNeedsTypeArguments(backendClass)) {
+      sb.write('${comma}needsArgs');
+      comma = ',';
+    }
+    ClassEntity frontendClass = getFrontendClass(backendClass);
+    comma = findDependencies(sb, comma, frontendClass);
+    if (rtiNeedBuilder.classesUsingTypeVariableExpression
+        .contains(frontendClass)) {
+      sb.write('${comma}exp');
+      comma = ',';
+    }
+    if (rtiNeedBuilder.classesUsingTypeVariableTests.contains(frontendClass)) {
+      sb.write('${comma}test');
+      comma = ',';
+    }
+    comma = findChecks(
+        sb, comma, 'explicit', frontendClass, rtiNeedBuilder.isChecks);
+    comma = findChecks(
+        sb, comma, 'implicit', frontendClass, rtiNeedBuilder.implicitIsChecks);
+    return sb.toString();
+  }
+
   String getMemberValue(MemberEntity backendMember) {
     MemberEntity frontendMember = getFrontendMember(backendMember);
     Local frontendClosure = getFrontendClosure(backendMember);
@@ -63,65 +137,25 @@
     StringBuffer sb = new StringBuffer();
     String comma = '';
 
-    void findChecks(String prefix, Entity entity, Set<DartType> checks) {
-      Set<DartType> types = new Set<DartType>();
-      FindTypeVisitor finder = new FindTypeVisitor(entity);
-      for (DartType type in checks) {
-        if (type.accept(finder, null)) {
-          types.add(type);
-        }
-      }
-      List<String> list = types.map((t) => t.toString()).toList()..sort();
-      if (list.isNotEmpty) {
-        sb.write('${comma}$prefix=[${list.join('')}]');
-        comma = ',';
-      }
-    }
-
-    if (backendMember is ConstructorEntity &&
-        backendMember.isGenerativeConstructor) {
-      ClassEntity backendClass = backendMember.enclosingClass;
-      if (rtiNeed.classNeedsRti(backendClass)) {
-        sb.write('${comma}classNeedsRti');
-        comma = ',';
-      }
-      ClassEntity frontendClass = frontendMember?.enclosingClass;
-      Iterable<String> dependencies;
-      if (rtiNeedBuilder.rtiDependencies.containsKey(frontendClass)) {
-        dependencies = rtiNeedBuilder.rtiDependencies[frontendClass]
-            .map((d) => d.name)
-            .toList()
-              ..sort();
-      }
-      if (dependencies != null && dependencies.isNotEmpty) {
-        sb.write('${comma}deps=[${dependencies.join(',')}]');
-        comma = ',';
-      }
-      if (rtiNeedBuilder.classesUsingTypeVariableExpression
-          .contains(frontendClass)) {
-        sb.write('${comma}exp');
-        comma = ',';
-      }
-      if (rtiNeedBuilder.classesUsingTypeVariableTests
-          .contains(frontendClass)) {
-        sb.write('${comma}test');
-        comma = ',';
-      }
-      findChecks('explicit', frontendClass, rtiNeedBuilder.isChecks);
-      findChecks('implicit', frontendClass, rtiNeedBuilder.implicitIsChecks);
-    }
     if (backendMember is FunctionEntity) {
-      if (rtiNeed.methodNeedsRti(backendMember)) {
-        sb.write('${comma}methodNeedsRti');
+      if (rtiNeed.methodNeedsTypeArguments(backendMember)) {
+        sb.write('${comma}needsArgs');
+        comma = ',';
+      }
+      if (rtiNeed.methodNeedsSignature(backendMember)) {
+        sb.write('${comma}needsSignature');
         comma = ',';
       }
       if (frontendClosure != null &&
-          rtiNeed.localFunctionNeedsRti(frontendClosure)) {
-        sb.write('${comma}methodNeedsRti');
+          rtiNeed.localFunctionNeedsSignature(frontendClosure)) {
+        sb.write('${comma}needsSignature');
         comma = ',';
       }
-      findChecks('explicit', frontendMember, rtiNeedBuilder.isChecks);
-      findChecks('implicit', frontendMember, rtiNeedBuilder.implicitIsChecks);
+      comma = findDependencies(sb, comma, frontendMember);
+      comma = findChecks(
+          sb, comma, 'explicit', frontendMember, rtiNeedBuilder.isChecks);
+      comma = findChecks(sb, comma, 'implicit', frontendMember,
+          rtiNeedBuilder.implicitIsChecks);
     }
     return sb.toString();
   }
@@ -167,14 +201,11 @@
   }
 }
 
-/// AST visitor for computing inlining data for a member.
-class RtiNeedAstComputer extends AstDataExtractor
-    with ComputeValueMixin<ast.Node> {
-  final Compiler compiler;
-
-  RtiNeedAstComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
-      ResolvedAst resolvedAst, this.compiler)
-      : super(reporter, actualMap, resolvedAst);
+abstract class AstMixin implements ComputeValueMixin<ast.Node> {
+  @override
+  ClassEntity getFrontendClass(ClassEntity cls) {
+    return cls;
+  }
 
   @override
   MemberEntity getFrontendMember(MemberEntity member) {
@@ -186,6 +217,31 @@
     if (member is SynthesizedCallMethodElementX) return member.expression;
     return null;
   }
+}
+
+class RtiClassNeedAstComputer extends DataRegistry
+    with ComputeValueMixin<ast.Node>, AstMixin {
+  final Compiler compiler;
+  final Map<Id, ActualData> actualMap;
+
+  RtiClassNeedAstComputer(this.compiler, this.actualMap);
+
+  DiagnosticReporter get reporter => compiler.reporter;
+
+  void computeClassValue(covariant ClassElement cls) {
+    Id id = new ClassId(cls.name);
+    registerValue(cls.sourcePosition, id, getClassValue(cls), cls);
+  }
+}
+
+/// AST visitor for computing inlining data for a member.
+class RtiMemberNeedAstComputer extends AstDataExtractor
+    with ComputeValueMixin<ast.Node>, AstMixin {
+  final Compiler compiler;
+
+  RtiMemberNeedAstComputer(DiagnosticReporter reporter,
+      Map<Id, ActualData> actualMap, ResolvedAst resolvedAst, this.compiler)
+      : super(reporter, actualMap, resolvedAst);
 
   @override
   String computeElementValue(Id id, AstElement element) {
@@ -212,13 +268,13 @@
 /// Compute RTI need data for [member] from the new frontend.
 ///
 /// Fills [actualMap] with the data.
-void computeKernelRtiNeed(
+void computeKernelRtiMemberNeed(
     Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false, bool forBackend}) {
+    {bool verbose: false}) {
   KernelBackendStrategy backendStrategy = compiler.backendStrategy;
   KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
   MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new RtiNeedIrComputer(
+  new RtiMemberNeedIrComputer(
           compiler.reporter,
           actualMap,
           elementMap,
@@ -228,22 +284,19 @@
       .run(definition.node);
 }
 
-/// AST visitor for computing inference data for a member.
-class RtiNeedIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
-  final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
-  final Compiler compiler;
+/// Compute RTI need data for [cls] from the new frontend.
+///
+/// Fills [actualMap] with the data.
+void computeKernelRtiClassNeed(
+    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+  new RtiClassNeedIrComputer(compiler, elementMap, actualMap)
+      .computeClassValue(cls);
+}
 
-  RtiNeedIrComputer(
-      DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
-      this._elementMap,
-      MemberEntity member,
-      this.compiler,
-      this._closureDataLookup)
-      : super(reporter, actualMap);
-
+abstract class IrMixin implements ComputeValueMixin<ir.Node> {
   @override
   MemberEntity getFrontendMember(MemberEntity backendMember) {
     ElementEnvironment elementEnvironment = compiler
@@ -269,7 +322,52 @@
   }
 
   @override
+  ClassEntity getFrontendClass(ClassEntity backendClass) {
+    if (backendClass.isClosure) return null;
+    ElementEnvironment elementEnvironment = compiler
+        .resolutionWorldBuilder.closedWorldForTesting.elementEnvironment;
+    LibraryEntity frontendLibrary =
+        elementEnvironment.lookupLibrary(backendClass.library.canonicalUri);
+    return elementEnvironment.lookupClass(frontendLibrary, backendClass.name);
+  }
+
+  @override
   Local getFrontendClosure(MemberEntity member) => null;
+}
+
+class RtiClassNeedIrComputer extends DataRegistry
+    with ComputeValueMixin<ir.Node>, IrMixin {
+  final Compiler compiler;
+  final KernelToElementMapForBuilding _elementMap;
+  final Map<Id, ActualData> actualMap;
+
+  RtiClassNeedIrComputer(this.compiler, this._elementMap, this.actualMap);
+
+  DiagnosticReporter get reporter => compiler.reporter;
+
+  void computeClassValue(ClassEntity cls) {
+    Id id = new ClassId(cls.name);
+    ir.TreeNode node = _elementMap.getClassDefinition(cls).node;
+    registerValue(
+        computeSourceSpanFromTreeNode(node), id, getClassValue(cls), cls);
+  }
+}
+
+/// AST visitor for computing inference data for a member.
+class RtiMemberNeedIrComputer extends IrDataExtractor
+    with ComputeValueMixin<ir.Node>, IrMixin {
+  final KernelToElementMapForBuilding _elementMap;
+  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final Compiler compiler;
+
+  RtiMemberNeedIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this.compiler,
+      this._closureDataLookup)
+      : super(reporter, actualMap);
 
   @override
   String computeMemberValue(Id id, ir.Member node) {
diff --git a/tests/compiler/dart2js_extra/switch_test.dart b/tests/compiler/dart2js_extra/switch_test.dart
index 09efd47..03a55e1 100644
--- a/tests/compiler/dart2js_extra/switch_test.dart
+++ b/tests/compiler/dart2js_extra/switch_test.dart
@@ -69,6 +69,37 @@
   }
 }
 
+// Tests that switch cases work when there is a case that calls a function
+// that always throws, and there is no break in the switch statement.
+switcher4(val) {
+  switch (val) {
+    case 1:
+      return 100;
+    case 2:
+      _throw();
+    default:
+      return 300;
+  }
+}
+
+_throw() {
+  throw 'exception';
+}
+
+// Tests that we generate a break after the last case if it isn't default.
+switcher5(val) {
+  var x = 0;
+  switch(val) {
+    case 1:
+      return 100;
+    case 2:
+      return 200;
+    case 3:
+      x = 300;
+  }
+  return x;
+}
+
 incrementX() {
   x++;
 }
@@ -96,8 +127,15 @@
   Expect.equals(200, switcher2(4));
   Expect.equals(200, switcher2(5));
 
+
   switcher3(1);
   Expect.equals(1, x);
 
+  Expect.equals(100, switcher4(1));
+
+  Expect.equals(100, switcher5(1));
+  Expect.equals(200, switcher5(2));
+  Expect.equals(300, switcher5(3));
+
   badswitches(42);
 }
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index cc9dfb9..80c5092 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -59,6 +59,8 @@
 from_environment_const_type_undefined_test/13: MissingCompileTimeError
 from_environment_const_type_undefined_test/14: MissingCompileTimeError
 from_environment_const_type_undefined_test/16: MissingCompileTimeError
+int_modulo_arith_test/modPow: RuntimeError
+int_modulo_arith_test/none: RuntimeError
 int_parse_radix_bad_handler_test: MissingCompileTimeError
 map_test: Crash # crash in front_end.
 string_from_environment3_test/01: MissingCompileTimeError
@@ -213,7 +215,7 @@
 [ $compiler == dart2js && !$browser ]
 package_resource_test: RuntimeError # Issue 26842
 
-[ $compiler == dart2js && $checked && $dart2js_with_kernel ]
+[ $compiler == dart2js && $checked && $dart2js_with_kernel && $strong ]
 apply3_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 from_environment_const_type_test/02: MissingCompileTimeError
@@ -248,11 +250,14 @@
 symbol_test/02: MissingCompileTimeError
 symbol_test/03: MissingCompileTimeError
 
+[ $compiler == dart2js && $checked && $dart2js_with_kernel && !$strong ]
+*: SkipByDesign
+
 [ $compiler == dart2js && $dart2js_with_kernel ]
 int_from_environment_test: Pass # Issue 31762
 int_parse_radix_test/none: Pass # Issue 31762
 
-[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
+[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup && $strong ]
 iterable_return_type_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
 iterable_to_list_test/01: RuntimeError
@@ -268,8 +273,12 @@
 symbol_test/03: MissingCompileTimeError
 uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
 
-[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
+[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup && !$strong ]
+*: SkipByDesign
+
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked && $strong ]
 apply3_test: RuntimeError
+cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 iterable_return_type_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
@@ -277,6 +286,8 @@
 list_test/01: Crash # Unsupported operation: Unsupported type parameter type node T.
 list_test/none: Crash # Unsupported operation: Unsupported type parameter type node T.
 map_test: Crash # type 'DillClassBuilder' is not a subtype of type 'SourceClassBuilder' of 'named' where
+null_nosuchmethod_test/01: RuntimeError
+null_nosuchmethod_test/none: RuntimeError
 symbol_reserved_word_test/03: RuntimeError
 symbol_reserved_word_test/04: MissingCompileTimeError
 symbol_reserved_word_test/05: MissingCompileTimeError
@@ -285,8 +296,12 @@
 symbol_test/02: MissingCompileTimeError
 symbol_test/03: MissingCompileTimeError
 
-[ $compiler == dart2js && $dart2js_with_kernel && $minified ]
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked && !$strong ]
+*: SkipByDesign
+
+[ $compiler == dart2js && $dart2js_with_kernel && $minified && $strong ]
 apply3_test: RuntimeError
+cast_test: RuntimeError
 dynamic_nosuchmethod_test: RuntimeError
 error_stack_trace1_test: RuntimeError
 hash_set_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(_CustomHashSet.#x), local(_CustomHashSet.#)) for j:closure_call(_CustomHashSet__CustomHashSet_closure.call).
@@ -299,6 +314,8 @@
 list_test/01: Crash # Unsupported operation: Unsupported type parameter type node T.
 list_test/none: Crash # Unsupported operation: Unsupported type parameter type node T.
 map_test: Crash # tests/map_test.dart:870:7: Internal problem: Unhandled Null in installDefaultConstructor.
+null_nosuchmethod_test/01: RuntimeError
+null_nosuchmethod_test/none: RuntimeError
 splay_tree_from_iterable_test: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(SplayTreeMap.#v), local(SplayTreeMap.#)) for j:closure_call(SplayTreeMap_SplayTreeMap_closure.call).
 splay_tree_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(SplayTreeSet.#v), local(SplayTreeSet.#)) for j:closure_call(SplayTreeSet_SplayTreeSet_closure.call).
 splay_tree_test/02: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(SplayTreeSet.#v), local(SplayTreeSet.#)) for j:closure_call(SplayTreeSet_SplayTreeSet_closure.call).
@@ -313,6 +330,9 @@
 symbol_test/03: MissingCompileTimeError
 uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
 
+[ $compiler == dart2js && $dart2js_with_kernel && $minified && !$strong ]
+*: SkipByDesign
+
 [ $compiler == dart2js && !$dart2js_with_kernel ]
 iterable_return_type_test/01: RuntimeError # Issue 20085
 iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
@@ -331,18 +351,16 @@
 date_time10_test: RuntimeError # Issue 29921
 error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
 hash_set_test/01: RuntimeError # Issue 29921
-int_from_environment_test: RuntimeError # Issue 31763
 int_modulo_arith_test/none: RuntimeError # Issue 29921
 int_parse_radix_test/01: RuntimeError # Issue 29921
 int_parse_radix_test/02: RuntimeError # Issue 29921
-int_parse_radix_test/badTypes: RuntimeError # Issue 31763
-int_parse_radix_test/none: RuntimeError # Issue 31763
 int_parse_with_limited_ints_test: Skip # dartdevc doesn't know about --limit-ints-to-64-bits
 integer_arith_vm_test/modPow: RuntimeError # Issue 30170
 integer_parsed_arith_vm_test: RuntimeError # Issue 29921
 integer_to_radix_string_test: RuntimeError # Issue 29921
 integer_to_string_test/01: RuntimeError # Issue 29921
 iterable_fold_test/02: RuntimeError # different type inference problem
+iterable_reduce_test/01: RuntimeError
 iterable_reduce_test/none: RuntimeError
 iterable_return_type_test/02: RuntimeError # Issue 29921
 iterable_to_list_test/*: RuntimeError
@@ -435,8 +453,6 @@
 apply3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 bool_from_environment2_test/03: MissingCompileTimeError
 compare_to2_test: RuntimeError
-int_modulo_arith_test/modPow: CompileTimeError # Issue 31402 (Assert statement)
-int_modulo_arith_test/none: CompileTimeError # Issue 31402 (Assert statement)
 iterable_empty_test: RuntimeError
 iterable_fold_test/02: RuntimeError
 iterable_reduce_test/01: CompileTimeError # Issue 31533
@@ -468,8 +484,6 @@
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 bool_from_environment2_test/03: MissingCompileTimeError
 compare_to2_test: RuntimeError
-int_modulo_arith_test/modPow: CompileTimeError # Issue 31402 (Assert statement)
-int_modulo_arith_test/none: CompileTimeError # Issue 31402 (Assert statement)
 iterable_empty_test: RuntimeError
 iterable_fold_test/02: RuntimeError
 iterable_reduce_test/01: CompileTimeError # Issue 31533
@@ -657,7 +671,6 @@
 double_parse_test/03: Skip # Temporarily disable the following tests until we figure out why they started failing.
 double_parse_test/04: Skip # Temporarily disable the following tests until we figure out why they started failing.
 double_parse_test/none: Skip # Temporarily disable the following tests until we figure out why they started failing.
-iterable_reduce_test/01: CompileTimeError
 
 [ $compiler == dartkp || $compiler == precompiler ]
 apply3_test: SkipByDesign
diff --git a/tests/corelib_2/int_modulo_arith_test.dart b/tests/corelib_2/int_modulo_arith_test.dart
index 6923cb7..4b347cc 100644
--- a/tests/corelib_2/int_modulo_arith_test.dart
+++ b/tests/corelib_2/int_modulo_arith_test.dart
@@ -25,7 +25,7 @@
       }
 
       return slowModPow(x, e, m) == expectedResult;
-    });
+    }());
     var result = x.modPow(e, m);
     Expect.equals(expectedResult, result, "$x.modPow($e, $m)");
   }
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 99e1c9f..2b1df1d 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -104,7 +104,6 @@
 isolate_stress_test: Pass, Slow # Issue 10697
 
 [ $compiler == dartk && $strong ]
-isolate_complex_messages_test: Crash
 issue_21398_parent_isolate1_test: RuntimeError
 issue_22778_test: Crash
 message3_test/byteBuffer: RuntimeError
@@ -121,7 +120,7 @@
 spawn_uri_nested_vm_test: CompileTimeError
 static_function_test: CompileTimeError
 typed_message_test: CompileTimeError
-unresolved_ports_test: Pass, Timeout
+unresolved_ports_test: CompileTimeError, Pass, Timeout # Fails to compile on opt counter builder (#31838)
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index 095c6fa..c90979a 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -1,7 +1,6 @@
 # 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.
-unsorted/invocation_errors_test: RuntimeError
 
 [ $compiler == dart2js ]
 unsorted/invocation_errors_test: Pass
@@ -11,6 +10,9 @@
 unsorted/super_initializer_test: Skip
 unsorted/super_mixin_test: CompileTimeError
 
+[ !$strong ]
+unsorted/invocation_errors_test: RuntimeError
+
 [ $builder_tag == strong && $compiler == dart2analyzer ]
 *: Skip # Issue 28649
 
@@ -19,14 +21,16 @@
 unsorted/super_mixin_test: CompileTimeError
 
 [ $compiler == dartk && $strong ]
+unsorted/invocation_errors_test: CompileTimeError
 unsorted/loop_test: RuntimeError
 unsorted/nsm_dispatcher_test: CompileTimeError
+unsorted/super_mixin_test: CompileTimeError
 unsorted/types_test: RuntimeError
 
 [ $runtime == dart_precompiled && $minified ]
 unsorted/symbol_literal_test: Skip # Expects unobfuscated Symbol.toString.
 
-[ $runtime == dart_precompiled || $runtime == vm || ($compiler == dart2js && $dart2js_with_kernel) ]
+[ $runtime == dart_precompiled || $runtime == vm || $compiler == dart2js && $dart2js_with_kernel ]
 unsorted/loop_test: CompileTimeError # Large integer literal
 unsorted/simple_literal_test: CompileTimeError # Large integer literal
 
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index a2d26dd..9458eea 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -72,7 +72,6 @@
 assertion_initializer_test: CompileTimeError
 assign_static_type_test/01: Fail
 assign_static_type_test/02: MissingCompileTimeError
-async_await_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 async_return_types_test/nestedFuture: Fail # Issue 26429
 async_return_types_test/wrongTypeParameter: Fail # Issue 26429
 async_star_cancel_while_paused_test: RuntimeError
@@ -212,7 +211,6 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 generic_methods_type_expression_test/01: RuntimeError
 generic_methods_type_expression_test/03: RuntimeError
 generic_methods_type_expression_test/none: RuntimeError
@@ -222,7 +220,6 @@
 getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError
 if_null_assignment_behavior_test/14: RuntimeError
-infinite_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 infinity_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 integer_division_by_zero_test: RuntimeError
@@ -376,7 +373,6 @@
 named_constructor_test/01: MissingRuntimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError
-nested_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 no_main_test/01: CompileTimeError
 null_test/02: MissingCompileTimeError
 null_test/03: MissingCompileTimeError
@@ -515,7 +511,6 @@
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
-async_await_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 async_star_cancel_while_paused_test: RuntimeError
 bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
 bad_override_test/03: MissingCompileTimeError
@@ -616,7 +611,6 @@
 getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError
 if_null_assignment_behavior_test/14: RuntimeError
-infinite_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 infinity_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 integer_division_by_zero_test: RuntimeError
@@ -768,7 +762,6 @@
 named_parameters_type_test/02: MissingRuntimeError
 named_parameters_type_test/03: MissingRuntimeError
 nan_identical_test: RuntimeError
-nested_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 no_main_test/01: CompileTimeError
 no_such_method_test: RuntimeError
 null_test/02: MissingCompileTimeError
@@ -832,7 +825,6 @@
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
-async_await_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/locals_handler.dart': Failed assertion: line 296 pos 12: 'local != null': is not true.
 async_star_cancel_while_paused_test: RuntimeError
 async_test/setter1: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
@@ -937,7 +929,6 @@
 getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError
 if_null_assignment_behavior_test/14: RuntimeError
-infinite_switch_label_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/locals_handler.dart': Failed assertion: line 296 pos 12: 'local != null': is not true.
 infinity_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 integer_division_by_zero_test: RuntimeError
@@ -1086,7 +1077,6 @@
 named_parameters_type_test/02: MissingRuntimeError
 named_parameters_type_test/03: MissingRuntimeError
 nan_identical_test: RuntimeError
-nested_switch_label_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/locals_handler.dart': Failed assertion: line 296 pos 12: 'local != null': is not true.
 no_main_test/01: CompileTimeError
 null_test/02: MissingCompileTimeError
 null_test/03: MissingCompileTimeError
@@ -1156,7 +1146,6 @@
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
-async_await_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 async_star_cancel_while_paused_test: RuntimeError
 bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
 bad_override_test/03: MissingCompileTimeError
@@ -1264,7 +1253,6 @@
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
 generic_closure_test: RuntimeError
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 generic_methods_type_expression_test/01: RuntimeError
 generic_methods_type_expression_test/03: RuntimeError
 generic_methods_type_expression_test/none: RuntimeError
@@ -1275,7 +1263,6 @@
 getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError
 if_null_assignment_behavior_test/14: RuntimeError
-infinite_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 infinity_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 integer_division_by_zero_test: RuntimeError
@@ -1425,7 +1412,6 @@
 named_parameters_type_test/02: MissingRuntimeError
 named_parameters_type_test/03: MissingRuntimeError
 nan_identical_test: RuntimeError
-nested_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 no_main_test/01: CompileTimeError
 null_test/02: MissingCompileTimeError
 null_test/03: MissingCompileTimeError
diff --git a/tests/language_2/assert_message_test.dart b/tests/language_2/assert_message_test.dart
index d2a8b2e..5b7debb 100644
--- a/tests/language_2/assert_message_test.dart
+++ b/tests/language_2/assert_message_test.dart
@@ -17,7 +17,6 @@
 
   // Basics.
   assert(true, "");
-  assert(() => true, "");
 
   int x = null;
   // Successful asserts won't execute message.
diff --git a/tests/language_2/assertion_test.dart b/tests/language_2/assertion_test.dart
index 3470f09..bad4bbd 100644
--- a/tests/language_2/assertion_test.dart
+++ b/tests/language_2/assertion_test.dart
@@ -31,16 +31,6 @@
   return a ? true : false;
 }
 
-testClosure(bool f()) {
-  int i = 0;
-  try {
-    assert(f);
-  } on AssertionError {
-    i = 1;
-  }
-  return i;
-}
-
 testBoolean(bool value) {
   int i = 0;
   try {
@@ -84,13 +74,10 @@
   Expect.equals(1, testBoolean(null));
   Expect.equals(1, testDynamic(null));
   Expect.equals(1, testDynamic(42));
-  Expect.equals(1, testClosure(() => true));
   Expect.equals(1, testDynamic(() => true));
-  Expect.equals(1, testClosure(() => false));
   Expect.equals(1, testDynamic(() => false));
   Expect.equals(1, testDynamic(() => 42));
   Expect.equals(1, testDynamic(() => null));
-  Expect.equals(1, testClosure(() => null));
 
   Expect.equals(1234, testMessage(false, 1234).message);
   Expect.equals('hi', testMessage(false, 'hi').message);
diff --git a/tests/language_2/issue31596_test.dart b/tests/language_2/issue31596_test.dart
new file mode 100644
index 0000000..0309256
--- /dev/null
+++ b/tests/language_2/issue31596_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {}
+
+class B extends A {}
+
+class B2 extends A {}
+
+class C {
+  void f(B x, B y) {}
+}
+
+abstract class I {
+  void f(covariant A x, B y);
+}
+
+// This class contains a forwarding stub for f to allow it to satisfy the
+// interface I, while still ensuring that the x argument is type checked before
+// C.f is executed.
+//
+// For purposes of static type checking, the interface of the class D is
+// considered to contain a method f with signature (A, B) -> void.  For purposes
+// of runtime behavior, a tearoff of D.f is considered to have the reified
+// runtime type (Object, B) -> void.
+class D extends C implements I {}
+
+main() {
+  var d = new D();
+  I i = d;
+  A a = new A();
+  B b = new B();
+  B2 b2 = null;
+  d.f(b2, b); // Ok since B2 assignable to A
+  i.f(b2, b); // Ok since B2 assignable to A
+  void Function(Object, B) g = d.f; // Ok; D.f reified as (Object, B) -> void
+  Expect.throwsTypeError(() {
+    d.f(a, b);
+  });
+  Expect.throwsTypeError(() {
+    i.f(a, b);
+  });
+}
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 1c6d1db..b7c2b77 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -1027,12 +1027,7 @@
 assertion_initializer_const_function_test/01: MissingStaticWarning
 assertion_initializer_test: CompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
-bug31436_test: CompileTimeError
 cascaded_forwarding_stubs_test: CompileTimeError
-combiner_type_lookup_indexed_test: CompileTimeError # Issue #31484
-combiner_type_lookup_instance_test: CompileTimeError # Issue #31484
-combiner_type_lookup_static_test: CompileTimeError # Issue #31484
-combiner_type_lookup_top_level_test: CompileTimeError # Issue #31484
 config_import_corelib_test: CompileTimeError
 const_types_test/07: MissingCompileTimeError # Incorrectly allows using type parameter in const expression.
 const_types_test/08: MissingCompileTimeError # Incorrectly allows using type parameter in const expression.
@@ -1050,12 +1045,12 @@
 generic_tearoff_test: CompileTimeError
 generic_test: CompileTimeError
 generics_test: CompileTimeError
-implicit_downcast_during_function_literal_arrow_test: CompileTimeError # Issue #31436
 import_core_prefix_test: CompileTimeError # "dynamic" should be defined in core.
 instantiate_type_variable_test/01: CompileTimeError
 int64_literal_test/03: MissingCompileTimeError # http://dartbug.com/31479
 int64_literal_test/30: MissingCompileTimeError # http://dartbug.com/31479
 interceptor6_test: CompileTimeError
+issue31596_test: CompileTimeError
 malformed2_test: Pass, MissingCompileTimeError # Issue 31056.
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
@@ -1246,10 +1241,6 @@
 class_literal_test/24: MissingCompileTimeError
 class_literal_test/25: MissingCompileTimeError
 closure_type_test: Pass
-combiner_type_lookup_indexed_test: StaticWarning # Issue #31484
-combiner_type_lookup_instance_test: StaticWarning # Issue #31484
-combiner_type_lookup_static_test: StaticWarning # Issue #31484
-combiner_type_lookup_top_level_test: StaticWarning # Issue #31484
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
 conditional_method_invocation_test/05: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 3268b3d..a8e5484 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -225,7 +225,6 @@
 generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_closure_test: RuntimeError
 generic_methods_dynamic_test/01: MissingCompileTimeError
 generic_methods_dynamic_test/02: MissingRuntimeError
 generic_methods_dynamic_test/03: MissingCompileTimeError
@@ -239,7 +238,6 @@
 generic_methods_overriding_test/03: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_reuse_type_variables_test: RuntimeError
-generic_methods_shadowing_test: RuntimeError
 generic_methods_simple_as_expression_test/02: MissingRuntimeError
 generic_methods_simple_is_expression_test: RuntimeError
 generic_methods_tearoff_specialization_test: RuntimeError
@@ -786,6 +784,9 @@
 field_override_optimization_test: RuntimeError
 field_type_check2_test/01: MissingRuntimeError
 
+[ $compiler == dart2js && $runtime == d8 && $dart2js_with_kernel ]
+assertion_test: RuntimeError
+
 [ $compiler == dart2js && $runtime == drt && $checked && !$dart2js_with_kernel ]
 regress_30339_test: RuntimeError # Issue 30393
 
@@ -1081,7 +1082,11 @@
 [ $compiler == dart2js && $checked ]
 covariant_subtyping_test: CompileTimeError
 
-[ $compiler == dart2js && $checked && $dart2js_with_kernel ]
+[ $compiler == dart2js && $checked && $dart2js_with_kernel && $minified && $strong ]
+inline_super_field_test: Crash
+typedef_is_test: Crash
+
+[ $compiler == dart2js && $checked && $dart2js_with_kernel && $strong ]
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -1199,7 +1204,7 @@
 covariance_type_parameter_test/02: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariance_type_parameter_test/03: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariant_override/runtime_check_test: RuntimeError
-covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
+covariant_subtyping_test: CompileTimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
 deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
@@ -1259,18 +1264,14 @@
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_typedef_test/01: RuntimeError
 generic_instanceof_test: RuntimeError
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
-generic_methods_closure_test: Crash # Unsupported operation: Unsupported type parameter type node S.
-generic_methods_shadowing_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_typedef_test: Crash # Unsupported operation: Unsupported type parameter type node S.
+generic_typedef_test: RuntimeError
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError
 implicit_downcast_during_assert_initializer_test: RuntimeError
-infinite_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 infinity_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 instanceof2_test: RuntimeError
@@ -1394,7 +1395,6 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
-nested_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 no_main_test/01: CompileTimeError
 not_enough_positional_arguments_test/00: MissingCompileTimeError
 not_enough_positional_arguments_test/01: MissingCompileTimeError
@@ -1463,7 +1463,7 @@
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
-tearoff_dynamic_test: Crash # Unsupported operation: Unsupported type parameter type node T.
+tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError
 try_catch_test/01: MissingCompileTimeError
 type_check_const_function_typedef2_test: MissingCompileTimeError
@@ -1472,9 +1472,8 @@
 type_parameter_test/09: Crash # Internal Error: Unexpected type variable in static context.
 type_variable_scope_test/03: Crash # Internal Error: Unexpected type variable in static context.
 
-[ $compiler == dart2js && $checked && $dart2js_with_kernel && $minified ]
-inline_super_field_test: Crash
-typedef_is_test: Crash
+[ $compiler == dart2js && $checked && $dart2js_with_kernel && !$strong ]
+*: SkipByDesign
 
 [ $compiler == dart2js && $checked && !$dart2js_with_kernel ]
 async_return_types_test/nestedFuture: Fail # Issue 26429
@@ -1559,6 +1558,7 @@
 implicit_downcast_during_super_method_invocation_test: RuntimeError
 implicit_downcast_during_variable_declaration_test: RuntimeError
 implicit_downcast_during_while_statement_test: RuntimeError
+issue31596_test: RuntimeError
 
 [ $compiler == dart2js && !$checked && !$dart2js_with_kernel ]
 bool_check_test: RuntimeError # Issue 29647
@@ -1580,6 +1580,7 @@
 forwarding_stub_tearoff_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
 generic_test: RuntimeError, OK
+issue31596_test: RuntimeError
 list_literal1_test/01: MissingCompileTimeError
 
 [ $compiler == dart2js && !$checked && !$dart2js_with_kernel && $minified ]
@@ -1641,7 +1642,7 @@
 type_inference_circularity_test: MissingCompileTimeError
 type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 
-[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
+[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup && $strong ]
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
@@ -1852,8 +1853,6 @@
 generic_instanceof_test: RuntimeError
 generic_list_checked_test: RuntimeError
 generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
-generic_methods_closure_test: Crash # Unsupported operation: Unsupported type parameter type node S.
-generic_methods_shadowing_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_test: RuntimeError
 generic_typedef_test: Crash # Unsupported operation: Unsupported type parameter type node S.
@@ -1866,7 +1865,6 @@
 identical_closure2_test: RuntimeError
 if_null_precedence_test/none: RuntimeError
 inferrer_synthesized_constructor_test: RuntimeError
-infinite_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 infinity_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 instanceof2_test: RuntimeError
@@ -1992,7 +1990,6 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
-nested_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 no_main_test/01: CompileTimeError
 no_such_method_test: RuntimeError
 not_enough_positional_arguments_test/00: MissingCompileTimeError
@@ -2067,7 +2064,10 @@
 type_literal_test: RuntimeError
 typevariable_substitution2_test/02: RuntimeError
 
-[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
+[ $compiler == dart2js && $dart2js_with_kernel && $fast_startup && !$strong ]
+*: SkipByDesign
+
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked && $strong ]
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -2087,11 +2087,81 @@
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
+class_literal_static_test/01: MissingCompileTimeError
+class_literal_static_test/02: MissingCompileTimeError
+class_literal_static_test/03: MissingCompileTimeError
+class_literal_static_test/04: MissingCompileTimeError
+class_literal_static_test/05: MissingCompileTimeError
+class_literal_static_test/06: MissingCompileTimeError
+class_literal_static_test/07: MissingCompileTimeError
+class_literal_static_test/08: MissingCompileTimeError
+class_literal_static_test/09: MissingCompileTimeError
+class_literal_static_test/10: MissingCompileTimeError
+class_literal_static_test/11: MissingCompileTimeError
+class_literal_static_test/12: MissingCompileTimeError
+class_literal_static_test/13: MissingCompileTimeError
+class_literal_static_test/14: MissingCompileTimeError
+class_literal_static_test/15: MissingCompileTimeError
+class_literal_static_test/16: MissingCompileTimeError
+class_literal_static_test/17: MissingCompileTimeError
+class_literal_static_test/18: MissingCompileTimeError
+class_literal_static_test/19: MissingCompileTimeError
+class_literal_static_test/20: MissingCompileTimeError
+class_literal_static_test/21: MissingCompileTimeError
+class_literal_static_test/22: MissingCompileTimeError
+class_literal_static_test/23: MissingCompileTimeError
+class_literal_static_test/24: MissingCompileTimeError
+class_literal_static_test/25: MissingCompileTimeError
+class_override_test: MissingCompileTimeError
+closure_internals_test/01: MissingCompileTimeError
+closure_internals_test/02: MissingCompileTimeError
+closure_internals_test/03: MissingCompileTimeError
 closure_invoked_through_interface_target_field_test: MissingCompileTimeError
 closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 closure_self_reference_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/nodes.dart': Failed assertion: line 641 pos 12: 'isClosed()': is not true.
+closure_type_test: RuntimeError
+compile_time_constant_k_test/01: MissingCompileTimeError
+compile_time_constant_k_test/02: MissingCompileTimeError
+compile_time_constant_k_test/03: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
+compile_time_constant_static2_test/01: MissingCompileTimeError
+compile_time_constant_static2_test/02: MissingCompileTimeError
+compile_time_constant_static2_test/03: MissingCompileTimeError
+compile_time_constant_static2_test/04: MissingCompileTimeError
+compile_time_constant_static2_test/05: MissingCompileTimeError
+compile_time_constant_static2_test/06: MissingCompileTimeError
+compile_time_constant_static3_test/01: MissingCompileTimeError
+compile_time_constant_static3_test/02: MissingCompileTimeError
+compile_time_constant_static3_test/03: MissingCompileTimeError
+compile_time_constant_static3_test/04: MissingCompileTimeError
+compile_time_constant_static3_test/05: MissingCompileTimeError
+compile_time_constant_static3_test/06: MissingCompileTimeError
+compile_time_constant_static4_test/01: MissingCompileTimeError
+compile_time_constant_static4_test/02: MissingCompileTimeError
+compile_time_constant_static4_test/03: MissingCompileTimeError
+compile_time_constant_static5_test/03: MissingCompileTimeError
+compile_time_constant_static5_test/04: MissingCompileTimeError
+compile_time_constant_static5_test/05: MissingCompileTimeError
+compile_time_constant_static5_test/06: MissingCompileTimeError
+compile_time_constant_static5_test/07: MissingCompileTimeError
+compile_time_constant_static5_test/08: MissingCompileTimeError
+compile_time_constant_static5_test/09: MissingCompileTimeError
+compile_time_constant_static5_test/10: MissingCompileTimeError
+compile_time_constant_static5_test/12: MissingCompileTimeError
+compile_time_constant_static5_test/13: MissingCompileTimeError
+compile_time_constant_static5_test/14: MissingCompileTimeError
+compile_time_constant_static5_test/15: MissingCompileTimeError
+compile_time_constant_static5_test/17: MissingCompileTimeError
+compile_time_constant_static5_test/18: MissingCompileTimeError
+compile_time_constant_static5_test/19: MissingCompileTimeError
+compile_time_constant_static5_test/20: MissingCompileTimeError
+compile_time_constant_static5_test/22: MissingCompileTimeError
+compile_time_constant_static5_test/24: MissingCompileTimeError
+compile_time_constant_static5_test/25: MissingCompileTimeError
+compile_time_constant_static_test/01: MissingCompileTimeError
+compile_time_constant_static_test/02: MissingCompileTimeError
+compile_time_constant_static_test/03: MissingCompileTimeError
 conditional_import_string_test: RuntimeError
 conditional_import_test: RuntimeError
 conditional_method_invocation_test/05: MissingCompileTimeError
@@ -2186,10 +2256,11 @@
 covariant_subtyping_tearoff1_test: RuntimeError
 covariant_subtyping_tearoff2_test: RuntimeError
 covariant_subtyping_tearoff3_test: RuntimeError
-covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
+covariant_subtyping_test: CompileTimeError
 covariant_subtyping_unsafe_call1_test: RuntimeError
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
+crash_6725_test/01: MissingCompileTimeError
 cyclic_constructor_test/01: Crash # Issue 30856
 deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
@@ -2216,8 +2287,17 @@
 deferred_load_library_wrong_args_test/01: MissingRuntimeError
 deferred_not_loaded_check_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
-deferred_super_dependency_test/01: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
+deferred_super_dependency_test/01: MissingCompileTimeError
 double_int_to_string_test: RuntimeError
+double_to_string_as_exponential2_test/01: MissingCompileTimeError
+double_to_string_as_exponential2_test/02: MissingCompileTimeError
+double_to_string_as_exponential2_test/03: MissingCompileTimeError
+double_to_string_as_fixed2_test/01: MissingCompileTimeError
+double_to_string_as_fixed2_test/02: MissingCompileTimeError
+double_to_string_as_fixed2_test/03: MissingCompileTimeError
+double_to_string_as_precision2_test/01: MissingCompileTimeError
+double_to_string_as_precision2_test/02: MissingCompileTimeError
+double_to_string_as_precision2_test/03: MissingCompileTimeError
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -2279,16 +2359,13 @@
 generic_function_typedef_test/01: RuntimeError
 generic_instanceof_test: RuntimeError
 generic_list_checked_test: RuntimeError
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
-generic_methods_closure_test: Crash # Unsupported operation: Unsupported type parameter type node S.
 generic_methods_generic_function_parameter_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
-generic_methods_shadowing_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_methods_simple_as_expression_test/01: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 generic_methods_simple_as_expression_test/02: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 generic_methods_type_expression_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_test: RuntimeError
-generic_typedef_test: Crash # Unsupported operation: Unsupported type parameter type node S.
+generic_typedef_test: RuntimeError
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
@@ -2298,8 +2375,9 @@
 identical_closure2_test: RuntimeError
 if_null_precedence_test/none: RuntimeError
 inferrer_synthesized_constructor_test: RuntimeError
-infinite_switch_label_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/locals_handler.dart': Failed assertion: line 296 pos 12: 'local != null': is not true.
 infinity_test: RuntimeError
+initializing_formal_type_annotation_test/01: MissingCompileTimeError
+initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_creation_in_function_annotation_test: RuntimeError
 instanceof2_test: RuntimeError
 instanceof4_test/01: RuntimeError
@@ -2308,8 +2386,45 @@
 interface_test/00: Crash # 'package:front_end/src/fasta/kernel/body_builder.dart': Failed assertion: line 2218 pos 14: '!target.enclosingClass.isAbstract': is not true.
 internal_library_test/02: Crash # type 'DillLibraryBuilder' is not a subtype of type 'SourceLibraryBuilder<KernelTypeBuilder, Library>' of 'value' where
 invocation_mirror2_test: RuntimeError
+is_malformed_type_test/94: MissingCompileTimeError
+is_malformed_type_test/95: MissingCompileTimeError
+is_malformed_type_test/96: MissingCompileTimeError
+is_malformed_type_test/97: MissingCompileTimeError
+is_malformed_type_test/98: MissingCompileTimeError
+is_malformed_type_test/99: MissingCompileTimeError
+is_not_class2_test/01: MissingCompileTimeError
+isnot_malformed_type_test/01: MissingCompileTimeError
+issue11724_test/01: MissingCompileTimeError
+issue1363_test/01: MissingCompileTimeError
+issue15606_test/01: MissingCompileTimeError
+issue18628_1_test/01: MissingCompileTimeError
+issue18628_2_test/01: MissingCompileTimeError
 issue21079_test: RuntimeError
 issue23244_test: RuntimeError
+known_identifier_prefix_error_test/01: MissingCompileTimeError
+known_identifier_prefix_error_test/02: MissingCompileTimeError
+known_identifier_prefix_error_test/03: MissingCompileTimeError
+known_identifier_prefix_error_test/04: MissingCompileTimeError
+known_identifier_prefix_error_test/05: MissingCompileTimeError
+known_identifier_prefix_error_test/06: MissingCompileTimeError
+known_identifier_prefix_error_test/07: MissingCompileTimeError
+known_identifier_prefix_error_test/08: MissingCompileTimeError
+known_identifier_prefix_error_test/09: MissingCompileTimeError
+known_identifier_prefix_error_test/10: MissingCompileTimeError
+known_identifier_prefix_error_test/11: MissingCompileTimeError
+known_identifier_prefix_error_test/12: MissingCompileTimeError
+known_identifier_prefix_error_test/13: MissingCompileTimeError
+known_identifier_prefix_error_test/14: MissingCompileTimeError
+known_identifier_prefix_error_test/15: MissingCompileTimeError
+known_identifier_prefix_error_test/16: MissingCompileTimeError
+known_identifier_prefix_error_test/17: MissingCompileTimeError
+known_identifier_prefix_error_test/18: MissingCompileTimeError
+known_identifier_prefix_error_test/19: MissingCompileTimeError
+known_identifier_prefix_error_test/20: MissingCompileTimeError
+known_identifier_prefix_error_test/21: MissingCompileTimeError
+known_identifier_prefix_error_test/22: MissingCompileTimeError
+known_identifier_prefix_error_test/23: MissingCompileTimeError
+known_identifier_prefix_error_test/24: MissingCompileTimeError
 left_shift_test: RuntimeError
 library_env_test/has_mirror_support: RuntimeError
 list_literal1_test/01: MissingCompileTimeError
@@ -2323,6 +2438,19 @@
 list_literal_syntax_test/03: MissingCompileTimeError
 malformed2_test/00: MissingCompileTimeError
 many_generic_instanceof_test: RuntimeError
+map_literal11_test/none: MissingRuntimeError
+map_literal1_test/01: MissingCompileTimeError
+map_literal3_test/01: MissingCompileTimeError
+map_literal3_test/02: MissingCompileTimeError
+map_literal3_test/03: MissingCompileTimeError
+map_literal3_test/04: MissingCompileTimeError
+map_literal4_test/01: MissingCompileTimeError
+map_literal4_test/02: MissingCompileTimeError
+map_literal4_test/03: MissingCompileTimeError
+map_literal4_test/04: MissingCompileTimeError
+map_literal4_test/05: MissingCompileTimeError
+map_literal4_test/06: MissingCompileTimeError
+map_literal7_test: RuntimeError
 map_literal8_test: RuntimeError
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
@@ -2422,7 +2550,6 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
-nested_switch_label_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/locals_handler.dart': Failed assertion: line 296 pos 12: 'local != null': is not true.
 no_main_test/01: CompileTimeError
 not_enough_positional_arguments_test/00: MissingCompileTimeError
 not_enough_positional_arguments_test/01: MissingCompileTimeError
@@ -2435,9 +2562,16 @@
 null_test/03: MissingCompileTimeError
 null_test/mirrors: RuntimeError
 null_test/none: RuntimeError
+number_identifier_test/05: MissingCompileTimeError
+number_identifier_test/08: MissingCompileTimeError
+number_identifier_test/09: MissingCompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError
+on_catch_malformed_type_test: MissingCompileTimeError
+operator5_test: MissingCompileTimeError
+operator_equals_test: MissingCompileTimeError
 operator_test: Crash # 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart': Failed assertion: line 441 pos 16: 'identical(combiner.arguments.positional[0], rhs)': is not true.
+optimized_constant_array_string_access_test: MissingCompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -2456,7 +2590,11 @@
 private_super_constructor_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
+redirecting_factory_default_values_test/03: MissingCompileTimeError
+redirecting_factory_incompatible_signature_test/01: MissingCompileTimeError
+redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
+redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
@@ -2494,13 +2632,191 @@
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
-tearoff_dynamic_test: Crash # Unsupported operation: Unsupported type parameter type node T.
+tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError
 try_catch_test/01: MissingCompileTimeError
+type_literal_prefix_call_test/00: MissingCompileTimeError
 type_literal_test: RuntimeError
+type_parameter_test/01: MissingCompileTimeError
+type_parameter_test/02: MissingCompileTimeError
+type_parameter_test/03: MissingCompileTimeError
+type_parameter_test/04: MissingCompileTimeError
+type_parameter_test/05: MissingCompileTimeError
+type_parameter_test/06: MissingCompileTimeError
+type_parameter_test/07: MissingCompileTimeError
+type_parameter_test/08: MissingCompileTimeError
+type_parameter_test/09: MissingCompileTimeError
+type_promotion_assign_test/01: MissingCompileTimeError
+type_promotion_assign_test/02: MissingCompileTimeError
+type_promotion_assign_test/03: MissingCompileTimeError
+type_promotion_assign_test/04: MissingCompileTimeError
+type_promotion_closure_test/01: MissingCompileTimeError
+type_promotion_closure_test/02: MissingCompileTimeError
+type_promotion_closure_test/03: MissingCompileTimeError
+type_promotion_closure_test/04: MissingCompileTimeError
+type_promotion_closure_test/06: MissingCompileTimeError
+type_promotion_closure_test/07: MissingCompileTimeError
+type_promotion_closure_test/09: MissingCompileTimeError
+type_promotion_closure_test/10: MissingCompileTimeError
+type_promotion_closure_test/11: MissingCompileTimeError
+type_promotion_closure_test/12: MissingCompileTimeError
+type_promotion_closure_test/13: MissingCompileTimeError
+type_promotion_closure_test/14: MissingCompileTimeError
+type_promotion_closure_test/15: MissingCompileTimeError
+type_promotion_closure_test/16: MissingCompileTimeError
+type_promotion_local_test/01: MissingCompileTimeError
+type_promotion_local_test/02: MissingCompileTimeError
+type_promotion_local_test/03: MissingCompileTimeError
+type_promotion_local_test/04: MissingCompileTimeError
+type_promotion_local_test/05: MissingCompileTimeError
+type_promotion_local_test/06: MissingCompileTimeError
+type_promotion_local_test/07: MissingCompileTimeError
+type_promotion_local_test/08: MissingCompileTimeError
+type_promotion_local_test/09: MissingCompileTimeError
+type_promotion_local_test/10: MissingCompileTimeError
+type_promotion_local_test/11: MissingCompileTimeError
+type_promotion_local_test/12: MissingCompileTimeError
+type_promotion_local_test/13: MissingCompileTimeError
+type_promotion_local_test/14: MissingCompileTimeError
+type_promotion_local_test/15: MissingCompileTimeError
+type_promotion_local_test/16: MissingCompileTimeError
+type_promotion_local_test/17: MissingCompileTimeError
+type_promotion_local_test/18: MissingCompileTimeError
+type_promotion_local_test/19: MissingCompileTimeError
+type_promotion_local_test/20: MissingCompileTimeError
+type_promotion_local_test/21: MissingCompileTimeError
+type_promotion_local_test/22: MissingCompileTimeError
+type_promotion_local_test/23: MissingCompileTimeError
+type_promotion_local_test/24: MissingCompileTimeError
+type_promotion_local_test/25: MissingCompileTimeError
+type_promotion_local_test/26: MissingCompileTimeError
+type_promotion_local_test/27: MissingCompileTimeError
+type_promotion_local_test/28: MissingCompileTimeError
+type_promotion_local_test/29: MissingCompileTimeError
+type_promotion_local_test/30: MissingCompileTimeError
+type_promotion_local_test/31: MissingCompileTimeError
+type_promotion_local_test/32: MissingCompileTimeError
+type_promotion_local_test/33: MissingCompileTimeError
+type_promotion_local_test/34: MissingCompileTimeError
+type_promotion_local_test/35: MissingCompileTimeError
+type_promotion_local_test/36: MissingCompileTimeError
+type_promotion_local_test/37: MissingCompileTimeError
+type_promotion_local_test/38: MissingCompileTimeError
+type_promotion_local_test/39: MissingCompileTimeError
+type_promotion_local_test/40: MissingCompileTimeError
+type_promotion_local_test/41: MissingCompileTimeError
+type_promotion_logical_and_test/01: MissingCompileTimeError
+type_promotion_logical_and_test/02: MissingCompileTimeError
+type_promotion_logical_and_test/03: MissingCompileTimeError
+type_promotion_more_specific_test/02: MissingCompileTimeError
+type_promotion_more_specific_test/06: MissingCompileTimeError
+type_promotion_more_specific_test/07: MissingCompileTimeError
+type_promotion_more_specific_test/09: MissingCompileTimeError
+type_promotion_multiple_test/01: MissingCompileTimeError
+type_promotion_multiple_test/02: MissingCompileTimeError
+type_promotion_multiple_test/03: MissingCompileTimeError
+type_promotion_multiple_test/04: MissingCompileTimeError
+type_promotion_multiple_test/05: MissingCompileTimeError
+type_promotion_multiple_test/06: MissingCompileTimeError
+type_promotion_multiple_test/07: MissingCompileTimeError
+type_promotion_multiple_test/08: MissingCompileTimeError
+type_promotion_multiple_test/09: MissingCompileTimeError
+type_promotion_multiple_test/10: MissingCompileTimeError
+type_promotion_multiple_test/11: MissingCompileTimeError
+type_promotion_multiple_test/12: MissingCompileTimeError
+type_promotion_multiple_test/13: MissingCompileTimeError
+type_promotion_multiple_test/14: MissingCompileTimeError
+type_promotion_multiple_test/15: MissingCompileTimeError
+type_promotion_multiple_test/16: MissingCompileTimeError
+type_promotion_multiple_test/17: MissingCompileTimeError
+type_promotion_multiple_test/18: MissingCompileTimeError
+type_promotion_multiple_test/19: MissingCompileTimeError
+type_promotion_multiple_test/20: MissingCompileTimeError
+type_promotion_multiple_test/21: MissingCompileTimeError
+type_promotion_multiple_test/22: MissingCompileTimeError
 typevariable_substitution2_test/02: RuntimeError
+void_type_callbacks_test/none: CompileTimeError
+void_type_function_types_test/none: CompileTimeError
+void_type_override_test/none: CompileTimeError
+void_type_usage_test/call_as: CompileTimeError
+void_type_usage_test/call_for: CompileTimeError
+void_type_usage_test/call_stmt: CompileTimeError
+void_type_usage_test/conditional2_argument: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_conditional: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_dynamic_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_for: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_literal_list_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_literal_map_value_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_literal_map_value_init2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_parens: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_return: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_stmt: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_throw: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2_void_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2do_while: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2for_in: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional2while: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_argument: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_conditional: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_dynamic_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_for: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_literal_list_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_literal_map_value_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_literal_map_value_init2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_parens: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_return: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_stmt: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_throw: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional3_void_init: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional_do_while: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional_for_in: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/conditional_while: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/field_assign: CompileTimeError
+void_type_usage_test/field_assign2: CompileTimeError
+void_type_usage_test/final_local_as: CompileTimeError
+void_type_usage_test/final_local_for: CompileTimeError
+void_type_usage_test/final_local_stmt: CompileTimeError
+void_type_usage_test/global_as: CompileTimeError
+void_type_usage_test/global_for: CompileTimeError
+void_type_usage_test/global_for_in2: CompileTimeError
+void_type_usage_test/global_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/global_stmt: CompileTimeError
+void_type_usage_test/instance2_as: CompileTimeError
+void_type_usage_test/instance2_for: CompileTimeError
+void_type_usage_test/instance2_for_in3: CompileTimeError
+void_type_usage_test/instance2_stmt: CompileTimeError
+void_type_usage_test/instance3_as: CompileTimeError
+void_type_usage_test/instance3_for: CompileTimeError
+void_type_usage_test/instance3_for_in3: CompileTimeError
+void_type_usage_test/instance3_stmt: CompileTimeError
+void_type_usage_test/instance_as: CompileTimeError
+void_type_usage_test/instance_for: CompileTimeError
+void_type_usage_test/instance_stmt: CompileTimeError
+void_type_usage_test/local_as: CompileTimeError
+void_type_usage_test/local_assign: CompileTimeError
+void_type_usage_test/local_for: CompileTimeError
+void_type_usage_test/local_for_in2: CompileTimeError
+void_type_usage_test/local_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/local_stmt: CompileTimeError
+void_type_usage_test/none: CompileTimeError
+void_type_usage_test/param_as: CompileTimeError
+void_type_usage_test/param_for: CompileTimeError
+void_type_usage_test/param_for_in2: CompileTimeError
+void_type_usage_test/param_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/param_stmt: CompileTimeError
+void_type_usage_test/paren_as: CompileTimeError
+void_type_usage_test/paren_for: CompileTimeError
+void_type_usage_test/paren_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
+void_type_usage_test/paren_stmt: CompileTimeError
+void_type_usage_test/setter_assign: CompileTimeError
+wrong_number_type_arguments_test/none: Pass
 
-[ $compiler == dart2js && $dart2js_with_kernel && $minified ]
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked && !$strong ]
+*: SkipByDesign
+
+[ $compiler == dart2js && $dart2js_with_kernel && $minified && $strong ]
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -2519,10 +2835,80 @@
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
+class_literal_static_test/01: MissingCompileTimeError
+class_literal_static_test/02: MissingCompileTimeError
+class_literal_static_test/03: MissingCompileTimeError
+class_literal_static_test/04: MissingCompileTimeError
+class_literal_static_test/05: MissingCompileTimeError
+class_literal_static_test/06: MissingCompileTimeError
+class_literal_static_test/07: MissingCompileTimeError
+class_literal_static_test/08: MissingCompileTimeError
+class_literal_static_test/09: MissingCompileTimeError
+class_literal_static_test/10: MissingCompileTimeError
+class_literal_static_test/11: MissingCompileTimeError
+class_literal_static_test/12: MissingCompileTimeError
+class_literal_static_test/13: MissingCompileTimeError
+class_literal_static_test/14: MissingCompileTimeError
+class_literal_static_test/15: MissingCompileTimeError
+class_literal_static_test/16: MissingCompileTimeError
+class_literal_static_test/17: MissingCompileTimeError
+class_literal_static_test/18: MissingCompileTimeError
+class_literal_static_test/19: MissingCompileTimeError
+class_literal_static_test/20: MissingCompileTimeError
+class_literal_static_test/21: MissingCompileTimeError
+class_literal_static_test/22: MissingCompileTimeError
+class_literal_static_test/23: MissingCompileTimeError
+class_literal_static_test/24: MissingCompileTimeError
+class_literal_static_test/25: MissingCompileTimeError
+class_override_test: MissingCompileTimeError
+closure_internals_test/01: MissingCompileTimeError
+closure_internals_test/02: MissingCompileTimeError
+closure_internals_test/03: MissingCompileTimeError
 closure_invoked_through_interface_target_field_test: MissingCompileTimeError
 closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
+closure_type_test: RuntimeError
+compile_time_constant_k_test/01: MissingCompileTimeError
+compile_time_constant_k_test/02: MissingCompileTimeError
+compile_time_constant_k_test/03: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
+compile_time_constant_static2_test/01: MissingCompileTimeError
+compile_time_constant_static2_test/02: MissingCompileTimeError
+compile_time_constant_static2_test/03: MissingCompileTimeError
+compile_time_constant_static2_test/04: MissingCompileTimeError
+compile_time_constant_static2_test/05: MissingCompileTimeError
+compile_time_constant_static2_test/06: MissingCompileTimeError
+compile_time_constant_static3_test/01: MissingCompileTimeError
+compile_time_constant_static3_test/02: MissingCompileTimeError
+compile_time_constant_static3_test/03: MissingCompileTimeError
+compile_time_constant_static3_test/04: MissingCompileTimeError
+compile_time_constant_static3_test/05: MissingCompileTimeError
+compile_time_constant_static3_test/06: MissingCompileTimeError
+compile_time_constant_static4_test/01: MissingCompileTimeError
+compile_time_constant_static4_test/02: MissingCompileTimeError
+compile_time_constant_static4_test/03: MissingCompileTimeError
+compile_time_constant_static5_test/03: MissingCompileTimeError
+compile_time_constant_static5_test/04: MissingCompileTimeError
+compile_time_constant_static5_test/05: MissingCompileTimeError
+compile_time_constant_static5_test/06: MissingCompileTimeError
+compile_time_constant_static5_test/07: MissingCompileTimeError
+compile_time_constant_static5_test/08: MissingCompileTimeError
+compile_time_constant_static5_test/09: MissingCompileTimeError
+compile_time_constant_static5_test/10: MissingCompileTimeError
+compile_time_constant_static5_test/12: MissingCompileTimeError
+compile_time_constant_static5_test/13: MissingCompileTimeError
+compile_time_constant_static5_test/14: MissingCompileTimeError
+compile_time_constant_static5_test/15: MissingCompileTimeError
+compile_time_constant_static5_test/17: MissingCompileTimeError
+compile_time_constant_static5_test/18: MissingCompileTimeError
+compile_time_constant_static5_test/19: MissingCompileTimeError
+compile_time_constant_static5_test/20: MissingCompileTimeError
+compile_time_constant_static5_test/22: MissingCompileTimeError
+compile_time_constant_static5_test/24: MissingCompileTimeError
+compile_time_constant_static5_test/25: MissingCompileTimeError
+compile_time_constant_static_test/01: MissingCompileTimeError
+compile_time_constant_static_test/02: MissingCompileTimeError
+compile_time_constant_static_test/03: MissingCompileTimeError
 conditional_import_string_test: RuntimeError
 conditional_import_test: RuntimeError
 conditional_method_invocation_test/05: MissingCompileTimeError
@@ -2617,10 +3003,11 @@
 covariant_subtyping_tearoff1_test: RuntimeError
 covariant_subtyping_tearoff2_test: RuntimeError
 covariant_subtyping_tearoff3_test: RuntimeError
-covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
+covariant_subtyping_test: CompileTimeError
 covariant_subtyping_unsafe_call1_test: RuntimeError
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
+crash_6725_test/01: MissingCompileTimeError
 cyclic_constructor_test/01: Crash # Issue 30856
 deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
@@ -2647,8 +3034,17 @@
 deferred_load_library_wrong_args_test/01: MissingRuntimeError
 deferred_not_loaded_check_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
-deferred_super_dependency_test/01: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
+deferred_super_dependency_test/01: MissingCompileTimeError
 double_int_to_string_test: RuntimeError
+double_to_string_as_exponential2_test/01: MissingCompileTimeError
+double_to_string_as_exponential2_test/02: MissingCompileTimeError
+double_to_string_as_exponential2_test/03: MissingCompileTimeError
+double_to_string_as_fixed2_test/01: MissingCompileTimeError
+double_to_string_as_fixed2_test/02: MissingCompileTimeError
+double_to_string_as_fixed2_test/03: MissingCompileTimeError
+double_to_string_as_precision2_test/01: MissingCompileTimeError
+double_to_string_as_precision2_test/02: MissingCompileTimeError
+double_to_string_as_precision2_test/03: MissingCompileTimeError
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -2708,12 +3104,9 @@
 generic_function_typedef_test/01: RuntimeError
 generic_instanceof_test: RuntimeError
 generic_list_checked_test: RuntimeError
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
-generic_methods_closure_test: Crash # Unsupported operation: Unsupported type parameter type node S.
-generic_methods_shadowing_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_test: RuntimeError
-generic_typedef_test: Crash # Unsupported operation: Unsupported type parameter type node S.
+generic_typedef_test: RuntimeError
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
@@ -2723,8 +3116,9 @@
 identical_closure2_test: RuntimeError
 if_null_precedence_test/none: RuntimeError
 inferrer_synthesized_constructor_test: RuntimeError
-infinite_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 infinity_test: RuntimeError
+initializing_formal_type_annotation_test/01: MissingCompileTimeError
+initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_creation_in_function_annotation_test: RuntimeError
 instanceof2_test: RuntimeError
 instanceof4_test/01: RuntimeError
@@ -2733,8 +3127,45 @@
 internal_library_test/02: Crash # NoSuchMethodError: Class 'DillLibraryBuilder' has no instance getter 'mixinApplicationClasses'.
 invocation_mirror2_test: RuntimeError
 invocation_mirror_test: RuntimeError
+is_malformed_type_test/94: MissingCompileTimeError
+is_malformed_type_test/95: MissingCompileTimeError
+is_malformed_type_test/96: MissingCompileTimeError
+is_malformed_type_test/97: MissingCompileTimeError
+is_malformed_type_test/98: MissingCompileTimeError
+is_malformed_type_test/99: MissingCompileTimeError
+is_not_class2_test/01: MissingCompileTimeError
+isnot_malformed_type_test/01: MissingCompileTimeError
+issue11724_test/01: MissingCompileTimeError
+issue1363_test/01: MissingCompileTimeError
+issue15606_test/01: MissingCompileTimeError
+issue18628_1_test/01: MissingCompileTimeError
+issue18628_2_test/01: MissingCompileTimeError
 issue21079_test: RuntimeError
 issue23244_test: RuntimeError
+known_identifier_prefix_error_test/01: MissingCompileTimeError
+known_identifier_prefix_error_test/02: MissingCompileTimeError
+known_identifier_prefix_error_test/03: MissingCompileTimeError
+known_identifier_prefix_error_test/04: MissingCompileTimeError
+known_identifier_prefix_error_test/05: MissingCompileTimeError
+known_identifier_prefix_error_test/06: MissingCompileTimeError
+known_identifier_prefix_error_test/07: MissingCompileTimeError
+known_identifier_prefix_error_test/08: MissingCompileTimeError
+known_identifier_prefix_error_test/09: MissingCompileTimeError
+known_identifier_prefix_error_test/10: MissingCompileTimeError
+known_identifier_prefix_error_test/11: MissingCompileTimeError
+known_identifier_prefix_error_test/12: MissingCompileTimeError
+known_identifier_prefix_error_test/13: MissingCompileTimeError
+known_identifier_prefix_error_test/14: MissingCompileTimeError
+known_identifier_prefix_error_test/15: MissingCompileTimeError
+known_identifier_prefix_error_test/16: MissingCompileTimeError
+known_identifier_prefix_error_test/17: MissingCompileTimeError
+known_identifier_prefix_error_test/18: MissingCompileTimeError
+known_identifier_prefix_error_test/19: MissingCompileTimeError
+known_identifier_prefix_error_test/20: MissingCompileTimeError
+known_identifier_prefix_error_test/21: MissingCompileTimeError
+known_identifier_prefix_error_test/22: MissingCompileTimeError
+known_identifier_prefix_error_test/23: MissingCompileTimeError
+known_identifier_prefix_error_test/24: MissingCompileTimeError
 left_shift_test: RuntimeError
 library_env_test/has_mirror_support: RuntimeError
 list_literal1_test/01: MissingCompileTimeError
@@ -2748,6 +3179,19 @@
 list_literal_syntax_test/03: MissingCompileTimeError
 malformed2_test/00: MissingCompileTimeError
 many_generic_instanceof_test: RuntimeError
+map_literal11_test/none: MissingRuntimeError
+map_literal1_test/01: MissingCompileTimeError
+map_literal3_test/01: MissingCompileTimeError
+map_literal3_test/02: MissingCompileTimeError
+map_literal3_test/03: MissingCompileTimeError
+map_literal3_test/04: MissingCompileTimeError
+map_literal4_test/01: MissingCompileTimeError
+map_literal4_test/02: MissingCompileTimeError
+map_literal4_test/03: MissingCompileTimeError
+map_literal4_test/04: MissingCompileTimeError
+map_literal4_test/05: MissingCompileTimeError
+map_literal4_test/06: MissingCompileTimeError
+map_literal7_test: RuntimeError
 map_literal8_test: RuntimeError
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
@@ -2843,7 +3287,6 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
-nested_switch_label_test: Crash # NoSuchMethodError: The method 'generateBreak' was called on null.
 no_main_test/01: CompileTimeError
 no_such_method_native_test: RuntimeError
 not_enough_positional_arguments_test/00: MissingCompileTimeError
@@ -2857,8 +3300,15 @@
 null_test/03: MissingCompileTimeError
 null_test/mirrors: RuntimeError
 null_test/none: RuntimeError
+number_identifier_test/05: MissingCompileTimeError
+number_identifier_test/08: MissingCompileTimeError
+number_identifier_test/09: MissingCompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError
+on_catch_malformed_type_test: MissingCompileTimeError
+operator5_test: MissingCompileTimeError
+operator_equals_test: MissingCompileTimeError
+optimized_constant_array_string_access_test: MissingCompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -2876,7 +3326,11 @@
 private_super_constructor_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
+redirecting_factory_default_values_test/03: MissingCompileTimeError
+redirecting_factory_incompatible_signature_test/01: MissingCompileTimeError
+redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
+redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_21795_test: RuntimeError
@@ -2915,11 +3369,153 @@
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
-tearoff_dynamic_test: Crash # Unsupported operation: Unsupported type parameter type node T.
+tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError
 try_catch_test/01: MissingCompileTimeError
+type_literal_prefix_call_test/00: MissingCompileTimeError
 type_literal_test: RuntimeError
+type_parameter_test/01: MissingCompileTimeError
+type_parameter_test/02: MissingCompileTimeError
+type_parameter_test/03: MissingCompileTimeError
+type_parameter_test/04: MissingCompileTimeError
+type_parameter_test/05: MissingCompileTimeError
+type_parameter_test/06: MissingCompileTimeError
+type_parameter_test/07: MissingCompileTimeError
+type_parameter_test/08: MissingCompileTimeError
+type_parameter_test/09: MissingCompileTimeError
+type_promotion_assign_test/01: MissingCompileTimeError
+type_promotion_assign_test/02: MissingCompileTimeError
+type_promotion_assign_test/03: MissingCompileTimeError
+type_promotion_assign_test/04: MissingCompileTimeError
+type_promotion_closure_test/01: MissingCompileTimeError
+type_promotion_closure_test/02: MissingCompileTimeError
+type_promotion_closure_test/03: MissingCompileTimeError
+type_promotion_closure_test/04: MissingCompileTimeError
+type_promotion_closure_test/06: MissingCompileTimeError
+type_promotion_closure_test/07: MissingCompileTimeError
+type_promotion_closure_test/09: MissingCompileTimeError
+type_promotion_closure_test/10: MissingCompileTimeError
+type_promotion_closure_test/11: MissingCompileTimeError
+type_promotion_closure_test/12: MissingCompileTimeError
+type_promotion_closure_test/13: MissingCompileTimeError
+type_promotion_closure_test/14: MissingCompileTimeError
+type_promotion_closure_test/15: MissingCompileTimeError
+type_promotion_closure_test/16: MissingCompileTimeError
+type_promotion_local_test/01: MissingCompileTimeError
+type_promotion_local_test/02: MissingCompileTimeError
+type_promotion_local_test/03: MissingCompileTimeError
+type_promotion_local_test/04: MissingCompileTimeError
+type_promotion_local_test/05: MissingCompileTimeError
+type_promotion_local_test/06: MissingCompileTimeError
+type_promotion_local_test/07: MissingCompileTimeError
+type_promotion_local_test/08: MissingCompileTimeError
+type_promotion_local_test/09: MissingCompileTimeError
+type_promotion_local_test/10: MissingCompileTimeError
+type_promotion_local_test/11: MissingCompileTimeError
+type_promotion_local_test/12: MissingCompileTimeError
+type_promotion_local_test/13: MissingCompileTimeError
+type_promotion_local_test/14: MissingCompileTimeError
+type_promotion_local_test/15: MissingCompileTimeError
+type_promotion_local_test/16: MissingCompileTimeError
+type_promotion_local_test/17: MissingCompileTimeError
+type_promotion_local_test/18: MissingCompileTimeError
+type_promotion_local_test/19: MissingCompileTimeError
+type_promotion_local_test/20: MissingCompileTimeError
+type_promotion_local_test/21: MissingCompileTimeError
+type_promotion_local_test/22: MissingCompileTimeError
+type_promotion_local_test/23: MissingCompileTimeError
+type_promotion_local_test/24: MissingCompileTimeError
+type_promotion_local_test/25: MissingCompileTimeError
+type_promotion_local_test/26: MissingCompileTimeError
+type_promotion_local_test/27: MissingCompileTimeError
+type_promotion_local_test/28: MissingCompileTimeError
+type_promotion_local_test/29: MissingCompileTimeError
+type_promotion_local_test/30: MissingCompileTimeError
+type_promotion_local_test/31: MissingCompileTimeError
+type_promotion_local_test/32: MissingCompileTimeError
+type_promotion_local_test/33: MissingCompileTimeError
+type_promotion_local_test/34: MissingCompileTimeError
+type_promotion_local_test/35: MissingCompileTimeError
+type_promotion_local_test/36: MissingCompileTimeError
+type_promotion_local_test/37: MissingCompileTimeError
+type_promotion_local_test/38: MissingCompileTimeError
+type_promotion_local_test/39: MissingCompileTimeError
+type_promotion_local_test/40: MissingCompileTimeError
+type_promotion_local_test/41: MissingCompileTimeError
+type_promotion_logical_and_test/01: MissingCompileTimeError
+type_promotion_logical_and_test/02: MissingCompileTimeError
+type_promotion_logical_and_test/03: MissingCompileTimeError
+type_promotion_more_specific_test/02: MissingCompileTimeError
+type_promotion_more_specific_test/06: MissingCompileTimeError
+type_promotion_more_specific_test/07: MissingCompileTimeError
+type_promotion_more_specific_test/09: MissingCompileTimeError
+type_promotion_multiple_test/01: MissingCompileTimeError
+type_promotion_multiple_test/02: MissingCompileTimeError
+type_promotion_multiple_test/03: MissingCompileTimeError
+type_promotion_multiple_test/04: MissingCompileTimeError
+type_promotion_multiple_test/05: MissingCompileTimeError
+type_promotion_multiple_test/06: MissingCompileTimeError
+type_promotion_multiple_test/07: MissingCompileTimeError
+type_promotion_multiple_test/08: MissingCompileTimeError
+type_promotion_multiple_test/09: MissingCompileTimeError
+type_promotion_multiple_test/10: MissingCompileTimeError
+type_promotion_multiple_test/11: MissingCompileTimeError
+type_promotion_multiple_test/12: MissingCompileTimeError
+type_promotion_multiple_test/13: MissingCompileTimeError
+type_promotion_multiple_test/14: MissingCompileTimeError
+type_promotion_multiple_test/15: MissingCompileTimeError
+type_promotion_multiple_test/16: MissingCompileTimeError
+type_promotion_multiple_test/17: MissingCompileTimeError
+type_promotion_multiple_test/18: MissingCompileTimeError
+type_promotion_multiple_test/19: MissingCompileTimeError
+type_promotion_multiple_test/20: MissingCompileTimeError
+type_promotion_multiple_test/21: MissingCompileTimeError
+type_promotion_multiple_test/22: MissingCompileTimeError
 typevariable_substitution2_test/02: RuntimeError
+void_type_callbacks_test/none: CompileTimeError
+void_type_function_types_test/none: CompileTimeError
+void_type_override_test/none: CompileTimeError
+void_type_usage_test/call_as: CompileTimeError
+void_type_usage_test/call_for: CompileTimeError
+void_type_usage_test/call_stmt: CompileTimeError
+void_type_usage_test/field_assign: CompileTimeError
+void_type_usage_test/field_assign2: CompileTimeError
+void_type_usage_test/final_local_as: CompileTimeError
+void_type_usage_test/final_local_for: CompileTimeError
+void_type_usage_test/final_local_stmt: CompileTimeError
+void_type_usage_test/global_as: CompileTimeError
+void_type_usage_test/global_for: CompileTimeError
+void_type_usage_test/global_for_in2: CompileTimeError
+void_type_usage_test/global_stmt: CompileTimeError
+void_type_usage_test/instance2_as: CompileTimeError
+void_type_usage_test/instance2_for: CompileTimeError
+void_type_usage_test/instance2_for_in3: CompileTimeError
+void_type_usage_test/instance2_stmt: CompileTimeError
+void_type_usage_test/instance3_as: CompileTimeError
+void_type_usage_test/instance3_for: CompileTimeError
+void_type_usage_test/instance3_for_in3: CompileTimeError
+void_type_usage_test/instance3_stmt: CompileTimeError
+void_type_usage_test/instance_as: CompileTimeError
+void_type_usage_test/instance_for: CompileTimeError
+void_type_usage_test/instance_stmt: CompileTimeError
+void_type_usage_test/local_as: CompileTimeError
+void_type_usage_test/local_assign: CompileTimeError
+void_type_usage_test/local_for: CompileTimeError
+void_type_usage_test/local_for_in2: CompileTimeError
+void_type_usage_test/local_stmt: CompileTimeError
+void_type_usage_test/none: CompileTimeError
+void_type_usage_test/param_as: CompileTimeError
+void_type_usage_test/param_for: CompileTimeError
+void_type_usage_test/param_for_in2: CompileTimeError
+void_type_usage_test/param_stmt: CompileTimeError
+void_type_usage_test/paren_as: CompileTimeError
+void_type_usage_test/paren_for: CompileTimeError
+void_type_usage_test/paren_stmt: CompileTimeError
+void_type_usage_test/setter_assign: CompileTimeError
+wrong_number_type_arguments_test/none: Pass
+
+[ $compiler == dart2js && $dart2js_with_kernel && $minified && !$strong ]
+*: SkipByDesign
 
 [ $compiler == dart2js && !$dart2js_with_kernel ]
 accessor_conflict_export2_test: Crash # Issue 25626
@@ -3045,7 +3641,9 @@
 generic_function_typedef2_test/03: MissingCompileTimeError # Issue 28214
 generic_function_typedef2_test/05: Crash # Issue 28214
 generic_function_typedef2_test/06: Crash # Issue 28214
+generic_methods_closure_test: RuntimeError
 generic_methods_local_variable_declaration_test: RuntimeError
+generic_methods_shadowing_test: RuntimeError
 getter_setter_in_lib_test: Fail # Issue 23288
 identical_closure2_test: RuntimeError # Issue 1533, Issue 12596
 if_null_assignment_behavior_test/13: Crash # Issue 23491
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index db124f7..88ab234 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -11,7 +11,6 @@
 accessor_conflict_import_prefixed_test: CompileTimeError # Issue 25626
 accessor_conflict_import_test: CompileTimeError # Issue 25626
 additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
-arithmetic_test: RuntimeError # Issue 31763
 assertion_initializer_const_error2_test/*: Crash # Issue #27809
 assertion_initializer_const_error2_test/cc10: Pass # Issue #31319
 assertion_initializer_const_error2_test/cc11: Pass # Issue #31319
@@ -19,16 +18,11 @@
 assertion_initializer_const_function_test/01: Crash
 assertion_initializer_test: CompileTimeError
 black_listed_test/none: Fail # Issue 14228
-bug31436_test: CompileTimeError
+bug31436_test: RuntimeError
 built_in_identifier_prefix_test: CompileTimeError
 built_in_identifier_type_annotation_test/22: MissingCompileTimeError # Issue 28816
 cascaded_forwarding_stubs_generic_test: RuntimeError
 cascaded_forwarding_stubs_test: CompileTimeError
-closure_param_null_to_object_test: RuntimeError
-combiner_type_lookup_indexed_test: CompileTimeError # Issue #31484
-combiner_type_lookup_instance_test: CompileTimeError # Issue #31484
-combiner_type_lookup_static_test: CompileTimeError # Issue #31484
-combiner_type_lookup_top_level_test: CompileTimeError # Issue #31484
 conflicting_type_variable_and_setter_test: CompileTimeError
 const_for_in_variable_test/01: MissingCompileTimeError
 const_types_test/07: MissingCompileTimeError
@@ -56,7 +50,6 @@
 generics_test: CompileTimeError
 getter_setter_in_lib_test: CompileTimeError
 implicit_downcast_during_assert_initializer_test: Crash
-implicit_downcast_during_function_literal_arrow_test: CompileTimeError # Issue #31436
 import_core_prefix_test: CompileTimeError
 import_private_test/01: MissingCompileTimeError # Issue 29920
 initializing_formal_final_test: MissingCompileTimeError
@@ -64,8 +57,8 @@
 instantiate_tearoff_of_call_test: RuntimeError
 interface_test/00: MissingCompileTimeError
 internal_library_test/01: MissingCompileTimeError # Issue 29920
+issue31596_test: CompileTimeError
 method_override_test: CompileTimeError # Negative test
-mint_compares_test: RuntimeError # Issue 31763
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
@@ -132,7 +125,6 @@
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
 additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
 arithmetic_test: RuntimeError # Issue 31763
-assert_message_test: CompileTimeError
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc02: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc03: MissingCompileTimeError
@@ -144,7 +136,6 @@
 assertion_initializer_const_error2_test/cc10: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc11: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
-assertion_test: CompileTimeError
 async_await_syntax_test/c10a: MissingCompileTimeError
 async_await_syntax_test/d08b: MissingCompileTimeError
 async_await_syntax_test/d10a: MissingCompileTimeError
@@ -190,7 +181,6 @@
 call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: CompileTimeError # Issue 31402 Error: A value of type '#lib1::F' can't be assigned to a variable of type 'dart.core::Function'.
 callable_test/none: CompileTimeError
-cascade_on_static_field_test: Crash
 check_member_static_test/01: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
@@ -245,10 +235,6 @@
 constructor_redirect2_negative_test: MissingCompileTimeError
 constructor_redirect2_test/01: MissingCompileTimeError
 constructor_redirect_test/01: MissingCompileTimeError
-covariance_type_parameter_test/01: CompileTimeError # Warning: Unimplemented bounds on type variables.
-covariance_type_parameter_test/02: CompileTimeError # Warning: Unimplemented bounds on type variables.
-covariance_type_parameter_test/03: CompileTimeError # Warning: Unimplemented bounds on type variables.
-covariance_type_parameter_test/none: CompileTimeError # Warning: Unimplemented bounds on type variables.
 covariant_subtyping_test: CompileTimeError
 cyclic_constructor_test/01: MissingCompileTimeError
 cyclic_type_variable_test/01: MissingCompileTimeError
@@ -308,72 +294,72 @@
 final_attempt_reinitialization_test/02: Crash
 final_syntax_test/09: Crash
 function_propagation_test: CompileTimeError
-function_type/function_type10_test: CompileTimeError
-function_type/function_type11_test: CompileTimeError
-function_type/function_type14_test: CompileTimeError
-function_type/function_type15_test: CompileTimeError
-function_type/function_type18_test: CompileTimeError
-function_type/function_type19_test: CompileTimeError
-function_type/function_type20_test: CompileTimeError
-function_type/function_type21_test: CompileTimeError
-function_type/function_type22_test: CompileTimeError
-function_type/function_type23_test: CompileTimeError
-function_type/function_type24_test: CompileTimeError
-function_type/function_type25_test: CompileTimeError
-function_type/function_type26_test: CompileTimeError
-function_type/function_type27_test: CompileTimeError
-function_type/function_type28_test: CompileTimeError
-function_type/function_type29_test: CompileTimeError
-function_type/function_type2_test: CompileTimeError
-function_type/function_type30_test: CompileTimeError
-function_type/function_type31_test: CompileTimeError
-function_type/function_type32_test: CompileTimeError
-function_type/function_type33_test: CompileTimeError
-function_type/function_type34_test: CompileTimeError
-function_type/function_type35_test: CompileTimeError
-function_type/function_type36_test: CompileTimeError
-function_type/function_type37_test: CompileTimeError
-function_type/function_type38_test: CompileTimeError
-function_type/function_type39_test: CompileTimeError
-function_type/function_type3_test: CompileTimeError
-function_type/function_type40_test: CompileTimeError
-function_type/function_type41_test: CompileTimeError
-function_type/function_type42_test: CompileTimeError
-function_type/function_type43_test: CompileTimeError
-function_type/function_type44_test: CompileTimeError
-function_type/function_type45_test: CompileTimeError
-function_type/function_type46_test: CompileTimeError
-function_type/function_type47_test: CompileTimeError
-function_type/function_type48_test: CompileTimeError
-function_type/function_type49_test: CompileTimeError
-function_type/function_type50_test: CompileTimeError
-function_type/function_type51_test: CompileTimeError
-function_type/function_type54_test: CompileTimeError
-function_type/function_type55_test: CompileTimeError
-function_type/function_type58_test: CompileTimeError
-function_type/function_type59_test: CompileTimeError
-function_type/function_type62_test: CompileTimeError
-function_type/function_type63_test: CompileTimeError
-function_type/function_type66_test: CompileTimeError
-function_type/function_type67_test: CompileTimeError
-function_type/function_type6_test: CompileTimeError
-function_type/function_type70_test: CompileTimeError
-function_type/function_type71_test: CompileTimeError
-function_type/function_type74_test: CompileTimeError
-function_type/function_type75_test: CompileTimeError
-function_type/function_type78_test: CompileTimeError
-function_type/function_type79_test: CompileTimeError
-function_type/function_type7_test: CompileTimeError
-function_type/function_type82_test: CompileTimeError
-function_type/function_type83_test: CompileTimeError
-function_type/function_type86_test: CompileTimeError
-function_type/function_type87_test: CompileTimeError
-function_type/function_type90_test: CompileTimeError
-function_type/function_type91_test: CompileTimeError
-function_type/function_type94_test: CompileTimeError
-function_type/function_type95_test: CompileTimeError
-function_type/function_type98_test: CompileTimeError
-function_type/function_type99_test: CompileTimeError
+function_type/function_type10_test: RuntimeError # Issue 31766
+function_type/function_type11_test: RuntimeError # Issue 31766
+function_type/function_type14_test: RuntimeError # Issue 31766
+function_type/function_type15_test: RuntimeError # Issue 31766
+function_type/function_type18_test: RuntimeError # Issue 31766
+function_type/function_type19_test: RuntimeError # Issue 31766
+function_type/function_type20_test: RuntimeError # Issue 31766
+function_type/function_type21_test: RuntimeError # Issue 31766
+function_type/function_type22_test: RuntimeError # Issue 31766
+function_type/function_type23_test: RuntimeError # Issue 31766
+function_type/function_type24_test: RuntimeError # Issue 31766
+function_type/function_type25_test: RuntimeError # Issue 31766
+function_type/function_type26_test: RuntimeError # Issue 31766
+function_type/function_type27_test: RuntimeError # Issue 31766
+function_type/function_type28_test: RuntimeError # Issue 31766
+function_type/function_type29_test: RuntimeError # Issue 31766
+function_type/function_type2_test: RuntimeError # Issue 31766
+function_type/function_type30_test: RuntimeError # Issue 31766
+function_type/function_type31_test: RuntimeError # Issue 31766
+function_type/function_type32_test: RuntimeError # Issue 31766
+function_type/function_type33_test: RuntimeError # Issue 31766
+function_type/function_type34_test: RuntimeError # Issue 31766
+function_type/function_type35_test: RuntimeError # Issue 31766
+function_type/function_type36_test: RuntimeError # Issue 31766
+function_type/function_type37_test: RuntimeError # Issue 31766
+function_type/function_type38_test: RuntimeError # Issue 31766
+function_type/function_type39_test: RuntimeError # Issue 31766
+function_type/function_type3_test: RuntimeError # Issue 31766
+function_type/function_type40_test: RuntimeError # Issue 31766
+function_type/function_type41_test: RuntimeError # Issue 31766
+function_type/function_type42_test: RuntimeError # Issue 31766
+function_type/function_type43_test: RuntimeError # Issue 31766
+function_type/function_type44_test: RuntimeError # Issue 31766
+function_type/function_type45_test: RuntimeError # Issue 31766
+function_type/function_type46_test: RuntimeError # Issue 31766
+function_type/function_type47_test: RuntimeError # Issue 31766
+function_type/function_type48_test: RuntimeError # Issue 31766
+function_type/function_type49_test: RuntimeError # Issue 31766
+function_type/function_type50_test: RuntimeError # Issue 31766
+function_type/function_type51_test: RuntimeError # Issue 31766
+function_type/function_type54_test: RuntimeError # Issue 31766
+function_type/function_type55_test: RuntimeError # Issue 31766
+function_type/function_type58_test: RuntimeError # Issue 31766
+function_type/function_type59_test: RuntimeError # Issue 31766
+function_type/function_type62_test: RuntimeError # Issue 31766
+function_type/function_type63_test: RuntimeError # Issue 31766
+function_type/function_type66_test: RuntimeError # Issue 31766
+function_type/function_type67_test: RuntimeError # Issue 31766
+function_type/function_type6_test: RuntimeError # Issue 31766
+function_type/function_type70_test: RuntimeError # Issue 31766
+function_type/function_type71_test: RuntimeError # Issue 31766
+function_type/function_type74_test: RuntimeError # Issue 31766
+function_type/function_type75_test: RuntimeError # Issue 31766
+function_type/function_type78_test: RuntimeError # Issue 31766
+function_type/function_type79_test: RuntimeError # Issue 31766
+function_type/function_type7_test: RuntimeError # Issue 31766
+function_type/function_type82_test: RuntimeError # Issue 31766
+function_type/function_type83_test: RuntimeError # Issue 31766
+function_type/function_type86_test: RuntimeError # Issue 31766
+function_type/function_type87_test: RuntimeError # Issue 31766
+function_type/function_type90_test: RuntimeError # Issue 31766
+function_type/function_type91_test: RuntimeError # Issue 31766
+function_type/function_type94_test: RuntimeError # Issue 31766
+function_type/function_type95_test: RuntimeError # Issue 31766
+function_type/function_type98_test: RuntimeError # Issue 31766
+function_type/function_type99_test: RuntimeError # Issue 31766
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
 generalized_void_syntax_test: CompileTimeError
@@ -401,6 +387,7 @@
 invocation_mirror_test: CompileTimeError # Issue 31402 Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Invocation'.
 issue13179_test: CompileTimeError # Issue 31537
 issue18628_2_test/01: MissingCompileTimeError
+issue31596_test: RuntimeError
 issue_25671a_test/01: CompileTimeError # Warning: The method 'A::noSuchMethod' has fewer positional arguments than those of overridden method 'Object::noSuchMethod'.
 issue_25671b_test/01: CompileTimeError # Warning: The method 'A::noSuchMethod' has fewer positional arguments than those of overridden method 'Object::noSuchMethod'.
 local_function_test/01: MissingCompileTimeError
@@ -567,19 +554,10 @@
 override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
-override_inheritance_field_test/05: MissingCompileTimeError
-override_inheritance_field_test/07: MissingCompileTimeError
-override_inheritance_field_test/08: MissingCompileTimeError
-override_inheritance_field_test/09: MissingCompileTimeError
-override_inheritance_field_test/10: MissingCompileTimeError
-override_inheritance_field_test/11: MissingCompileTimeError
-override_inheritance_field_test/28: MissingCompileTimeError
-override_inheritance_field_test/30: MissingCompileTimeError
-override_inheritance_field_test/31: MissingCompileTimeError
-override_inheritance_field_test/32: MissingCompileTimeError
-override_inheritance_field_test/33: MissingCompileTimeError
-override_inheritance_field_test/33a: MissingCompileTimeError
-override_inheritance_field_test/34: MissingCompileTimeError
+override_inheritance_field_test/04: CompileTimeError # Issue 31616
+override_inheritance_field_test/06: CompileTimeError # Issue 31616
+override_inheritance_field_test/26: CompileTimeError # Issue 31616
+override_inheritance_field_test/29: CompileTimeError # Issue 31616
 override_inheritance_field_test/44: MissingCompileTimeError
 override_inheritance_field_test/47: MissingCompileTimeError
 override_inheritance_field_test/48: MissingCompileTimeError
@@ -681,12 +659,12 @@
 type_variable_bounds_test/06: MissingCompileTimeError
 type_variable_bounds_test/08: MissingCompileTimeError
 type_variable_bounds_test/11: MissingCompileTimeError
-typedef_class_in_other_file_test: Crash
 void_block_return_test/00: MissingCompileTimeError
 void_type_callbacks_test/none: CompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 
 [ $compiler == dartdevc && $runtime != none ]
+assertion_test: RuntimeError # Issue 30326; Expect.equals(expected: <1>, actual: <0>) fails.
 async_star_test/01: RuntimeError
 async_star_test/03: RuntimeError
 async_star_test/04: RuntimeError
@@ -740,7 +718,6 @@
 callable_test/none: RuntimeError # Expect.throws(TypeError) fails: Did not throw
 conditional_import_string_test: RuntimeError # Unsupported operation: String.fromEnvironment can only be used as a const constructor
 conditional_import_test: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-constant_string_interpolation2_test: RuntimeError # TypeError: Cannot read property 'Symbol(dartx.toString)' of null
 cyclic_type_test/00: RuntimeError # Expect.equals(expected: <Derived>, actual: <dynamic>) fails.
 cyclic_type_test/01: RuntimeError # Expect.equals(at index 0: Expected <Derived<Derived<int>>...>, Found: <dynamic>) fails.
 deferred_closurize_load_library_test: RuntimeError # NoSuchMethodError: method not found: 'then'
@@ -831,7 +808,6 @@
 # dartdevc and dartdevk, then expectations for dartdevc, and then expectations
 # for dartdevk.
 [ $runtime != none && ($compiler == dartdevc || $compiler == dartdevk) ]
-assertion_test: RuntimeError # Issue 30326; Expect.equals(expected: <1>, actual: <0>) fails.
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
 async_star_pause_test: RuntimeError # Uncaught Expect.listEquals(at index 2, expected: <0+>, actual: <0!>) fails
 async_star_test/02: RuntimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index ab95ff9..66efda2 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -71,474 +71,41 @@
 assert_initializer_test/47: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/48: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/none: RuntimeError # KernelVM bug: Constant evaluation.
-assertion_initializer_const_function_test/01: RuntimeError
-assign_static_type_test/02: MissingCompileTimeError
+async_await_syntax_test/c03a: RuntimeError
+async_await_syntax_test/c09a: RuntimeError
+async_await_syntax_test/d03a: RuntimeError
+async_await_syntax_test/d09a: RuntimeError
+async_await_test/02: RuntimeError
+async_await_test/03: RuntimeError
+async_await_test/none: RuntimeError
 async_return_types_test/nestedFuture: Fail
-async_return_types_test/wrongTypeParameter: Fail
+async_return_types_test/none: RuntimeError
 async_star_regression_2238_test: RuntimeError
+async_star_take_reyield_test: RuntimeError
 async_star_test/01: RuntimeError
 async_star_test/03: RuntimeError
 async_star_test/04: RuntimeError
 async_star_test/05: RuntimeError
 async_star_test/none: RuntimeError
+asyncstar_yield_test: RuntimeError
+asyncstar_yieldstar_test: RuntimeError
+bug31436_test: RuntimeError
 compile_time_constant_checked_test/02: MissingCompileTimeError
 const_constructor2_test/20: MissingCompileTimeError
 const_constructor2_test/22: MissingCompileTimeError
 const_constructor2_test/24: MissingCompileTimeError
-const_init2_test/02: MissingCompileTimeError
+covariance_type_parameter_test/01: RuntimeError
+covariance_type_parameter_test/02: RuntimeError
+covariance_type_parameter_test/03: RuntimeError
+covariance_type_parameter_test/none: RuntimeError
 default_factory2_test/01: Fail
-factory_redirection_test/08: Fail
-factory_redirection_test/09: Fail
-factory_redirection_test/10: Fail
-factory_redirection_test/12: Fail
-factory_redirection_test/13: Fail
-factory_redirection_test/14: Fail
-if_null_precedence_test/none: Pass
-known_identifier_usage_error_test/none: RuntimeError # Issue 28814
-list_literal1_test/01: MissingCompileTimeError
-malbounded_redirecting_factory_test/03: Fail
-malbounded_redirecting_factory_test/04: Fail
-malbounded_type_cast_test: RuntimeError
-malbounded_type_test_test/03: Fail
-malbounded_type_test_test/04: Fail
-malformed2_test/00: RuntimeError
-malformed2_test/01: MissingCompileTimeError
-map_literal1_test/01: MissingCompileTimeError
-mixin_invalid_bound2_test/08: Fail
-mixin_invalid_bound2_test/09: Fail
-mixin_invalid_bound2_test/10: Fail
-mixin_invalid_bound_test/06: Fail
-mixin_invalid_bound_test/07: Fail
-recursive_mixin_test: Crash
-redirecting_factory_infinite_steps_test/01: Fail
-redirecting_factory_malbounded_test/01: Fail
-regress_22728_test: Fail # Dartk Issue 28498
-regress_22728_test: RuntimeError
-regress_26133_test: RuntimeError
-regress_30339_test: RuntimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-type_parameter_test/05: MissingCompileTimeError
-type_parameter_test/none: RuntimeError
-type_variable_bounds4_test/01: RuntimeError
-
-[ $compiler == dartk && $runtime == vm && !$checked && $strong ]
-bool_check_test: RuntimeError
-bool_condition_check_test: RuntimeError
-callable_test/none: RuntimeError
-checked_setter2_test: RuntimeError
-checked_setter_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
-deferred_constraints_type_annotation_test/type_annotation1: Crash # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic1: Crash # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic4: Crash # KernelVM bug: Deferred loading kernel issue 28335.
-field_override_optimization_test: RuntimeError
-field_type_check2_test/01: MissingRuntimeError
-function_subtype_checked0_test: RuntimeError
-function_subtype_inline2_test: RuntimeError
-function_subtype_setter0_test: RuntimeError
-generic_list_checked_test: RuntimeError
-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
-private_super_constructor_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
-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.
-redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
-regress_20394_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
-
-# ===== dartk + vm status lines =====
-[ $compiler == dartk && $runtime == vm && $strong ]
-abstract_beats_arguments_test: MissingCompileTimeError
-abstract_exact_selector_test/01: MissingCompileTimeError
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
-arithmetic2_test: RuntimeError # Throws CastError instead of TypeError
-assert_message_test: CompileTimeError # Issue 31402 (Assert statement)
-assertion_initializer_test: CompileTimeError # Issue 31402 (Assert statement)
-assertion_test: CompileTimeError # Issue 31402 (Assert statement)
-assign_to_type_test/01: MissingCompileTimeError
-assign_to_type_test/02: MissingCompileTimeError
-assign_to_type_test/03: MissingCompileTimeError
-assign_to_type_test/04: MissingCompileTimeError
-assign_top_method_test: MissingCompileTimeError
-async_await_syntax_test/c10a: MissingCompileTimeError
-async_await_syntax_test/d08b: MissingCompileTimeError
-async_await_syntax_test/d10a: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
-async_return_types_test/nestedFuture: MissingCompileTimeError
-async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
-async_return_types_test/wrongReturnType: MissingCompileTimeError
-async_star_cancel_while_paused_test: RuntimeError
-async_star_pause_test: Fail, OK
-async_star_regression_2238_test: RuntimeError
-async_star_regression_23116_test: RuntimeError
-async_star_regression_fisk_test: RuntimeError
-async_star_test/01: CompileTimeError # Issue 2238.
-async_star_test/01: Pass
-async_star_test/01: RuntimeError
-async_star_test/02: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/03: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/04: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/05: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-await_test: CompileTimeError # Issue 31541
-bad_named_parameters2_test/01: MissingCompileTimeError
-bad_named_parameters_test/01: MissingCompileTimeError
-bad_named_parameters_test/02: MissingCompileTimeError
-bad_named_parameters_test/03: MissingCompileTimeError
-bad_named_parameters_test/04: MissingCompileTimeError
-bad_named_parameters_test/05: MissingCompileTimeError
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/06: MissingCompileTimeError
-built_in_identifier_prefix_test: CompileTimeError
-built_in_identifier_type_annotation_test/22: DartkCrash # Issue 28814
-built_in_identifier_type_annotation_test/22: MissingCompileTimeError # Error only in strong mode
-built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/53: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/54: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/55: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/57: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/58: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/59: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/60: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/61: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/62: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/63: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/64: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/65: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/66: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/67: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/68: MissingCompileTimeError # Issue 28814
-call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/02: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/03: MissingCompileTimeError
-call_function2_test: CompileTimeError # Issue 31402 (map literal)
-call_function_apply_test: CompileTimeError # Issue 31402 (Invocation arguments)
-call_function_test: CompileTimeError
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
-call_nonexistent_constructor_test/01: MissingCompileTimeError
-call_nonexistent_constructor_test/02: MissingCompileTimeError
-call_nonexistent_static_test/01: MissingCompileTimeError
-call_nonexistent_static_test/02: MissingCompileTimeError
-call_nonexistent_static_test/03: MissingCompileTimeError
-call_nonexistent_static_test/04: MissingCompileTimeError
-call_nonexistent_static_test/05: MissingCompileTimeError
-call_nonexistent_static_test/06: MissingCompileTimeError
-call_nonexistent_static_test/07: MissingCompileTimeError
-call_nonexistent_static_test/08: MissingCompileTimeError
-call_nonexistent_static_test/09: MissingCompileTimeError
-call_nonexistent_static_test/10: MissingCompileTimeError
-call_with_no_such_method_test: CompileTimeError # Issue 31402 (Invocation arguments)
-callable_test/none: CompileTimeError # Issue 31402 (Variable declaration)
-cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt1_test: RuntimeError
-cha_deopt2_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt2_test: RuntimeError
-cha_deopt3_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt3_test: RuntimeError
-check_member_static_test/01: MissingCompileTimeError
-check_method_override_test/01: MissingCompileTimeError
-check_method_override_test/02: MissingCompileTimeError
-class_literal_static_test/12: MissingCompileTimeError
-class_literal_static_test/13: MissingCompileTimeError
-class_literal_static_test/17: MissingCompileTimeError
-class_literal_static_test/18: MissingCompileTimeError
-class_literal_static_test/19: MissingCompileTimeError
-class_literal_static_test/20: MissingCompileTimeError
-class_literal_static_test/21: MissingCompileTimeError
-class_literal_static_test/22: MissingCompileTimeError
-class_literal_static_test/24: MissingCompileTimeError
-class_literal_static_test/25: MissingCompileTimeError
-class_literal_test/12: MissingCompileTimeError
-class_literal_test/13: MissingCompileTimeError
-class_literal_test/17: MissingCompileTimeError
-class_literal_test/18: MissingCompileTimeError
-class_literal_test/19: MissingCompileTimeError
-class_literal_test/20: MissingCompileTimeError
-class_literal_test/21: MissingCompileTimeError
-class_literal_test/22: MissingCompileTimeError
-class_literal_test/24: MissingCompileTimeError
-class_literal_test/25: MissingCompileTimeError
-class_override_test: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
-compile_time_constant_c_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-compile_time_constant_k_test/01: MissingCompileTimeError
-compile_time_constant_k_test/02: MissingCompileTimeError
-compile_time_constant_k_test/03: MissingCompileTimeError
-compile_time_constant_o_test/01: MissingCompileTimeError
-compile_time_constant_o_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_o_test/02: MissingCompileTimeError
-compile_time_constant_o_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_static2_test/04: MissingCompileTimeError
-compile_time_constant_static3_test/04: MissingCompileTimeError
-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 (Field declaration)
-conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_method_invocation_test/12: MissingCompileTimeError
-conditional_method_invocation_test/13: MissingCompileTimeError
-conditional_property_access_test/10: MissingCompileTimeError
-conditional_property_access_test/11: MissingCompileTimeError
-conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
-config_import_corelib_test: CompileTimeError # Issue 31533
-config_import_test: RuntimeError # KernelVM bug: Configurable imports.
-const_constructor2_test/11: CompileTimeError # Issue 31402 (Invocation arguments)
-const_constructor2_test/12: CompileTimeError # Issue 31402 (Invocation arguments)
-const_constructor2_test/20: MissingCompileTimeError
-const_constructor2_test/22: MissingCompileTimeError
-const_constructor2_test/24: MissingCompileTimeError
-const_constructor_nonconst_field_test/01: MissingCompileTimeError # Fasta bug: Non-const expression in field initializer.
-const_dynamic_type_literal_test/02: MissingCompileTimeError
-const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-const_error_multiply_initialized_test/02: MissingCompileTimeError
-const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_factory_with_body_test/01: MissingCompileTimeError # Fasta bug: Const factory with body.
-const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field.
-const_list_test: RuntimeError
-const_locals_test: RuntimeError
-const_map2_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_map3_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_map4_test: RuntimeError
-const_native_factory_test: MissingCompileTimeError
-const_native_factory_test/01: MissingCompileTimeError # Fasta bug: Issue 29763
-const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
-const_optional_args_test/01: MissingCompileTimeError # Fasta bug: Default parameter values must be const.
-const_redirecting_factory_test: CompileTimeError # Issue 31402 (Field declaration)
-const_string_test: RuntimeError
-const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_types_test/01: MissingCompileTimeError
-const_types_test/02: MissingCompileTimeError
-const_types_test/03: MissingCompileTimeError
-const_types_test/04: MissingCompileTimeError
-const_types_test/05: MissingCompileTimeError
-const_types_test/06: MissingCompileTimeError
-const_types_test/13: MissingCompileTimeError
-const_types_test/34: MissingCompileTimeError
-const_types_test/35: MissingCompileTimeError
-const_types_test/39: MissingCompileTimeError
-const_types_test/40: MissingCompileTimeError
-constructor12_test: RuntimeError
-constructor13_test/01: MissingCompileTimeError
-constructor13_test/02: MissingCompileTimeError
-constructor3_test: Fail, OK, Pass
-constructor_duplicate_final_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/02: MissingCompileTimeError
-constructor_named_arguments_test/01: MissingCompileTimeError
-constructor_redirect1_negative_test: MissingCompileTimeError
-constructor_redirect1_negative_test/01: MissingCompileTimeError
-constructor_redirect1_negative_test/none: MissingCompileTimeError
-constructor_redirect2_negative_test: MissingCompileTimeError
-constructor_redirect2_test/01: MissingCompileTimeError # Fasta bug: Body on redirecting constructor.
-constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
-covariant_subtyping_test: CompileTimeError
-covariant_subtyping_test: RuntimeError
-create_unresolved_type_test/01: MissingCompileTimeError
-ct_const2_test: Pass, Crash # Flaky
-ct_const_test: RuntimeError
-cyclic_constructor_test/01: MissingCompileTimeError # Fasta bug: Cyclic constructor redirection.
-cyclic_type2_test: CompileTimeError
-cyclic_type2_test: Fail, OK
-cyclic_type_test/02: CompileTimeError
-cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
-cyclic_type_test/04: CompileTimeError
-cyclic_type_test/04: Fail, OK
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash
-cyclic_typedef_test/11: Crash
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_closurize_load_library_test: DartkCrash
-deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constant_list_test: RuntimeError
-deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/as_operation: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: Pass # Passes by mistake. Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/is_check: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/new: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new_before_load: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/new_generic1: CompileTimeError # Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/new_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/new_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/none: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/static_method: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/type_annotation_generic1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic1: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic4: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: Pass # Passes by mistake. Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: Pass # Passes by mistake. Deferred loading kernel issue 28335.
-deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_function_type_test: RuntimeError
-deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deferred_inheritance_constraints_test/redirecting_constructor: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inlined_test: RuntimeError
-deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_inval_code_test: RuntimeError
-deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/none: RuntimeError
-deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_mixin_test: RuntimeError
-deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_no_such_method_test: RuntimeError
-deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_only_constant_test: RuntimeError
-deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_optimized_test: RuntimeError
-deferred_redirecting_factory_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_redirecting_factory_test: RuntimeError
-deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_regression_22995_test: RuntimeError
-deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shadow_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shadow_load_library_test: RuntimeError
-deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shared_and_unshared_classes_test: RuntimeError
-deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_static_seperate_test: RuntimeError
-deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/as: RuntimeError
-deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/is: RuntimeError
-deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/none: RuntimeError
-deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/type_annotation: RuntimeError
-disassemble_test: Pass, Slow
-duplicate_export_negative_test: Fail # Issue 6134
-dynamic_prefix_core_test/01: MissingCompileTimeError
-dynamic_prefix_core_test/01: RuntimeError # KernelVM bug: Blocked on language issue 29125.
-dynamic_prefix_core_test/none: RuntimeError
-dynamic_test: RuntimeError
-dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
-emit_const_fields_test: CompileTimeError # Issue 31533
-empty_block_case_test: MissingCompileTimeError
-enum_private_test/02: MissingCompileTimeError
-example_constructor_test: Fail, OK
-external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-extract_type_arguments_test: RuntimeError # Issue 31371
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
-factory2_test/none: MissingCompileTimeError
-factory3_test/none: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-factory5_test/00: MissingCompileTimeError
-factory6_test/00: MissingCompileTimeError
-field3_test/01: MissingCompileTimeError
-field_initialization_order_test: Fail, OK
-field_method4_test: MissingCompileTimeError
-field_override2_test: MissingCompileTimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
-final_attempt_reinitialization_test/01: MissingCompileTimeError # Issue 29900
-final_attempt_reinitialization_test/02: MissingCompileTimeError # Issue 29900
-final_for_in_variable_test: MissingCompileTimeError
-final_param_test: MissingCompileTimeError
-final_super_field_set_test: MissingCompileTimeError
-final_variable_assignment_test/01: MissingCompileTimeError
-final_variable_assignment_test/02: MissingCompileTimeError
-final_variable_assignment_test/03: MissingCompileTimeError
-final_variable_assignment_test/04: MissingCompileTimeError
-first_class_types_literals_test/03: MissingCompileTimeError
-first_class_types_literals_test/04: MissingCompileTimeError
-first_class_types_literals_test/08: MissingCompileTimeError
-first_class_types_literals_test/09: MissingCompileTimeError
-first_class_types_test: RuntimeError
-flatten_test/05: MissingRuntimeError
-flatten_test/08: MissingRuntimeError
-flatten_test/09: MissingRuntimeError
-flatten_test/12: MissingRuntimeError
-for_in_side_effects_test/01: MissingCompileTimeError
-function_malformed_result_type_test/00: MissingCompileTimeError
-function_propagation_test: CompileTimeError # Issue 31402 (Variable declaration)
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure1_test: RuntimeError
-function_subtype_bound_closure2_test: RuntimeError
-function_subtype_bound_closure5_test: RuntimeError
-function_subtype_bound_closure5a_test: RuntimeError
-function_subtype_bound_closure6_test: RuntimeError
-function_subtype_bound_closure7_test: CompileTimeError # Issue 31402 (Variable declaration)
-function_subtype_bound_closure7_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast0_test: RuntimeError
-function_subtype_cast2_test: RuntimeError
-function_subtype_cast3_test: RuntimeError
-function_subtype_local1_test: RuntimeError
-function_subtype_local2_test: RuntimeError
-function_subtype_local5_test: RuntimeError
-function_subtype_not0_test: RuntimeError
-function_subtype_not2_test: RuntimeError
-function_subtype_not3_test: RuntimeError
-function_subtype_simple1_test: RuntimeError
-function_subtype_top_level1_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
-function_type/function_type0_test: RuntimeError
+f_bounded_quantification4_test: RuntimeError
 function_type/function_type10_test: RuntimeError
 function_type/function_type11_test: RuntimeError
-function_type/function_type12_test: RuntimeError
-function_type/function_type13_test: RuntimeError
 function_type/function_type14_test: RuntimeError
 function_type/function_type15_test: RuntimeError
-function_type/function_type16_test: RuntimeError
-function_type/function_type17_test: RuntimeError
 function_type/function_type18_test: RuntimeError
 function_type/function_type19_test: RuntimeError
-function_type/function_type1_test: RuntimeError
 function_type/function_type20_test: RuntimeError
 function_type/function_type21_test: RuntimeError
 function_type/function_type22_test: RuntimeError
@@ -571,62 +138,324 @@
 function_type/function_type47_test: RuntimeError
 function_type/function_type48_test: RuntimeError
 function_type/function_type49_test: RuntimeError
-function_type/function_type4_test: RuntimeError
 function_type/function_type50_test: RuntimeError
 function_type/function_type51_test: RuntimeError
-function_type/function_type52_test: RuntimeError
-function_type/function_type53_test: RuntimeError
 function_type/function_type54_test: RuntimeError
 function_type/function_type55_test: RuntimeError
-function_type/function_type56_test: RuntimeError
-function_type/function_type57_test: RuntimeError
 function_type/function_type58_test: RuntimeError
 function_type/function_type59_test: RuntimeError
-function_type/function_type5_test: RuntimeError
-function_type/function_type60_test: RuntimeError
-function_type/function_type61_test: RuntimeError
 function_type/function_type62_test: RuntimeError
 function_type/function_type63_test: RuntimeError
-function_type/function_type64_test: RuntimeError
-function_type/function_type65_test: RuntimeError
 function_type/function_type66_test: RuntimeError
 function_type/function_type67_test: RuntimeError
-function_type/function_type68_test: RuntimeError
-function_type/function_type69_test: RuntimeError
 function_type/function_type6_test: RuntimeError
 function_type/function_type70_test: RuntimeError
 function_type/function_type71_test: RuntimeError
-function_type/function_type72_test: RuntimeError
-function_type/function_type73_test: RuntimeError
 function_type/function_type74_test: RuntimeError
 function_type/function_type75_test: RuntimeError
-function_type/function_type76_test: RuntimeError
-function_type/function_type77_test: RuntimeError
 function_type/function_type78_test: RuntimeError
 function_type/function_type79_test: RuntimeError
 function_type/function_type7_test: RuntimeError
-function_type/function_type80_test: RuntimeError
-function_type/function_type81_test: RuntimeError
 function_type/function_type82_test: RuntimeError
 function_type/function_type83_test: RuntimeError
-function_type/function_type84_test: RuntimeError
-function_type/function_type85_test: RuntimeError
 function_type/function_type86_test: RuntimeError
 function_type/function_type87_test: RuntimeError
-function_type/function_type88_test: RuntimeError
-function_type/function_type89_test: RuntimeError
-function_type/function_type8_test: RuntimeError
 function_type/function_type90_test: RuntimeError
 function_type/function_type91_test: RuntimeError
-function_type/function_type92_test: RuntimeError
-function_type/function_type93_test: RuntimeError
 function_type/function_type94_test: RuntimeError
 function_type/function_type95_test: RuntimeError
-function_type/function_type96_test: RuntimeError
-function_type/function_type97_test: RuntimeError
 function_type/function_type98_test: RuntimeError
 function_type/function_type99_test: RuntimeError
-function_type/function_type9_test: RuntimeError
+known_identifier_usage_error_test/none: RuntimeError # Issue 28814
+malbounded_redirecting_factory_test/03: Fail
+malbounded_redirecting_factory_test/04: Fail
+malbounded_type_test_test/03: Fail
+malbounded_type_test_test/04: Fail
+mixin_invalid_bound2_test/08: Fail
+mixin_invalid_bound2_test/09: Fail
+mixin_invalid_bound2_test/10: Fail
+mixin_invalid_bound_test/06: Fail
+mixin_invalid_bound_test/07: Fail
+recursive_mixin_test: Crash
+redirecting_factory_infinite_steps_test/01: Fail
+redirecting_factory_malbounded_test/01: Fail
+regress_22728_test: Fail # Dartk Issue 28498
+regress_22728_test: RuntimeError
+regress_30339_test: RuntimeError
+setter_override_test/01: MissingCompileTimeError
+setter_override_test/02: MissingCompileTimeError
+type_variable_bounds4_test/01: RuntimeError
+
+[ $compiler == dartk && $runtime == vm && !$checked && $strong ]
+bool_check_test: RuntimeError
+bool_condition_check_test: RuntimeError
+callable_test/none: RuntimeError
+checked_setter2_test: RuntimeError
+checked_setter_test: RuntimeError
+compile_time_constant_static2_test/04: MissingCompileTimeError
+compile_time_constant_static3_test/04: MissingCompileTimeError
+conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
+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
+field_override_optimization_test: RuntimeError
+field_type_check2_test/01: MissingRuntimeError
+function_subtype_setter0_test: RuntimeError
+generic_list_checked_test: RuntimeError
+if_null_precedence_test/none: RuntimeError
+type_error_test: RuntimeError # Issue 31402 (Variable declaration)
+
+# ===== dartk + vm status lines =====
+[ $compiler == dartk && $runtime == vm && $strong ]
+abstract_factory_constructor_test/00: MissingCompileTimeError
+abstract_getter_test/01: MissingCompileTimeError
+abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
+abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
+abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError
+abstract_syntax_test/00: MissingCompileTimeError
+additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
+additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
+additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
+arithmetic2_test: RuntimeError # Throws CastError instead of TypeError
+assertion_initializer_test: CompileTimeError # Issue 31402 (Assert statement)
+async_await_syntax_test/c10a: MissingCompileTimeError
+async_await_syntax_test/d08b: MissingCompileTimeError
+async_await_syntax_test/d10a: MissingCompileTimeError
+async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
+async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
+async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
+async_return_types_test/nestedFuture: MissingCompileTimeError
+async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
+async_return_types_test/wrongReturnType: MissingCompileTimeError
+async_star_cancel_while_paused_test: RuntimeError
+async_star_pause_test: Fail, OK
+async_star_regression_2238_test: RuntimeError
+async_star_regression_23116_test: RuntimeError
+async_star_regression_fisk_test: RuntimeError
+async_star_test/01: CompileTimeError # Issue 2238.
+async_star_test/01: Pass
+async_star_test/01: RuntimeError
+async_star_test/02: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/03: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/04: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/05: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+await_test: CompileTimeError # Issue 31541
+bad_named_parameters2_test/01: MissingCompileTimeError
+bad_named_parameters_test/01: MissingCompileTimeError
+bad_named_parameters_test/02: MissingCompileTimeError
+bad_named_parameters_test/03: MissingCompileTimeError
+bad_named_parameters_test/04: MissingCompileTimeError
+bad_named_parameters_test/05: MissingCompileTimeError
+bad_override_test/01: MissingCompileTimeError
+bad_override_test/02: MissingCompileTimeError
+built_in_identifier_prefix_test: CompileTimeError
+built_in_identifier_type_annotation_test/22: DartkCrash # Issue 28814
+built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/53: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/54: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/55: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/57: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/58: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/59: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/60: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/61: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/62: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/63: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/64: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/65: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/66: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/67: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/68: MissingCompileTimeError # Issue 28814
+call_function2_test: CompileTimeError # Issue 31402 (map literal)
+call_function_apply_test: CompileTimeError # Issue 31402 (Invocation arguments)
+call_function_test: CompileTimeError
+call_non_method_field_test/01: MissingCompileTimeError
+call_non_method_field_test/02: MissingCompileTimeError
+call_with_no_such_method_test: CompileTimeError # Issue 31402 (Invocation arguments)
+callable_test/none: CompileTimeError # Issue 31402 (Variable declaration)
+cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt1_test: RuntimeError
+cha_deopt2_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt2_test: RuntimeError
+cha_deopt3_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt3_test: RuntimeError
+check_member_static_test/01: MissingCompileTimeError
+closure_invoked_through_interface_target_field_test: MissingCompileTimeError
+closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
+compile_time_constant_c_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+compile_time_constant_k_test/01: MissingCompileTimeError
+compile_time_constant_k_test/02: MissingCompileTimeError
+compile_time_constant_k_test/03: MissingCompileTimeError
+compile_time_constant_o_test/01: MissingCompileTimeError
+compile_time_constant_o_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
+compile_time_constant_o_test/02: MissingCompileTimeError
+compile_time_constant_o_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
+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 (Field declaration)
+conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+config_import_corelib_test: CompileTimeError # Issue 31533
+config_import_test: RuntimeError # KernelVM bug: Configurable imports.
+const_constructor2_test/11: CompileTimeError # Issue 31402 (Invocation arguments)
+const_constructor2_test/12: CompileTimeError # Issue 31402 (Invocation arguments)
+const_constructor2_test/20: MissingCompileTimeError
+const_constructor2_test/22: MissingCompileTimeError
+const_constructor2_test/24: MissingCompileTimeError
+const_constructor_nonconst_field_test/01: MissingCompileTimeError # Fasta bug: Non-const expression in field initializer.
+const_dynamic_type_literal_test/02: MissingCompileTimeError
+const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
+const_factory_with_body_test/01: MissingCompileTimeError # Fasta bug: Const factory with body.
+const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field.
+const_list_test: RuntimeError
+const_locals_test: RuntimeError
+const_map2_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_map3_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_map4_test: RuntimeError
+const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
+const_optional_args_test/01: MissingCompileTimeError # Fasta bug: Default parameter values must be const.
+const_redirecting_factory_test: CompileTimeError # Issue 31402 (Field declaration)
+const_string_test: RuntimeError
+const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_types_test/34: MissingCompileTimeError
+const_types_test/35: MissingCompileTimeError
+const_types_test/39: MissingCompileTimeError
+const_types_test/40: MissingCompileTimeError
+constructor12_test: RuntimeError
+constructor3_test: Fail, OK, Pass
+constructor_redirect1_negative_test/01: MissingCompileTimeError
+constructor_redirect2_negative_test: MissingCompileTimeError
+constructor_redirect2_test/01: MissingCompileTimeError # Fasta bug: Body on redirecting constructor.
+constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
+covariant_subtyping_test: CompileTimeError
+covariant_subtyping_test: RuntimeError
+ct_const2_test: Pass, Crash # Flaky
+ct_const_test: RuntimeError
+cyclic_constructor_test/01: MissingCompileTimeError # Fasta bug: Cyclic constructor redirection.
+cyclic_type2_test: CompileTimeError
+cyclic_type2_test: Fail, OK
+cyclic_type_test/02: CompileTimeError
+cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
+cyclic_type_test/04: CompileTimeError
+cyclic_type_test/04: Fail, OK
+cyclic_type_variable_test/01: MissingCompileTimeError
+cyclic_type_variable_test/02: MissingCompileTimeError
+cyclic_type_variable_test/03: MissingCompileTimeError
+cyclic_type_variable_test/04: MissingCompileTimeError
+cyclic_typedef_test/10: Crash
+cyclic_typedef_test/11: Crash
+default_factory2_test/01: MissingCompileTimeError
+default_factory_test/01: MissingCompileTimeError
+deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_closurize_load_library_test: DartkCrash
+deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constant_list_test: RuntimeError
+deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_type_annotation_test/new: CompileTimeError # Deferred loading kernel issue 28335.
+deferred_constraints_type_annotation_test/new_generic1: CompileTimeError # Deferred loading kernel issue 28335
+deferred_constraints_type_annotation_test/none: CompileTimeError # Deferred loading kernel issue 28335.
+deferred_constraints_type_annotation_test/static_method: CompileTimeError # Deferred loading kernel issue 28335.
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError # Deferred loading kernel issue 28335.
+deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_function_type_test: RuntimeError
+deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
+deferred_inheritance_constraints_test/redirecting_constructor: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inlined_test: RuntimeError
+deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_inval_code_test: RuntimeError
+deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_mixin_test: RuntimeError
+deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_no_such_method_test: RuntimeError
+deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_only_constant_test: RuntimeError
+deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_optimized_test: RuntimeError
+deferred_redirecting_factory_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_redirecting_factory_test: RuntimeError
+deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_shadow_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_shadow_load_library_test: RuntimeError
+deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_shared_and_unshared_classes_test: RuntimeError
+deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_static_seperate_test: RuntimeError
+deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+disassemble_test: Pass, Slow
+duplicate_export_negative_test: Fail # Issue 6134
+dynamic_prefix_core_test/none: CompileTimeError
+dynamic_test: RuntimeError
+dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
+emit_const_fields_test: CompileTimeError # Issue 31533
+example_constructor_test: Fail, OK
+external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
+external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
+external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
+extract_type_arguments_test: RuntimeError # Issue 31371
+f_bounded_quantification_test/01: MissingCompileTimeError
+f_bounded_quantification_test/02: MissingCompileTimeError
+factory2_test/03: MissingCompileTimeError
+factory4_test/00: MissingCompileTimeError
+field3_test/01: MissingCompileTimeError
+field_initialization_order_test: Fail, OK
+field_method4_test: MissingCompileTimeError
+field_override2_test: MissingCompileTimeError
+field_override_test/00: MissingCompileTimeError
+field_override_test/01: MissingCompileTimeError
+first_class_types_test: RuntimeError
+flatten_test/05: MissingRuntimeError
+flatten_test/08: MissingRuntimeError
+flatten_test/09: MissingRuntimeError
+flatten_test/12: MissingRuntimeError
+for_in_side_effects_test/01: MissingCompileTimeError
+function_propagation_test: CompileTimeError # Issue 31402 (Variable declaration)
+function_subtype3_test: RuntimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
+function_subtype_bound_closure7_test: CompileTimeError # Issue 31402 (Variable declaration)
+function_subtype_bound_closure7_test: RuntimeError
+function_subtype_call1_test: RuntimeError
+function_subtype_call2_test: RuntimeError
+function_subtype_cast0_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
+function_subtype_checked0_test: RuntimeError
+function_subtype_inline2_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
+function_subtype_not0_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
+function_subtype_simple1_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
+function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
 function_type_alias2_test: RuntimeError
 function_type_alias3_test: RuntimeError
@@ -640,9 +469,6 @@
 generic_function_bounds_test: CompileTimeError
 generic_function_dcall_test: CompileTimeError
 generic_function_dcall_test: RuntimeError
-generic_function_type_as_type_argument_test/02: Pass # For the wrong reason, issue 30931
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError, OK # No type inference
-generic_function_typedef2_test/04: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_list_checked_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -651,81 +477,39 @@
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_tearoff_specialization_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_tearoff_specialization_test: RuntimeError
-generic_methods_unused_parameter_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_unused_parameter_test: RuntimeError
+generic_methods_unused_parameter_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_tearoff_test: CompileTimeError
 generic_tearoff_test: RuntimeError
 generic_test: RuntimeError
-getter_no_setter2_test/01: MissingCompileTimeError
-getter_no_setter2_test/03: MissingCompileTimeError
-getter_no_setter_test/01: MissingCompileTimeError
-getter_no_setter_test/03: MissingCompileTimeError
 getter_override_test/03: MissingCompileTimeError
 hello_dart_test: Crash # error: expected: cls.is_type_finalized()
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
 identical_const_test/04: MissingCompileTimeError
-if_null_assignment_behavior_test/13: MissingCompileTimeError
-if_null_assignment_behavior_test/15: MissingCompileTimeError
 if_null_evaluation_order_test: Pass
-if_null_precedence_test/none: RuntimeError
 implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/02: MissingCompileTimeError
 implicit_this_test/04: MissingCompileTimeError
-import_combinators2_test/00: MissingCompileTimeError
-import_self_test/01: MissingCompileTimeError
-initializing_formal_final_test: MissingCompileTimeError
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instantiate_tearoff_after_contravariance_check_test: CompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 instantiate_tearoff_test: CompileTimeError
-interface_test/00: MissingCompileTimeError
 invocation_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
-is_malformed_type_test/95: MissingCompileTimeError
-is_malformed_type_test/97: MissingCompileTimeError
-is_malformed_type_test/99: MissingCompileTimeError
-is_not_class2_test/01: MissingCompileTimeError
-isnot_malformed_type_test/01: MissingCompileTimeError
-issue11724_test/01: MissingCompileTimeError
 issue13179_test: CompileTimeError # Issue 31402 (Parameter default value)
-issue15606_test/01: MissingCompileTimeError
 issue18628_2_test/01: MissingCompileTimeError
 issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+issue_25671a_test/01: CompileTimeError # Test assumes Dart 1.0 semantics
 issue_25671b_test/01: DartkCrash
-known_identifier_prefix_error_test/09: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/10: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/11: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/12: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/13: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/14: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/15: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/16: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/17: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/18: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/19: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/20: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/21: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/22: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/23: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/24: MissingCompileTimeError # Issue 28814
 language_2/least_upper_bound_expansive_test/none: CompileTimeError
 least_upper_bound_expansive_test/none: CompileTimeError
-library_ambiguous_test/00: MissingCompileTimeError
-library_ambiguous_test/01: MissingCompileTimeError
-library_ambiguous_test/02: MissingCompileTimeError
-library_ambiguous_test/03: MissingCompileTimeError
-library_ambiguous_test/04: MissingCompileTimeError
 library_env_test/has_html_support: RuntimeError # KernelVM bug: Configurable imports.
 library_env_test/has_no_io_support: RuntimeError # KernelVM bug: Configurable imports.
 library_env_test/has_no_mirror_support: RuntimeError
 list_is_test: RuntimeError
-list_literal_syntax_test/01: MissingCompileTimeError
-list_literal_syntax_test/02: MissingCompileTimeError
-list_literal_syntax_test/03: MissingCompileTimeError
 local_function2_test/none: RuntimeError
 local_function3_test/none: RuntimeError
 local_function_test/01: MissingCompileTimeError
@@ -750,60 +534,9 @@
 malbounded_type_test_test/00: MissingCompileTimeError
 malbounded_type_test_test/01: MissingCompileTimeError
 malbounded_type_test_test/02: MissingCompileTimeError
-malformed2_test/01: MissingCompileTimeError
-malformed2_test/02: MissingCompileTimeError
-malformed2_test/03: MissingCompileTimeError
-malformed2_test/04: MissingCompileTimeError
-malformed2_test/05: MissingCompileTimeError
-malformed2_test/06: MissingCompileTimeError
-malformed2_test/07: MissingCompileTimeError
-malformed2_test/08: MissingCompileTimeError
-malformed2_test/09: MissingCompileTimeError
-malformed2_test/10: MissingCompileTimeError
-malformed2_test/11: MissingCompileTimeError
-malformed2_test/12: MissingCompileTimeError
-malformed2_test/13: MissingCompileTimeError
-malformed_bound_test/00: MissingCompileTimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: MissingCompileTimeError
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_test/00: MissingCompileTimeError
-malformed_test/01: MissingCompileTimeError
-malformed_test/02: MissingCompileTimeError
-malformed_test/03: MissingCompileTimeError
-malformed_test/04: MissingCompileTimeError
-malformed_test/05: MissingCompileTimeError
-malformed_test/06: MissingCompileTimeError
-malformed_test/07: MissingCompileTimeError
-malformed_test/08: MissingCompileTimeError
-malformed_test/09: MissingCompileTimeError
-malformed_test/10: MissingCompileTimeError
-malformed_test/11: MissingCompileTimeError
-malformed_test/12: MissingCompileTimeError
-malformed_test/13: MissingCompileTimeError
-malformed_test/14: MissingCompileTimeError
-malformed_test/15: MissingCompileTimeError
-malformed_test/16: MissingCompileTimeError
-malformed_test/17: MissingCompileTimeError
-malformed_test/18: MissingCompileTimeError
-malformed_test/19: MissingCompileTimeError
-malformed_test/20: MissingCompileTimeError
-malformed_test/21: MissingCompileTimeError
-malformed_test/22: MissingCompileTimeError
-malformed_test/23: MissingCompileTimeError
-malformed_test/24: MissingCompileTimeError
-malformed_type_test: MissingCompileTimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-map_literal3_test/04: MissingCompileTimeError
-method_override2_test/00: MissingCompileTimeError
-method_override2_test/01: MissingCompileTimeError
-method_override2_test/02: MissingCompileTimeError
-method_override2_test/03: MissingCompileTimeError
-method_override3_test/00: MissingCompileTimeError
-method_override3_test/01: MissingCompileTimeError
-method_override3_test/02: MissingCompileTimeError
 method_override4_test/01: MissingCompileTimeError
 method_override4_test/02: MissingCompileTimeError
 method_override4_test/03: MissingCompileTimeError
@@ -816,15 +549,11 @@
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
-mixin_illegal_constructor_test/13: MissingCompileTimeError
-mixin_illegal_constructor_test/14: MissingCompileTimeError
-mixin_illegal_constructor_test/15: MissingCompileTimeError
-mixin_illegal_constructor_test/16: MissingCompileTimeError
-mixin_illegal_static_access_test/01: MissingCompileTimeError
-mixin_illegal_static_access_test/02: MissingCompileTimeError
+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_illegal_super_use_test: Skip # Issues 24478 and 23773
 mixin_illegal_superclass_test: Skip # Issues 24478 and 23773
-mixin_illegal_syntax_test/13: MissingCompileTimeError
 mixin_invalid_bound2_test/02: MissingCompileTimeError
 mixin_invalid_bound2_test/03: MissingCompileTimeError
 mixin_invalid_bound2_test/04: MissingCompileTimeError
@@ -867,53 +596,24 @@
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
 mixin_type_parameters_errors_test/05: MissingCompileTimeError
-mixin_with_two_implicit_constructors_test: MissingCompileTimeError
 mock_writable_final_private_field_test: RuntimeError # Issue 30849
 named_constructor_test/01: MissingCompileTimeError
 named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
-named_constructor_test/03: MissingCompileTimeError
-named_parameters2_test: MissingCompileTimeError
-named_parameters3_test: MissingCompileTimeError
-named_parameters4_test: MissingCompileTimeError
-named_parameters_aggregated_test/05: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
 named_parameters_default_eq_test/none: RuntimeError
-named_parameters_test/01: MissingCompileTimeError
 named_parameters_test/02: MissingCompileTimeError
-named_parameters_test/03: MissingCompileTimeError
 named_parameters_test/04: MissingCompileTimeError
-named_parameters_test/05: MissingCompileTimeError
 named_parameters_test/06: MissingCompileTimeError
-named_parameters_test/07: MissingCompileTimeError
 named_parameters_test/08: MissingCompileTimeError
-named_parameters_test/09: MissingCompileTimeError
 named_parameters_test/10: MissingCompileTimeError
 nested_generic_closure_test: RuntimeError
-new_expression_type_args_test/00: MissingCompileTimeError
-new_expression_type_args_test/01: MissingCompileTimeError
-new_expression_type_args_test/02: MissingCompileTimeError
-new_prefix_test/01: MissingCompileTimeError
 no_main_test/01: DartkCrash
 no_main_test/01: Skip
-no_such_constructor_test/01: MissingCompileTimeError
-not_enough_positional_arguments_test/00: MissingCompileTimeError
-not_enough_positional_arguments_test/01: MissingCompileTimeError
-not_enough_positional_arguments_test/02: MissingCompileTimeError
-not_enough_positional_arguments_test/03: MissingCompileTimeError
-not_enough_positional_arguments_test/05: MissingCompileTimeError
-not_enough_positional_arguments_test/06: MissingCompileTimeError
-not_enough_positional_arguments_test/07: MissingCompileTimeError
 null_no_such_method_test: CompileTimeError # Issue 31533
-on_catch_malformed_type_test: MissingCompileTimeError
-optional_named_parameters_test/01: MissingCompileTimeError
 optional_named_parameters_test/02: MissingCompileTimeError
-optional_named_parameters_test/03: MissingCompileTimeError
 optional_named_parameters_test/04: MissingCompileTimeError
-optional_named_parameters_test/05: MissingCompileTimeError
 optional_named_parameters_test/06: MissingCompileTimeError
-optional_named_parameters_test/07: MissingCompileTimeError
 optional_named_parameters_test/08: MissingCompileTimeError
-optional_named_parameters_test/09: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
 override_inheritance_abstract_test/02: MissingCompileTimeError
@@ -935,38 +635,20 @@
 override_inheritance_abstract_test/24: MissingCompileTimeError
 override_inheritance_abstract_test/25: MissingCompileTimeError
 override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
-override_inheritance_field_test/05: MissingCompileTimeError
-override_inheritance_field_test/07: MissingCompileTimeError
-override_inheritance_field_test/08: MissingCompileTimeError
-override_inheritance_field_test/09: MissingCompileTimeError
-override_inheritance_field_test/10: MissingCompileTimeError
-override_inheritance_field_test/11: MissingCompileTimeError
-override_inheritance_field_test/28: MissingCompileTimeError
-override_inheritance_field_test/30: MissingCompileTimeError
-override_inheritance_field_test/31: MissingCompileTimeError
-override_inheritance_field_test/32: MissingCompileTimeError
-override_inheritance_field_test/33: MissingCompileTimeError
-override_inheritance_field_test/33a: MissingCompileTimeError
-override_inheritance_field_test/34: MissingCompileTimeError
+override_inheritance_field_test/04: CompileTimeError # Issue 31616
+override_inheritance_field_test/06: CompileTimeError # Issue 31616
+override_inheritance_field_test/26: CompileTimeError # Issue 31616
+override_inheritance_field_test/29: CompileTimeError # Issue 31616
 override_inheritance_field_test/44: MissingCompileTimeError
 override_inheritance_field_test/47: MissingCompileTimeError
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/02: CompileTimeError # Issue 31616
-override_inheritance_method_test/04: MissingCompileTimeError
-override_inheritance_method_test/05: MissingCompileTimeError
-override_inheritance_method_test/06: MissingCompileTimeError
-override_inheritance_method_test/11: MissingCompileTimeError
-override_inheritance_method_test/12: MissingCompileTimeError
-override_inheritance_method_test/13: MissingCompileTimeError
-override_inheritance_method_test/14: MissingCompileTimeError
-override_inheritance_method_test/19: MissingCompileTimeError
-override_inheritance_method_test/20: MissingCompileTimeError
-override_inheritance_method_test/21: MissingCompileTimeError
-override_inheritance_method_test/28: CompileTimeError # Issue 31616
-override_inheritance_method_test/29: CompileTimeError # Issue 31616
+override_inheritance_generic_test/02: CompileTimeError
+override_inheritance_method_test/17: CompileTimeError
+override_inheritance_method_test/18: CompileTimeError
+override_inheritance_method_test/28: CompileTimeError
+override_inheritance_method_test/29: CompileTimeError
 override_inheritance_mixed_test/06: MissingCompileTimeError
 override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
@@ -979,42 +661,23 @@
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
 override_inheritance_no_such_method_test/13: MissingCompileTimeError
 parser_quirks_test: CompileTimeError # Issue 31533
-part2_test/01: MissingCompileTimeError
-prefix16_test/00: MissingCompileTimeError
-prefix16_test/01: MissingCompileTimeError
-prefix22_test/00: MissingCompileTimeError
-prefix23_test/00: MissingCompileTimeError
-private_access_test/01: MissingCompileTimeError
-private_access_test/02: MissingCompileTimeError
-private_access_test/03: MissingCompileTimeError
-private_access_test/04: MissingCompileTimeError
-private_access_test/05: MissingCompileTimeError
-private_access_test/06: MissingCompileTimeError
 recursive_generic_test: RuntimeError
 recursive_mixin_test: Crash
 recursive_mixin_test: RuntimeError
+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.
 redirecting_factory_default_values_test/03: MissingCompileTimeError
-redirecting_factory_incompatible_signature_test/01: MissingCompileTimeError
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
+redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: Crash, Pass
-redirecting_factory_reflection_test: RuntimeError
-regress_13494_test: MissingCompileTimeError
-regress_17382_test: MissingCompileTimeError
-regress_19413_test: MissingCompileTimeError
-regress_21793_test/01: MissingCompileTimeError
-regress_22438_test: MissingCompileTimeError
 regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-regress_22936_test: MissingCompileTimeError
 regress_22976_test/01: CompileTimeError # Issue 31402 (Variable declaration)
 regress_23089_test: Crash
 regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_23408_test: RuntimeError
 regress_25550_test: CompileTimeError # Issue 31402 (Variable declaration)
-regress_27572_test: MissingCompileTimeError
 regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28217_test/01: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28217_test/none: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
 regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -1024,68 +687,35 @@
 setter4_test: MissingCompileTimeError # Issue 14736
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
-static_field3_test/01: MissingCompileTimeError
-static_field3_test/02: MissingCompileTimeError
-static_field3_test/03: MissingCompileTimeError
-static_field3_test/04: MissingCompileTimeError
-static_final_field2_test/01: MissingCompileTimeError
-static_getter_no_setter1_test/01: MissingCompileTimeError
-static_getter_no_setter2_test/01: MissingCompileTimeError
-static_setter_get_test/01: MissingCompileTimeError
 string_interpolate_test: CompileTimeError # Issue 31533
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
-super_call4_test/01: MissingCompileTimeError
-super_call4_test/02: MissingCompileTimeError
-super_call4_test/03: MissingCompileTimeError
-super_call4_test/04: MissingCompileTimeError
-super_getter_setter_test/01: MissingCompileTimeError
-super_getter_setter_test/02: MissingCompileTimeError
-super_getter_setter_test/03: MissingCompileTimeError
-super_no_such_method1_test/01: MissingCompileTimeError
-super_no_such_method2_test/01: MissingCompileTimeError
-super_no_such_method3_test/01: MissingCompileTimeError
-super_no_such_method4_test/01: MissingCompileTimeError
-super_no_such_method5_test/01: MissingCompileTimeError
-super_operator_index5_test/01: MissingCompileTimeError
-super_operator_index5_test/02: MissingCompileTimeError
-super_operator_index_test/01: MissingCompileTimeError
-super_operator_index_test/02: MissingCompileTimeError
-super_operator_index_test/03: MissingCompileTimeError
-super_operator_index_test/04: MissingCompileTimeError
-super_operator_index_test/05: MissingCompileTimeError
-super_operator_index_test/06: MissingCompileTimeError
-super_operator_index_test/07: MissingCompileTimeError
+super_call4_test: CompileTimeError
+super_getter_setter_test: CompileTimeError
+super_no_such_method1_test: CompileTimeError
+super_no_such_method2_test: CompileTimeError
+super_no_such_method3_test: CompileTimeError
+super_no_such_method4_test: CompileTimeError
+super_no_such_method5_test: CompileTimeError
+super_operator_index5_test: CompileTimeError
+super_operator_index6_test: CompileTimeError
+super_operator_index7_test: CompileTimeError
+super_operator_index8_test: CompileTimeError
 super_test: Fail, OK
 switch_bad_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_bad_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-switch_fallthru_test/01: MissingCompileTimeError
 syntax_test/28: MissingCompileTimeError
 syntax_test/29: MissingCompileTimeError
 syntax_test/30: MissingCompileTimeError
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
-top_level_getter_no_setter1_test: MissingCompileTimeError
-top_level_getter_no_setter2_test: MissingCompileTimeError
-transitive_private_library_access_test: MissingCompileTimeError
-try_catch_on_syntax_test/07: MissingCompileTimeError
-try_catch_on_syntax_test/10: MissingCompileTimeError
-try_catch_on_syntax_test/11: MissingCompileTimeError
-try_catch_syntax_test/08: MissingCompileTimeError
-type_error_test: RuntimeError # Issue 31402 (Variable declaration)
 type_literal_test: RuntimeError
-type_parameter_test/01: MissingCompileTimeError
-type_parameter_test/02: MissingCompileTimeError
-type_parameter_test/06: MissingCompileTimeError
-type_parameter_test/07: MissingCompileTimeError
-type_parameter_test/08: MissingCompileTimeError
-type_parameter_test/09: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
 type_promotion_functions_test/04: CompileTimeError # Issue 31537
@@ -1100,31 +730,14 @@
 type_variable_bounds2_test: MissingCompileTimeError
 type_variable_bounds3_test/00: MissingCompileTimeError
 type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/00: 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/07: MissingCompileTimeError
 type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/09: MissingCompileTimeError
-type_variable_bounds_test/10: MissingCompileTimeError
 type_variable_bounds_test/11: MissingCompileTimeError
-type_variable_conflict2_test/03: MissingCompileTimeError
-type_variable_conflict2_test/04: MissingCompileTimeError
-type_variable_scope2_test: MissingCompileTimeError
-type_variable_scope_test/00: MissingCompileTimeError
-type_variable_scope_test/01: MissingCompileTimeError
-type_variable_scope_test/04: MissingCompileTimeError
-type_variable_scope_test/05: MissingCompileTimeError
-type_variable_static_context_test: MissingCompileTimeError
-unresolved_default_constructor_test/01: MissingCompileTimeError
-unresolved_in_factory_test: MissingCompileTimeError
-unresolved_top_level_method_test: MissingCompileTimeError
-unresolved_top_level_var_test: MissingCompileTimeError
-vm/canonicalization_preserves_deopt_test: CompileTimeError # Issue 31402 (Assert statement)
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
 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.
@@ -1173,7 +786,7 @@
 void_type_usage_test/paren_for: CompileTimeError
 void_type_usage_test/paren_stmt: CompileTimeError
 void_type_usage_test/setter_assign: CompileTimeError
-wrong_number_type_arguments_test/*: MissingCompileTimeError
+wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
@@ -1184,8 +797,6 @@
 class_cycle_test/03: MissingCompileTimeError # Please triage.
 duplicate_implements_test/01: MissingCompileTimeError # Please triage.
 duplicate_implements_test/02: MissingCompileTimeError # Please triage.
-duplicate_implements_test/03: MissingCompileTimeError # Please triage.
-duplicate_implements_test/04: MissingCompileTimeError # Please triage.
 generic_methods_generic_function_result_test/01: MissingCompileTimeError # Please triage.
 issue23244_test: RuntimeError # Please triage.
 least_upper_bound_expansive_test/none: RuntimeError # Please triage.
@@ -1208,8 +819,10 @@
 cyclic_type_variable_test/none: Crash
 external_test/13: Crash
 instance_call_wrong_argument_count_negative_test: Crash # Issue(http://dartbug.com/31630)
-optional_named_parameters_test/06: Crash
-optional_named_parameters_test/08: Crash
+optional_named_parameters_test/02: Crash # Issue 31795
+optional_named_parameters_test/04: Crash # Issue 31795
+optional_named_parameters_test/06: Crash # Issue 31795
+optional_named_parameters_test/08: Crash # Issue 31795
 regress_29025_test: Crash
 tearoff_dynamic_test: Crash
 type_promotion_functions_test/05: Pass
@@ -1217,7 +830,6 @@
 type_promotion_functions_test/07: Pass
 type_promotion_functions_test/08: Pass
 type_promotion_functions_test/10: Pass
-vm/async_await_catch_stacktrace_test: Crash
 
 [ $compiler == dartkp && $mode == product && $runtime == dart_precompiled && $strong ]
 vm/type_vm_test/28: MissingRuntimeError
@@ -1248,26 +860,37 @@
 assert_initializer_test/47: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/48: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/none: RuntimeError # KernelVM bug: Constant evaluation.
+assertion_initializer_const_error2_test/cc01: Crash
 assertion_initializer_const_error2_test/cc02: Crash
-assertion_initializer_const_error_test/none: Crash
-assertion_initializer_const_function_test/01: Crash
-assertion_initializer_const_function_test/none: Crash
-assign_static_type_test/02: MissingCompileTimeError
+assertion_initializer_const_error2_test/cc03: Crash
+assertion_initializer_const_error2_test/cc04: Crash
+assertion_initializer_const_error2_test/cc05: Crash
+assertion_initializer_const_error2_test/cc06: Crash
+assertion_initializer_const_error2_test/cc07: Crash
+assertion_initializer_const_error2_test/cc08: Crash
+assertion_initializer_const_error2_test/cc09: Crash
+assertion_initializer_const_error2_test/cc10: Crash
+assertion_initializer_const_error2_test/cc11: Crash
+async_await_syntax_test/c03a: RuntimeError
+async_await_syntax_test/c09a: RuntimeError
+async_await_syntax_test/d03a: RuntimeError
+async_await_syntax_test/d09a: RuntimeError
 async_await_test: RuntimeError
 async_return_types_test/nestedFuture: Fail
-async_return_types_test/wrongTypeParameter: Fail
+async_return_types_test/none: RuntimeError
+async_star_take_reyield_test: RuntimeError
+asyncstar_yield_test: RuntimeError
+asyncstar_yieldstar_test: RuntimeError
+bug31436_test: RuntimeError
 compile_time_constant_checked_test/02: MissingCompileTimeError
 const_constructor2_test/20: MissingCompileTimeError
 const_constructor2_test/22: MissingCompileTimeError
 const_constructor2_test/24: MissingCompileTimeError
-const_init2_test/02: MissingCompileTimeError
+covariance_type_parameter_test/01: RuntimeError
+covariance_type_parameter_test/02: RuntimeError
+covariance_type_parameter_test/03: RuntimeError
+covariance_type_parameter_test/none: RuntimeError
 default_factory2_test/01: Fail
-factory_redirection_test/08: Fail
-factory_redirection_test/09: Fail
-factory_redirection_test/10: Fail
-factory_redirection_test/12: Fail
-factory_redirection_test/13: Fail
-factory_redirection_test/14: Fail
 function_subtype_checked0_test: Pass
 function_subtype_closure0_test: Pass
 function_subtype_closure1_test: Pass
@@ -1275,488 +898,12 @@
 function_subtype_inline1_test: Pass
 function_subtype_inline2_test: Pass
 function_subtype_setter0_test: Pass
-function_type2_test: RuntimeError
-generic_functions_test: Pass # Issue 25869
-generic_local_functions_test: Pass # Issue 25869
-generic_methods_function_type_test: Pass # Issue 25869
-generic_methods_generic_function_parameter_test: Pass # Issue 25869
-generic_methods_new_test: Pass # Issue 25869
-generic_methods_test: Pass # Issue 25869
-list_literal1_test/01: MissingCompileTimeError
-malbounded_redirecting_factory_test/03: Fail
-malbounded_redirecting_factory_test/04: Fail
-malbounded_type_cast_test: RuntimeError
-malbounded_type_test_test/03: Fail
-malbounded_type_test_test/04: Fail
-malformed2_test/00: RuntimeError
-malformed2_test/01: MissingCompileTimeError
-map_literal1_test/01: MissingCompileTimeError
-mixin_invalid_bound2_test/08: Fail
-mixin_invalid_bound2_test/09: Fail
-mixin_invalid_bound2_test/10: Fail
-mixin_invalid_bound_test/06: Fail
-mixin_invalid_bound_test/07: Fail
-redirecting_factory_infinite_steps_test/01: Fail
-redirecting_factory_malbounded_test/01: Fail
-regress_22728_test: Fail # Dartk Issue 28498
-regress_22728_test: RuntimeError
-regress_26133_test: RuntimeError
-regress_30339_test: Crash
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-type_parameter_test/05: MissingCompileTimeError
-type_parameter_test/none: RuntimeError
-type_variable_bounds4_test/01: RuntimeError
-
-[ $compiler == dartkp && $runtime == dart_precompiled && !$checked && $strong ]
-assertion_initializer_const_error_test/01: MissingCompileTimeError
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-callable_test/none: RuntimeError
-checked_setter2_test: RuntimeError
-checked_setter_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
-deferred_constraints_type_annotation_test/type_annotation1: Crash # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic1: Crash # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic4: Crash # KernelVM bug: Deferred loading kernel issue 28335.
-implicit_downcast_during_assignment_test: RuntimeError
-implicit_downcast_during_combiner_test: RuntimeError
-implicit_downcast_during_compound_assignment_test: RuntimeError
-implicit_downcast_during_conditional_expression_test: RuntimeError
-implicit_downcast_during_do_test: RuntimeError
-implicit_downcast_during_for_condition_test: RuntimeError
-implicit_downcast_during_for_initializer_expression_test: RuntimeError
-implicit_downcast_during_for_initializer_var_test: RuntimeError
-implicit_downcast_during_if_null_assignment_test: RuntimeError
-implicit_downcast_during_if_statement_test: RuntimeError
-implicit_downcast_during_list_literal_test: RuntimeError
-implicit_downcast_during_logical_expression_test: RuntimeError
-implicit_downcast_during_map_literal_test: RuntimeError
-implicit_downcast_during_not_test: RuntimeError
-implicit_downcast_during_return_async_test: RuntimeError
-implicit_downcast_during_return_test: RuntimeError
-implicit_downcast_during_variable_declaration_test: RuntimeError
-implicit_downcast_during_while_statement_test: RuntimeError
-implicit_downcast_during_yield_star_test: RuntimeError
-implicit_downcast_during_yield_test: RuntimeError
-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
-private_super_constructor_test/01: 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.
-redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
-regress_20394_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
-regress_30339_test: RuntimeError
-vm/causal_async_exception_stack_test: RuntimeError
-
-# ==== dartkp + dart_precompiled status lines ====
-[ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
-abstract_beats_arguments_test: MissingCompileTimeError
-abstract_exact_selector_test/01: MissingCompileTimeError
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
-assert_message_test: CompileTimeError # Issue 31402 (Assert statement)
-assert_with_type_test_or_cast_test: Pass, Crash
-assertion_initializer_const_error_test/01: Pass
-assertion_initializer_test: CompileTimeError # Issue 31402 (Assert statement)
-assertion_test: CompileTimeError # Issue 31402 (Assert statement)
-assertion_test: RuntimeError # Issue 30326
-assign_to_type_test/01: MissingCompileTimeError
-assign_to_type_test/02: MissingCompileTimeError
-assign_to_type_test/03: MissingCompileTimeError
-assign_to_type_test/04: MissingCompileTimeError
-assign_top_method_test: MissingCompileTimeError
-async_await_syntax_test/c10a: MissingCompileTimeError
-async_await_syntax_test/d08b: MissingCompileTimeError
-async_await_syntax_test/d10a: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
-async_return_types_test/nestedFuture: MissingCompileTimeError
-async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
-async_return_types_test/wrongReturnType: MissingCompileTimeError
-async_star_cancel_while_paused_test: RuntimeError
-async_star_pause_test: Fail, OK
-async_star_regression_2238_test: RuntimeError
-async_star_regression_23116_test: RuntimeError
-async_star_regression_fisk_test: RuntimeError
-async_star_test/01: CompileTimeError # Issue 2238.
-async_star_test/01: Crash
-async_star_test/01: Pass
-async_star_test/02: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/02: RuntimeError
-async_star_test/03: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/04: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/05: CompileTimeError # Issue 31402 (Invocation arguments)
-async_star_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-await_test: CompileTimeError # Issue 31541
-bad_named_parameters2_test/01: MissingCompileTimeError
-bad_named_parameters_test/01: MissingCompileTimeError
-bad_named_parameters_test/02: MissingCompileTimeError
-bad_named_parameters_test/03: MissingCompileTimeError
-bad_named_parameters_test/04: Crash
-bad_named_parameters_test/04: MissingCompileTimeError
-bad_named_parameters_test/05: MissingCompileTimeError
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/06: MissingCompileTimeError
-bool_check_test: RuntimeError
-bool_condition_check_test: RuntimeError
-built_in_identifier_prefix_test: CompileTimeError
-built_in_identifier_type_annotation_test/22: Crash # Issue 28814
-built_in_identifier_type_annotation_test/22: DartkCrash # Issue 28814
-built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/53: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/54: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/55: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/57: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/58: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/59: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/60: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/61: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/62: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/63: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/64: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/65: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/66: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/67: MissingCompileTimeError # Issue 28814
-built_in_identifier_type_annotation_test/68: MissingCompileTimeError # Issue 28814
-call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/02: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/03: MissingCompileTimeError
-call_function2_test: CompileTimeError # Issue 31402 (map literal)
-call_function_apply_test: CompileTimeError # Issue 31402 (Invocation arguments)
-call_function_test: CompileTimeError
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
-call_nonexistent_constructor_test/01: MissingCompileTimeError
-call_nonexistent_constructor_test/02: MissingCompileTimeError
-call_nonexistent_static_test/01: MissingCompileTimeError
-call_nonexistent_static_test/02: MissingCompileTimeError
-call_nonexistent_static_test/03: MissingCompileTimeError
-call_nonexistent_static_test/04: MissingCompileTimeError
-call_nonexistent_static_test/05: MissingCompileTimeError
-call_nonexistent_static_test/06: MissingCompileTimeError
-call_nonexistent_static_test/07: MissingCompileTimeError
-call_nonexistent_static_test/08: MissingCompileTimeError
-call_nonexistent_static_test/09: MissingCompileTimeError
-call_nonexistent_static_test/10: MissingCompileTimeError
-call_with_no_such_method_test: CompileTimeError # Issue 31402 (Invocation arguments)
-callable_test/none: CompileTimeError # Issue 31402 (Variable declaration)
-cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt2_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt3_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-check_member_static_test/01: MissingCompileTimeError
-check_method_override_test/01: MissingCompileTimeError
-check_method_override_test/02: MissingCompileTimeError
-checked_setter2_test: MissingCompileTimeError
-checked_setter3_test/01: MissingCompileTimeError
-checked_setter3_test/02: MissingCompileTimeError
-checked_setter3_test/03: MissingCompileTimeError
-class_cycle_test/02: MissingCompileTimeError
-class_cycle_test/03: MissingCompileTimeError
-class_keyword_test/02: MissingCompileTimeError # Issue 13627
-class_keyword_test/02: Pass
-class_literal_static_test/12: MissingCompileTimeError
-class_literal_static_test/13: MissingCompileTimeError
-class_literal_static_test/17: MissingCompileTimeError
-class_literal_static_test/18: MissingCompileTimeError
-class_literal_static_test/19: MissingCompileTimeError
-class_literal_static_test/20: MissingCompileTimeError
-class_literal_static_test/21: MissingCompileTimeError
-class_literal_static_test/22: MissingCompileTimeError
-class_literal_static_test/24: MissingCompileTimeError
-class_literal_static_test/25: MissingCompileTimeError
-class_literal_test/12: MissingCompileTimeError
-class_literal_test/13: MissingCompileTimeError
-class_literal_test/17: MissingCompileTimeError
-class_literal_test/18: MissingCompileTimeError
-class_literal_test/19: MissingCompileTimeError
-class_literal_test/20: MissingCompileTimeError
-class_literal_test/21: MissingCompileTimeError
-class_literal_test/22: MissingCompileTimeError
-class_literal_test/24: MissingCompileTimeError
-class_literal_test/25: MissingCompileTimeError
-class_override_test: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
-compile_time_constant_c_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-compile_time_constant_k_test/01: MissingCompileTimeError
-compile_time_constant_k_test/02: MissingCompileTimeError
-compile_time_constant_k_test/03: MissingCompileTimeError
-compile_time_constant_o_test/01: MissingCompileTimeError
-compile_time_constant_o_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_o_test/02: MissingCompileTimeError
-compile_time_constant_o_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_static2_test/04: MissingCompileTimeError
-compile_time_constant_static3_test/04: MissingCompileTimeError
-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 (Field declaration)
-conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_method_invocation_test/12: MissingCompileTimeError
-conditional_method_invocation_test/13: MissingCompileTimeError
-conditional_property_access_test/10: MissingCompileTimeError
-conditional_property_access_test/11: MissingCompileTimeError
-conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
-config_import_corelib_test: CompileTimeError # Issue 31533
-config_import_test: RuntimeError # KernelVM bug: Configurable imports.
-const_constructor2_test/11: CompileTimeError # Issue 31402 (Invocation arguments)
-const_constructor2_test/12: CompileTimeError # Issue 31402 (Invocation arguments)
-const_constructor2_test/20: MissingCompileTimeError
-const_constructor2_test/22: MissingCompileTimeError
-const_constructor2_test/24: MissingCompileTimeError
-const_constructor_nonconst_field_test/01: MissingCompileTimeError # Fasta bug: Non-const expression in field initializer.
-const_dynamic_type_literal_test/02: MissingCompileTimeError
-const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-const_error_multiply_initialized_test/02: MissingCompileTimeError
-const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_evaluation_test: SkipByDesign
-const_factory_with_body_test/01: MissingCompileTimeError # Fasta bug: Const factory with body.
-const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field.
-const_list_test: RuntimeError
-const_map2_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_map3_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_map4_test: RuntimeError
-const_native_factory_test: MissingCompileTimeError
-const_native_factory_test/01: MissingCompileTimeError # Fasta bug: Issue 29763
-const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
-const_optional_args_test/01: MissingCompileTimeError # Fasta bug: Default parameter values must be const.
-const_redirecting_factory_test: CompileTimeError # Issue 31402 (Field declaration)
-const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_types_test/01: MissingCompileTimeError
-const_types_test/02: MissingCompileTimeError
-const_types_test/03: MissingCompileTimeError
-const_types_test/04: MissingCompileTimeError
-const_types_test/05: MissingCompileTimeError
-const_types_test/06: MissingCompileTimeError
-const_types_test/13: MissingCompileTimeError
-const_types_test/34: MissingCompileTimeError
-const_types_test/35: MissingCompileTimeError
-const_types_test/39: MissingCompileTimeError
-const_types_test/40: MissingCompileTimeError
-constructor12_test: RuntimeError
-constructor13_test/01: MissingCompileTimeError
-constructor13_test/02: MissingCompileTimeError
-constructor3_test: Fail, OK, Pass
-constructor_duplicate_final_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/02: MissingCompileTimeError
-constructor_named_arguments_test/01: MissingCompileTimeError
-constructor_redirect1_negative_test/01: MissingCompileTimeError
-constructor_redirect1_negative_test/none: MissingCompileTimeError
-constructor_redirect2_negative_test: MissingCompileTimeError
-constructor_redirect2_test/01: MissingCompileTimeError # Fasta bug: Body on redirecting constructor.
-constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
-covariant_subtyping_test: CompileTimeError
-covariant_subtyping_test: Crash
-create_unresolved_type_test/01: MissingCompileTimeError
-ct_const2_test: Skip # Incompatible flag: --compile_all
-ct_const_test: RuntimeError
-cyclic_constructor_test/01: MissingCompileTimeError # Fasta bug: Cyclic constructor redirection.
-cyclic_type2_test: Fail, OK
-cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
-cyclic_type_test/04: Fail, OK
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash
-cyclic_typedef_test/11: Crash
-deep_nesting1_negative_test: Skip # Issue 31158
-deep_nesting2_negative_test: Skip # Issue 31158
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test: SkipByDesign
-deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
-deferred_constraints_type_annotation_test/as_operation: Pass
-deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: Pass
-deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/is_check: Pass
-deferred_constraints_type_annotation_test/new: CompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: Pass
-deferred_constraints_type_annotation_test/new_generic1: CompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: Pass
-deferred_constraints_type_annotation_test/new_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: Pass
-deferred_constraints_type_annotation_test/none: CompileTimeError
-deferred_constraints_type_annotation_test/none: Pass
-deferred_constraints_type_annotation_test/static_method: CompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: Pass
-deferred_constraints_type_annotation_test/type_annotation_generic1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic1: Pass
-deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: Pass
-deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: Pass
-deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic4: Pass
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: Pass
-deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: Pass
-deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_global_test: Fail
-deferred_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deferred_inheritance_constraints_test/redirecting_constructor: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/01: CompileTimeError
-deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_redirecting_factory_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_redirecting_factory_test: Fail, Crash # Issue 23408
-deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shadow_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot
-duplicate_export_negative_test: Fail # Issue 6134
-duplicate_implements_test/01: MissingCompileTimeError
-duplicate_implements_test/02: MissingCompileTimeError
-duplicate_implements_test/03: MissingCompileTimeError
-duplicate_implements_test/04: MissingCompileTimeError
-dynamic_prefix_core_test/01: MissingCompileTimeError
-dynamic_prefix_core_test/01: RuntimeError # KernelVM bug: Issue 12478, Blocked on language issue 29125.
-dynamic_prefix_core_test/none: RuntimeError
-dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
-emit_const_fields_test: CompileTimeError # Issue 31533
-empty_block_case_test: MissingCompileTimeError
-enum_mirror_test: SkipByDesign
-enum_private_test/02: MissingCompileTimeError
-example_constructor_test: Fail, OK
-export_ambiguous_main_negative_test: Skip # Issue 29895
-export_ambiguous_main_negative_test: Fail # Issue 14763
-export_double_same_main_test: Skip # Issue 29895
-export_double_same_main_test: Crash # Issue 29895
-external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/24: Pass, CompileTimeError # Started to pass after switching to batch-mode.
-extract_type_arguments_test: RuntimeError # Issue 31371
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
-factory2_test/none: MissingCompileTimeError
-factory3_test: Crash
-factory3_test/01: Pass
-factory3_test/none: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-factory5_test/00: MissingCompileTimeError
-factory6_test/00: MissingCompileTimeError
-field3_test/01: MissingCompileTimeError
-field_increment_bailout_test: SkipByDesign
-field_initialization_order_test: Fail, OK
-field_method4_test: Crash
-field_method4_test: MissingCompileTimeError
-field_override2_test: MissingCompileTimeError
-field_override_optimization_test: RuntimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
-field_type_check2_test/01: MissingRuntimeError
-final_attempt_reinitialization_test/01: MissingCompileTimeError # Issue 29900
-final_attempt_reinitialization_test/02: MissingCompileTimeError # Issue 29900
-final_for_in_variable_test: MissingCompileTimeError
-final_param_test: MissingCompileTimeError
-final_super_field_set_test: MissingCompileTimeError
-final_variable_assignment_test/01: MissingCompileTimeError
-final_variable_assignment_test/02: MissingCompileTimeError
-final_variable_assignment_test/03: MissingCompileTimeError
-final_variable_assignment_test/04: MissingCompileTimeError
-first_class_types_literals_test/03: MissingCompileTimeError
-first_class_types_literals_test/04: MissingCompileTimeError
-first_class_types_literals_test/08: MissingCompileTimeError
-first_class_types_literals_test/09: MissingCompileTimeError
-first_class_types_test: RuntimeError
-flatten_test/05: MissingRuntimeError
-flatten_test/08: MissingRuntimeError
-flatten_test/09: MissingRuntimeError
-flatten_test/12: MissingRuntimeError
-for_in_side_effects_test/01: MissingCompileTimeError
-function_malformed_result_type_test/00: MissingCompileTimeError
-function_propagation_test: CompileTimeError # Issue 31402 (Variable declaration)
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure1_test: RuntimeError
-function_subtype_bound_closure2_test: RuntimeError
-function_subtype_bound_closure5_test: RuntimeError
-function_subtype_bound_closure5a_test: RuntimeError
-function_subtype_bound_closure6_test: RuntimeError
-function_subtype_bound_closure7_test: RuntimeError
-function_subtype_bound_closure7_test: CompileTimeError # Issue 31402 (Variable declaration)
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast0_test: RuntimeError
-function_subtype_cast2_test: RuntimeError
-function_subtype_cast3_test: RuntimeError
-function_subtype_checked0_test: RuntimeError
-function_subtype_inline2_test: RuntimeError
-function_subtype_local1_test: RuntimeError
-function_subtype_local2_test: RuntimeError
-function_subtype_local5_test: RuntimeError
-function_subtype_named1_test: Pass
-function_subtype_named1_test: RuntimeError
-function_subtype_not0_test: RuntimeError
-function_subtype_not2_test: RuntimeError
-function_subtype_not3_test: RuntimeError
-function_subtype_optional1_test: RuntimeError
-function_subtype_optional1_test: Pass
-function_subtype_setter0_test: RuntimeError
-function_subtype_simple1_test: RuntimeError
-function_subtype_top_level1_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
-function_type/function_type0_test: RuntimeError
 function_type/function_type10_test: RuntimeError
 function_type/function_type11_test: RuntimeError
-function_type/function_type12_test: RuntimeError
-function_type/function_type13_test: RuntimeError
 function_type/function_type14_test: RuntimeError
 function_type/function_type15_test: RuntimeError
-function_type/function_type16_test: RuntimeError
-function_type/function_type17_test: RuntimeError
 function_type/function_type18_test: RuntimeError
 function_type/function_type19_test: RuntimeError
-function_type/function_type1_test: RuntimeError
 function_type/function_type20_test: RuntimeError
 function_type/function_type21_test: RuntimeError
 function_type/function_type22_test: RuntimeError
@@ -1789,62 +936,354 @@
 function_type/function_type47_test: RuntimeError
 function_type/function_type48_test: RuntimeError
 function_type/function_type49_test: RuntimeError
-function_type/function_type4_test: RuntimeError
 function_type/function_type50_test: RuntimeError
 function_type/function_type51_test: RuntimeError
-function_type/function_type52_test: RuntimeError
-function_type/function_type53_test: RuntimeError
 function_type/function_type54_test: RuntimeError
 function_type/function_type55_test: RuntimeError
-function_type/function_type56_test: RuntimeError
-function_type/function_type57_test: RuntimeError
 function_type/function_type58_test: RuntimeError
 function_type/function_type59_test: RuntimeError
-function_type/function_type5_test: RuntimeError
-function_type/function_type60_test: RuntimeError
-function_type/function_type61_test: RuntimeError
 function_type/function_type62_test: RuntimeError
 function_type/function_type63_test: RuntimeError
-function_type/function_type64_test: RuntimeError
-function_type/function_type65_test: RuntimeError
 function_type/function_type66_test: RuntimeError
 function_type/function_type67_test: RuntimeError
-function_type/function_type68_test: RuntimeError
-function_type/function_type69_test: RuntimeError
 function_type/function_type6_test: RuntimeError
 function_type/function_type70_test: RuntimeError
 function_type/function_type71_test: RuntimeError
-function_type/function_type72_test: RuntimeError
-function_type/function_type73_test: RuntimeError
 function_type/function_type74_test: RuntimeError
 function_type/function_type75_test: RuntimeError
-function_type/function_type76_test: RuntimeError
-function_type/function_type77_test: RuntimeError
 function_type/function_type78_test: RuntimeError
 function_type/function_type79_test: RuntimeError
 function_type/function_type7_test: RuntimeError
-function_type/function_type80_test: RuntimeError
-function_type/function_type81_test: RuntimeError
 function_type/function_type82_test: RuntimeError
 function_type/function_type83_test: RuntimeError
-function_type/function_type84_test: RuntimeError
-function_type/function_type85_test: RuntimeError
 function_type/function_type86_test: RuntimeError
 function_type/function_type87_test: RuntimeError
-function_type/function_type88_test: RuntimeError
-function_type/function_type89_test: RuntimeError
-function_type/function_type8_test: RuntimeError
 function_type/function_type90_test: RuntimeError
 function_type/function_type91_test: RuntimeError
-function_type/function_type92_test: RuntimeError
-function_type/function_type93_test: RuntimeError
 function_type/function_type94_test: RuntimeError
 function_type/function_type95_test: RuntimeError
-function_type/function_type96_test: RuntimeError
-function_type/function_type97_test: RuntimeError
 function_type/function_type98_test: RuntimeError
 function_type/function_type99_test: RuntimeError
-function_type/function_type9_test: RuntimeError
+function_type2_test: RuntimeError
+generic_functions_test: Pass # Issue 25869
+generic_local_functions_test: Pass # Issue 25869
+generic_methods_function_type_test: Pass # Issue 25869
+generic_methods_generic_function_parameter_test: Pass # Issue 25869
+generic_methods_new_test: Pass # Issue 25869
+generic_methods_test: Pass # Issue 25869
+known_identifier_usage_error_test/none: RuntimeError # Issue 28814
+malbounded_redirecting_factory_test/03: Fail
+malbounded_redirecting_factory_test/04: Fail
+malbounded_type_test_test/03: Fail
+malbounded_type_test_test/04: Fail
+mixin_invalid_bound2_test/08: Fail
+mixin_invalid_bound2_test/09: Fail
+mixin_invalid_bound2_test/10: Fail
+mixin_invalid_bound_test/06: Fail
+mixin_invalid_bound_test/07: Fail
+redirecting_factory_infinite_steps_test/01: Fail
+redirecting_factory_malbounded_test/01: Fail
+regress_22728_test: Fail # Dartk Issue 28498
+regress_22728_test: RuntimeError
+regress_30339_test: Crash
+setter_override_test/01: MissingCompileTimeError
+setter_override_test/02: MissingCompileTimeError
+type_variable_bounds4_test/01: RuntimeError
+
+[ $compiler == dartkp && $runtime == dart_precompiled && !$checked && $strong ]
+assertion_initializer_const_error_test/01: MissingCompileTimeError
+assertion_initializer_const_function_error_test/01: MissingCompileTimeError
+bool_check_test: RuntimeError
+bool_condition_check_test: RuntimeError
+callable_test/none: RuntimeError
+checked_setter2_test: RuntimeError
+checked_setter_test: RuntimeError
+compile_time_constant_static2_test/04: MissingCompileTimeError
+compile_time_constant_static3_test/04: MissingCompileTimeError
+conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
+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
+field_override_optimization_test: RuntimeError
+field_type_check2_test/01: MissingRuntimeError
+if_null_precedence_test/none: RuntimeError
+implicit_downcast_during_assignment_test: RuntimeError
+implicit_downcast_during_combiner_test: RuntimeError
+implicit_downcast_during_compound_assignment_test: RuntimeError
+implicit_downcast_during_conditional_expression_test: RuntimeError
+implicit_downcast_during_do_test: RuntimeError
+implicit_downcast_during_for_condition_test: RuntimeError
+implicit_downcast_during_for_initializer_expression_test: RuntimeError
+implicit_downcast_during_for_initializer_var_test: RuntimeError
+implicit_downcast_during_if_null_assignment_test: RuntimeError
+implicit_downcast_during_if_statement_test: RuntimeError
+implicit_downcast_during_list_literal_test: RuntimeError
+implicit_downcast_during_logical_expression_test: RuntimeError
+implicit_downcast_during_map_literal_test: RuntimeError
+implicit_downcast_during_not_test: RuntimeError
+implicit_downcast_during_return_async_test: RuntimeError
+implicit_downcast_during_return_test: RuntimeError
+implicit_downcast_during_variable_declaration_test: RuntimeError
+implicit_downcast_during_while_statement_test: RuntimeError
+implicit_downcast_during_yield_star_test: RuntimeError
+implicit_downcast_during_yield_test: RuntimeError
+regress_30339_test: RuntimeError
+type_error_test: RuntimeError # Issue 31402 (Variable declaration)
+vm/causal_async_exception_stack_test: RuntimeError
+
+# ==== dartkp + dart_precompiled status lines ====
+[ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
+abstract_factory_constructor_test/00: MissingCompileTimeError
+abstract_getter_test/01: MissingCompileTimeError
+abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
+abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
+abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError
+abstract_syntax_test/00: MissingCompileTimeError
+additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
+additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
+additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
+assert_with_type_test_or_cast_test: Pass, Crash
+assertion_initializer_const_error_test/01: Pass
+assertion_initializer_test: CompileTimeError # Issue 31402 (Assert statement)
+async_await_syntax_test/c10a: MissingCompileTimeError
+async_await_syntax_test/d08b: MissingCompileTimeError
+async_await_syntax_test/d10a: MissingCompileTimeError
+async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
+async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
+async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
+async_return_types_test/nestedFuture: MissingCompileTimeError
+async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
+async_return_types_test/wrongReturnType: MissingCompileTimeError
+async_star_cancel_while_paused_test: RuntimeError
+async_star_pause_test: Fail, OK
+async_star_regression_2238_test: RuntimeError
+async_star_regression_23116_test: RuntimeError
+async_star_regression_fisk_test: RuntimeError
+async_star_test/01: CompileTimeError # Issue 2238.
+async_star_test/02: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/02: RuntimeError
+async_star_test/03: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/04: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/05: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+await_test: CompileTimeError # Issue 31541
+bad_named_parameters2_test/01: MissingCompileTimeError
+bad_named_parameters_test/01: MissingCompileTimeError
+bad_named_parameters_test/02: MissingCompileTimeError
+bad_named_parameters_test/03: MissingCompileTimeError
+bad_named_parameters_test/04: Crash
+bad_named_parameters_test/04: MissingCompileTimeError
+bad_named_parameters_test/05: MissingCompileTimeError
+bad_override_test/01: MissingCompileTimeError
+bad_override_test/02: MissingCompileTimeError
+built_in_identifier_prefix_test: CompileTimeError
+built_in_identifier_type_annotation_test/22: Crash # Issue 28814
+built_in_identifier_type_annotation_test/22: DartkCrash # Issue 28814
+built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/53: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/54: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/55: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/57: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/58: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/59: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/60: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/61: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/62: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/63: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/64: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/65: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/66: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/67: MissingCompileTimeError # Issue 28814
+built_in_identifier_type_annotation_test/68: MissingCompileTimeError # Issue 28814
+call_function2_test: CompileTimeError # Issue 31402 (map literal)
+call_function_apply_test: CompileTimeError # Issue 31402 (Invocation arguments)
+call_function_test: CompileTimeError
+call_non_method_field_test/01: MissingCompileTimeError
+call_non_method_field_test/02: MissingCompileTimeError
+call_with_no_such_method_test: CompileTimeError # Issue 31402 (Invocation arguments)
+callable_test/none: CompileTimeError # Issue 31402 (Variable declaration)
+cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt2_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt3_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+check_member_static_test/01: MissingCompileTimeError
+checked_setter3_test/01: MissingCompileTimeError
+checked_setter3_test/02: MissingCompileTimeError
+checked_setter3_test/03: MissingCompileTimeError
+class_cycle_test/02: MissingCompileTimeError
+class_cycle_test/03: MissingCompileTimeError
+closure_invoked_through_interface_target_field_test: MissingCompileTimeError
+closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
+compile_time_constant_c_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+compile_time_constant_k_test/01: MissingCompileTimeError
+compile_time_constant_k_test/02: MissingCompileTimeError
+compile_time_constant_k_test/03: MissingCompileTimeError
+compile_time_constant_o_test/01: MissingCompileTimeError
+compile_time_constant_o_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
+compile_time_constant_o_test/02: MissingCompileTimeError
+compile_time_constant_o_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
+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 (Field declaration)
+conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+config_import_corelib_test: CompileTimeError # Issue 31533
+config_import_test: RuntimeError # KernelVM bug: Configurable imports.
+const_constructor2_test/11: CompileTimeError # Issue 31402 (Invocation arguments)
+const_constructor2_test/12: CompileTimeError # Issue 31402 (Invocation arguments)
+const_constructor2_test/20: MissingCompileTimeError
+const_constructor2_test/22: MissingCompileTimeError
+const_constructor2_test/24: MissingCompileTimeError
+const_constructor_nonconst_field_test/01: MissingCompileTimeError # Fasta bug: Non-const expression in field initializer.
+const_dynamic_type_literal_test/02: MissingCompileTimeError
+const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
+const_evaluation_test: SkipByDesign
+const_factory_with_body_test/01: MissingCompileTimeError # Fasta bug: Const factory with body.
+const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field.
+const_list_test: RuntimeError
+const_map2_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_map3_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_map4_test: RuntimeError
+const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
+const_optional_args_test/01: MissingCompileTimeError # Fasta bug: Default parameter values must be const.
+const_redirecting_factory_test: CompileTimeError # Issue 31402 (Field declaration)
+const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
+const_types_test/34: MissingCompileTimeError
+const_types_test/35: MissingCompileTimeError
+const_types_test/39: MissingCompileTimeError
+const_types_test/40: MissingCompileTimeError
+constructor12_test: RuntimeError
+constructor3_test: Fail, OK, Pass
+constructor_redirect1_negative_test/01: MissingCompileTimeError
+constructor_redirect2_negative_test: MissingCompileTimeError
+constructor_redirect2_test/01: MissingCompileTimeError # Fasta bug: Body on redirecting constructor.
+constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
+covariant_subtyping_test: CompileTimeError
+covariant_subtyping_test: Crash
+ct_const2_test: Skip # Incompatible flag: --compile_all
+ct_const_test: RuntimeError
+cyclic_constructor_test/01: MissingCompileTimeError # Fasta bug: Cyclic constructor redirection.
+cyclic_type2_test: Fail, OK
+cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
+cyclic_type_test/04: Fail, OK
+cyclic_type_variable_test/01: MissingCompileTimeError
+cyclic_type_variable_test/02: MissingCompileTimeError
+cyclic_type_variable_test/03: MissingCompileTimeError
+cyclic_type_variable_test/04: MissingCompileTimeError
+cyclic_typedef_test/10: Crash
+cyclic_typedef_test/11: Crash
+deep_nesting1_negative_test: Skip # Issue 31158
+deep_nesting2_negative_test: Skip # Issue 31158
+default_factory2_test/01: MissingCompileTimeError
+default_factory_test/01: MissingCompileTimeError
+deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_constants_test: SkipByDesign
+deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_constraints_type_annotation_test/new: CompileTimeError
+deferred_constraints_type_annotation_test/new_generic1: CompileTimeError
+deferred_constraints_type_annotation_test/none: CompileTimeError
+deferred_constraints_type_annotation_test/static_method: CompileTimeError
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError
+deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_global_test: Fail
+deferred_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
+deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
+deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_redirecting_factory_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_redirecting_factory_test: Fail, Crash # Issue 23408
+deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_shadow_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot
+duplicate_export_negative_test: Fail # Issue 6134
+duplicate_implements_test/01: MissingCompileTimeError
+duplicate_implements_test/02: MissingCompileTimeError
+dynamic_prefix_core_test/none: CompileTimeError
+dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
+emit_const_fields_test: CompileTimeError # Issue 31533
+enum_mirror_test: SkipByDesign
+example_constructor_test: Fail, OK
+export_ambiguous_main_negative_test: Fail # Issue 14763
+export_ambiguous_main_negative_test: Skip # Issue 29895
+export_double_same_main_test: Crash # Issue 29895
+export_double_same_main_test: Skip # Issue 29895
+external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
+external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
+external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
+external_test/24: Pass, CompileTimeError # Started to pass after switching to batch-mode.
+extract_type_arguments_test: RuntimeError # Issue 31371
+f_bounded_quantification_test/01: MissingCompileTimeError
+f_bounded_quantification_test/02: MissingCompileTimeError
+factory2_test/03: MissingCompileTimeError
+factory3_test/01: Pass
+factory4_test/00: MissingCompileTimeError
+field3_test/01: MissingCompileTimeError
+field_increment_bailout_test: SkipByDesign
+field_initialization_order_test: Fail, OK
+field_method4_test: Crash
+field_method4_test: MissingCompileTimeError
+field_override2_test: MissingCompileTimeError
+field_override_test/00: MissingCompileTimeError
+field_override_test/01: MissingCompileTimeError
+first_class_types_test: RuntimeError
+flatten_test/05: MissingRuntimeError
+flatten_test/08: MissingRuntimeError
+flatten_test/09: MissingRuntimeError
+flatten_test/12: MissingRuntimeError
+for_in_side_effects_test/01: MissingCompileTimeError
+function_propagation_test: CompileTimeError # Issue 31402 (Variable declaration)
+function_subtype3_test: RuntimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
+function_subtype_bound_closure7_test: CompileTimeError # Issue 31402 (Variable declaration)
+function_subtype_bound_closure7_test: RuntimeError
+function_subtype_call1_test: RuntimeError
+function_subtype_call2_test: RuntimeError
+function_subtype_cast0_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
+function_subtype_checked0_test: RuntimeError
+function_subtype_inline2_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
+function_subtype_not0_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
+function_subtype_setter0_test: RuntimeError
+function_subtype_simple1_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
+function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
 function_type_alias2_test: RuntimeError
 function_type_alias3_test: RuntimeError
@@ -1855,56 +1294,32 @@
 generic_async_star_test: RuntimeError
 generic_closure_test: RuntimeError
 generic_function_bounds_test: CompileTimeError
-generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: CompileTimeError
-generic_function_dcall_test: RuntimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError, OK # No type inference
-generic_function_type_as_type_argument_test/02: Pass
-generic_function_typedef2_test/04: MissingCompileTimeError
-generic_function_typedef_test/01: Pass
-generic_function_typedef_test/01: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_list_checked_test: RuntimeError
 generic_list_checked_test: CompileTimeError # Issue 31402 (Variable declaration)
-generic_methods_bounds_test/01: Crash
+generic_list_checked_test: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
-generic_methods_optional_parameters_test: Pass
-generic_methods_optional_parameters_test: RuntimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
-generic_methods_recursive_bound_test/02: Crash
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_methods_recursive_bound_test/03: Pass
-generic_methods_recursive_bound_test/03: MissingRuntimeError
 generic_methods_recursive_bound_test/03: Crash, Pass
+generic_methods_recursive_bound_test/03: MissingRuntimeError
+generic_methods_recursive_bound_test/03: Pass
 generic_methods_reuse_type_variables_test: Pass
 generic_methods_tearoff_specialization_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_tearoff_specialization_test: RuntimeError
 generic_methods_unused_parameter_test: CompileTimeError # Issue 31402 (Variable declaration)
-generic_methods_unused_parameter_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_tearoff_test: CompileTimeError
-generic_tearoff_test: RuntimeError
 generic_test: RuntimeError
-getter_no_setter2_test/01: MissingCompileTimeError
-getter_no_setter2_test/03: MissingCompileTimeError
-getter_no_setter_test/01: MissingCompileTimeError
-getter_no_setter_test/03: MissingCompileTimeError
 getter_override_test/03: MissingCompileTimeError
-getters_setters2_test/*: Pass # Correctly passes.
-getters_setters2_test/01: RuntimeError
-getters_setters2_test/02: MissingCompileTimeError
-getters_setters2_test/none: RuntimeError
 hello_dart_test: Skip # Incompatible flag: --compile_all
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
 identical_const_test/04: MissingCompileTimeError
-if_null_assignment_behavior_test/13: MissingCompileTimeError
-if_null_assignment_behavior_test/15: MissingCompileTimeError
-if_null_precedence_test/none: RuntimeError
 implicit_closure_test: Skip # Incompatible flag: --use_slow_path
 implicit_downcast_during_assignment_test: Pass # Correctly passes.
 implicit_downcast_during_combiner_test: Pass # Correctly passes.
@@ -1927,71 +1342,30 @@
 implicit_downcast_during_yield_star_test: Pass # Correctly passes.
 implicit_downcast_during_yield_test: Pass # Correctly passes.
 implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/02: MissingCompileTimeError
 implicit_this_test/04: MissingCompileTimeError
-import_combinators2_test/00: MissingCompileTimeError
-import_self_test/01: MissingCompileTimeError
-initializing_formal_final_test: MissingCompileTimeError
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_creation_in_function_annotation_test: SkipByDesign
-instanceof4_test/01: RuntimeError
-instanceof4_test/01: Pass
-instanceof4_test/none: Pass
-instanceof4_test/none: RuntimeError
 instantiate_tearoff_after_contravariance_check_test: CompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 instantiate_tearoff_test: CompileTimeError
-interface_test/00: MissingCompileTimeError
 invocation_mirror2_test: SkipByDesign
 invocation_mirror_invoke_on2_test: SkipByDesign
 invocation_mirror_invoke_on_test: SkipByDesign
 invocation_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
-is_malformed_type_test/95: MissingCompileTimeError
-is_malformed_type_test/97: MissingCompileTimeError
-is_malformed_type_test/99: MissingCompileTimeError
-is_not_class2_test/01: MissingCompileTimeError
-isnot_malformed_type_test/01: MissingCompileTimeError
-issue11724_test/01: MissingCompileTimeError
 issue13179_test: CompileTimeError # Issue 31402 (Parameter default value)
-issue15606_test/01: MissingCompileTimeError
 issue18628_2_test/01: MissingCompileTimeError
 issue21079_test: SkipByDesign
 issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+issue_25671a_test/01: CompileTimeError # Test assumes Dart 1.0 semantics
 issue_25671b_test/01: Crash
-known_identifier_prefix_error_test/09: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/10: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/11: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/12: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/13: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/14: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/15: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/16: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/17: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/18: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/19: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/20: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/21: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/22: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/23: MissingCompileTimeError # Issue 28814
-known_identifier_prefix_error_test/24: MissingCompileTimeError # Issue 28814
 language_2/least_upper_bound_expansive_test/none: CompileTimeError
 least_upper_bound_expansive_test/none: RuntimeError
 least_upper_bound_expansive_test/none: CompileTimeError
-library_ambiguous_test/00: MissingCompileTimeError
-library_ambiguous_test/01: MissingCompileTimeError
-library_ambiguous_test/02: MissingCompileTimeError
-library_ambiguous_test/03: MissingCompileTimeError
-library_ambiguous_test/04: MissingCompileTimeError
 library_env_test/has_html_support: RuntimeError # KernelVM bug: Configurable imports.
-library_env_test/has_html_support: RuntimeError, OK
 library_env_test/has_mirror_support: RuntimeError, OK
 library_env_test/has_no_io_support: RuntimeError # KernelVM bug: Configurable imports.
-library_env_test/has_no_io_support: RuntimeError, OK
 list_is_test: RuntimeError
-list_literal_syntax_test/01: MissingCompileTimeError
-list_literal_syntax_test/02: MissingCompileTimeError
-list_literal_syntax_test/03: MissingCompileTimeError
 local_function2_test/none: RuntimeError
 local_function3_test/none: RuntimeError
 local_function_test/01: MissingCompileTimeError
@@ -2015,95 +1389,28 @@
 malbounded_type_test_test/00: MissingCompileTimeError
 malbounded_type_test_test/01: MissingCompileTimeError
 malbounded_type_test_test/02: MissingCompileTimeError
-malformed2_test/01: MissingCompileTimeError
-malformed2_test/02: MissingCompileTimeError
-malformed2_test/03: MissingCompileTimeError
-malformed2_test/04: MissingCompileTimeError
-malformed2_test/05: MissingCompileTimeError
-malformed2_test/06: MissingCompileTimeError
-malformed2_test/07: MissingCompileTimeError
-malformed2_test/08: MissingCompileTimeError
-malformed2_test/09: MissingCompileTimeError
-malformed2_test/10: MissingCompileTimeError
-malformed2_test/11: MissingCompileTimeError
-malformed2_test/12: MissingCompileTimeError
-malformed2_test/13: MissingCompileTimeError
-malformed_bound_test/00: MissingCompileTimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: MissingCompileTimeError
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_test/00: MissingCompileTimeError
-malformed_test/01: MissingCompileTimeError
-malformed_test/02: MissingCompileTimeError
-malformed_test/03: MissingCompileTimeError
-malformed_test/04: MissingCompileTimeError
-malformed_test/05: MissingCompileTimeError
-malformed_test/06: MissingCompileTimeError
-malformed_test/07: MissingCompileTimeError
-malformed_test/08: MissingCompileTimeError
-malformed_test/09: MissingCompileTimeError
-malformed_test/10: MissingCompileTimeError
-malformed_test/11: MissingCompileTimeError
-malformed_test/12: MissingCompileTimeError
-malformed_test/13: MissingCompileTimeError
-malformed_test/14: MissingCompileTimeError
-malformed_test/15: MissingCompileTimeError
-malformed_test/16: MissingCompileTimeError
-malformed_test/17: MissingCompileTimeError
-malformed_test/18: MissingCompileTimeError
-malformed_test/19: MissingCompileTimeError
-malformed_test/20: MissingCompileTimeError
-malformed_test/21: MissingCompileTimeError
-malformed_test/22: MissingCompileTimeError
-malformed_test/23: MissingCompileTimeError
-malformed_test/24: MissingCompileTimeError
-malformed_type_test: MissingCompileTimeError
 many_overridden_no_such_method_test: SkipByDesign
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-map_literal3_test/04: MissingCompileTimeError
-map_literal8_test: Pass
-map_literal8_test: RuntimeError
-method_override2_test/*: MissingCompileTimeError
-method_override2_test/00: MissingCompileTimeError
-method_override2_test/01: MissingCompileTimeError
-method_override2_test/02: MissingCompileTimeError
-method_override2_test/03: MissingCompileTimeError
-method_override2_test/none: Pass
-method_override3_test/*: MissingCompileTimeError
-method_override3_test/00: MissingCompileTimeError
-method_override3_test/01: MissingCompileTimeError
-method_override3_test/02: MissingCompileTimeError
-method_override3_test/none: Pass
-method_override4_test/*: MissingCompileTimeError
 method_override4_test/01: MissingCompileTimeError
 method_override4_test/02: MissingCompileTimeError
 method_override4_test/03: MissingCompileTimeError
-method_override4_test/none: Pass
-method_override5_test/*: MissingCompileTimeError
 method_override5_test/01: MissingCompileTimeError
 method_override5_test/02: MissingCompileTimeError
 method_override5_test/03: MissingCompileTimeError
-method_override5_test/none: Pass
-method_override6_test/*: MissingCompileTimeError
 method_override6_test/01: MissingCompileTimeError
 method_override6_test/02: MissingCompileTimeError
 method_override6_test/03: MissingCompileTimeError
-method_override6_test/none: Pass
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
 mixin_black_listed_test/02: MissingCompileTimeError
-mixin_illegal_constructor_test/13: MissingCompileTimeError
-mixin_illegal_constructor_test/14: MissingCompileTimeError
-mixin_illegal_constructor_test/15: MissingCompileTimeError
-mixin_illegal_constructor_test/16: MissingCompileTimeError
-mixin_illegal_static_access_test/01: MissingCompileTimeError
-mixin_illegal_static_access_test/02: MissingCompileTimeError
+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_illegal_super_use_test: Skip # Issues 24478 and 23773
 mixin_illegal_superclass_test: Skip # Issues 24478 and 23773
-mixin_illegal_syntax_test/13: MissingCompileTimeError
 mixin_invalid_bound2_test/02: MissingCompileTimeError
 mixin_invalid_bound2_test/03: MissingCompileTimeError
 mixin_invalid_bound2_test/04: MissingCompileTimeError
@@ -2146,64 +1453,28 @@
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
 mixin_type_parameters_errors_test/05: MissingCompileTimeError
-mixin_with_two_implicit_constructors_test: MissingCompileTimeError
 mock_writable_final_private_field_test: RuntimeError # Issue 30849
-multiline_strings_test: Pass
-multiline_strings_test: Fail # Issue 23020
-named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
 named_constructor_test/01: MissingCompileTimeError
-named_constructor_test/03: MissingCompileTimeError
-named_parameters2_test: MissingCompileTimeError
-named_parameters3_test: MissingCompileTimeError
-named_parameters4_test: MissingCompileTimeError
-named_parameters_aggregated_test/05: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
 named_parameters_default_eq_test/none: RuntimeError
-named_parameters_test/01: MissingCompileTimeError
 named_parameters_test/02: MissingCompileTimeError
-named_parameters_test/03: MissingCompileTimeError
 named_parameters_test/04: MissingCompileTimeError
-named_parameters_test/05: MissingCompileTimeError
 named_parameters_test/06: MissingCompileTimeError
-named_parameters_test/07: MissingCompileTimeError
 named_parameters_test/08: MissingCompileTimeError
-named_parameters_test/09: MissingCompileTimeError
 named_parameters_test/10: MissingCompileTimeError
-nested_generic_closure_test: Crash
 nested_generic_closure_test: RuntimeError
-new_expression_type_args_test/00: MissingCompileTimeError
-new_expression_type_args_test/01: MissingCompileTimeError
-new_expression_type_args_test/02: MissingCompileTimeError
-new_prefix_test/01: MissingCompileTimeError
 no_main_test/01: Skip
-no_such_constructor_test/01: MissingCompileTimeError
 no_such_method_mock_test: RuntimeError
-no_such_method_mock_test: Pass
 no_such_method_test: SkipByDesign
-not_enough_positional_arguments_test/00: MissingCompileTimeError
-not_enough_positional_arguments_test/01: MissingCompileTimeError
-not_enough_positional_arguments_test/02: MissingCompileTimeError
-not_enough_positional_arguments_test/03: MissingCompileTimeError
-not_enough_positional_arguments_test/05: MissingCompileTimeError
-not_enough_positional_arguments_test/06: MissingCompileTimeError
-not_enough_positional_arguments_test/07: MissingCompileTimeError
 null_no_such_method_test: CompileTimeError # Issue 31533
 null_test/02: MissingCompileTimeError
 null_test/03: MissingCompileTimeError
 null_test/mirrors: Skip # Uses mirrors.
 null_test/none: SkipByDesign
-on_catch_malformed_type_test: MissingCompileTimeError
-optional_named_parameters_test/01: MissingCompileTimeError
-optional_named_parameters_test/02: Crash
 optional_named_parameters_test/02: MissingCompileTimeError
-optional_named_parameters_test/03: MissingCompileTimeError
-optional_named_parameters_test/04: Crash
 optional_named_parameters_test/04: MissingCompileTimeError
-optional_named_parameters_test/05: MissingCompileTimeError
 optional_named_parameters_test/06: MissingCompileTimeError
-optional_named_parameters_test/07: MissingCompileTimeError
 optional_named_parameters_test/08: MissingCompileTimeError
-optional_named_parameters_test/09: MissingCompileTimeError
 overridden_no_such_method_test: SkipByDesign
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
@@ -2226,38 +1497,20 @@
 override_inheritance_abstract_test/24: MissingCompileTimeError
 override_inheritance_abstract_test/25: MissingCompileTimeError
 override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
-override_inheritance_field_test/05: MissingCompileTimeError
-override_inheritance_field_test/07: MissingCompileTimeError
-override_inheritance_field_test/08: MissingCompileTimeError
-override_inheritance_field_test/09: MissingCompileTimeError
-override_inheritance_field_test/10: MissingCompileTimeError
-override_inheritance_field_test/11: MissingCompileTimeError
-override_inheritance_field_test/28: MissingCompileTimeError
-override_inheritance_field_test/30: MissingCompileTimeError
-override_inheritance_field_test/31: MissingCompileTimeError
-override_inheritance_field_test/32: MissingCompileTimeError
-override_inheritance_field_test/33: MissingCompileTimeError
-override_inheritance_field_test/33a: MissingCompileTimeError
-override_inheritance_field_test/34: MissingCompileTimeError
+override_inheritance_field_test/04: CompileTimeError # Issue 31616
+override_inheritance_field_test/06: CompileTimeError # Issue 31616
+override_inheritance_field_test/26: CompileTimeError # Issue 31616
+override_inheritance_field_test/29: CompileTimeError # Issue 31616
 override_inheritance_field_test/44: MissingCompileTimeError
 override_inheritance_field_test/47: MissingCompileTimeError
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/02: CompileTimeError # Issue 31616
-override_inheritance_method_test/04: MissingCompileTimeError
-override_inheritance_method_test/05: MissingCompileTimeError
-override_inheritance_method_test/06: MissingCompileTimeError
-override_inheritance_method_test/11: MissingCompileTimeError
-override_inheritance_method_test/12: MissingCompileTimeError
-override_inheritance_method_test/13: MissingCompileTimeError
-override_inheritance_method_test/14: MissingCompileTimeError
-override_inheritance_method_test/19: MissingCompileTimeError
-override_inheritance_method_test/20: MissingCompileTimeError
-override_inheritance_method_test/21: MissingCompileTimeError
-override_inheritance_method_test/28: CompileTimeError # Issue 31616
-override_inheritance_method_test/29: CompileTimeError # Issue 31616
+override_inheritance_generic_test/02: CompileTimeError
+override_inheritance_method_test/17: CompileTimeError
+override_inheritance_method_test/18: CompileTimeError
+override_inheritance_method_test/28: CompileTimeError
+override_inheritance_method_test/29: CompileTimeError
 override_inheritance_mixed_test/06: MissingCompileTimeError
 override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/08: MissingCompileTimeError
@@ -2272,49 +1525,27 @@
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
 override_inheritance_no_such_method_test/13: MissingCompileTimeError
 parser_quirks_test: CompileTimeError # Issue 31533
-part2_test/01: MissingCompileTimeError
-positional_parameters_type_test/none: Crash
-positional_parameters_type_test/none: Pass
-prefix16_test/00: MissingCompileTimeError
-prefix16_test/01: MissingCompileTimeError
-prefix22_test/00: MissingCompileTimeError
-prefix23_test/00: MissingCompileTimeError
-private_access_test/01: MissingCompileTimeError
-private_access_test/02: MissingCompileTimeError
-private_access_test/03: MissingCompileTimeError
-private_access_test/04: MissingCompileTimeError
-private_access_test/05: MissingCompileTimeError
-private_access_test/06: MissingCompileTimeError
 recursive_generic_test: RuntimeError
 recursive_mixin_test: Crash
+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.
 redirecting_factory_default_values_test/03: MissingCompileTimeError
-redirecting_factory_incompatible_signature_test/01: MissingCompileTimeError
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
+redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: SkipByDesign
 regress_13462_0_test: SkipByDesign
 regress_13462_1_test: SkipByDesign
-regress_13494_test: MissingCompileTimeError
-regress_17382_test: MissingCompileTimeError
 regress_18535_test: SkipByDesign
-regress_19413_test: MissingCompileTimeError
-regress_21793_test/01: MissingCompileTimeError
-regress_22438_test: MissingCompileTimeError
 regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-regress_22936_test: MissingCompileTimeError
 regress_22976_test/01: CompileTimeError # Issue 31402 (Variable declaration)
 regress_23089_test: Crash
 regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_23408_test: RuntimeError
 regress_25550_test: CompileTimeError # Issue 31402 (Variable declaration)
-regress_27572_test: MissingCompileTimeError
 regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28217_test/01: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28217_test/none: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
 regress_28255_test: SkipByDesign
 regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-regress_28341_test: RuntimeError
-regress_28341_test: Pass
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_29784_test/01: MissingCompileTimeError
@@ -2325,37 +1556,28 @@
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError
-static_field3_test/01: MissingCompileTimeError
-static_field3_test/02: MissingCompileTimeError
-static_field3_test/03: MissingCompileTimeError
-static_field3_test/04: MissingCompileTimeError
-static_final_field2_test/01: MissingCompileTimeError
-static_getter_no_setter1_test/01: MissingCompileTimeError
-static_getter_no_setter2_test/01: MissingCompileTimeError
-static_setter_get_test/01: MissingCompileTimeError
 string_interpolate_test: CompileTimeError # Issue 31533
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test: CompileTimeError
-super_call4_test: RuntimeError
 super_getter_setter_test: CompileTimeError
-super_getter_setter_test: RuntimeError
-super_operator_index_test/01: MissingCompileTimeError
-super_operator_index_test/02: MissingCompileTimeError
-super_operator_index_test/03: MissingCompileTimeError
-super_operator_index_test/04: MissingCompileTimeError
-super_operator_index_test/05: MissingCompileTimeError
-super_operator_index_test/06: MissingCompileTimeError
-super_operator_index_test/07: MissingCompileTimeError
+super_no_such_method1_test: CompileTimeError
+super_no_such_method2_test: CompileTimeError
+super_no_such_method3_test: CompileTimeError
+super_no_such_method4_test: CompileTimeError
+super_no_such_method5_test: CompileTimeError
+super_operator_index5_test: CompileTimeError
+super_operator_index6_test: CompileTimeError
+super_operator_index7_test: CompileTimeError
+super_operator_index8_test: CompileTimeError
 super_test: Fail, OK
 switch_bad_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_bad_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-switch_fallthru_test/01: MissingCompileTimeError
 syntax_test/00: MissingCompileTimeError
 syntax_test/28: MissingCompileTimeError
 syntax_test/29: MissingCompileTimeError
@@ -2363,21 +1585,7 @@
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
-top_level_getter_no_setter1_test: MissingCompileTimeError
-top_level_getter_no_setter2_test: MissingCompileTimeError
-transitive_private_library_access_test: MissingCompileTimeError
-try_catch_on_syntax_test/07: MissingCompileTimeError
-try_catch_on_syntax_test/10: MissingCompileTimeError
-try_catch_on_syntax_test/11: MissingCompileTimeError
-try_catch_syntax_test/08: MissingCompileTimeError
-type_error_test: RuntimeError # Issue 31402 (Variable declaration)
 type_literal_test: RuntimeError
-type_parameter_test/01: MissingCompileTimeError
-type_parameter_test/02: MissingCompileTimeError
-type_parameter_test/06: MissingCompileTimeError
-type_parameter_test/07: MissingCompileTimeError
-type_parameter_test/08: MissingCompileTimeError
-type_parameter_test/09: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
 type_promotion_functions_test/04: CompileTimeError # Issue 31537
@@ -2392,33 +1600,14 @@
 type_variable_bounds2_test: MissingCompileTimeError
 type_variable_bounds3_test/00: MissingCompileTimeError
 type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/00: 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/07: MissingCompileTimeError
 type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/09: MissingCompileTimeError
-type_variable_bounds_test/10: MissingCompileTimeError
 type_variable_bounds_test/11: MissingCompileTimeError
-type_variable_conflict2_test/03: MissingCompileTimeError
-type_variable_conflict2_test/04: MissingCompileTimeError
-type_variable_scope2_test: MissingCompileTimeError
-type_variable_scope_test/00: MissingCompileTimeError
-type_variable_scope_test/01: MissingCompileTimeError
-type_variable_scope_test/03: MissingCompileTimeError
-type_variable_scope_test/03: Pass # Correctly passes.
-type_variable_scope_test/04: MissingCompileTimeError
-type_variable_scope_test/05: MissingCompileTimeError
-type_variable_static_context_test: MissingCompileTimeError
-unresolved_default_constructor_test/01: MissingCompileTimeError
-unresolved_in_factory_test: MissingCompileTimeError
-unresolved_top_level_method_test: MissingCompileTimeError
-unresolved_top_level_var_test: MissingCompileTimeError
-vm/canonicalization_preserves_deopt_test: CompileTimeError # Issue 31402 (Assert statement)
 vm/causal_async_exception_stack2_test: SkipByDesign
 vm/causal_async_exception_stack_test: SkipByDesign
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
@@ -2436,7 +1625,6 @@
 vm/regress_29145_test: Skip # Issue 29145
 vm/type_cast_vm_test: RuntimeError # Expects line and column numbers
 vm/type_vm_test: RuntimeError, Pass # Expects line and column numbers
-vm/type_vm_test: RuntimeError # Expects line and column numbers
 vm/type_vm_test/01: MissingCompileTimeError
 vm/type_vm_test/02: MissingCompileTimeError
 vm/type_vm_test/03: MissingCompileTimeError
@@ -2501,8 +1689,7 @@
 void_type_usage_test/paren_for: CompileTimeError
 void_type_usage_test/paren_stmt: CompileTimeError
 void_type_usage_test/setter_assign: CompileTimeError
-wrong_number_type_arguments_test/*: MissingCompileTimeError
-wrong_number_type_arguments_test/none: Pass
+wrong_number_type_arguments_test/01: MissingCompileTimeError
 
 [ $compiler == dartkp && !$strong ]
 *: SkipByDesign # language_2 is only supported in strong mode.
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 117ba9f..5a95759 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -1092,6 +1092,7 @@
 implicit_downcast_during_super_method_invocation_test: RuntimeError
 implicit_downcast_during_variable_declaration_test: RuntimeError
 implicit_downcast_during_while_statement_test: RuntimeError
+issue31596_test: RuntimeError
 tearoff_dynamic_test: RuntimeError
 type_argument_in_super_type_test: RuntimeError
 type_check_const_function_typedef2_test: MissingCompileTimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 8795fa1..f967113 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -1126,6 +1126,7 @@
 implicit_downcast_during_variable_declaration_test: RuntimeError
 implicit_downcast_during_while_statement_test: RuntimeError
 inferrer_synthesized_constructor_test: RuntimeError
+issue31596_test: RuntimeError
 list_literal1_test/01: MissingCompileTimeError
 malformed2_test/00: MissingCompileTimeError
 tearoff_dynamic_test: RuntimeError
diff --git a/tests/language_2/vm/canonicalization_preserves_deopt_test.dart b/tests/language_2/vm/canonicalization_preserves_deopt_test.dart
index da282a5..37d1587 100644
--- a/tests/language_2/vm/canonicalization_preserves_deopt_test.dart
+++ b/tests/language_2/vm/canonicalization_preserves_deopt_test.dart
@@ -28,13 +28,13 @@
     assert(() {
       Expect.isTrue(bar(-1 << 63));
       return true;
-    });
+    }());
     Expect.isTrue(baz(-1 << 63));
   }
   Expect.isFalse(foo(new X()));
   assert(() {
     Expect.isFalse(bar(new X()));
     return true;
-  });
+  }());
   Expect.isFalse(baz(new X()));
 }
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index c9203ed..0508dbe 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -26,6 +26,10 @@
 mirrors/variable_is_const_test/01: Crash # Please triage.
 
 [ $compiler == dartk && $runtime == vm && $checked && $strong ]
+mirrors/invocation_fuzz_test/emptyarray: Pass
+mirrors/invocation_fuzz_test/false: Pass
+mirrors/invocation_fuzz_test/none: Pass
+mirrors/invocation_fuzz_test/string: Pass
 mirrors/redirecting_factory_different_type_test/01: Crash # Issue 28424
 mirrors/redirecting_factory_different_type_test/none: Crash # Issue 28424
 mirrors/reflected_type_generics_test/02: Pass
@@ -33,7 +37,6 @@
 # ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
 async/async_await_sync_completer_test: RuntimeError
-async/future_or_only_in_async_test/00: MissingCompileTimeError
 async/future_or_strong_test: RuntimeError
 async/future_value_chain4_test: CompileTimeError # Issue 31616
 async/slow_consumer2_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -95,8 +98,8 @@
 mirrors/constructor_private_name_test: RuntimeError
 mirrors/constructors_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/dart2js_mirrors_test: CompileTimeError # Issue 31537
-mirrors/deferred_mirrors_metadata_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/deferred_mirrors_metadata_test: RuntimeError
+mirrors/deferred_mirrors_metadata_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/deferred_mirrors_metatarget_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/deferred_mirrors_metatarget_test: RuntimeError
 mirrors/deferred_mirrors_test: Crash
@@ -146,8 +149,8 @@
 mirrors/library_enumeration_deferred_loading_test: RuntimeError
 mirrors/library_exports_hidden_test: RuntimeError, Crash
 mirrors/library_exports_hidden_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_exports_shown_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/library_exports_shown_test: RuntimeError
+mirrors/library_exports_shown_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/library_import_deferred_loading_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/library_imports_bad_metadata_test/none: Crash
 mirrors/library_imports_deferred_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -172,8 +175,8 @@
 mirrors/metadata_allowed_values_test/13: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/14: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
-mirrors/metadata_constructed_constant_test: Crash
 mirrors/metadata_constructed_constant_test: RuntimeError
+mirrors/metadata_constructed_constant_test: Crash
 mirrors/metadata_scope_test/none: RuntimeError
 mirrors/method_mirror_location_test: RuntimeError
 mirrors/method_mirror_name_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -271,7 +274,6 @@
 isolate/illegal_msg_function_test: RuntimeError
 isolate/illegal_msg_mirror_test: RuntimeError
 isolate/isolate_current_test: RuntimeError
-isolate/isolate_import_test/01: MissingCompileTimeError
 isolate/issue_22778_test: Crash
 isolate/kill_self_synchronously_test: RuntimeError
 isolate/kill_test: RuntimeError
@@ -290,7 +292,7 @@
 isolate/request_reply_test: Pass, Timeout
 isolate/stacktrace_message_test: RuntimeError
 isolate/typed_message_test: RuntimeError
-isolate/unresolved_ports_test: Pass, Timeout
+isolate/unresolved_ports_test: CompileTimeError, Pass, Timeout # Fails to compile on opt counter builder (#31838)
 mirrors/class_mirror_type_variables_test: RuntimeError
 mirrors/closures_test: RuntimeError
 mirrors/constructors_test: RuntimeError
@@ -315,6 +317,7 @@
 mirrors/instance_members_with_override_test: RuntimeError
 mirrors/instantiate_abstract_class_test: RuntimeError
 mirrors/intercepted_class_test: RuntimeError
+mirrors/invocation_fuzz_test/smi: Crash, Pass # Crashes on opt counter builder (#31838)
 mirrors/invoke_closurization2_test: RuntimeError
 mirrors/library_declarations_test/01: RuntimeError
 mirrors/library_imports_bad_metadata_test/none: RuntimeError
@@ -365,7 +368,6 @@
 # ===== dartkp + dart_precompiled status lines =====
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 async/async_await_sync_completer_test: RuntimeError
-async/future_or_only_in_async_test/00: MissingCompileTimeError
 async/future_or_strong_test: RuntimeError
 async/future_test/01: RuntimeError
 async/future_test/none: RuntimeError
@@ -412,7 +414,6 @@
 isolate/handle_error2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/handle_error3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/isolate_current_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/isolate_import_test/01: MissingCompileTimeError
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/issue_22778_test: Crash
 isolate/kill_self_synchronously_test: RuntimeError
diff --git a/tests/standalone_2/assert_test.dart b/tests/standalone_2/assert_test.dart
deleted file mode 100644
index 17f9e31..0000000
--- a/tests/standalone_2/assert_test.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// VMOptions=--enable_asserts
-
-// Dart test program testing assert statements.
-
-import "package:expect/expect.dart";
-
-class AssertTest {
-  static test() {
-    try {
-      assert(false);
-      Expect.fail("Assertion 'false' didn't fail.");
-    } on AssertionError catch (error) {
-      Expect.isTrue(error.toString().contains("'false'"));
-      Expect.isTrue(
-          error.stackTrace.toString().contains("assert_test.dart:13:14"));
-    }
-  }
-
-  static testClosure() {
-    try {
-      assert(() => false);
-      Expect.fail("Assertion '() => false' didn't fail.");
-    } on AssertionError catch (error) {
-      Expect.isTrue(error.toString().contains("'() => false'"));
-      Expect.isTrue(
-          error.stackTrace.toString().contains("assert_test.dart:24:14"));
-    }
-  }
-
-  static testMain() {
-    test();
-    testClosure();
-  }
-}
-
-main() {
-  AssertTest.testMain();
-}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 678a688..198f5b6 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -30,9 +30,6 @@
 io/socket_ipv6_test: SkipByDesign
 io/socket_source_address_test: SkipByDesign
 
-[ $compiler == app_jit ]
-assert_test: RuntimeError
-
 [ $compiler == dart2analyzer ]
 deferred_transitive_import_error_test: Skip
 
@@ -92,7 +89,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 == dartkp) ]
-assert_test: RuntimeError
 io/dependency_graph_test: CompileTimeError
 io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
@@ -100,21 +96,24 @@
 io/file_test: RuntimeError
 io/http_auth_digest_test: RuntimeError
 io/http_auth_test: RuntimeError
+io/http_cookie_date_test: CompileTimeError
+io/http_headers_test: CompileTimeError
+io/http_parser_test: CompileTimeError
 io/http_proxy_advanced_test: CompileTimeError
 io/http_redirect_test: RuntimeError
 io/http_reuse_server_port_test: RuntimeError
 io/http_server_response_test: RuntimeError
 io/regress_10026_test: RuntimeError
+io/secure_socket_argument_test: CompileTimeError
 io/skipping_dart2js_compilations_test: CompileTimeError
 io/socket_upgrade_to_secure_test: RuntimeError
 io/test_harness_analyzer_test: CompileTimeError
 io/test_runner_test: CompileTimeError
 io/web_socket_pipe_test: RuntimeError
-io/web_socket_protocol_processor_test: RuntimeError
+io/web_socket_protocol_processor_test: CompileTimeError
 io/zlib_test: RuntimeError
 
 [ !$strong && ($compiler == dartk || $compiler == dartkp) ]
-assert_test: RuntimeError
 io/compile_all_test: Skip # Crashes
 io/http_client_connect_test: Skip # Flaky.
 io/http_content_length_test: Skip # Flaky.
@@ -142,11 +141,10 @@
 [ $arch == arm || $arch == arm64 || $runtime != vm || $mode == debug && $system == windows ]
 fragmentation_test: Skip
 
-[ $compiler == dart2js || $compiler == dartdevc ]
+[ $compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk ]
 *: SkipByDesign
 
 [ $mode == product || $runtime == dart_precompiled ]
-assert_test: SkipByDesign
 no_assert_test: SkipByDesign
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index e854872..ca96d89 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -21,7 +21,6 @@
 
 # ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
-assert_test: CompileTimeError # Issue 31402 (Assert statement)
 io/compile_all_test: Crash
 io/http_client_request_test: Pass, Timeout
 io/http_compression_test: RuntimeError
diff --git a/tools/VERSION b/tools/VERSION
index d5d15b0..0015155 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 16
+PRERELEASE 17
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index b55c6ef..784895d 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -116,7 +116,9 @@
     },
     {
       "builders": [
-        "vm-kernel-precomp-linux-release-x64"
+        "vm-kernel-precomp-linux-release-x64",
+        "vm-kernel-precomp-linux-release-simarm",
+        "vm-kernel-precomp-linux-release-simarm64"
       ],
       "meta": {
         "description": "This configuration is used by the vm kernel release builder."
@@ -126,21 +128,13 @@
           "name": "build dart",
           "script": "tools/build.py",
           "arguments": [
-            "runtime",
             "runtime_kernel",
-            "dart_bootstrap",
             "dart_precompiled_runtime"
           ]
         },
         {
           "name": "vm tests",
           "arguments": ["--compiler=dartkp", "--runtime=dart_precompiled"],
-          "exclude_tests": [
-            "language_2",
-            "corelib_2",
-            "lib_2",
-            "standalone_2"
-          ],
           "fileset": "vm_debug",
           "shards": 6
         },
@@ -151,12 +145,6 @@
             "--runtime=dart_precompiled",
             "--strong"
           ],
-          "tests": [
-            "language_2",
-            "corelib_2",
-            "lib_2",
-            "standalone_2"
-          ],
           "fileset": "vm_debug",
           "shards": 6
         }
@@ -167,16 +155,14 @@
         "vm-kernel-precomp-linux-debug-x64"
       ],
       "meta": {
-        "description": "This configuration is used by the vm kernel debug builder."
+        "description": "This configuration is used by the vm kernel precomp debug builder."
       },
       "steps": [
         {
           "name": "build dart",
           "script": "tools/build.py",
           "arguments": [
-            "runtime",
             "runtime_kernel",
-            "dart_bootstrap",
             "dart_precompiled_runtime"
           ]
         },
@@ -187,12 +173,6 @@
             "--runtime=dart_precompiled",
             "--vm-options=--no-enable-malloc-hooks"
           ],
-          "exclude_tests": [
-            "language_2",
-            "corelib_2",
-            "lib_2",
-            "standalone_2"
-          ],
           "fileset": "vm_debug",
           "shards": 6
         },
@@ -204,12 +184,6 @@
             "--vm-options=--no-enable-malloc-hooks",
             "--strong"
           ],
-          "tests": [
-            "language_2",
-            "corelib_2",
-            "lib_2",
-            "standalone_2"
-          ],
           "fileset": "vm_debug",
           "shards": 6
         }
@@ -254,77 +228,10 @@
     {
       "builders": [
         "vm-kernel-linux-debug-simdbc64",
+        "vm-kernel-linux-debug-x64",
         "vm-kernel-linux-release-simarm",
         "vm-kernel-linux-release-simarm64",
-        "vm-kernel-linux-release-simdbc64"
-      ],
-      "meta": {
-        "description": "This configuration is used by the simarm/simdbc vm kernel builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime_kernel"]
-        },
-        {
-          "name": "dartk tests",
-          "arguments": ["-cdartk"]
-        },
-        {
-          "name": "dartk strong tests",
-          "arguments": [
-            "-cdartk",
-            "--strong",
-            "language_2",
-            "corelib_2",
-            "lib_2",
-            "standalone_2"
-          ]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "vm-kernel-precomp-linux-release-simarm",
-        "vm-kernel-precomp-linux-release-simarm64"
-      ],
-      "meta": {
-        "description": "This configuration is used by the simarm vm kernel precomp release builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": [
-            "runtime_kernel",
-            "dart_precompiled_runtime"
-          ]
-        },
-        {
-          "name": "dartk tests",
-          "arguments": [
-            "-cdartk",
-            "-rdart_precompiled"
-          ]
-        },
-        {
-          "name": "dartk strong tests",
-          "arguments": [
-            "-cdartk",
-            "-rdart_precompiled",
-            "--strong",
-            "language_2",
-            "corelib_2",
-            "lib_2",
-            "standalone_2"
-          ]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "vm-kernel-linux-debug-x64",
+        "vm-kernel-linux-release-simdbc64",
         "vm-kernel-linux-release-x64",
         "vm-kernel-mac-debug-x64",
         "vm-kernel-mac-release-x64"
@@ -336,22 +243,20 @@
         {
           "name": "build dart",
           "script": "tools/build.py",
-          "arguments": ["runtime","runtime_kernel"]
+          "arguments": ["runtime_kernel"]
         },
         {
           "name": "front-end tests",
-          "arguments": ["--runtime=vm","--compiler=none","--checked"],
+          "arguments": ["--compiler=none", "--checked"],
           "tests": ["pkg/front_end"]
         },
         {
           "name": "vm tests",
-          "arguments": ["--runtime=vm","--compiler=dartk"],
-          "exclude_tests": ["language_2","corelib_2","lib_2","standalone_2"]
+          "arguments": ["--compiler=dartk"]
         },
         {
           "name": "strong vm tests",
-          "arguments": ["--runtime=vm","--compiler=dartk","--strong"],
-          "tests": ["language_2","corelib_2","lib_2","standalone_2"]
+          "arguments": ["--compiler=dartk", "--strong"]
         }
       ]
     },
@@ -532,7 +437,7 @@
         {
           "name": "build dart",
           "script": "tools/build.py",
-          "arguments": ["runtime","runtime_precompiled"]
+          "arguments": ["runtime", "runtime_precompiled"]
         },
         {
           "name": "vm tests",
@@ -554,7 +459,7 @@
         {
           "name": "build dart",
           "script": "tools/build.py",
-          "arguments": ["--arch=arm","--os=android","runtime","runtime_precompiled"]
+          "arguments": ["--arch=arm", "--os=android", "runtime", "runtime_precompiled"]
         },
         {
           "name": "vm tests",
@@ -597,6 +502,38 @@
     },
     {
       "builders": [
+        "vm-kernel-optcounter-threshold-linux-release-x64"
+      ],
+      "meta": {
+        "description": "This is the configuration for the kernel optcounter builders, under the vm-kernel group. They run the same tests as the ordinary VM kernel builders, but add extra options to the vm."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "runtime_kernel"
+          ]
+        },
+        {
+          "name": "vm tests",
+          "arguments": [
+            "--compiler=dartk",
+            "--vm-options=--optimization-counter-threshold=5"
+          ]
+        },
+        {
+          "name": "strong vm tests",
+          "arguments": [
+            "--compiler=dartk",
+            "--strong",
+            "--vm-options=--optimization-counter-threshold=5"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-reload-linux-debug-x64",
         "vm-reload-linux-release-x64",
         "vm-reload-mac-debug-simdbc64",
diff --git a/tools/copy_tree.py b/tools/copy_tree.py
index 893fcc1..a9925b4 100755
--- a/tools/copy_tree.py
+++ b/tools/copy_tree.py
@@ -65,7 +65,8 @@
   else:
     ignored_names = set()
 
-  os.makedirs(dst)
+  if not os.path.exists(dst):
+    os.makedirs(dst)
   errors = []
   for name in names:
     if name in ignored_names:
@@ -143,8 +144,6 @@
     SourcesToGN(args.gn_paths)
     return 0
 
-  if os.path.exists(args.to):
-    shutil.rmtree(args.to)
   if args.exclude_patterns == None:
     CopyTree(args.copy_from, args.to)
   else:
diff --git a/tools/create_tarball.py b/tools/create_tarball.py
index 887bc86..46ea0b9 100755
--- a/tools/create_tarball.py
+++ b/tools/create_tarball.py
@@ -40,8 +40,7 @@
 versiondir = ''
 
 # Ignore Git/SVN files, checked-in binaries, backup files, etc..
-ignoredPaths = ['tools/sdks',
-                'third_party/7zip', 'third_party/android_tools',
+ignoredPaths = ['third_party/7zip', 'third_party/android_tools',
                 'third_party/clang', 'third_party/d8',
                 'third_party/firefox_jsshell']
 ignoredDirs = ['.svn', '.git']
diff --git a/tools/gardening/bin/status_summary.dart b/tools/gardening/bin/status_summary.dart
index ad0621e..2c0bcdf 100644
--- a/tools/gardening/bin/status_summary.dart
+++ b/tools/gardening/bin/status_summary.dart
@@ -37,6 +37,8 @@
   List<Uri> statusFiles = await findStatusFiles(testDirectory);
   Directory pkgDirectory = findTestDirectory('pkg');
   statusFiles.addAll(await findStatusFiles(pkgDirectory));
+  Directory runtimeDirectory = findTestDirectory('runtime');
+  statusFiles.addAll(await findStatusFiles(runtimeDirectory));
   Map<String, List<StatusFile>> statusMap = <String, List<StatusFile>>{};
   for (Uri uri in statusFiles) {
     Map<String, StatusFile> currentMap = <String, StatusFile>{};
diff --git a/tools/gn.py b/tools/gn.py
index c9bb463..d727fbc 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -28,6 +28,8 @@
 # use instead of --platform-sdk
 DART_MAKE_PLATFORM_SDK = "DART_MAKE_PLATFORM_SDK"
 
+DART_GN_ARGS = "DART_GN_ARGS"
+
 def UseASAN():
   return DART_USE_ASAN in os.environ
 
@@ -60,6 +62,13 @@
   return DART_MAKE_PLATFORM_SDK in os.environ
 
 
+def GetGNArgs(args):
+  if args.gn_args != None:
+    return args.gn_args
+  args = os.environ.get(DART_GN_ARGS) or ""
+  return args.split()
+
+
 def GetOutDir(mode, arch, target_os):
   return utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
 
@@ -484,8 +493,7 @@
         out_dir = GetOutDir(mode, arch, target_os)
         command = [gn, 'gen', out_dir, '--check']
         gn_args = ToCommandLine(ToGnArgs(args, mode, arch, target_os))
-        if args.gn_args != None:
-          gn_args += args.gn_args
+        gn_args += GetGNArgs(args)
         if args.verbose:
           print "gn gen --check in %s" % out_dir
         if args.ide:
diff --git a/tools/make_version.py b/tools/make_version.py
index f4c25d0..68d6064 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -62,7 +62,7 @@
   version_cc_text = version_cc_text.replace("{{VERSION_STR}}",
                                             version_string)
   version_time = utils.GetGitTimestamp()
-  if version_time == None:
+  if ignore_svn_revision or version_time == None:
     version_time = "Unknown timestamp"
   version_cc_text = version_cc_text.replace("{{COMMIT_TIME}}",
                                             version_time)
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index aa61803..da1d9be 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -588,7 +588,7 @@
     var args = sharedOptions.toList();
 
     var sdkSummary = new Path(_configuration.buildDirectory)
-        .append("/gen/utils/dartdevc/ddc_sdk.dill")
+        .append("/gen/utils/dartdevc/kernel/ddc_sdk.dill")
         .absolute
         .toNativePath();
 
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index cd1be47..8d562ce 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -33,7 +33,7 @@
       this.hotReload,
       this.hotReloadRollback,
       this.isChecked,
-      this.isStrong,
+      bool isStrong,
       this.isHostChecked,
       this.isCsp,
       this.isMinified,
@@ -81,7 +81,11 @@
       this.fastTestsOnly,
       this.printPassingStdout})
       : _packages = packages,
-        _timeout = timeout;
+        _timeout = timeout,
+        isStrong = isStrong ||
+            // DDC always runs in strong mode.
+            compiler == Compiler.dartdevc ||
+            compiler == Compiler.dartdevk;
 
   final Architecture architecture;
   final Compiler compiler;
@@ -375,11 +379,6 @@
       print("-rflutter is applicable only for --arch=x64");
     }
 
-    if (compiler == Compiler.dartdevc && !isStrong) {
-      isValid = false;
-      print("--compiler dartdevc requires --strong");
-    }
-
     return isValid;
   }
 
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index cca9e4e..0bc7943 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -173,7 +173,7 @@
         throw 'Can not use --dart when testing Dart 2.0 configuration';
       }
 
-      dartExecutable = 'pkg/vm/tool/dart2';
+      dartExecutable = 'pkg/vm/tool/dart2$executableScriptSuffix';
     }
 
     if (dartExecutable == null) {
@@ -251,6 +251,7 @@
   }
 
   String get executableBinarySuffix => Platform.isWindows ? '.exe' : '';
+  String get executableScriptSuffix => Platform.isWindows ? '.bat' : '';
 
   /**
    * Call the callback function onTest with a [TestCase] argument for each
@@ -1239,7 +1240,6 @@
     if (options != null) args.addAll(options);
     options = optionsFromFile['dart2jsOptions'] as List<String>;
     if (options != null) args.addAll(options);
-    print('options = ${args}');
 
     return Command.compilation(Compiler.dart2js.name, outputFile,
         dart2JsBootstrapDependencies, compilerPath, args, environmentOverrides,
diff --git a/utils/bazel/kernel_summary_worker.dart b/utils/bazel/kernel_summary_worker.dart
index 55589f9..3cfe4d6 100644
--- a/utils/bazel/kernel_summary_worker.dart
+++ b/utils/bazel/kernel_summary_worker.dart
@@ -119,7 +119,7 @@
   var multiRoots = parsedArgs['multi-root'].map(Uri.base.resolve).toList();
   if (multiRoots.isEmpty) multiRoots.add(Uri.base);
   var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
-      multiRoots, fe.PhysicalFileSystem.instance);
+      multiRoots, fe.StandardFileSystem.instance);
   var sources = parsedArgs['source'].map(Uri.parse).toList();
   var state = await fe.initializeCompiler(
       // TODO(sigmund): pass an old state once we can make use of it.
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 5285538..c6e913d9 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -8,7 +8,7 @@
 
 patched_sdk_dir = "$target_gen_dir/patched_sdk"
 sdk_summary = "$target_gen_dir/ddc_sdk.sum"
-sdk_dill = "$target_gen_dir/ddc_sdk.dill"
+sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
 
 application_snapshot("dartdevc") {
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
@@ -42,7 +42,7 @@
 application_snapshot("dartdevk") {
   main_dart = "../../pkg/dev_compiler/bin/dartdevk.dart"
 
-  # TODO: Train this on real input.
+  # TODO(vsm): Train this on real input.
   training_args = [
     "--dart-sdk-summary",
     rebase_path(sdk_dill),
@@ -303,7 +303,7 @@
   ]
 
   inputs = [
-    "$target_gen_dir/ddc_sdk.dill",
+    sdk_dill,
     sdk_summary,
     "$target_gen_dir/dartdevc_files.stamp",
     "$root_gen_dir/pkg_files.stamp",
@@ -347,13 +347,13 @@
     "--analyzer-sdk",
     rebase_path(sdk_summary),
     "--kernel-sdk",
-    rebase_path("$target_gen_dir/ddc_sdk.dill"),
+    rebase_path(sdk_dill),
     "--output",
     rebase_path("$target_gen_dir"),
   ]
 }
 
-# Compiles the DDC SDK's kernel summary.
+# Compiles the DDC SDK's kernel summary and JS code.
 compiled_action("dartdevc_sdk_kernel_summary") {
   tool = "../../runtime/bin:dart"
 
@@ -366,11 +366,19 @@
   ]
 
   outputs = [
-    "$target_gen_dir/ddc_sdk.dill",
+    sdk_dill,
+    "$target_gen_dir/kernel/amd/dart_sdk.js",
+    "$target_gen_dir/kernel/amd/dart_sdk.js.map",
+    "$target_gen_dir/kernel/common/dart_sdk.js",
+    "$target_gen_dir/kernel/common/dart_sdk.js.map",
+    "$target_gen_dir/kernel/es6/dart_sdk.js",
+    "$target_gen_dir/kernel/es6/dart_sdk.js.map",
+    "$target_gen_dir/kernel/legacy/dart_sdk.js",
+    "$target_gen_dir/kernel/legacy/dart_sdk.js.map",
   ]
 
   args = [
     rebase_path("../../pkg/dev_compiler/tool/kernel_sdk.dart"),
-    rebase_path("$target_gen_dir/ddc_sdk.dill"),
+    rebase_path(sdk_dill),
   ]
 }