Version 2.0.0-dev.18.0

Merge commit 'a3b9cd273fa7fcd23b9a5ddc759f345bb357c4ea' into dev
diff --git a/BUILD.gn b/BUILD.gn
index 80e3bdd..e621934 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -56,6 +56,7 @@
     "runtime/vm:kernel_platform_files($host_toolchain)",
 
     # TODO(rmacnak): Link this into 'dart'.
+    "utils/kernel-service:copy_kernel_service_snapshot",
     "utils/kernel-service:kernel-service",
   ]
 }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 282a3ac..ad5a4f0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -172,8 +172,12 @@
 
 * Emit exit code 66 when a path dependency doesn't exist ([issue 1747][pub#1747]).
 
+* `pub publish` throws a more explicit error if the `publish_to` field isn't an
+  absolute URL ([issue 1769][pub#1769]).
+
 [pub#1556]: https://github.com/dart-lang/pub/issues/1556
 [pub#1747]: https://github.com/dart-lang/pub/issues/1747
+[pub#1769]: https://github.com/dart-lang/pub/issues/1769
 
 ##### Bug Fixes
 
diff --git a/DEPS b/DEPS
index 38556fb..46b2c54 100644
--- a/DEPS
+++ b/DEPS
@@ -96,8 +96,8 @@
   "intl_tag": "@0.15.2",
   "isolate_tag": "@1.1.0",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
-  "json_rpc_2_tag": "@2.0.4",
-  "linter_tag": "@0.1.41",
+  "json_rpc_2_tag": "@2.0.6",
+  "linter_tag": "@0.1.42",
   "logging_tag": "@0.11.3+1",
   "markdown_tag": "@1.0.0",
   "matcher_tag": "@0.12.1+4",
@@ -113,7 +113,7 @@
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.3.4",
   "protobuf_tag": "@0.6.0",
-  "pub_rev": "@667281eef93b4be648cceca400e954e000edba38",
+  "pub_rev": "@ca0d52f5d4058e7b9ef7b5091e407ff3ac05198d",
   "pub_semver_tag": "@1.3.2",
   "quiver_tag": "@0.27.0",
   "resource_rev":"@af5a5bf65511943398146cf146e466e5f0b95cb9",
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 1df31f2..8e7874d 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -36,6 +36,10 @@
 % - 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.
+% - Clarify that "noSuchMethod" must be implemented, not just redeclared
+%   abstractly, to eliminate certain diagnostic messages.
+% - Add generic functions and methods to the language.
+% - Don't cause warning if a non-system library import shadows a system library.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -219,7 +223,7 @@
 We use such lists extensively throughout this specification.
 
 \LMHash{}
-The notation $[x_1, \ldots, x_n/y_1, \ldots, y_n]E$ denotes a copy of $E$ in which all occurrences of $y_i, 1 \le i \le n$ have been replaced with $x_i$.
+The notation $[x_1/y_1, \ldots, x_n/y_n]E$ denotes a copy of $E$ in which all occurrences of $y_i, 1 \le i \le n$ have been replaced with $x_i$.
 
 \LMHash{}
 We sometimes abuse list or map literal syntax, writing $[o_1, \ldots, o_n]$ (respectively $\{k_1: o_1, \ldots, k_n: o_n\}$) where the $o_i$ and $k_i$ may be objects rather than expressions.
@@ -230,7 +234,7 @@
 Such specifications should be understood as a shorthand for:
 \begin{itemize}
 \item
-$x$ $op$ $y$ is equivalent to the method invocation $x.op^\prime(y)$, assuming the class of $x$ actually declared a non-operator method named $op^\prime$ defining the same function as the operator $op$.
+$x$ $op$ $y$ is equivalent to the method invocation $x.op'(y)$, assuming the class of $x$ actually declared a non-operator method named $op'$ defining the same function as the operator $op$.
 \end{itemize}
 
 \rationale{
@@ -760,7 +764,10 @@
 Functions abstract over executable actions.
 
 \begin{grammar}
-{\bf functionSignature:}metadata returnType? identifier formalParameterList
+{\bf functionSignature:}metadata returnType? identifier formalParameterPart
+  .
+
+{\bf formalParameterPart:}typeParameters? formalParameterList
   .
 
 {\bf returnType:}\VOID{};
@@ -776,11 +783,19 @@
 \end{grammar}
 
 \LMHash{}
-Functions include function declarations (\ref{functionDeclarations}), methods (\ref{instanceMethods}, \ref{staticMethods}), getters (\ref{getters}), setters (\ref{setters}), constructors (\ref{constructors}) and function literals (\ref{functionExpressions}).
+Functions can be introduced by function declarations (\ref{functionDeclarations}),
+method declarations (\ref{instanceMethods}, \ref{staticMethods}),
+getter declarations (\ref{getters}),
+setter declarations (\ref{setters}),
+and constructor declarations (\ref{constructors});
+and they can be introduced by function literals (\ref{functionExpressions}).
 
 \LMHash{}
-All functions have a signature and a body.
-The signature describes the formal parameters of the function, and possibly its name and return type.
+Each declaration that introduces a function has a signature that specifies its return type, name, and formal parameter part,
+except that the return type may be omitted, and getters never have a formal parameter part.
+Function literals have a formal parameter part, but no return type and no name.
+The formal parameter part optionally specifies the formal type parameter list of the function,
+and it always specifies its formal parameter list.
 A function body is either:
 \begin{itemize}
 \item A block statement (\ref{blocks}) containing the statements (\ref{statements}) executed by the function, optionally marked with one of the modifiers: \ASYNC, \ASYNC* or \SYNC*.
@@ -864,18 +879,6 @@
 The scope of a local function is described in section \ref{localFunctionDeclaration}.
 In both cases, the name of the function is in scope in its formal parameter scope (\ref{formalParameters}).
 
-%A function declaration of the form $T_0$ $id(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])\{s\}$ is equivalent to a variable declaration of the form \code{\FINAL{} $F$ $id$ = $(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])\{s\}$}, where $F$ is the function type alias (\ref{typedef}) \code{\TYPEDEF{} $T_0$ $F(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}])$}.  Likewise, a function declaration of the form $id(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])\{s\}$ is equivalent to a variable declaration of the form \code{\FINAL{} $F$ $id$ = $(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])\{s\}$}, where $F$ is the function type alias \code{\TYPEDEF{} $F(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}])$}.
-
-%\commentary{
-%Some obvious conclusions:
-
-%A function declaration of the form $id(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]) => e$ is equivalent to a variable declaration of the form \code{\FINAL{} $id$ = ($(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])=> e$}.
-
-%A function literal of the form $(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]) => e$ is equivalent to a function literal of the form \code{$(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])\{$ \RETURN{} $e$;\}}.
-%}
-
-%A function declaration of the form $T_0$ $id(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\})\{s\}$ is equivalent to a variable declaration of the form \code{\FINAL{} $F$ $id$ = $(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\})\{s\}$}, where $F$ is the function type alias (\ref{typedef}) \code{\TYPEDEF{} $T_0$ $F(T_1$ $a_1, \ldots, T_n$ $a_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]\}$}.  Likewise, a function declaration of the form $id(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\})\{s\}$ is equivalent to a variable declaration of the form \code{\FINAL{} $F$ $id$ = $(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\})\{s\}$}, where $F$ is the function type alias \code{\TYPEDEF{} $F(T_1$ $a_1, \ldots, T_n$ $a_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\})$}.
-
 \LMHash{}
 It is a compile-time error to preface a function declaration with the built-in identifier \STATIC{}.
 
@@ -888,17 +891,59 @@
 \LMLabel{formalParameters}
 
 \LMHash{}
-Every function includes a {\em formal parameter list}, which consists of a list of required positional parameters (\ref{requiredFormals}), followed by any optional parameters (\ref{optionalFormals}).
+Every non-getter function declaration includes a {\em formal parameter list},
+which consists of a list of required positional parameters (\ref{requiredFormals}),
+followed by any optional parameters (\ref{optionalFormals}).
 The optional parameters may be specified either as a set of named parameters or as a list of positional parameters, but not both.
 
 \LMHash{}
-The formal parameter list of a function introduces a new scope known as the function's {\em formal parameter scope}.
-The formal parameter scope of a function $f$ is enclosed in the scope where $f$ is declared.
-Every formal parameter introduces a local variable into the formal parameter scope.
-However, the scope of a function's signature is the function's enclosing scope, not the formal parameter scope.
+Some function declarations include a {\em formal type parameter list} (\ref{functions}),
+in which case we say that it is a {\em generic function}.
+A {\em non-generic function} is a function which is not generic.
 
 \LMHash{}
-The body of a function introduces a new scope known as the function's {\em body scope}.
+The {\em formal parameter part} of a function declaration consists of the formal type parameter list, if any, and the formal parameter list.
+
+\commentary{
+The following kinds of functions cannot be generic:
+Getters, setters, operators, and constructors.
+}
+
+\LMHash{}
+The formal type parameter list of a function declaration introduces a new scope known as the function's {\em type parameter scope}.
+The type parameter scope of a generic function $f$ is enclosed in the scope where $f$ is declared.
+Every formal type parameter introduces a type into the type parameter scope.
+
+\LMHash{}
+If it exists, the type parameter scope of a function $f$ is the current scope for the signature of $f$, and for the formal type parameter list itself;
+otherwise the scope where $f$ is declared is the current scope for the signature of $f$.
+
+\commentary{
+This means that formal type parameters are in scope in the bounds of parameter declarations,
+allowing for so-called F-bounded type parameters like
+
+\code{class C<X \EXTENDS{} Comparable<X>{}> \{ \ldots{} \}},
+
+\noindent
+and the formal type parameters are in scope for each other, allowing dependencies like
+\code{class D<X \EXTENDS{} Y, Y> \{ \ldots{} \}}.
+}
+
+\LMHash{}
+The formal parameter list of a function declaration introduces a new scope known as the function's {\em formal parameter scope}.
+The formal parameter scope of a non-generic function $f$ is enclosed in the scope where $f$ is declared.
+The formal parameter scope of a generic function $f$ is enclosed in the type parameter scope of $f$.
+Every formal parameter introduces a local variable into the formal parameter scope.
+The current scope for the function's signature is the scope that encloses the formal parameter scope.
+
+\commentary{
+This means that in a generic function declaration,
+the return type and parameter type annotations can use the formal type parameters,
+but the formal parameters are not in scope in the signature.
+}
+
+\LMHash{}
+The body of a function declaration introduces a new scope known as the function's {\em body scope}.
 The body scope of a function $f$ is enclosed in the scope introduced by the formal parameter scope of $f$.
 
 %The formal parameter scope of a function maps the name of each formal parameter $p$ to the value $p$ is bound to.
@@ -953,14 +998,15 @@
   simpleFormalParameter
   .
 
-{\bf functionFormalParameter:}metadata \COVARIANT{}? returnType? identifier formalParameterList
+{\bf functionFormalParameter:}metadata \COVARIANT{}? returnType? identifier
+  \gnewline{} formalParameterPart
   .
 
 {\bf simpleFormalParameter:}metadata \COVARIANT{}? finalConstVarOrType? identifier;
   .
 
 {\bf fieldFormalParameter:}metadata finalConstVarOrType? \THIS{} `{\escapegrammar .}' identifier
-  \gnewline{} formalParameterList?
+  \gnewline{} formalParameterPart?
   .
 \end{grammar}
 
@@ -1022,21 +1068,54 @@
 \LMLabel{typeOfAFunction}
 
 \LMHash{}
-If a function does not declare a return type explicitly, its return type is \DYNAMIC{} (\ref{typeDynamic}),
+If a function declaration 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.
-Then the type of $F$ is $(T_1 ,\ldots, T_n) \rightarrow T_0$.
+A function declaration may declare formal type parameters.
+The type of the function includes the names of the type parameters and their upper bounds.
+When consistent renaming of type parameters can make two function types identical,
+they are considered to be the same type.
+
+\commentary{
+It is convenient to include the type parameter names in function types because they are needed in order to express such things as relations among different type parameters, and F-bounds.
+However, we do not wish to distinguish two function types if they have the same structure and only differ in the choice of names.
+This treatment of names is also known as alpha-equivalence.
+}
 
 \LMHash{}
-Let $F$ be a function with required formal parameters $T_1$ $p_1 \ldots, T_n$ $p_n$, return type $T_0$ and positional optional parameters $T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $ p_{n+k}$.
-Then the type of $F$ is $(T_1 ,\ldots, T_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}]) \rightarrow T_0$.
+In the following three paragraphs,
+if the number $m$ of formal type parameters is zero then the type parameter list in the function type should be omitted.
 
 \LMHash{}
-Let $F$ be a function with required formal parameters $T_1$ $p_1 \ldots, T_n$ $p_n$, return type $T_0$ and named optional parameters $T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $ p_{n+k}$.
-Then the type of $F$ is $(T_1 ,\ldots, T_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\}) \rightarrow T_0$.
+Let $F$ be a function with
+formal type parameters $X_1\ B_1, \ldots,\ X_m\ B_m$,
+required formal parameters $T_1\ p_1, \ldots,\ T_n\ p_n$,
+return type $T_0$
+and no optional parameters.
+Then the type of $F$ is
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n$) $ \rightarrow T_0$}.
+
+\LMHash{}
+Let $F$ be a function with
+formal type parameters $X_1\ B_1, \ldots,\ X_m\ B_m$,
+required formal parameters $T_1\ p_1, \ldots,\ T_n\ p_n$,
+return type $T_0$
+and positional optional parameters $T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$.
+Then the type of $F$ is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$]) $ \rightarrow T_0$}.
+
+\LMHash{}
+Let $F$ be a function with
+formal type parameters $X_1\ B_1, \ldots,\ X_m\ B_m$,
+required formal parameters $T_1\ p_1, \ldots,\ T_n\ p_n$,
+return type $T_0$
+and named optional parameters $T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$.
+Then the type of $F$ is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$\}) $ \rightarrow T_0$}.
 
 \LMHash{}
 The run-time type of a function object always implements the class \code{Function}.
@@ -1255,8 +1334,8 @@
 
 {\bf operator:}`\~{}';
   binaryOperator;
-  `[' `]' ;
-  `[' `]' `='
+  `[]' ;
+  `[]='
   .
 
 {\bf binaryOperator:}multiplicativeOperator;
@@ -1458,7 +1537,7 @@
 It is a static warning if an abstract member $m$ is declared or inherited in a concrete class $C$ unless:
 \begin{itemize}
 \item $m$ overrides a concrete member, or
-\item $C$ has a \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
+\item $C$ has a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
 \end{itemize}
 
 \rationale{
@@ -1700,7 +1779,7 @@
 \LMHash{}
 Execution of a generative constructor $k$ of type $T$ to initialize a fresh instance $i$
 is always done with respect to a set of bindings for its formal parameters
-and the type parameters of the immediately enclosing class bound to a set of actual type arguments of $T$, $V_1, \ldots , V_m$.
+and the type parameters of the immediately enclosing class bound to a set of actual type arguments of $T$, $V_1, \ldots, V_m$.
 
 \commentary{
 These bindings are usually determined by the instance creation expression that invoked the constructor (directly or indirectly).
@@ -1710,10 +1789,14 @@
 \LMHash{}
 If $k$ is redirecting then its redirect clause has the form
 
-\THIS{}$.g(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\THIS{}.$g$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
-where $g$ identifies another generative constructor of the immediately surrounding class.
-Then execution of $k$ to initialize $i$ proceeds by evaluating the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$, and then executing $g$ to initialize $i$ with respect to the bindings resulting from the evaluation of $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ and with \THIS{} bound to $i$ and the type parameters of the immediately enclosing class bound to $V_1, \ldots , V_m$.
+where $g$ identifies another  generative constructor of the immediately surrounding class.
+Then execution of $k$ to initialize $i$ proceeds by evaluating the argument list
+\code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
+and then executing $g$ to initialize $i$ with respect to the bindings resulting from the evaluation of
+\code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+and with \THIS{} bound to $i$ and the type parameters of the immediately enclosing class bound to $V_1, \ldots, V_m$.
 
 \LMHash{}
 Otherwise, execution proceeds as follows:
@@ -1783,14 +1866,17 @@
 \LMHash{}
 Execution of a superinitializer of the form
 
-\SUPER{}$(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k})$
+\code{\SUPER{}($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
-(respectively \SUPER{}$.id(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k})$
+(respectively
+\code{\SUPER{}.id($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)})
 
 proceeds as follows:
 
 \LMHash{}
-First, the argument list $(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k})$ is evaluated.
+First, the argument list
+\code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+is evaluated.
 
 \LMHash{}
 Then, after the remainder of the initializer list of $k$ has been executed,
@@ -1803,7 +1889,7 @@
 \LMHash{}
 The generative constructor $S$ (respectively $S.id$) of $S$ is executed
 to initialize $i$ with respect to the bindings that resulted from the evaluation of
-$(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 and the type parameters (if any) of class $S$ bound to $U_1, \ldots, U_m$.
 
 \LMHash{}
@@ -1824,7 +1910,8 @@
 %The enclosing scope of a factory constructor is the static scope \ref{} of the class in which it is declared.
 
 \LMHash{}
-The {\em return type} of a factory whose signature is of the form \FACTORY{} $M$ or the form \FACTORY{} $M.id$ is $M$ if $M$ is not a generic type; otherwise the return type is $M <T_1, \ldots, T_n>$ where $T_1, \ldots, T_n$ are the type parameters of the enclosing class
+The {\em return type} of a factory whose signature is of the form \FACTORY{} $M$ or the form \FACTORY{} $M.id$ is $M$ if $M$ is not a generic type;
+otherwise the return type is \code{$M$<$T_1, \ldots,\ T_n$>} where $T_1, \ldots, T_n$ are the type parameters of the enclosing class.
 
 \LMHash{}
 It is a compile-time error if $M$ is not the name of the immediately enclosing class.
@@ -1857,18 +1944,18 @@
 \end{grammar}
 
 \LMHash{}
-Calling a redirecting factory constructor $k$ causes the constructor $k^\prime$ denoted by $type$ (respectively, $type.identifier$) to be called with the actual arguments passed to $k$, and returns the result of $k^\prime$ as the result of $k$.
+Calling a redirecting factory constructor $k$ causes the constructor $k'$ denoted by $type$ (respectively, $type.identifier$) to be called with the actual arguments passed to $k$, and returns the result of $k'$ as the result of $k$.
 The resulting constructor call is governed by the same rules as an instance creation expression using \NEW{} (\ref{instanceCreation}).
 
 \commentary{
 It follows that if $type$ or $type.id$ are not defined, or do not refer to a class or constructor, a dynamic error occurs, as with any other undefined constructor call.
-The same holds if $k$ is called with fewer required parameters or more positional parameters than $k^\prime$ expects, or if $k$ is called with a named parameter that is not declared by $k^\prime$.
+The same holds if $k$ is called with fewer required parameters or more positional parameters than $k'$ expects, or if $k$ is called with a named parameter that is not declared by $k'$.
 }
 
 \LMHash{}
 It is a compile-time error if $k$ explicitly specifies a default value for an optional parameter.
 \commentary{
-Default values specified in $k$ would be ignored, since it is the {\em actual} parameters that are passed to $k^\prime$.
+Default values specified in $k$ would be ignored, since it is the {\em actual} parameters that are passed to $k'$.
 Hence, default values are disallowed.
 }
 
@@ -1924,17 +2011,17 @@
 %\end{dartCode}
 
 \LMHash{}
-It is a compile-time error if $k$ is prefixed with the \CONST{} modifier but $k^\prime$ is not a constant constructor (\ref{constantConstructors}).
+It is a compile-time error if $k$ is prefixed with the \CONST{} modifier but $k'$ is not a constant constructor (\ref{constantConstructors}).
 
 \LMHash{}
-It is a static warning if the function type of $k^\prime$ is not a subtype of the type of $k$.
+It is a static warning if the function type of $k'$ is not a subtype of the type of $k$.
 
 \commentary{
 This implies that the resulting object conforms to the interface of the immediately enclosing class of $k$.
 }
 
 \LMHash{}
-It is a static type warning if any of the type arguments to $k^\prime$ are not subtypes of the bounds of the corresponding formal type parameters of $type$.
+It is a static type warning if any of the type arguments to $k'$ are not subtypes of the bounds of the corresponding formal type parameters of $type$.
 
 
 \subsubsection{Constant Constructors}
@@ -1976,7 +2063,7 @@
 Any expression that appears within the initializer list of a constant constructor must be a potentially constant expression, or a compile-time error occurs.
 
 \LMHash{}
-A {\em potentially constant expression} is an expression $e$ that would be a valid constant expression if all formal parameters of $e$'s immediately enclosing constant constructor were treated as compile-time constants that were guaranteed to evaluate to an integer, boolean or string value as required by their immediately enclosing superexpression, <em>and</em> where $e$ is also a valid expression if all the formal parameters are treated as non-constant variables.
+A {\em potentially constant expression} is an expression $e$ that would be a valid constant expression if all formal parameters of $e$'s immediately enclosing constant constructor were treated as compile-time constants that were guaranteed to evaluate to an integer, boolean or string value as required by their immediately enclosing superexpression, and where $e$ is also a valid expression if all the formal parameters are treated as non-constant variables.
 
 \commentary{
 Note that a parameter that is not used in a superexpression that is restricted to certain types can be a constant of any type.
@@ -2128,7 +2215,7 @@
 \LMLabel{superclasses}
 
 \LMHash{}
-The superclass of a class $C$ that has a with clause \code{\WITH{} $M_1, \ldots, M_k$} and an extends clause \code{\EXTENDS{} S} is the application of mixin (\ref{mixins}) $M_k* \cdots * M_1$ to S.
+The superclass of a class $C$ that has a with clause \code{\WITH{} $M_1, \ldots,\ M_k$} and an extends clause \code{\EXTENDS{} S} is the application of mixin (\ref{mixins}) $M_k* \cdots * M_1$ to S.
 If no \WITH{} clause is specified then the \EXTENDS{} clause of a class $C$ specifies its superclass.
 If no \EXTENDS{} clause is specified, then either:
 \begin{itemize}
@@ -2173,8 +2260,8 @@
 A class $S$ is {\em a superclass} of a class $C$ if{}f either:
 \begin{itemize}
 \item $S$ is the superclass of $C$, or
-\item $S$ is a superclass of a class $S^{\prime}$,
-and $S^{\prime}$ is the superclass of $C$.
+\item $S$ is a superclass of a class $S'$,
+and $S'$ is the superclass of $C$.
 \end{itemize}
 
 \LMHash{}
@@ -2187,8 +2274,8 @@
 %A class $C$ {\em inherits} any accessible instance members of its superclass that are not overridden by members declared in $C$.
 
 \LMHash{}
-Let $C$ be a class, let $A$ be a superclass of $C$, and let $S_1 \ldots S_k$ be superclasses of $C$ that are also subclasses of $A$.
-$C$ {\em inherits} all accessible instance members of $A$ that have not been overridden by a declaration in $C$ or in at least one of $S_1 \ldots S_k$.
+Let $C$ be a class, let $A$ be a superclass of $C$, and let $S_1, \ldots, S_k$ be superclasses of $C$ that are also subclasses of $A$.
+$C$ {\em inherits} all accessible instance members of $A$ that have not been overridden by a declaration in $C$ or in at least one of $S_1, \ldots, S_k$.
 
 \rationale{
 It would be more attractive to give a purely local definition of inheritance, that depended only on the members of the direct superclass $S$.
@@ -2202,11 +2289,11 @@
 A class may override instance members that would otherwise have been inherited from its superclass.
 
 \LMHash{}
-Let $C = S_0$ be a class declared in library $L$, and let $\{S_1 \ldots S_k\}$ be the set of all superclasses of $C$, where $S_i$ is the superclass of $S_{i-1}$ for $i \in 1 .. k$.
-Let $C$ declare a member $m$, and let $m^\prime$ be a member of $S_j, j \in 1 .. k$, that has the same name as $m$, such that $m^\prime$ is accessible to $L$.
-Then $m$ overrides $m^\prime$ if $m^\prime$ is not already overridden by a member of at least one of $S_1 \ldots S_{j-1}$ and neither $m$ nor $m^\prime$ are instance variables.
+Let $C = S_0$ be a class declared in library $L$, and let $\{S_1, \ldots, S_k\}$ be the set of all superclasses of $C$, where $S_i$ is the superclass of $S_{i-1}$ for $i \in 1 .. k$.
+Let $C$ declare a member $m$, and let $m'$ be a member of $S_j, j \in 1 .. k$, that has the same name as $m$, such that $m'$ is accessible to $L$.
+Then $m$ overrides $m'$ if $m'$ is not already overridden by a member of at least one of $S_1, \ldots, S_{j-1}$ and neither $m$ nor $m'$ are instance variables.
 
-%Let $C$ be a class declared in library $L$, with superclass $S$ and let $C$ declare an instance member $m$, and assume $S$ declares an instance member $m^\prime$ with the same name as $m$. Then $m$ {\em overrides} $m^\prime$ if{}f $m^\prime$ is accessible (\ref{privacy}) to $L$, $m$ has the same name as $m^\prime$ and neither $m$ nor $m^\prime$ are fields.
+%Let $C$ be a class declared in library $L$, with superclass $S$ and let $C$ declare an instance member $m$, and assume $S$ declares an instance member $m'$ with the same name as $m$. Then $m$ {\em overrides} $m'$ if{}f $m'$ is accessible (\ref{privacy}) to $L$, $m$ has the same name as $m'$ and neither $m$ nor $m'$ are fields.
 
 \commentary{
 Instance variables never override each other.
@@ -2236,7 +2323,7 @@
 }
 
 \LMHash{}
-It is a static warning if a non-abstract class inherits an abstract method.
+It is a static warning if a concrete class inherits an abstract method.
 
 \commentary{
 For convenience, here is a summary of the relevant rules.
@@ -2284,7 +2371,7 @@
 If this is impossible then no member $m$ appears in the interface.
 \end{itemize} (\ref{interfaceInheritanceAndOverriding})
 \item Rule \ref{typeSigAssignable} applies to interfaces as well as classes (\ref{interfaceInheritanceAndOverriding}).
-\item It is a static warning if a concrete class does not have an implementation for a method in any of its superinterfaces unless it has a \code{noSuchMethod} method (\ref{superinterfaces}).
+\item It is a static warning if a concrete class does not have an implementation for a method in any of its superinterfaces unless it has a concrete \code{noSuchMethod} method (\ref{superinterfaces}) distinct from the one in class \code{Object}.
 \item The identifier of a named constructor cannot be the same as the name of a member declared (as opposed to inherited) in the same class (\ref{constructors}).
 \end{enumerate}
 }
@@ -2329,8 +2416,8 @@
 It is a compile-time error if the interface of a class $C$ is a superinterface of itself.
 
 \LMHash{}
-Let $C$ be a concrete class that does not have a \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
-It is a static warning if the implicit interface of $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding non-abstract instance member $m$ of type $F'$ such that $F' <: F$.
+Let $C$ be a concrete class that does not have a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
+It is a static warning if the implicit interface of $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding concrete instance member $m$ of type $F'$ such that $F' <: F$.
 
 \commentary{
 A class does not inherit members from its superinterfaces.
@@ -2339,7 +2426,7 @@
 
 \rationale{
 We choose to issue these warnings only for concrete classes; an abstract class might legitimately be designed with the expectation that concrete subclasses will implement part of the interface.
-We also disable these warnings if a \code{noSuchMethod()} declaration is present or inherited from any class other than \code{Object}.
+We also disable these warnings if a concrete \code{noSuchMethod()} declaration is present or inherited from any class other than \code{Object}.
 In such cases, the supported interface is going to be implemented via \code{noSuchMethod()} and no actual declarations of the implemented interface's members are needed.
 This allows proxy classes for specific types to be implemented without provoking type warnings.
 }
@@ -2390,30 +2477,30 @@
 \end{itemize}
 
 \LMHash{}
-Furthermore, we define $overrides(J, K)$ to be the set of members $m^\prime$ such that all of the following hold:
+Furthermore, we define $overrides(J, K)$ to be the set of members $m'$ such that all of the following hold:
 \begin{itemize}
 \item $J$ is the implicit interface of a class $C$.
 \item $C$ declares a member $m$.
-\item $m^\prime$ has the same name as $m$.
-\item $m^\prime$ is accessible to $K$.
+\item $m'$ has the same name as $m$.
+\item $m'$ is accessible to $K$.
 \item $A$ is a direct superinterface of $J$ and either
   \begin{itemize}
-  \item $A$ declares a member $m^\prime$ or
-  \item $m^\prime$ is a member of $inherited(A, K)$.
+  \item $A$ declares a member $m'$ or
+  \item $m'$ is a member of $inherited(A, K)$.
   \end{itemize}
 \end{itemize}
 
 \LMHash{}
 Let $I$ be the implicit interface of a class $C$ declared in library $L$.
-$I$ {\em inherits} all members of $inherited(I, L)$ and $I$ {\em overrides} $m^\prime$ if $m^\prime \in overrides(I, L)$.
+$I$ {\em inherits} all members of $inherited(I, L)$ and $I$ {\em overrides} $m'$ if $m' \in overrides(I, L)$.
 
 \LMHash{}
 All the static warnings pertaining to the overriding of instance members given in section \ref{classes} above hold for overriding between interfaces as well.
 
 \LMHash{}
-It is a static warning if $m$ is a method and $m^\prime$ is a getter, or if $m$ is a getter and $m^\prime$ is a method.
+It is a static warning if $m$ is a method and $m'$ is a getter, or if $m$ is a getter and $m'$ is a method.
 
-%Let $I = S_0$ be the implicit interface of a class $C$ declared in library $L$, and let $\{S_1 \ldots S_k\}$ be the set of all superinterfaces of $I$.
+%Let $I = S_0$ be the implicit interface of a class $C$ declared in library $L$, and let $\{S_1, \ldots, S_k\}$ be the set of all superinterfaces of $I$.
 
 %Let $I$ be the implicit interface of a class $C$.  $I$ inherits any instance members of its superinterfaces that are not overridden by members declared in $C$.
 
@@ -2426,9 +2513,11 @@
 If some but not all of the $m_i, 1 \le i \le k$ are getters none of the $m_i$ are inherited, and a static warning is issued.
 
 \LMHash{}
-Otherwise, if the static types $T_1, \ldots, T_k$ of the members $m_1, \ldots, m_k$ are not identical, then there must be a member $m_x$ such that $T_x <: T_i, 1 \le x \le k$ for all $i \in 1 .. k$, or a static type warning occurs.
-The member that is inherited is $m_x$, if it exists; otherwise:
-let $numberOfPositionals(f)$ denote the number of positional parameters of a function $f$, and let $numberOfRequiredParams(f)$ denote the number of required parameters of a function $f$.
+Otherwise, if the static types $T_1, \ldots, T_k$ of the members $m_1, \ldots, m_k$ are not identical then there must be an $x \in 1 .. k$ such that $T_x <: T_i$ for all $i \in 1 .. k$,
+or a static type warning occurs.
+The member that is inherited  is $m_x$, if it exists; otherwise:
+let $numberOfPositionals(f)$ denote the number of positional parameters of a function $f$,
+and let $numberOfRequiredParams(f)$ denote the number of required parameters of a function $f$.
 Furthermore, let $s$ denote the set of all named parameters of the $m_1, \ldots, m_k$.
 Then let
 
@@ -2496,7 +2585,7 @@
 A mixin application of the form \code{$S$ \WITH{} $M$;} defines a class $C$ with superclass $S$.
 
 \LMHash{}
-A mixin application of the form \code{$S$ \WITH{} $M_1, \ldots, M_k$;} defines a class $C$ whose superclass is the application of the mixin composition (\ref{mixinComposition}) $M_{k-1} * \ldots * M_1$ to $S$.
+A mixin application of the form \code{$S$ \WITH{} $M_1, \ldots,\ M_k$;} defines a class $C$ whose superclass is the application of the mixin composition (\ref{mixinComposition}) $M_{k-1} * \ldots * M_1$ to $S$.
 
 \LMHash{}
 In both cases above, $C$ declares the same instance members as $M$ (respectively, $M_k$).
@@ -2504,10 +2593,13 @@
 
 \LMHash{}
 Let $L_M$ be the library in which $M$ is declared.
-For each generative constructor named $q_i(T_{i1}$ $ a_{i1}, \ldots , T_{ik_i}$ $ a_{ik_i}), i \in 1 .. n$ of $S$ that is accessible to $L_M$, $C$ has an implicitly declared constructor named
+For each generative constructor named
+$q_i(T_{i1}\ a_{i1}, \ldots,\ T_{ik_i}\ a_{ik_i}), i \in 1 .. n$
+of $S$ that is accessible to $L_M$,
+$C$ has an implicitly declared constructor named
 $q'_i = [C/S]q_i$ of the form
 
-$q'_i(a_{i1}, \ldots , a_{ik_i}):\SUPER(a_{i1}, \ldots , a_{ik_i});$.
+\code{$q'_i$($a_{i1}, \ldots,\ a_{ik_i}$): \SUPER($a_{i1}, \ldots,\ a_{ik_i}$);}.
 
 %super.id
 
@@ -2529,15 +2621,18 @@
 }
 
 \LMHash{}
-The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form \code{\CLASS{} $C<T_1, \ldots, T_n>$ = $M$; } in library $L$ is to introduce the name $C$ into the scope of $L$, bound to the class (\ref{classes}) defined by the mixin application $M$.
+The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form \code{\CLASS{} $C$<$T_1, \ldots,\ T_n$> = $M$; } in library $L$ is to introduce the name $C$ into the scope of $L$, bound to the class (\ref{classes}) defined by the mixin application $M$.
 The name of the class is also set to $C$.
 If{}f the class is prefixed by the built-in identifier \ABSTRACT{}, the class being defined is an abstract class.
 
+\LMHash{}
 Let $M_A$ be a mixin derived from a class $M$ with direct superclass $S_{static}$, e.g., as defined by the class declaration \code{class M extends S$_{static}$ \{ \ldots \}}.
 
+\LMHash{}
 Let $A$ be an application of $M_A$.
 It is a static warning if the superclass of $A$ is not a subtype of $S_{static}$.
 
+\LMHash{}
 Let $C$ be a class declaration that includes $M_A$ in a with clause.
 It is a static warning if $C$ does not implement, directly or indirectly, all the direct superinterfaces of $M$.
 
@@ -2550,22 +2645,22 @@
 }
 
 \LMHash{}
-The {\em composition of two mixins}, $M_1<T_1 \ldots T_{k_{M_1}}>$ and $M_2<U_1 \ldots U_{k_{M_2}}>$, written $M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1 \ldots U_{k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1 \ldots V_{k_S}>$, the application of
+The {\em composition of two mixins}, $M_1<T_1, \ldots, T_{k_{M_1}}>$ and $M_2<U_1, \ldots, U_{k_{M_2}}>$, written $M_1<T_1, \ldots, T_{k_{M_1}}> * M_2<U_1, \ldots, U_{k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1, \ldots, V_{k_S}>$, the application of
 
-$M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1 \ldots U_{k_{M_2}}>$
+$M_1<T_1, \ldots, T_{k_{M_1}}> * M_2<U_1, \ldots, U_{k_{M_2}}>$
 
-to $S<V_1 \ldots V_{k_S}>$ is equivalent to
+to $S<V_1, \ldots, V_{k_S}>$ is equivalent to
 
 \begin{dartCode}
-\ABSTRACT{} \CLASS{} $Id_1<T_1 \ldots T_{k_{M_1}}, U_1 \ldots U_{k_{M_2}}, V_1 \ldots V_{k_S}> = $
-      $Id_2<U_1 \ldots U_{k_{M_2}}, V_1 \ldots V_{k_S}>$ \WITH{} $M_1 <T_1 \ldots T_{k_{M_1}}>$;
+\ABSTRACT{} \CLASS{} $Id_1<T_1, \ldots, T_{k_{M_1}}, U_1, \ldots, U_{k_{M_2}}, V_1, \ldots, V_{k_S}> = $
+      $Id_2<U_1, \ldots, U_{k_{M_2}}, V_1, \ldots, V_{k_S}>$ \WITH{} $M_1 <T_1, \ldots, T_{k_{M_1}}>$;
 \end{dartCode}
 
 where $Id_2$ denotes
 
 \begin{dartCode}
-\ABSTRACT{} \CLASS{} $Id_2<U_1 \ldots U_{k_{M_2}}, V_1 \ldots V_{k_S}> =$
-                         $S<V_1 \ldots V_{k_S}>$ \WITH{} $M_2<U_1 \ldots U_{k_{M_2}}>$;
+\ABSTRACT{} \CLASS{} $Id_2<U_1, \ldots, U_{k_{M_2}}, V_1, \ldots, V_{k_S}> =$
+                         $S<V_1, \ldots, V_{k_S}>$ \WITH{} $M_2<U_1, \ldots, U_{k_{M_2}}>$;
 \end{dartCode}
 
 and $Id_1$ and $Id_2$ are unique identifiers that do not exist anywhere in the program.
@@ -2597,7 +2692,7 @@
 \end{grammar}
 
 \LMHash{}
-The declaration of an enum of the form \code{metadata \ENUM{} E \{ id$_0$, \ldots id$_{n-1}$\};}
+The declaration of an enum of the form \code{metadata \ENUM{} E \{ id$_0$, \ldots,\ id$_{n-1}$\};}
 has the same effect as a class declaration
 
 \begin{dartCode}
@@ -2607,7 +2702,7 @@
   \STATIC{} \CONST{} E id$_0$ = \CONST{} E(0);
   $\ldots$
   \STATIC{} \CONST{} E id$_{n-1}$ = const E(n - 1);
-  \STATIC{} \CONST{} List<E> values = const <E>[id$_0 \ldots $ id$_{n-1}$];
+  \STATIC{} \CONST{} List<E> values = const <E>[id$_0, \ldots, $ id$_{n-1}$];
   String toString() => \{ 0: `E.id$_0$', $\ldots$, n-1: `E.id$_{n-1}$'\}[index]
 \}
 \end{dartCode}
@@ -2622,9 +2717,93 @@
 \LMLabel{generics}
 
 \LMHash{}
-A class declaration (\ref{classes}) or type alias (\ref{typedef})
-$G$ may be {\em generic}, that is, $G$ may have formal type parameters declared.
-A generic declaration induces a family of declarations, one for each set of actual type parameters provided in the program.
+A class declaration (\ref{classes}), type alias (\ref{typedef}), or function (\ref{functions}) $G$ may be {\em generic}, that is, $G$ may have formal type parameters declared.
+
+\LMHash{}
+When an entity in this specification is described as generic,
+and the special case is considered where the number of type arguments is zero,
+the type argument list should be omitted.
+
+\commentary{
+This allows non-generic cases to be included implicitly as special cases.
+For example, an invocation of a non-generic function arises as the special case where the function takes zero type arguments, and zero type arguments are passed.
+In this situation some operations are also omitted (have no effect), e.g.,
+operations where formal type parameters are replaced by actual type arguments.
+}
+
+\LMHash{}
+A {\em generic class declaration} introduces a generic class into the enclosing library scope.
+A {\em generic class} is a mapping that accepts a list of actual type arguments and maps them to a class.
+Consider a generic class declaration $G$ named \code{C} with formal type parameter declarations
+$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
+and a parameterized type \code{C<$T_1, \ldots,\ T_l$>}.
+
+\LMHash{}
+It is a static warning if $m \not= l$.
+It is a static warning if there exists a $j$
+such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
+
+\commentary{
+That is, if the number of type arguments is wrong,
+or if the $j$th actual type argument is not a subtype of the corresponding bound, where each formal type parameter has been replaced by the corresponding actual type argument.
+}
+
+\LMHash{}
+Otherwise, said parameterized type \code{C<$T_1, \ldots,\ T_m$>} denotes an application of the generic class declared by $G$ to the type arguments $T_1, \ldots, T_m$.
+This yields a class $C'$ whose members are equivalent to those of a class declaration which is obtained from the declaration of $G$ by replacing each occurrence of $X_j$ by $T_j$.
+\commentary{
+
+% TODO(eernst): make sure this list of properties is complete.
+Other properties of $C'$ such as the subtype relationships are specified elsewhere (\ref{interfaceTypes}).
+}
+
+\LMHash{}
+A {\em generic type alias} introduces a mapping from actual type argument lists to types.
+Consider a generic type alias declaration $G$ named \code{F} with formal type parameter declarations
+$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
+and right hand side $T$,
+and the parameterized type \code{F<$T_1, \ldots,\ T_l$>}.
+
+\LMHash{}
+It is a static warning if $m \not= l$.
+It is a static warning if there exists a $j$
+such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
+
+\commentary{
+That is, if the number of type arguments is wrong,
+or if the $j$th actual type argument violates the bound.
+}
+
+\LMHash{}
+Otherwise, said parameterized type
+\code{F<$T_1, \ldots,\ T_m$>}
+denotes an application of the mapping denoted by $G$ to the type arguments
+$T_1, \ldots, T_m$.
+This yields the type
+$[T_1/X_1, \ldots, T_m/X_m]T$.
+
+\commentary{
+A generic type alias does not correspond to any entities at run time,
+it is only an alias for an existing type.
+Hence, we may consider it as syntactic sugar which is eliminated before the program runs.
+}
+
+\LMHash{}
+A {\em generic function declaration} introduces a generic function (\ref{formalParameters}) into the enclosing scope.
+Consider a function invocation expression of the form
+\code{f<$T_1, \ldots,\ T_l$>(\ldots)},
+where the static type of \code{f} is a generic function type with formal type parameters
+$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$.
+
+\LMHash{}
+It is a static warning if $m \not= l$.
+It is a static warning if there exists a $j$
+such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
+
+\commentary{
+That is, if the number of type arguments is wrong,
+or if the $j$th actual type argument is not a subtype of the corresponding bound, where each formal type parameter has been replaced by the corresponding actual type argument.
+}
 
 \begin{grammar}
 {\bf typeParameter:}metadata identifier (\EXTENDS{} type)?
@@ -2641,14 +2820,20 @@
 The bounds of type variables are a form of type annotation and have no effect on execution in production mode.
 
 \LMHash{}
-Type parameters are declared in the type-parameter scope of a class.
+Type parameters are declared in the type parameter scope of a class or function.
 The type parameters of a generic $G$ are in scope in the bounds of all of the type parameters of $G$.
 The type parameters of a generic class declaration $G$ are also in scope in the \EXTENDS{} and \IMPLEMENTS{} clauses of $G$ (if these exist) and in the body of $G$.
-However, a type parameter is considered to be a malformed type when referenced by a static member.
+However, a type parameter of a generic class is considered to be a malformed type when referenced by a static member.
+
+\commentary{
+The scopes associated with the type parameters of a generic function are described in (\ref{formalParameters}).
+}
 
 \rationale{
-The restriction is necessary since a type variable has no meaning in the context of a static member, because statics are shared among all instantiations of a generic.
-However, a type variable may be referenced from an instance initializer, even though \THIS{} is not available.
+The restriction on static members is necessary since a type variable has no meaning in the context of a static member,
+because statics are shared among all generic instantiations of a generic class.
+However, a type variable may be referenced from an instance initializer,
+even though \THIS{} is not available.
 }
 
 \commentary{
@@ -2685,7 +2870,7 @@
 %\item The type arguments of any parameterized type in $S$.
 %\end{itemize}
 
-%Let $P$ be the instantiation of a generic type with its own type parameters. It is a compile-time error if the induced type set of $P$ is not finite.
+%Let $P$ be the generic instantiation of a generic type with its own type parameters. It is a compile-time error if the induced type set of $P$ is not finite.
 
 %\rationale {A typical recursive type declaration such as}
 
@@ -2695,7 +2880,7 @@
 %\end{dartCode}
 
 %\rationale{
-%poses no problem under this rule. The instantiation \code{D<T>} has an induced
+%poses no problem under this rule. The generic instantiation \code{D<T>} has an induced
 %set consisting of: \code{B<D<T$>>$, Object, D<T>, T}. However, the following variant
 %}
 
@@ -2705,8 +2890,8 @@
 %\end{dartCode}
 
 %\rationale{
-%is disallowed. Consider again the instantiation \code{D<T>}. It leads to the
-%superclass \code{B<D<D<T$>>>$}, and so adds \code{D<D$< $T$>>$} to the induced set. The latter in turn leads to \code{B<D<D<D<T$>>>>$} and \code{D<D<D<T$>>>$}
+%is disallowed. Consider again the generic instantiation \code{D<T>}. It leads to the
+%superclass \code{B<D<D<T$>>>$}, and so adds \code{D<D$<$T$>>$} to the induced set. The latter in turn leads to \code{B<D<D<D<T$>>>>$} and \code{D<D<D<T$>>>$}
 %and so on ad infinitum.}
 
 %\commentary{
@@ -2934,12 +3119,12 @@
   m1() \{
    \VAR{} z = \FALSE{};
     \IF{} (z) \{\RETURN{} x; \}
-    \ELSE{} \{ \RETURN{} 2;\}
+    \ELSE{} \{ \RETURN{} 2; \}
   \}
 
   m2() \{
     \IF{} (\TRUE{}) \{\RETURN{} y; \}
-    \ELSE{} \{ \RETURN{} 3;\}
+    \ELSE{} \{ \RETURN{} 3; \}
   \}
 \}
 \end{dartCode}
@@ -3176,8 +3361,8 @@
 \begin{grammar}
 {\bf singleLineString:}`{\escapegrammar \code{"}}' stringContentDQ* `{\escapegrammar \code{"}}';
   `{\escapegrammar \code{'}}' stringContentSQ* `{\escapegrammar \code{'}}';
-  `r' `{\escapegrammar \code{'}}' (\~{}( `{\escapegrammar \code{'}}' $|$ NEWLINE ))* `{\escapegrammar \code{'}}';
-  `r' `{\escapegrammar \code{"}}' (\~{}( `{\escapegrammar \code{"}}' $|$ NEWLINE ))* `{\escapegrammar \code{"}}'
+  `r{\escapegrammar \code{'}}' (\~{}( `{\escapegrammar \code{'}}' $|$ NEWLINE ))* `{\escapegrammar \code{'}}';
+  `r{\escapegrammar \code{"}}' (\~{}( `{\escapegrammar \code{"}}' $|$ NEWLINE ))* `{\escapegrammar \code{"}}'
   .
 \end{grammar}
 
@@ -3244,19 +3429,19 @@
 \begin{grammar}
 {\bf multilineString:}`{\escapegrammar \texttt{"""}}' stringContentTDQ* `{\escapegrammar \texttt{"""}}';
   `{\escapegrammar \code{'}\code{'}\code{'}}' stringContentTSQ* `{\escapegrammar \code{'}\code{'}\code{'}}';
-  `r' `{\escapegrammar \texttt{"""}}' (\~{} `{\escapegrammar \texttt{"""}}')* `{\escapegrammar \texttt{"""}}';
-  `r' `{\escapegrammar \code{'}\code{'}\code{'}}' (\~{} `{\escapegrammar \code{'}\code{'}\code{'}}')* `{\escapegrammar \code{'}\code{'}\code{'}}'
+  `r{\escapegrammar \texttt{"""}}' (\~{} `{\escapegrammar \texttt{"""}}')* `{\escapegrammar \texttt{"""}}';
+  `r{\escapegrammar \code{'}\code{'}\code{'}}' (\~{} `{\escapegrammar \code{'}\code{'}\code{'}}')* `{\escapegrammar \code{'}\code{'}\code{'}}'
   .
 
-{\bf ESCAPE\_SEQUENCE:}`$\backslash$ n';
-  `$\backslash$ r';
-  `$\backslash$ f';
-  `$\backslash$ b';
-  `$\backslash$ t';
-  `$\backslash$ v';
-  `$\backslash$ x' HEX\_DIGIT HEX\_DIGIT;
-  `$\backslash$ u' HEX\_DIGIT HEX\_DIGIT HEX\_DIGIT HEX\_DIGIT;
-  `$\backslash$ u\{' HEX\_DIGIT\_SEQUENCE `\}'
+{\bf ESCAPE\_SEQUENCE:}`$\backslash$n';
+  `$\backslash$r';
+  `$\backslash$f';
+  `$\backslash$b';
+  `$\backslash$t';
+  `$\backslash$v';
+  `$\backslash$x' HEX\_DIGIT HEX\_DIGIT;
+  `$\backslash$u' HEX\_DIGIT HEX\_DIGIT HEX\_DIGIT HEX\_DIGIT;
+  `$\backslash$u\{' HEX\_DIGIT\_SEQUENCE `\}'
   .
 
 {\bf HEX\_DIGIT\_SEQUENCE:}HEX\_DIGIT HEX\_DIGIT? HEX\_DIGIT?
@@ -3266,7 +3451,7 @@
 
 \LMHash{}
 Multiline strings are delimited by either matching triples of single quotes or matching triples of double quotes.
-If the first line of a multiline string consists solely of the whitespace characters defined by the production {\em WHITESPACE} \ref{lexicalRules}), possibly prefixed by $\backslash$, then that line is ignored, including the line break at its end.
+If the first line of a multiline string consists solely of the whitespace characters defined by the production {\em WHITESPACE} (\ref{lexicalRules}), possibly prefixed by $\backslash$, then that line is ignored, including the line break at its end.
 
 \rationale{
 The idea is to ignore a whitespace-only first line of a multiline string, where whitespace is defined as tabs, spaces and the final line break.
@@ -3327,9 +3512,9 @@
   stringInterpolation
   .
 
-{\bf NEWLINE:}$\backslash$ n;
-  $\backslash$ r;
-  $\backslash$ r $\backslash$ n
+{\bf NEWLINE:}$\backslash$n;
+  $\backslash$r;
+  $\backslash$r$\backslash$n
   .
 \end{grammar}
 
@@ -3348,7 +3533,7 @@
 
 \begin{grammar}
 {\bf stringInterpolation:}`\$' IDENTIFIER\_NO\_DOLLAR;
-  `\$' `\{' expression `\}'
+  `\$\{' expression `\}'
   .
 \end{grammar}
 
@@ -3366,7 +3551,7 @@
 
 \LMHash{}
 The form \code{\$id} is equivalent to the form \code{\$\{id\}}.
-An interpolated string, $s$, with content `\code{$s_0$\$\{$e_1$\}$s_1\ldots{}s_{n-1}\$\{e_n\}s_{n}$}' (where any of $s_0 \ldots{} s_n$ can be empty)
+An interpolated string, $s$, with content `\code{$s_0$\$\{$e_1$\}$s_1\ldots{}s_{n-1}\$\{e_n\}s_{n}$}' (where any of $s_0, \ldots, s_n$ can be empty)
 is evaluated by evaluating each expression $e_i$ ($1 \le i \le n$) in to a string $r_i$ in the order they occur in the source text, as follows:
 \begin{itemize}
 \item{} Evaluate $e_i$ to an object $o_i$.
@@ -3374,7 +3559,7 @@
  $r_i$ be the returned value.
 \item{} If $r_i$ is not an instance of the built-in type \code{String}, throw an \code{Error}.
 \end{itemize}
-Finally, the result of the evaluation of $s$ is the concatenation of the strings $s_0$, $r_1$, \ldots{}, $r_n$, and $s_n$.
+Finally, the result of the evaluation of $s$ is the concatenation of the strings $s_0$, $r_1$, \ldots, $r_n$, and $s_n$.
 
 
 \subsection{Symbols}
@@ -3429,7 +3614,7 @@
 The number of elements in a list is its size.
 A list has an associated set of indices.
 An empty list has an empty set of indices.
-A non-empty list has the index set $\{0 \ldots n -1\}$ where $n$ is the size of the list.
+A non-empty list has the index set $\{0, \ldots, n - 1\}$ where $n$ is the size of the list.
 It is a run-time error to attempt to access a list using an index that is not a member of its set of indices.
 
 \LMHash{}
@@ -3447,12 +3632,12 @@
 }
 
 \LMHash{}
-The value of a constant list literal \CONST{} $<E>[e_1\ldots e_n]$ is an object $a$ whose class implements the built-in class $List<E>$.
+The value of a constant list literal \CONST{} $<E>[e_1, \ldots, e_n]$ is an object $a$ whose class implements the built-in class $List<E>$.
 The $i$th element of $a$ is $v_{i+1}$, where $v_i$ is the value of the compile-time expression $e_i$.
-The value of a constant list literal \CONST{} $[e_1 \ldots e_n]$ is defined as the value of the constant list literal \CONST{}$ < \DYNAMIC{}>[e_1\ldots e_n]$.
+The value of a constant list literal \CONST{} $[e_1, \ldots, e_n]$ is defined as the value of the constant list literal \CONST{}$ <\DYNAMIC{}>[e_1, \ldots, e_n]$.
 
 \LMHash{}
-Let $list_1 =$ \CONST{} $<V>[e_{11} \ldots e_{1n}]$ and $list_2 =$ \CONST{} $<U>[e_{21} \ldots e_{2n}]$ be two constant list literals and let the elements of $list_1$ and $list_2$ evaluate to $o_{11} \ldots o_{1n}$ and $o_{21} \ldots o_{2n}$ respectively.
+Let $list_1 =$ \CONST{} $<V>[e_{11}, \ldots, e_{1n}]$ and $list_2 =$ \CONST{} $<U>[e_{21}, \ldots, e_{2n}]$ be two constant list literals and let the elements of $list_1$ and $list_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
 If{}f \code{identical($o_{1i}$, $o_{2i}$)} for $i \in 1 .. n$ and $V = U$ then \code{identical($list_1$, $list_2$)}.
 
 \commentary{
@@ -3460,10 +3645,10 @@
 }
 
 \LMHash{}
-A run-time list literal $<E>[e_1 \ldots e_n]$ is evaluated as follows:
+A run-time list literal $<E>[e_1, \ldots, e_n]$ is evaluated as follows:
 \begin{itemize}
 \item
-First, the expressions $e_1 \ldots e_n$ are evaluated in order they appear in the program, producing objects $o_1 \ldots o_n$.
+First, the expressions $e_1, \ldots, e_n$ are evaluated in order they appear in the program, producing objects $o_1, \ldots, o_n$.
 \item A fresh instance (\ref{generativeConstructors}) $a$, of size $n$, whose class implements the built-in class $List<E>$ is allocated.
 \item
 The operator \code{[]=} is invoked on $a$ with first argument $i$ and second argument
@@ -3480,7 +3665,7 @@
 }
 
 \LMHash{}
-A run-time list literal $[e_1 \ldots e_n]$ is evaluated as $< \DYNAMIC{}>[e_1\ldots e_n]$.
+A run-time list literal $[e_1, \ldots, e_n]$ is evaluated as $<\DYNAMIC{}>[e_1, \ldots, e_n]$.
 
 \commentary{
 There is no restriction precluding nesting of list literals.
@@ -3490,8 +3675,8 @@
 }
 
 \LMHash{}
-The static type of a list literal of the form \CONST{}$ <E>[e_1\ldots e_n]$ or the form $<E>[e_1 \ldots e_n]$ is $List<E>$.
-The static type a list literal of the form \CONST{} $[e_1 \ldots e_n$] or the form $[e_1\ldots e_n$] is $List< \DYNAMIC{}>$.
+The static type of a list literal of the form \CONST{}$ <E>[e_1, \ldots, e_n]$ or the form $<E>[e_1, \ldots, e_n]$ is $List<E>$.
+The static type a list literal of the form \CONST{} $[e_1, \ldots, e_n$] or the form $[e_1, \ldots, e_n$] is $List<\DYNAMIC{}>$.
 
 \rationale{
 It is tempting to assume that the type of the list literal would be computed based on the types of its elements.
@@ -3540,13 +3725,13 @@
 It is a compile-time error if the type arguments of a constant map literal include a type parameter.
 
 \LMHash{}
-The value of a constant map literal \CONST{}$ <K, V>\{k_1:e_1\ldots k_n :e_n\}$ is an object $m$ whose class implements the built-in class $Map<K, V>$.
+The value of a constant map literal \CONST{}$ <K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ is an object $m$ whose class implements the built-in class $Map<K, V>$.
 The entries of $m$ are $u_i:v_i, i \in 1 .. n$, where $u_i$ is the value of the compile-time expression $k_i$ and $v_i$ is the value of the compile-time expression $e_i$.
-The value of a constant map literal \CONST{} $\{k_1:e_1\ldots k_n :e_n\}$ is defined as the value of a constant map literal \CONST{} $<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1\ldots k_n :e_n\}$.
+The value of a constant map literal \CONST{} $\{k_1:e_1, \ldots, k_n :e_n\}$ is defined as the value of a constant map literal \CONST{} $<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1, \ldots, k_n:e_n\}$.
 
 \LMHash{}
-Let $map_1 =$ \CONST{}$ <K, V>\{k_{11}:e_{11} \ldots k_{1n} :e_{1n}\}$ and $map_2 =$ \CONST{}$ <J, U>\{k_{21}:e_{21} \ldots k_{2n} :e_{2n}\}$ be two constant map literals.
-Let the keys of $map_1$ and $map_2$ evaluate to $s_{11} \ldots s_{1n}$ and $s_{21} \ldots s_{2n}$ respectively, and let the elements of $map_1$ and $map_2$ evaluate to $o_{11} \ldots o_{1n}$ and $o_{21} \ldots o_{2n}$ respectively.
+Let $map_1 =$ \CONST{}$ <K, V>\{k_{11}:e_{11}, \ldots, k_{1n} :e_{1n}\}$ and $map_2 =$ \CONST{}$ <J, U>\{k_{21}:e_{21}, \ldots, k_{2n} :e_{2n}\}$ be two constant map literals.
+Let the keys of $map_1$ and $map_2$ evaluate to $s_{11}, \ldots, s_{1n}$ and $s_{21}, \ldots, s_{2n}$ respectively, and let the elements of $map_1$ and $map_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
 If{}f \code{identical($o_{1i}$, $o_{2i}$)} and \code{identical($s_{1i}$, $s_{2i}$)} for $i \in 1 .. n$, and $K = J, V = U$ then \code{identical($map_1$, $map_2$)}.
 
 \commentary{
@@ -3554,13 +3739,13 @@
 }
 
 \LMHash{}
-A run-time map literal $<K, V>\{k_1:e_1\ldots k_n :e_n\}$ is evaluated as follows:
+A run-time map literal $<K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ is evaluated as follows:
 \begin{itemize}
 \item
 For each $i \in 1 .. n$ in numeric order,
 first the expression $k_i$ is evaluated producing object $u_i$,
 and then $e_i$ is evaluated producing object $o_i$.
-This produces all the objects $u_1, o_1\ldots u_n, o_n$.
+This produces all the objects $u_1, o_1, \ldots, u_n, o_n$.
 \item A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class $Map<K, V>$ is allocated.
 \item
 The operator \code{[]=} is invoked on $m$ with first argument $u_i$ and second argument $o_i$ for each $i \in 1 .. n$.
@@ -3569,9 +3754,9 @@
 \end{itemize}
 
 \LMHash{}
-A run-time map literal $\{k_1:e_1\ldots k_n :e_n\}$ is evaluated as
+A run-time map literal $\{k_1:e_1, \ldots, k_n :e_n\}$ is evaluated as
 
-$<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1\ldots k_n :e_n\}$.
+$<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1, \ldots, k_n :e_n\}$.
 
 \LMHash{}
 If{}f all the keys in a map literal are compile-time constants, it is a static warning if the values of any two keys in a map literal are equal.
@@ -3585,8 +3770,8 @@
 }
 
 \LMHash{}
-The static type of a map literal of the form \CONST{}$ <K, V>\{k_1:e_1\ldots k_n :e_n\}$ or the form $<K, V>\{k_1:e_1\ldots k_n :e_n\}$ is $Map<K, V>$.
-The static type of a map literal of the form \CONST{}$\{k_1:e_1\ldots k_n :e_n\}$ or the form $\{k_1:e_1\ldots k_n :e_n\}$ is $Map<\DYNAMIC{}, \DYNAMIC{}>$.
+The static type of a map literal of the form \CONST{}$ <K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ or the form $<K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ is $Map<K, V>$.
+The static type of a map literal of the form \CONST{}$\{k_1:e_1, \ldots, k_n :e_n\}$ or the form $\{k_1:e_1, \ldots, k_n :e_n\}$ is $Map<\DYNAMIC{}, \DYNAMIC{}>$.
 
 
 \subsection{Throw}
@@ -3640,114 +3825,219 @@
 A {\em function literal} is an object that encapsulates an executable unit of code.
 
 \begin{grammar}
-{\bf functionExpression:}formalParameterList functionBody
+{\bf functionExpression:}formalParameterPart functionBody
   .
 \end{grammar}
 
+%% TODO[inference]: The static and dynamic type of a function literal
+%% interacts with inference: If a type-from-context $T$ exists and the
+%% function literal can be given a type which is a subtype of $T$, we may
+%% end up typing both the function as a whole and the body of the function
+%% very differently than we would in a situation where no type-from-context
+%% exists. So the rules below must be changed to be the default case (where
+%% no type-from-context is available, or it is `Object` or some other
+%% non-constraing type, and other cases where the type-from-context is
+%% actually used to select the function literal signature must be described
+%% specifically for each relevant type of situation.
+
 \LMHash{}
 The class of a function literal implements the built-in class \code{Function}.
-%Invoking the getter \code{runtimeType} on a function literal returns the \code{Type} object that is the value of the expression \code{Function}.
-% not necessarily
-
-%Q{Can anyone implement it? Then we should define things via call}
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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]) => e$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+
+\code{($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$]) => $e$}
+
+\noindent
 is
 
-$(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow T_0$, where $T_0$ is the static type of $e$.
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow T_0$},
+
+\noindent
+%% TODO[inference]: The static type of the function literal may come from context.
+where $T_0$ is the static type of $e$.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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:
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
 
-If $T = FutureOr<S>$ then $flatten(T) = S$.
+\code{($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$}
 
-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$.
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+
+\code{($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Future<$flatten(T_0)$>},
+
+\noindent
+where $T_0$ is the static type of $e$.
+
+\LMHash{}
+In the previous two paragraphs, the type argument lists are omitted in the case where $m = 0$, and $flatten(T)$ is defined as follows:
+
+\begin{itemize}
+\item If \code{$T =$ FutureOr<$S$>} then $flatten(T) = S$.
+
+\item Otherwise if
+\code{$T <:$ Future}
+then let $S$ be a type such that
+\code{$T <<$ Future<$S$>}
+and for all $R$, if
+\code{$T <<$ Future<$R$>}
+then $S << R$.
 
 \rationale{
-This ensures that \code{Future<$S$>} is the most specific instantiation of \code{Future} that is a supertype of $T$.
+This ensures that
+\code{Future<$S$>}
+is the most specific generic instantiation of \code{Future} that is a supertype of $T$.
+%% TODO[class-interfaces]: When we have finished the specification of class
+%% interface computations we may have the following property, but it is not
+%% true at this point. Adjust the following by then!
 Note that $S$ is well-defined because of the requirements on superinterfaces.
 }
 
 Then $flatten(T) = S$.
 
-In any other circumstance, $flatten(T) = T$.
+\item In any other circumstance, $flatten(T) = T$.
+\end{itemize}
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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\}) => e$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+
+\code{($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$\}) => $e$}
+
+\noindent
 is
 
-$(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow T_0$, where $T_0$ is the static type of $e$.
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow T_0$},
+
+\noindent
+where $T_0$ is the static type of $e$.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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$
+\code{<$X_1 B_1, \ldots,\ X_m B_m$>}
 
-is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow Future<flatten(T_0)>$, where $T_0$ is the static type of $e$.
+\code{($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$}
+
+\noindent
+is
+
+\code{<$X_1 B_1, \ldots,\ X_m B_m$>}
+
+\code{($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Future<$flatten(T_0)$>},
+
+\noindent
+where $T_0$ is the static type of $e$.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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])\{s\}$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
 
-is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow \DYNAMIC{}$.
+\code{($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$]) \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ \DYNAMIC{}}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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{}$ $\{s\}$
-is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow Future$.
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+
+\code{($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{} \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Future}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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*{}$ $\{s\}$
-is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow Stream$.
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+
+\code{($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*{} \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Stream}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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])$ $ \SYNC*{}$ $\{s\}$
-is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow Iterable$.
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+
+\code{($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$]) \SYNC*{} \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Iterable}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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])\{s\}$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
 
-is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow \DYNAMIC{}$.
+\code{($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$]) \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ \DYNAMIC{}}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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{}$ $\{s\}$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
 
-is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow Future{}$.
+\code{($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{} \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Future}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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*{}$ $\{s\}$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
 
-is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow Stream{}$.
+\code{($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*{} \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Stream}.
 
 \LMHash{}
 The static type of a function literal of the form
 
-$(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\})$ $\SYNC*{}$ $\{s\}$
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
 
-is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow Iterable{}$.
+\code{($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$\}) \SYNC*{} \{ $s$ \}}
+
+\noindent
+is
+
+\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Iterable}.
 
 \LMHash{}
-In all of the above cases, whenever $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as \DYNAMIC{}.
+In all of the above cases,
+the type argument lists are omitted when $m=0$,
+and whenever $T_i, 1 \le i \le n+k$, is not specified,
+it is considered to have been specified as \DYNAMIC{}.
 
 
 \subsection{This}
@@ -3786,24 +4076,25 @@
 It is a static type warning if
 the type $T$ in an instance creation expression of one of the forms
 
-\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is malformed (\ref{dynamicTypeSystem}) or malbounded (\ref{parameterizedTypes}).
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+is malformed (\ref{dynamicTypeSystem}) or malbounded (\ref{parameterizedTypes}).
 
 \LMHash{}
 It is a compile-time error if the type $T$ in an instance creation expression of one of the forms
 
-\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 is an enumerated type (\ref{enums}).
 %any of the type arguments to a constructor of a generic type $G$ invoked by a new expression or a constant object expression are not subtypes of the bounds of the corresponding formal type parameters of $G$.
@@ -3823,9 +4114,10 @@
 \LMHash{}
 Let $e$ be a new expression of the form
 
-\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ or the form
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+or the form
 
-\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 %It is a run-time type error if
 %the type $T$ is malformed.
@@ -3837,18 +4129,27 @@
 If $T$ is a class or parameterized type accessible in the current scope then:
 \begin{itemize}
 \item
-If $e$ is of the form \NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ it is a static warning if $T.id$ is not the name of a constructor declared by the type $T$.
-If $e$ is of the form \NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ it is a static warning if the type $T$ does not declare a constructor with the same name as the declaration of $T$.
+If $e$ is of the form
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+it is a static warning if $T.id$ is not the name of a constructor declared by the type $T$.
+\item
+If $e$ is of the form
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+it is a static warning if the type $T$ does not declare a constructor with the same name as the declaration of $T$.
 \end{itemize}
 
 \LMHash{}
-If $T$ is a parameterized type (\ref{parameterizedTypes}) $S<U_1, \ldots, U_m>$, let $R = S$.
+If $T$ is a parameterized type (\ref{parameterizedTypes})
+\code{$S$<$U_1, \ldots,\ U_m$>},
+let $R = S$.
 %It is a
 %compile-time CHANGED
 %run-time type
 %error if $S$ is not a generic (\ref{generics}) type with $m$ type parameters.
 If $T$ is not a parameterized type, let $R = T$.
-Furthermore, if $e$ is of the form \NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ then let $q$ be the constructor $T.id$, otherwise let $q$ be the constructor $T$.
+Furthermore, if $e$ is of the form
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+then let $q$ be the constructor $T.id$, otherwise let $q$ be the constructor $T$.
 
 \LMHash{}
 If $R$ is a generic with $l = m$ type parameters then
@@ -3865,7 +4166,9 @@
 Evaluation of $e$ proceeds as follows:
 
 \LMHash{}
-First, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated.
+First, the argument list
+\code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+is evaluated.
 
 \LMHash{}
 If $T$ is a deferred type with prefix $p$, then if $p$ has not been successfully loaded, a dynamic error occurs.
@@ -3889,7 +4192,7 @@
 
 \LMHash{}
 A fresh instance (\ref{generativeConstructors}), $i$, of class $R$ is allocated.
-Then $q$ is executed to initialize $i$ with respect to the bindings that resulted from the evaluation of the argument list, and, if $R$ is a generic class, with its type parameters bound to $V_1 \ldots V_m$.
+Then $q$ is executed to initialize $i$ with respect to the bindings that resulted from the evaluation of the argument list, and, if $R$ is a generic class, with its type parameters bound to $V_1, \ldots, V_m$.
 
 If execution of $q$ completes normally (\ref{completion}), $e$ evaluates to $i$.
 Otherwise execution of $q$ throws an exception object $x$ and stack trace $t$,
@@ -3901,9 +4204,9 @@
 Then:
 
 \LMHash{}
-If $q$ is a redirecting factory constructor of the form $T(p_1, \ldots, p_{n+k}) = c;$ or of the form $T.id(p_1, \ldots, p_{n+k}) = c;$ then the result of the evaluation of $e$ is equivalent to evaluating the expression
+If $q$ is a redirecting factory constructor of the form $T(p_1, \ldots,\ p_{n+k}) = c;$ or of the form $T.id(p_1, \ldots,\ p_{n+k}) = c;$ then the result of the evaluation of $e$ is equivalent to evaluating the expression
 
-$[V_1, \ldots, V_m/T_1, \ldots, T_m]($\code{\NEW{} $c(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k}))$}.
+$[V_1/T_1, \ldots, V_m/T_m]($\code{\NEW{} $c(a_1, \ldots,\ a_n, x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}: a_{n+k}))$}.
 If evaluation of $q$ causes $q$ to be re-evaluated cyclically, with only factory constructor redirections in-between, a run-time error occurs.
 % Used to not have the "in-between" clause, which would disallow a factory constructor redirecting to another constructor which conditionally calls the original factory constructor again with different arguments.
 
@@ -3931,14 +4234,14 @@
 \LMHash{}
 The static type of an instance creation expression of either the form
 
-\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 or the form
 
-\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 is $T$.
-It is a static warning if the static type of $a_i, 1 \le i \le n+ k$ may not be assigned to the type of the corresponding formal parameter of the constructor $T.id$ (respectively $T$).
+It is a static warning if the static type of $a_i, 1 \le i \le n + k$ may not be assigned to the type of the corresponding formal parameter of the constructor $T.id$ (respectively $T$).
 
 
 \subsubsection{Const}
@@ -3955,9 +4258,10 @@
 \LMHash{}
 Let $e$ be a constant object expression of the form
 
-\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
-or the form \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+or the form
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 It is a compile-time error if $T$ does not denote a class accessible in the current scope.
 It is a compile-time error if $T$ is a deferred type (\ref{staticTypes}).
 
@@ -3969,14 +4273,18 @@
 If $T$ is a parameterized type, it is a compile-time error if $T$ includes a type variable among its type arguments.
 
 \LMHash{}
-If $e$ is of the form \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ it is a compile-time error if $T.id$ is not the name of a constant constructor declared by the type $T$.
-If $e$ is of the form \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ it is a compile-time error if the type $T$ does not declare a constant constructor with the same name as the declaration of $T$.
+If $e$ is of the form
+\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+it is a compile-time error if $T.id$ is not the name of a constant constructor declared by the type $T$.
+If $e$ is of the form
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+it is a compile-time error if the type $T$ does not declare a constant constructor with the same name as the declaration of $T$.
 
 \LMHash{}
 In all of the above cases, it is a compile-time error if $a_i, i\in 1 .. n + k$, is not a compile-time constant expression.
 
-%If $T$ is a parameterized type (\ref{parameterizedTypes}) $S<U_1, \ldots, U_m>$, let $R = S$.  It is a compile-time error if $T$ is malformed. If $T$ is not a parameterized type, let $R = T$.
- %Finally,
+%If $T$ is a parameterized type (\ref{parameterizedTypes}) $S<U_1, \ldots,\ U_m>$, let $R = S$.  It is a compile-time error if $T$ is malformed. If $T$ is not a parameterized type, let $R = T$.
+%Finally,
 % If $T$ is a generic with $l$ retype parameters, then for all $ i \in 1 .. l$, let $V_i = \DYNAMIC{}$.
 
 \LMHash{}
@@ -3985,20 +4293,20 @@
 \LMHash{}
 First, if $e$ is of the form
 
-\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 then let $i$ be the value of the expression
 
-\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
 Otherwise, $e$ must be of the form
 
-\CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 in which case let $i$ be the result of evaluating
 
-\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
 Then:
@@ -4023,11 +4331,11 @@
 \LMHash{}
 The static type of a constant object expression of either the form
 
-\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 or the form
 
-\CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 is $T$.
 It is a static warning if the static type of $a_i, 1 \le i \le n+ k$ may not be assigned to the type of the corresponding formal parameter of the constructor $T.id$ (respectively $T$).
@@ -4063,7 +4371,7 @@
 }
 
 \LMHash{}
-Given an instance creation expression of the form \CONST{} $q(a_1, \ldots , a_n)$ it is a static warning if $q$ is a constructor of an abstract class (\ref{abstractInstanceMembers}) but $q$ is not a factory constructor.
+Given an instance creation expression of the form \CONST{} $q(a_1, \ldots,\ a_n)$ it is a static warning if $q$ is a constructor of an abstract class (\ref{abstractInstanceMembers}) but $q$ is not a factory constructor.
 
 
 \subsection{Spawning an Isolate}
@@ -4086,9 +4394,15 @@
 \LMLabel{functionInvocation}
 
 \LMHash{}
-Function invocation occurs in the following cases: when a function expression (\ref{functionExpressions}) is invoked (\ref{functionExpressionInvocation}), when a method (\ref{methodInvocation}), getter (\ref{topLevelGetterInvocation}, \ref{propertyExtraction}) or setter (\ref{assignment}) is invoked or when a constructor is invoked (either via instance creation (\ref{instanceCreation}), constructor redirection (\ref{redirectingConstructors}) or super initialization).
+Function invocation occurs in the following cases:
+when a function expression (\ref{functionExpressions}) is invoked (\ref{functionExpressionInvocation}),
+when a method (\ref{methodInvocation}), getter (\ref{topLevelGetterInvocation}, \ref{propertyExtraction}) or setter (\ref{assignment}) is invoked,
+or when a constructor is invoked
+(either via instance creation (\ref{instanceCreation}), constructor redirection (\ref{redirectingConstructors}) or super initialization).
 The various kinds of function invocation differ as to how the function to be invoked, $f$, is determined, as well as whether \THIS{} (\ref{this}) is bound.
-Once $f$ has been determined, the formal parameters of $f$ are bound to corresponding actual arguments.
+Once $f$ has been determined,
+formal type parameters of $f$ are bound to the corresponding actual type arguments,
+and the formal parameters of $f$ are bound to corresponding actual arguments.
 When the body of $f$ is executed it will be executed with the aforementioned bindings.
 
 \LMHash{}
@@ -4130,7 +4444,7 @@
 
 \LMHash{}
 When iteration over the iterable is started, by getting an iterator $j$ from the iterable and calling \code{moveNext()}, execution of the body of $f$ will begin.
-When execution of the body of $f$ completes (\ref{completion},
+When execution of the body of $f$ completes (\ref{completion}),
 \begin{itemize}
 \item If it returns without a value or it completes normally (\ref{completion}), $j$ is positioned after its last element, so that its current value is the null object (\ref{null}) and the current call to \code{moveNext()} on $j$ returns false, as must all further calls.
 \item If it throws an exception object $e$ and stack trace $t$ then the current value of $j$ is the null object (\ref{null}) and the current call to \code{moveNext()} throws $e$ and $t$ as well.
@@ -4222,22 +4536,45 @@
   .
 \end{grammar}
 
+\LMHash{}
 Argument lists allow an optional trailing comma after the last argument ($`,\!'?$).
-An argument list with such a trailing comma is equivalent in all ways to the same parameter list without the trailing comma.
+An argument list with such a trailing comma is equivalent in all ways to the same argument list without the trailing comma.
 All argument lists in this specification are shown without a trailing comma, but the rules and semantics apply equally to the corresponding argument list with a trailing comma.
 
 \LMHash{}
-Evaluation of an actual argument list of the form
+When parsing an argument list, an ambiguity may arise because the same source code could be one generic function invocation, and it could be two or more relational expressions and/or shift expressions.
+In this situation, the expression is always parsed as a generic function invocation.
 
-$(a_1, \ldots, a_m, q_1: a_{m+1}, \ldots, q_l: a_{m+l})$
+% Should we specify the precise disambiguation rule here?:
+%   We have seen 'a', '<', a matching '>', and '(', where
+%   'a' is tricky because we can have things like 'new Foo().m<...>(...',
+%   'x..y(...).m<...>(...', etc, basically everything that can precede
+%   argumentPart in the grammar.
+
+\commentary{
+An example is \code{f(a<B, C>($d$))}, which may be an invocation of \code{f} passing two actual arguments of type \code{bool}, or an invocation of \code{f} passing the result returned by an invocation of the generic function \code{a}.
+Note that the ambiguity can be eliminated by omitting the parentheses around the expression $d$, or adding parentheses around one of the relational expressions.
+}
+
+\rationale{
+When the intention is to pass several relational or shift expressions as actual arguments and there is an ambiguity, the source code can easily be adjusted to a form which is unambiguous.
+Also, we expect that it will be more common to have generic function invocations as actual arguments than having relational or shift expressions that happen to match up and have parentheses at the end, such that the ambiguity arises.
+}
+
+\LMHash{}
+Evaluation of an actual argument part of the form
+
+\code{<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_m,\ q_1$: $a_{m+1}, \ldots,\ q_l$: $a_{m+l}$)}
 
 proceeds as follows:
 
 \LMHash{}
+The type arguments $A_1, \ldots, A_r$ are evaluated in the order they appear in the program, producing types $t_1, \ldots, t_r$.
 The arguments $a_1, \ldots, a_{m+l}$ are evaluated in the order they appear in the program, producing objects $o_1, \ldots, o_{m+l}$.
 
 \commentary{
-Simply stated, an argument list consisting of $m$ positional arguments and $l$ named arguments is evaluated from left to right.
+Simply stated, an argument part consisting of $s$ type arguments, $m$ positional arguments, and $l$ named arguments is evaluated from left to right.
+Note that the type argument list is omitted when $r = 0$ (\ref{generics}).
 }
 
 
@@ -4245,29 +4582,69 @@
 \LMLabel{bindingActualsToFormals}
 
 \LMHash{}
-Let $f$ be a function with $h$ required parameters, let $p_1 \ldots p_n$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+k}$ be the optional parameters declared by $f$.
-
-\LMHash{}
-An evaluated actual argument list $o_1 \ldots o_{m+l}$ derived from an actual argument list of the form $(a_1, \ldots, a_m, q_1: a_{m+1}, \ldots, q_l: a_{m+l})$ is bound to the formal parameters of $f$ as follows:
+Let $f$ be a function with $s$ type parameters and $h$ required parameters;
+let $p_1, \ldots, p_n$ be the positional parameters of $f$;
+and let $p_{h+1}, \ldots, p_{h+k}$ be the optional parameters declared by $f$.
 
 \commentary{
-We have an argument list consisting of $m$ positional arguments and $l$ named arguments.
-We have a function with $h$ required parameters and $k$ optional parameters.
+Note that the type argument lists in the following are omitted in the case where $s = 0$,
+and similarly for empty type parameter lists (\ref{generics}).
+}
+
+\LMHash{}
+An evaluated actual argument part
+\code{<$t_1, \ldots,\ t_r$>($o_1, \ldots,\ o_{m+l}$)}
+derived from an actual argument part of the form
+
+\code{<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_m,\ q_1$: $a_{m+1}, \ldots,\ q_l$: $a_{m+l}$)}
+
+\noindent
+is bound to the formal type parameters and formal parameters of $f$ as follows:
+
+\commentary{
+We have an actual argument list consisting of $r$ type arguments, $m$ positional arguments, and $l$ named arguments.
+We have a function with $s$ type parameters, $h$ required parameters, and $k$ optional parameters.
+The number of type arguments must match the number of type parameters.
 The number of positional arguments must be at least as large as the number of required parameters, and no larger than the number of positional parameters.
 All named arguments must have a corresponding named parameter.
-You may not provide a given named argument more than once.
+A given named argument cannot be provided more than once.
 If an optional parameter has no corresponding argument, it gets its default value.
 In checked mode, all arguments must belong to subtypes of the type of their corresponding formal.
 }
 
-\commentary{
-If $l > 0$, then it is necessarily the case that $n = h$, because a method cannot have both optional positional parameters and named parameters.
-}
-
+% View on declaration:
+%
+%     |**   ...        *|**        ...         *|**     ...          *|
+%      <-s type par.s--> <--h required par.s---> <--k optional par.s->
+%                        <--n pos, par.s, h=n--> <---k named par.s---> NAMED
+%                        <----------n positional par.s, n=h+k--------> POS
+%
+% Actual argument part:
+%
+%     |**   ...        *|**           ...          *|**     ...       *|
+%      <-r type par.s--> <----m positional arg.s---> <--l named arg.s->
 \LMHash{}
+% Passing a wrong number of actual type arguments.
+If $r = 0$ and $s > 0$ then replace the actual type argument list:
+%% TODO[instantiate-to-bound]: The actual type arguments passed here
+%% should be chosen based on the instantiate-to-bound algorithm, but we
+%% cannot yet refer to that because it hasn't yet been specified here.
+let $r$ be $s$ and $t_i = \DYNAMIC{}$ for $i \in 1 .. s$.
+If $r \not= s$, a \code{NoSuchMethodError} is thrown.
+% Passing named arguments to a function with optional positional parameters.
+If $l > 0$ and $n \not= h$, a \code{NoSuchMethodError} is thrown.
+% Passing too few or too many positional arguments.
 If $m < h$, or $m > n$, a \code{NoSuchMethodError} is thrown.
-Furthermore, each $q_i, 1 \le i \le l$, must have a corresponding named parameter in the set $\{p_{n+1}, \ldots, p_{n +k}\}$ or a \code{NoSuchMethodError} is thrown.
-Then $p_i$ is bound to $o_i, i \in 1 .. m$, and $q_j$ is bound to $o_{m+j}, j \in 1 .. l$.
+% When l>0, h=n and there are k named parameters p_{h+1}..p_{h+k}.
+Furthermore, each
+$q_i, i \in 1 .. l$,
+must have a corresponding named parameter in the set
+$\{p_{h+1}, \ldots, p_{h+k}\}$,
+or a \code{NoSuchMethodError} is thrown.
+% Finally, bindings!
+Then $p_i$ is bound to
+$o_i, i \in 1 .. m$,
+and $q_j$ is bound to $o_{m+j}, j \in 1 .. l$.
 All remaining formal parameters of $f$ are bound to their default values.
 
 \commentary{
@@ -4275,17 +4652,37 @@
 }
 
 \LMHash{}
+% Check the type arguments.
+In checked mode, it is a dynamic type error if $t_i$ is not a subtype of the actual bound (\ref{actualTypeOfADeclaration}) of the $i$th type argument of $f$, for actual type arguments $t_1, \ldots, t_r$.
+% Check the types of positional arguments.
 In checked mode, it is a dynamic type error if $o_i$ is not the null object (\ref{null}) and the actual type (\ref{actualTypeOfADeclaration}) of $p_i$ is not a supertype of the type of $o_i, i \in 1 .. m$.
+% Check the types of named arguments.
 In checked mode, it is a dynamic type error if $o_{m+j}$ is not the null object and the actual type (\ref{actualTypeOfADeclaration}) of $q_j$ is not a supertype of the type of $o_{m+j}, j \in 1 .. l$.
 
 \LMHash{}
+% We cannot pass the same named parameter twice.
 It is a compile-time error if $q_i = q_j$ for any $i \ne j$.
 
 \LMHash{}
-Let $T_i$ be the static type of $a_i$, let $S_i$ be the type of $p_i, i \in 1 .. h+k$ and let $S_q$ be the type of the named parameter $q$ of $f$.
-It is a static warning if $T_j$ may not be assigned to $S_j, j \in 1..m$.
+Let $T_i$ be the static type of $a_i$.
+If the static type of $f$ is \DYNAMIC{} or the built-in class \code{Function},
+no further static checks are performed.
+Otherwise, it is a static type warning if the static type of $f$ is not a function type.
+
+\LMHash{}
+Otherwise, let $X_1, \ldots, X_s$ be the formal type parameters of the static type of $f$,
+let $S_i$ be the type of $p_i, i \in 1 .. h+k$,
+and let $S_q$ be the type of the named parameter $q$ of $f$,
+where each parameter type is obtained by replacing $X_j$ by $A_j, j \in 1 .. s$, in the given parameter type annotation.
+
+\commentary{
+Checks regarding the number of type parameters and their bounds is specified in (\ref{generics}).
+}
+
+\LMHash{}
+It is a static warning if $T_j$ may not be assigned to $S_j, j \in 1 .. m$.
 It is a static warning if $m < h$ or if $m > n$.
-Furthermore, each $q_i, 1 \le i \le l$, must have a corresponding named parameter in the set $\{p_{n+1}, \ldots, p_{n +k}\}$ or a static warning occurs.
+Furthermore, each $q_i, i \in 1 .. l$, must have a corresponding named parameter in the set $\{p_{h+1}, \ldots, p_{h+k}\}$ or a static warning occurs.
 It is a static warning if $T_{m+j}$ may not be assigned to $S_{q_j}, j \in 1 .. l$.
 
 
@@ -4295,16 +4692,21 @@
 \LMHash{}
 An unqualified function invocation $i$ has the form
 
-$id(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k})$,
+\code{$id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
+\noindent
 where $id$ is an identifier.
 
+\commentary{
+Note that the type argument list is omitted when $r = 0$ (\ref{generics}).
+}
+
 \LMHash{}
 If there exists a lexically visible declaration named $id$, let $f_{id}$ be the innermost such declaration.
 Then:
 \begin{itemize}
 \item
-If $id$ is a type literal, then $i$ is interpreted as a function expression invocation (\ref{functionExpressionInvociation}) with $(id)$ as the expression $e_f$.
+If $id$ is a type literal, then $i$ is interpreted as a function expression invocation (\ref{functionExpressionInvocation}) with $(id)$ as the expression $e_f$.
 \commentary{
 The expression $(id)$ where $id$ is a type literal always evaluates to an instance of class \code{Type} which is not a function.
 This ensures that a run-time error occurs when trying to call a type literal.
@@ -4314,15 +4716,19 @@
 \item
 If $f_{id}$ is a local function, a library function, a library or static getter or a variable then $i$ is interpreted as a function expression invocation (\ref{functionExpressionInvocation}).
 \item
-Otherwise, if $f_{id}$ is a static method of the enclosing class $C$, $i$ is equivalent to $C.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
-\item Otherwise, $f_{id}$ is considered equivalent to the ordinary method invocation $\THIS{}.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+Otherwise, if $f_{id}$ is a static method of the enclosing class $C$, $i$ is equivalent to
+\code{$C.id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\item Otherwise, $f_{id}$ is equivalent to the ordinary method invocation
+
+\code{\THIS{}.$id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 \end{itemize}
 
 \LMHash{}
 Otherwise, if $i$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer, evaluation of $i$ causes a \code{NoSuchMethodError} to be thrown.
 
 \LMHash{}
-If $i$ does not occur inside a top level or static function, $i$ is equivalent to $\THIS{}.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+If $i$ does not occur inside a top level or static function, $i$ is equivalent to
+\code{\THIS{}.$id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 % Should also say:
 % It is a static warning if $i$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no lexically visible declaration named $id$ in scope.
@@ -4334,9 +4740,16 @@
 \LMHash{}
 A function expression invocation $i$ has the form
 
-$e_f(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+\code{$e_f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
+\noindent
 where $e_f$ is an expression.
+
+\commentary{
+Note that the type argument list is omitted when $r = 0$ (\ref{generics}).
+}
+
+\LMHash{}
 If $e_f$ is an identifier $id$, then $id$ must necessarily denote a local function, a library function, a library or static getter or a variable as described above, or $i$ is not considered a function expression invocation.
 If $e_f$ is a type literal, then it is equivalent to the expression $(e_f)$.
 
@@ -4357,7 +4770,14 @@
 \LMHash{}
 Otherwise:
 
-Execution of a function expression invocation $e_f(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is equivalent to execution of $e_f.call(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+Execution of a function expression invocation
+
+\code{$e_f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+
+\noindent
+is equivalent to execution of
+
+\code{$e_f$.call<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \commentary{
 The implication of this definition, and the other definitions involving the method \code{call()}, is that user defined types can be used as function values provided they define a \CALL{} method.
@@ -4372,17 +4792,36 @@
 \item $F$ is \DYNAMIC{}.
 \item $F$ is \code{Function}.
 \item $F$ is a function type
-  $(T_1, \ldots, T_n,
-  \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}, \ldots, T_{n+k+p}$ $x_{n+k+p}\})
-  \rightarrow T_0$
-such that the static type of $a_j$ is assignable to $T_j$ for all
-$j \in 1 .. n+k$.
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ A_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_n,\ $\{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}, \ldots,\ T_{n+k+p}\ x_{n+k+p}$\}) $ \rightarrow T_0$}
+
+\noindent
+where $r = s$, and the static type of $a_j$ is assignable to
+$[A_1/X_1, \ldots, A_r/X_s]T_j$, for all $j \in 1 .. n+k$.
+
 \item $k$ is zero, $0 \leq m \leq n$, and $F$ is a function type
-$(T_1, \ldots, T_m, [T_{m+1}, \ldots, T_n]) \rightarrow T_0$
-where the static type of $a_j$ is assignable to $T_j$ for all $j \in 1 .. n$.
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ A_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_m,\ $[$T_{m+1}, \ldots,\ T_n, \ldots,\ T_{n+p}$]) $ \rightarrow T_0$}
+
+\noindent
+where $r = s$, and the static type of $a_j$ is assignable to
+$[A_1/X_1, \ldots, A_r/X_s]T_j$,
+for all $j \in 1 .. n$.
 \end{itemize}
-If $F$ is not a function type, the static type of $i$ is \DYNAMIC{}.
-Otherwise, the static type of $i$ is the return type $T_0$ of $F$.
+
+\commentary{
+That is, the types of the actual arguments must match the declared types of the corresponding parameters where the formal type parameters have been replaced by the actual type arguments.
+Note that the type parameter lists are omitted when $s = 0$ (\ref{generics}),
+and that checks on the number of type arguments and their bounds is specified elsewhere (\ref{generics}).
+}
+
+If $F$ is not a function type or $r \not= s$, the static type of $i$ is \DYNAMIC{}.
+Otherwise, the static type of $i$ is the return type
+$[A_1/X_1, \ldots, A_r/X_s]T_0$ of $F$.
 
 
 \subsection{Lookup}
@@ -4451,88 +4890,162 @@
 \subsubsection{Ordinary Invocation}
 \LMLabel{ordinaryInvocation}
 
+\commentary{
+Note that non-generic invocations arise as the special case where the number of type arguments is zero,
+in which case the type argument list is omitted,
+and similarly for formal type parameter lists (\ref{generics}).
+}
+
 \LMHash{}
 An ordinary method invocation can be {\em conditional} or {\em unconditional}.
 
 \LMHash{}
 Evaluation of a {\em conditional ordinary method invocation} $i$ of the form
 
-\LMHash{}
-$e?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+\code{$e$?.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
-\LMHash{}
+\noindent
 proceeds as follows:
 
 \LMHash{}
-If $e$ is a type literal, $i$ is equivalent to \code{$e$.$m$($a_1$, \ldots , $a_n$, $x_{n+1}$: $a_{n+1}$, \ldots , $x_{n+k}$: $a_{n+k}$)}.
+If $e$ is a type literal, $i$ is equivalent to
+
+\code{$e.m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
 Otherwise, evaluate $e$ to an object $o$.
 If $o$ is the null object, $i$ evaluates to the null object (\ref{null}).
 Otherwise let $v$ be a fresh variable bound to $o$ and evaluate
-\code{$v$.$m$($a_1$, $\ldots$ , $a_n$, $x_{n+1}$: $a_{n+1}$, $\ldots$ , $x_{n+k}$: $a_{n+k}$))} to a value $r$, and then $e$ evaluates to $r$.
+\code{$v$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+to a value $r$.
+Then $e$ evaluates to $r$.
 
 \LMHash{}
-The static type of $i$ is the same as the static type of $e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
-Exactly the same static warnings that would be caused by $e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ are also generated in the case of $e?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+The static type of $i$ is the same as the static type of
+
+\code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+
+\noindent
+Exactly the same static warnings that would be caused by
+
+\code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+
+\noindent
+are also generated in the case of
+
+\code{$e$?.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
 An {\em unconditional ordinary method invocation} $i$ has the form
 
-$e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+\code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
 Evaluation of an unconditional ordinary method invocation $i$ of the form
-
-$e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
-
+\code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 proceeds as follows:
 
 \LMHash{}
 First, the expression $e$ is evaluated to a value $o$.
-Next, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k}$.
+Next, the argument part
+\code{<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+is evaluated yielding actual type arguments
+$t_1, \ldots, t_r$
+and actual argument objects $o_1, \ldots, o_{n+k}$.
 Let $f$ be the result of looking up (\ref{methodLookup}) method $m$ in $o$ with respect to the current library $L$.
 
 \LMHash{}
-Let $p_1 \ldots p_h$ be the required parameters of $f$, let $p_1 \ldots p_m$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+l}$ be the optional parameters declared by $f$.
+Let $X_1, \ldots, X_s$ be the formal type parameters of $f$,
+let $p_1, \ldots, p_h$ be the required parameters of $f$,
+let $p_1, \ldots, p_m$ be the positional parameters of $f$,
+and let $p_{h+1}, \ldots, p_{h+l}$ be the optional parameters declared by $f$.
 
 \commentary{
-We have an argument list consisting of $n$ positional arguments and $k$ named arguments.
-We have a function with $h$ required parameters and $l$ optional parameters.
+We have an actual argument list consisting of $r$ type arguments, $n$ positional arguments, and $k$ named arguments.
+We have a function with $s$ type parameters, $h$ required parameters, and $l$ optional parameters.
+The number of type arguments must match the number of type parameters.
 The number of positional arguments must be at least as large as the number of required parameters, and no larger than the number of positional parameters.
 All named arguments must have a corresponding named parameter.
+A given named argument cannot be provided more than once.
 }
 
+% View on declaration:
+%
+%     |**   ...        *|**        ...         *|**     ...          *|
+%      <-s type par.s--> <--h required par.s---> <--l optional par.s->
+%                        <--m pos, par.s, h=m--> <---l named par.s---> NAMED
+%                        <----------m positional par.s, m=h+l--------> POS
+%
+% Actual argument part:
+%
+%     |**   ...        *|**           ...          *|**     ...       *|
+%      <-r type par.s--> <----n positional arg.s---> <--k named arg.s->
 \LMHash{}
+% Passing a wrong number of actual type arguments.
+If $r = 0$ and $s > 0$ then replace the actual type argument list:
+%% TODO[instantiate-to-bound]: The actual type arguments passed here
+%% should be chosen based on the instantiate-to-bound algorithm, but we
+%% cannot yet refer to that because it hasn't yet been specified here.
+let $r$ be $s$ and $t_i = \DYNAMIC{}$ for $i \in 1 .. s$.
+If $r \not= s$, the method lookup has failed.
+% Passing named arguments to a function with optional positional parameters.
+If $k > 0$ and $m \not= h$, the method lookup has failed.
+% Passing too few or too many positional arguments.
 If $n < h$, or $n > m$, the method lookup has failed.
-Furthermore, each $x_i, n+1 \le i \le n+k$, must have a corresponding named parameter in the set $\{p_{m+1}, \ldots, p_{h+l}\}$ or the method lookup also fails.
-If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method, method lookup fails.
+% When k>0, h=m and there are l named parameters p_{h+1} .. p_{h+l}.
+Furthermore, each
+$x_i, i \in n+1 .. n+k$, must have a corresponding named parameter in the set
+$\{p_{h+1}, \ldots, p_{h+l}\}$,
+or the method lookup also fails.
+
+\LMHash{}
+If $o$ is an instance of \code{Type} but $e$ is not a constant type literal,
+then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method,
+method lookup fails.
 Otherwise method lookup has succeeded.
 
 \LMHash{}
-If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{} bound to $o$.
+If the method lookup succeeded,
+the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list,
+and with \THIS{} bound to $o$.
 The value of $i$ is the value returned after $f$ is executed.
 
 \LMHash{}
-If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $o$ with respect to $L$.
-If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $g$ is a getter that forwards to a static getter, getter lookup fails.
-If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $e.m$.
-Then the value of $i$ is the result of invoking the static method \code{Function.apply()} with arguments $v.g, [o_1, \ldots , o_n], \{\#x_{n+1}: o_{n+1}, \ldots , \#x_{n+k}: o_{n+k}\}$.
+If the method lookup has failed,
+then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $o$ with respect to $L$.
+If $o$ is an instance of \code{Type} but $e$ is not a constant type literal,
+then if $g$ is a getter that forwards to a static getter, getter lookup fails.
+If the getter lookup succeeded,
+let $v_g$ be the value of the getter invocation $e.m$.
+Then the value of $i$ is the result of invoking the static method
+\code{Function.apply()}
+with arguments
+$v_g$,
+\code{[$o_1, \ldots, o_n$]},
+\code{\{$\#x_{n+1}$: $o_{n+1}, \ldots, \#x_{n+k}$: $o_{n+k}$\}},
+and
+\code{[$t_1, \ldots, t_r$]}.
 
 \LMHash{}
-If getter lookup has also failed, then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
+If getter lookup has also failed,
+then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
 \begin{itemize}
 \item \code{im.isMethod} evaluates to \code{\TRUE{}}.
 \item \code{im.memberName} evaluates to the symbol \code{m}.
-\item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o_1, \ldots, o_n$]}.
-\item \code{im.namedArguments} evaluates to an immutable map with the same keys and values as \code{\{$\#x_{n+1}: o_{n+1}, \ldots, \#x_{n+k} : o_{n+k}$\}}.
+\item \code{im.positionalArguments} evaluates to an unmodifiable list with the same values as
+\code{<Object>[$o_1, \ldots, o_n$]}.
+\item \code{im.namedArguments} evaluates to an unmodifiable map with the same keys and values as
+\code{<Symbol, Object>\{$\#x_{n+1}$: $o_{n+1}, \ldots, \#x_{n+k}$: $o_{n+k}$\}}.
+\item \code{im.typeArguments} evaluates to an unmodifiable list with the same values as
+\code{<Type>[$t_1, \ldots, t_r$]}.
 \end{itemize}
 
 \LMHash{}
-Then the method \code{noSuchMethod()} is looked up in $v_o$ and invoked with argument $im$, and the result of this invocation is the result of evaluating $i$.
+Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$,
+and the result of this invocation is the result of evaluating $i$.
 
 \commentary{
-It is not possible to override the \code{noSuchMethod} if class \code{Object}
+It is not possible to override the \code{noSuchMethod} of class \code{Object}
 in such a way that it cannot be invoked with one argument of type \code{Invocation}.
 }
 
@@ -4541,26 +5054,36 @@
 }
 
 \LMHash{}
-Let $T$ be the static type of $o$.
-It is a static type warning if $T$ does not have an accessible (\ref{privacy}) instance member named $m$ unless either:
+Let $T$ be the static type of $e$.
+It is a static type warning if $T$ does not have an accessible (\ref{privacy}) instance member named $m$, unless either:
 \begin{itemize}
-\item $T$ is \code{Type}, $e$ is a constant type literal and the class corresponding to $e$ has a static getter named $m$.
+\item $T$ is \code{Type}, $e$ is a constant type literal,
+and the class corresponding to $e$ has a static getter named $m$.
 Or
 \item $T$ is \code{Function} and $m$ is \CALL.
-\rationale{
+\rationale {
 The type \code{Function} is treated as if it has a \code{call} method for any possible signature of \CALL.
 The expectation is that any concrete subclass of \code{Function} will implement \CALL.
 Note that a warning will be issued if this is not the case.
-Furthermore, any use of \CALL{} on a subclass of \code{Function} that fails to implement \CALL{} will also provoke a warning, as this exemption is limited to type \code{Function}, and does not apply to its subtypes.
+Furthermore, any use of \CALL{} on a subclass of \code{Function} that fails to implement \CALL{} will also provoke a warning,
+as this exemption is limited to type \code{Function}, and does not apply to its subtypes.
 }
 \end{itemize}
 
 \LMHash{}
 If $T.m$ exists, it is a static type warning if the type $F$ of $T.m$ may not be assigned to a function type.
-If $T.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}; otherwise the static type of $i$ is the declared return type of $F$.
+If $T.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}.
+Otherwise, let $X_1, \ldots, X_s$ be the formal type parameters of the type of $F$,
+and $T_0$ its declared return type.
+If $r \not= s$ the static type of $i$ is \DYNAMIC{};
+otherwise, the static type of $i$ is $[A_1/X_1, \ldots, A_r/X_s]T_0$.
+
+\commentary{
+That is, the declared return type where each formal type parameter has been replaced by the corresponding actual type argument.
+}
 
 \LMHash{}
-It is a compile-time error to invoke any of the methods of class \code{Object} on a prefix object (\ref{imports}) or on a constant type literal that is immediately followed by the token `.'.
+It is a compile-time error to invoke any of the methods of class \code{Object} on a prefix object (\ref{imports}) or on a constant type literal that is immediately followed by the token `.'\,.
 
 
 \subsubsection{Cascaded Invocations}
@@ -4571,12 +5094,18 @@
 where $e$ is an expression and \metavar{suffix} is a sequence of operator, method, getter or setter invocations.
 
 \begin{grammar}
-{\bf cascadeSection:}`{\escapegrammar ..}' (cascadeSelector arguments*) (assignableSelector arguments*)* (assignmentOperator expressionWithoutCascade)?
+{\bf cascadeSection:}`{\escapegrammar ..}' (cascadeSelector argumentPart*)
+  \gnewline{} (assignableSelector argumentPart*)*
+  \gnewline{} (assignmentOperator expressionWithoutCascade)?
   .
 
 {\bf cascadeSelector:}`[' expression `]';
   identifier
   .
+
+{\bf argumentPart:}
+  typeArguments? arguments
+  .
 \end{grammar}
 
 \LMHash{}
@@ -4599,54 +5128,146 @@
 \subsubsection{Super Invocation}
 \LMLabel{superInvocation}
 
+\commentary{
+Note that non-generic invocations arise as the special case where the number of type arguments is zero,
+in which case the type argument list is omitted,
+and similarly for formal type parameter lists (\ref{generics}).
+}
+
+% Conditional super invocation is meaningless: \THIS{} is not null.
+
 \LMHash{}
 A super method invocation $i$ has the form
 
-$\SUPER{}.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+\code{\SUPER{}.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
 Evaluation of $i$ proceeds as follows:
 
 \LMHash{}
-First, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated producing actual argument objects $o_1, \ldots , o_{n+k}$.
-Let $g$ be the method currently executing, and let $C$ be the class in which $g$ was looked up (\ref{methodLookup}).
-Let $S_{dynamic}$ be the superclass of $C$, and let $f$ be the result of looking up method (\ref{methodLookup}) $m$ in $S_{dynamic}$ with respect to the current library $L$.
-Let $p_1 \ldots p_h$ be the required parameters of $f$, let $p_1 \ldots p_m$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+l}$ be the optional parameters declared by $f$.
+First, the argument part
+
+\code{<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+
+\noindent
+is evaluated producing actual type arguments $t_1, \ldots, t_r$ and actual argument objects $o_1, \ldots, o_{n+k}$.
+Let $g$ be the method currently executing,
+and let $C$ be the class in which $g$ was looked up (\ref{methodLookup}).
+Let $S_{dynamic}$ be the superclass of $C$,
+and let $f$ be the result of looking up method (\ref{methodLookup}) $m$ in $S_{dynamic}$ with respect to the current library $L$.
 
 \LMHash{}
+Let $X_1, \ldots, X_s$ be the formal type parameters of $f$.
+Let $p_1, \ldots, p_h$ be the required parameters of $f$,
+let $p_1, \ldots, p_m$ be the positional parameters of $f$,
+and let $p_{h+1}, \ldots, p_{h+l}$ be the optional parameters declared by $f$.
+
+\commentary{
+We have an actual argument list consisting of $r$ type arguments, $n$ positional arguments, and $k$ named arguments.
+We have a function with $s$ type parameters, $h$ required parameters, and $l$ optional parameters.
+The number of type arguments must match the number of type parameters.
+The number of positional arguments must be at least as large as the number of required parameters, and no larger than the number of positional parameters.
+All named arguments must have a corresponding named parameter.
+A given named argument cannot be provided more than once.
+}
+
+% View on declaration:
+%
+%     |**   ...        *|**        ...         *|**     ...          *|
+%      <-s type par.s--> <--h required par.s---> <--l optional par.s->
+%                        <--m pos, par.s, h=m--> <---l named par.s---> NAMED
+%                        <----------m positional par.s, m=h+l--------> POS
+%
+% Actual argument part:
+%
+%     |**   ...        *|**           ...          *|**     ...       *|
+%      <-r type par.s--> <----n positional arg.s---> <--k named arg.s->
+\LMHash{}
+% Passing a wrong number of actual type arguments.
+If $r \not= s$, the method lookup has failed.
+% Passing named arguments to a function with optional positional parameters.
+If $k > 0$ and $m \not= h$, the method lookup has failed.
+% Passing too few or too many positional arguments.
 If $n < h$, or $n > m$, the method lookup has failed.
-Furthermore, each $x_i, n+1 \le i \le n+k$, must have a corresponding named parameter in the set $\{p_{m+1}, \ldots, p_{h+l}\}$ or the method lookup also fails.
-Otherwise method lookup has succeeded.
+% When k>0, h=m and there are l named parameters p_{h+1} .. p_{h+l}.
+Furthermore, each
+$x_i, i \in n+1 .. n+k$, must have a corresponding named parameter in the set
+$\{p_{h+1}, \ldots, p_{h+l}\}$,
+or the method lookup also fails.
+Otherwise, method lookup has succeeded.
 
 \LMHash{}
-If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{} bound to the current value of \THIS{}.
+If the method lookup succeeded,
+the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list,
+and with \THIS{} bound to the current value of \THIS{}.
 The value of $i$ is the value returned after $f$ is executed.
 
 \LMHash{}
-If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $S_{dynamic}$ with respect to $L$.
-If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $\SUPER{}.m$.
-Then the value of $i$ is the result of invoking the static method \code{Function.apply()} with arguments $v_g, [o_1, \ldots , o_n], \{x_{n+1} = o_{n+1}, \ldots , x_{n+k} = o_{n+k}\}$.
+If the method lookup has failed,
+then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $S_{dynamic}$ with respect to $L$.
+If the getter lookup succeeded,
+let $v_g$ be the value of the getter invocation $\SUPER{}.m$.
+Then the value of $i$ is the result of invoking
+the static method
+\code{Function.apply()}
+with arguments
+$v_g,
+[o_1, \ldots, o_n],
+\{\#x_{n+1}: o_{n+1}, \ldots, \#x_{n+k}: o_{n+k}\},
+[t_1, \ldots, t_r]$.
 
 \LMHash{}
-If getter lookup has also failed, then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
+If getter lookup has also failed,
+then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
 \begin{itemize}
 \item \code{im.isMethod} evaluates to \code{\TRUE{}}.
 \item \code{im.memberName} evaluates to the symbol \code{m}.
-\item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o_1, \ldots, o_n$]}.
-\item \code{im.namedArguments} evaluates to an immutable map with the same keys and values as \code{\{$\#x_{n+1}: o_{n+1}, \ldots, \#x_{n+k} : o_{n+k}$\}}.
+\item \code{im.positionalArguments} evaluates to an unmodifiable list with the same values as
+$\code{<Object>}[o_1, \ldots, o_n]$.
+\item \code{im.namedArguments} evaluates to an unmodifiable map with the same keys and values as
+$\code{<Symbol, Object>}\{\#x_{n+1}: o_{n+1}, \ldots, \#x_{n+k}: o_{n+k}\}$.
+\item \code{im.typeArguments} evaluates to an unmodifiable list with the same values as
+$\code{<Type>}[t_1, \ldots, t_r]$.
 \end{itemize}
-Then the method \code{noSuchMethod()} is looked up in $S_{dynamic}$ and invoked on \THIS{} with argument $im$, and the result of this invocation is the result of evaluating $i$.
 
 \LMHash{}
-It is a compile-time error if a super method invocation occurs in a top-level function or variable initializer, in an instance variable initializer or initializer list, in class \code{Object}, in a factory constructor or in a static method or variable initializer.
+Then the method \code{noSuchMethod()} is looked up in $S_{dynamic}$ and invoked on \THIS{} with argument $im$,
+and the result of this invocation is the result of evaluating $i$.
+
+% TODO(eernst): We have removed the description of how to invoke noSuchMethod
+% in Object if the overriding noSuchMethod does not accept one argument of
+% type Invocation, because that will be a compile-time error soon. At this
+% point we just keep a commentary ready to say that:
+%
+%% \commentary {
+%% It is a compile-time error to override the \code{noSuchMethod} of class \code{Object} in such a way that it cannot be invoked with one positional argument of type \code{Invocation}.
+%% }
+
+\LMHash{}
+It is a compile-time error if a super method invocation occurs in a top-level function or variable initializer,
+in an instance variable initializer or initializer list,
+in class \code{Object},
+in a factory constructor,
+or in a static method or variable initializer.
 
 \LMHash{}
 Let $S_{static}$ be the superclass of the immediately enclosing class.
 It is a static type warning if $S_{static}$ does not have an accessible (\ref{privacy}) instance member named $m$.
+
+\LMHash{}
 If $S_{static}.m$ exists, it is a static type warning if the type $F$ of $S_{static}.m$ may not be assigned to a function type.
-If $S_{static}.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}; otherwise the static type of $i$ is the declared return type of $F$.
+If $S_{static}.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{};
+Otherwise, let $X_1, \ldots, X_s$ be the formal type parameters of the type of $F$,
+and $T_0$ its declared return type.
+If $r \not= s$ the static type of $i$ is \DYNAMIC{};
+otherwise, the static type of $i$ is $[A_1/X_1, \ldots, A_r/X_s]T_0$.
+
+\commentary{
+That is, the declared return type where each formal type parameter has been replaced by the corresponding actual type argument.
+}
+
 % The following is not needed because it is specified in 'Binding Actuals to Formals"
-%Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of $(T_1, \ldots, t_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \to \bot$.
+%Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of $(T_1, \ldots, t_n, \{T_{n+1}\ x_{n+1}, \ldots, T_{n+k}\ x_{n+k}\}) \to \bot$.
 
 
 \subsubsection{Sending Messages}
@@ -4732,10 +5353,28 @@
 \begin{itemize}
 \item \code{im.isGetter} evaluates to \code{\TRUE{}}.
 \item \code{im.memberName} evaluates to the symbol \code{m}.
-\item \code{im.positionalArguments} evaluates to an empty unmodifiable instance of \code{List<Object>}.
-\item \code{im.namedArguments} evaluates to an empty unmodifiable instance of \code{Map<Symbol, Object>}.
+\item \code{im.positionalArguments} evaluates to an empty, unmodifiable instance of
+\code{List<Object>}.
+\item \code{im.namedArguments} evaluates to an empty, unmodifiable instance of
+
+\code{Map<Symbol, Object>}.
+\item \code{im.typeArguments} evaluates to an empty, unmodifiable instance of
+
+\code{List<Type>}.
 \end{itemize}
-Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$, and the result of this invocation is the result of evaluating $i$.
+
+\LMHash{}
+Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$,
+and the result of this invocation is the result of evaluating $i$.
+
+% TODO(eernst): We have removed the description of how to invoke noSuchMethod
+% in Object if the overriding noSuchMethod does not accept one argument of
+% type Invocation, because that will be a compile-time error soon. At this
+% point we just keep a commentary ready to say that:
+%
+%% \commentary {
+%% It is a compile-time error to override the \code{noSuchMethod} of class \code{Object} in such a way that it cannot be invoked with one positional argument of type \code{Invocation}.
+%% }
 
 \LMHash{}
 It is a compile-time error if $m$ is a member of class \code{Object} and $e$ is either a prefix object (\ref{imports}) or a constant type literal.
@@ -4746,7 +5385,10 @@
 
 \LMHash{}
 Let $T$ be the static type of $e$.
-It is a static type warning if $T$ does not have a method or getter named $m$ unless $T$ is \code{Type}, $e$ is a constant type literal and the class corresponding to $e$ has a static method or getter named $m$.
+It is a static type warning if $T$ does not have a method or getter named $m$,
+unless $T$ is \code{Type},
+$e$ is a constant type literal,
+and the class corresponding to $e$ has a static method or getter named $m$.
 
 \LMHash{}
 The static type of $i$ is:
@@ -4772,7 +5414,7 @@
 If method lookup succeeds then $i$ evaluates to the closurization of method $f$ with respect to superclass $S_{dynamic}$ (\ref{superClosurization}).
 
 \LMHash{}
- Otherwise, $i$ is a getter invocation.
+Otherwise, $i$ is a getter invocation.
 Let $f$ be the result of looking up getter $m$ in $S_{dynamic}$ with respect to $L$.
 The body of $f$ is executed with \THIS{} bound to the current value of \THIS{}.
 The value of $i$ is the result returned by the call to the getter function.
@@ -4782,11 +5424,28 @@
 \begin{itemize}
 \item \code{im.isGetter} evaluates to \code{\TRUE{}}.
 \item \code{im.memberName} evaluates to the symbol \code{m}.
-\item \code{im.positionalArguments} evaluates to an empty unmodifiable instance of \code{List<Object>}.
-\item \code{im.namedArguments} evaluates to an empty unmodifiable instance of \code{Map<Symbol, Object>}.
+\item \code{im.positionalArguments} evaluates to an empty, unmodifiable instance of
+\code{List<Object>}.
+\item \code{im.namedArguments} evaluates to an empty, unmodifiable instance of
+
+\code{Map<Symbol, Object>}.
+\item \code{im.typeArguments} evaluates to an empty, unmodifiable instance of
+
+\code{List<Type>}.
 \end{itemize}
+
+\LMHash{}
 Then the method \code{noSuchMethod()} is looked up in $S_{dynamic}$ and invoked with argument $im$, and the result of this invocation is the result of evaluating $i$.
 
+% TODO(eernst): We have removed the description of how to invoke noSuchMethod
+% in Object if the overriding noSuchMethod does not accept one argument of
+% type Invocation, because that will be a compile-time error soon. At this
+% point we just keep a commentary ready to say that:
+%
+%% \commentary {
+%% It is a compile-time error to override the \code{noSuchMethod} of class \code{Object} in such a way that it cannot be invoked with one positional argument of type \code{Invocation}.
+%% }
+
 \LMHash{}
 Let $S_{static}$ be the superclass of the immediately enclosing class.
 It is a static type warning if $S_{static}$ does not have an accessible instance method or getter named $m$.
@@ -4802,6 +5461,11 @@
 \subsubsection{Ordinary Member Closurization}
 \LMLabel{ordinaryMemberClosurization}
 
+\commentary{
+Note that the non-generic case is covered implicitly using $s = 0$,
+in which case the type parameter declarations are omitted (\ref{generics}).
+}
+
 \LMHash{}
 Let $o$ be an object, and let $u$ be a fresh final variable bound to $o$.
 The {\em closurization of method $f$ on object $o$} is defined to be equivalent to:
@@ -4812,27 +5476,88 @@
 %\item $(a, b) \{\RETURN{}$ $u[a] = b;$\} if $f$ is named $[]=$.
 \item
 \begin{dartCode}
-$(r_1, \ldots, r_n, \{p_1 = d_1, \ldots , p_k = d_k\})$ \{
-  \RETURN{} $ u.m(r_1, \ldots, r_n, p_1: p_1, \ldots, p_k: p_k);$
-\}
+<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
+
+($T_1\ r_1, \ldots,\ T_n\ r_n,\ $\{$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$\}) =>
+    $u.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1$: $p_1, \ldots,\ p_k$: $p_k$);
 \end{dartCode}
-if $f$ is named $m$ and has required parameters $r_1, \ldots, r_n$, and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+if $f$ is named $m$ and has type parameter declarations
+$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
+required parameters $r_1, \ldots, r_n$,
+and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \item
 \begin{dartCode}
-$(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])$\{
-  \RETURN{} $u.m(r_1, \ldots, r_n, p_1, \ldots, p_k)$;
-\}
+<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
+
+($T_1\ r_1, \ldots,\ T_n\ r_n,\ $[$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$]) =>
+    $u.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1, \ldots,\ p_k$);
 \end{dartCode}
-if $f$ is named $m$ and has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+if $f$ is named $m$ and has type parameter declarations
+$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
+required parameters $r_1, \ldots, r_n$,
+and optional positional parameters
+$p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \end{itemize}
 
 \LMHash{}
-Except that if{}f \code{identical($o_1, o_2$)} then \code{$o_1.m$ == $o_2.m$}.
+$B'_j, j \in 1 .. s$, are determined as follows:
+If $o$ is an instance of a non-generic class, $B'_j = B_j, j \in 1 .. s$.
+Otherwise, let $X'_1, \ldots, X'_{s'}$ be the formal type parameters of the class of $o$,
+and $t'_1, \ldots, t'_{s'}$ be the actual type arguments.
+Then $B'_j = [t'_1/X'_1, \ldots, t'_{s'}/X'_{s'}]B_j, j \in 1 .. s$.
+
+\commentary{
+That is, we replace the formal type parameters of the enclosing class, if any, by the corresponding actual type arguments.
+}
+
+%% TODO: We should specify tear-offs by means of their (static and dynamice)
+%% semantics, not via syntactic sugar, because the syntactic sugar causes
+%% weird phenomena like `a type annotation that denotes the same type as`
+%% etc.
+
+%% TODO[covariant-parameters]: When adding a specification of covariant
+%% parameters we will need to indicate that the dynamic parameter type is
+%% `Object` for such a parameter, and that the static type of the function
+%% as a whole will be taken from the statically known type of the receiver
+%% of the tear-off invocation.
+
+\LMHash{}
+The parameter types $T_j, j \in 1 .. n+k$, are determined as follows:
+Let the method declaration $D$ be the implementation of $m$ which is invoked by the expression in the body.
+Let $T$ be the class that contains $D$.
+
+\commentary{
+Note that $T$ is the dynamic type of $o$, or a superclass thereof.
+}
+
+\LMHash{}
+If $T$ is a non-generic class then for $j \in 1 .. n+k$,
+$T_j$ is a type annotation that denotes the same type as that which is denoted by the type annotation on the corresponding parameter declaration in $D$.
+If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
+
+\LMHash{}
+Otherwise $T$ is a generic instantiation of a generic class $G$.
+Let $X''_1, \ldots, X''_{s''}$ be the formal type parameters of $G$,
+and $t''_1, \ldots, t''_{s''}$ be the actual type arguments of $o$ at $T$.
+Then $T_j$ is a type annotation that denotes $[t''_1/X''_1, \ldots, t''_{s''}/X''_{s''}]S_j$,
+where $S_j$ is the type annotation of the corresponding parameter in $D$.
+If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
+
+\LMHash{}
+There is one way in which the closurization differs from the function literal:
+\code{$o_1.m$ == $o_2.m$} is equal to \code{identical($o_1, o_2$)}.
+
 %\item The static type of the property extraction is the static type of function $T.m$, where $T$ is the static type of $e$, if $T.m$ is defined. Otherwise the static type of $e.m$ is \DYNAMIC{}.
 
 \commentary{
-There is no guarantee that \code{identical($o_1.m, o_2.m$)}.
-Dart implementations are not required to canonicalize these or any other closures.
+% Spell out the consequences for `==` and for `identical`, for the receivers
+% and for the closurizations.
+In particular, two closurizations of a method $m$ from the same object are equal,
+and two closurizations of a method $m$ from non-identical objects are not equal.
+It also follows that \code{identical($o_1.m, o_2.m$)} must be false when $o_1$ and $o_2$ are not identical.
+However, Dart implementations are not required to canonicalize closures,
+which means that \code{identical($o_1.m, o_2.m$)} is not guaranteed to be true,
+even when it is known that $o_1$ and $o_2$ are identical.
 }
 % local functions that have a closure extracted are always different
 
@@ -4845,8 +5570,22 @@
 \subsubsection{Super Closurization}
 \LMLabel{superClosurization}
 
+\commentary{
+Note that the non-generic case is covered implicitly using $s = 0$,
+in which case the type parameter declarations are omitted (\ref{generics}).
+}
+
 \LMHash{}
-The {\em closurization of method $f$ with respect to superclass $S$} is defined to be equivalent to:
+Consider expressions in the body of a class $T$ which is a subclass of a given class $S$,
+where a method declaration that implements $f$ exists in $S$,
+and there is no class $U$ which is a subclass of $S$ and a superclass of $T$ which implements $f$.
+
+\commentary{
+In short, consider a situation where a superinvocation of $f$ will execute $f$ as declared in $S$.
+}
+
+\LMHash{}
+The {\em closurization of method $f$ with respect to $S$} is defined to be equivalent to:
 
 \LMHash{}
 \begin{itemize}
@@ -4856,22 +5595,73 @@
 %\item $(a, b) \{\RETURN{}$ $\SUPER[a] = b;$\} if $f$ is named $[]=$.
 \item
 \begin{dartCode}
-$(r_1, \ldots, r_n, \{p_1 = d_1, \ldots , p_k = d_k\})$ \{
-  \RETURN{} \SUPER$.m(r_1, \ldots, r_n, p_1: p_1, \ldots, p_k: p_k);$
-\}
+<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
+
+($T_1\ r_1, \ldots,\ T_n\ r_n,\ $\{$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$\}) =>
+    \SUPER$.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1$: $p_1, \ldots,\ p_k$: $p_k$);
 \end{dartCode}
-if $f$ is named $m$ and has required parameters $r_1, \ldots, r_n$, and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+if $f$ is named $m$ and has type parameter declarations
+$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
+required parameters $r_1, \ldots, r_n$,
+and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \item
 \begin{dartCode}
-$(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])$\{
-  \RETURN{} \SUPER$.m(r_1, \ldots, r_n, p_1, \ldots, p_k)$;
-\}
+<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
+
+($T_1\ r_1, \ldots,\ T_n\ r_n,\ $[$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$]) =>
+    \SUPER.$m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1, \ldots,\ p_k$);
 \end{dartCode}
-if $f$ is named $m$ and has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+if $f$ is named $m$ and has type parameter declarations
+$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
+required parameters $r_1, \ldots, r_n$,
+and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \end{itemize}
 
 \LMHash{}
-Except that if{}f two closurizations were created by code declared in the same class with identical bindings of \THIS{} then \code{\SUPER$_1.m$ == \SUPER$_2.m$}.
+$B'_j, j \in 1 .. s$, are determined as follows:
+If $S$ is a non-generic class then $B'_j = B_j, j \in 1 .. s$.
+Otherwise, let $X'_1, \ldots, X'_{s'}$ be the formal type parameters of $S$,
+and $t'_1, \ldots, t'_{s'}$ be the actual type arguments of \THIS{} at $S$.
+Then $B'_j = [t'_1/X'_1, \ldots, t'_{s'}/X'_{s'}]B_j, j \in 1 .. s$.
+
+\commentary{
+That is, we replace the formal type parameters of the enclosing class, if any, by the corresponding actual type arguments.
+We need to consider the type arguments with respect to a specific class because it is possible for a class to pass different type arguments to its superclass than the ones it receives itself.
+}
+
+%% TODO: We should specify tear-offs by means of their (static and dynamice)
+%% semantics, not via syntactic sugar, because the syntactic sugar causes
+%% weird phenomena like `a type annotation that denotes the same type as`
+%% etc.
+
+%% TODO[covariant-parameters]: When adding a specification of covariant
+%% parameters we will need to indicate that the dynamic parameter type is
+%% `Object` for such a parameter, and that the static type of the function
+%% as a whole will be taken from the statically known type of the receiver
+%% of the tear-off invocation.
+
+\LMHash{}
+The parameter types $T_j, j \in 1 .. n+k$, are determined as follows:
+Let the method declaration $D$ be the implementation of $m$ in $S$.
+
+\LMHash{}
+If $S$ is a non-generic class then for $j \in 1 .. n+k$,
+$T_j$ is a type annotation that denotes the same type as that which is denoted by the type annotation on the corresponding parameter declaration in $D$.
+If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
+
+\LMHash{}
+Otherwise $S$ is a generic instantiation of a generic class $G$.
+Let $X''_1, \ldots, X''_{s''}$ be the formal type parameters of $G$,
+and $t''_1, \ldots, t''_{s''}$ be the actual type arguments of $o$ at $S$.
+Then $T_j$ is a type annotation that denotes $[t''_1/X''_1, \ldots, t''_{s''}/X''_{s''}]S_j$,
+where $S_j$ is the type annotation of the corresponding parameter in $D$.
+If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
+
+\LMHash{}
+There is one way in which the closurization differs from the function literal:
+Assume that an occurrence of the expression \SUPER{}.$m$ in a given class is evaluated on two occasions where \THIS{} is $o_1$ respectively $o_2$,
+and the resulting closurization is $c_1$ respectively $c_2$:
+\code{$c_1$ == $c_2$} is then equal to \code{identical($o_1, o_2$)}.
 
 
 \subsection{Assignment}
@@ -4955,7 +5745,8 @@
 The expression $e_1$ is evaluated to an object $o_1$.
 Then, the expression $e_2$ is evaluated to an object $o_2$.
 Then, the setter $v=$ is looked up (\ref{getterAndSetterLookup}) in $o_1$ with respect to the current library.
-If $o_1$ is an instance of \code{Type} but $e_1$ is not a constant type literal, then if $v=$ is a setter that forwards (\ref{functionDeclarations}) to a static setter, setter lookup fails.
+If $o_1$ is an instance of \code{Type} but $e_1$ is not a constant type literal,
+then if $v=$ is a setter that forwards (\ref{functionDeclarations}) to a static setter, setter lookup fails.
 Otherwise, the body of $v=$ is executed with its formal parameter bound to $o_2$ and \THIS{} bound to $o_1$.
 
 \LMHash{}
@@ -4963,13 +5754,28 @@
 \begin{itemize}
 \item \code{im.isSetter} evaluates to \code{\TRUE{}}.
 \item \code{im.memberName} evaluates to the symbol \code{v=}.
-\item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o_2$]}.
-\item \code{im.namedArguments} evaluates to an empty unmodifiable instance of \code{Map<Symbol, Object>}.
-\end{itemize}
+\item \code{im.positionalArguments} evaluates to an unmodifiable list with the same values as
+$\code{<Object>}[o_2]$.
+\item \code{im.namedArguments} evaluates to an empty, unmodifiable instance of
+
+\code{Map<Symbol, Object>}.
+\item \code{im.typeArguments} evaluates to an empty, unmodifiable instance of
+
+\code{List<Type>}.
+m\end{itemize}
 
 \LMHash{}
 Then the method \code{noSuchMethod()} is looked up in $o_1$ and invoked with argument $im$.
 
+% TODO(eernst): We have removed the description of how to invoke noSuchMethod
+% in Object if the overriding noSuchMethod does not accept one argument of
+% type Invocation, because that will be a compile-time error soon. At this
+% point we just keep a commentary ready to say that:
+%
+%% \commentary {
+%% It is a compile-time error to override the \code{noSuchMethod} of class \code{Object} in such a way that it cannot be invoked with one positional argument of type \code{Invocation}.
+%% }
+
 \LMHash{}
 The value of the assignment expression is $o_2$ irrespective of whether setter lookup has failed or succeeded.
 
@@ -4999,8 +5805,10 @@
 \begin{itemize}
 \item \code{im.isSetter} evaluates to \code{\TRUE{}}.
 \item \code{im.memberName} evaluates to the symbol \code{v=}.
-\item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o$]}.
+\item \code{im.positionalArguments} evaluates to an unmodifiable list with the same values as \code{[$o$]}.
 \item \code{im.namedArguments} evaluates to an empty unmodifiable instance of \code{Map<Symbol, Object>}.
+\item \code{im.typeArguments} evaluates to an empty, unmodifiable instance of
+\code{List<Type>}.
 \end{itemize}
 
 \LMHash{}
@@ -5044,7 +5852,6 @@
 \LMHash{}
 It is a compile-time error to invoke any of the setters of class \code{Object} on a prefix object (\ref{imports}) or on a constant type literal that is immediately followed by the token `.'.
 
-
 \subsubsection{Compound Assignment}
 \LMLabel{compoundAssignment}
 
@@ -5190,7 +5997,7 @@
   `\&=';
   `\^{}=';
   `$|$=';
-  `??=';
+  `??='
   .
 \end{grammar}
 
@@ -5634,7 +6441,7 @@
   .
 
 {\bf selector:}assignableSelector;
-  arguments
+  argumentPart
   .
 
 {\bf incrementOperator:}`++';
@@ -5805,7 +6612,7 @@
 }
 
 \begin{grammar}
-{\bf assignableExpression:}primary (arguments* assignableSelector)+;
+{\bf assignableExpression:}primary (argumentPart* assignableSelector)+;
   \SUPER{} unconditionalAssignableSelector;
   identifier
   .
@@ -5855,7 +6662,8 @@
 {\bf identifier:}IDENTIFIER
   .
 
-{\bf IDENTIFIER\_NO\_DOLLAR:}IDENTIFIER\_START\_NO\_DOLLAR IDENTIFIER\_PART\_NO\_DOLLAR*
+{\bf IDENTIFIER\_NO\_DOLLAR:}IDENTIFIER\_START\_NO\_DOLLAR
+  \gnewline{} IDENTIFIER\_PART\_NO\_DOLLAR*
   .
 
 {\bf IDENTIFIER:}IDENTIFIER\_START IDENTIFIER\_PART*
@@ -6361,10 +7169,10 @@
 \LMLabel{forLoop}
 
 \LMHash{}
-Execution of a for statement of the form \code{\FOR{} (\VAR{} $v$ = $e_0$ ; $c$; $e$) $s$} proceeds as follows:
+Execution of a for statement of the form \code{\FOR{} (\VAR{} $v$ = $e_0$; $c$; $e$) $s$} proceeds as follows:
 
 \LMHash{}
-If $c$ is empty then let $c^\prime$ be \TRUE{} otherwise let $c^\prime$ be $c$.
+If $c$ is empty then let $c'$ be \TRUE{} otherwise let $c'$ be $c$.
 
 \LMHash{}
 First the variable declaration statement \VAR{} $v = e_0$ is executed.
@@ -6372,25 +7180,25 @@
 \begin{enumerate}
 \item
 \label{beginFor}
-If this is the first iteration of the for loop, let $v^\prime$ be $v$.
-Otherwise, let $v^\prime$ be the variable $v^{\prime\prime}$ created in the previous execution of step \ref{allocateFreshVar}.
+If this is the first iteration of the for loop, let $v'$ be $v$.
+Otherwise, let $v'$ be the variable $v''$ created in the previous execution of step \ref{allocateFreshVar}.
 \item
-The expression $[v^\prime/v]c$ is evaluated and subjected to boolean conversion (\ref{booleans}).
+The expression $[v'/v]c$ is evaluated and subjected to boolean conversion (\ref{booleans}).
 If the result is \FALSE{}, the for loop completes normally.
 Otherwise, execution continues at step \ref{beginIteration}.
 \item
 \label{beginIteration}
-The statement $[v^\prime/v]\{s\}$ is executed.
+The statement $[v'/v]\{s\}$ is executed.
 
 If this execution completes normally, continues without a label,
 or continues to a label (\ref{labels}) that prefixes this \FOR{} statement (\ref{completion}),
 then execution of the statement is treated as if it had completed normally.
 
 \label{allocateFreshVar}
-Let $v^{\prime\prime}$ be a fresh variable.
-$v^{\prime\prime}$ is bound to the value of $v^\prime$.
+Let $v''$ be a fresh variable.
+$v''$ is bound to the value of $v'$.
 \item
-The expression $[v^{\prime\prime}/v]e$ is evaluated, and the process recurses at step \ref{beginFor}.
+The expression $[v''/v]e$ is evaluated, and the process recurses at step \ref{beginFor}.
 \end{enumerate}
 
 \rationale{
@@ -6398,7 +7206,7 @@
 
 Instead, each iteration has its own distinct variable.
 The first iteration uses the variable created by the initial declaration.
-The expression executed at the end of each iteration uses a fresh variable $v^{\prime\prime}$, bound to the value of the current iteration variable, and then modifies $v^{\prime\prime}$ as required for the next iteration.
+The expression executed at the end of each iteration uses a fresh variable $v''$, bound to the value of the current iteration variable, and then modifies $v''$ as required for the next iteration.
 }
 
 \LMHash{}
@@ -6631,7 +7439,7 @@
 \}
 \end{dartCode}
 
- it is a compile-time error if the expressions $e_k$ are not compile-time constants for all $k \in 1..n$.
+ it is a compile-time error if the expressions $e_k$ are not compile-time constants for all $k \in 1 .. n$.
 It is a compile-time error if the values of the expressions $e_k$ are not either:
 \begin{itemize}
 \item instances of the same class $C$, for all $k \in 1 .. n$, or
@@ -6683,7 +7491,7 @@
 
 \LMHash{}
 The statement \code{\VAR{} $id$ = $e$;} is evaluated, where $id$ is a fresh variable.
-In checked mode, it is a run-time error if the value of $e$ is not an instance of the same class as the constants $e_1 \ldots e_n$.
+In checked mode, it is a run-time error if the value of $e$ is not an instance of the same class as the constants $e_1, \ldots, e_n$.
 
 \commentary{
 Note that if there are no case clauses ($n = 0$), the type of $e$ does not matter.
@@ -6761,7 +7569,7 @@
 
 \begin{dartCode}
 \SWITCH{} (x) \{
-  \CASE{} 1: \TRY{} \{ $\ldots$ \RETURN{};\} \FINALLY{} \{ $\ldots$ \RETURN{};\}
+  \CASE{} 1: \TRY{} \{ $\ldots$ \RETURN{}; \} \FINALLY{} \{ $\ldots$ \RETURN{}; \}
 \}
 \end{dartCode}
 
@@ -7596,9 +8404,9 @@
 \begin{itemize}
 \item If $C_i$ is of the form
 
-\code{\SHOW{} $id_1, \ldots, id_k$}
+\code{\SHOW{} $id_1, \ldots,\ id_k$}
 
-then let $NS_i = \SHOW{}([id_1, \ldots, id_k], NS_{i-1}$)
+then let $NS_i = \SHOW{}([id_1, \ldots,\ id_k], NS_{i-1}$)
 
 where $show(l,n)$ takes a list of identifiers $l$ and a namespace $n$, and produces a namespace that maps each name in $l$ to the same element that $n$ does.
 Furthermore, for each name $x$ in $l$, if $n$ defines the name $x=$ then the new namespace maps $x=$ to the same element that $n$ does.
@@ -7606,9 +8414,9 @@
 
 \item If $C_i$ is of the form
 
-\code{\HIDE{} $id_1, \ldots, id_k$}
+\code{\HIDE{} $id_1, \ldots,\ id_k$}
 
-then let $NS_i = \HIDE{}([id_1, \ldots, id_k], NS_{i-1}$)
+then let $NS_i = \HIDE{}([id_1, \ldots,\ id_k], NS_{i-1}$)
 
 where $hide(l, n)$ takes a list of identifiers $l$ and a namespace $n$, and produces a namespace that is identical to $n$ except that for each name $k$ in $l$, $k$ and $k=$ are undefined.
 \end{itemize}
@@ -7648,14 +8456,15 @@
 \LMHash{}
 A {\em system library} is a library that is part of the Dart implementation.
 Any other library is a {\em non-system library}.
-If a name $N$ is referenced by a library $L$ and $N$ would be introduced into the top level scope of $L$ by
-imports of two libraries, $L_1$ and $L_2$, and the exported namespace of $L_1$ binds $N$ to a declaration originating in a system library:
 
-%an import of a system library and an import of a non-system library:
-\begin{itemize}
-\item The import of $L_1$ is implicitly extended by a \code{\HIDE{} $N$} clause.
-\item A static warning is issued.
-\end{itemize}
+If a name $N$ is referenced by a library $L$
+and $N$ would be introduced into the top level scope of $L$
+by imports of two libraries, $L_1$ and $L_2$,
+the exported namespace of $L_1$ binds $N$
+to a declaration originating in a system library,
+and the exported namespace of $L_2$ binds $N$ to a declaration
+that does not originate in a system library,
+then the import of $L_1$ is implicitly extended by a \code{\HIDE{} $N$} clause.
 
 \rationale{
 Whereas normal conflicts are resolved at deployment time, the functionality of \code{dart:} libraries is injected into an application at run time, and may vary over time as browsers are upgraded.
@@ -7671,7 +8480,6 @@
 \item A static warning occurs.
 \item If $N$ is referenced as a function, getter or setter, a \code{NoSuchMethodError} is thrown.
 \item If $N$ is referenced as a type, it is treated as a malformed type.
-
 \end{itemize}
 
 \LMHash{}
@@ -7770,12 +8578,12 @@
 Let $NS_0$ be the exported namespace of $B$.
 Then, for each combinator clause $C_i, i \in 1 .. n$ in $E$:
 \begin{itemize}
-\item If $C_i$ is of the form \code{\SHOW{} $id_1, \ldots, id_k$} then let
+\item If $C_i$ is of the form \code{\SHOW{} $id_1, \ldots,\ id_k$} then let
 
-$NS_i = \SHOW{}([id_1, \ldots, id_k], NS_{i-1}$).
-\item If $C_i$ is of the form \code{\HIDE{} $id_1, \ldots, id_k$}
+$NS_i = \SHOW{}([id_1, \ldots,\ id_k], NS_{i-1}$).
+\item If $C_i$ is of the form \code{\HIDE{} $id_1, \ldots,\ id_k$}
 
-then let $NS_i = \HIDE{}([id_1, \ldots, id_k], NS_{i-1}$).
+then let $NS_i = \HIDE{}([id_1, \ldots,\ id_k], NS_{i-1}$).
 \end{itemize}
 
 \LMHash{}
@@ -7783,12 +8591,13 @@
 entry mapping key $k$ to declaration $d$ in $NS_n$ an entry mapping $k$ to $d$ is added to the exported namespace of $L$ unless a top-level declaration with the name $k$ exists in $L$.
 
 \LMHash{}
-If a name $N$ is referenced by a library $L$ and $N$ would be introduced into the exported namespace of $L$ by exports of two libraries, $L_1$ and $L_2$, and the exported namespace of $L_1$ binds $N$ to a declaration originating in a system library:
-%an export of a system library and an export of a non-system library:
-\begin{itemize}
-\item The export of $L_1$ is implicitly extended by a \code{\HIDE{} $N$} clause.
-\item A static warning is issued.
-\end{itemize}
+If a name $N$ is not declared by a library $L$
+and $N$ would be introduced into the exported namespace of $L$
+by exports of two libraries, $L_1$ and $L_2$,
+the exported namespace of $L_1$ binds $N$ to a declaration originating in a system library,
+and the exported namespace of $L_2$ binds $N$ to a declaration
+that does not originate in a system library,
+then the export of $L_1$ is implicitly extended by a \code{\HIDE{} $N$} clause.
 
 \rationale{
 See the discussion in section \ref{imports} for the reasoning behind this rule.
@@ -7985,11 +8794,11 @@
 \begin{itemize}
 \item $T$ has the form $id$ or the form $prefix.id$, and in the enclosing lexical scope, the name $id$ (respectively $prefix.id$) does not denote a type.
 \item $T$ denotes a type variable in the enclosing lexical scope, but occurs in the signature or body of a static member.
-\item $T$ is a parameterized type of the form $G<S_1, \ldots , S_n>$, and $G$ is malformed.
+\item $T$ is a parameterized type of the form \code{$G$<$S_1, \ldots,\ S_n$>}, and $G$ is malformed.
 \item $T$ denotes declarations that were imported from multiple imports clauses.
 %Either $G$ or $S_i, i \in 1 .. n$ are malformed.
 % \item $G$ is not a generic type with $n$ type parameters.
-% \item Let $T_i$ be the type parameters of $G$ (if any) and let $B_i$ be the bound of $T_i, i \in 1 .. n$, and $S_i$ is not a subtype of $[S_1, \ldots, S_n/T_1, \ldots, T_n]B_i, i \in 1 .. n$.
+% \item Let $T_i$ be the type parameters of $G$ (if any) and let $B_i$ be the bound of $T_i, i \in 1 .. n$, and $S_i$ is not a subtype of $[S_1/T_1, \ldots, S_n/T_n]B_i, i \in 1 .. n$.
 % \end{itemize}
 \end{itemize}
 
@@ -8159,9 +8968,24 @@
   .
 \end{grammar}
 
+% TODO(eernst): Introduce new type aliases and new function type syntax, then
+% include support for generic functions here.
+
 \LMHash{}
- The effect of a type alias of the form \code{\TYPEDEF{} $T$ $id (T_1$ $p_1, \ldots, T_n$ $p_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}])$} declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type $(T_1, \ldots, T_n, [T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}]) \rightarrow T$.
-The effect of a type alias of the form \code{\TYPEDEF{} $T$ $id (T_1$ $p_1, \ldots, T_n$ $p_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\})$} declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type $(T_1, \ldots, T_n, \{T_{n+1}$ $p_{n+1}, \ldots, T_{n+k}$ $p_{n+k}\}) \rightarrow T$.
+The effect of a type alias of the form
+
+\code{\TYPEDEF{} $T$ $id$($T_1\ p_1, \ldots,\ T_n\ p_n,\ [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}]$)}
+
+\noindent
+declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type
+$(T_1, \ldots,\ T_n, [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k} p_{n+k}]) \rightarrow T$.
+The effect of a type alias of the form
+
+\code{\TYPEDEF{} $T$ $id$($T_1\ p_1, \ldots,\ T_n\ p_n,\ \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}$)}
+
+\noindent
+declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type
+$(T_1, \ldots,\ T_n, \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}) \rightarrow T$.
 In either case, if{}f no return type is specified, it is taken to be \DYNAMIC{}.
 Likewise, if a type annotation is omitted on a formal parameter, it is taken to be \DYNAMIC{}.
 
@@ -8195,7 +9019,7 @@
 \item $S$ is a direct supertype of $T$.
 \item $T$ is a type parameter and $S$ is the upper bound of $T$.
 \item $T$ is a type parameter and $S$ is \code{Object}.
-\item $T$ is of the form $I<T_1, \ldots, T_n>$ and $S$ is of the form $I<S_1, \ldots, S_n>$ and:
+\item $T$ is of the form \code{$I$<$T_1, \ldots,\ T_n$>} and $S$ is of the form \code{$I$<$S_1, \ldots,\ S_n$>} and:
 $T_i << S_i, 1 \le i \le n$
 \item $T$ and $S$ are both function types, and $T << S$ under the rules of section \ref{functionTypes}.
 \item $T$ is a function type and $S$ is \code{Function}.
@@ -8245,18 +9069,31 @@
 \subsection{Function Types}
 \LMLabel{functionTypes}
 
+\commentary{
+Note that the non-generic case is covered by using $s = 0$,
+in which case the type parameter declarations are omitted (\ref{generics}).
+}
+
 \LMHash{}
 Function types come in two variants:
 \begin{enumerate}
 \item
 The types of functions that only have positional parameters.
-These have the general form $(T_1, \ldots, T_n, [T_{n+1} \ldots, T_{n+k}]) \rightarrow T$.
+These have the general form
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_n,\ $[$T_{n+1}, \ldots,\ T_{n+k}$]) $ \rightarrow T$}.
 \item
 The types of functions with named parameters.
-These have the general form $(T_1, \ldots, T_n, \{T_{x_1}$ $x_1 \ldots, T_{x_k}$ $x_k\}) \rightarrow T$.
+These have the general form
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_n,\ $\{$T_{x_1}\ x_1, \ldots,\ T_{x_k}\ x_k$\}) $ \rightarrow T$}.
 \end{enumerate}
 
-%$(T_1, \ldots T_n) \rightarrow T$ is a subtype of $(S_1, \ldots, S_n, ) \rightarrow S$, if all of the following conditions are met:
+%$(T_1, \ldots, T_n) \rightarrow T$ is a subtype of  $(S_1, \ldots, S_n, ) \rightarrow S$, if all of the following conditions are met:
 %\begin{enumerate}
 %\item Either
 %\begin{itemize}
@@ -8267,10 +9104,34 @@
 %\end{enumerate}
 
 \LMHash{}
-%A function type $(T_1, \ldots T_n, [T_{n+1} \ldots, T_{n+k}]) \rightarrow T$ is a subtype of the
+Two function types are considered equal if consistent renaming of type
+parameters can make them identical.
+
+\commentary{
+A common way to say this is that we do not distinguish function types which are alpha-equivalent.
+For the subtyping rule below this means we can assume that a suitable renaming has already taken place.
+In cases where this is not possible because the number of type parameters in the two types differ or the bounds are different, no subtype relationship exists.
+}
+
+\LMHash{}
+%A function type $(T_1, \ldots, T_n, [T_{n+1} , \ldots, T_{n+k}]) \rightarrow T$ is a subtype of the
 % the line below revises the rule to be more liberal
-A function type $(T_1, \ldots T_{k}, [T_{k+1} \ldots, T_{n+m}]) \rightarrow T$ is a subtype of the
-function type $(S_1, \ldots, S_{k+j}, [S_{k+j+1} \ldots, S_{n}]) \rightarrow S$, if all of the following conditions are met:
+The function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_{k},\ $[$T_{k+1}, \ldots,\ T_{n+m}$]) $ \rightarrow T$}
+
+\noindent
+is a subtype of the function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($S_1, \ldots,\ S_{k+j},\ $[$S_{k+j+1}, \ldots,\ S_{n}$]) $ \rightarrow S$},
+
+\noindent
+if all of the following conditions are met,
+assuming that $X_j$ is a subtype of $B_j$, for all $j \in 1 .. s$:
 \begin{enumerate}
 \item Either
 \begin{itemize}
@@ -8281,7 +9142,22 @@
 \end{enumerate}
 
 \LMHash{}
-A function type $(T_1, \ldots T_n, \{T_{x_1}$ $x_1, \ldots, T_{x_k}$ $x_k\}) \rightarrow T$ is a subtype of the function type $(S_1, \ldots, S_n, \{S_{y_1}$ $y_1, \ldots, S_{y_m}$ $y_m\}) \rightarrow S$, if all of the following conditions are met:
+A function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_n,\ $\{$T_{x_1}\ x_1, \ldots,\ T_{x_k}\ x_k$\}) $ \rightarrow T$}
+
+\noindent
+is a subtype of the function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($S_1, \ldots,\ S_n,\ $\{$S_{y_1}\ y_1, \ldots,\ S_{y_m}\ y_m$\}) $ \rightarrow S$},
+
+\noindent
+if all of the following conditions are met,
+assuming that $X_j$ is a subtype of $B_j$, for all $j \in 1 .. s$:
 \begin{enumerate}
 \item Either
 \begin{itemize}
@@ -8301,18 +9177,42 @@
 %We write $(T_1, \ldots, T_n) \rightarrow T$ as a shorthand for the type $(T_1, \ldots, T_n, []) \rightarrow T$.
 
 %The rules above need to be sanity checked, but the intent is that we view functions with rest parameters as having type $(T_1, ..., T_n, [\_{Tn+1}[] \_]) \rightarrow T$, where \_ is some magical identifier. Then the rules above may cover everything.
-% This is wrong - from the outside, the type takes an unbounded sequence of types, not a list. This can be modeled as $(T_1, \ldots, T_n, [T_{n+1}, \_ \ldots, T_{n+k} \_]) \rightarrow T$ for some finite $k$.
+% This is wrong - from the outside, the type takes an unbounded sequence of types, not a list. This can be modeled as $(T_1, \ldots, T_n, [T_{n+1}, \_, \ldots, T_{n+k} \_]) \rightarrow T$ for some finite $k$.
 
 \LMHash{}
 In addition, the following subtype rules apply:
 
-$(T_1, \ldots, T_n, []) \rightarrow T <: (T_1, \ldots, T_n) \rightarrow T$.
+% NOTE(eernst): In Dart 1 we do not have transitivity of subtyping so we
+% cannot use a rule about the empty list/set of optional parameters ('[]'
+% or '{}') as an "intermediate step" in a subtype judgment. We keep them
+% for now because they will be useful in Dart 2.
 
-$(T_1, \ldots, T_n) \rightarrow T <: (T_1, \ldots, T_n, \{\}) \rightarrow T$.
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n,\ $[]) $ \rightarrow T \quad<:$}
 
-$(T_1, \ldots, T_n, \{\}) \rightarrow T <: (T_1, \ldots, T_n) \rightarrow T$.
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n$)\ $\rightarrow T$}.
 
-$(T_1, \ldots, T_n) \rightarrow T <: (T_1, \ldots, T_n, []) \rightarrow T$.
+\vspace{2mm}
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n,\ $\{\}) $ \rightarrow T \quad<:$}
+
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n$)\ $\rightarrow T$}.
+
+\vspace{2mm}
+
+% NOTE(eernst): I think this rule is useless. We cannot use it (along with
+% other rules) to prove (T1) -> S <: (T1, []) -> S <: (T1, [T2]) -> S,
+% because it should not be provable (and it isn't) that we can accept two
+% arguments statically, but at runtime we only accept one argument; similarly,
+% we cannot prove (T1) -> S <: (T1, []) -> S <: ([T1]) -> S, because we
+% would then allow invocation with no arguments where the run-time
+% requirement is exactly one argument. So I believe that this rule is
+% simply useless (it's not dangerous, it just doesn't allow us to prove
+% anything). Hence, I'm commenting it out now.
+%
+% $(T_1, \ldots, T_n) \rightarrow T <: (T_1, \ldots, T_n, []) \rightarrow T$.
+%
+% Same for this rule:
+%
+% $(T_1, \ldots, T_n) \rightarrow T <: (T_1, \ldots, T_n, \{\}) \rightarrow T$.
 
 \rationale{
 The naive reader might conclude that, since it is not legal to declare a function with an empty optional parameter list, these rules are pointless.
@@ -8327,13 +9227,26 @@
 A function is always an instance of some class that implements the class \code{Function} and implements a \CALL{} method with the same signature as the function.
 All function types are subtypes of \code{Function}.
 If a type $I$ includes an instance method named \CALL{}, and the type of \CALL{} is the function type $F$, then $I$ is considered to be more specific than $F$.
-It is a static warning if a concrete class implements \code{Function} and does not have a concrete method named \CALL{} unless that class has an implementation of \code{noSuchMethod()} distinct from the one declared in class \code{Object}.
+It is a static warning if a concrete class implements \code{Function} and does not have a concrete method named \CALL{} unless that class has a concrete \code{noSuchMethod()} distinct from the one declared in class \code{Object}.
 
 %\commentary{Need to specify how a function values dynamic type is derived from its static signature.}
 
 \LMHash{}
-A function type $(T_1, \ldots T_{k}, [T_{k+1} \ldots, T_{n+m}]) \rightarrow T$ is more specific than the
-function type $(S_1, \ldots, S_{k+j}, [S_{k+j+1} \ldots, S_{n}]) \rightarrow S$, if all of the following conditions are met:
+A function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_{k},\ $[$T_{k+1}, \ldots,\ T_{n+m}$]) $ \rightarrow T$}
+
+\noindent
+is more specific than the function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($S_1, \ldots,\ S_{k+j},\ $[$S_{k+j+1}, \ldots,\ S_{n}$]) $ \rightarrow S$},
+
+\noindent
+if all of the following conditions are met:
 \begin{enumerate}
 \item Either
 \begin{itemize}
@@ -8344,7 +9257,21 @@
 \end{enumerate}
 
 \LMHash{}
-A function type $(T_1, \ldots T_n, \{T_{x_1}$ $x_1, \ldots, T_{x_k}$ $x_k\}) \rightarrow T$ is more specific than the function type $(S_1, \ldots, S_n, \{S_{y_1}$ $y_1, \ldots, S_{y_m}$ $y_m\}) \rightarrow S$, if all of the following conditions are met:
+A function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($T_1, \ldots,\ T_n,\ $\{$T_{x_1}\ x_1, \ldots,\ T_{x_k}\ x_k$\}) $ \rightarrow T$}
+
+\noindent
+is more specific than the function type
+
+\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+
+\code{($S_1, \ldots,\ S_n,\ $\{$S_{y_1}\ y_1, \ldots,\ S_{y_m}\ y_m$\}) $ \rightarrow S$},
+
+\noindent
+if all of the following conditions are met:
 \begin{enumerate}
 \item Either
 \begin{itemize}
@@ -8372,7 +9299,8 @@
 If a generic type is used but type arguments are not provided, then the type arguments default to the unknown type.
 
 \commentary{
-This means that given a generic declaration $G<T_1, \ldots, T_n>$, the type $G$ is equivalent to $G< \DYNAMIC{}, \ldots, \DYNAMIC{}>$.
+This means that given a generic declaration \code{$G$<$T_1, \ldots,\ T_n$>}, the type $G$ is equivalent to
+\code{$G$<$\DYNAMIC{}, \ldots,\ \DYNAMIC{}$>}.
 }
 
 \LMHash{}
@@ -8504,22 +9432,73 @@
 \subsection{Parameterized Types}
 \LMLabel{parameterizedTypes}
 
-\LMHash{}
-A {\em parameterized type} is an invocation of a generic type declaration.
+% TODO(eernst): Deletions needed below when switching warning-->error; new
+% concept may be needed when adding support for generic tear-offs.
+%
+% Details:
+%
+% When switching to Dart 2 the static warnings about having an incorrect
+% number of type arguments or violating the bounds will become compile-time
+% errors, and we will no longer need a specification of the dynamic
+% semantics: Parameterized types will always apply a compile-time constant
+% denotation of a class (a dynamic value, i.e., an instance of \code{Type},
+% cannot be applied to actual type arguments), so no error free program can
+% need this semantics.
+%
+% We may want to add a new concept for the application of a generic
+% function to actual type arguments (maybe it's an extra kind of
+% 'parameterized type', but it differs from the generic class case because
+% we _can_ have dynamic invocations of a generic function). But this does
+% not arise as a stand-alone entity before we introduce generic tear-offs
+% (\code{var f = foo<int>;}), or if we allow it to arise implicitly based
+% on inference. That new concept should probably be added to this section.
 
 \LMHash{}
-Let $T$ be a parameterized type $G<S_1, \ldots, S_n>$.
-If $G$ is not a generic type, the type arguments $S_i$, $1 \le i \le n$ are discarded.
-If $G$ has $m \ne n$ type parameters, $T$ is treated as a parameterized type with $m$ arguments, all of which are \DYNAMIC{}.
+A \emph{parameterized type} is a syntactic construct where the name of a generic type declaration is applied to a list of actual type arguments.
+A \emph{generic instantiation} is the operation where a generic type is applied to actual type arguments.
 
 \commentary{
-In short, any arity mismatch results in all type arguments being dropped, and replaced with the correct number of type arguments, all set to \DYNAMIC{}.
+So a parameterized type is the syntactic concept that corresponds to the semantic concept of a generic instantiation.
+When using the former, we will often leave the latter implicit.
+}
+
+\LMHash{}
+Let $T$ be a parameterized type \code{$G$<$S_1, \ldots,\ S_n$>}.
+It is evaluated as follows.
+
+\LMHash{}
+If $G$ is not a generic type,
+the type arguments $S_i, i \in 1 .. n$ are ignored.
+If $G$ has $m \ne n$ type parameters, $T$ is treated as a parameterized type with $m$ arguments,
+all of which are \DYNAMIC{},
+and $S_i, i \in 1 .. n$ are ignored.
+
+%% TODO[dart-2]: This commentary should be completely obsolete in Dart 2.
+\commentary{
+In short, any arity mismatch results in all type arguments being dropped, and replaced by the correct number of type arguments, all set to \DYNAMIC{}.
 Of course, a static warning will be issued.
 }
 
 \LMHash{}
-Otherwise, let $T_i$ be the type parameters of $G$ and let $B_i$ be the bound of $T_i, i \in 1 .. n$.
-$T$ is {\em malbounded} if{}f either $S_i$ is malbounded or $S_i$ is not a subtype of $[S_1, \ldots, S_n/T_1, \ldots, T_n]B_i, i \in 1 .. n$.
+Otherwise, let $X_i$ be the type parameters of $G$ and let $B_i$ be the bound of $X_i, i \in 1 .. n$.
+Let $t_i$ be the result of evaluating $S_i$, for $i \in 1 .. n$.
+
+\LMHash{}
+$T$ is {\em malbounded} if{}f either $S_i$ is malbounded or $t_i$ is not a subtype of
+$[t_1/X_1, \ldots, t_n/X_n]B_i$,
+for one or more $i \in 1 .. n$.
+
+% TODO(eernst): When changing from warnings to errors, include the following
+% as a commentary:
+%
+%   We do not specify the result of evaluating a malbounded type.
+%   This is because it is a compile-time error when a parameterized type is
+%   encountered, unless it is statically known that it will not be malbounded.
+%
+% That is also the reason why we say "$S_i$ is malbounded", not "$t_i$" above.
+
+\LMHash{}
+Otherwise, $T$ evaluates to the generic instantiation where $G$ is applied to $t_1, \ldots, t_n$.
 
 \commentary{
 Note, that, in checked mode, it is a dynamic type error if a malbounded type is used in a type test as specified in \ref{dynamicTypeSystem}.
@@ -8529,35 +9508,80 @@
 Any use of a malbounded type gives rise to a static warning.
 
 \LMHash{}
-If $S$ is the static type of a member $m$ of $G$, then the static type of the member $m$ of $G<A_1, \ldots, A_n>$ is $[A_1, \ldots, A_n/T_1, \ldots, T_n]S$ where $T_1, \ldots, T_n$ are the formal type parameters of $G$.
-Let $B_i$, be the bounds of $T_i, 1 \le i \le n$.
-It is a static type warning if $A_i$ is not a subtype of $[A_1, \ldots, A_n/T_1, \ldots, T_n]B_i, i \in 1 .. n$.
+If $S$ is the static type of a member $m$ of $G$,
+then the static type of the member $m$ of
+\code{$G$<$A_1, \ldots,\ A_n$>}
+is
+$[A_1/X_1, \ldots, A_n/X_n]S$,
+where $X_1, \ldots, X_n$ are the formal type parameters of $G$.
+Let $B_i$ be the bounds of $X_i, i \in 1 .. n$.
+It is a static type warning if $A_i$ is not a subtype of
+$[A_1/X_1, \ldots, A_n/X_n]B_i, i \in 1 .. n$.
 It is a static type warning if $G$ is not a generic type with exactly $n$ type parameters.
 
 
 \subsubsection{Actual Type of Declaration}
 \LMLabel{actualTypeOfADeclaration}
 
-\LMHash{}
-A type $T$ {\em depends on a type parameter} $U$ if{}f:
-\begin{itemize}
-\item $T$ is $U$.
-\item $T$ is a parameterized type, and one of the type arguments of $T$ depends on $U$.
-\end{itemize}
+% NOTE(eernst): The actual type arguments in this section are dynamic entities,
+% not syntax (the concept of an 'actual type' and an 'actual bound' is used to
+% specify the dynamic semantics, including dynamic errors). So we use $t_i$
+% to denote these type arguments, just like all those location where the
+% concept is used, rather than $A_i$ which is frequently used to denote the
+% syntax of an actual type argument.
+%
+% The point is that $t_i$ will never contain a formal type parameter, so we
+% need not worry about the need to iterate in the substitution that finds an
+% actual bound. For instance, there is no problem determining the actual bound
+% for \code{X} in an invocation of \code{void foo<X extends C<X>>() \{...\}}
+% even if it is a recursive invocation on the form \code{foo<C<X>>()} in the
+% body.
 
 \LMHash{}
-Let $T$ be the declared type of a declaration $d$, as it appears in the program source.
-The {\em actual type} of $d$ is
+Let $T$ be the declared type of a declaration $d$,
+as it appears in the program source.
+Let $X_1, \ldots, X_n$ be the formal type parameters in scope at $d$.
+In a context where the actual type arguments corresponding to
+$X_1, \ldots, X_n$
+are
+$t_1, \ldots, t_n$,
+the {\em actual type} of $d$ is
+$[t_1/X_1, \ldots, t_n/X_n]T$.
 
-\begin{itemize}
-\item $[A_1, \ldots, A_n/U_1, \ldots, U_n]T$ if $d$ depends on type parameters $U_1, \ldots, U_n$, and $A_i$ is the value of $U_i, 1 \le i \le n$.
-\item $T$ otherwise.
-\end{itemize}
+\commentary{
+In the non-generic case where $n = 0$ the actual type is equal to the declared type.
+Note that
+$X_1, \ldots, X_n$
+may be declared by multiple entities, e.g.,
+one or more enclosing generic functions and an enclosing generic class.
+}
+
+\LMHash{}
+Let \code{$X$ \EXTENDS{} $B$} be a formal type parameter declaration.
+Let
+$X_1, \ldots, X_n$
+be the formal type parameters in scope the declaration of $X$.
+In a context where the actual type arguments corresponding to
+$X_1, \ldots, X_n$
+are
+$t_1, \ldots, t_n$,
+the {\em actual bound} for $X$ is
+$[t_1/X_1, \ldots, t_n/X_n]B$.
+
+\commentary{
+Note that there exists a $j$ such that $X = X_j$,
+because each formal type parameter is in scope at its own declaration.
+}
+
 
 
 \subsubsection{Least Upper Bounds}
 \LMLabel{leastUpperBounds}
 
+% TODO(eernst): This section has been updated to take generic functions
+% into account, but no other changes have been performed. Hence, we still
+% need to update this section to use Dart 2 rules for LUB.
+
 \LMHash{}
 % does this diverge in some cases?
 Given two interfaces $I$ and $J$,
@@ -8589,46 +9613,58 @@
 \LMHash{}
 The least upper bound of a function type and an interface type $T$ is the least upper bound of \code{Function} and $T$.
 Let $F$ and $G$ be function types.
-If $F$ and $G$ differ in their number of required parameters, then the least upper bound of $F$ and $G$ is \code{Function}.
+If $F$ and $G$ differ in their number of required parameters,
+then the least upper bound of $F$ and $G$ is \code{Function}.
 Otherwise:
 \begin{itemize}
 \item If
 
-$F= (T_1 \ldots T_r, [T_{r+1}, \ldots, T_n]) \longrightarrow T_0$,
+\code{$F = $ <$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_r,\ $[$T_{r+1}, \ldots,\ T_n$]) $ \rightarrow T_0$} and
 
-$G= (S_1 \ldots S_r, [S_{r+1}, \ldots, S_k]) \longrightarrow S_0$
+\code{$G = $ <$X_1\ B_1, \ldots,\ X_s\ B_s$>($S_1, \ldots,\ S_r,\ $[$S_{r+1}, \ldots,\ S_k$]) $ \rightarrow S_0$}
 
+\noindent
 where $k \le n$ then the least upper bound of $F$ and $G$ is
 
-$(L_1 \ldots L_r, [L_{r+1}, \ldots, L_k]) \longrightarrow L_0$
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($L_1, \ldots,\ L_r,\ $[$L_{r+1}, \ldots,\ L_k$]) $ \rightarrow L_0$}
 
+\noindent
 where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0 .. k$.
 \item If
 
-$F= (T_1 \ldots T_r, [T_{r+1}, \ldots, T_n]) \longrightarrow T_0$,
+\code{$F = $ <$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_r,\ $[$T_{r+1}, \ldots,\ T_n$]) $ \rightarrow T_0$},
 
-$G= (S_1 \ldots S_r, \{ \ldots \}) \longrightarrow S_0$
+\code{$G = $ <$X_1\ B_1, \ldots,\ X_s\ B_s$>($S_1, \ldots,\ S_r,\ $\{ \ldots{} \}) $ \rightarrow S_0$}
 
+\noindent
 then the least upper bound of $F$ and $G$ is
 
-$(L_1 \ldots L_r) \longrightarrow L_0$
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($L_1, \ldots,\ L_r$) $ \rightarrow L_0$}
 
-where $L_i$
-is the least upper bound of $T_i$ and $S_i, i \in 0 .. r$.
+\noindent
+where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0 .. r$.
 \item If
 
-$F= (T_1 \ldots T_r, \{T_{r+1}$ $p_{r+1}, \ldots, T_f$ $p_f\}) \longrightarrow T_0$,
+\code{$F = $ <$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_r,\ $\{$T_{r+1}\ p_{r+1}, \ldots,\ T_f\ p_f$\}) $ \rightarrow T_0$},
 
-$G= (S_1 \ldots S_r, \{ S_{r+1}$ $q_{r+1}, \ldots, S_g$ $q_g\}) \longrightarrow S_0$
+\code{$G = $ <$X_1\ B_1, \ldots,\ X_s\ B_s$>($S_1, \ldots,\ S_r,\ $\{$S_{r+1}\ q_{r+1}, \ldots,\ S_g\ q_g$\}) $ \rightarrow S_0$}
 
-then let $\{x_m, \ldots x_n\} = \{p_{r+1}, \ldots, p_f\} \cap \{q_{r+1}, \ldots, q_g\}$ and let $X_j$ be the least upper bound of the types of $x_j$ in $F$ and $G, j \in m .. n$.
+then let
+$\{x_m, \ldots, x_n\} = \{p_{r+1}, \ldots, p_f\} \cap \{q_{r+1}, \ldots, q_g\}$
+and let $X_j$ be the least upper bound of the types of $x_j$ in $F$ and
+$G, j \in m .. n$.
 Then the least upper bound of $F$ and $G$ is
 
-$(L_1 \ldots L_r, \{ X_m$ $x_m, \ldots, X_n$ $x_n\}) \longrightarrow L_0$
+\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($L_1, \ldots,\ L_r,\ $\{$X_m\ x_m, \ldots,\ X_n\ x_n$\}) $ \rightarrow L_0$}
 
 where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0 .. r$
 \end{itemize}
 
+\commentary{
+Note that the non-generic case is covered by using $s = 0$,
+in which case the type parameter declarations are omitted (\ref{generics}).
+}
+
 
 \section{Reference}
 \LMLabel{reference}
diff --git a/docs/language/informal/assert-in-initializer-list.md b/docs/language/informal/assert-in-initializer-list.md
index 5eff658..38e523d 100644
--- a/docs/language/informal/assert-in-initializer-list.md
+++ b/docs/language/informal/assert-in-initializer-list.md
@@ -1,7 +1,11 @@
 # Asserts in Initializer List
 [lrn@google.com](mailto:lrn@google.com)
+
 Version 1.1 (2017-06-08)
-Status: Accepted, Informally specified
+
+**Status**: Integrated into the language specification in
+[`609d26a`](https://github.com/dart-lang/sdk/commit/609d26a2274ccde0f74725f4df7e081ebc8ea020);
+this document is now background material.
 
 (See: http://dartbug.com/24841, http://dartbug.com/27141)
 
diff --git a/docs/language/informal/covariant-overrides.md b/docs/language/informal/covariant-overrides.md
index bacb8fc..f0f415e 100644
--- a/docs/language/informal/covariant-overrides.md
+++ b/docs/language/informal/covariant-overrides.md
@@ -1,10 +1,10 @@
 # Covariant Overrides
 
-Owner: rnystrom@, eernstg@.
+**Owner**: rnystrom@, eernst@.
 
-Status: Implemented.
+**Status**: Implemented.
 
-Version: 1.1 (Oct 10, 2017).
+**Version**: 1.1 (Oct 10, 2017).
 
 ## Summary
 
diff --git a/docs/language/informal/generalized-void.md b/docs/language/informal/generalized-void.md
index 23c45af..2c10975 100644
--- a/docs/language/informal/generalized-void.md
+++ b/docs/language/informal/generalized-void.md
@@ -1,6 +1,6 @@
 ## Feature: Generalized Void
 
-Author: eernst@
+**Author**: eernst@
 
 **Status**: Under implementation.
 
diff --git a/docs/language/informal/generic-method-syntax.md b/docs/language/informal/generic-method-syntax.md
index d69c400..f7ddc3e 100644
--- a/docs/language/informal/generic-method-syntax.md
+++ b/docs/language/informal/generic-method-syntax.md
@@ -1,5 +1,12 @@
 # Feature: Generic Method Syntax
 
+**Author**: eernst@
+
+**Status**: Integrated into (and subsumed by) updates to the language
+specification as of
+[`673d5f0`](https://github.com/dart-lang/sdk/commit/673d5f0a665085153d25f8c39495eacdb010ca64).
+This document is now background material.
+
 **This document** is an informal specification of the support in Dart 1.x
 for generic methods and functions which includes syntax and name
 resolution, but not reification of type arguments.
diff --git a/docs/language/informal/int64.md b/docs/language/informal/int64.md
index db00f55..4bf67d5 100644
--- a/docs/language/informal/int64.md
+++ b/docs/language/informal/int64.md
@@ -1,7 +1,11 @@
 Dart - Fixed-Size Integers
 ===
-2017-09-26
-floitsch@google.com
+
+**Author**: floitsch@
+
+**Version**: 2017-09-26.
+
+**Status**: Under implementation.
 
 This document discusses Dart's plan to switch the `int` type so that it represents 64-bit integers instead of bigints. It is part of our continued effort of changing the integer type to fixed size ([issue]).
 
diff --git a/docs/language/informal/mixin-declaration.md b/docs/language/informal/mixin-declaration.md
index 6bb97ae..7012ea7 100644
--- a/docs/language/informal/mixin-declaration.md
+++ b/docs/language/informal/mixin-declaration.md
@@ -1,10 +1,10 @@
 # Dart 2.0 Mixins
 
-Author: [lrn@google.com](mailto:lrn@google.com)
+**Author**: [lrn@google.com](mailto:lrn@google.com)
 
-Version 0.6 (2017-06-14)
+**Version**: 0.6 (2017-06-14)
 
-Status: Mostly designed, ready for external comments.
+**Status**: Mostly designed, ready for external comments.
 
 ## Proposal
 This proposal introduces a new syntax for declaring mixins, separate from deriving a mixin from a class declaration. It expects to deprecate and remove the ability to derive a mixin from a class declaration, but doesn't require it.
diff --git a/docs/language/informal/optional-new-const.md b/docs/language/informal/optional-new-const.md
index e5d12ff..8e100a7 100644
--- a/docs/language/informal/optional-new-const.md
+++ b/docs/language/informal/optional-new-const.md
@@ -1,10 +1,11 @@
 # Optional new/const
 
-Author: Lasse R.H. Nielsen ([lrn@google.com](mailto:lrn@google.com))
+**Author**: Lasse R.H. Nielsen ([lrn@google.com](mailto:lrn@google.com))
 
-Version: 0.8 (2017-06-20)
+**Version**: 0.8 (2017-06-20)
 
-Status: Under discussion
+**Status**: This is background material for
+[implicit-creation.md](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/implicit-creation.md).
 
 This informal specification documents a group of four related features.
 * Optional `const`
diff --git a/docs/language/informal/super-bounded-types.md b/docs/language/informal/super-bounded-types.md
index 028db60..db2e46c 100644
--- a/docs/language/informal/super-bounded-types.md
+++ b/docs/language/informal/super-bounded-types.md
@@ -4,7 +4,7 @@
 
 **Version**: 0.5 (2018-01-11).
 
-**Status**: Under discussion.
+**Status**: Under implementation.
 
 **This document** is an informal specification of the support in Dart 2 for
 using certain generic types where the declared bounds are violated. The
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index d29210f..6e50eb5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -247,20 +247,25 @@
   @override
   visitFieldDeclaration(FieldDeclaration node) {
     VariableDeclarationList fields = node.fields;
-    NodeList<VariableDeclaration> variables = fields.variables;
-    if (variables.length != 1 ||
-        !variables[0].name.isSynthetic ||
-        fields.type == null) {
-      return;
-    }
     if (entity != fields) {
       return;
     }
-    List<Keyword> keywords = <Keyword>[Keyword.CONST, Keyword.FINAL];
-    if (!node.isStatic) {
-      keywords.add(Keyword.STATIC);
+    NodeList<VariableDeclaration> variables = fields.variables;
+    if (variables.isEmpty || request.offset > variables.first.beginToken.end) {
+      return;
     }
-    _addSuggestions(keywords);
+    if (node.covariantKeyword == null) {
+      _addSuggestion(Keyword.COVARIANT);
+    }
+    if (!node.isStatic) {
+      _addSuggestion(Keyword.STATIC);
+    }
+    if (!variables.first.isConst) {
+      _addSuggestion(Keyword.CONST);
+    }
+    if (!variables.first.isFinal) {
+      _addSuggestion(Keyword.FINAL);
+    }
   }
 
   @override
@@ -525,6 +530,7 @@
   void _addClassBodyKeywords() {
     _addSuggestions([
       Keyword.CONST,
+      Keyword.COVARIANT,
       Keyword.DYNAMIC,
       Keyword.FACTORY,
       Keyword.FINAL,
@@ -555,6 +561,7 @@
       Keyword.ABSTRACT,
       Keyword.CLASS,
       Keyword.CONST,
+      Keyword.COVARIANT,
       Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.TYPEDEF,
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index f4265da..425178b 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -21,6 +21,7 @@
 class KeywordContributorTest extends DartCompletionContributorTest {
   static const List<Keyword> CLASS_BODY_KEYWORDS = const [
     Keyword.CONST,
+    Keyword.COVARIANT,
     Keyword.DYNAMIC,
     Keyword.FACTORY,
     Keyword.FINAL,
@@ -36,6 +37,7 @@
     Keyword.ABSTRACT,
     Keyword.CLASS,
     Keyword.CONST,
+    Keyword.COVARIANT,
     Keyword.DYNAMIC,
     Keyword.FINAL,
     Keyword.TYPEDEF,
@@ -47,6 +49,7 @@
     Keyword.ABSTRACT,
     Keyword.CLASS,
     Keyword.CONST,
+    Keyword.COVARIANT,
     Keyword.DYNAMIC,
     Keyword.EXPORT,
     Keyword.FINAL,
@@ -62,6 +65,7 @@
     Keyword.ABSTRACT,
     Keyword.CLASS,
     Keyword.CONST,
+    Keyword.COVARIANT,
     Keyword.DYNAMIC,
     Keyword.EXPORT,
     Keyword.FINAL,
@@ -769,7 +773,7 @@
 }
 ''');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.CONST, Keyword.FINAL]);
+    assertSuggestKeywords([Keyword.CONST, Keyword.COVARIANT, Keyword.FINAL]);
   }
 
   test_class_member_final_afterStatic() async {
@@ -779,7 +783,7 @@
 }
 ''');
     await computeSuggestions();
-    assertSuggestKeywords([Keyword.CONST, Keyword.FINAL]);
+    assertSuggestKeywords([Keyword.CONST, Keyword.COVARIANT, Keyword.FINAL]);
   }
 
   test_class_name() async {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 958b75a..323ff7ff 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -94,7 +94,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 48;
+  static const int DATA_VERSION = 49;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 3668894..fdb6d87 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -33,7 +33,6 @@
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 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';
@@ -254,7 +253,7 @@
 
         // TODO(scheglov) Can we keep the same instance?
         var types = new TypeEnvironment(
-            new CoreTypes(_program), new IncrementalClassHierarchy());
+            new CoreTypes(_program), new ClassHierarchy(_program));
 
         // Add results for new libraries.
         for (var library in _program.libraries) {
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 19eee60..1837250 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -223,6 +223,7 @@
       constantName.staticElement = constantField;
     }
     enumElement.fields = fields;
+    enumElement.createToStringMethodElement();
 
     _currentHolder.addEnum(enumElement);
     enumName.staticElement = enumElement;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 8da11b2..d1a4712 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -63,6 +63,11 @@
   List<FieldElement> _fields;
 
   /**
+   * A list containing all of the methods contained in this class.
+   */
+  List<MethodElement> _methods;
+
+  /**
    * Initialize a newly created class element to have the given [name] at the
    * given [offset] in the file that contains the declaration of this element.
    */
@@ -181,6 +186,18 @@
   }
 
   @override
+  MethodElement getMethod(String methodName) {
+    int length = methods.length;
+    for (int i = 0; i < length; i++) {
+      MethodElement method = methods[i];
+      if (method.name == methodName) {
+        return method;
+      }
+    }
+    return null;
+  }
+
+  @override
   PropertyAccessorElement getSetter(String setterName) {
     // TODO (jwren) revisit- should we append '=' here or require clients to
     // include it?
@@ -472,11 +489,6 @@
   List<ConstructorElement> _constructors;
 
   /**
-   * A list containing all of the methods contained in this class.
-   */
-  List<MethodElement> _methods;
-
-  /**
    * A flag indicating whether the types associated with the instance members of
    * this class have been inferred.
    */
@@ -1116,18 +1128,6 @@
   }
 
   @override
-  MethodElement getMethod(String methodName) {
-    int length = methods.length;
-    for (int i = 0; i < length; i++) {
-      MethodElement method = methods[i];
-      if (method.name == methodName) {
-        return method;
-      }
-    }
-    return null;
-  }
-
-  @override
   ConstructorElement getNamedConstructor(String name) {
     for (ConstructorElement element in constructors) {
       String elementName = element.name;
@@ -3777,7 +3777,7 @@
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
       if (_kernel != null || _unlinkedEnum != null) {
-        _resynthesizeFieldsAndPropertyAccessors();
+        _resynthesizeMembers();
       }
     }
     return _accessors ?? const <PropertyAccessorElement>[];
@@ -3833,7 +3833,7 @@
   List<FieldElement> get fields {
     if (_fields == null) {
       if (_kernel != null || _unlinkedEnum != null) {
-        _resynthesizeFieldsAndPropertyAccessors();
+        _resynthesizeMembers();
       }
     }
     return _fields ?? const <FieldElement>[];
@@ -3889,7 +3889,14 @@
   }
 
   @override
-  List<MethodElement> get methods => const <MethodElement>[];
+  List<MethodElement> get methods {
+    if (_methods == null) {
+      if (_kernel != null || _unlinkedEnum != null) {
+        _resynthesizeMembers();
+      }
+    }
+    return _methods ?? const <MethodElement>[];
+  }
 
   @override
   List<InterfaceType> get mixins => const <InterfaceType>[];
@@ -3945,8 +3952,18 @@
     }
   }
 
-  @override
-  MethodElement getMethod(String name) => null;
+  /**
+   * Create the only method enums have - `toString()`.
+   */
+  void createToStringMethodElement() {
+    var method = new MethodElementImpl('toString', -1);
+    if (_kernel != null || _unlinkedEnum != null) {
+      method.returnType = context.typeProvider.stringType;
+      method.type = new FunctionTypeImpl(method);
+    }
+    method.enclosingElement = this;
+    _methods = <MethodElement>[method];
+  }
 
   @override
   ConstructorElement getNamedConstructor(String name) => null;
@@ -3954,7 +3971,7 @@
   @override
   bool isSuperConstructorAccessible(ConstructorElement constructor) => false;
 
-  void _resynthesizeFieldsAndPropertyAccessors() {
+  void _resynthesizeMembers() {
     List<FieldElementImpl> fields = <FieldElementImpl>[];
     // Build the 'index' field.
     fields.add(new FieldElementImpl('index', -1)
@@ -3993,6 +4010,7 @@
             new PropertyAccessorElementImpl_ImplicitGetter(field)
               ..enclosingElement = this)
         .toList(growable: false);
+    createToStringMethodElement();
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index a73324f..744a53d 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -418,14 +418,17 @@
    * Initialize a newly created function type that is semantically the same as
    * [original], but which has been syntactically renamed with fresh type
    * parameters at its outer binding site (if any).
+   *
+   * If type formals is empty, this returns the original unless [force] is set
+   * to [true].
    */
-  factory FunctionTypeImpl.fresh(FunctionType original) {
+  factory FunctionTypeImpl.fresh(FunctionType original, {bool force = false}) {
     // We build up a substitution for the type parameters,
     // {variablesFresh/variables} then apply it.
 
     var originalFormals = original.typeFormals;
     var formalCount = originalFormals.length;
-    if (formalCount == 0) return original;
+    if (formalCount == 0 && !force) return original;
 
     // Allocate fresh type variables
     var typeVars = <DartType>[];
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 9215502..397dc49 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/src/fasta/resolution_applier.dart';
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
-import 'package:front_end/src/fasta/type_inference/interface_resolver.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
@@ -426,11 +425,9 @@
     _replaceType(invokeType, resultOffset);
 
     if (!isImplicitCall) {
-      if (interfaceMember is ForwardingStub) {
-        interfaceMember = ForwardingStub.getInterfaceTarget(interfaceMember);
-      }
+      interfaceMember = _getRealTarget(interfaceMember);
       _replaceReference(interfaceMember);
-      _replaceType(calleeType);
+      _replaceType(const NullType()); // callee type
     }
     super.genericExpressionExit("methodInvocation", expression, inferredType);
   }
@@ -456,7 +453,7 @@
 
     if (!isImplicitCall) {
       _replaceReference(const NullNode('explicit-call'));
-      _replaceType(const NullType());
+      _replaceType(const NullType()); // callee type
     }
     super.genericExpressionExit("methodInvocation", expression, inferredType);
   }
@@ -477,9 +474,7 @@
       DartType writeContext,
       Procedure combiner,
       DartType inferredType) {
-    if (writeMember is ForwardingStub) {
-      writeMember = ForwardingStub.getInterfaceTarget(writeMember);
-    }
+    writeMember = _getRealTarget(writeMember);
     _replaceReference(new MemberSetterNode(writeMember));
     _replaceType(writeContext);
     _recordReference(
@@ -609,7 +604,7 @@
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
     _replaceType(invokeType);
-    _replaceType(calleeType);
+    _replaceType(const NullType()); // callee type
     super.genericExpressionExit("staticInvocation", expression, inferredType);
   }
 
@@ -739,6 +734,15 @@
     int slot = _deferredTypeSlots.removeLast();
     _types[slot] = type;
   }
+
+  /// If the [member] is a forwarding stub, return the target it forwards to.
+  /// Otherwise return the given [member].
+  static Member _getRealTarget(Member member) {
+    if (member is Procedure && member.isForwardingStub) {
+      return member.forwardingStubInterfaceTarget.node;
+    }
+    return member;
+  }
 }
 
 /// A [DartType] wrapper around invocation type arguments.
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index a28b6ca..8b7ee76 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -228,6 +228,7 @@
       for (EnumConstantDeclaration constant in node.constants) {
         _match(constant.name, _walker.getVariable());
       }
+      _walker.getFunction(); // toString()
       super.visitEnumDeclaration(node);
     });
     _resolveMetadata(node, node.metadata, element);
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 82b8ad0..b11e946 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2992,6 +2992,12 @@
     //
     valuesField.evaluationResult = new EvaluationResultImpl(
         new DartObjectImpl(valuesField.type, new ListState(constantValues)));
+    // Update toString() return type.
+    {
+      MethodElementImpl toStringMethod = enumElement.methods[0];
+      toStringMethod.returnType = _typeProvider.stringType;
+      toStringMethod.type = new FunctionTypeImpl(toStringMethod);
+    }
     //
     // Finish building the enum.
     //
@@ -5676,7 +5682,7 @@
     DartType valueType;
     if (loopVariable != null) {
       TypeAnnotation typeAnnotation = loopVariable.type;
-      valueType = typeAnnotation?.type ?? typeProvider.dynamicType;
+      valueType = typeAnnotation?.type ?? UnknownInferredType.instance;
     }
     if (identifier != null) {
       Element element = identifier.staticElement;
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 1e1b95b..e8b7614 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -38,6 +38,31 @@
       identical(t, UnknownInferredType.instance);
 }
 
+/**
+ * `void`, `dynamic`, and `Object` are all equivalent. However, this makes
+ * LUB/GLB indeterministic. Therefore, for the cases of LUB/GLB, we have some
+ * types which are more top than others.
+ *
+ * So, `void` < `Object` < `dynamic` for the purposes of LUB and GLB.
+ *
+ * This is expressed by their topiness (higher = more toppy).
+ */
+int _getTopiness(DartType t) {
+  assert(_isTop(t), 'only Top types have a topiness');
+
+  // Highest top
+  if (t.isDynamic) return 2;
+  if (t.isObject) return 1;
+  if (t.isDartAsyncFutureOr)
+    return -2 + _getTopiness((t as InterfaceType).typeArguments[0]);
+  // Lowest top
+
+  assert(false, 'a Top type without a defined topiness');
+
+  // Try to ensure that if this happens, its less toppy than an actual Top type.
+  return -100000;
+}
+
 typedef bool _GuardedSubtypeChecker<T>(T t1, T t2, Set<TypeImpl> visitedTypes);
 
 /**
@@ -148,6 +173,12 @@
       return type1;
     }
 
+    // If both are top, we have a preferred "greatest" top to return.
+    if (_isTop(type1, dynamicIsBottom: dynamicIsBottom) &&
+        _isTop(type2, dynamicIsBottom: dynamicIsBottom)) {
+      return _getTopiness(type1) > _getTopiness(type2) ? type1 : type2;
+    }
+
     // The GLB of top and any type is just that type.
     // Also GLB of bottom and any type is bottom.
     if (_isTop(type1, dynamicIsBottom: dynamicIsBottom) ||
@@ -1163,6 +1194,12 @@
       return type1;
     }
 
+    // If both are top, we have a preferred "least" top to return.
+    if (_isTop(type1, dynamicIsBottom: dynamicIsBottom) &&
+        _isTop(type2, dynamicIsBottom: dynamicIsBottom)) {
+      return _getTopiness(type1) < _getTopiness(type2) ? type1 : type2;
+    }
+
     // The least upper bound of top and any type T is top.
     // The least upper bound of bottom and any type T is T.
     if (_isTop(type1, dynamicIsBottom: dynamicIsBottom) ||
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index f13233f..0ec4a47 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -2307,6 +2307,12 @@
       _implicitFunctionTypeIndices ??= <int>[];
 
   /**
+   * Notice: This will be deprecated. However, its not deprecated yet, as we're
+   * keeping it for backwards compatibilty, and marking it deprecated makes it
+   * unreadable.
+   *
+   * TODO(mfairhurst) mark this deprecated, and remove its logic.
+   *
    * If this is a reference to a function type implicitly defined by a
    * function-typed parameter, a list of zero-based indices indicating the path
    * from the entity referred to by [reference] to the appropriate type
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 5e21f11..8722ccc 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -1215,6 +1215,12 @@
   entityKind:EntityRefKind (id: 8);
 
   /**
+   * Notice: This will be deprecated. However, its not deprecated yet, as we're
+   * keeping it for backwards compatibilty, and marking it deprecated makes it
+   * unreadable.
+   *
+   * TODO(mfairhurst) mark this deprecated, and remove its logic.
+   *
    * If this is a reference to a function type implicitly defined by a
    * function-typed parameter, a list of zero-based indices indicating the path
    * from the entity referred to by [reference] to the appropriate type
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index b1f6330..b4ce55a 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -405,6 +405,12 @@
   EntityRefKind get entityKind;
 
   /**
+   * Notice: This will be deprecated. However, its not deprecated yet, as we're
+   * keeping it for backwards compatibilty, and marking it deprecated makes it
+   * unreadable.
+   *
+   * TODO(mfairhurst) mark this deprecated, and remove its logic.
+   *
    * If this is a reference to a function type implicitly defined by a
    * function-typed parameter, a list of zero-based indices indicating the path
    * from the entity referred to by [reference] to the appropriate type
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 7cd78e7..5169d33 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -230,9 +230,8 @@
       return result;
     }
     if (element is GenericFunctionTypeElementForLink) {
-      // TODO(mfairhurst) update the typeParameterContext to be the current
-      // element. See test_constExpr_makeTypedList_functionType. This causes
-      // serious breakages elsewhere.
+      // Function types are their own type parameter context
+      typeParameterContext = element;
       result.entityKind = EntityRefKind.genericFunctionType;
       result.syntheticReturnType = _createLinkedType(
           type.returnType, compilationUnit, typeParameterContext);
@@ -251,6 +250,13 @@
   throw new UnimplementedError('${type.runtimeType}');
 }
 
+DartType _dynamicIfBottom(DartType type) {
+  if (type == null || type.isBottom) {
+    return DynamicTypeImpl.instance;
+  }
+  return type;
+}
+
 DartType _dynamicIfNull(DartType type) {
   if (type == null || type.isBottom || type.isDartCoreNull) {
     return DynamicTypeImpl.instance;
@@ -3267,7 +3273,7 @@
   void _setInferredType(DartType type) {
     // TODO(paulberry): store the inferred return type in the summary.
     assert(!_hasTypeBeenInferred);
-    _inferredReturnType = _dynamicIfNull(type);
+    _inferredReturnType = _dynamicIfBottom(type);
   }
 }
 
@@ -4371,6 +4377,9 @@
       !_unlinkedParam.isFunctionTyped && _unlinkedParam.type == null;
 
   @override
+  String get identifier => name;
+
+  @override
   bool get inheritsCovariant => _inheritsCovariant;
 
   @override
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 45150a5..8873c01 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -169,7 +169,18 @@
           parameter, index, overriddenTypes[i].parameters);
       DartType type = matchingParameter?.type ?? typeProvider.dynamicType;
       if (parameterType == null) {
-        parameterType = type;
+        if (type is FunctionType &&
+            type.element is! TypeDefiningElement &&
+            type.element.enclosingElement is! TypeDefiningElement) {
+          // The resulting parameter's type element has an `enclosingElement` of
+          // the overridden parameter. Change it to the overriding parameter.
+          parameterType = new FunctionTypeImpl.fresh(type, force: true);
+          (parameterType.element as ElementImpl).enclosingElement = parameter;
+          // TODO(mfairhurst) handle cases where non-functions contain functions
+          // See test_inferredType_parameter_genericFunctionType_asTypeArgument
+        } else {
+          parameterType = type;
+        }
       } else if (parameterType != type) {
         if (parameter is ParameterElementForLink) {
           parameter.setInferenceError(new TopLevelInferenceErrorBuilder(
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 220cc65..cfb31c2 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1070,11 +1070,14 @@
   }
 
   test_await_flattened() async {
+    // The analyzer type system over-flattens so it considers `await ffi()` to
+    // have type `int` - see dartbug.com/31887
+    var expectedType = enableKernelDriver ? 'Future<int>' : 'int';
     Source source = addSource('''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
-  int b = await ffi();
+  $expectedType b = await ffi();
 }
 ''');
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 8d6d88d..b5f10f5 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -189,15 +189,6 @@
 
   @override
   @failingTest
-  void test_covariantConstructor() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.COVARIANT_CONSTRUCTOR, found 0;
-    // 0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (10)
-    super.test_covariantConstructor();
-  }
-
-  @override
-  @failingTest
   void test_duplicateLabelInSwitchStatement() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, found 0
@@ -260,19 +251,6 @@
 
   @override
   @failingTest
-  void test_expectedExecutable_topLevel_eof() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Expected CompilationUnit, but found [CompilationUnit, TopLevelMember]
-    //   package:test                                                       fail
-    //   test/generated/parser_fasta_listener.dart 50:7                     ForwardingTestListener.expectIn
-    //   test/generated/parser_fasta_listener.dart 1030:5                   ForwardingTestListener.endTopLevelDeclaration
-    //   package:front_end/src/fasta/parser/parser.dart 264:14              Parser.parseTopLevelDeclaration
-    //   test/generated/parser_fasta_test.dart 2851:22                      ParserProxy.parseTopLevelDeclaration
-    super.test_expectedExecutable_topLevel_eof();
-  }
-
-  @override
-  @failingTest
   void test_expectedInterpolationIdentifier() {
     // TODO(brianwilkerson) Does not recover.
     //   RangeError: Value not in range: -1
@@ -411,15 +389,6 @@
 
   @override
   @failingTest
-  void test_functionTypedParameter_const() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, found 0;
-    // 0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (8)
-    super.test_functionTypedParameter_const();
-  }
-
-  @override
-  @failingTest
   void test_functionTypedParameter_final() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, found 0
@@ -1213,34 +1182,6 @@
 
   @override
   @failingTest
-  void test_missingNameInLibraryDirective() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, found 0
-    super.test_missingNameInLibraryDirective();
-  }
-
-  @override
-  @failingTest
-  void test_missingNameInPartOfDirective() {
-    // TODO(brianwilkerson) Does not recover.
-    //   type 'KeywordToken' is not a subtype of type 'Comment' of 'comment' where
-    //   KeywordToken is from package:front_end/src/scanner/token.dart
-    //   Comment is from package:analyzer/dart/ast/ast.dart
-    //
-    //   package:analyzer/src/fasta/ast_builder.dart 1457:23                AstBuilder.endPartOf
-    //   package:front_end/src/fasta/parser/parser.dart 499:14              Parser.parsePartOf
-    //   package:front_end/src/fasta/parser/parser.dart 467:14              Parser.parsePartOrPartOf
-    //   package:front_end/src/fasta/parser/parser.dart 296:14              Parser._parseTopLevelDeclaration
-    //   package:front_end/src/fasta/parser/parser.dart 263:13              Parser.parseTopLevelDeclaration
-    //   package:front_end/src/fasta/parser/parser.dart 252:15              Parser.parseUnit
-    //   package:analyzer/src/generated/parser_fasta.dart 77:33             _Parser2.parseCompilationUnit2
-    //   package:analyzer/src/generated/parser_fasta.dart 72:12             _Parser2.parseCompilationUnit
-    //   test/generated/parser_fasta_test.dart 3016:35                      FastaParserTestCase.parseCompilationUnit
-    super.test_missingNameInPartOfDirective();
-  }
-
-  @override
-  @failingTest
   void test_missingStatement() {
     // TODO(brianwilkerson) Does not recover.
     //   'package:front_end/src/fasta/source/stack_listener.dart': Failed assertion: line 311 pos 12: 'arrayLength > 0': is not true.
@@ -1401,30 +1342,6 @@
 
   @override
   @failingTest
-  void test_nonUserDefinableOperator() {
-    // TODO(brianwilkerson) Does not recover.
-    //   type 'SimpleIdentifierImpl' is not a subtype of type 'TypeAnnotation' of 'returnType' where
-    //   SimpleIdentifierImpl is from package:analyzer/src/dart/ast/ast.dart
-    //   TypeAnnotation is from package:analyzer/dart/ast/ast.dart
-    //
-    //   package:analyzer/src/fasta/ast_builder.dart 1620:33                AstBuilder.endMethod
-    //   test/generated/parser_fasta_listener.dart 926:14                   ForwardingTestListener.endMethod
-    //   package:front_end/src/fasta/parser/parser.dart 2433:14             Parser.parseMethod
-    //   package:front_end/src/fasta/parser/parser.dart 2323:11             Parser.parseMember
-    //   test/generated/parser_fasta_test.dart 3766:39                      ParserProxy._run
-    super.test_nonUserDefinableOperator();
-  }
-
-  void test_nonUserDefinableOperator_ignoreErrors() {
-    // TODO(danrubel): Remove this test
-    // once test_nonUserDefinableOperator passes.
-    createParser('operator +=(int x) => x + 1;');
-    ClassMember member = parser.parseClassMember('C');
-    expectNotNullIfNoErrors(member);
-  }
-
-  @override
-  @failingTest
   void test_parseCascadeSection_missingIdentifier() {
     // TODO(brianwilkerson) Testing at too low a level.
     super.test_parseCascadeSection_missingIdentifier();
@@ -1479,22 +1396,6 @@
 
   @override
   @failingTest
-  void test_staticGetterWithoutBody() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, found 0
-    super.test_staticGetterWithoutBody();
-  }
-
-  @override
-  @failingTest
-  void test_staticSetterWithoutBody() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, found 0
-    super.test_staticSetterWithoutBody();
-  }
-
-  @override
-  @failingTest
   void test_topLevelVariable_withMetadata() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, found 0;
@@ -1527,14 +1428,6 @@
 
   @override
   @failingTest
-  void test_unexpectedTerminatorForParameterGroup_named() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, found 0
-    super.test_unexpectedTerminatorForParameterGroup_named();
-  }
-
-  @override
-  @failingTest
   void test_unexpectedToken_endOfFieldDeclarationStatement() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.UNEXPECTED_TOKEN, found 0
@@ -1571,41 +1464,6 @@
   }
 
   @override
-  @failingTest
-  void test_unexpectedToken_semicolonBetweenClassMembers() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Expected ClassBody, but found [CompilationUnit, ClassOrNamedMixinApplication, ClassDeclaration, ClassBody, Member]
-    //   package:test                                                       fail
-    //   test/generated/parser_fasta_listener.dart 50:7                     ForwardingTestListener.expectIn
-    //   test/generated/parser_fasta_listener.dart 55:5                     ForwardingTestListener.end
-    //   test/generated/parser_fasta_listener.dart 615:5                    ForwardingTestListener.endClassBody
-    //   package:front_end/src/fasta/parser/parser.dart 2220:14             Parser.parseClassBody
-    //   package:front_end/src/fasta/parser/parser.dart 897:13              Parser.parseClass
-    //   package:front_end/src/fasta/parser/parser.dart 850:14              Parser.parseClassOrNamedMixinApplication
-    //   package:front_end/src/fasta/parser/parser.dart 283:14              Parser._parseTopLevelDeclaration
-    //   package:front_end/src/fasta/parser/parser.dart 263:13              Parser.parseTopLevelDeclaration
-    //   test/generated/parser_fasta_test.dart 3896:22                      ParserProxy.parseTopLevelDeclaration
-    super.test_unexpectedToken_semicolonBetweenClassMembers();
-  }
-
-  @override
-  @failingTest
-  void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/problems.dart 29:25                    internalProblem
-    //   package:front_end/src/fasta/source/stack_listener.dart 148:7       StackListener.checkEmpty
-    //   package:analyzer/src/fasta/ast_builder.dart 1163:5                 AstBuilder.endCompilationUnit
-    //   package:front_end/src/fasta/parser/parser.dart 255:14              Parser.parseUnit
-    //   package:analyzer/src/generated/parser_fasta.dart 77:33             _Parser2.parseCompilationUnit2
-    //   package:analyzer/src/generated/parser_fasta.dart 72:12             _Parser2.parseCompilationUnit
-    //   test/generated/parser_fasta_test.dart 3371:35                      FastaParserTestCase.parseCompilationUnit
-    super.test_unexpectedToken_semicolonBetweenCompilationUnitMembers();
-  }
-
-  @override
   void test_varAndType_local() {
     // The inherited test is marked as failing.
     super.test_varAndType_local();
@@ -1618,14 +1476,6 @@
   }
 
   @override
-  @failingTest
-  void test_varAsTypeName_as() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.VAR_AS_TYPE_NAME, found 0
-    super.test_varAsTypeName_as();
-  }
-
-  @override
 //  @failingTest
   void test_voidVariable_parseClassMember_initializer() {
     // TODO(brianwilkerson) Passes, but ought to fail.
@@ -1680,24 +1530,6 @@
     // TODO(brianwilkerson) Passes, but ought to fail.
     super.test_voidVariable_statement_noInitializer();
   }
-
-  @override
-  @failingTest
-  void test_wrongTerminatorForParameterGroup_named() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, found 0;
-    // 1 errors of type ScannerErrorCode.EXPECTED_TOKEN, found 0
-    super.test_wrongTerminatorForParameterGroup_named();
-  }
-
-  @override
-  @failingTest
-  void test_wrongTerminatorForParameterGroup_optional() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, found 0;
-    // 1 errors of type ScannerErrorCode.EXPECTED_TOKEN, found 0
-    super.test_wrongTerminatorForParameterGroup_optional();
-  }
 }
 
 /**
@@ -2702,30 +2534,6 @@
 
   @override
   @failingTest
-  void test_keywordInPlaceOfIdentifier() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_keywordInPlaceOfIdentifier();
-  }
-
-  @override
-  @failingTest
-  void test_missingGet() {
-    // TODO(brianwilkerson) exception:
-    //   NoSuchMethodError: Class '_KernelLibraryBuilder' has no instance method 'addCompileTimeError'.
-    //   Receiver: Instance of '_KernelLibraryBuilder'
-    //   Tried calling: addCompileTimeError(Instance of 'Message', 17, Instance of '_Uri')
-    //   dart:core                                                          Object.noSuchMethod
-    //   package:analyzer/src/generated/parser_fasta.dart 20:60             _KernelLibraryBuilder.noSuchMethod
-    //   package:analyzer/src/fasta/ast_builder.dart 1956:13                AstBuilder.addCompileTimeError
-    //   package:front_end/src/fasta/source/stack_listener.dart 271:5       StackListener.handleRecoverableError
-    //   package:front_end/src/fasta/parser/parser.dart 4099:16             Parser.reportRecoverableErrorWithToken
-    //   package:front_end/src/fasta/parser/parser.dart 1744:7              Parser.checkFormals
-    //    package:front_end/src/fasta/parser/parser.dart 2406:5              Parser.parseMethod
-    super.test_missingGet();
-  }
-
-  @override
-  @failingTest
   void test_missingIdentifier_afterAnnotation() {
     // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
     super.test_missingIdentifier_afterAnnotation();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 5814a6f..e371ddd 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -2676,8 +2676,14 @@
     createParser('class C { covariant C(); }');
     ClassDeclaration member = parseFullCompilationUnitMember();
     expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.COVARIANT_CONSTRUCTOR, 10, 9)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.COVARIANT_MEMBER
+              : ParserErrorCode.COVARIANT_CONSTRUCTOR,
+          10,
+          9)
+    ]);
   }
 
   void test_covariantMember_getter_noReturnType() {
@@ -2964,8 +2970,12 @@
     createParser('x');
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 1)]);
+    listener.assertErrors(usingFastaParser
+        ? [
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 1, 0),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 1, 0)
+          ]
+        : [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 1)]);
   }
 
   void test_expectedInterpolationIdentifier() {
@@ -3117,6 +3127,26 @@
     ]);
   }
 
+  void test_exportAsType() {
+    parseCompilationUnit('export<dynamic> foo;',
+        errors: usingFastaParser
+            ? [
+                expectedError(
+                    CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, 0, 6)
+              ]
+            : []);
+  }
+
+  void test_exportAsType_inClass() {
+    parseCompilationUnit('class C { export<dynamic> foo; }',
+        errors: usingFastaParser
+            ? [
+                expectedError(
+                    CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, 10, 6)
+              ]
+            : []);
+  }
+
   void test_externalAfterConst() {
     createParser('const external C();');
     ClassMember member = parser.parseClassMember('C');
@@ -3403,6 +3433,16 @@
         errors: [expectedError(ParserErrorCode.FINAL_CLASS, 0, 5)]);
   }
 
+  void test_finalClassMember_modifierOnly() {
+    createParser('final');
+    ClassMember member = parser.parseClassMember('C');
+    expectNotNullIfNoErrors(member);
+    listener.assertErrors([
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 5, 0),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 5, 0)
+    ]);
+  }
+
   void test_finalConstructor() {
     createParser('final C() {}');
     ClassMember member = parser.parseClassMember('C');
@@ -3438,9 +3478,13 @@
   }
 
   void test_functionTypedParameter_const() {
-    parseCompilationUnit("void f(const x()) {}", errors: [
-      expectedError(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, 7, 9)
-    ]);
+    parseCompilationUnit("void f(const x()) {}",
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 7, 5)]
+            : [
+                expectedError(
+                    ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, 7, 9)
+              ]);
   }
 
   void test_functionTypedParameter_final() {
@@ -4312,14 +4356,24 @@
 
   void test_missingNameInLibraryDirective() {
     CompilationUnit unit = parseCompilationUnit("library;", errors: [
-      expectedError(ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, 7, 1)
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.MISSING_IDENTIFIER
+              : ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE,
+          7,
+          1)
     ]);
     expect(unit, isNotNull);
   }
 
   void test_missingNameInPartOfDirective() {
     CompilationUnit unit = parseCompilationUnit("part of;", errors: [
-      expectedError(ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, 7, 1)
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.EXPECTED_STRING_LITERAL
+              : ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
+          7,
+          1)
     ]);
     expect(unit, isNotNull);
   }
@@ -4552,8 +4606,14 @@
     createParser('operator +=(int x) => x + 1;');
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, 9, 2)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.INVALID_OPERATOR
+              : ParserErrorCode.NON_USER_DEFINABLE_OPERATOR,
+          9,
+          2)
+    ]);
   }
 
   void test_optionalAfterNormalParameters_named() {
@@ -4703,8 +4763,14 @@
     createParser('static get m;');
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, 12, 1)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.MISSING_FUNCTION_BODY
+              : ParserErrorCode.STATIC_GETTER_WITHOUT_BODY,
+          12,
+          1)
+    ]);
   }
 
   void test_staticOperator_noReturnType() {
@@ -4727,8 +4793,14 @@
     createParser('static set m(x);');
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, 15, 1)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.MISSING_FUNCTION_BODY
+              : ParserErrorCode.STATIC_SETTER_WITHOUT_BODY,
+          15,
+          1)
+    ]);
   }
 
   void test_staticTopLevelDeclaration_class() {
@@ -4988,7 +5060,11 @@
     expectNotNullIfNoErrors(list);
     listener.assertErrors([
       expectedError(
-          ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, 5, 1)
+          usingFastaParser
+              ? ParserErrorCode.EXPECTED_TOKEN
+              : ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
+          5,
+          1)
     ]);
   }
 
@@ -5027,13 +5103,25 @@
     createParser('class C { int x; ; int y;}');
     ClassDeclaration declaration = parseFullCompilationUnitMember();
     expectNotNullIfNoErrors(declaration);
-    listener
-        .assertErrors([expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 17, 1)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.EXPECTED_CLASS_MEMBER
+              : ParserErrorCode.UNEXPECTED_TOKEN,
+          17,
+          1)
+    ]);
   }
 
   void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
-    parseCompilationUnit("int x; ; int y;",
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 1)]);
+    parseCompilationUnit("int x; ; int y;", errors: [
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.EXPECTED_EXECUTABLE
+              : ParserErrorCode.UNEXPECTED_TOKEN,
+          7,
+          1)
+    ]);
   }
 
   void test_unterminatedString_at_eof() {
@@ -5179,7 +5267,9 @@
 
   void test_varAsTypeName_as() {
     parseExpression("x as var",
-        errors: [expectedError(ParserErrorCode.VAR_AS_TYPE_NAME, 7, 3)]);
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 5, 3)]
+            : [expectedError(ParserErrorCode.VAR_AS_TYPE_NAME, 7, 3)]);
   }
 
   void test_varClass() {
@@ -5291,16 +5381,16 @@
     createParser('(a, {b, c])');
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
-    if (fe.Scanner.useFasta) {
-      listener.assertErrors([
-        // fasta scanner generates '(a, {b, c]})' where '}' is synthetic
-        expectedError(
-            ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, 9, 1),
-        expectedError(ScannerErrorCode.EXPECTED_TOKEN, 9, 1),
-      ]);
+    // fasta scanner generates '(a, {b, c]})' where '}' is synthetic
+    if (usingFastaParser) {
+      listener
+          .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 1)]);
     } else {
-      listener.assertErrorsWithCodes(
-          [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
+      listener.assertErrors([
+        expectedError(ScannerErrorCode.EXPECTED_TOKEN, 9, 1),
+        expectedError(
+            ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, 9, 1)
+      ]);
     }
   }
 
@@ -5308,16 +5398,16 @@
     createParser('(a, [b, c})');
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
-    if (usingFastaScanner) {
-      listener.assertErrors([
-        // fasta scanner generates '(a, [b, c}])' where ']' is synthetic
-        expectedError(
-            ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, 9, 1),
-        expectedError(ScannerErrorCode.EXPECTED_TOKEN, 9, 1),
-      ]);
+    // fasta scanner generates '(a, [b, c}])' where ']' is synthetic
+    if (usingFastaParser) {
+      listener
+          .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 1)]);
     } else {
-      listener.assertErrorsWithCodes(
-          [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
+      listener.assertErrors([
+        expectedError(ScannerErrorCode.EXPECTED_TOKEN, 4, 1),
+        expectedError(
+            ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, 10, 1)
+      ]);
     }
   }
 }
@@ -10877,10 +10967,13 @@
 
   void test_keywordInPlaceOfIdentifier() {
     // TODO(brianwilkerson) We could do better with this.
-    parseCompilationUnit("do() {}", codes: [
-      ParserErrorCode.EXPECTED_EXECUTABLE,
-      ParserErrorCode.UNEXPECTED_TOKEN
-    ]);
+    parseCompilationUnit("do() {}",
+        codes: usingFastaParser
+            ? [ParserErrorCode.MISSING_IDENTIFIER]
+            : [
+                ParserErrorCode.EXPECTED_EXECUTABLE,
+                ParserErrorCode.UNEXPECTED_TOKEN
+              ]);
   }
 
   void test_logicalAndExpression_missing_LHS() {
@@ -11007,7 +11100,14 @@
 class C {
   int length {}
   void foo() {}
-}''', errors: [expectedError(ParserErrorCode.MISSING_GET, 16, 6)]);
+}''', errors: [
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.MISSING_METHOD_PARAMETERS
+              : ParserErrorCode.MISSING_GET,
+          16,
+          6)
+    ]);
     expect(unit, isNotNull);
     ClassDeclaration classDeclaration =
         unit.declarations[0] as ClassDeclaration;
@@ -11056,7 +11156,7 @@
     // would be to insert a synthetic comma after the `n`.
     CompilationUnit unit = parseCompilationUnit('String n x = "";',
         codes: usingFastaParser
-            ? [ParserErrorCode.EXTRANEOUS_MODIFIER]
+            ? [ParserErrorCode.UNEXPECTED_TOKEN]
             : [
                 ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
@@ -11065,7 +11165,7 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     if (usingFastaParser) {
       expect(declarations, hasLength(1));
-      verify(declarations[0], 'String', 'x', ';');
+      verify(declarations[0], 'n', 'x', ';');
     } else {
       expect(declarations, hasLength(2));
       verify(declarations[0], 'String', 'n', '');
@@ -11157,9 +11257,10 @@
             ? [
                 expectedError(ParserErrorCode.EXPECTED_STRING_LITERAL, 7, 4),
                 expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 1),
                 expectedError(
-                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 7, 4),
-                expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 7, 4)
+                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 12, 2)
               ]
             : [expectedError(ParserErrorCode.NON_STRING_LITERAL_AS_URI, 7, 4)]);
   }
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 8b0473c..2e1a353 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -143,13 +143,14 @@
   }
 
   test_await_flattened() async {
+    // The analyzer type system over-flattens - see dartbug.com/31887
     await assertErrorsInCode('''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
   Future<int> b = await ffi(); // Warning: int not assignable to Future<int>
 }
-''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', useCFE ? [] : [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   test_await_simple() async {
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 2c48053..2d3a194 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -379,13 +379,6 @@
 
   @override
   @failingTest
-  test_implicitBounds() async {
-    // Expected: 'B<num>'
-    await super.test_implicitBounds();
-  }
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_instantiateToBounds_class_error_recursion() async {
     return super.test_instantiateToBounds_class_error_recursion();
@@ -393,13 +386,6 @@
 
   @override
   @failingTest
-  test_instantiateToBounds_class_ok_simpleBounds() async {
-    // Expected: 'B<num>'
-    await super.test_instantiateToBounds_class_ok_simpleBounds();
-  }
-
-  @override
-  @failingTest
   test_notInstantiatedBound_direct_class_class() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
     await super.test_notInstantiatedBound_direct_class_class();
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index b766357..7e1db80 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4312,4 +4312,26 @@
     assertPropagatedAssignedType(code, unit, typeProvider.intType, null);
     assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null);
   }
+
+  test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef() async {
+    Source source = addSource(r'''
+typedef bool F<E>(E argument);
+
+abstract class Base {
+  f<E extends int>(F<int> x);
+}
+
+abstract class BaseCopy extends Base {
+}
+
+abstract class Override implements Base, BaseCopy {
+  f<E>(x) => null;
+}
+
+class C extends Override implements Base {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
 }
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index acd2708..ef803c9 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -55,6 +55,7 @@
   InterfaceType get numType => typeProvider.numType;
   InterfaceType get objectType => typeProvider.objectType;
   InterfaceType get stringType => typeProvider.stringType;
+  InterfaceType get futureOrType => typeProvider.futureOrType;
   StrongTypeSystemImpl get strongTypeSystem =>
       typeSystem as StrongTypeSystemImpl;
 
@@ -1237,6 +1238,60 @@
     _checkGreatestLowerBound(dynamicType, voidType, voidType);
   }
 
+  void test_bounds_of_top_types_sanity() {
+    final futureOrDynamicType = futureOrType.instantiate([dynamicType]);
+    final futureOrFutureOrDynamicType =
+        futureOrType.instantiate([futureOrDynamicType]);
+
+    // Sanity check specific cases of top for GLB/LUB.
+    _checkGreatestLowerBound(objectType, dynamicType, dynamicType);
+    _checkLeastUpperBound(objectType, dynamicType, objectType);
+    _checkGreatestLowerBound(futureOrDynamicType, dynamicType, dynamicType);
+    _checkLeastUpperBound(futureOrDynamicType, objectType, futureOrDynamicType);
+    _checkLeastUpperBound(futureOrDynamicType, futureOrFutureOrDynamicType,
+        futureOrFutureOrDynamicType);
+  }
+
+  void test_bounds_of_top_types_complete() {
+    // Test every combination of a subset of Tops programatically.
+    final futureOrDynamicType = futureOrType.instantiate([dynamicType]);
+    final futureOrObjectType = futureOrType.instantiate([objectType]);
+    final futureOrFutureOrDynamicType =
+        futureOrType.instantiate([futureOrDynamicType]);
+    final futureOrFutureOrObjectType =
+        futureOrType.instantiate([futureOrObjectType]);
+
+    final orderedTops = [
+      // Lower index, so lower Top
+      futureOrFutureOrObjectType,
+      futureOrFutureOrDynamicType,
+      futureOrObjectType,
+      futureOrDynamicType,
+      objectType,
+      dynamicType,
+      // Higher index, higher Top
+    ];
+
+    // We could sort and check the sort result is correct in O(n log n), but a
+    // good sorting algorithm would only run n tests here (that each value is
+    // correct relative to its nearest neighbors). But O(n^2) for n=6 is stupid
+    // fast, in this case, so just do the brute force check because we can.
+    for (var i = 0; i < orderedTops.length; ++i) {
+      for (var lower = 0; lower <= i; ++lower) {
+        _checkGreatestLowerBound(
+            orderedTops[i], orderedTops[lower], orderedTops[i]);
+        _checkLeastUpperBound(
+            orderedTops[i], orderedTops[lower], orderedTops[lower]);
+      }
+      for (var greater = i; greater < orderedTops.length; ++greater) {
+        _checkGreatestLowerBound(
+            orderedTops[i], orderedTops[greater], orderedTops[greater]);
+        _checkLeastUpperBound(
+            orderedTops[i], orderedTops[greater], orderedTops[i]);
+      }
+    }
+  }
+
   void test_functionsDifferentNamedTakeUnion() {
     FunctionType type1 = _functionType([], named: {'a': intType, 'b': intType});
     FunctionType type2 =
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 95a3cb0..15773b5 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1677,6 +1677,29 @@
     }
   }
 
+  test_enum_toString() async {
+    addTestFile(r'''
+enum MyEnum { A, B, C }
+main(MyEnum e) {
+  e.toString();
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    EnumDeclaration enumNode = result.unit.declarations[0];
+    ClassElement enumElement = enumNode.element;
+
+    List<Statement> mainStatements = _getMainStatements(result);
+
+    ExpressionStatement statement = mainStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.staticInvokeType.toString(), '() → String');
+
+    MethodElement methodElement = invocation.methodName.staticElement;
+    expect(methodElement.name, 'toString');
+    expect(methodElement.enclosingElement, same(enumElement));
+  }
+
   test_error_unresolvedTypeAnnotation() async {
     String content = r'''
 main() {
@@ -1863,6 +1886,32 @@
     expect(parameterNode.identifier.staticType, typeProvider.intType);
   }
 
+  test_forwardingStub_class() async {
+    addTestFile(r'''
+class A<T> {
+  void m(T t) {}
+}
+class B extends A<int> {}
+main(B b) {
+  b.m(1);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    ClassDeclaration aNode = result.unit.declarations[0];
+    ClassElement eElement = aNode.element;
+    MethodElement mElement = eElement.getMethod('m');
+
+    List<Statement> mainStatements = _getMainStatements(result);
+
+    ExpressionStatement statement = mainStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.staticInvokeType.toString(), '(int) → void');
+    if (useCFE) {
+      expect(invocation.methodName.staticElement, same(mElement));
+    }
+  }
+
   test_functionExpressionInvocation() async {
     addTestFile(r'''
 typedef Foo<S> = S Function<T>(T x);
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index 212781c..f01caa2 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -467,6 +467,33 @@
     expect(fType.parameters[0].type.toString(), 'int');
   }
 
+  @failingTest
+  void test_inferredType_parameter_genericFunctionType_asTypeArgument() {
+    var bundle = createPackageBundle('''
+class A<T> {
+  A<R> map<R>(List<R Function(T)> fs) => null;
+}
+''', path: '/a.dart');
+    addBundle('/a.ds', bundle);
+    createLinker('''
+import 'a.dart';
+class C extends A<int> {
+  map<R2>(fs) => null;
+}
+''');
+    LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+    library.libraryCycleForLink.ensureLinked();
+    ClassElementForLink_Class c = library.getContainedName('C');
+    expect(c.methods, hasLength(1));
+    MethodElementForLink map = c.methods[0];
+    expect(map.parameters, hasLength(1));
+    InterfaceType iType = map.parameters[0].type;
+    expect(iType.typeArguments, hasLength(1));
+    FunctionType fType = iType.typeArguments[0];
+    expect(fType.returnType.toString(), 'R2');
+    expect(fType.parameters[0].type.toString(), 'int');
+  }
+
   void test_inferredType_staticField_dynamic() {
     createLinker('''
 dynamic x = null;
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 742fcbe..58cc888 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -3746,6 +3746,7 @@
   static const E a;
   static const E b;
   static const E c;
+  String toString() {}
 }
 class C {
 }
@@ -3775,6 +3776,7 @@
   static const E a;
   static const E b;
   static const E c;
+  String toString() {}
 }
 class C {
 }
@@ -4407,6 +4409,7 @@
   static const E a;
   static const E b;
   static const E c;
+  String toString() {}
 }
 final E vValue;
 final List<E> vValues;
@@ -4420,6 +4423,7 @@
   static const E a;
   static const E b;
   static const E c;
+  String toString() {}
 }
 final dynamic vValue;
 final dynamic vValues;
@@ -4439,6 +4443,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E a;
+  String toString() {}
 }
 final String vToString;
 ''');
@@ -4448,6 +4453,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E a;
+  String toString() {}
 }
 final dynamic vToString;
 ''');
@@ -5377,6 +5383,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 ''');
   }
@@ -5401,6 +5408,7 @@
   static const E a;
   /// bbb
   static const E b;
+  String toString() {}
 }
 ''');
   }
@@ -5413,6 +5421,7 @@
   synthetic static const List<E> values;
   static const E v1;
   static const E v2;
+  String toString() {}
 }
 ''');
   }
@@ -5424,11 +5433,13 @@
   synthetic final int index;
   synthetic static const List<E1> values;
   static const E1 v1;
+  String toString() {}
 }
 enum E2 {
   synthetic final int index;
   synthetic static const List<E2> values;
   static const E2 v2;
+  String toString() {}
 }
 ''');
   }
@@ -5460,6 +5471,7 @@
   static const E a;
   static const E b;
   static const E c;
+  String toString() {}
 }
 class M {
 }
@@ -7045,10 +7057,18 @@
 var v = (Future<Future<Future<int>>> f) async => await f;
 ''');
     if (isStrongMode) {
-      checkElementText(library, r'''
+      if (isSharedFrontEnd) {
+        checkElementText(library, r'''
+import 'dart:async';
+(Future<Future<Future<int>>>) → Future<Future<int>> v;
+''');
+      } else {
+        // The analyzer type system over-flattens - see dartbug.com/31887
+        checkElementText(library, r'''
 import 'dart:async';
 (Future<Future<Future<int>>>) → Future<int> v;
 ''');
+      }
     } else {
       checkElementText(library, r'''
 import 'dart:async';
@@ -7873,6 +7893,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 const dynamic a = null;
 ''');
@@ -9116,6 +9137,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 class C {
 }
@@ -9143,6 +9165,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 class C {
 }
@@ -9161,6 +9184,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 class C {
 }
@@ -9190,6 +9214,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 class C {
 }
@@ -9217,6 +9242,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 class C {
 }
@@ -9260,6 +9286,7 @@
   synthetic final int index;
   synthetic static const List<E> values;
   static const E v;
+  String toString() {}
 }
 E e;
 ''');
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 7581f8e..ab0b33b 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -16,7 +16,6 @@
 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';
 
@@ -549,6 +548,7 @@
       List<_PrefixExpectation> prefixExpectations,
       int numTypeArguments: 0,
       ReferenceKind expectedKind: ReferenceKind.classOrEnum,
+      EntityRefKind entityKind: null,
       int expectedTargetUnit: 0,
       LinkedUnit linkedSourceUnit,
       UnlinkedUnit unlinkedSourceUnit,
@@ -559,6 +559,12 @@
     expect(typeRef.paramReference, 0);
     int index = typeRef.reference;
     expect(typeRef.typeArguments, hasLength(numTypeArguments));
+
+    if (entityKind == EntityRefKind.genericFunctionType) {
+      // [GenericFunctionType]s don't have references to check.
+      return;
+    }
+
     UnlinkedReference reference = checkReferenceIndex(
         index, absoluteUri, expectedName,
         expectedKind: expectedKind,
@@ -1506,9 +1512,9 @@
       closure = executable.localFunctions[0];
     }
     if (strongMode) {
-      // Strong mode infers a type for the closure of `() => dynamic`, so the
-      // inferred return type slot should be empty.
-      expect(getTypeRefForSlot(closure.inferredReturnTypeSlot), isNull);
+      // Strong mode infers a type for the closure of `() => Null`.
+      checkInferredTypeSlot(
+          closure.inferredReturnTypeSlot, 'dart:core', 'Null');
     } else {
       // Spec mode infers a type for the closure of `() => Bottom`.
       checkInferredTypeSlot(closure.inferredReturnTypeSlot, null, '*bottom*',
@@ -2663,7 +2669,6 @@
     ]);
   }
 
-  @failingTest
   test_constExpr_makeTypedList_functionType_withTypeParameters() {
     UnlinkedVariable variable = serializeVariableText(
         'final v = <void Function<T>(Function<Q>(T, Q))>[];');
@@ -2682,13 +2687,13 @@
           expect(param.type.entityKind, EntityRefKind.genericFunctionType);
           expect(param.type.syntheticParams, hasLength(2));
           {
-            final subparam = reference.syntheticParams[0];
+            final subparam = param.type.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];
+            final subparam = param.type.syntheticParams[1];
             expect(subparam.name, ''); // no name for generic type parameters
             expect(subparam.type, new isInstanceOf<EntityRef>());
             expect(subparam.type.paramReference, 1);
@@ -7989,10 +7994,6 @@
     if (!strongMode || skipFullyLinkedData) {
       return;
     }
-    // The type that is inferred for C.f's parameter g is "() -> void".
-    // Since the associated element for that function type is B.f's parameter g,
-    // and B has a type parameter, the inferred type will record a type
-    // parameter.
     UnlinkedClass c = serializeClassText('''
 abstract class B<T> {
   void f(void g());
@@ -8007,9 +8008,14 @@
     UnlinkedParam g = f.parameters[0];
     expect(g.name, 'g');
     EntityRef typeRef = getTypeRefForSlot(g.inferredTypeSlot);
-    checkLinkedTypeRef(typeRef, null, 'f',
-        expectedKind: ReferenceKind.method, numTypeArguments: 1);
-    checkParamTypeRef(typeRef.typeArguments[0], 1);
+
+    // The type that is inferred for C.f's parameter g is "() -> void".
+    // Therefore it has no type arguments. However, the associated element for
+    // that function type is B.f's parameter g, and B has a type parameter, so
+    // the inferred type *may* safely record that T as a type parameter, in
+    // which case this assertion can be altered accordingly.
+    checkTypeRef(typeRef, null, 'f',
+        numTypeArguments: 0, entityKind: EntityRefKind.genericFunctionType);
   }
 
   test_inferred_type_keeps_leading_dynamic() {
@@ -8071,7 +8077,7 @@
     expect(y.name, 'y');
     EntityRef typeRef = getTypeRefForSlot(y.inferredTypeSlot);
     checkLinkedTypeRef(typeRef, null, 'F', expectedKind: ReferenceKind.typedef);
-    expect(typeRef.implicitFunctionTypeIndices, [0]);
+    expect(typeRef.implicitFunctionTypeIndices, isEmpty);
   }
 
   test_inferred_type_refers_to_function_typed_parameter_type_generic_class() {
@@ -8086,24 +8092,15 @@
         getTypeRefForSlot(cls.executables[0].parameters[1].inferredTypeSlot);
     // Check that parameter g's inferred type is the type implied by D.f's 1st
     // (zero-based) parameter.
-    expect(type.implicitFunctionTypeIndices, [1]);
+    expect(type.implicitFunctionTypeIndices, isEmpty);
     expect(type.paramReference, 0);
-    expect(type.typeArguments, hasLength(2));
-    checkParamTypeRef(type.typeArguments[0], 1);
-    checkTypeRef(type.typeArguments[1], 'dart:core', 'int');
-    expect(type.reference,
-        greaterThanOrEqualTo(unlinkedUnits[0].references.length));
-    LinkedReference linkedReference =
-        linked.units[0].references[type.reference];
-    expect(linkedReference.dependency, 0);
-    expect(linkedReference.kind, ReferenceKind.method);
-    expect(linkedReference.name, 'f');
-    expect(linkedReference.numTypeParameters, 0);
-    expect(linkedReference.unit, 0);
-    expect(linkedReference.containingReference, isNot(0));
-    expect(linkedReference.containingReference, lessThan(type.reference));
-    checkReferenceIndex(linkedReference.containingReference, null, 'D',
-        numTypeParameters: 2);
+    // Note: this *may* legally have two type arguments (V, W), but for the
+    // moment does not in practice, so we assert isEmpty.
+    expect(type.typeArguments, isEmpty);
+    expect(type.entityKind, EntityRefKind.syntheticFunction);
+    expect(type.syntheticParams, hasLength(1));
+    checkParamTypeRef(type.syntheticParams[0].type, 1);
+    checkLinkedTypeRef(type.syntheticReturnType, 'dart:core', 'int');
   }
 
   test_inferred_type_refers_to_function_typed_parameter_type_other_lib() {
@@ -8117,24 +8114,15 @@
         'import "a.dart"; class C extends D { void f(int x, g) {} }');
     EntityRef type =
         getTypeRefForSlot(cls.executables[0].parameters[1].inferredTypeSlot);
-    // Check that parameter g's inferred type is the type implied by D.f's 1st
-    // (zero-based) parameter.
-    expect(type.implicitFunctionTypeIndices, [1]);
+    expect(type.implicitFunctionTypeIndices, isEmpty);
     expect(type.paramReference, 0);
+    // Note: this *may* legally have two type arguments (V, W), but for the
+    // moment does not in practice, so we assert isEmpty.
     expect(type.typeArguments, isEmpty);
-    expect(type.reference,
-        greaterThanOrEqualTo(unlinkedUnits[0].references.length));
-    LinkedReference linkedReference =
-        linked.units[0].references[type.reference];
-    expect(linkedReference.dependency, 0);
-    expect(linkedReference.kind, ReferenceKind.method);
-    expect(linkedReference.name, 'f');
-    expect(linkedReference.numTypeParameters, 0);
-    expect(linkedReference.unit, 0);
-    expect(linkedReference.containingReference, isNot(0));
-    expect(linkedReference.containingReference, lessThan(type.reference));
-    checkReferenceIndex(
-        linkedReference.containingReference, absUri('/b.dart'), 'E');
+    expect(type.entityKind, EntityRefKind.syntheticFunction);
+    expect(type.syntheticParams, hasLength(1));
+    checkLinkedTypeRef(type.syntheticReturnType, 'dart:core', 'int');
+    checkLinkedTypeRef(type.syntheticParams[0].type, 'dart:core', 'String');
   }
 
   test_inferred_type_refers_to_method_function_typed_parameter_type() {
@@ -8147,23 +8135,16 @@
         className: 'C');
     EntityRef type =
         getTypeRefForSlot(cls.executables[0].parameters[1].inferredTypeSlot);
-    // Check that parameter g's inferred type is the type implied by D.f's 1st
-    // (zero-based) parameter.
-    expect(type.implicitFunctionTypeIndices, [1]);
+
+    expect(type.implicitFunctionTypeIndices, isEmpty);
     expect(type.paramReference, 0);
+    // Note: this *may* legally have two type arguments (V, W), but for the
+    // moment does not in practice, so we assert isEmpty.
     expect(type.typeArguments, isEmpty);
-    expect(type.reference,
-        greaterThanOrEqualTo(unlinkedUnits[0].references.length));
-    LinkedReference linkedReference =
-        linked.units[0].references[type.reference];
-    expect(linkedReference.dependency, 0);
-    expect(linkedReference.kind, ReferenceKind.method);
-    expect(linkedReference.name, 'f');
-    expect(linkedReference.numTypeParameters, 0);
-    expect(linkedReference.unit, 0);
-    expect(linkedReference.containingReference, isNot(0));
-    expect(linkedReference.containingReference, lessThan(type.reference));
-    checkReferenceIndex(linkedReference.containingReference, null, 'D');
+    expect(type.entityKind, EntityRefKind.syntheticFunction);
+    expect(type.syntheticParams, hasLength(1));
+    checkLinkedTypeRef(type.syntheticReturnType, 'dart:core', 'int');
+    checkLinkedTypeRef(type.syntheticParams[0].type, 'dart:core', 'String');
   }
 
   test_inferred_type_refers_to_nested_function_typed_param() {
diff --git a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
index 4f208e9..3969217 100644
--- a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -575,7 +575,44 @@
     _assertTypeAnnotations(code, unit);
   }
 
-  test_forIn() async {
+  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_forIn_variable() async {
     var code = r'''
 T f<T>() => null;
 
@@ -618,41 +655,39 @@
     }
   }
 
-  test_forIn_identifier() async {
+  test_forIn_variable_implicitlyTyped() async {
     var code = r'''
-T f<T>() => null;
-
 class A {}
+class B extends A {}
 
-A aTopLevel;
-void set aTopLevelSetter(A value) {}
+List<T> f<T extends A>(List<T> items) => items;
 
-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
-  }
-}''';
+void test(List<A> listA, List<B> listB) {
+  for (var a1 in f(listA)) {} // 1
+  for (A a2 in f(listA)) {} // 2
+  for (var b1 in f(listB)) {} // 3
+  for (A b2 in f(listB)) {} // 4
+  for (B b3 in f(listB)) {} // 5
+}
+''';
     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>');
+    void assertTypes(
+        String vSearch, String vType, String fSearch, String fType) {
+      var node = EngineTestCase.findSimpleIdentifier(unit, code, vSearch);
+      expect(node.staticType.toString(), vType);
+
+      var invocation = _findMethodInvocation(unit, code, fSearch);
+      expect(invocation.staticType.toString(), fType);
     }
 
-    assertType('f()) {} // local');
-    assertType('f()) {} // field');
-    assertType('f()) {} // setter');
-    assertType('f()) {} // top variable');
-    assertType('f()) {} // top setter');
+    assertTypes('a1 in', 'A', 'f(listA)) {} // 1', 'List<A>');
+    assertTypes('a2 in', 'A', 'f(listA)) {} // 2', 'List<A>');
+    assertTypes('b1 in', 'B', 'f(listB)) {} // 3', 'List<B>');
+    assertTypes('b2 in', 'A', 'f(listB)) {} // 4', 'List<A>');
+    assertTypes('b3 in', 'B', 'f(listB)) {} // 5', 'List<B>');
   }
 
   test_implicitVoidReturnType_default() async {
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 c5187b2..506f323 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -4349,12 +4349,6 @@
   @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();
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index d585eec..869ed63 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -667,6 +667,8 @@
     return closureClass.methodElement.memberContext;
   }
 
+  SourceSpan get sourcePosition => expression.sourcePosition;
+
   bool get hasNode => node != null;
 
   FunctionExpression parseNode(ParsingContext parsing) => node;
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 95d84b7..7a6f642 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -39,6 +39,7 @@
   /// See [CompilerOptions.useKernel] for details.
   static const String useKernel = '--use-kernel';
   static const String strongMode = '--strong';
+  static const String addMethodSignatures = '--method-signatures';
   static const String platformBinaries = '--platform-binaries=.+';
 
   static const String minify = '--minify';
diff --git a/pkg/compiler/lib/src/common/names.dart b/pkg/compiler/lib/src/common/names.dart
index cafa0bc..749c072 100644
--- a/pkg/compiler/lib/src/common/names.dart
+++ b/pkg/compiler/lib/src/common/names.dart
@@ -73,6 +73,8 @@
   static const Name length = const PublicName(Identifiers.length);
 
   static const Name runtimeType_ = const PublicName(Identifiers.runtimeType_);
+
+  static const Name genericInstantiation = const PublicName('instantiate');
 }
 
 /// [Selector]s commonly used.
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 50a5ebb..f92e7cc 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -429,6 +429,11 @@
           });
         }
       }
+    } else {
+      if (loadedLibraries.containsLibrary(Uris.dart_mirrors)) {
+        reporter.reportErrorMessage(NO_LOCATION_SPANNABLE,
+            MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_KERNEL);
+      }
     }
     backend.onLibrariesLoaded(frontendStrategy.commonElements, loadedLibraries);
     return loadedLibraries;
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index a17e4b3..b080d91 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -401,6 +401,7 @@
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
     new OptionHandler(Flags.enableAssertMessage, passThrough),
     new OptionHandler(Flags.strongMode, passThrough),
+    new OptionHandler(Flags.addMethodSignatures, passThrough),
 
     // TODO(floitsch): remove conditional directives flag.
     // We don't provide the info-message yet, since we haven't publicly
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 8ba05a1..d099669 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -95,6 +95,9 @@
   /// Will be `true` if the program contains deferred libraries.
   bool isProgramSplit = false;
 
+  /// Whether mirrors have been used in the program.
+  bool _isMirrorsUsed = false;
+
   static const ImpactUseCase IMPACT_USE = const ImpactUseCase('Deferred load');
 
   /// A mapping from the name of a defer import to all the output units it
@@ -217,7 +220,9 @@
       collectConstantsInBody(analyzableElement, constants);
     }
 
-    collectConstantsFromMetadata(element, constants);
+    if (_isMirrorsUsed) {
+      collectConstantsFromMetadata(element, constants);
+    }
 
     if (element is FunctionEntity) {
       _collectTypeDependencies(
@@ -630,6 +635,7 @@
 
     work() {
       var queue = new WorkQueue(this.importSets);
+      _isMirrorsUsed = closedWorld.backendUsage.isMirrorsUsed;
 
       // Add `main` and their recursive dependencies to the main output unit.
       // We do this upfront to avoid wasting time visiting these elements when
@@ -650,7 +656,7 @@
         element = element is ClassElement ? element.implementation : element;
         queue.addElement(element, importSets.mainSet);
       }
-      if (closedWorld.backendUsage.isMirrorsUsed) {
+      if (_isMirrorsUsed) {
         addMirrorElementsForLibrary(queue, main.library, importSets.mainSet);
       }
 
@@ -781,14 +787,37 @@
     return "${outName}_$name$extension";
   }
 
+  bool ignoreEntityInDump(Entity element) => false;
+
   /// Creates a textual representation of the output unit content.
   String dump() {
     Map<OutputUnit, List<String>> elementMap = <OutputUnit, List<String>>{};
     Map<OutputUnit, List<String>> constantMap = <OutputUnit, List<String>>{};
     _elementToSet.forEach((Entity element, ImportSet importSet) {
-      elementMap.putIfAbsent(importSet.unit, () => <String>[]).add('$element');
+      if (ignoreEntityInDump(element)) return;
+      var elements = elementMap.putIfAbsent(importSet.unit, () => <String>[]);
+      var id = element.name ?? '$element';
+      if (element is MemberEntity) {
+        var cls = element.enclosingClass?.name;
+        if (cls != null) id = '$cls.$id';
+        if (element.isSetter) id = '$id=';
+        id = '$id member';
+      } else if (element is ClassEntity) {
+        id = '$id cls';
+      } else if (element is TypedefEntity) {
+        id = '$id typedef';
+      } else if (element is Local) {
+        var context = (element as dynamic).memberContext.name;
+        id = element.name == null || element.name == '' ? '<anonymous>' : id;
+        id = '$context.$id';
+        id = '$id local';
+      }
+      elements.add(id);
     });
     _constantToSet.forEach((ConstantValue value, ImportSet importSet) {
+      // Skip primitive values: they are not stored in the constant tables and
+      // if they are shared, they end up duplicated anyways across output units.
+      if (value.isPrimitive) return;
       constantMap
           .putIfAbsent(importSet.unit, () => <String>[])
           .add(value.toStructuredText());
@@ -801,9 +830,10 @@
         unitText.write(' <MAIN UNIT>');
       } else {
         unitText.write(' imports:');
-        var imports = outputUnit._imports.map((i) => '${i.uri}').toList()
-          ..sort();
-        for (var i in imports) {
+        var imports = outputUnit._imports
+            .map((i) => '${i.enclosingLibrary.canonicalUri.resolveUri(i.uri)}')
+            .toList();
+        for (var i in imports..sort()) {
           unitText.write('\n   $i:');
         }
       }
diff --git a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
index 6fc156d..eddc55e 100644
--- a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
@@ -50,8 +50,6 @@
         "var abstract foo; main(){}",
         "var static foo; main(){}",
         "var external foo; main(){}",
-        "get var foo; main(){}",
-        "set var foo; main(){}",
         "final var foo; main(){}",
         "var var foo; main(){}",
         "const var foo; main(){}",
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 7d1be45..c1755d7 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -287,6 +287,7 @@
   MIRRORS_EXPECTED_STRING_OR_TYPE,
   MIRRORS_EXPECTED_STRING_TYPE_OR_LIST,
   MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND,
+  MIRRORS_LIBRARY_NOT_SUPPORT_WITH_KERNEL,
   MISSING_ARGUMENT,
   MISSING_ENUM_CASES,
   MISSING_FACTORY_KEYWORD,
@@ -3821,6 +3822,11 @@
           """
 $MIRRORS_NOT_SUPPORTED_BY_BACKEND_PADDING#{importChain}"""),
 
+      MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_KERNEL:
+          const MessageTemplate(
+              MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_KERNEL, """
+dart:mirrors library is not supported when using the new kernel front end."""),
+
       MessageKind.DIRECTLY_THROWING_NSM: const MessageTemplate(
           MessageKind.DIRECTLY_THROWING_NSM,
           "This 'noSuchMethod' implementation is guaranteed to throw an "
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 098a4df..e508a0c 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -381,6 +381,15 @@
   }
 
   @override
+  TypeInformation visitInstantiation(ir.Instantiation node) {
+    // TODO(sra): Add a TypeInformation for Instantiations.  Instantiated
+    // generic methods will need to be traced separately, and have the
+    // information gathered in tracing reflected back to the generic method. For
+    // now, pass along the uninstantiated method.
+    return visit(node.expression);
+  }
+
+  @override
   TypeInformation defaultExpression(ir.Expression node) {
     throw new UnimplementedError(
         'Unhandled expression: ${node} (${node.runtimeType})');
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index ac9ae6e..02f075e 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -115,7 +115,7 @@
   void setDefaultTypeOfParameter(Local parameter, TypeInformation type,
       {bool isInstanceMember});
 
-  Iterable<MemberEntity> getCallersOf(MemberEntity element);
+  Iterable<MemberEntity> getCallersOfForTesting(MemberEntity element);
 
   // TODO(johnniwinther): Make this private again.
   GlobalTypeInferenceElementData<T> dataOfMember(MemberEntity element);
@@ -250,6 +250,8 @@
 }
 
 abstract class InferrerEngineImpl<T> extends InferrerEngine<T> {
+  static bool retainDataForTesting = false;
+
   final Map<Local, TypeInformation> defaultTypeOfParameter =
       new Map<Local, TypeInformation>();
   final WorkQueue workQueue = new WorkQueue();
@@ -1094,7 +1096,11 @@
   }
 
   void clear() {
-    void cleanup(TypeInformation info) => info.cleanup();
+    void cleanup(TypeInformation info) {
+      if (!retainDataForTesting) {
+        info.cleanup();
+      }
+    }
 
     types.allocatedCalls.forEach(cleanup);
     types.allocatedCalls.clear();
@@ -1119,9 +1125,9 @@
     types.allocatedLists.values.forEach(cleanup);
   }
 
-  Iterable<MemberEntity> getCallersOf(MemberEntity element) {
+  Iterable<MemberEntity> getCallersOfForTesting(MemberEntity element) {
     MemberTypeInformation info = types.getInferredTypeOfMember(element);
-    return info.callers;
+    return info.callersForTesting;
   }
 
   TypeInformation typeOfMemberWithSelector(
diff --git a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
index ccda1f4..24b0ecc 100644
--- a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
@@ -213,6 +213,8 @@
         break;
       case MemberKind.closureField:
         break;
+      case MemberKind.signature:
+        break;
     }
     failedAt(member, 'Unexpected member definition: $definition.');
     return null;
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 5df2869..19410c0 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -140,12 +140,12 @@
     return result;
   }
 
-  Iterable<MemberEntity> getCallersOf(MemberEntity element) {
+  Iterable<MemberEntity> getCallersOfForTesting(MemberEntity element) {
     if (_disableTypeInference) {
       throw new UnsupportedError(
           "Cannot query the type inferrer when type inference is disabled.");
     }
-    return inferrer.getCallersOf(element);
+    return inferrer.getCallersOfForTesting(element);
   }
 
   bool isMemberCalledOnce(MemberEntity element) {
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 5fcca72..2a74cf9 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -429,13 +429,8 @@
     }
   }
 
-  Iterable<MemberEntity> get callers {
-    // TODO(sra): This is called only from an unused API and a test. If it
-    // becomes used, [cleanup] will need to copy `_caller.keys`.
-
-    // `simple_inferrer_callers_test.dart` ensures that cleanup has not
-    // happened.
-    return _callers.keys;
+  Iterable<MemberEntity> get callersForTesting {
+    return _callers?.keys;
   }
 
   bool isCalledOnce() {
diff --git a/pkg/compiler/lib/src/io/kernel_source_information.dart b/pkg/compiler/lib/src/io/kernel_source_information.dart
index da70b55..93d324e 100644
--- a/pkg/compiler/lib/src/io/kernel_source_information.dart
+++ b/pkg/compiler/lib/src/io/kernel_source_information.dart
@@ -11,6 +11,7 @@
 import '../elements/entities.dart';
 import '../kernel/element_map.dart';
 import '../js_model/js_strategy.dart';
+import '../universe/call_structure.dart';
 import 'source_information.dart';
 import 'position_information.dart';
 
@@ -28,13 +29,15 @@
   }
 }
 
-/// Compute the source map name for kernel based [member].
+/// Compute the source map name for kernel based [member]. If [callStructure]
+/// is non-null it is used to name the parameter stub for [element].
 ///
 /// [elementMap] is used to compute names for closure call methods.
 // TODO(johnniwinther): Make the closure call names available to
 // `sourcemap_helper.dart`.
 String computeKernelElementNameForSourceMaps(
-    KernelToElementMapForBuilding elementMap, MemberEntity member) {
+    KernelToElementMapForBuilding elementMap, MemberEntity member,
+    [CallStructure callStructure]) {
   MemberDefinition definition = elementMap.getMemberDefinition(member);
   switch (definition.kind) {
     case MemberKind.closureCall:
@@ -58,10 +61,10 @@
       }
       MemberEntity enclosingMember = elementMap.getMember(node);
       String enclosingMemberName =
-          computeElementNameForSourceMaps(enclosingMember);
+          computeElementNameForSourceMaps(enclosingMember, callStructure);
       return '$enclosingMemberName.$name';
     default:
-      return computeElementNameForSourceMaps(member);
+      return computeElementNameForSourceMaps(member, callStructure);
   }
 }
 
@@ -77,11 +80,13 @@
       : this._name =
             computeKernelElementNameForSourceMaps(_elementMap, _member);
 
-  /// Returns the [SourceLocation] for the [offset] within [node].
+  /// Returns the [SourceLocation] for the [offset] within [node] using [name]
+  /// as the name of the source location.
   ///
   /// If [offset] is `null`, the first `fileOffset` of [node] or its parents is
   /// used.
-  SourceLocation _getSourceLocation(ir.TreeNode node, [int offset]) {
+  SourceLocation _getSourceLocation(String name, ir.TreeNode node,
+      [int offset]) {
     ir.Location location;
     if (offset != null) {
       location = node.location;
@@ -93,7 +98,7 @@
       location = node.location;
       offset = node.fileOffset;
     }
-    return new KernelSourceLocation(location, offset, _name);
+    return new KernelSourceLocation(location, offset, name);
   }
 
   /// Creates the source information for a function definition defined by the
@@ -101,10 +106,10 @@
   ///
   /// This method handles both methods, constructors, and local functions.
   SourceInformation _buildFunction(
-      ir.TreeNode node, ir.FunctionNode functionNode) {
+      String name, ir.TreeNode node, ir.FunctionNode functionNode) {
     if (functionNode.fileEndOffset != ir.TreeNode.noOffset) {
-      return new PositionSourceInformation(_getSourceLocation(node),
-          _getSourceLocation(functionNode, functionNode.fileEndOffset));
+      return new PositionSourceInformation(_getSourceLocation(name, node),
+          _getSourceLocation(name, functionNode, functionNode.fileEndOffset));
     }
     return _buildTreeNode(node);
   }
@@ -116,31 +121,32 @@
   /// to the end of the member as the closing position.
   SourceInformation _buildFunctionEnd(MemberEntity member, [ir.TreeNode base]) {
     MemberDefinition definition = _elementMap.getMemberDefinition(member);
+    String name = computeKernelElementNameForSourceMaps(_elementMap, member);
     ir.Node node = definition.node;
     switch (definition.kind) {
       case MemberKind.regular:
         if (node is ir.Procedure) {
-          return _buildFunction(base ?? node, node.function);
+          return _buildFunction(name, base ?? node, node.function);
         }
         break;
       case MemberKind.constructor:
       case MemberKind.constructorBody:
         if (node is ir.Procedure) {
-          return _buildFunction(base ?? node, node.function);
+          return _buildFunction(name, base ?? node, node.function);
         } else if (node is ir.Constructor) {
-          return _buildFunction(base ?? node, node.function);
+          return _buildFunction(name, base ?? node, node.function);
         }
         break;
       case MemberKind.closureCall:
         if (node is ir.FunctionDeclaration) {
-          return _buildFunction(base ?? node, node.function);
+          return _buildFunction(name, base ?? node, node.function);
         } else if (node is ir.FunctionExpression) {
-          return _buildFunction(base ?? node, node.function);
+          return _buildFunction(name, base ?? node, node.function);
         }
         break;
       default:
     }
-    return _buildTreeNode(base ?? node);
+    return _buildTreeNode(base ?? node, name: name);
   }
 
   /// Creates the source information for exiting a function definition defined
@@ -151,7 +157,7 @@
       ir.TreeNode node, ir.FunctionNode functionNode) {
     if (functionNode.fileEndOffset != ir.TreeNode.noOffset) {
       return new PositionSourceInformation(
-          _getSourceLocation(functionNode, functionNode.fileEndOffset));
+          _getSourceLocation(_name, functionNode, functionNode.fileEndOffset));
     }
     return _buildTreeNode(node);
   }
@@ -164,12 +170,12 @@
     SourceLocation location;
     if (body != null) {
       if (body is ir.Block && body.statements.isNotEmpty) {
-        location = _getSourceLocation(body.statements.first);
+        location = _getSourceLocation(_name, body.statements.first);
       } else {
-        location = _getSourceLocation(body);
+        location = _getSourceLocation(_name, body);
       }
     } else {
-      location = _getSourceLocation(node);
+      location = _getSourceLocation(_name, node);
     }
     return new PositionSourceInformation(location);
   }
@@ -242,9 +248,9 @@
 
   /// Creates source information based on the location of [node].
   SourceInformation _buildTreeNode(ir.TreeNode node,
-      [SourceLocation closingPosition]) {
+      {SourceLocation closingPosition, String name}) {
     return new PositionSourceInformation(
-        _getSourceLocation(node), closingPosition);
+        _getSourceLocation(name ?? _name, node), closingPosition);
   }
 
   @override
@@ -370,7 +376,7 @@
   SourceInformation buildCall(
       covariant ir.TreeNode receiver, covariant ir.TreeNode call) {
     return new PositionSourceInformation(
-        _getSourceLocation(receiver), _getSourceLocation(call));
+        _getSourceLocation(_name, receiver), _getSourceLocation(_name, call));
   }
 
   @override
@@ -410,6 +416,16 @@
   }
 
   @override
+  SourceInformation buildStub(
+      FunctionEntity function, CallStructure callStructure) {
+    MemberDefinition definition = _elementMap.getMemberDefinition(function);
+    String name = computeKernelElementNameForSourceMaps(
+        _elementMap, function, callStructure);
+    ir.Node node = definition.node;
+    return _buildTreeNode(node, name: name);
+  }
+
+  @override
   SourceInformation buildGoto(ir.Node node) {
     return _buildTreeNode(node);
   }
diff --git a/pkg/compiler/lib/src/io/multi_information.dart b/pkg/compiler/lib/src/io/multi_information.dart
index 84c3421..25c61fe 100644
--- a/pkg/compiler/lib/src/io/multi_information.dart
+++ b/pkg/compiler/lib/src/io/multi_information.dart
@@ -11,6 +11,7 @@
 import '../elements/entities.dart';
 import '../js/js_source_mapping.dart';
 import '../js/js.dart' as js;
+import '../universe/call_structure.dart';
 import 'code_output.dart' show BufferedCodeOutput;
 import 'source_information.dart';
 
@@ -289,6 +290,13 @@
   }
 
   @override
+  SourceInformation buildStub(
+      FunctionEntity function, CallStructure callStructure) {
+    return new MultiSourceInformation(
+        builders.map((b) => b.buildStub(function, callStructure)).toList());
+  }
+
+  @override
   SourceInformation buildGoto(T node) {
     return new MultiSourceInformation(
         builders.map((b) => b.buildGoto(node)).toList());
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 4e1fd6c..5704c6e 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -9,11 +9,12 @@
 
 import '../common.dart';
 import '../elements/elements.dart'
-    show MemberElement, ResolvedAst, ResolvedAstKind;
+    show MemberElement, MethodElement, ResolvedAst, ResolvedAstKind;
 import '../js/js.dart' as js;
 import '../js/js_debug.dart';
 import '../js/js_source_mapping.dart';
 import '../tree/tree.dart' show Node, Send;
+import '../universe/call_structure.dart';
 import 'code_output.dart' show BufferedCodeOutput;
 import 'source_file.dart';
 import 'source_information.dart';
@@ -158,7 +159,8 @@
 
   SourceInformation buildDeclaration(MemberElement member) {
     ResolvedAst resolvedAst = member.resolvedAst;
-    SourceFile sourceFile = computeSourceFile(member.resolvedAst);
+    String name = computeElementNameForSourceMaps(resolvedAst.element);
+    SourceFile sourceFile = computeSourceFile(resolvedAst);
     if (resolvedAst.kind != ResolvedAstKind.PARSED) {
       SourceSpan span = resolvedAst.element.sourcePosition;
       return new PositionSourceInformation(
@@ -172,6 +174,20 @@
     }
   }
 
+  @override
+  SourceInformation buildStub(
+      MethodElement function, CallStructure callStructure) {
+    ResolvedAst resolvedAst = function.resolvedAst;
+    String name =
+        computeElementNameForSourceMaps(resolvedAst.element, callStructure);
+    SourceFile sourceFile = computeSourceFile(resolvedAst);
+    SourceSpan span = resolvedAst.element.sourcePosition;
+    assert(
+        span != null, failedAt(function, "No source position for $function."));
+    return new PositionSourceInformation(
+        new OffsetSourceLocation(sourceFile, span.begin, name));
+  }
+
   /// Builds a source information object pointing the start position of [node].
   SourceInformation buildBegin(Node node) {
     return new PositionSourceInformation(new OffsetSourceLocation(
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index 34a80d7..ae22161 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -16,6 +16,7 @@
 import '../elements/entities.dart';
 import '../js/js.dart' show JavaScriptNodeSourceInformation;
 import '../script.dart';
+import '../universe/call_structure.dart';
 import 'source_file.dart';
 
 /// Interface for passing source information, for instance for use in source
@@ -67,9 +68,14 @@
   /// Create a [SourceInformationBuilder] for [member].
   SourceInformationBuilder forContext(covariant MemberEntity member) => this;
 
-  /// Generate [SourceInformation] the declaration of the [member].
+  /// Generate [SourceInformation] for the declaration of the [member].
   SourceInformation buildDeclaration(covariant MemberEntity member) => null;
 
+  /// Generate [SourceInformation] for the stub of [callStructure] for [member].
+  SourceInformation buildStub(
+          covariant FunctionEntity function, CallStructure callStructure) =>
+      null;
+
   /// Generate [SourceInformation] for the generic [node].
   @deprecated
   SourceInformation buildGeneric(T node) => null;
@@ -271,35 +277,41 @@
   String toString() => '${super.toString()}:$sourceName';
 }
 
-/// Compute the source map name for [element].
-String computeElementNameForSourceMaps(Entity element) {
+/// Compute the source map name for [element]. If [callStructure] is non-null
+/// it is used to name the parameter stub for [element].
+String computeElementNameForSourceMaps(Entity element,
+    [CallStructure callStructure]) {
   if (element is AstElement) {
-    return _computeAstElementNameForSourceMaps(element);
+    return _computeAstElementNameForSourceMaps(element, callStructure);
   } else if (element is ClassEntity) {
     return element.name;
   } else if (element is MemberEntity) {
+    String suffix = computeStubSuffix(callStructure);
     if (element is ConstructorEntity || element is ConstructorBodyEntity) {
       String className = element.enclosingClass.name;
       if (element.name == '') {
         return className;
       }
-      return '$className.${element.name}';
+      return '$className.${element.name}$suffix';
     } else if (element.enclosingClass != null) {
       if (element.enclosingClass.isClosure) {
-        return computeElementNameForSourceMaps(element.enclosingClass);
+        return computeElementNameForSourceMaps(
+            element.enclosingClass, callStructure);
       }
-      return '${element.enclosingClass.name}.${element.name}';
+      return '${element.enclosingClass.name}.${element.name}$suffix';
     } else {
-      return element.name;
+      return '${element.name}$suffix';
     }
   }
   // TODO(redemption): Create element names from kernel locals and closures.
   return element.name;
 }
 
-String _computeAstElementNameForSourceMaps(AstElement element) {
+String _computeAstElementNameForSourceMaps(
+    AstElement element, CallStructure callStructure) {
   if (element.isClosure) {
-    return computeElementNameForSourceMaps(element.enclosingElement);
+    return computeElementNameForSourceMaps(
+        element.enclosingElement, callStructure);
   } else if (element.isClass) {
     return element.name;
   } else if (element.isConstructor || element.isGenerativeConstructorBody) {
@@ -314,17 +326,36 @@
     if (name == '') {
       name = '<anonymous function>';
     }
-    return '${computeElementNameForSourceMaps(local.executableContext)}.$name';
+    String enclosingName =
+        computeElementNameForSourceMaps(local.executableContext, callStructure);
+    return '$enclosingName.$name';
   } else if (element.enclosingClass != null) {
+    String suffix = computeStubSuffix(callStructure);
     if (element.enclosingClass.isClosure) {
-      return computeElementNameForSourceMaps(element.enclosingClass);
+      return computeElementNameForSourceMaps(
+          element.enclosingClass, callStructure);
     }
-    return '${element.enclosingClass.name}.${element.name}';
+    return '${element.enclosingClass.name}.${element.name}$suffix';
   } else {
-    return element.name;
+    String suffix = computeStubSuffix(callStructure);
+    return '${element.name}$suffix';
   }
 }
 
+/// Compute the suffix used for a parameter stub for [callStructure].
+String computeStubSuffix(CallStructure callStructure) {
+  if (callStructure == null) return '';
+  StringBuffer sb = new StringBuffer();
+  sb.write(r'[function-entry$');
+  sb.write(callStructure.positionalArgumentCount);
+  if (callStructure.namedArguments.isNotEmpty) {
+    sb.write(r'$');
+    sb.write(callStructure.getOrderedNamedArguments().join(r'$'));
+  }
+  sb.write(']');
+  return sb.toString();
+}
+
 /// Computes the [SourceFile] for the source code of [resolvedAst].
 SourceFile computeSourceFile(ResolvedAst resolvedAst) {
   SourceFile sourceFile;
diff --git a/pkg/compiler/lib/src/io/start_end_information.dart b/pkg/compiler/lib/src/io/start_end_information.dart
index d67d6a2..099917d 100644
--- a/pkg/compiler/lib/src/io/start_end_information.dart
+++ b/pkg/compiler/lib/src/io/start_end_information.dart
@@ -12,10 +12,11 @@
 import '../common.dart';
 import '../diagnostics/messages.dart' show MessageTemplate;
 import '../elements/elements.dart'
-    show MemberElement, ResolvedAst, ResolvedAstKind;
+    show MemberElement, MethodElement, ResolvedAst, ResolvedAstKind;
 import '../js/js.dart' as js;
 import '../js/js_source_mapping.dart';
 import '../tree/tree.dart' show Node, Send;
+import '../universe/call_structure.dart';
 import 'source_file.dart';
 import 'source_information.dart';
 
@@ -62,8 +63,10 @@
   // TODO(johnniwinther): Inline this in
   // [StartEndSourceInformationBuilder.buildDeclaration].
   static StartEndSourceInformation _computeSourceInformation(
-      ResolvedAst resolvedAst) {
-    String name = computeElementNameForSourceMaps(resolvedAst.element);
+      ResolvedAst resolvedAst,
+      [CallStructure callStructure]) {
+    String name =
+        computeElementNameForSourceMaps(resolvedAst.element, callStructure);
     SourceFile sourceFile = computeSourceFile(resolvedAst);
     int begin;
     int end;
@@ -113,8 +116,9 @@
   const StartEndSourceInformationStrategy();
 
   @override
-  SourceInformationBuilder<Node> createBuilderForContext(MemberElement member) {
-    return new StartEndSourceInformationBuilder(member);
+  SourceInformationBuilder<Node> createBuilderForContext(MemberElement member,
+      [CallStructure callStructure]) {
+    return new StartEndSourceInformationBuilder(member, callStructure);
   }
 
   @override
@@ -193,15 +197,23 @@
   final SourceFile sourceFile;
   final String name;
 
-  StartEndSourceInformationBuilder(MemberElement member)
+  StartEndSourceInformationBuilder(MemberElement member,
+      [CallStructure callStructure])
       : sourceFile = computeSourceFile(member.resolvedAst),
-        name = computeElementNameForSourceMaps(member.resolvedAst.element);
+        name = computeElementNameForSourceMaps(
+            member.resolvedAst.element, callStructure);
 
   SourceInformation buildDeclaration(MemberElement member) {
     return StartEndSourceInformation
         ._computeSourceInformation(member.resolvedAst);
   }
 
+  SourceInformation buildStub(
+      MethodElement member, CallStructure callStructure) {
+    return StartEndSourceInformation._computeSourceInformation(
+        member.resolvedAst, callStructure);
+  }
+
   SourceLocation sourceFileLocationForToken(Token token) {
     SourceLocation location =
         new OffsetSourceLocation(sourceFile, token.charOffset, name);
diff --git a/pkg/compiler/lib/src/js_backend/frequency_namer.dart b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
index 511bb03..e075856 100644
--- a/pkg/compiler/lib/src/js_backend/frequency_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
@@ -24,6 +24,7 @@
   String get requiredParameterField => r'$R';
   String get defaultValuesField => r'$D';
   String get operatorSignature => r'$S';
+  String get genericInstantiationPrefix => r'$I';
 
   jsAst.Name get staticsPropertyName =>
       _staticsPropertyName ??= getFreshName(instanceScope, 'static');
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 887befd..985fe4a 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -179,16 +179,18 @@
           _customElementsResolutionAnalysis.registerTypeLiteral(type);
           if (type.isTypeVariable) {
             TypeVariableType typeVariable = type;
-            if (typeVariable.element.typeDeclaration is ClassEntity) {
-              // GENERIC_METHODS: The `is!` test above filters away method type
-              // variables, because they have the value `dynamic` with the
-              // incomplete support for generic methods offered with
-              // '--generic-method-syntax'. This must be revised in order to
-              // support generic methods fully.
-              ClassEntity cls = typeVariable.element.typeDeclaration;
-              _rtiNeedBuilder.registerClassUsingTypeVariableExpression(cls);
-              registerImpact(_impacts.typeVariableExpression);
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            if (typeDeclaration is ClassEntity) {
+              _rtiNeedBuilder
+                  .registerClassUsingTypeVariableLiteral(typeDeclaration);
+            } else if (typeDeclaration is FunctionEntity) {
+              _rtiNeedBuilder
+                  .registerMethodUsingTypeVariableLiteral(typeDeclaration);
+            } else if (typeDeclaration is Local) {
+              _rtiNeedBuilder.registerLocalFunctionUsingTypeVariableLiteral(
+                  typeDeclaration);
             }
+            registerImpact(_impacts.typeVariableExpression);
           }
           hasTypeLiteral = true;
           break;
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 6be7b26..94ba9a0 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -31,6 +31,7 @@
   String get requiredParameterField => r'$R';
   String get defaultValuesField => r'$D';
   String get operatorSignature => r'$S';
+  String get genericInstantiationPrefix => r'$I';
 
   final ALPHABET_CHARACTERS = 52; // a-zA-Z.
   final ALPHANUMERIC_CHARACTERS = 62; // a-zA-Z0-9.
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 7d2e799..0360aac 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -11,7 +11,7 @@
 
 import '../closure.dart';
 import '../common.dart';
-import '../common/names.dart' show Identifiers, Selectors;
+import '../common/names.dart' show Identifiers, Names, Selectors;
 import '../constants/values.dart';
 import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
@@ -862,12 +862,26 @@
             _disambiguateMember(selector.memberName, suffix);
         return disambiguatedName; // Methods other than call are not annotated.
 
+      case SelectorKind.SPECIAL:
+        return specialSelectorName(selector);
+
       default:
         throw failedAt(CURRENT_ELEMENT_SPANNABLE,
             'Unexpected selector kind: ${selector.kind}');
     }
   }
 
+  jsAst.Name specialSelectorName(Selector selector) {
+    assert(selector.kind == SelectorKind.SPECIAL);
+    if (selector.memberName == Names.genericInstantiation) {
+      return new StringBackedName('${genericInstantiationPrefix}'
+          '${selector.callStructure.typeArgumentCount}');
+    }
+
+    throw failedAt(
+        CURRENT_ELEMENT_SPANNABLE, 'Unexpected special selector: $selector');
+  }
+
   /**
    * Returns the internal name used for an invocation mirror of this selector.
    */
@@ -1611,6 +1625,8 @@
 
   String get operatorSignature => r'$signature';
 
+  String get genericInstantiationPrefix => r'$instantiate';
+
   String get typedefTag => r'typedef';
 
   String get functionTypeTag => r'func';
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 6fd95da..16d9d9e 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -95,7 +95,7 @@
   // TODO(redemption): Remove this when the old frontend is deleted.
   bool localFunctionNeedsSignature(Local localFunction);
 
-  bool classUsesTypeVariableExpression(ClassEntity cls);
+  bool classUsesTypeVariableLiteral(ClassEntity cls);
 }
 
 class TrivialRuntimeTypesNeed implements RuntimeTypesNeed {
@@ -105,7 +105,7 @@
   bool classNeedsTypeArguments(ClassEntity cls) => true;
 
   @override
-  bool classUsesTypeVariableExpression(ClassEntity cls) => true;
+  bool classUsesTypeVariableLiteral(ClassEntity cls) => true;
 
   @override
   bool localFunctionNeedsSignature(Local localFunction) => true;
@@ -117,13 +117,23 @@
   bool classNeedsRtiField(ClassEntity cls) => true;
 
   @override
-  bool methodNeedsTypeArguments(FunctionEntity method) => true;
+  bool methodNeedsTypeArguments(FunctionEntity method) =>
+      // TODO(johnniwinther): Align handling of type arguments passed to factory
+      // constructors with type arguments passed the regular generic methods.
+      !(method is ConstructorEntity && method.isFactoryConstructor);
 }
 
 /// 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 [cls] uses one of its type variables as a literal.
+  void registerClassUsingTypeVariableLiteral(ClassEntity cls);
+
+  /// Registers that [method] uses one of its type variables as a literal.
+  void registerMethodUsingTypeVariableLiteral(FunctionEntity method);
+
+  /// Registers that [localFunction] uses one of its type variables as a
+  /// literal.
+  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction);
 
   /// Registers that if [element] needs type arguments at runtime then so does
   /// [dependency].
@@ -160,7 +170,13 @@
   const TrivialRuntimeTypesNeedBuilder();
 
   @override
-  void registerClassUsingTypeVariableExpression(ClassEntity cls) {}
+  void registerClassUsingTypeVariableLiteral(ClassEntity cls) {}
+
+  @override
+  void registerMethodUsingTypeVariableLiteral(FunctionEntity method) {}
+
+  @override
+  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction) {}
 
   @override
   RuntimeTypesNeed computeRuntimeTypesNeed(
@@ -523,9 +539,8 @@
   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.
-  final Set<ClassEntity> classesUsingTypeVariableExpression;
+  /// The set of classes that use one of their type variables as literals.
+  final Set<ClassEntity> classesUsingTypeVariableLiterals;
 
   RuntimeTypesNeedImpl(
       this._elementEnvironment,
@@ -535,7 +550,7 @@
       this.methodsNeedingTypeArguments,
       this.localFunctionsNeedingSignature,
       this.localFunctionsNeedingTypeArguments,
-      this.classesUsingTypeVariableExpression);
+      this.classesUsingTypeVariableLiterals);
 
   bool checkClass(covariant ClassEntity cls) => true;
 
@@ -577,8 +592,8 @@
   }
 
   @override
-  bool classUsesTypeVariableExpression(ClassEntity cls) {
-    return classesUsingTypeVariableExpression.contains(cls);
+  bool classUsesTypeVariableLiteral(ClassEntity cls) {
+    return classesUsingTypeVariableLiterals.contains(cls);
   }
 }
 
@@ -586,19 +601,19 @@
   _ResolutionRuntimeTypesNeed(
       ElementEnvironment elementEnvironment,
       BackendUsage backendUsage,
-      Set<ClassEntity> classesNeedingRti,
-      Set<FunctionEntity> methodsNeedingRti,
-      Set<FunctionEntity> methodsNeedingGenericRti,
-      Set<Local> localFunctionsNeedingRti,
+      Set<ClassEntity> classesNeedingTypeArguments,
+      Set<FunctionEntity> methodsNeedingSignature,
+      Set<FunctionEntity> methodsNeedingTypeArguments,
+      Set<Local> localFunctionsNeedingSignature,
       Set<Local> localFunctionsNeedingTypeArguments,
       Set<ClassEntity> classesUsingTypeVariableExpression)
       : super(
             elementEnvironment,
             backendUsage,
-            classesNeedingRti,
-            methodsNeedingRti,
-            methodsNeedingGenericRti,
-            localFunctionsNeedingRti,
+            classesNeedingTypeArguments,
+            methodsNeedingSignature,
+            methodsNeedingTypeArguments,
+            localFunctionsNeedingSignature,
             localFunctionsNeedingTypeArguments,
             classesUsingTypeVariableExpression);
 
@@ -612,9 +627,14 @@
   final Map<Entity, Set<Entity>> typeArgumentDependencies =
       <Entity, Set<Entity>>{};
 
-  final Set<ClassEntity> classesUsingTypeVariableExpression =
+  final Set<ClassEntity> classesUsingTypeVariableLiterals =
       new Set<ClassEntity>();
 
+  final Set<FunctionEntity> methodsUsingTypeVariableLiterals =
+      new Set<FunctionEntity>();
+
+  final Set<Local> localFunctionsUsingTypeVariableLiterals = new Set<Local>();
+
   final Set<ClassEntity> classesUsingTypeVariableTests = new Set<ClassEntity>();
 
   Set<DartType> isChecks;
@@ -627,8 +647,18 @@
   bool checkClass(covariant ClassEntity cls) => true;
 
   @override
-  void registerClassUsingTypeVariableExpression(ClassEntity cls) {
-    classesUsingTypeVariableExpression.add(cls);
+  void registerClassUsingTypeVariableLiteral(ClassEntity cls) {
+    classesUsingTypeVariableLiterals.add(cls);
+  }
+
+  @override
+  void registerMethodUsingTypeVariableLiteral(FunctionEntity method) {
+    methodsUsingTypeVariableLiterals.add(method);
+  }
+
+  @override
+  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction) {
+    localFunctionsUsingTypeVariableLiterals.add(localFunction);
   }
 
   @override
@@ -768,9 +798,12 @@
       checkClosures();
     }
 
-    // Add the classes that need RTI because they use a type variable as
-    // expression.
-    classesUsingTypeVariableExpression.forEach(potentiallyNeedTypeArguments);
+    // Add the classes, methods and local functions that need type arguments
+    // because they use a type variable as a literal.
+    classesUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
+    methodsUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
+    localFunctionsUsingTypeVariableLiterals
+        .forEach(potentiallyNeedTypeArguments);
 
     return _createRuntimeTypesNeed(
         _elementEnvironment,
@@ -780,7 +813,7 @@
         methodsNeedingTypeArguments,
         localFunctionsNeedingSignature,
         localFunctionsNeedingTypeArguments,
-        classesUsingTypeVariableExpression);
+        classesUsingTypeVariableLiterals);
   }
 
   RuntimeTypesNeed _createRuntimeTypesNeed(
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index ecd5f24..d9cf761 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -207,6 +207,7 @@
           namer,
           this,
           closedWorld,
+          backend.sourceInformationStrategy,
           compiler.backendStrategy.sorter,
           typeTestRegistry.rtiNeededClasses,
           closedWorld.elementEnvironment.mainFunction,
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 db80fe3..b945d93 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -7,6 +7,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../io/source_information.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../js_backend/namer.dart' show Namer;
@@ -31,9 +32,16 @@
   final InterceptorData _interceptorData;
   final CodegenWorldBuilder _codegenWorldBuilder;
   final ClosedWorld _closedWorld;
+  final SourceInformationStrategy _sourceInformationStrategy;
 
-  ParameterStubGenerator(this._emitterTask, this._namer, this._nativeData,
-      this._interceptorData, this._codegenWorldBuilder, this._closedWorld);
+  ParameterStubGenerator(
+      this._emitterTask,
+      this._namer,
+      this._nativeData,
+      this._interceptorData,
+      this._codegenWorldBuilder,
+      this._closedWorld,
+      this._sourceInformationStrategy);
 
   Emitter get _emitter => _emitterTask.emitter;
 
@@ -59,6 +67,11 @@
   ParameterStubMethod generateParameterStub(
       FunctionEntity member, Selector selector, Selector callSelector) {
     CallStructure callStructure = selector.callStructure;
+    SourceInformationBuilder sourceInformationBuilder =
+        _sourceInformationStrategy.createBuilderForContext(member);
+    SourceInformation sourceInformation =
+        sourceInformationBuilder.buildStub(member, callStructure);
+
     ParameterStructure parameterStructure = member.parameterStructure;
     int positionalArgumentCount = callStructure.positionalArgumentCount;
     bool needsTypeArguments =
@@ -182,7 +195,8 @@
           [_emitter.staticFunctionAccess(member), argumentsBuffer]);
     }
 
-    jsAst.Fun function = js('function(#) { #; }', [parametersBuffer, body]);
+    jsAst.Fun function = js('function(#) { #; }', [parametersBuffer, body])
+        .withSourceInformation(sourceInformation);
 
     jsAst.Name name = member.isStatic ? null : _namer.invocationName(selector);
     jsAst.Name callName =
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 33b9496..8edc01d 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
@@ -19,6 +19,7 @@
     show ClassElement, FieldElement, LibraryElement, MethodElement;
 import '../../elements/entities.dart';
 import '../../elements/types.dart';
+import '../../io/source_information.dart';
 import '../../js/js.dart' as js;
 import '../../js_backend/backend.dart' show SuperMemberData;
 import '../../js_backend/backend_usage.dart';
@@ -89,6 +90,7 @@
   final Namer _namer;
   final CodeEmitterTask _task;
   final ClosedWorld _closedWorld;
+  final SourceInformationStrategy _sourceInformationStrategy;
 
   /// The [Sorter] used for ordering elements in the generated JavaScript.
   final Sorter _sorter;
@@ -136,6 +138,7 @@
       this._namer,
       this._task,
       this._closedWorld,
+      this._sourceInformationStrategy,
       this._sorter,
       Set<ClassEntity> rtiNeededClasses,
       this._mainFunction,
@@ -976,8 +979,14 @@
       FunctionEntity element, bool canTearOff) {
     if (!_methodNeedsStubs(element)) return const <ParameterStubMethod>[];
 
-    ParameterStubGenerator generator = new ParameterStubGenerator(_task, _namer,
-        _nativeData, _interceptorData, _worldBuilder, _closedWorld);
+    ParameterStubGenerator generator = new ParameterStubGenerator(
+        _task,
+        _namer,
+        _nativeData,
+        _interceptorData,
+        _worldBuilder,
+        _closedWorld,
+        _sourceInformationStrategy);
     return generator.generateParameterStubs(element, canTearOff: canTearOff);
   }
 
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 10308c1..bc4ea30 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -331,7 +331,7 @@
         if (generated.contains(superclass)) return;
 
         if (classesUsingTypeVariableTests.contains(superclass) ||
-            _rtiNeed.classUsesTypeVariableExpression(superclass) ||
+            _rtiNeed.classUsesTypeVariableLiteral(superclass) ||
             checkedClasses.contains(superclass)) {
           // Generate substitution.  If no substitution is necessary, emit
           // `null` to overwrite a (possibly) existing substitution from the
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 4d20f75..b50699f 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -42,9 +42,8 @@
       hasThisLocal = !constructor.isFactoryConstructor;
     }
     ScopeModel model = new ScopeModel();
-    CapturedScopeBuilder translator = new CapturedScopeBuilder(model,
-        hasThisLocal: hasThisLocal,
-        addTypeChecks: options.enableTypeAssertions);
+    CapturedScopeBuilder translator =
+        new CapturedScopeBuilder(model, options, hasThisLocal: hasThisLocal);
     if (entity.isField) {
       if (node is ir.Field && node.initializer != null) {
         node.accept(translator);
@@ -111,18 +110,41 @@
   void _updateScopeBasedOnRtiNeed(
       KernelScopeInfo scope,
       ir.Node node,
-      Set<ir.Node> localFunctionsNeedingRti,
-      Set<ClassEntity> classesNeedingRti,
+      bool Function(ir.Node) localFunctionNeedsSignature,
+      bool Function(ClassEntity) classNeedsTypeArguments,
+      bool Function(MemberEntity) methodNeedsTypeArguments,
+      bool Function(ir.Node) localFunctionNeedsTypeArguments,
       MemberEntity outermostEntity) {
-    if (localFunctionsNeedingRti.contains(node) ||
-        classesNeedingRti.contains(outermostEntity.enclosingClass) ||
-        _addTypeChecks) {
-      if (outermostEntity is FunctionEntity &&
-          outermostEntity is! ConstructorEntity) {
-        scope.thisUsedAsFreeVariable = scope.thisUsedAsFreeVariableIfNeedsRti ||
-            scope.thisUsedAsFreeVariable;
-      } else {
-        scope.freeVariables.addAll(scope.freeVariablesForRti);
+    if (scope.thisUsedAsFreeVariableIfNeedsRti &&
+        classNeedsTypeArguments(outermostEntity.enclosingClass)) {
+      scope.thisUsedAsFreeVariable = true;
+    }
+    if (_addTypeChecks) {
+      scope.freeVariables.addAll(scope.freeVariablesForRti);
+    } else {
+      for (TypeVariableTypeWithContext typeVariable
+          in scope.freeVariablesForRti) {
+        switch (typeVariable.kind) {
+          case TypeVariableKind.cls:
+            if (classNeedsTypeArguments(
+                _elementMap.getClass(typeVariable.typeDeclaration))) {
+              scope.freeVariables.add(typeVariable);
+            }
+            break;
+          case TypeVariableKind.method:
+            if (methodNeedsTypeArguments(
+                _elementMap.getMember(typeVariable.typeDeclaration))) {
+              scope.freeVariables.add(typeVariable);
+            }
+            break;
+          case TypeVariableKind.local:
+            if (localFunctionNeedsTypeArguments(typeVariable.typeDeclaration)) {
+              scope.freeVariables.add(typeVariable);
+            }
+            break;
+          case TypeVariableKind.function:
+            break;
+        }
       }
     }
   }
@@ -130,8 +152,10 @@
   Iterable<FunctionEntity> createClosureEntities(
       JsClosedWorldBuilder closedWorldBuilder,
       Map<MemberEntity, ScopeModel> closureModels,
-      Set<ir.Node> localFunctionsNeedingRti,
-      Set<ClassEntity> classesNeedingRti) {
+      {bool Function(ir.Node) localFunctionNeedsSignature,
+      bool Function(ClassEntity) classNeedsTypeArguments,
+      bool Function(FunctionEntity) methodNeedsTypeArguments,
+      bool Function(ir.Node) localFunctionNeedsTypeArguments}) {
     List<FunctionEntity> callMethods = <FunctionEntity>[];
     closureModels.forEach((MemberEntity member, ScopeModel model) {
       KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
@@ -145,7 +169,13 @@
         Map<Local, JRecordField> boxedVariables =
             _elementMap.makeRecordContainer(scope, member, localsMap);
         _updateScopeBasedOnRtiNeed(
-            scope, node, localFunctionsNeedingRti, classesNeedingRti, member);
+            scope,
+            node,
+            localFunctionNeedsSignature,
+            classNeedsTypeArguments,
+            methodNeedsTypeArguments,
+            localFunctionNeedsTypeArguments,
+            member);
 
         if (scope is KernelCapturedLoopScope) {
           _capturedScopesMap[node] = new JsCapturedLoopScope.from(
@@ -174,10 +204,13 @@
             functionNode,
             closuresToGenerate[node],
             allBoxedVariables,
-            localFunctionsNeedingRti,
-            classesNeedingRti);
+            localFunctionNeedsSignature,
+            classNeedsTypeArguments,
+            methodNeedsTypeArguments,
+            localFunctionNeedsTypeArguments);
         // Add also for the call method.
         _scopeMap[closureClassInfo.callMethod] = closureClassInfo;
+        _scopeMap[closureClassInfo.signatureMethod] = closureClassInfo;
         callMethods.add(closureClassInfo.callMethod);
       }
     });
@@ -196,10 +229,18 @@
       ir.FunctionNode node,
       KernelScopeInfo info,
       Map<Local, JRecordField> boxedVariables,
-      Set<ir.Node> localFunctionsNeedingRti,
-      Set<ClassEntity> classesNeedingRti) {
+      bool Function(ir.Node) localFunctionNeedsSignature,
+      bool Function(ClassEntity) classNeedsTypeArguments,
+      bool Function(FunctionEntity) methodNeedsTypeArguments,
+      bool Function(ir.Node) localFunctionNeedsTypeArguments) {
     _updateScopeBasedOnRtiNeed(
-        info, node.parent, localFunctionsNeedingRti, classesNeedingRti, member);
+        info,
+        node.parent,
+        localFunctionNeedsSignature,
+        classNeedsTypeArguments,
+        methodNeedsTypeArguments,
+        localFunctionNeedsTypeArguments,
+        member);
     KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
     KernelClosureClassInfo closureClassInfo =
         closedWorldBuilder.buildClosureClass(
@@ -209,6 +250,8 @@
     // to the correct closure class.
     _memberClosureRepresentationMap[closureClassInfo.callMethod] =
         closureClassInfo;
+    _memberClosureRepresentationMap[closureClassInfo.signatureMethod] =
+        closureClassInfo;
     _globalLocalsMap.setLocalsMap(closureClassInfo.callMethod, localsMap);
     if (node.parent is ir.Member) {
       assert(_elementMap.getMember(node.parent) == member);
@@ -247,6 +290,7 @@
       case MemberKind.constructor:
       case MemberKind.constructorBody:
       case MemberKind.closureCall:
+      case MemberKind.signature:
         return _capturedScopesMap[definition.node] ?? const CapturedScope();
       default:
         throw failedAt(entity, "Unexpected member definition $definition");
@@ -291,8 +335,8 @@
   /// freeVariables set. Whether these variables are actually used as
   /// freeVariables will be set by the time this structure is converted to a
   /// JsScopeInfo, so JsScopeInfo does not need to use them.
-  Set<TypeParameterTypeWithContext> freeVariablesForRti =
-      new Set<TypeParameterTypeWithContext>();
+  Set<TypeVariableTypeWithContext> freeVariablesForRti =
+      new Set<TypeVariableTypeWithContext>();
 
   /// If true, `this` is used as a free variable, in this scope. It is stored
   /// separately from [freeVariables] because there is no single
@@ -338,10 +382,10 @@
 Local _getLocal(ir.Node variable, KernelToLocalsMap localsMap,
     KernelToElementMap elementMap) {
   assert(variable is ir.VariableDeclaration ||
-      variable is TypeParameterTypeWithContext);
+      variable is TypeVariableTypeWithContext);
   if (variable is ir.VariableDeclaration) {
     return localsMap.getLocalVariable(variable);
-  } else if (variable is TypeParameterTypeWithContext) {
+  } else if (variable is TypeVariableTypeWithContext) {
     return localsMap.getLocalTypeVariable(variable.type, elementMap);
   }
   throw new ArgumentError('Only know how to get/create locals for '
@@ -398,7 +442,7 @@
       Set<ir.VariableDeclaration> localsUsedInTryOrSync,
       Set<ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ >
           freeVariables,
-      Set<TypeParameterTypeWithContext> freeVariablesForRti,
+      Set<TypeVariableTypeWithContext> freeVariablesForRti,
       bool thisUsedAsFreeVariable,
       bool thisUsedAsFreeVariableIfNeedsRti,
       bool hasThisLocal)
@@ -440,7 +484,7 @@
       Set<ir.VariableDeclaration> localsUsedInTryOrSync,
       Set<ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ >
           freeVariables,
-      Set<TypeParameterTypeWithContext> freeVariablesForRti,
+      Set<TypeVariableTypeWithContext> freeVariablesForRti,
       bool thisUsedAsFreeVariable,
       bool thisUsedAsFreeVariableIfNeedsRti,
       bool hasThisLocal)
@@ -477,6 +521,7 @@
 class KernelClosureClassInfo extends JsScopeInfo
     implements ClosureRepresentationInfo {
   JFunction callMethod;
+  JSignatureMethod signatureMethod;
   final Local closureEntity;
   final Local thisLocal;
   final JClass closureClassEntity;
@@ -775,27 +820,78 @@
       <ir.TreeNode, KernelScopeInfo>{};
 }
 
+enum TypeVariableKind { cls, method, local, function }
+
 /// A fake ir.Node that holds the TypeParameterType as well as the context in
 /// which it occurs.
-class TypeParameterTypeWithContext implements ir.Node {
-  final ir.Node memberContext;
+class TypeVariableTypeWithContext implements ir.Node {
+  final ir.Node context;
   final ir.TypeParameterType type;
-  TypeParameterTypeWithContext(this.type, this.memberContext);
+  final TypeVariableKind kind;
+  final ir.TreeNode typeDeclaration;
+
+  factory TypeVariableTypeWithContext(
+      ir.TypeParameterType type, ir.Member memberContext) {
+    TypeVariableKind kind;
+    ir.TreeNode context = memberContext;
+    ir.TreeNode typeDeclaration = type.parameter.parent;
+    if (typeDeclaration == null) {
+      // We have a function type variable, like `T` in `void Function<T>(int)`.
+      kind = TypeVariableKind.function;
+    } else if (typeDeclaration is ir.Class) {
+      // We have a class type variable, like `T` in `class Class<T> { ... }`.
+      kind = TypeVariableKind.cls;
+    } else if (typeDeclaration.parent is ir.Member) {
+      ir.Member member = typeDeclaration.parent;
+      if (member is ir.Constructor ||
+          (member is ir.Procedure && member.isFactory)) {
+        // We have a synthesized generic method type variable for a class type
+        // variable.
+        // TODO(johnniwinther): Handle constructor/factory type variables as
+        // method type variables.
+        kind = TypeVariableKind.cls;
+        typeDeclaration = member.enclosingClass;
+      } else {
+        // We have a generic method type variable, like `T` in
+        // `m<T>() { ... }`.
+        kind = TypeVariableKind.method;
+        typeDeclaration = typeDeclaration.parent;
+        context = typeDeclaration;
+      }
+    } else {
+      // We have a generic local function type variable, like `T` in
+      // `m() { local<T>() { ... } ... }`.
+      assert(
+          typeDeclaration.parent is ir.FunctionExpression ||
+              typeDeclaration.parent is ir.FunctionDeclaration,
+          "Unexpected type declaration: $typeDeclaration");
+      kind = TypeVariableKind.local;
+      typeDeclaration = typeDeclaration.parent;
+      context = typeDeclaration;
+    }
+    return new TypeVariableTypeWithContext.internal(
+        type, context, kind, typeDeclaration);
+  }
+
+  TypeVariableTypeWithContext.internal(
+      this.type, this.context, this.kind, this.typeDeclaration);
 
   accept(ir.Visitor v) {
-    throw new UnsupportedError('TypeParameterTypeWithContext.accept');
+    throw new UnsupportedError('TypeVariableTypeWithContext.accept');
   }
 
   visitChildren(ir.Visitor v) {
-    throw new UnsupportedError('TypeParameterTypeWithContext.visitChildren');
+    throw new UnsupportedError('TypeVariableTypeWithContext.visitChildren');
   }
 
   int get hashCode => type.hashCode;
 
   bool operator ==(other) {
-    if (other is! TypeParameterTypeWithContext) return false;
-    return type == other.type && memberContext == other.memberContext;
+    if (other is! TypeVariableTypeWithContext) return false;
+    return type == other.type && context == other.context;
   }
 
-  String toString() => 'TypeParameterTypeWithContext $type $memberContext';
+  String toString() =>
+      'TypeVariableTypeWithContext(type=$type,context=$context,'
+      'kind=$kind,typeDeclaration=$typeDeclaration)';
 }
diff --git a/pkg/compiler/lib/src/js_model/closure_visitors.dart b/pkg/compiler/lib/src/js_model/closure_visitors.dart
index 3cc6a15..941a284 100644
--- a/pkg/compiler/lib/src/js_model/closure_visitors.dart
+++ b/pkg/compiler/lib/src/js_model/closure_visitors.dart
@@ -5,6 +5,7 @@
 import 'package:kernel/ast.dart' as ir;
 
 import '../closure.dart';
+import '../options.dart';
 import 'closure.dart';
 
 /// This builder walks the code to determine what variables are captured/free at
@@ -13,6 +14,8 @@
 class CapturedScopeBuilder extends ir.Visitor {
   ScopeModel _model;
 
+  CompilerOptions _options;
+
   /// A map of each visited call node with the associated information about what
   /// variables are captured/used. Each ir.Node key corresponds to a scope that
   /// was encountered while visiting a closure (initially called through
@@ -61,17 +64,16 @@
 
   final bool _hasThisLocal;
 
-  /// If true add type assetions to assert that at runtime the type is in line
-  /// with the stated type.
-  final bool _addTypeChecks;
-
   /// Keeps track of the number of boxes that we've created so that they each
   /// have unique names.
   int _boxCounter = 0;
 
-  CapturedScopeBuilder(this._model, {bool hasThisLocal, bool addTypeChecks})
-      : this._hasThisLocal = hasThisLocal,
-        this._addTypeChecks = addTypeChecks;
+  CapturedScopeBuilder(this._model, this._options, {bool hasThisLocal})
+      : this._hasThisLocal = hasThisLocal;
+
+  /// If true add type assetions to assert that at runtime the type is in line
+  /// with the stated type.
+  bool get _addTypeChecks => _options.enableTypeAssertions;
 
   /// Update the [CapturedScope] object corresponding to
   /// this node if any variables are captured.
@@ -202,7 +204,7 @@
       ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ variable,
       {bool onlyForRtiChecks = false}) {
     assert(variable is ir.VariableDeclaration ||
-        variable is TypeParameterTypeWithContext);
+        variable is TypeVariableTypeWithContext);
     if (_isInsideClosure && !_inCurrentContext(variable)) {
       // If the element is not declared in the current function and the element
       // is not the closure itself we need to mark the element as free variable.
@@ -230,33 +232,29 @@
   void visitTypeParameter(ir.TypeParameter typeParameter) {
     if (_addTypeChecks) {
       ir.TreeNode context = _executableContext;
+      TypeVariableTypeWithContext typeVariable =
+          new TypeVariableTypeWithContext(
+              new ir.TypeParameterType(typeParameter),
+              typeParameter.parent.parent);
       if (_isInsideClosure && context is ir.Procedure && context.isFactory) {
         // This is a closure in a factory constructor.  Since there is no
         // [:this:], we have to mark the type arguments as free variables to
         // capture them in the closure.
-        _useTypeVariableAsLocal(new ir.TypeParameterType(typeParameter));
+        _useTypeVariableAsLocal(typeVariable);
       }
 
-      if (_executableContext is ir.Member &&
-          _executableContext is! ir.Field &&
-          _hasThisLocal) {
+      if (_executableContext is ir.Member && _executableContext is! ir.Field) {
         // In checked mode, using a type variable in a type annotation may lead
         // to a runtime type check that needs to access the type argument and
         // therefore the closure needs a this-element, if it is not in a field
         // initializer; field initializers are evaluated in a context where
         // the type arguments are available in locals.
 
-        // TODO(efortuna): This is not correct for the case of type variables on
-        // methods. For example, the code:
-        //     class Foo<T> {
-        //         int bar<E>(...) {
-        //             ...use of E...
-        //         }
-        //     }
-        // We do not need the `this` variable in this case to use E.
-        // Add code to distinguish between this case and the case of a class
-        // type variable (like T, where we need `this`).
-        _registerNeedsThis();
+        if (_hasThisLocal) {
+          _registerNeedsThis();
+        } else {
+          _useTypeVariableAsLocal(typeVariable);
+        }
       }
     }
   }
@@ -423,9 +421,9 @@
   /// context.
   bool _inCurrentContext(ir.Node variable) {
     assert(variable is ir.VariableDeclaration ||
-        variable is TypeParameterTypeWithContext);
-    if (variable is TypeParameterTypeWithContext) {
-      return variable.memberContext == _executableContext;
+        variable is TypeVariableTypeWithContext);
+    if (variable is TypeVariableTypeWithContext) {
+      return variable.context == _executableContext;
     }
     ir.TreeNode node = variable;
     while (node != _outermostNode && node != _executableContext) {
@@ -461,7 +459,14 @@
 
   @override
   visitTypeParameterType(ir.TypeParameterType type) {
-    _analyzeType(type);
+    _analyzeTypeVariable(type);
+  }
+
+  @override
+  visitTypeLiteral(ir.TypeLiteral node) {
+    if (node.type is ir.TypeParameterType) {
+      _analyzeTypeVariable(node.type, onlyIfNeedsRti: false);
+    }
   }
 
   /// Returns true if the node is a field, or a constructor (factory or
@@ -471,22 +476,44 @@
       node is ir.Field ||
       (node is ir.Procedure && node.isFactory);
 
-  void _analyzeType(ir.TypeParameterType type) {
+  void _analyzeTypeVariable(ir.TypeParameterType type,
+      {bool onlyIfNeedsRti: true}) {
     if (_outermostNode is ir.Member) {
-      ir.Member outermostMember = _outermostNode;
-      if (_isFieldOrConstructor(_outermostNode)) {
-        _useTypeVariableAsLocal(type, onlyForRtiChecks: true);
-      } else if (outermostMember.isInstanceMember) {
-        _registerNeedsThis(onlyIfNeedsRti: true);
+      TypeVariableTypeWithContext typeVariable =
+          new TypeVariableTypeWithContext(type, _outermostNode);
+      switch (typeVariable.kind) {
+        case TypeVariableKind.cls:
+          if (_isFieldOrConstructor(_outermostNode)) {
+            // Class type variable used in a field or constructor.
+            _useTypeVariableAsLocal(typeVariable,
+                onlyForRtiChecks: onlyIfNeedsRti);
+          } else {
+            // Class type variable used in a method.
+            _registerNeedsThis(onlyIfNeedsRti: onlyIfNeedsRti);
+          }
+          break;
+        case TypeVariableKind.method:
+        case TypeVariableKind.local:
+          _useTypeVariableAsLocal(typeVariable,
+              onlyForRtiChecks: onlyIfNeedsRti);
+          break;
+        case TypeVariableKind.function:
+        // The type variable is a function type variable, like `T` in
+        //
+        //     List<void Function<T>(T)> list;
+        //
+        // which doesn't correspond to a captured local variable.
       }
     }
   }
 
   /// If [onlyForRtiChecks] is true, the variable will be added to a list
   /// indicating it *may* be used only if runtime type information is checked.
-  void _useTypeVariableAsLocal(ir.TypeParameterType type,
-      {bool onlyForRtiChecks = false}) {
-    _markVariableAsUsed(new TypeParameterTypeWithContext(type, _outermostNode),
-        onlyForRtiChecks: onlyForRtiChecks);
+  void _useTypeVariableAsLocal(TypeVariableTypeWithContext typeVariable,
+      {bool onlyForRtiChecks: false}) {
+    if (typeVariable.kind != TypeVariableKind.cls && !_options.strongMode) {
+      return;
+    }
+    _markVariableAsUsed(typeVariable, onlyForRtiChecks: onlyForRtiChecks);
   }
 }
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index e9b84a1..df8f603 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -9,7 +9,6 @@
 import '../elements/names.dart';
 import '../elements/types.dart';
 import '../kernel/indexed.dart';
-import 'closure.dart' show KernelClosureClassInfo;
 
 /// Map from 'frontend' to 'backend' elements.
 ///
@@ -522,21 +521,27 @@
 }
 
 class JClosureCallMethod extends JMethod {
-  JClosureCallMethod(KernelClosureClassInfo closureClassInfo,
+  JClosureCallMethod(ClassEntity enclosingClass,
       ParameterStructure parameterStructure, AsyncMarker asyncMarker)
-      : super(
-            closureClassInfo.closureClassEntity.library,
-            closureClassInfo.closureClassEntity,
-            Names.call,
-            parameterStructure,
-            asyncMarker,
-            isStatic: false,
-            isExternal: false,
-            isAbstract: false);
+      : super(enclosingClass.library, enclosingClass, Names.call,
+            parameterStructure, asyncMarker,
+            isStatic: false, isExternal: false, isAbstract: false);
 
   String get _kind => 'closure_call';
 }
 
+/// A method that returns the signature of the Dart closure/tearoff that this
+/// method's parent class is representing.
+class JSignatureMethod extends JMethod {
+  JSignatureMethod(LibraryEntity enclosingLibrary, ClassEntity enclosingClass,
+      ParameterStructure parameterStructure, AsyncMarker asyncMarker)
+      : super(enclosingLibrary, enclosingClass, const PublicName('\$signature'),
+            parameterStructure, asyncMarker,
+            isStatic: false, isExternal: false, isAbstract: false);
+
+  String get _kind => 'signature';
+}
+
 class JTypeVariable extends IndexedTypeVariable {
   final Entity typeDeclaration;
   final String name;
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 55bda1b..17b9935 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -36,6 +36,7 @@
 import '../kernel/kernel_strategy.dart';
 import '../kernel/kelements.dart';
 import '../native/behavior.dart';
+import '../options.dart';
 import '../ssa/ssa.dart';
 import '../types/types.dart';
 import '../universe/class_set.dart';
@@ -74,8 +75,8 @@
     _commonElements = _elementMap.commonElements;
     _closureDataLookup = new KernelClosureConversionTask(_compiler.measurer,
         _elementMap, _globalLocalsMap, _compiler.options.enableTypeAssertions);
-    JsClosedWorldBuilder closedWorldBuilder =
-        new JsClosedWorldBuilder(_elementMap, _closureDataLookup);
+    JsClosedWorldBuilder closedWorldBuilder = new JsClosedWorldBuilder(
+        _elementMap, _closureDataLookup, _compiler.options);
     return closedWorldBuilder._convertClosedWorld(
         closedWorld, strategy.closureModels);
   }
@@ -186,8 +187,10 @@
       <ClassEntity, ClassHierarchyNode>{};
   final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{};
   final KernelClosureConversionTask _closureConversionTask;
+  final CompilerOptions _options;
 
-  JsClosedWorldBuilder(this._elementMap, this._closureConversionTask);
+  JsClosedWorldBuilder(
+      this._elementMap, this._closureConversionTask, this._options);
 
   ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
   CommonElements get _commonElements => _elementMap.commonElements;
@@ -264,45 +267,66 @@
     Iterable<MemberEntity> processedMembers =
         map.toBackendMemberSet(closedWorld.processedMembers);
 
-    RuntimeTypesNeedImpl kernelRtiNeed = closedWorld.rtiNeed;
-    Set<ir.Node> localFunctionsNodesNeedingSignature = new Set<ir.Node>();
-    for (KLocalFunction localFunction
-        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);
-    }
+    RuntimeTypesNeed rtiNeed;
+    // ignore: unused_local_variable
+    Iterable<FunctionEntity> callMethods;
 
-    Set<ClassEntity> classesNeedingTypeArguments =
-        map.toBackendClassSet(kernelRtiNeed.classesNeedingTypeArguments);
-    Iterable<FunctionEntity> callMethods =
-        _closureConversionTask.createClosureEntities(
-            this,
-            map.toBackendMemberMap(closureModels, identity),
-            localFunctionsNodesNeedingSignature,
-            classesNeedingTypeArguments);
+    if (_options.disableRtiOptimization) {
+      rtiNeed = new TrivialRuntimeTypesNeed();
+      callMethods = _closureConversionTask.createClosureEntities(
+          this, map.toBackendMemberMap(closureModels, identity),
+          localFunctionNeedsSignature: (_) => true,
+          classNeedsTypeArguments: (_) => true,
+          methodNeedsTypeArguments: (_) => true,
+          localFunctionNeedsTypeArguments: (_) => true);
+    } else {
+      RuntimeTypesNeedImpl kernelRtiNeed = closedWorld.rtiNeed;
+      Set<ir.Node> localFunctionsNodesNeedingSignature = new Set<ir.Node>();
+      for (KLocalFunction localFunction
+          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);
+      }
 
-    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);
-    }
+      Set<ClassEntity> classesNeedingTypeArguments =
+          map.toBackendClassSet(kernelRtiNeed.classesNeedingTypeArguments);
 
-    RuntimeTypesNeed rtiNeed = _convertRuntimeTypesNeed(
-        map,
-        backendUsage,
-        kernelRtiNeed,
-        callMethodsNeedingSignature,
-        callMethodsNeedingTypeArguments,
-        classesNeedingTypeArguments);
+      Set<FunctionEntity> methodsNeedingTypeArguments =
+          map.toBackendFunctionSet(kernelRtiNeed.methodsNeedingTypeArguments);
+
+      callMethods = _closureConversionTask.createClosureEntities(
+          this, map.toBackendMemberMap(closureModels, identity),
+          localFunctionNeedsSignature:
+              localFunctionsNodesNeedingSignature.contains,
+          classNeedsTypeArguments: classesNeedingTypeArguments.contains,
+          methodNeedsTypeArguments: methodsNeedingTypeArguments.contains,
+          localFunctionNeedsTypeArguments:
+              localFunctionsNodesNeedingTypeArguments.contains);
+
+      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);
+      }
+
+      rtiNeed = _convertRuntimeTypesNeed(
+          map,
+          backendUsage,
+          kernelRtiNeed,
+          callMethodsNeedingSignature,
+          callMethodsNeedingTypeArguments,
+          classesNeedingTypeArguments,
+          methodsNeedingTypeArguments);
+    }
 
     NoSuchMethodDataImpl oldNoSuchMethodData = closedWorld.noSuchMethodData;
     NoSuchMethodData noSuchMethodData = new NoSuchMethodDataImpl(
@@ -324,7 +348,10 @@
         classSets: _classSets,
         implementedClasses: implementedClasses,
         liveNativeClasses: liveNativeClasses,
-        liveInstanceMembers: liveInstanceMembers..addAll(callMethods),
+        // TODO(johnniwinther): Include the call method when we can also
+        // represent the synthesized call methods for static and instance method
+        // closurizations.
+        liveInstanceMembers: liveInstanceMembers /*..addAll(callMethods)*/,
         assignedInstanceMembers: assignedInstanceMembers,
         processedMembers: processedMembers,
         mixinUses: mixinUses,
@@ -474,15 +501,14 @@
       RuntimeTypesNeedImpl rtiNeed,
       List<FunctionEntity> callMethodsNeedingSignature,
       List<FunctionEntity> callMethodsNeedingTypeArguments,
-      Set<ClassEntity> classesNeedingTypeArguments) {
+      Set<ClassEntity> classesNeedingTypeArguments,
+      Set<FunctionEntity> methodsNeedingTypeArguments) {
     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);
+        map.toBackendClassSet(rtiNeed.classesUsingTypeVariableLiterals);
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
         backendUsage,
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index 0117c71..f2641c6 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) => add(literal);
+  void visitIntLiteral(ir.IntLiteral literal) {}
 
   @override
-  void visitDoubleLiteral(ir.DoubleLiteral literal) => add(literal);
+  void visitDoubleLiteral(ir.DoubleLiteral literal) {}
 
   @override
-  void visitBoolLiteral(ir.BoolLiteral literal) => add(literal);
+  void visitBoolLiteral(ir.BoolLiteral literal) {}
 
   @override
-  void visitStringLiteral(ir.StringLiteral literal) => add(literal);
+  void visitStringLiteral(ir.StringLiteral literal) {}
 
   @override
   void visitSymbolLiteral(ir.SymbolLiteral literal) => add(literal);
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 2d256cc..097def4 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -255,6 +255,10 @@
   // A field corresponding to a captured variable in the closure. It does not
   // have a corresponding ir.Node.
   closureField,
+  // A method that describes the type of a function (in this case the type of
+  // the closure class. It does not have a corresponding ir.Node or a method
+  // body.
+  signature,
 }
 
 /// Definition information for a [MemberEntity].
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index c212e70..c9e1de2 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -2439,6 +2439,22 @@
       closureEntity = new JLocal('', localsMap.currentMember);
     }
 
+    FunctionEntity callMethod = new JClosureCallMethod(
+        classEntity, _getParameterStructure(node), getAsyncMarker(node));
+    _nestedClosureMap
+        .putIfAbsent(member, () => <FunctionEntity>[])
+        .add(callMethod);
+    // We need create the type variable here - before we try to make local
+    // variables from them (in `JsScopeInfo.from` called through
+    // `KernelClosureClassInfo.fromScopeInfo` below).
+    int index = 0;
+    for (ir.TypeParameter typeParameter in node.typeParameters) {
+      _typeVariableMap[typeParameter] = _typeVariables.register(
+          createTypeVariable(callMethod, typeParameter.name, index),
+          new TypeVariableData(typeParameter));
+      index++;
+    }
+
     KernelClosureClassInfo closureClassInfo =
         new KernelClosureClassInfo.fromScopeInfo(
             classEntity,
@@ -2452,18 +2468,11 @@
     _buildClosureClassFields(closureClassInfo, member, memberThisType, info,
         localsMap, recordFieldsVisibleInScope, memberMap);
 
-    FunctionEntity callMethod = new JClosureCallMethod(
-        closureClassInfo, _getParameterStructure(node), getAsyncMarker(node));
-    _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++;
+    if (options.addMethodSignatures) {
+      _constructSignatureMethod(closureClassInfo, memberMap, node,
+          memberThisType, location, typeVariableAccess);
     }
+
     _members.register<IndexedFunction, FunctionData>(
         callMethod,
         new ClosureFunctionData(
@@ -2543,7 +2552,7 @@
               fieldNumber);
           fieldNumber++;
         }
-      } else if (variable is TypeParameterTypeWithContext) {
+      } else if (variable is TypeVariableTypeWithContext) {
         _constructClosureField(
             localsMap.getLocalTypeVariable(variable.type, this),
             closureClassInfo,
@@ -2602,6 +2611,32 @@
     return true;
   }
 
+  void _constructSignatureMethod(
+      KernelClosureClassInfo closureClassInfo,
+      Map<String, MemberEntity> memberMap,
+      ir.FunctionNode closureSourceNode,
+      InterfaceType memberThisType,
+      SourceSpan location,
+      ClassTypeVariableAccess typeVariableAccess) {
+    FunctionEntity signatureMethod = new JSignatureMethod(
+        closureClassInfo.closureClassEntity.library,
+        closureClassInfo.closureClassEntity,
+        // SignatureMethod takes no arguments.
+        const ParameterStructure(0, 0, const [], 0),
+        getAsyncMarker(closureSourceNode));
+    _members.register<IndexedFunction, FunctionData>(
+        signatureMethod,
+        new SignatureFunctionData(
+            new SpecialMemberDefinition(signatureMethod,
+                closureSourceNode.parent, MemberKind.signature),
+            memberThisType,
+            null,
+            closureSourceNode.typeParameters,
+            typeVariableAccess));
+    memberMap[signatureMethod.name] =
+        closureClassInfo.signatureMethod = signatureMethod;
+  }
+
   _constructClosureField(
       Local capturedLocal,
       KernelClosureClassInfo closureClassInfo,
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 37d97ef..8d9f0d6 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -644,6 +644,43 @@
   }
 }
 
+class SignatureFunctionData implements FunctionData {
+  final FunctionType functionType;
+  final MemberDefinition definition;
+  final InterfaceType memberThisType;
+  final ClassTypeVariableAccess classTypeVariableAccess;
+  final List<ir.TypeParameter> typeParameters;
+
+  SignatureFunctionData(this.definition, this.memberThisType, this.functionType,
+      this.typeParameters, this.classTypeVariableAccess);
+
+  FunctionType getFunctionType(covariant KernelToElementMapBase elementMap) {
+    return functionType;
+  }
+
+  List<TypeVariableType> getFunctionTypeVariables(
+      KernelToElementMap elementMap) {
+    return typeParameters
+        .map<TypeVariableType>((ir.TypeParameter typeParameter) {
+      return elementMap.getDartType(new ir.TypeParameterType(typeParameter));
+    }).toList();
+  }
+
+  void forEachParameter(KernelToElementMapForBuilding elementMap,
+      void f(DartType type, String name, ConstantValue defaultValue)) {
+    throw new UnimplementedError('SignatureData.forEachParameter');
+  }
+
+  @override
+  Iterable<ConstantValue> getMetadata(KernelToElementMap elementMap) {
+    return const <ConstantValue>[];
+  }
+
+  InterfaceType getMemberThisType(KernelToElementMapForBuilding elementMap) {
+    return memberThisType;
+  }
+}
+
 abstract class ConstructorData extends FunctionData {
   ConstantConstructor getConstructorConstant(
       KernelToElementMapBase elementMap, ConstructorEntity constructor);
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 2146eba..f58417e 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -248,7 +248,7 @@
         WorldImpact worldImpact =
             _impactTransformer.transformResolutionImpact(impact);
         if (impactCache != null) {
-          impactCache[element] = impact;
+          impactCache[element] = worldImpact;
         }
         return worldImpact;
       });
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index b0e0610..e79d5da 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -1657,7 +1657,10 @@
     assert(rootLibrary != null);
   }
 
-  bool containsLibrary(Uri uri) => getLibrary(uri) != null;
+  bool containsLibrary(Uri uri) {
+    var lib = getLibrary(uri);
+    return lib != null && _newLibraries.contains(lib);
+  }
 
   LibraryEntity getLibrary(Uri uri) => worldBuilder.lookupLibrary(uri);
 
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 26c7d71..129af4d 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -259,6 +259,12 @@
   /// This is an experimental feature.
   final String experimentalAllocationsPath;
 
+  /// Add signatures to closures that return the type of the original closure
+  /// call. Currently hidden behind a flag because this interacts with generic
+  /// function types and strong mode, hitting some edge cases that have not yet
+  /// been implemented.
+  final bool addMethodSignatures;
+
   // -------------------------------------------------
   // Options for deprecated features
   // -------------------------------------------------
@@ -336,6 +342,7 @@
         sourceMapUri: _extractUriOption(options, '--source-map='),
         strips: _extractCsvOption(options, '--force-strip='),
         strongMode: _hasOption(options, Flags.strongMode),
+        addMethodSignatures: _hasOption(options, Flags.addMethodSignatures),
         testMode: _hasOption(options, Flags.testMode),
         trustJSInteropTypeAnnotations:
             _hasOption(options, Flags.trustJSInteropTypeAnnotations),
@@ -403,6 +410,7 @@
       Uri sourceMapUri: null,
       List<String> strips: const [],
       bool strongMode: false,
+      bool addMethodSignatures: false,
       bool testMode: false,
       bool trustJSInteropTypeAnnotations: false,
       bool trustPrimitives: false,
@@ -485,6 +493,7 @@
         sourceMapUri: sourceMapUri,
         strips: strips,
         strongMode: strongMode,
+        addMethodSignatures: addMethodSignatures,
         testMode: testMode,
         trustJSInteropTypeAnnotations: trustJSInteropTypeAnnotations,
         trustPrimitives: trustPrimitives,
@@ -539,6 +548,7 @@
       this.sourceMapUri: null,
       this.strips: const [],
       this.strongMode: false,
+      this.addMethodSignatures: false,
       this.testMode: false,
       this.trustJSInteropTypeAnnotations: false,
       this.trustPrimitives: false,
@@ -601,6 +611,7 @@
       sourceMapUri,
       strips,
       strongMode,
+      addMethodSignatures,
       testMode,
       trustJSInteropTypeAnnotations,
       trustPrimitives,
@@ -671,6 +682,7 @@
         sourceMapUri: sourceMapUri ?? options.sourceMapUri,
         strips: strips ?? options.strips,
         strongMode: strongMode ?? options.strongMode,
+        addMethodSignatures: addMethodSignatures ?? options.addMethodSignatures,
         testMode: testMode ?? options.testMode,
         trustJSInteropTypeAnnotations: trustJSInteropTypeAnnotations ??
             options.trustJSInteropTypeAnnotations,
diff --git a/pkg/compiler/lib/src/resolution/deferred_load.dart b/pkg/compiler/lib/src/resolution/deferred_load.dart
index 04e4fbf..5824e16 100644
--- a/pkg/compiler/lib/src/resolution/deferred_load.dart
+++ b/pkg/compiler/lib/src/resolution/deferred_load.dart
@@ -15,6 +15,7 @@
         AstElement,
         AccessorElement,
         ClassElement,
+        ConstructorElement,
         Element,
         ExportElement,
         ImportElement,
@@ -145,6 +146,11 @@
     TreeElements treeElements = element.resolvedAst.elements;
     assert(treeElements != null);
 
+    Set<ast.Node> metadataNodes = element.implementation.metadata
+        .map((m) => m.node)
+        .toSet()
+          ..addAll(element.declaration.metadata.map((m) => m.node));
+
     // TODO(johnniwinther): Add only expressions that are actually needed.
     // Currently we have some noise here: Some potential expressions are
     // seen that should never be added (for instance field initializers
@@ -154,6 +160,7 @@
     // See dartbug.com/26406 for context.
     treeElements
         .forEachConstantNode((ast.Node node, ConstantExpression expression) {
+      if (metadataNodes.contains(node)) return;
       if (compiler.serialization.isDeserialized(element)) {
         if (!expression.isPotential) {
           // Enforce evaluation of [expression].
@@ -366,4 +373,10 @@
     assert(result != null);
     return result;
   }
+
+  bool ignoreEntityInDump(covariant Element element) =>
+      // origin element will already be dumped.
+      element.isPatch ||
+      // redirecting factories are not visible to the kernel ir
+      element is ConstructorElement && element.isRedirectingFactory;
 }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 424bc55..5c6a96f 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -228,6 +228,23 @@
         case MemberKind.closureField:
           failedAt(targetElement, "Unexpected closure field: $targetElement");
           break;
+        case MemberKind.signature:
+          ir.Node target = definition.node;
+          ir.FunctionNode originalClosureNode;
+          if (target is ir.Procedure) {
+            originalClosureNode = target.function;
+          } else if (target is ir.FunctionExpression) {
+            originalClosureNode = target.function;
+          } else if (target is ir.FunctionDeclaration) {
+            originalClosureNode = target.function;
+          } else {
+            failedAt(
+                targetElement,
+                "Unexpected function signature: "
+                "$targetElement inside a non-closure: $target");
+          }
+          buildMethodSignature(originalClosureNode);
+          break;
       }
       assert(graph.isValid());
 
@@ -482,8 +499,8 @@
       // Create the runtime type information, if needed.
       bool hasRtiInput = closedWorld.rtiNeed.classNeedsRtiField(cls);
       if (hasRtiInput) {
-        // Read the values of the type arguments and create a HTypeInfoExpression
-        // to set on the newly create object.
+        // Read the values of the type arguments and create a
+        // HTypeInfoExpression to set on the newly created object.
         List<HInstruction> typeArguments = <HInstruction>[];
         InterfaceType thisType =
             _elementMap.elementEnvironment.getThisType(cls);
@@ -870,6 +887,35 @@
     localsHandler.scopeInfo = oldScopeInfo;
   }
 
+  /// Constructs a special signature function for a closure. It is unique in
+  /// that no corresponding ir.Node actually exists for it. We just use the
+  /// targetElement.
+  void buildMethodSignature(ir.FunctionNode originalClosureNode) {
+    openFunction(targetElement);
+    List<HInstruction> typeArguments = <HInstruction>[];
+
+    // Add function type variables.
+    FunctionType functionType =
+        _elementMap.getFunctionType(originalClosureNode);
+    functionType.forEachTypeVariable((TypeVariableType typeVariableType) {
+      DartType result = localsHandler.substInContext(typeVariableType);
+      HInstruction argument =
+          typeBuilder.analyzeTypeArgument(result, sourceElement);
+      typeArguments.add(argument);
+    });
+    push(new HTypeInfoExpression(
+        TypeInfoExpressionKind.COMPLETE,
+        _elementMap.getFunctionType(originalClosureNode),
+        typeArguments,
+        commonMasks.functionType));
+    HInstruction value = pop();
+    close(new HReturn(
+            value, _sourceInformationBuilder.buildReturn(originalClosureNode)))
+        .addSuccessor(graph.exit);
+
+    closeFunction();
+  }
+
   /// Builds generative constructor body.
   void buildConstructorBody(ir.Constructor constructor) {
     openFunction(
@@ -2566,7 +2612,8 @@
           // there is no prefix the old FE wouldn't treat this in any special
           // way. Also, if the prefix points to a constant in the main output
           // unit, the old FE would still generate a deferred wrapper here.
-          if (!unit.isMainOutput) {
+          if (!compiler.backend.outputUnitData
+              .hasOnlyNonDeferredImportPaths(targetElement, field)) {
             stack.add(graph.addDeferredConstant(
                 value, unit, sourceInformation, compiler, closedWorld));
           } else {
@@ -3003,7 +3050,12 @@
     }
 
     if (isFixedListConstructorCall) {
-      assert(arguments.length == 1);
+      assert(
+          arguments.length == 1,
+          failedAt(
+              function,
+              "Unexpected arguments. "
+              "Expected 1 argument, actual: $arguments."));
       HInstruction lengthInput = arguments.first;
       if (!lengthInput.isNumber(closedWorld)) {
         HTypeConversion conversion = new HTypeConversion(
@@ -3816,6 +3868,22 @@
   }
 
   @override
+  void visitInstantiation(ir.Instantiation node) {
+    var arguments = <HInstruction>[];
+    node.expression.accept(this);
+    arguments.add(pop());
+    for (ir.DartType type in node.typeArguments) {
+      HInstruction instruction = typeBuilder.analyzeTypeArgument(
+          _elementMap.getDartType(type), sourceElement);
+      arguments.add(instruction);
+    }
+    Selector selector =
+        new Selector.genericInstantiation(node.typeArguments.length);
+    _pushDynamicInvocation(node, commonMasks.functionType, selector, arguments,
+        null /*_sourceInformationBuilder.?*/);
+  }
+
+  @override
   void visitMethodInvocation(ir.MethodInvocation invocation) {
     invocation.receiver.accept(this);
     HInstruction receiver = pop();
diff --git a/pkg/compiler/lib/src/universe/call_structure.dart b/pkg/compiler/lib/src/universe/call_structure.dart
index b05f853..f20d529 100644
--- a/pkg/compiler/lib/src/universe/call_structure.dart
+++ b/pkg/compiler/lib/src/universe/call_structure.dart
@@ -19,6 +19,9 @@
   static const CallStructure TWO_ARGS = const CallStructure.unnamed(2);
   static const CallStructure THREE_ARGS = const CallStructure.unnamed(3);
 
+  /// The number of type arguments of the call.
+  final int typeArgumentCount;
+
   /// The numbers of arguments of the call. Includes named arguments.
   final int argumentCount;
 
@@ -28,9 +31,6 @@
   /// The number of positional argument of the call.
   int get positionalArgumentCount => argumentCount;
 
-  /// The number of type argument of the call.
-  final int typeArgumentCount;
-
   const CallStructure.unnamed(this.argumentCount, [this.typeArgumentCount = 0]);
 
   factory CallStructure(int argumentCount,
diff --git a/pkg/compiler/lib/src/universe/member_usage.dart b/pkg/compiler/lib/src/universe/member_usage.dart
index 9248c0b..de15737 100644
--- a/pkg/compiler/lib/src/universe/member_usage.dart
+++ b/pkg/compiler/lib/src/universe/member_usage.dart
@@ -203,7 +203,14 @@
   bool hasInvoke = false;
   bool hasRead = false;
 
-  _FunctionUsage(FunctionEntity function) : super.internal(function);
+  _FunctionUsage(FunctionEntity function) : super.internal(function) {
+    if (function is JSignatureMethod) {
+      // We mark signature methods as "always used" to prevent them from being
+      // optimized away.
+      // TODO(johnniwinther): Make this a part of the regular enqueueing.
+      invoke();
+    }
+  }
 
   EnumSet<MemberUse> get _originalUse =>
       entity.isInstanceMember ? MemberUses.ALL_INSTANCE : MemberUses.ALL_STATIC;
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index 6332157..e03e640 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -23,6 +23,7 @@
   static const SelectorKind CALL = const SelectorKind('call', 2);
   static const SelectorKind OPERATOR = const SelectorKind('operator', 3);
   static const SelectorKind INDEX = const SelectorKind('index', 4);
+  static const SelectorKind SPECIAL = const SelectorKind('special', 5);
 
   int get index => hashCode;
 
@@ -33,7 +34,8 @@
     SETTER,
     CALL,
     OPERATOR,
-    INDEX
+    INDEX,
+    SPECIAL
   ];
 }
 
@@ -47,6 +49,7 @@
   int get argumentCount => callStructure.argumentCount;
   int get namedArgumentCount => callStructure.namedArgumentCount;
   int get positionalArgumentCount => callStructure.positionalArgumentCount;
+  int get typeArgumentCount => callStructure.typeArgumentCount;
   List<String> get namedArguments => callStructure.namedArguments;
 
   String get name => memberName.text;
@@ -182,6 +185,11 @@
   factory Selector.callDefaultConstructor() => new Selector(
       SelectorKind.CALL, const PublicName(''), CallStructure.NO_ARGS);
 
+  factory Selector.genericInstantiation(int typeArguments) => new Selector(
+      SelectorKind.SPECIAL,
+      Names.genericInstantiation,
+      new CallStructure(0, null, typeArguments));
+
   bool get isGetter => kind == SelectorKind.GETTER;
   bool get isSetter => kind == SelectorKind.SETTER;
   bool get isCall => kind == SelectorKind.CALL;
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 330d84f..8b1269f 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -25,6 +25,7 @@
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/runtime_types.dart';
 import '../js_model/locals.dart';
+import '../js_model/elements.dart' show JSignatureMethod;
 import '../kernel/element_map_impl.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../options.dart';
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index 08601ea..fa487cb 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -254,7 +254,7 @@
   closedWorld.getClassHierarchyNode(null);
   closedWorld.getClassSet(null);
   closedWorld.haveAnyCommonSubtypes(null, null);
-  typeGraphInferrer.getCallersOf(null);
+  typeGraphInferrer.getCallersOfForTesting(null);
   dart_types.Types.sorted(null);
   new dart_types.Types(null).copy(null);
 }
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index a91d346..d1353b1 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -1388,7 +1388,10 @@
     assert(callMethod != null, failedAt(cls, "No call method in $cls"));
     assert(_allFunctions == null,
         failedAt(cls, "Function set has already be created."));
-    liveInstanceMembers.add(callMethod);
+    // TODO(johnniwinther): Include the call method when we can also represent
+    // the synthesized call methods for static and instance method
+    // closurizations.
+    //liveInstanceMembers.add(callMethod);
   }
 
   void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
diff --git a/pkg/compiler/testing_dart.json b/pkg/compiler/testing_dart.json
index 3441f2a..428cfd2 100644
--- a/pkg/compiler/testing_dart.json
+++ b/pkg/compiler/testing_dart.json
@@ -15,45 +15,47 @@
 
     "exclude": [
       "^tests/compiler/dart2js/codegen_helper\\.dart",
+      "^tests/compiler/dart2js/codegen/type_inference8_test\\.dart",
       "^tests/compiler/dart2js/constant_expression_evaluate_test\\.dart",
       "^tests/compiler/dart2js/constant_expression_test\\.dart",
-      "^tests/compiler/dart2js/data/mirrors_helper\\.dart",
       "^tests/compiler/dart2js/data/one_line_dart_program\\.dart",
       "^tests/compiler/dart2js/deferred/inline_restrictions_test\\.dart",
       "^tests/compiler/dart2js/deferred/load_graph_segmentation2_test\\.dart",
       "^tests/compiler/dart2js/deferred/load_graph_segmentation_test\\.dart",
-      "^tests/compiler/dart2js/mirrors/deferred_mirrors_test\\.dart",
       "^tests/compiler/dart2js/deferred/not_in_main_test\\.dart",
       "^tests/compiler/dart2js/in_user_code_test\\.dart",
-      "^tests/compiler/dart2js/jsinterop/world_test\\.dart",
-      "^tests/compiler/dart2js/kernel/class_hierarchy_test\\.dart",
-      "^tests/compiler/dart2js/kernel/closed_world_test\\.dart",
-      "^tests/compiler/dart2js/kernel/visitor_test\\.dart",
-      "^tests/compiler/dart2js/memory_compiler\\.dart",
-      "^tests/compiler/dart2js/old_frontend/message_kind_helper\\.dart",
-      "^tests/compiler/dart2js/old_frontend/metadata_test\\.dart",
-      "^tests/compiler/dart2js/mirrors/mirrors_used_test\\.dart",
-      "^tests/compiler/dart2js/mixin_typevariable_test\\.dart",
-      "^tests/compiler/dart2js/needs_no_such_method_test\\.dart",
-      "^tests/compiler/dart2js/no_such_method_enabled_test\\.dart",
-      "^tests/compiler/dart2js/output_collector\\.dart",
-      "^tests/compiler/dart2js/old_frontend/patch_test\\.dart",
-      "^tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package\\.dart",
-      "^tests/compiler/dart2js/quarantined/http_test\\.dart",
-      "^tests/compiler/dart2js/old_frontend/reexport_handled_test\\.dart",
-      "^tests/compiler/dart2js/old_frontend/resolution_test\\.dart",
-      "^tests/compiler/dart2js/serialization/analysis_test_helper\\.dart",
-      "^tests/compiler/dart2js/serialization/compilation_test_helper\\.dart",
-      "^tests/compiler/dart2js/serialization/duplicate_library_test\\.dart",
-      "^tests/compiler/dart2js/serialization/equivalence_test\\.dart",
-      "^tests/compiler/dart2js/serialization/model_test_helper\\.dart",
-      "^tests/compiler/dart2js/serialization/test_helper\\.dart",
       "^tests/compiler/dart2js/inference/data/super_invoke\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_closure_test\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_const_closure_test\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_test\\.dart",
+      "^tests/compiler/dart2js/inference/type_mask2_test\\.dart",
+      "^tests/compiler/dart2js/jsinterop/world_test\\.dart",
+      "^tests/compiler/dart2js/kernel/class_hierarchy_test\\.dart",
+      "^tests/compiler/dart2js/kernel/closed_world_test\\.dart",
+      "^tests/compiler/dart2js/kernel/visitor_test\\.dart",
+      "^tests/compiler/dart2js/memory_compiler\\.dart",
+      "^tests/compiler/dart2js/mirrors/data/mirrors_helper\\.dart",
+      "^tests/compiler/dart2js/mirrors/deferred_mirrors_test\\.dart",
+      "^tests/compiler/dart2js/mirrors/mirrors_used_test\\.dart",
+      "^tests/compiler/dart2js/mixin_typevariable_test\\.dart",
+      "^tests/compiler/dart2js/needs_no_such_method_test\\.dart",
+      "^tests/compiler/dart2js/no_such_method_enabled_test\\.dart",
+      "^tests/compiler/dart2js/output_collector\\.dart",
+      "^tests/compiler/dart2js/old_frontend/patch_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/message_kind_helper\\.dart",
+      "^tests/compiler/dart2js/old_frontend/metadata_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/reexport_handled_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/resolution_test\\.dart",
+      "^tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package\\.dart",
+      "^tests/compiler/dart2js/quarantined/http_test\\.dart",
+      "^tests/compiler/dart2js/serialization/analysis_test_helper\\.dart",
+      "^tests/compiler/dart2js/serialization/compilation_test_helper\\.dart",
+      "^tests/compiler/dart2js/serialization/duplicate_library_test\\.dart",
+      "^tests/compiler/dart2js/serialization/equivalence_test\\.dart",
+      "^tests/compiler/dart2js/serialization/model_test_helper\\.dart",
+      "^tests/compiler/dart2js/serialization/test_helper\\.dart",
       "^tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper\\.dart",
       "^tests/compiler/dart2js/sourcemaps/diff_view\\.dart",
       "^tests/compiler/dart2js/sourcemaps/html_parts\\.dart",
@@ -69,8 +71,6 @@
       "^tests/compiler/dart2js/subtype_test\\.dart",
       "^tests/compiler/dart2js/subtypeset_test\\.dart",
       "^tests/compiler/dart2js/token_naming_test\\.dart",
-      "^tests/compiler/dart2js/inference/type_inference8_test\\.dart",
-      "^tests/compiler/dart2js/inference/type_mask2_test\\.dart",
       "^tests/compiler/dart2js/type_representation_test\\.dart",
       "^tests/compiler/dart2js/type_substitution_test\\.dart",
       "^tests/compiler/dart2js/type_variable_occurrence_test\\.dart",
diff --git a/pkg/compiler/tool/status_files/update_all.dart b/pkg/compiler/tool/status_files/update_all.dart
new file mode 100644
index 0000000..09310ab
--- /dev/null
+++ b/pkg/compiler/tool/status_files/update_all.dart
@@ -0,0 +1,127 @@
+// 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.
+
+// Script to update the dart2js status lines for all tests running with the
+// $dart2js_with_kernel test configuration.
+
+import 'dart:io';
+import 'package:args/args.dart';
+import 'update_from_log.dart' as update_script;
+
+const List<String> strongSuites = const <String>[
+  'language_2',
+  'corelib_2',
+];
+
+const List<String> nonStrongSuites = const <String>[
+  'dart2js_native',
+  'dart2js_extra',
+  'language',
+  'corelib',
+  'html',
+];
+
+main(List<String> args) {
+  ArgParser argParser = new ArgParser(allowTrailingOptions: true)
+    ..addFlag('with-fast-startup')
+    ..addFlag('fast-startup')
+    ..addFlag('strong')
+    ..addFlag('with-checked-mode')
+    ..addFlag('checked-mode')
+    ..addFlag('checked');
+  ArgResults argResults = argParser.parse(args);
+  bool fastStartup =
+      argResults['with-fast-startup'] || argResults['fast-startup'];
+  bool strong = argResults['strong'];
+  bool checkedMode = argResults['with-checked-mode'] ||
+      argResults['checked-mode'] ||
+      argResults['checked'];
+  List<String> suites = argResults.rest;
+  if (suites.isEmpty) {
+    if (strong) {
+      suites = strongSuites;
+    } else {
+      suites = nonStrongSuites;
+    }
+    if (Platform.isWindows) {
+      // TODO(johnniwinther): Running drt seems to be broken on Windows.
+      suites = new List<String>.from(suites)..remove('html');
+    }
+  } else {
+    bool failure = false;
+    for (String suite in suites) {
+      if (strongSuites.contains(suite) && nonStrongSuites.contains(suite)) {
+        print("Unknown suite '$suite'");
+        failure = true;
+      }
+    }
+    if (failure) {
+      exit(1);
+    }
+  }
+
+  Directory tmp = Directory.systemTemp.createTempSync('update_all');
+
+  String python = Platform.isWindows ? 'python.exe' : 'python';
+
+  updateSuiteWithFlags(
+      String name, String suite, String runtime, List<String> args) {
+    if (strong) {
+      name = "$name-strong";
+      args.add('--strong');
+    }
+
+    print("  - $name tests");
+    List<String> testArgs = [
+      './tools/test.py',
+      '-m',
+      'release',
+      '-c',
+      'dart2js',
+      '-r',
+      runtime,
+      '--dart2js-batch',
+      '--dart2js-with-kernel'
+    ];
+    testArgs.addAll(args);
+    testArgs.add(suite);
+    String temp = '${tmp.path}/$suite-$name.txt';
+    ProcessResult result = Process.runSync(python, testArgs);
+    String stdout = result.stdout.toString();
+    new File(temp).writeAsStringSync(stdout);
+    print(temp);
+    update_script.main([name, temp]);
+  }
+
+  updateSuite(String suite) {
+    String runtime = "d8";
+    if (suite == "html") {
+      runtime = "drt";
+    }
+    print("update suite: \u001b[32m$suite\u001b[0m");
+
+    updateSuiteWithFlags(
+        'minified', suite, runtime, ["--minified", "--use-sdk"]);
+    updateSuiteWithFlags('host-checked', suite, runtime, ["--host-checked"]);
+    if (fastStartup) {
+      updateSuiteWithFlags('fast-startup', suite, runtime, ["--fast-startup"]);
+    }
+    if (checkedMode) {
+      updateSuiteWithFlags('checked-mode', suite, runtime, ["--checked"]);
+    }
+  }
+
+  print('build create_sdk');
+  ProcessResult result = Process
+      .runSync(python, ['./tools/build.py', '-m', 'release', 'create_sdk']);
+  if (result.exitCode != 0) {
+    print(result.stdout);
+    print(result.stderr);
+    exit(1);
+  }
+
+  suites.forEach(updateSuite);
+
+  tmp.deleteSync(recursive: true);
+}
diff --git a/pkg/compiler/tool/status_files/update_all.sh b/pkg/compiler/tool/status_files/update_all.sh
deleted file mode 100755
index 96453a2..0000000
--- a/pkg/compiler/tool/status_files/update_all.sh
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-# Script to update the dart2js status lines for all tests running with the
-# $dart2js_with_kernel test configuration.
-
-suites=
-
-for arg in "$@"; do
-  case $arg in
-    dart2js_native|dart2js_extra|language|language_2|corelib|corelib_2|html)
-      suites="$suites $arg"
-      ;;
-    --with-fast-startup|--fast-startup)
-      fast_startup=true
-      ;;
-    --strong)
-      strong=true
-      ;;
-    --with-checked-mode|--checked-mode|--checked)
-      checked_mode=true
-      ;;
-    -*)
-      echo "Unknown option '$arg'"
-      exit 1
-      ;;
-    *)
-      echo "Unknown suite '$arg'"
-      exit 1
-      ;;
-  esac
-done
-
-if [ -z "$suites" ]; then
-  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)
-dart="out/ReleaseX64/dart"
-update_script=$(dirname ${BASH_SOURCE[0]})/update_from_log.dart
-binaries_dir=out/ReleaseX64
-
-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"
-  if [ "$suite" == "html" ]; then
-    runtime="drt"
-  fi
-  echo -e "\nupdate suite: $suite"
-  update_suite_with_flags minified $suite "--minified --use-sdk"
-  update_suite_with_flags host-checked $suite "--host-checked"
-  if [ "$fast_startup" = true ]; then
-    update_suite_with_flags fast-startup $suite "--fast-startup"
-  fi
-  if [ "$checked_mode" = true ]; then
-    update_suite_with_flags checked-mode $suite "--checked"
-  fi
-}
-
-
-pushd $repodir > /dev/null
-./tools/build.py -m release create_sdk
-
-for suite in $suites; do
-  update_suite $suite
-done
-
-rm -rf $tmp
-popd > /dev/null
diff --git a/pkg/compiler/tool/status_files/update_from_log.dart b/pkg/compiler/tool/status_files/update_from_log.dart
index af5afdb..3a525cf 100644
--- a/pkg/compiler/tool/status_files/update_from_log.dart
+++ b/pkg/compiler/tool/status_files/update_from_log.dart
@@ -78,7 +78,8 @@
     exit(1);
   }
 
-  var uri = Uri.base.resolve(args[1]);
+  var uri =
+      Uri.base.resolveUri(new Uri.file(args[1], windows: Platform.isWindows));
   var file = new File.fromUri(uri);
   if (!file.existsSync()) {
     print('file not found: $file');
@@ -105,6 +106,10 @@
     if (section?.suite != record.suite) {
       section?.update(globalReason);
       var statusFile = statusFiles[record.suite];
+      if (statusFile == null) {
+        print("No status file for suite '${record.suite}'.");
+        continue;
+      }
       var condition = configurations[mode];
       section = ConfigurationInSuiteSection.create(
           record.suite, mode, statusFile, condition);
diff --git a/pkg/dart_messages/lib/generated/shared_messages.json b/pkg/dart_messages/lib/generated/shared_messages.json
index d53c338..d0e6532 100644
--- a/pkg/dart_messages/lib/generated/shared_messages.json
+++ b/pkg/dart_messages/lib/generated/shared_messages.json
@@ -80,8 +80,6 @@
       "var abstract foo; main(){}",
       "var static foo; main(){}",
       "var external foo; main(){}",
-      "get var foo; main(){}",
-      "set var foo; main(){}",
       "final var foo; main(){}",
       "var var foo; main(){}",
       "const var foo; main(){}",
diff --git a/pkg/dart_messages/lib/shared_messages.dart b/pkg/dart_messages/lib/shared_messages.dart
index 4113fa6..cadf550 100644
--- a/pkg/dart_messages/lib/shared_messages.dart
+++ b/pkg/dart_messages/lib/shared_messages.dart
@@ -198,8 +198,6 @@
         "var abstract foo; main(){}",
         "var static foo; main(){}",
         "var external foo; main(){}",
-        "get var foo; main(){}",
-        "set var foo; main(){}",
         "final var foo; main(){}",
         "var var foo; main(){}",
         "const var foo; main(){}",
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index bb2c765..d08f1e3 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -3898,93 +3898,91 @@
 
   /// Emits code for the `JS(...)` macro.
   JS.Node _emitForeignJS(MethodInvocation node, Element e) {
-    if (isInlineJS(e)) {
-      var args = node.argumentList.arguments;
-      // arg[0] is static return type, used in `RestrictedStaticTypeAnalyzer`
-      var code = args[1];
-      List<Expression> templateArgs;
-      String source;
-      if (code is StringInterpolation) {
-        if (args.length > 2) {
-          throw new ArgumentError(
-              "Can't mix template args and string interpolation in JS calls.");
-        }
-        templateArgs = <Expression>[];
-        source = code.elements.map((element) {
-          if (element is InterpolationExpression) {
-            templateArgs.add(element.expression);
-            return '#';
-          } else {
-            return (element as InterpolationString).value;
-          }
-        }).join();
-      } else {
-        templateArgs = args.skip(2).toList();
-        source = (code as StringLiteral).stringValue;
-      }
+    if (!isInlineJS(e)) return null;
 
-      // TODO(vsm): Constructors in dart:html and friends are trying to
-      // allocate a type defined on window/self, but this often conflicts a
-      // with the generated extension class in scope.  We really should
-      // qualify explicitly in dart:html itself.
-      var constructorPattern = new RegExp("new [A-Z][A-Za-z]+\\(");
-      if (constructorPattern.matchAsPrefix(source) != null) {
-        var containingClass = node.parent;
-        while (
-            containingClass != null && containingClass is! ClassDeclaration) {
-          containingClass = containingClass.parent;
+    var args = node.argumentList.arguments;
+    // arg[0] is static return type, used in `RestrictedStaticTypeAnalyzer`
+    var code = args[1];
+    List<Expression> templateArgs;
+    String source;
+    if (code is StringInterpolation) {
+      if (args.length > 2) {
+        throw new ArgumentError(
+            "Can't mix template args and string interpolation in JS calls.");
+      }
+      templateArgs = <Expression>[];
+      source = code.elements.map((element) {
+        if (element is InterpolationExpression) {
+          templateArgs.add(element.expression);
+          return '#';
+        } else {
+          return (element as InterpolationString).value;
         }
-        if (containingClass is ClassDeclaration &&
-            _extensionTypes.isNativeClass(containingClass.element)) {
-          var constructorName = source.substring(4, source.indexOf('('));
-          var className = containingClass.name.name;
-          if (className == constructorName) {
-            source =
-                source.replaceFirst('new $className(', 'new self.$className(');
-          }
+      }).join();
+    } else {
+      templateArgs = args.skip(2).toList();
+      source = (code as StringLiteral).stringValue;
+    }
+
+    // TODO(vsm): Constructors in dart:html and friends are trying to
+    // allocate a type defined on window/self, but this often conflicts a
+    // with the generated extension class in scope.  We really should
+    // qualify explicitly in dart:html itself.
+    var constructorPattern = new RegExp("new [A-Z][A-Za-z]+\\(");
+    if (constructorPattern.matchAsPrefix(source) != null) {
+      var containingClass = node.parent;
+      while (containingClass != null && containingClass is! ClassDeclaration) {
+        containingClass = containingClass.parent;
+      }
+      if (containingClass is ClassDeclaration &&
+          _extensionTypes.isNativeClass(containingClass.element)) {
+        var constructorName = source.substring(4, source.indexOf('('));
+        var className = containingClass.name.name;
+        if (className == constructorName) {
+          source =
+              source.replaceFirst('new $className(', 'new self.$className(');
         }
       }
+    }
 
-      JS.Expression visitTemplateArg(Expression arg) {
-        if (arg is InvocationExpression) {
-          var e = arg is MethodInvocation
-              ? arg.methodName.staticElement
-              : (arg as FunctionExpressionInvocation).staticElement;
-          if (e?.name == 'getGenericClass' &&
-              e.library.name == 'dart._runtime' &&
-              arg.argumentList.arguments.length == 1) {
-            var typeArg = arg.argumentList.arguments[0];
-            if (typeArg is SimpleIdentifier) {
-              var typeElem = typeArg.staticElement;
-              if (typeElem is TypeDefiningElement &&
-                  typeElem.type is ParameterizedType) {
-                return _emitTopLevelNameNoInterop(typeElem, suffix: '\$');
-              }
+    JS.Expression visitTemplateArg(Expression arg) {
+      if (arg is InvocationExpression) {
+        var e = arg is MethodInvocation
+            ? arg.methodName.staticElement
+            : (arg as FunctionExpressionInvocation).staticElement;
+        if (e?.name == 'getGenericClass' &&
+            e.library.name == 'dart._runtime' &&
+            arg.argumentList.arguments.length == 1) {
+          var typeArg = arg.argumentList.arguments[0];
+          if (typeArg is SimpleIdentifier) {
+            var typeElem = typeArg.staticElement;
+            if (typeElem is TypeDefiningElement &&
+                typeElem.type is ParameterizedType) {
+              return _emitTopLevelNameNoInterop(typeElem, suffix: '\$');
             }
           }
         }
-        return _visitExpression(arg);
       }
-
-      // TODO(rnystrom): The JS() calls are almost never nested, and probably
-      // really shouldn't be, but there are at least a couple of calls in the
-      // HTML library where an argument to JS() is itself a JS() call. If those
-      // go away, this can just assert(!_isInForeignJS).
-      // Inside JS(), type names evaluate to the raw runtime type, not the
-      // wrapped Type object.
-      var wasInForeignJS = _isInForeignJS;
-      _isInForeignJS = true;
-      var jsArgs = templateArgs.map(visitTemplateArg).toList();
-      _isInForeignJS = wasInForeignJS;
-
-      var result = js.parseForeignJS(source).instantiate(jsArgs);
-
-      // `throw` is emitted as a statement by `parseForeignJS`.
-      assert(result is JS.Expression ||
-          result is JS.Throw && node.parent is ExpressionStatement);
-      return result;
+      return _visitExpression(arg);
     }
-    return null;
+
+    // TODO(rnystrom): The JS() calls are almost never nested, and probably
+    // really shouldn't be, but there are at least a couple of calls in the
+    // HTML library where an argument to JS() is itself a JS() call. If those
+    // go away, this can just assert(!_isInForeignJS).
+    // Inside JS(), type names evaluate to the raw runtime type, not the
+    // wrapped Type object.
+    var wasInForeignJS = _isInForeignJS;
+    _isInForeignJS = true;
+    var jsArgs = templateArgs.map(visitTemplateArg).toList();
+    _isInForeignJS = wasInForeignJS;
+
+    var result = js.parseForeignJS(source).instantiate(jsArgs);
+
+    // `throw` is emitted as a statement by `parseForeignJS`.
+    assert(result is JS.Expression ||
+        result is JS.Throw && node.parent is ExpressionStatement);
+    return result;
   }
 
   @override
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_interop.dart b/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
index 768f48e..4e76a27 100644
--- a/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
@@ -71,10 +71,10 @@
     isBuiltinAnnotation(value, '_js_helper', 'Native');
 
 bool isNotNullAnnotation(DartObjectImpl value) =>
-    isBuiltinAnnotation(value, '_js_helper', 'NotNull');
+    isBuiltinAnnotation(value, '_js_helper', '_NotNull');
 
 bool isNullCheckAnnotation(DartObjectImpl value) =>
-    isBuiltinAnnotation(value, '_js_helper', 'NullCheck');
+    isBuiltinAnnotation(value, '_js_helper', '_NullCheck');
 
 /// Returns the name value of the `JSExportName` annotation (when compiling
 /// the SDK), or `null` if there's none. This is used to control the name
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index ca2474d..2c07cf0 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -11,7 +11,6 @@
 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';
 import 'package:kernel/kernel.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/source_maps.dart';
@@ -152,9 +151,7 @@
       .map((s) => stringToCustomUri(s, multiRoots, customScheme))
       .toList();
 
-  var sdkSummaryPath = argResults['dart-sdk-summary'] ??
-      path.join(path.dirname(path.dirname(Platform.resolvedExecutable)), 'lib',
-          '_internal', 'ddc_sdk.dill');
+  var sdkSummaryPath = argResults['dart-sdk-summary'] ?? defaultSdkSummaryPath;
 
   var packageFile =
       argResults['packages'] ?? path.absolute(ddcPath, '..', '..', '.packages');
@@ -219,7 +216,7 @@
 
 JS.Program compileToJSModule(Program p, List<Program> summaries,
     List<Uri> summaryUris, Map<String, String> declaredVariables) {
-  var compiler = new ProgramCompiler(new NativeTypeSet(p, new CoreTypes(p)),
+  var compiler = new ProgramCompiler(new NativeTypeSet(p),
       declaredVariables: declaredVariables);
   return compiler.emitProgram(p, summaries, summaryUris);
 }
@@ -375,3 +372,10 @@
 
   return declaredVariables;
 }
+
+/// The default path of the kernel summary for the Dart SDK.
+final defaultSdkSummaryPath = path.join(
+    path.dirname(path.dirname(Platform.resolvedExecutable)),
+    'lib',
+    '_internal',
+    'ddc_sdk.dill');
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 4f76e3e..f1f7661 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -9,7 +9,6 @@
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart' hide ConstantVisitor;
-import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/type_environment.dart';
 
@@ -22,6 +21,7 @@
 import 'js_typerep.dart';
 import 'kernel_helpers.dart';
 import 'native_types.dart';
+import 'nullable_inference.dart';
 import 'property_model.dart';
 import 'type_table.dart';
 
@@ -188,6 +188,8 @@
 
   final ConstantVisitor _constants;
 
+  NullableInference _nullableInference;
+
   ProgramCompiler(NativeTypeSet nativeTypes,
       {this.emitMetadata: true,
       this.replCompile: false,
@@ -195,24 +197,26 @@
       : _extensionTypes = nativeTypes,
         coreTypes = nativeTypes.coreTypes,
         _constants = new ConstantVisitor(nativeTypes.coreTypes),
-        types = new TypeSchemaEnvironment(
-            nativeTypes.coreTypes, new IncrementalClassHierarchy(), true),
-        _jsArrayClass = nativeTypes.getClass('dart:_interceptors', 'JSArray'),
+        types = new TypeSchemaEnvironment(nativeTypes.coreTypes,
+            new ClassHierarchy.deprecated_incremental(), true),
+        _jsArrayClass =
+            nativeTypes.sdk.getClass('dart:_interceptors', 'JSArray'),
         _asyncStreamIteratorClass =
-            nativeTypes.getClass('dart:async', 'StreamIterator'),
+            nativeTypes.sdk.getClass('dart:async', 'StreamIterator'),
         privateSymbolClass =
-            nativeTypes.getClass('dart:_js_helper', 'PrivateSymbol'),
+            nativeTypes.sdk.getClass('dart:_js_helper', 'PrivateSymbol'),
         linkedHashMapImplClass =
-            nativeTypes.getClass('dart:_js_helper', 'LinkedMap'),
+            nativeTypes.sdk.getClass('dart:_js_helper', 'LinkedMap'),
         identityHashMapImplClass =
-            nativeTypes.getClass('dart:_js_helper', 'IdentityMap'),
+            nativeTypes.sdk.getClass('dart:_js_helper', 'IdentityMap'),
         linkedHashSetImplClass =
-            nativeTypes.getClass('dart:collection', '_HashSet'),
+            nativeTypes.sdk.getClass('dart:collection', '_HashSet'),
         identityHashSetImplClass =
-            nativeTypes.getClass('dart:collection', '_IdentityHashSet'),
+            nativeTypes.sdk.getClass('dart:collection', '_IdentityHashSet'),
         syncIterableClass =
-            nativeTypes.getClass('dart:_js_helper', 'SyncIterable') {
-    _typeRep = new JSTypeRep(types, coreTypes);
+            nativeTypes.sdk.getClass('dart:_js_helper', 'SyncIterable') {
+    _typeRep = new JSTypeRep(types, nativeTypes.sdk);
+    _nullableInference = new NullableInference(_typeRep);
   }
 
   ClassHierarchy get hierarchy => types.hierarchy;
@@ -240,6 +244,7 @@
       // There is JS code in dart:* that depends on their names.
       _runtimeModule = new JS.Identifier('dart');
       _extensionSymbolsModule = new JS.Identifier('dartx');
+      _nullableInference.allowNotNullDeclarations = true;
     } else {
       // Otherwise allow these to be renamed so users can write them.
       _runtimeModule = new JS.TemporaryId('dart');
@@ -652,7 +657,7 @@
         var jsParams = _emitFormalParameters(ctor.function);
         var ctorBody = <JS.Statement>[];
         if (mixinCtor != null) ctorBody.add(mixinCtor);
-        if (ctor.name != '' || hasUnnamedSuper) {
+        if (ctor.name.name != '' || hasUnnamedSuper) {
           ctorBody.add(
               _emitSuperConstructorCall(className, ctor.name.name, jsParams));
         }
@@ -1263,18 +1268,10 @@
   JS.Expression _emitConstructor(Constructor node, List<Field> fields,
       bool isCallable, JS.Expression className) {
     var params = _emitFormalParameters(node.function);
-
-    var savedFunction = _currentFunction;
-    var savedLetVariables = _letVariables;
-    _currentFunction = node.function;
-    _letVariables = [];
-    var savedSuperAllowed = _superAllowed;
-    _superAllowed = false;
-    var body = _emitConstructorBody(node, fields, className);
-
-    _letVariables = savedLetVariables;
-    _superAllowed = savedSuperAllowed;
-    _currentFunction = savedFunction;
+    var body = _withCurrentFunction(
+        node.function,
+        () => _superDisallowed(
+            () => _emitConstructorBody(node, fields, className)));
 
     return _finishConstructorFunction(params, body, isCallable);
   }
@@ -1732,8 +1729,7 @@
   ///
   /// Same technique is applied if interface I has fields, and C doesn't declare
   /// neither the fields nor the corresponding getters and setters.
-  Iterable<JS.Method> _addMockMembers(
-      Member member, Class c, List<JS.Method> jsMethods) {
+  void _addMockMembers(Member member, Class c, List<JS.Method> jsMethods) {
     JS.Method implementMockMember(
         List<TypeParameter> typeParameters,
         List<VariableDeclaration> namedParameters,
@@ -2032,12 +2028,12 @@
     var lazyFields = <Field>[];
     for (var field in fields) {
       // Skip our magic undefined constant.
-      if (field.name == 'undefined') continue;
+      if (field.name.name == 'undefined') continue;
 
       var init = field.initializer;
       if (init == null ||
           init is BasicLiteral ||
-          _isJSInvocation(init) ||
+          _isInlineJSCall(init) ||
           init is ConstructorInvocation &&
               isSdkInternalRuntime(init.target.enclosingLibrary)) {
         _moduleItems.add(js.statement('# = #;', [
@@ -2051,9 +2047,6 @@
     return _emitLazyFields(_currentLibrary, lazyFields);
   }
 
-  bool _isJSInvocation(Expression expr) =>
-      expr is StaticInvocation && isInlineJS(expr.target);
-
   JS.Statement _emitLazyFields(NamedNode target, Iterable<Field> fields) {
     var accessors = <JS.Method>[];
     for (var field in fields) {
@@ -2690,30 +2683,28 @@
     // using ES6 generators.
 
     emitGeneratorFn(Iterable<JS.Expression> getParameters(JS.Block jsBody)) {
-      var savedSuperAllowed = _superAllowed;
       var savedController = _asyncStarController;
-      _superAllowed = false;
-
       _asyncStarController = function.asyncMarker == AsyncMarker.AsyncStar
           ? new JS.TemporaryId('stream')
           : null;
 
-      // Visit the body with our async* controller set.
-      //
-      // TODO(jmesserly): this will emit argument initializers (for default
-      // values) inside the generator function body. Is that the best place?
-      var jsBody = _emitFunctionBody(function)..sourceInformation = function;
-      JS.Expression gen =
-          new JS.Fun(getParameters(jsBody), jsBody, isGenerator: true);
+      JS.Expression gen;
+      _superDisallowed(() {
+        // Visit the body with our async* controller set.
+        //
+        // TODO(jmesserly): this will emit argument initializers (for default
+        // values) inside the generator function body. Is that the best place?
+        var jsBody = _emitFunctionBody(function)..sourceInformation = function;
+        gen = new JS.Fun(getParameters(jsBody), jsBody, isGenerator: true);
 
-      // Name the function if possible, to get better stack traces.
-      if (name != null) {
-        name = JS.friendlyNameForDartOperator[name] ?? name;
-        gen = new JS.NamedFunction(new JS.TemporaryId(name), gen);
-      }
-      if (JS.This.foundIn(gen)) gen = js.call('#.bind(this)', gen);
+        // Name the function if possible, to get better stack traces.
+        if (name != null) {
+          name = JS.friendlyNameForDartOperator[name] ?? name;
+          gen = new JS.NamedFunction(new JS.TemporaryId(name), gen);
+        }
+        if (JS.This.foundIn(gen)) gen = js.call('#.bind(this)', gen);
+      });
 
-      _superAllowed = savedSuperAllowed;
       _asyncStarController = savedController;
       return gen;
     }
@@ -2795,18 +2786,13 @@
   }
 
   JS.Block _emitFunctionBody(FunctionNode f) {
-    var savedFunction = _currentFunction;
-    _currentFunction = f;
-    var savedLetVariables = _letVariables;
-    _letVariables = [];
-
-    var block = _emitArgumentInitializers(f);
-    var jsBody = _visitStatement(f.body);
-    if (jsBody != null) addStatementToList(jsBody, block);
-
-    _initTempVars(block);
-    _currentFunction = savedFunction;
-    _letVariables = savedLetVariables;
+    List<JS.Statement> block;
+    _withCurrentFunction(f, () {
+      block = _emitArgumentInitializers(f);
+      var jsBody = _visitStatement(f.body);
+      if (jsBody != null) addStatementToList(jsBody, block);
+      _initTempVars(block);
+    });
 
     if (f.asyncMarker == AsyncMarker.Sync) {
       // It is a JS syntax error to use let or const to bind two variables with
@@ -2826,6 +2812,29 @@
     return new JS.Block(block);
   }
 
+  T _withCurrentFunction<T>(FunctionNode fn, T action()) {
+    var savedFunction = _currentFunction;
+    _currentFunction = fn;
+    var savedLetVariables = _letVariables;
+    _letVariables = [];
+    _nullableInference.enterFunction(fn);
+
+    var result = action();
+
+    _nullableInference.exitFunction(fn);
+    _currentFunction = savedFunction;
+    _letVariables = savedLetVariables;
+    return result;
+  }
+
+  T _superDisallowed<T>(T action()) {
+    var savedSuperAllowed = _superAllowed;
+    _superAllowed = false;
+    var result = action();
+    _superAllowed = savedSuperAllowed;
+    return result;
+  }
+
   /// Emits argument initializers, which handles optional/named args, as well
   /// as generic type checks needed due to our covariance.
   List<JS.Statement> _emitArgumentInitializers(FunctionNode f) {
@@ -2889,7 +2898,7 @@
   }
 
   bool _annotatedNullCheck(List<Expression> annotations) =>
-      annotations.any(isNullCheckAnnotation);
+      annotations.any(_nullableInference.isNullCheckAnnotation);
 
   JS.Statement _nullParameterCheck(JS.Expression param) {
     var call = _callHelper('argumentError((#))', [param]);
@@ -3019,8 +3028,14 @@
   defaultStatement(Statement node) => _emitInvalidNode(node).toStatement();
 
   @override
-  visitExpressionStatement(ExpressionStatement node) =>
-      _visitAndMarkExpression(node.expression).toStatement();
+  visitExpressionStatement(ExpressionStatement node) {
+    var expr = node.expression;
+    if (_isInlineJSCall(expr)) {
+      var inlineJS = _emitInlineJSCode(expr);
+      return inlineJS is JS.Expression ? inlineJS.toStatement() : inlineJS;
+    }
+    return _visitAndMarkExpression(expr).toStatement();
+  }
 
   @override
   visitBlock(Block node) =>
@@ -3122,7 +3137,7 @@
     // target.
     var current = node.target;
     while (current is LabeledStatement) {
-      current = (current as LabeledStatement).body;
+      current = current.body;
     }
     if (identical(current, target)) {
       return new JS.Break(name);
@@ -3419,12 +3434,10 @@
   @override
   visitTryFinally(TryFinally node) {
     var body = _visitStatement(node.body);
-    var savedSuperAllowed = _superAllowed;
-    _superAllowed = false;
-    var finallyBlock = _visitStatement(node.finalizer).toBlock();
-    _superAllowed = savedSuperAllowed;
+    var finallyBlock =
+        _superDisallowed(() => _visitStatement(node.finalizer).toBlock());
 
-    if (body is JS.Try && (body as JS.Try).finallyPart == null) {
+    if (body is JS.Try && body.finallyPart == null) {
       // Kernel represents Dart try/catch/finally as try/catch nested inside of
       // try/finally.  Flatten that pattern in the output into JS try/catch/
       // finally.
@@ -4085,13 +4098,11 @@
 
   @override
   visitStaticInvocation(StaticInvocation node) {
-    var result = _emitForeignJS(node);
-    if (result != null) return result;
-    if (node.target.isFactory) {
-      return _emitFactoryInvocation(node);
-    }
     var target = node.target;
-    if (target?.name == 'extensionSymbol' &&
+    if (isInlineJS(target)) return _emitInlineJSCode(node);
+    if (target.isFactory) return _emitFactoryInvocation(node);
+
+    if (target.name.name == 'extensionSymbol' &&
         isSdkInternalRuntime(target.enclosingLibrary)) {
       var args = node.arguments;
       var firstArg = args.positional.length == 1 ? args.positional[0] : null;
@@ -4147,27 +4158,32 @@
   }
 
   /// Emits code for the `JS(...)` macro.
-  JS.Expression _emitForeignJS(StaticInvocation node) {
-    if (!isInlineJS(node.target)) return null;
+  JS.Node _emitInlineJSCode(StaticInvocation node) {
     var args = node.arguments.positional;
     // arg[0] is static return type, used in `RestrictedStaticTypeAnalyzer`
     var code = args[1];
     List<Expression> templateArgs;
     String source;
     if (code is StringConcatenation) {
-      if (args.length > 2) {
-        throw new ArgumentError(
-            "Can't mix template args and string interpolation in JS calls.");
-      }
-      templateArgs = <Expression>[];
-      source = code.expressions.map((expression) {
-        if (expression is StringLiteral) {
-          return expression.value;
-        } else {
-          templateArgs.add(expression);
-          return '#';
+      if (code.expressions.every((e) => e is StringLiteral)) {
+        templateArgs = args.skip(2).toList();
+        source = code.expressions.map((e) => (e as StringLiteral).value).join();
+      } else {
+        if (args.length > 2) {
+          throw new ArgumentError(
+              "Can't mix template args and string interpolation in JS calls: "
+              "`$node`");
         }
-      }).join();
+        templateArgs = <Expression>[];
+        source = code.expressions.map((expression) {
+          if (expression is StringLiteral) {
+            return expression.value;
+          } else {
+            templateArgs.add(expression);
+            return '#';
+          }
+        }).join();
+      }
     } else {
       templateArgs = args.skip(2).toList();
       source = (code as StringLiteral).value;
@@ -4198,7 +4214,7 @@
       if (arg is StaticInvocation) {
         var target = arg.target;
         var positional = arg.arguments.positional;
-        if (target.name == 'getGenericClass' &&
+        if (target.name.name == 'getGenericClass' &&
             isSdkInternalRuntime(target.enclosingLibrary) &&
             positional.length == 1) {
           var typeArg = positional[0];
@@ -4256,45 +4272,7 @@
   ///
   /// If [localIsNullable] is not supplied, this will use the known list of
   /// [_notNullLocals].
-  bool isNullable(Expression expr) {
-    // TODO(jmesserly): we do recursive calls in a few places. This could
-    // leads to O(depth) cost for calling this function. We could store the
-    // resulting value if that becomes an issue, so we maintain the invariant
-    // that each node is visited once.
-    if (expr is PropertyGet) {
-      var target = expr.interfaceTarget;
-      // tear-offs are not null, other accessors are nullable.
-      return target is Procedure && target.isAccessor;
-    }
-    if (expr is StaticGet) {
-      var target = expr.target;
-      // tear-offs are not null, other accessors are nullable.
-      return target is Field || (target is Procedure && target.isGetter);
-    }
-
-    if (expr is TypeLiteral) return false;
-    if (expr is BasicLiteral) return expr.value == null;
-    if (expr is IsExpression) return false;
-    if (expr is FunctionExpression) return false;
-    if (expr is ThisExpression) return false;
-    if (expr is ConditionalExpression) {
-      return isNullable(expr.then) || isNullable(expr.otherwise);
-    }
-    if (expr is ConstructorInvocation) return false;
-    if (expr is LogicalExpression) return false;
-    if (expr is Not) return false;
-    if (expr is StaticInvocation) {
-      return expr.target != coreTypes.identicalProcedure;
-    }
-    if (expr is DirectMethodInvocation) {
-      // TODO(jmesserly): this is to capture that our primitive classes
-      // (int, double, num, bool, String) do not return null from their
-      // operator methods.
-      return !isPrimitiveType(expr.target.enclosingClass.rawType);
-    }
-    // TODO(jmesserly): handle other cases.
-    return true;
-  }
+  bool isNullable(Expression expr) => _nullableInference.isNullable(expr);
 
   bool isPrimitiveType(DartType t) => _typeRep.isPrimitive(t);
 
@@ -4391,9 +4369,9 @@
         case 'Map':
         case 'HashMap':
         case 'LinkedHashMap':
-          if (ctor.name == '') {
+          if (ctor.name.name == '') {
             return js.call('new #.new()', _emitMapImplType(type));
-          } else if (ctor.name == 'identity') {
+          } else if (ctor.name.name == 'identity') {
             return js.call(
                 'new #.new()', _emitMapImplType(type, identity: true));
           }
@@ -4401,15 +4379,15 @@
         case 'Set':
         case 'HashSet':
         case 'LinkedHashSet':
-          if (ctor.name == '') {
+          if (ctor.name.name == '') {
             return js.call('new #.new()', _emitSetImplType(type));
-          } else if (ctor.name == 'identity') {
+          } else if (ctor.name.name == 'identity') {
             return js.call(
                 'new #.new()', _emitSetImplType(type, identity: true));
           }
           break;
         case 'List':
-          if (ctor.name == '' && type is InterfaceType) {
+          if (ctor.name.name == '' && type is InterfaceType) {
             return _emitList(type.typeArguments[0], []);
           }
           break;
@@ -4542,9 +4520,9 @@
   @override
   visitAsExpression(AsExpression node) {
     Expression fromExpr = node.operand;
-    var from = fromExpr.getStaticType(types);
     var to = node.type;
     var jsFrom = _visitAndMarkExpression(fromExpr);
+    var from = fromExpr.getStaticType(types);
 
     // If the check was put here by static analysis to ensure soundness, we
     // can't skip it. For example, one could implement covariant generic caller
@@ -4563,15 +4541,9 @@
     //        c.add('hi);
     //      }
     //
-    // NOTE: due to implementation details, we do not currently reify the the
-    // `C<T>.add` check in CoercionReifier, so it does not reach this point;
-    // rather we check for it explicitly when emitting methods and fields.
-    // However we do reify the `c.f` check, so we must not eliminate it.
     var isTypeError = node.isTypeError;
     if (!isTypeError && types.isSubtypeOf(from, to)) return jsFrom;
 
-    // TODO(jmesserly): implicit function type instantiation for kernel?
-
     // All Dart number types map to a JS double.
     if (_typeRep.isNumber(from) && _typeRep.isNumber(to)) {
       // Make sure to check when converting to int.
@@ -4773,7 +4745,10 @@
 
   @override
   visitInstantiation(Instantiation node) {
-    return defaultExpression(node);
+    return _callHelper('gbind(#, #)', [
+      _visitExpression(node.expression),
+      node.typeArguments.map(_emitType).toList()
+    ]);
   }
 
   @override
@@ -4891,13 +4866,12 @@
     if (statements.length != 1) return false;
     body = statements[0];
   }
-  if (body is ReturnStatement) {
-    var e = body.expression;
-    return e is MethodInvocation && isInlineJS(e.interfaceTarget);
-  }
-  return false;
+  return body is ReturnStatement && _isInlineJSCall(body.expression);
 }
 
+bool _isInlineJSCall(Expression expr) =>
+    expr is StaticInvocation && isInlineJS(expr.target);
+
 /// Return true if this is one of the methods/properties on all Dart Objects
 /// (toString, hashCode, noSuchMethod, runtimeType).
 ///
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index 6c1a551..7147be1 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -75,12 +75,6 @@
 bool isNativeAnnotation(Expression value) =>
     _isBuiltinAnnotation(value, '_js_helper', 'Native');
 
-bool isNotNullAnnotation(Expression value) =>
-    _isBuiltinAnnotation(value, '_js_helper', 'NotNull');
-
-bool isNullCheckAnnotation(Expression value) =>
-    _isBuiltinAnnotation(value, '_js_helper', 'NullCheck');
-
 bool isJSAnonymousType(Class namedClass) {
   return _isJSNative(namedClass) &&
       findAnnotation(namedClass, isJSAnonymousAnnotation) != null;
diff --git a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
index 8876cae..0f2a383 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:kernel/kernel.dart';
 import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/library_index.dart';
 import 'package:kernel/type_environment.dart';
 
 /// An abstraction of the JS types
@@ -88,8 +89,17 @@
 class JSTypeRep {
   final TypeEnvironment types;
   final CoreTypes coreTypes;
+  final LibraryIndex sdk;
 
-  JSTypeRep(this.types, this.coreTypes);
+  final Class _jsBool;
+  final Class _jsNumber;
+
+  final Class _jsString;
+  JSTypeRep(this.types, this.sdk)
+      : coreTypes = types.coreTypes,
+        _jsBool = sdk.getClass('dart:_interceptors', 'JSBool'),
+        _jsNumber = sdk.getClass('dart:_interceptors', 'JSNumber'),
+        _jsString = sdk.getClass('dart:_interceptors', 'JSString');
 
   JSType typeFor(DartType type) {
     while (type is TypeParameterType) {
@@ -107,8 +117,8 @@
           c == coreTypes.doubleClass) {
         return JSType.jsNumber;
       }
-      if (c == coreTypes.boolClass.rawType) return JSType.jsBoolean;
-      if (c == coreTypes.stringClass.rawType) return JSType.jsString;
+      if (c == coreTypes.boolClass) return JSType.jsBoolean;
+      if (c == coreTypes.stringClass) return JSType.jsString;
       if (c == coreTypes.objectClass) return JSType.jsUnknown;
       if (c == coreTypes.futureOrClass) {
         var argumentRep = typeFor(type.typeArguments[0]);
@@ -124,6 +134,19 @@
     return JSType.jsObject;
   }
 
+  /// Given a Dart type return the known implementation type, if any.
+  /// Given `bool`, `String`, or `num`/`int`/`double`,
+  /// returns the corresponding class in `dart:_interceptors`:
+  /// `JSBool`, `JSString`, and `JSNumber` respectively, otherwise null.
+  Class getImplementationClass(DartType t) {
+    JSType rep = typeFor(t);
+    // Number, String, and Bool are final
+    if (rep == JSType.jsNumber) return _jsNumber;
+    if (rep == JSType.jsBoolean) return _jsBool;
+    if (rep == JSType.jsString) return _jsString;
+    return null;
+  }
+
   /// If the type [t] is [int] or [double], or a type parameter
   /// bounded by [int], [double] or [num] returns [num].
   /// Otherwise returns [t].
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index c555f21..7fc8071 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -248,5 +248,5 @@
 
 bool isInlineJS(Member e) =>
     e is Procedure &&
-    e.name == 'JS' &&
+    e.name.name == 'JS' &&
     e.enclosingLibrary.importUri.toString() == 'dart:_foreign_helper';
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index ccd2aa9..deaff11 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -3,8 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
-import 'package:kernel/kernel.dart';
 import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/library_index.dart';
 
 /// Contains information about native JS types (those types provided by the
 /// implementation) that are also provided by the Dart SDK.
@@ -24,8 +25,8 @@
 /// This will provide the [Iterable.first] property, without needing to add
 /// `first` to the `Array.prototype`.
 class NativeTypeSet {
-  final sdk = new Map<String, Library>();
   final CoreTypes coreTypes;
+  final LibraryIndex sdk;
 
   // Abstract types that may be implemented by both native and non-native
   // classes.
@@ -35,12 +36,9 @@
   final _nativeTypes = new HashSet<Class>.identity();
   final _pendingLibraries = new HashSet<Library>.identity();
 
-  NativeTypeSet(Program program, this.coreTypes) {
-    for (var l in program.libraries) {
-      var uri = l.importUri;
-      if (uri.scheme == 'dart') sdk[uri.toString()] = l;
-    }
-
+  NativeTypeSet(Program program)
+      : sdk = new LibraryIndex.coreLibraries(program),
+        coreTypes = new CoreTypes(program) {
     // First, core types:
     // TODO(vsm): If we're analyzing against the main SDK, those
     // types are not explicitly annotated.
@@ -49,25 +47,21 @@
     _addExtensionType(coreTypes.doubleClass, true);
     _addExtensionType(coreTypes.boolClass, true);
     _addExtensionType(coreTypes.stringClass, true);
-    _addExtensionTypes(sdk['dart:_interceptors']);
-    _addExtensionTypes(sdk['dart:_native_typed_data']);
+    _addExtensionTypes(sdk.getLibrary('dart:_interceptors'));
+    _addExtensionTypes(sdk.getLibrary('dart:_native_typed_data'));
 
     // These are used natively by dart:html but also not annotated.
-    _addExtensionTypesForLibrary(coreTypes.coreLibrary, ['Comparable', 'Map']);
-    _addExtensionTypesForLibrary(sdk['dart:collection'], ['ListMixin']);
-    _addExtensionTypesForLibrary(sdk['dart:math'], ['Rectangle']);
+    _addExtensionTypesForLibrary('dart:core', ['Comparable', 'Map']);
+    _addExtensionTypesForLibrary('dart:collection', ['ListMixin']);
+    _addExtensionTypesForLibrary('dart:math', ['Rectangle']);
 
     // Second, html types - these are only searched if we use dart:html, etc.:
-    _addPendingExtensionTypes(sdk['dart:html']);
-    _addPendingExtensionTypes(sdk['dart:indexed_db']);
-    _addPendingExtensionTypes(sdk['dart:svg']);
-    _addPendingExtensionTypes(sdk['dart:web_audio']);
-    _addPendingExtensionTypes(sdk['dart:web_gl']);
-    _addPendingExtensionTypes(sdk['dart:web_sql']);
-  }
-
-  Class getClass(String library, String name) {
-    return sdk[library].classes.firstWhere((c) => c.name == name);
+    _addPendingExtensionTypes(sdk.getLibrary('dart:html'));
+    _addPendingExtensionTypes(sdk.getLibrary('dart:indexed_db'));
+    _addPendingExtensionTypes(sdk.getLibrary('dart:svg'));
+    _addPendingExtensionTypes(sdk.getLibrary('dart:web_audio'));
+    _addPendingExtensionTypes(sdk.getLibrary('dart:web_gl'));
+    _addPendingExtensionTypes(sdk.getLibrary('dart:web_sql'));
   }
 
   bool _isNative(Class c) {
@@ -98,11 +92,9 @@
     }
   }
 
-  void _addExtensionTypesForLibrary(Library library, List<String> typeNames) {
-    for (var c in library.classes) {
-      if (typeNames.contains(c.name)) {
-        _addExtensionType(c, true);
-      }
+  void _addExtensionTypesForLibrary(String library, List<String> classNames) {
+    for (var className in classNames) {
+      _addExtensionType(sdk.getClass(library, className), true);
     }
   }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
new file mode 100644
index 0000000..bdfd687
--- /dev/null
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -0,0 +1,388 @@
+// 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:collection';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/type_environment.dart';
+import 'js_typerep.dart';
+import 'kernel_helpers.dart';
+
+/// Determines whether a given expression [isNullable].
+///
+/// This class can also analyze the nullability of local variables, if
+/// [enterFunction] and [exitFunction] are used.
+class NullableInference extends ExpressionVisitor<bool> {
+  final TypeEnvironment types;
+  final JSTypeRep jsTypeRep;
+  final CoreTypes coreTypes;
+
+  /// Whether `@notNull` and `@nullCheck` declarations are honored.
+  ///
+  /// This is set when compiling the SDK and in tests. Even when set to `false`,
+  /// non-SDK code will still benefit from `@notNull` annotations declared on
+  /// SDK APIs.
+  ///
+  /// Since `@notNull` cannot be imported by user code, this flag is only
+  /// a performance optimization, so we don't spend time looking for
+  /// annotations that cannot exist in user code.
+  bool allowNotNullDeclarations = false;
+
+  /// Allows `@notNull` and `@nullCheck` to be declared in `package:meta`
+  /// instead of requiring a private SDK library.
+  ///
+  /// This is currently used by tests, in conjunction with
+  /// [allowNotNullDeclarations].
+  bool allowPackageMetaAnnotations = false;
+
+  final _variableInference = new _NullableVariableInference();
+
+  NullableInference(this.jsTypeRep)
+      : types = jsTypeRep.types,
+        coreTypes = jsTypeRep.coreTypes {
+    _variableInference._nullInference = this;
+  }
+
+  /// Call when entering a function to enable [isNullable] to recognize local
+  /// variables that cannot be null.
+  void enterFunction(FunctionNode fn) => _variableInference.enterFunction(fn);
+
+  /// Call when exiting a function to clear out the information recorded by
+  /// [enterFunction].
+  void exitFunction(FunctionNode fn) => _variableInference.exitFunction(fn);
+
+  /// Returns true if [expr] can be null.
+  bool isNullable(Expression expr) => expr != null ? expr.accept(this) : false;
+
+  @override
+  defaultExpression(Expression node) => true;
+
+  @override
+  defaultBasicLiteral(BasicLiteral node) => false;
+
+  @override
+  visitNullLiteral(NullLiteral node) => true;
+
+  @override
+  visitVariableGet(VariableGet node) {
+    return _variableInference.variableIsNullable(node.variable);
+  }
+
+  @override
+  visitVariableSet(VariableSet node) => isNullable(node.value);
+
+  @override
+  visitPropertyGet(PropertyGet node) => _getterIsNullable(node.interfaceTarget);
+
+  @override
+  visitPropertySet(PropertySet node) => isNullable(node.value);
+
+  @override
+  visitDirectPropertyGet(DirectPropertyGet node) =>
+      _getterIsNullable(node.target);
+
+  @override
+  visitDirectPropertySet(DirectPropertySet node) => isNullable(node.value);
+
+  @override
+  visitSuperPropertyGet(SuperPropertyGet node) =>
+      _getterIsNullable(node.interfaceTarget);
+
+  @override
+  visitSuperPropertySet(SuperPropertySet node) => isNullable(node.value);
+
+  @override
+  visitStaticGet(StaticGet node) => _getterIsNullable(node.target);
+
+  @override
+  visitStaticSet(StaticSet node) => isNullable(node.value);
+
+  @override
+  visitMethodInvocation(MethodInvocation node) =>
+      _invocationIsNullable(node.interfaceTarget, node.receiver);
+
+  @override
+  visitDirectMethodInvocation(DirectMethodInvocation node) =>
+      _invocationIsNullable(node.target, node.receiver);
+
+  @override
+  visitSuperMethodInvocation(SuperMethodInvocation node) =>
+      _invocationIsNullable(node.interfaceTarget);
+
+  bool _invocationIsNullable(Member target, [Expression receiver]) {
+    if (target == null) return true;
+    if (target.name.name == 'toString' &&
+        receiver != null &&
+        receiver.getStaticType(types) == coreTypes.stringClass.rawType) {
+      // TODO(jmesserly): `class String` in dart:core does not explicitly
+      // declare `toString`, which results in a target of `Object.toString` even
+      // when the reciever type is known to be `String`. So we work around it.
+      // (The Analyzer backend of DDC probably has the same issue.)
+      return false;
+    }
+    return _returnValueIsNullable(target);
+  }
+
+  bool _getterIsNullable(Member target) {
+    if (target == null) return true;
+    // tear-offs are not null
+    if (target is Procedure && !target.isAccessor) return false;
+    return _returnValueIsNullable(target);
+  }
+
+  bool _returnValueIsNullable(Member target) {
+    // TODO(jmesserly): this is not a valid assumption for user-defined equality
+    // but it is added to match the behavior of the Analyzer backend.
+    // https://github.com/dart-lang/sdk/issues/31854
+    if (target.name.name == '==') return false;
+
+    var targetClass = target.enclosingClass;
+    if (targetClass != null) {
+      // Convert `int` `double` `num` `String` and `bool` to their corresponding
+      // implementation class in dart:_interceptors, for example `JSString`.
+      //
+      // This allows us to find the `@notNull` annotation if it exists.
+      var implClass = jsTypeRep.getImplementationClass(targetClass.rawType);
+      if (implClass != null) {
+        var member = types.hierarchy.getDispatchTarget(implClass, target.name);
+        if (member != null) target = member;
+      }
+    }
+
+    // If the method or function is annotated as returning a non-null value
+    // then the result of the call is non-null.
+    var annotations = target.annotations;
+    if (annotations.isNotEmpty && annotations.any(isNotNullAnnotation)) {
+      return false;
+    }
+    return true;
+  }
+
+  @override
+  visitStaticInvocation(StaticInvocation node) {
+    var target = node.target;
+    if (target == types.coreTypes.identicalProcedure) return false;
+    if (isInlineJS(target)) {
+      var args = node.arguments.positional;
+      var first = args.isNotEmpty ? args.first : null;
+      if (first is StringLiteral) {
+        var types = first.value;
+        return types == '' ||
+            types == 'var' ||
+            types.split('|').contains('Null');
+      }
+    }
+    return _invocationIsNullable(target);
+  }
+
+  @override
+  visitConstructorInvocation(ConstructorInvocation node) => false;
+
+  @override
+  visitNot(Not node) => false;
+
+  @override
+  visitLogicalExpression(LogicalExpression node) => false;
+
+  @override
+  visitConditionalExpression(ConditionalExpression node) =>
+      isNullable(node.then) || isNullable(node.otherwise);
+
+  @override
+  visitStringConcatenation(StringConcatenation node) => false;
+
+  @override
+  visitIsExpression(IsExpression node) => false;
+
+  @override
+  visitAsExpression(AsExpression node) => isNullable(node.operand);
+
+  @override
+  visitSymbolLiteral(SymbolLiteral node) => false;
+
+  @override
+  visitTypeLiteral(TypeLiteral node) => false;
+
+  @override
+  visitThisExpression(ThisExpression node) => false;
+
+  @override
+  visitRethrow(Rethrow node) => false;
+
+  @override
+  visitThrow(Throw node) => false;
+
+  @override
+  visitListLiteral(ListLiteral node) => false;
+
+  @override
+  visitMapLiteral(MapLiteral node) => false;
+
+  @override
+  visitAwaitExpression(AwaitExpression node) => true;
+
+  @override
+  visitFunctionExpression(FunctionExpression node) => false;
+
+  @override
+  visitConstantExpression(ConstantExpression node) {
+    var c = node.constant;
+    return c is PrimitiveConstant && c.value == null;
+  }
+
+  @override
+  visitLet(Let node) => isNullable(node.body);
+
+  @override
+  visitInstantiation(Instantiation node) => false;
+
+  bool isNotNullAnnotation(Expression value) =>
+      _isInternalAnnotationField(value, 'notNull');
+
+  bool isNullCheckAnnotation(Expression value) =>
+      _isInternalAnnotationField(value, 'nullCheck');
+
+  bool _isInternalAnnotationField(Expression value, String name) {
+    if (value is StaticGet) {
+      var t = value.target;
+      if (t is Field && t.name.name == name) {
+        var uri = t.enclosingLibrary.importUri;
+        return uri.scheme == 'dart' && uri.pathSegments[0] == '_js_helper' ||
+            allowPackageMetaAnnotations &&
+                uri.scheme == 'package' &&
+                uri.pathSegments[0] == 'meta';
+      }
+    }
+    return false;
+  }
+}
+
+/// A visitor that determines which local variables cannot be null using
+/// flow-insensitive inference.
+///
+/// The entire body of a function (including any local functions) is visited
+/// recursively, and we collect variables that are tentatively believed to be
+/// not-null. If the assumption turns out to be incorrect (based on a later
+/// assignment of a nullable value), we remove it from the not-null set, along
+/// with any variable it was assigned to.
+///
+/// This does not track nullable locals, so we can avoid doing work on any
+/// variables that have already been determined to be nullable.
+///
+// TODO(jmesserly): Introduce flow analysis.
+class _NullableVariableInference extends RecursiveVisitor<void> {
+  NullableInference _nullInference;
+
+  /// Variables that are currently believed to be not-null.
+  final _notNullLocals = new HashSet<VariableDeclaration>.identity();
+
+  /// For each variable currently believed to be not-null ([_notNullLocals]),
+  /// this collects variables that it is assigned to, so we update them if we
+  /// later determine that the variable can be null.
+  final _assignedTo =
+      new HashMap<VariableDeclaration, List<VariableDeclaration>>.identity();
+
+  /// All functions that have been analyzed with [analyzeFunction].
+  ///
+  /// In practice this will include the outermost function (typically a
+  /// [Procedure]) as well as an local functions it contains.
+  final _functions = new HashSet<FunctionNode>.identity();
+
+  /// The current variable we are setting/initializing, so we can track if it
+  /// is [_assignedTo] from another variable.
+  VariableDeclaration _variableAssignedTo;
+
+  void enterFunction(FunctionNode node) {
+    if (_functions.contains(node)) return; // local function already analyzed.
+    visitFunctionNode(node);
+    _assignedTo.clear();
+  }
+
+  void exitFunction(FunctionNode node) {
+    var removed = _functions.remove(node);
+    assert(removed);
+    if (_functions.isEmpty) _notNullLocals.clear();
+  }
+
+  @override
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    _notNullLocals.add(node.variable);
+    node.function?.accept(this);
+  }
+
+  @override
+  visitFunctionNode(FunctionNode node) {
+    _functions.add(node);
+    if (_nullInference.allowNotNullDeclarations) {
+      visitList(node.positionalParameters, this);
+      visitList(node.namedParameters, this);
+    }
+    node.body?.accept(this);
+  }
+
+  @override
+  visitCatch(Catch node) {
+    // The stack trace variable is not nullable, but the exception can be.
+    var stackTrace = node.stackTrace;
+    if (stackTrace != null) _notNullLocals.add(stackTrace);
+    super.visitCatch(node);
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    if (_nullInference.allowNotNullDeclarations) {
+      var annotations = node.annotations;
+      if (annotations.isNotEmpty &&
+          (annotations.any(_nullInference.isNotNullAnnotation) ||
+              annotations.any(_nullInference.isNullCheckAnnotation))) {
+        _notNullLocals.add(node);
+      }
+    }
+    var initializer = node.initializer;
+    if (initializer != null) {
+      var savedVariable = _variableAssignedTo;
+      _variableAssignedTo = node;
+
+      if (!_nullInference.isNullable(initializer)) _notNullLocals.add(node);
+
+      _variableAssignedTo = savedVariable;
+    }
+    initializer?.accept(this);
+  }
+
+  @override
+  visitVariableGet(VariableGet node) {}
+
+  @override
+  visitVariableSet(VariableSet node) {
+    var variable = node.variable;
+    var value = node.value;
+    if (_notNullLocals.contains(variable)) {
+      var savedVariable = _variableAssignedTo;
+      _variableAssignedTo = variable;
+
+      if (_nullInference.isNullable(node.value)) {
+        markNullable(VariableDeclaration v) {
+          _notNullLocals.remove(v);
+          _assignedTo.remove(v)?.forEach(markNullable);
+        }
+
+        markNullable(variable);
+      }
+
+      _variableAssignedTo = savedVariable;
+    }
+    value.accept(this);
+  }
+
+  bool variableIsNullable(VariableDeclaration variable) {
+    if (_notNullLocals.contains(variable)) {
+      if (_variableAssignedTo != null) {
+        _assignedTo.putIfAbsent(variable, () => []).add(_variableAssignedTo);
+      }
+      return false;
+    }
+    return true;
+  }
+}
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
new file mode 100644
index 0000000..4324353
--- /dev/null
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -0,0 +1,581 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+import 'package:front_end/src/api_prototype/memory_file_system.dart';
+import 'package:front_end/src/api_unstable/ddc.dart' as fe;
+import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/library_index.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:test/test.dart';
+
+import 'package:dev_compiler/src/kernel/command.dart';
+import 'package:dev_compiler/src/kernel/nullable_inference.dart';
+import 'package:dev_compiler/src/kernel/js_typerep.dart';
+import 'package:dev_compiler/src/kernel/target.dart';
+
+void main() {
+  test('empty main', () async {
+    await expectNotNull('main() {}', '');
+  });
+
+  group('literal', () {
+    test('null', () async {
+      await expectNotNull('main() { print(null); }', '');
+    });
+    test('bool', () async {
+      await expectNotNull('main() { print(false); }', 'false');
+    });
+    test('int', () async {
+      await expectNotNull('main() { print(42); }', '42');
+    });
+    test('double', () async {
+      await expectNotNull('main() { print(123.0); }', '123.0');
+    });
+    test('String', () async {
+      await expectNotNull('main() { print("hi"); }', '"hi"');
+    });
+    test('List', () async {
+      await expectNotNull(
+          'main() { print([42, null]); }', '<dart.core::int>[42, null], 42');
+    });
+    test('Map', () async {
+      await expectNotNull('main() { print({"x": null}); }',
+          '<dart.core::String, dart.core::Null>{"x": null}, "x"');
+    });
+
+    test('Symbol', () async {
+      await expectNotNull('main() { print(#hi); }', '#hi');
+    });
+
+    test('Type', () async {
+      await expectNotNull('main() { print(Object); }', 'dart.core::Object');
+    });
+  });
+
+  test('this', () async {
+    await expectNotNull('class C { m() { return this; } }', 'this');
+  });
+
+  test('is', () async {
+    await expectNotNull('main() { 42 is int; null is int; }',
+        '42 is dart.core::int, 42, null is dart.core::int');
+  });
+
+  test('as', () async {
+    await expectNotNull(
+        'main() { 42 as int; null as int; }', '42 as dart.core::int, 42');
+  });
+
+  test('constructor', () async {
+    await expectNotNull(
+        'library a; class C {} main() { new C(); }', 'new a::C::•()');
+  });
+
+  group('operator', () {
+    test('==', () async {
+      // This is not a correct non-null assumption when user-defined operators,
+      // are present, see: https://github.com/dart-lang/sdk/issues/31854
+      await expectAllNotNull('main() { 1 == 1; }');
+    });
+    test('!', () async {
+      await expectAllNotNull('main() { !false; }');
+    });
+    test('!=', () async {
+      await expectAllNotNull('main() { 1 != 2; }');
+    });
+    test('&&', () async {
+      await expectAllNotNull('main() { true && true; }');
+    });
+    test('||', () async {
+      await expectAllNotNull('main() { true || true; }');
+    });
+    test('? :', () async {
+      await expectAllNotNull('main() { true ? true : false; }');
+    });
+  });
+
+  test('bool', () async {
+    await expectAllNotNull('main() { true.toString(); false.hashCode; }');
+  });
+
+  group('int', () {
+    test('arithmetic', () async {
+      await expectAllNotNull(
+          'main() { -0; 1 + 2; 3 - 4; 5 * 6; 7 / 8; 9 % 10; 11 ~/ 12; }');
+    });
+    test('bitwise', () async {
+      await expectAllNotNull(
+          'main() { 1 & 2; 3 | 4; 5 ^ 6; ~7; 8 << 9; 10 >> 11; }');
+    });
+    test('comparison', () async {
+      await expectAllNotNull('main() { 1 < 2; 3 > 4; 5 <= 6; 7 >= 8; }');
+    });
+    test('getters', () async {
+      await expectAllNotNull(
+          'main() { 1.isOdd; 1.isEven; 1.isNegative; 1.isNaN; 1.isInfinite; '
+          '1.isFinite; 1.sign; 1.bitLength; 1.hashCode; }');
+    });
+    test('methods', () async {
+      await expectAllNotNull(
+          'main() { 1.compareTo(2); 1.remainder(2); 1.abs(); 1.toInt(); '
+          '1.ceil(); 1.floor(); 1.truncate(); 1.round(); 1.ceilToDouble(); '
+          '1.floorToDouble(); 1.truncateToDouble(); 1.roundToDouble(); '
+          '1.toDouble(); 1.clamp(2); 1.toStringAsFixed(2); '
+          '1.toStringAsExponential(); 1.toStringAsPrecision(2); 1.toString(); '
+          '1.toRadixString(2); 1.toUnsigned(2); 1.toSigned(2); 1.modPow(2); '
+          '1.modInverse(2); 1.gcd(2); }');
+    });
+  });
+
+  group('double', () {
+    test('arithmetic', () async {
+      await expectAllNotNull(
+          'main() { -0.0; 1.0 + 2.0; 3.0 - 4.0; 5.0 * 6.0; 7.0 / 8.0; '
+          '9.0 % 10.0; 11.0 ~/ 12.0; }');
+    });
+    test('comparison', () async {
+      await expectAllNotNull(
+          'main() { 1.0 < 2.0; 3.0 > 4.0; 5.0 <= 6.0; 7.0 >= 8.0; }');
+    });
+    test('getters', () async {
+      await expectAllNotNull(
+          'main() { (1.0).isNegative; (1.0).isNaN; (1.0).isInfinite; '
+          '(1.0).isFinite; (1.0).sign; (1.0).hashCode; }');
+    });
+    test('methods', () async {
+      await expectAllNotNull(
+          'main() { (1.0).compareTo(2.0); (1.0).remainder(2.0); (1.0).abs(); '
+          '(1.0).toInt(); (1.0).ceil(); (1.0).floor(); (1.0).truncate(); '
+          '(1.0).round(); (1.0).ceilToDouble(); (1.0).floorToDouble(); '
+          '(1.0).truncateToDouble(); (1.0).roundToDouble(); (1.0).toDouble(); '
+          '(1.0).clamp(2.0); (1.0).toStringAsFixed(2); (1.0).toString(); '
+          '(1.0).toStringAsExponential(); (1.0).toStringAsPrecision(2); }');
+    });
+  });
+
+  group('num', () {
+    test('arithmetic', () async {
+      await expectAllNotNull(
+          'main() { num n = 1; -n; n + n; n - n; n * n; n / n; n % n; n % n; '
+          'n ~/ n; }');
+    });
+    test('comparison', () async {
+      await expectAllNotNull(
+          'main() { num n = 1; n < n; n > n; n <= n; n >= n; }');
+    });
+    test('getters', () async {
+      await expectAllNotNull(
+          'main() { num n = 1; n.isNegative; n.isNaN; n.isInfinite; '
+          'n.isFinite; n.sign; n.hashCode; }');
+    });
+    test('methods', () async {
+      await expectAllNotNull(
+          'main() { num n = 1; n.compareTo(n); n.remainder(n); n.abs(); '
+          'n.toInt(); n.ceil(); n.floor(); n.truncate(); '
+          'n.round(); n.ceilToDouble(); n.floorToDouble(); '
+          'n.truncateToDouble(); n.roundToDouble(); n.toDouble(); '
+          'n.clamp(n); n.toStringAsFixed(n); n.toString(); '
+          'n.toStringAsExponential(); n.toStringAsPrecision(n); }');
+    });
+  });
+
+  group('String', () {
+    test('concatenation', () async {
+      await expectAllNotNull('main() { "1" "2"; }');
+    });
+    test('interpolation', () async {
+      await expectAllNotNull('main() { "1${2}"; }');
+    });
+    test('getters', () async {
+      await expectAllNotNull(
+          'main() { "".codeUnits; "".hashCode; "".isEmpty; "".isNotEmpty; '
+          '"".length; "".runes; }');
+    });
+    test('operators', () async {
+      await expectAllNotNull('main() { "" + ""; "" * 2; "" == ""; "x"[0]; }');
+    });
+    test('methods', () async {
+      await expectAllNotNull('''main() {
+        String s = '';
+        s.codeUnitAt(0);
+        s.contains(s);
+        s.endsWith(s);
+        s.indexOf(s);
+        s.lastIndexOf(s);
+        s.padLeft(1);
+        s.padRight(1);
+        s.replaceAll(s, s);
+        s.replaceAllMapped(s, (_) => s);
+        s.replaceFirst(s, s);
+        s.replaceFirstMapped(s, (_) => s);
+        s.replaceRange(1, 2, s);
+        s.split(s);
+        s.splitMapJoin(s, (_) => s, (_) => s);
+        s.startsWith(s);
+        s.substring(1);
+        s.toLowerCase();
+        s.toUpperCase();
+        s.trim();
+        s.trimLeft();
+        s.trimRight();
+        s.compareTo(s);
+        s.toString();
+        // Pattern methods (allMatches, matchAsPrefix) are not recognized.
+      }''');
+    });
+  });
+
+  test('identical', () async {
+    await expectNotNull('main() { identical(null, null); }',
+        'dart.core::identical(null, null)');
+  });
+
+  test('throw', () async {
+    await expectNotNull('main() { print(throw null); }', 'throw null');
+  });
+
+  test('rethrow', () async {
+    await expectNotNull('main() { try {} catch (e) { rethrow; } }', 'rethrow');
+  });
+
+  test('function expression', () async {
+    await expectNotNull(
+        'main() { () => null; f() {}; f; }', '() → dart.core::Null => null, f');
+  });
+
+  test('cascades (kernel let)', () async {
+    // `null..toString()` evaluates to `null` so it is nullable.
+    await expectNotNull('main() { null..toString(); }', '');
+    await expectAllNotNull('main() { 1..toString(); }');
+  });
+
+  group('variable', () {
+    test('declaration not-null', () async {
+      await expectNotNull('main() { var x = 42; print(x); }', '42, x');
+    });
+    test('declaration null', () async {
+      await expectNotNull('main() { var x = null; print(x); }', '');
+    });
+    test('declaration without initializer', () async {
+      await expectNotNull('main() { var x; x = 1; print(x); }', 'x = 1, 1');
+    });
+    test('assignment non-null', () async {
+      await expectNotNull(
+          'main() { var x = 42; x = 1; print(x); }', '42, x = 1, 1, x');
+    });
+    test('assignment null', () async {
+      await expectNotNull('main() { var x = 42; x = null; print(x); }', '42');
+    });
+    test('flow insensitive', () async {
+      await expectNotNull('''main() {
+        var x = 1;
+        if (true) {
+          print(x);
+        } else {
+          x = null;
+          print(x);
+        }
+      }''', '1, true');
+    });
+
+    test('declaration from variable', () async {
+      await expectNotNull('''main() {
+        var x = 1;
+        var y = x;
+        print(y);
+        x = null;
+      }''', '1');
+    });
+    test('declaration from variable nested', () async {
+      await expectNotNull('''main() {
+        var x = 1;
+        var y = (x = null) == null;
+        print(x);
+        print(y);
+      }''', '1, (x = null).{dart.core::Object::==}(null), y');
+    });
+    test('declaration from variable transitive', () async {
+      await expectNotNull('''main() {
+        var x = 1;
+        var y = x;
+        var z = y;
+        print(z);
+        x = null;
+      }''', '1');
+    });
+    test('declaration between variable transitive nested', () async {
+      await expectNotNull('''main() {
+        var x = 1;
+        var y = 1;
+        var z = y = x;
+        print(z);
+        x = null;
+      }''', '1, 1');
+    });
+
+    test('for not-null', () async {
+      await expectAllNotNull('''main() {
+        for (var i = 0; i < 10; i++) {
+          i;
+        }
+      }''');
+    });
+    test('for nullable', () async {
+      await expectNotNull(
+          '''main() {
+        for (var i = 0; i < 10; i++) {
+          if (i >= 10) i = null;
+        }
+      }''',
+          // arithmetic operation results on `i` are themselves not null, even
+          // though `i` is nullable.
+          '0, i.{dart.core::num::<}(10), 10, i = i.{dart.core::num::+}(1), '
+          'i.{dart.core::num::+}(1), 1, i.{dart.core::num::>=}(10), 10');
+    });
+    test('for-in', () async {
+      await expectNotNull('''main() {
+        for (var i in []) {
+          print(i);
+        }
+      }''', '<dynamic>[]');
+    });
+
+    test('inner functions', () async {
+      await expectNotNull('''main() {
+        var y = 0;
+        f(x) {
+          var g = () => print('g');
+          g();
+          print(x);
+          print(y);
+          var z = 1;
+          print(z);
+        }
+        f(42);
+      }''', '0, () → void => dart.core::print("g"), "g", g, y, 1, z, f, 42');
+    });
+    test('assignment to closure variable', () async {
+      await expectNotNull('''main() {
+        var y = 0;
+        f(x) {
+          y = x;
+        }
+        f(42);
+        print(y);
+      }''', '0, f, 42');
+    });
+
+    test('declaration visits initializer', () async {
+      await expectAllNotNull('''main() {
+        var x = () { var y = 1; return y; };
+        x;
+      }''');
+    });
+    test('assignment visits value', () async {
+      await expectAllNotNull('''main() {
+        var x = () => 42;
+        x = () { var y = 1; return y; };
+      }''');
+    });
+    test('assignment visits value with closure variable set', () async {
+      await expectNotNull('''main() {
+        var x = () => 42;
+        var y = (() => x = null);
+      }''', '() → dart.core::int => 42, 42, () → dart.core::Null => x = null');
+    });
+    test('do not depend on unrelated variables', () async {
+      await expectNotNull('''main() {
+        var x;
+        var y = identical(x, null);
+        y; // this is still non-null even though `x` is nullable
+      }''', 'dart.core::identical(x, null), y');
+    });
+    test('do not depend on unrelated variables updated later', () async {
+      await expectNotNull('''main() {
+        var x = 1;
+        var y = identical(x, 1);
+        x = null;
+        y; // this is still non-null even though `x` is nullable
+      }''', '1, dart.core::identical(x, 1), 1, y');
+    });
+  });
+
+  group('notNull', () {
+    setUp(() {
+      useAnnotations = true;
+    });
+    tearDown(() {
+      useAnnotations = false;
+    });
+    var imports = "import 'package:meta/meta.dart';";
+    group('(kernel annotation bug)', () {
+      test('variable wihout initializer', () async {
+        await expectNotNull('$imports main() { @notNull var x; print(x); }',
+            ''); // should be: 'x'
+      });
+      test('variable with initializer', () async {
+        // TODO(jmesserly): this does not work in the Analyzer backend.
+        await expectNotNull(
+            '$imports main() { @notNull var x = null; print(x); }',
+            ''); // should be: 'x'
+      });
+      test('parameters', () async {
+        await expectNotNull(
+            '$imports f(@notNull x, [@notNull y, @notNull z = 42]) '
+            '{ x; y; z; }',
+            '42, z'); // should be: '42, x, y, z'
+      });
+      test('named parameters', () async {
+        await expectNotNull(
+            '$imports f({@notNull x, @notNull y: 42}) { x; y; }',
+            '42, y'); // should be: '42, x, y'
+      });
+    });
+
+    test('top-level field', () async {
+      await expectNotNull(
+          'library a; $imports @notNull int x; main() { x; }', 'a::x');
+    });
+
+    test('getter', () async {
+      await expectNotNull(
+          'library b; $imports @notNull get x => null; main() { x; }', 'b::x');
+    });
+
+    test('function', () async {
+      await expectNotNull(
+          'library a; $imports @notNull f() {} main() { f(); }', 'a::f()');
+    });
+
+    test('method', () async {
+      await expectNotNull(
+          'library b; $imports class C { @notNull m() {} } '
+          'main() { var c = new C(); c.m(); }',
+          'new b::C::•(), c.{b::C::m}(), c');
+    });
+  });
+}
+
+/// Given the Dart [code], expects the [expectedNotNull] kernel expression list
+/// to be produced in the set of expressions that cannot be null by DDC's null
+/// inference.
+Future expectNotNull(String code, String expectedNotNull) async {
+  var program = await kernelCompile(code);
+  var collector = new NotNullCollector();
+  program.accept(collector);
+  var actualNotNull =
+      collector.notNullExpressions.map((e) => e.toString()).join(', ');
+  expect(actualNotNull, equals(expectedNotNull));
+}
+
+/// Given the Dart [code], expects all the expressions inferred to be not-null.
+Future expectAllNotNull(String code) async {
+  (await kernelCompile(code)).accept(new ExpectAllNotNull());
+}
+
+bool useAnnotations = false;
+NullableInference inference;
+
+class _TestRecursiveVisitor extends RecursiveVisitor<void> {
+  int _functionNesting = 0;
+
+  @override
+  visitProgram(Program node) {
+    inference ??= new NullableInference(new JSTypeRep(
+        new TypeSchemaEnvironment(
+            new CoreTypes(node), new ClassHierarchy(node), true),
+        new LibraryIndex.coreLibraries(node)));
+
+    if (useAnnotations) {
+      inference.allowNotNullDeclarations = useAnnotations;
+      inference.allowPackageMetaAnnotations = useAnnotations;
+    }
+    super.visitProgram(node);
+  }
+
+  @override
+  visitLibrary(Library node) {
+    if (node.isExternal ||
+        node.importUri.scheme == 'package' &&
+            node.importUri.pathSegments[0] == 'meta') {
+      return;
+    }
+    super.visitLibrary(node);
+  }
+
+  @override
+  visitFunctionNode(FunctionNode node) {
+    _functionNesting++;
+    if (_functionNesting == 1) inference.enterFunction(node);
+    super.visitFunctionNode(node);
+    if (_functionNesting == 1) inference.exitFunction(node);
+    _functionNesting--;
+  }
+}
+
+class NotNullCollector extends _TestRecursiveVisitor {
+  final notNullExpressions = <Expression>[];
+
+  @override
+  defaultExpression(Expression node) {
+    if (!inference.isNullable(node)) {
+      notNullExpressions.add(node);
+    }
+    super.defaultExpression(node);
+  }
+}
+
+class ExpectAllNotNull extends _TestRecursiveVisitor {
+  @override
+  defaultExpression(Expression node) {
+    expect(inference.isNullable(node), false,
+        reason: 'expression `$node` should be inferred as not-null');
+    super.defaultExpression(node);
+  }
+}
+
+fe.InitializedCompilerState _compilerState;
+final _fileSystem = new MemoryFileSystem(new Uri.file('/memory/'));
+
+Future<Program> kernelCompile(String code) async {
+  var succeeded = true;
+  void errorHandler(fe.CompilationMessage error) {
+    if (error.severity == fe.Severity.error) {
+      succeeded = false;
+    }
+  }
+
+  var sdkUri = new Uri.file('/memory/dart_sdk.dill');
+  var sdkFile = _fileSystem.entityForUri(sdkUri);
+  if (!await sdkFile.exists()) {
+    sdkFile.writeAsBytesSync(new File(defaultSdkSummaryPath).readAsBytesSync());
+  }
+  var packagesUri = new Uri.file('/memory/.packages');
+  var packagesFile = _fileSystem.entityForUri(packagesUri);
+  if (!await packagesFile.exists()) {
+    packagesFile.writeAsStringSync('meta:/memory/meta/lib');
+    _fileSystem
+        .entityForUri(new Uri.file('/memory/meta/lib/meta.dart'))
+        .writeAsStringSync('''
+class _NotNull { const _NotNull(); }
+const notNull = const _NotNull();
+class _NullCheck { const _NullCheck(); }
+const nullCheck = const _NullCheck();
+    ''');
+  }
+
+  var mainUri = new Uri.file('/memory/test.dart');
+  _fileSystem.entityForUri(mainUri).writeAsStringSync(code);
+  _compilerState = await fe.initializeCompiler(
+      _compilerState, sdkUri, packagesUri, [], new DevCompilerTarget(),
+      fileSystem: _fileSystem);
+  fe.DdcResult result =
+      await fe.compile(_compilerState, [mainUri], errorHandler);
+  expect(succeeded, true);
+  return result.program;
+}
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 78c653f..c609b5e 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -13,8 +13,8 @@
 
 import 'common.dart';
 
-abstract class DdcRunner {
-  Future<Null> runDDC(Uri inputFile, Uri outputFile, Uri outWrapperPath);
+abstract class CompilerRunner {
+  Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperPath);
 }
 
 abstract class WithCompilerState {
@@ -22,9 +22,9 @@
 }
 
 class Compile extends Step<Data, Data, ChainContext> {
-  final DdcRunner ddcRunner;
+  final CompilerRunner runner;
 
-  const Compile(this.ddcRunner);
+  const Compile(this.runner);
 
   String get name => "compile";
 
@@ -42,18 +42,18 @@
     var outputFile = outDirUri.resolve(outputFilename);
     var outWrapperPath = outDirUri.resolve("wrapper.js");
 
-    await ddcRunner.runDDC(testFile, outputFile, outWrapperPath);
+    await runner.run(testFile, outputFile, outWrapperPath);
 
     return pass(data);
   }
 }
 
 class TestStackTrace extends Step<Data, Data, ChainContext> {
-  final DdcRunner ddcRunner;
+  final CompilerRunner runner;
   final String marker;
   final List<String> knownMarkers;
 
-  const TestStackTrace(this.ddcRunner, this.marker, this.knownMarkers);
+  const TestStackTrace(this.runner, this.marker, this.knownMarkers);
 
   String get name => "TestStackTrace";
 
@@ -71,8 +71,7 @@
 
   Future<bool> _compile(String input, String output) async {
     var outWrapperPath = _getWrapperPathFromDirectoryFile(new Uri.file(input));
-    await ddcRunner.runDDC(
-        new Uri.file(input), new Uri.file(output), outWrapperPath);
+    await runner.run(new Uri.file(input), new Uri.file(output), outWrapperPath);
     return true;
   }
 
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
index 684aadc..29e48cf 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
@@ -21,24 +21,22 @@
 
   List<Step> _steps;
 
-  List<Step> get steps {
-    return _steps ??= <Step>[
-      const Setup(),
-      new Compile(new RunDdc(environment.containsKey("debug"))),
-      const StepWithD8(),
-      new CheckSteps(environment.containsKey("debug")),
-    ];
-  }
+  List<Step> get steps => _steps ??= <Step>[
+        const Setup(),
+        new Compile(new DevCompilerRunner(environment.containsKey("debug"))),
+        const StepWithD8(),
+        new CheckSteps(environment.containsKey("debug")),
+      ];
 
   bool debugging() => environment.containsKey("debug");
 }
 
-class RunDdc implements DdcRunner {
+class DevCompilerRunner implements CompilerRunner {
   final bool debugging;
 
-  const RunDdc([this.debugging = false]);
+  const DevCompilerRunner([this.debugging = false]);
 
-  Future<Null> runDDC(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
+  Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
     Uri outDir = outputFile.resolve(".");
     String outputFilename = outputFile.pathSegments.last;
 
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index 1658cf7..d93083c 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -30,7 +30,7 @@
   List<Step> get steps {
     return _steps ??= <Step>[
       const Setup(),
-      new Compile(new RunDdc(this, debugging())),
+      new Compile(new DevCompilerRunner(this, debugging())),
       const StepWithD8(),
       new CheckSteps(debugging()),
     ];
@@ -39,13 +39,13 @@
   bool debugging() => environment.containsKey("debug");
 }
 
-class RunDdc implements DdcRunner {
+class DevCompilerRunner implements CompilerRunner {
   final WithCompilerState context;
   final bool debugging;
 
-  const RunDdc(this.context, [this.debugging = false]);
+  const DevCompilerRunner(this.context, [this.debugging = false]);
 
-  Future<Null> runDDC(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
+  Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
     Uri outDir = outputFile.resolve(".");
     String outputFilename = outputFile.pathSegments.last;
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
index d229473..d612c00 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
@@ -14,7 +14,7 @@
     const Setup(),
     const SetCwdToSdkRoot(),
     const TestStackTrace(
-        const ddc.RunDdc(false), "ddc.", const ["ddc.", "ddk."]),
+        const ddc.DevCompilerRunner(false), "ddc.", const ["ddc.", "ddk."]),
   ];
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
index 5e5b50a..b300829 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
@@ -20,8 +20,8 @@
     return _steps ??= <Step>[
       const Setup(),
       const SetCwdToSdkRoot(),
-      new TestStackTrace(
-          new ddk.RunDdc(this, false), "ddk.", const ["ddk.", "ddc."]),
+      new TestStackTrace(new ddk.DevCompilerRunner(this, false), "ddk.",
+          const ["ddk.", "ddc."]),
     ];
   }
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart
index 361e1f9..6dfaf13 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart
@@ -21,7 +21,7 @@
     /*bc:10*/ print("hex is int");
     // ignore: unnecessary_cast
     int x = hex /*bc:11*/ as int;
-    if (x. /*bc:12*/ isEven) {
+    /*bc:12*/ if (x.isEven) {
       /*bc:13*/ print("it's even even!");
     } else {
       print("but it's not even even!");
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index 1d30ae3..9fc08d7 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -30,7 +30,7 @@
 
 if [ "$KERNEL" = true ]; then
   dart -c $DDC_PATH/bin/dartdevk.dart --modules=node \
-      -o $BASENAME.js $*
+      -o $LIBROOT/$BASENAME.js $*
 else
   dart -c $DDC_PATH/bin/dartdevc.dart --modules=node --library-root=$LIBROOT \
       --dart-sdk-summary=$DDC_PATH/gen/sdk/ddc_sdk.sum \
diff --git a/pkg/dev_compiler/tool/input_sdk/private/annotations.dart b/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
index 5e8f99a..87df639 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
@@ -9,6 +9,10 @@
   const ForceInline();
 }
 
+class _NotNull {
+  const _NotNull();
+}
+
 /// Marks a variable or API to be non-nullable.
 /// ****CAUTION******
 /// This is currently unchecked, and hence should never be used
@@ -16,11 +20,7 @@
 /// or otherwise cause the contract to be violated.
 /// TODO(leafp): Consider adding static checking and exposing
 /// this to user code.
-class NotNull {
-  const NotNull();
-}
-
-const notNull = const NotNull();
+const notNull = const _NotNull();
 
 /// Marks a generic function or static method API to be not reified.
 /// ****CAUTION******
@@ -39,17 +39,17 @@
   const ReifyFunctionTypes(this.value);
 }
 
+class _NullCheck {
+  const _NullCheck();
+}
+
 /// Tells the development compiler to check a variable for null at its
 /// declaration point, and then to assume that the variable is non-null
 /// from that point forward.
 /// ****CAUTION******
 /// This is currently unchecked, and hence will not catch re-assignments
 /// of a variable with null
-class NullCheck {
-  const NullCheck();
-}
-
-const nullCheck = const NullCheck();
+const nullCheck = const _NullCheck();
 
 /// Tells the optimizing compiler that the annotated method cannot throw.
 /// Requires @NoInline() to function correctly.
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 41af78b..7e04491 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
@@ -577,7 +577,7 @@
     var typeBounds = instantiateTypeBounds(typeFormals);
     for (int i = 0, n = typeFormals.length; i < n; i++) {
       if (i != 0) s += ", ";
-      s += JS('String', '#[#].name', typeFormals, i);
+      s += JS<String>('!', '#[#].name', typeFormals, i);
       var typeBound = typeBounds[i];
       if (!identical(typeBound, _dynamic)) {
         s += " extends $typeBound";
diff --git a/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
index e3e7213..c5e77b7 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
@@ -106,7 +106,7 @@
  */
 // Add additional optional arguments if needed. The method is treated internally
 // as a variable argument method.
-JS(String typeDescription, String codeTemplate,
+T JS<T>(String typeDescription, String codeTemplate,
     [arg0,
     arg1,
     arg2,
diff --git a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
index 5f70732..7de9168 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
@@ -34,10 +34,12 @@
   const JSBool();
 
   // Note: if you change this, also change the function [S].
+  @notNull
   String toString() => JS('String', r'String(#)', this);
 
   // The values here are SMIs, co-prime and differ about half of the bit
   // positions, including the low bit, so they are different mod 2^k.
+  @notNull
   int get hashCode => this ? (2 * 3 * 23 * 3761) : (269 * 811);
 
   Type get runtimeType => bool;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
index e55e404..fa8a5d8 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
@@ -202,7 +202,7 @@
     int exponent = JS("int", "+#", match[3]);
     if (match[2] != null) {
       result = JS('String', '# + #', result, match[2]);
-      exponent -= JS('int', '#.length', match[2]);
+      exponent -= JS<int>('!', '#.length', match[2]);
     }
     return result + "0" * exponent;
   }
@@ -554,5 +554,6 @@
     return i;
   }
 
+  @notNull
   int operator ~() => JS('int', r'(~#) >>> 0', this);
 }
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 020e409..c04b1ce 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -178,6 +178,55 @@
         "fails.");
   }
 
+  /**
+   * Checks whether the expected and actual values are *not* identical
+   * (using `identical`).
+   */
+  static void notIdentical(var unexpected, var actual, [String reason = null]) {
+    if (!_identical(unexpected, actual)) return;
+    String msg = _getMessage(reason);
+    _fail("Expect.notIdentical(expected and actual: <$actual>$msg) fails.");
+  }
+
+  /**
+   * Checks that no two [objects] are `identical`.
+   */
+  static void allDistinct(List<Object> objects, [String reason = null]) {
+    String msg = _getMessage(reason);
+    var equivalences = new List<List<int>>(objects.length);
+    bool hasEquivalence = false;
+    for (int i = 0; i < objects.length; i++) {
+      if (equivalences[i] != null) continue;
+      var o = objects[i];
+      for (int j = i + 1; j < objects.length; j++) {
+        if (equivalences[j] != null) continue;
+        if (_identical(o, objects[j])) {
+          equivalences[j] = (equivalences[i] ??= <int>[i])..add(j);
+          hasEquivalence = true;
+        }
+      }
+    }
+    if (!hasEquivalence) return;
+    var buffer = new StringBuffer("Expect.allDistinct([");
+    var separator = "";
+    for (int i = 0; i < objects.length; i++) {
+      buffer.write(separator);
+      separator = ",";
+      var equivalence = equivalences[i];
+      if (equivalence == null) {
+        buffer.write('_');
+      } else {
+        int first = equivalence[0];
+        buffer..write('#')..write(first);
+        if (first == i) {
+          buffer..write('=')..write(objects[i]);
+        }
+      }
+    }
+    buffer..write("]")..write(msg)..write(")");
+    _fail(buffer.toString());
+  }
+
   // Unconditional failure.
   static void fail(String msg) {
     _fail("Expect.fail('$msg')");
@@ -514,15 +563,16 @@
   }
 }
 
+/// Used in [Expect] because [Expect.identical] shadows the real [identical].
 bool _identical(a, b) => identical(a, b);
 
 typedef bool _CheckExceptionFn(exception);
 typedef _Nullary(); // Expect.throws argument must be this type.
 
 class ExpectException implements Exception {
+  final String message;
   ExpectException(this.message);
   String toString() => message;
-  String message;
 }
 
 /// Annotation class for testing of dart2js. Use this as metadata on method
diff --git a/pkg/expect/test/distinct_test.dart b/pkg/expect/test/distinct_test.dart
new file mode 100644
index 0000000..5750782
--- /dev/null
+++ b/pkg/expect/test/distinct_test.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+main() {
+  var o1 = new Object();
+  var o2 = new Object();
+  var o3 = new Object();
+  var c1 = new C(0);
+  var c2 = new C(0);
+
+  // Successful checks.
+  Expect.notIdentical(o1, o2, "msg");
+
+  Expect.equals(c1, c2);
+  Expect.notIdentical(c1, c2, "msg");
+
+  Expect.notIdentical([1], [1], "msg");
+
+  Expect.allDistinct([], "msg");
+  Expect.allDistinct([o1], "msg");
+  Expect.allDistinct([
+    o1,
+    o2,
+    c1,
+    c2,
+    [1]
+  ], "msg");
+  Expect.allDistinct(new List.generate(100, (_) => new Object()));
+
+  fails((msg) {
+    Expect.notIdentical(o1, o1, msg);
+  });
+
+  fails((msg) {
+    var list = [1];
+    Expect.notIdentical(list, list, msg);
+  });
+
+  fails((msg) {
+    Expect.allDistinct([o1, o1], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o1, o1, o1], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o1, o2, o3], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o2, o1, o3], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o2, o3, o1], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o2, o2, o3], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o2, o3, o2], msg);
+  });
+  fails((msg) {
+    Expect.allDistinct([o1, o2, o3, o3], msg);
+  });
+  fails((msg) {
+    var list = new List.generate(100, (_) => new Object());
+    list.add(list[0]);
+    Expect.allDistinct(list, msg);
+  });
+}
+
+class C {
+  final x;
+  const C(this.x);
+  int get hashCode => x.hashCode;
+  bool operator ==(Object other) => other is C && x == other.x;
+}
+
+int _ctr = 0;
+fails(test(msg)) {
+  var msg = "__#${_ctr++}#__"; // "Unique" name.
+  try {
+    test(msg);
+    throw "Did not throw!";
+  } on ExpectException catch (e) {
+    if (e.message.indexOf(msg) < 0) {
+      throw "Failure did not contain message: \"$msg\" not in ${e.message}";
+    }
+  }
+}
diff --git a/pkg/front_end/example/incremental_reload/compiler_with_invalidation.dart b/pkg/front_end/example/incremental_reload/compiler_with_invalidation.dart
deleted file mode 100644
index f164c52..0000000
--- a/pkg/front_end/example/incremental_reload/compiler_with_invalidation.dart
+++ /dev/null
@@ -1,170 +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.
-
-/// A wrapper on top of the [IncrementalKernelGenerator] that tracks
-/// file modifications between subsequent compilation requests and only
-/// invalidates those files that appear to be modified.
-library front_end.example.incremental_reload.compiler_with_invalidation;
-
-import 'dart:io';
-import 'dart:async';
-
-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/incremental_kernel_generator.dart';
-import 'package:kernel/ast.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
-import 'package:kernel/target/targets.dart';
-
-/// Create an instance of an [IncrementalCompiler] to compile a program whose
-/// main entry point file is [entry]. This uses some default options
-/// for the location of the sdk and temporary folder to save intermediate
-/// results.
-Future<IncrementalCompiler> createIncrementalCompiler(String entry,
-    {bool persistent: true, Uri sdkRoot, Target target}) {
-  var entryUri = Uri.base.resolve(entry);
-  var tmpDir = Directory.systemTemp.createTempSync('ikg_cache');
-  var options = new CompilerOptions()
-    ..sdkRoot = sdkRoot ?? Uri.base.resolve("sdk/")
-    ..packagesFileUri = Uri.base.resolve('.packages')
-    ..strongMode = false
-    ..target = target
-    // Note: we do not report error on the console because the incremental
-    // compiler is an ongoing background service that shouldn't polute stdout.
-    // TODO(sigmund): do something with the errors.
-    ..onError = (_) {}
-    ..byteStore =
-        persistent ? new FileByteStore(tmpDir.path) : new MemoryByteStore();
-  return IncrementalCompiler.create(options, entryUri);
-}
-
-/// An incremental compiler that monitors file modifications on disk and
-/// invalidates only files that have been modified since the previous time the
-/// compiler was invoked.
-class IncrementalCompiler {
-  /// Underlying incremental compiler implementation.
-  IncrementalKernelGenerator _generator;
-
-  /// Last modification for each tracked input file.
-  Map<Uri, DateTime> lastModified = {};
-
-  /// Create an instance of [IncrementalCompiler].
-  static Future<IncrementalCompiler> create(
-      CompilerOptions options, Uri entryUri) async {
-    var compiler = new IncrementalCompiler._internal();
-    compiler._generator = await IncrementalKernelGenerator
-        .newInstance(options, entryUri, watch: compiler._watch);
-    return compiler;
-  }
-
-  IncrementalCompiler._internal();
-
-  /// Callback for the [IncrementalKernelGenerator] to keep track of relevant
-  /// files.
-  Future _watch(Uri uri, bool used) {
-    if (used) {
-      lastModified[uri] ??= new File.fromUri(uri).lastModifiedSync();
-    } else {
-      lastModified.remove(uri);
-    }
-    return new Future.value(null);
-  }
-
-  /// How many files changed during the last call to [recompile].
-  int changed;
-
-  /// Time spent updating time-stamps from disk during the last call to
-  /// [recompile].
-  int invalidateTime;
-
-  /// Time actually spent compiling the code in the incremental compiler during
-  /// the last call to [recompile].
-  int compileTime;
-
-  /// Determine which files have been modified, and recompile the program
-  /// incrementally based on that information.
-  Future<Program> recompile() async {
-    changed = 0;
-    invalidateTime = 0;
-    compileTime = 0;
-
-    var invalidateTimer = new Stopwatch()..start();
-    for (var uri in lastModified.keys.toList()) {
-      var last = lastModified[uri];
-      var current = new File.fromUri(uri).lastModifiedSync();
-      if (last != current) {
-        lastModified[uri] = current;
-        _generator.invalidate(uri);
-        changed++;
-      }
-    }
-    invalidateTimer.stop();
-    invalidateTime = invalidateTimer.elapsedMilliseconds;
-    if (changed == 0 && lastModified.isNotEmpty) return null;
-
-    var compileTimer = new Stopwatch()..start();
-    var delta = await _generator.computeDelta();
-    _generator.acceptLastDelta();
-    compileTimer.stop();
-    compileTime = compileTimer.elapsedMilliseconds;
-    var program = delta.newProgram;
-    return program;
-  }
-}
-
-/// The result of an incremental compile and metrics collected during the
-/// the compilation.
-class CompilationResult {
-  /// How many files were modified by the time we invoked the compiler again.
-  int changed = 0;
-
-  /// How many files are currently being tracked for modifications.
-  int totalFiles = 0;
-
-  /// How long it took to invalidate files that have been modified.
-  int invalidateTime = 0;
-
-  /// How long it took to build the incremental program.
-  int compileTime = 0;
-
-  /// How long it took to do the hot-reload in the VM.
-  int reloadTime = 0;
-
-  /// Whether we saw errors during compilation or reload.
-  bool errorSeen = false;
-
-  /// Error message when [errorSeen] is true.
-  String errorDetails;
-
-  /// The program that was generated by the incremental compiler.
-  Program program;
-}
-
-/// Request a recompile and possibly a reload, and gather timing metrics.
-Future<CompilationResult> rebuild(
-    IncrementalCompiler compiler, Uri outputUri) async {
-  var result = new CompilationResult();
-  try {
-    var program = result.program = await compiler.recompile();
-    if (program != null && !program.libraries.isEmpty) {
-      var sink = new File.fromUri(outputUri).openWrite();
-      // TODO(sigmund): should the incremental generator always filter these
-      // libraries instead?
-      new LimitedBinaryPrinter(
-              sink, (library) => library.importUri.scheme != 'dart', false)
-          .writeProgramFile(program);
-      await sink.close();
-    }
-  } catch (e, t) {
-    result.errorDetails = 'compilation error: $e, $t';
-    result.errorSeen = true;
-  }
-
-  result.changed = compiler.changed;
-  result.totalFiles = compiler.lastModified.length;
-  result.invalidateTime = compiler.invalidateTime;
-  result.compileTime = compiler.compileTime;
-  result.reloadTime = 0;
-  return result;
-}
diff --git a/pkg/front_end/example/incremental_reload/run.dart b/pkg/front_end/example/incremental_reload/run.dart
deleted file mode 100644
index dace9a4..0000000
--- a/pkg/front_end/example/incremental_reload/run.dart
+++ /dev/null
@@ -1,311 +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.
-
-/// Example that illustrates how to use the incremental compiler and trigger a
-/// hot-reload on the VM after recompiling the application.
-///
-/// This example resembles the `run` command in flutter-tools. It creates an
-/// interactive command-line program that waits for the user to tap a key to
-/// trigger a recompile and reload.
-///
-/// The following instructions assume a linux checkout of the SDK:
-///   * Build the SDK
-///
-/// ```
-///    ./tools/build.py -m release
-/// ```
-///
-///   * On one terminal (terminal A), start this script and point it to an
-///   example program "foo.dart" and keep the job running. A good example
-///   program would do something periodically, so you can see the effect
-///   of a hot-reload while the app is running.
-///
-/// ```
-///    out/ReleaseX64/dart pkg/front_end/example/incremental_reload/run.dart foo.dart out.dill
-/// ```
-///
-///   * Trigger an initial compile of the program by hitting the "c" key in
-///   terminal A.
-///
-///   * On another terminal (terminal B), start the program on the VM, with the
-///   service-protocol enabled and provide the precompiled platform libraries:
-///
-/// TODO(ahe): This documentation is out of date.
-/// ```
-///    out/ReleaseX64/dart --enable-vm-service --platform=out/ReleaseX64/platform.dill out.dill
-/// ```
-///
-///   * Modify the orginal program
-///
-///   * In terminal A, hit the "r" key to trigger a recompile and hot reload.
-///
-///   * See the changed program in terminal B
-library front_end.example.incremental_reload.run;
-
-import 'dart:io';
-import 'dart:async';
-import 'dart:convert' show ASCII;
-
-import 'package:args/args.dart';
-import 'package:kernel/target/targets.dart';
-
-import '../../test/tool/reload.dart';
-
-import 'compiler_with_invalidation.dart';
-
-ArgParser argParser = new ArgParser(allowTrailingOptions: true)
-  ..addOption('sdk-root', help: 'Path to sdk for compilation')
-  ..addOption('output',
-      help: 'Output dill file', defaultsTo: 'out.dill', abbr: 'o')
-  ..addOption('target',
-      help: 'One of none, vm, vmcc, vmreify, flutter', defaultsTo: 'vm');
-
-String usage = '''
-Usage: dart [options] input.dart
-
-Runs console-driven incremental compiler.
-
-Options:
-${argParser.usage}
-''';
-
-RemoteVm remoteVm = new RemoteVm();
-AnsiTerminal terminal = new AnsiTerminal();
-
-main(List<String> args) async {
-  ArgResults options = argParser.parse(args);
-  if (options.rest.isEmpty) {
-    print('Need an input file');
-    print(usage);
-    exit(1);
-  }
-
-  var compiler = await createIncrementalCompiler(options.rest[0],
-      sdkRoot:
-          options['sdk-root'] != null ? Uri.parse(options['sdk-root']) : null,
-      target: targets[options['target']](new TargetFlags()));
-  var outputUri = Uri.base.resolve(options['output']);
-
-  showHeader();
-  listenOnKeyPress(compiler, outputUri)
-      .whenComplete(() => remoteVm.disconnect());
-}
-
-/// Implements the interactive UI by listening for input keys from the user.
-Future listenOnKeyPress(IncrementalCompiler compiler, Uri outputUri) {
-  var completer = new Completer();
-  terminal.singleCharMode = true;
-  StreamSubscription subscription;
-  subscription = terminal.onCharInput.listen((String char) async {
-    try {
-      CompilationResult compilationResult;
-      ReloadResult reloadResult;
-      switch (char.trim()) {
-        case 'r':
-          compilationResult = await rebuild(compiler, outputUri);
-          if (!compilationResult.errorSeen &&
-              compilationResult.program != null &&
-              compilationResult.program.libraries.isNotEmpty) {
-            reloadResult = await reload(outputUri);
-          }
-          break;
-        case 'c':
-          compilationResult = await rebuild(compiler, outputUri);
-          break;
-        case 'l':
-          reloadResult = await reload(outputUri);
-          break;
-        case 'q':
-          terminal.singleCharMode = false;
-          print('');
-          subscription.cancel();
-          completer.complete(null);
-          break;
-        default:
-          break;
-      }
-      if (compilationResult != null || reloadResult != null) {
-        reportStats(compilationResult, reloadResult, outputUri);
-      }
-    } catch (e) {
-      terminal.singleCharMode = false;
-      subscription.cancel();
-      completer.completeError(null);
-      rethrow;
-    }
-  }, onError: (e) {
-    terminal.singleCharMode = false;
-    subscription.cancel();
-    completer.completeError(null);
-  });
-
-  return completer.future;
-}
-
-/// Request a reload and gather timing metrics.
-Future<ReloadResult> reload(outputUri) async {
-  var result = new ReloadResult();
-  var reloadTimer = new Stopwatch()..start();
-  var reloadResult = await remoteVm.reload(outputUri);
-  reloadTimer.stop();
-  result.reloadTime = reloadTimer.elapsedMilliseconds;
-  result.errorSeen = false;
-  result.errorDetails;
-  if (!reloadResult['success']) {
-    result.errorSeen = true;
-    result.errorDetails = reloadResult['details']['notices'].first['message'];
-  }
-  return result;
-}
-
-/// Results from requesting a hot reload.
-class ReloadResult {
-  /// How long it took to do the hot-reload in the VM.
-  int reloadTime = 0;
-
-  /// Whether we saw errors during compilation or reload.
-  bool errorSeen = false;
-
-  /// Error message when [errorSeen] is true.
-  String errorDetails;
-}
-
-/// This script shows stats about each reload on the terminal in a table form.
-/// This function prints out the header of such table.
-showHeader() {
-  print(terminal.bolden('Press a key to trigger a command:'));
-  print(terminal.bolden('   r:  incremental compile + reload'));
-  print(terminal.bolden('   c:  incremental compile w/o reload'));
-  print(terminal.bolden('   l:  reload w/o recompile'));
-  print(terminal.bolden('   q:  quit'));
-  print(terminal.bolden(
-      '#    Files     Files %      ------- Time -------------------------  Binary\n'
-      '     Modified  Sent  Total      Check Compile   Reload    Total      Avg   Size  '));
-}
-
-/// Whether to show stats as a single line (override metrics on each request)
-const bool singleLine = false;
-
-var total = 0;
-var iter = 0;
-var timeSum = 0;
-var lastLine = 0;
-
-/// Show stats about a recompile and reload.
-reportStats(CompilationResult compilationResult, ReloadResult reloadResult,
-    Uri outputUri) {
-  compilationResult ??= new CompilationResult();
-  reloadResult ??= new ReloadResult();
-  int changed = compilationResult.changed;
-  int updated = compilationResult.program?.libraries?.length ?? 0;
-  int totalFiles = compilationResult.totalFiles;
-  int invalidateTime = compilationResult.invalidateTime;
-  int compileTime = compilationResult.compileTime;
-  int reloadTime = reloadResult.reloadTime;
-  bool errorSeen = compilationResult.errorSeen || reloadResult.errorSeen;
-  String errorDetails =
-      compilationResult.errorDetails ?? reloadResult.errorDetails;
-
-  var totalTime = invalidateTime + compileTime + reloadTime;
-  timeSum += totalTime;
-  total++;
-  iter++;
-  var avgTime = (timeSum / total).truncate();
-  var size = new File.fromUri(outputUri).statSync().size;
-
-  var percent = (100 * updated / totalFiles).toStringAsFixed(0);
-  var line = '${_padl(iter, 3)}: '
-      '${_padl(changed, 8)}  ${_padl(updated, 5)} ${_padl(percent, 4)}%  '
-      '${_padl(invalidateTime, 5)} ms '
-      '${_padl(compileTime, 5)} ms '
-      '${_padl(reloadTime, 5)} ms '
-      '${_padl(totalTime, 5)} ms '
-      '${_padl(avgTime, 5)} ms '
-      '${_padl(size, 5)}b';
-  var len = line.length;
-  if (singleLine) stdout.write('\r');
-  stdout.write((errorSeen) ? terminal.red(line) : terminal.green(line));
-  if (!singleLine) stdout.write('\n');
-  if (errorSeen) {
-    if (!singleLine) errorDetails = '  error: $errorDetails\n';
-    len += errorDetails.length;
-    stdout.write(errorDetails);
-  }
-  if (singleLine) {
-    var diff = " " * (lastLine - len);
-    stdout.write(diff);
-  }
-  lastLine = len;
-}
-
-_padl(x, n) {
-  var s = '$x';
-  return ' ' * (n - s.length) + s;
-}
-
-/// Helper to control an ANSI terminal (adapted from flutter_tools)
-class AnsiTerminal {
-  static const String _bold = '\u001B[1m';
-  static const String _green = '\u001B[32m';
-  static const String _red = '\u001B[31m';
-  static const String _reset = '\u001B[0m';
-  static const String _clear = '\u001B[2J\u001B[H';
-
-  static const int _ENXIO = 6;
-  static const int _ENOTTY = 25;
-  static const int _ENETRESET = 102;
-  static const int _INVALID_HANDLE = 6;
-
-  /// Setting the line mode can throw for some terminals (with "Operation not
-  /// supported on socket"), but the error can be safely ignored.
-  static const List<int> _lineModeIgnorableErrors = const <int>[
-    _ENXIO,
-    _ENOTTY,
-    _ENETRESET,
-    _INVALID_HANDLE,
-  ];
-
-  String bolden(String message) => wrap(message, _bold);
-
-  String green(String message) => wrap(message, _green);
-
-  String red(String message) => wrap(message, _red);
-
-  String wrap(String message, String escape) {
-    final StringBuffer buffer = new StringBuffer();
-    for (String line in message.split('\n'))
-      buffer.writeln('$escape$line$_reset');
-    final String result = buffer.toString();
-    // avoid introducing a new newline to the emboldened text
-    return (!message.endsWith('\n') && result.endsWith('\n'))
-        ? result.substring(0, result.length - 1)
-        : result;
-  }
-
-  String clearScreen() => _clear;
-
-  set singleCharMode(bool value) {
-    // TODO(goderbauer): instead of trying to set lineMode and then catching
-    // [_ENOTTY] or [_INVALID_HANDLE], we should check beforehand if stdin is
-    // connected to a terminal or not.
-    // (Requires https://github.com/dart-lang/sdk/issues/29083 to be resolved.)
-    try {
-      // The order of setting lineMode and echoMode is important on Windows.
-      if (value) {
-        stdin.echoMode = false;
-        stdin.lineMode = false;
-      } else {
-        stdin.lineMode = true;
-        stdin.echoMode = true;
-      }
-    } on StdinException catch (error) {
-      if (!_lineModeIgnorableErrors.contains(error.osError?.errorCode)) rethrow;
-    }
-  }
-
-  /// Return keystrokes from the console.
-  ///
-  /// Useful when the console is in [singleCharMode].
-  Stream<String> get onCharInput => stdin.transform(ASCII.decoder);
-}
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index aae2ecf..e01387f 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -2,171 +2,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
+import 'dart:async' show Future;
 
-import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/compiler_context.dart';
-import 'package:front_end/src/incremental_kernel_generator_impl.dart';
-import 'package:front_end/src/minimal_incremental_kernel_generator.dart';
-import 'package:kernel/kernel.dart';
+import 'package:kernel/kernel.dart' show Program;
 
-import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
+import '../base/processed_options.dart' show ProcessedOptions;
 
-import 'compiler_options.dart';
+import '../fasta/compiler_context.dart' show CompilerContext;
 
-/// Force using the Fasta incremental compiler [IncrementalCompiler]. This is
-/// useful for uploading patches to golem (benchmark service).
-const bool _forceFasta = false;
+import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
 
-/// When true, use the Fasta incremental compiler [IncrementalCompiler].
-const bool _useFasta =
-    const bool.fromEnvironment("ikg-use-fasta", defaultValue: _forceFasta);
+import 'compiler_options.dart' show CompilerOptions;
 
-/// The type of the function that clients can pass to track used files.
-///
-/// When a file is first used during compilation, this function is called with
-/// the [Uri] of that file and [used] == `true`. The content of the file is not
-/// read until the [Future] returned by the function completes. If, during a
-/// subsequent compilation, a file that was being used is no longer used, then
-/// the function is called with the [Uri] of that file and [used] == `false`.
-///
-/// Multiple invocations of may be running concurrently.
-///
-typedef Future<Null> WatchUsedFilesFn(Uri uri, bool used);
-
-/// Represents the difference between "old" and "new" states of a program.
-///
-/// Not intended to be implemented or extended by clients.
-class DeltaProgram {
-  /// The state of the program.
-  ///
-  /// It should be treated as opaque data by the clients. Its only purpose is
-  /// to be passed to [IncrementalKernelGeneratorImpl.setState].
-  final String state;
-
-  /// The new program.
-  ///
-  /// It includes full kernels for changed libraries and for libraries that
-  /// are affected by the transitive change of API in the changed libraries.
-  ///
-  /// For VM reload purposes we need to provide also full kernels for the
-  /// libraries that are transitively imported by the entry point and
-  /// transitively import a changed library.
-  ///
-  /// Also includes external references to other libraries that were not
-  /// modified or affected.
-  final Program newProgram;
-
-  DeltaProgram(this.state, this.newProgram);
-}
-
-/// Interface for generating an initial kernel representation of a program and
-/// keeping it up to date as incremental changes are made.
-///
-/// This class maintains an internal "current program state"; each time
-/// [computeDelta] is called, it computes the "last program state" and libraries
-/// that were affected relative to the "current program state".  When there are
-/// few changes, a call to [computeDelta] should be much faster than compiling
-/// the whole program from scratch.
-///
-/// Each invocation of [computeDelta] must be followed by invocation of either
-/// [acceptLastDelta] or [rejectLastDelta].  [acceptLastDelta] makes the
-/// "last program state" the "current program state".  [rejectLastDelta] simply
-/// discards the "last program state", so that the "current program state"
-/// stays the same.
-///
-/// This class also maintains a set of "valid sources", which is a (possibly
-/// empty) subset of the sources constituting the previous program state.  Files
-/// in this set are assumed to be unchanged since the last call to
-/// [computeDelta].
-///
-/// Behavior is undefined if the client does not obey the following concurrency
-/// restrictions:
-/// - no two invocations of [computeDelta] may be outstanding at any given time.
-/// - [invalidate] may not be called while an invocation of [computeDelta] is
-///   outstanding.
-///
-/// Not intended to be implemented or extended by clients.
 abstract class IncrementalKernelGenerator {
-  /// Notify the generator that the last [DeltaProgram] returned from the
-  /// [computeDelta] was accepted.  So, the "last program state" becomes the
-  /// "current program state", and the next invocation of [computeDelta] will
-  /// not include the libraries of the last delta, unless these libraries are
-  /// affected by [invalidate] since the last [computeDelta].
-  void acceptLastDelta();
+  factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint) {
+    return new IncrementalCompiler(new CompilerContext(
+        new ProcessedOptions(options, false, [entryPoint])));
+  }
 
-  /// Generates a kernel representation of the changes to the program, assuming
-  /// that all valid sources are unchanged since the last call to
-  /// [computeDelta].
-  ///
-  /// Source files in the set of valid sources are guaranteed not to be re-read
-  /// from disk; they are assumed to be unchanged regardless of the state of the
-  /// filesystem.
-  ///
-  /// If the future completes successfully, the previous file state is updated
-  /// and the set of valid sources is set to the set of all sources in the
-  /// program.
-  ///
-  /// If the future completes with an error (due to errors in the compiled
-  /// source code), the caller may consider the previous file state and the set
-  /// of valid sources to be unchanged; this means that once the user fixes the
-  /// errors, it is safe to call [computeDelta] again.
-  ///
-  /// Each invocation of [computeDelta] must be followed by invocation of
-  /// either [acceptLastDelta] or [rejectLastDelta].
-  Future<DeltaProgram> computeDelta();
+  /// Returns a component (nee program) whose libraries are the recompiled
+  /// libraries.
+  Future<Program> computeDelta({Uri entryPoint});
 
   /// Remove the file associated with the given file [uri] from the set of
   /// valid files.  This guarantees that those files will be re-read on the
   /// next call to [computeDelta]).
   void invalidate(Uri uri);
-
-  /// Notify the generator that the last [DeltaProgram] returned from the
-  /// [computeDelta] was rejected.  The "last program state" is discarded and
-  /// the "current program state" is kept unchanged.
-  void rejectLastDelta();
-
-  /// Notify the generator that the client wants to reset the "current program
-  /// state" to nothing, so that the next invocation of [computeDelta] will
-  /// include all the program libraries.  Neither [acceptLastDelta] nor
-  /// [rejectLastDelta] are allowed after this method until the next
-  /// [computeDelta] invocation.
-  void reset();
-
-  /// Set the "current program state", so that the next invocation of
-  /// [computeDelta] will include only libraries changed since this [state].
-  ///
-  /// The [state] must be a value returned in [DeltaProgram.state].
-  void setState(String state);
-
-  /// Creates an [IncrementalKernelGenerator] which is prepared to generate
-  /// kernel representations of the program whose main library is in the given
-  /// [entryPoint].
-  ///
-  /// The initial "previous program state" is an empty program containing no
-  /// code, and the initial set of valid sources is empty.  To obtain a kernel
-  /// representation of the program, call [computeDelta].
-  static Future<IncrementalKernelGenerator> newInstance(
-      CompilerOptions options, Uri entryPoint,
-      {WatchUsedFilesFn watch, bool useMinimalGenerator: false}) async {
-    var processedOptions = new ProcessedOptions(options, false, [entryPoint]);
-    if (_useFasta) {
-      return new IncrementalCompiler(new CompilerContext(processedOptions));
-    }
-    return await CompilerContext.runWithOptions(processedOptions,
-        (compilerContext) async {
-      var uriTranslator = await processedOptions.getUriTranslator();
-      var sdkOutlineBytes = await processedOptions.loadSdkSummaryBytes();
-      if (useMinimalGenerator) {
-        return new MinimalIncrementalKernelGenerator(
-            processedOptions, uriTranslator, sdkOutlineBytes, entryPoint,
-            watch: watch);
-      } else {
-        return new IncrementalKernelGeneratorImpl(
-            processedOptions, uriTranslator, sdkOutlineBytes, entryPoint,
-            watch: watch);
-      }
-    });
-  }
 }
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 e9f701a..a858fa1a 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -52,6 +52,8 @@
         exportScopeBuilder = new ScopeBuilder(exportScope),
         super(null, -1, fileUri);
 
+  bool get isPart => false;
+
   @override
   String get debugName => "LibraryBuilder";
 
diff --git a/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart b/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart
index c4bfb5f..85234f3 100644
--- a/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart
@@ -10,7 +10,7 @@
         ProcedureKind,
         Name,
         FunctionNode,
-        ExpressionStatement,
+        ReturnStatement,
         LibraryDependency;
 
 import 'builder.dart' show Builder, LibraryBuilder;
@@ -39,10 +39,8 @@
     if (tearoff != null) return tearoff;
     LoadLibrary expression = createLoadLibrary(charOffset);
     String prefix = expression.import.name;
-    tearoff = new Procedure(
-        new Name('__loadLibrary_$prefix', parent.target),
-        ProcedureKind.Method,
-        new FunctionNode(new ExpressionStatement(expression)),
+    tearoff = new Procedure(new Name('__loadLibrary_$prefix', parent.target),
+        ProcedureKind.Method, new FunctionNode(new ReturnStatement(expression)),
         fileUri: parent.target.fileUri)
       ..fileOffset = charOffset;
     return tearoff;
diff --git a/pkg/front_end/lib/src/fasta/configuration.dart b/pkg/front_end/lib/src/fasta/configuration.dart
new file mode 100644
index 0000000..d12a43a
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/configuration.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.
+
+library fasta.configuration;
+
+class Configuration {
+  final int charOffset;
+  final String dottedName;
+  final String condition;
+  final String importUri;
+  Configuration(
+      this.charOffset, this.dottedName, this.condition, this.importUri);
+}
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index 6850699..09ababc 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -12,6 +12,8 @@
 
 import 'combinator.dart' show Combinator;
 
+import 'configuration.dart' show Configuration;
+
 typedef void AddToScope(String name, Builder member);
 
 class Import {
@@ -29,12 +31,21 @@
 
   final List<Combinator> combinators;
 
+  final List<Configuration> configurations;
+
   final int charOffset;
 
   final int prefixCharOffset;
 
-  Import(this.importer, this.imported, this.deferred, this.prefix,
-      this.combinators, this.charOffset, this.prefixCharOffset)
+  Import(
+      this.importer,
+      this.imported,
+      this.deferred,
+      this.prefix,
+      this.combinators,
+      this.configurations,
+      this.charOffset,
+      this.prefixCharOffset)
       : prefixBuilder = createPrefixBuilder(prefix, importer, imported,
             combinators, deferred, charOffset, prefixCharOffset);
 
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 0a3c742..2c8d581 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -10,7 +10,7 @@
     show Library, Program, Source, loadProgramFromBytes;
 
 import '../api_prototype/incremental_kernel_generator.dart'
-    show DeltaProgram, IncrementalKernelGenerator;
+    show IncrementalKernelGenerator;
 
 import 'builder/builder.dart' show LibraryBuilder;
 
@@ -24,44 +24,11 @@
 
 import 'compiler_context.dart' show CompilerContext;
 
-import 'problems.dart' show unsupported;
-
 import 'ticker.dart' show Ticker;
 
 import 'uri_translator.dart' show UriTranslator;
 
-abstract class DeprecatedIncrementalKernelGenerator
-    implements IncrementalKernelGenerator {
-  /// This does nothing. It will be deprecated.
-  @override
-  void acceptLastDelta() {}
-
-  /// Always throws an error. Will be deprecated.
-  @override
-  void rejectLastDelta() => unsupported("rejectLastDelta", -1, null);
-
-  /// Always throws an error. Will be deprecated.
-  @override
-  void reset() => unsupported("rejectLastDelta", -1, null);
-
-  /// Always throws an error. Will be deprecated.
-  @override
-  void setState(String state) => unsupported("setState", -1, null);
-}
-
-abstract class DeprecatedDeltaProgram implements DeltaProgram {
-  @override
-  String get state => unsupported("state", -1, null);
-}
-
-class FastaDelta extends DeprecatedDeltaProgram {
-  @override
-  final Program newProgram;
-
-  FastaDelta(this.newProgram);
-}
-
-class IncrementalCompiler extends DeprecatedIncrementalKernelGenerator {
+class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
   final Ticker ticker;
@@ -75,10 +42,10 @@
   IncrementalCompiler(this.context) : ticker = context.options.ticker;
 
   @override
-  Future<FastaDelta> computeDelta({Uri entryPoint}) async {
+  Future<Program> computeDelta({Uri entryPoint}) async {
     ticker.reset();
     entryPoint ??= context.options.inputs.single;
-    return context.runInContext<Future<FastaDelta>>((CompilerContext c) async {
+    return context.runInContext<Future<Program>>((CompilerContext c) async {
       if (platform == null) {
         UriTranslator uriTranslator = await c.options.getUriTranslator();
         ticker.logMs("Read packages file");
@@ -105,6 +72,9 @@
             " of ${userCode.loader.builders.length} libraries");
       }
 
+      platform.loader.builders.forEach((Uri uri, LibraryBuilder builder) {
+        reusedLibraries.add(builder);
+      });
       userCode = new KernelTarget(
           c.fileSystem, false, platform, platform.uriTranslator,
           uriToSource: c.uriToSource);
@@ -125,17 +95,15 @@
           await userCode.buildProgram(verify: c.options.verify);
 
       // This is the incremental program.
-      Program program = new Program(
-          nameRoot: programWithDill.root,
+      return new Program(
           libraries: new List<Library>.from(userCode.loader.libraries),
-          uriToSource: new Map<Uri, Source>.from(userCode.uriToSource));
-
-      return new FastaDelta(program);
+          uriToSource: new Map<Uri, Source>.from(userCode.uriToSource))
+        ..mainMethod = programWithDill?.mainMethod;
     });
   }
 
   List<LibraryBuilder> computeReusedLibraries(Iterable<Uri> invalidatedUris) {
-    if (userCode == null) return const <LibraryBuilder>[];
+    if (userCode == null) return <LibraryBuilder>[];
 
     // [invalidatedUris] converted to a set.
     Set<Uri> invalidatedFileUris = invalidatedUris.toSet();
@@ -148,17 +116,23 @@
     List<Uri> invalidatedImportUris = <Uri>[];
 
     // Compute [builders] and [invalidatedImportUris].
-    userCode.loader.builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library.loader != platform.loader) {
-        assert(library is SourceLibraryBuilder);
+    addBuilderAndInvalidateUris(Uri uri, LibraryBuilder libraryBuilder) {
+      if (libraryBuilder.loader != platform.loader) {
+        assert(libraryBuilder is SourceLibraryBuilder);
+        SourceLibraryBuilder library = libraryBuilder;
         builders[uri] = library;
         if (invalidatedFileUris.contains(uri) ||
             (uri != library.fileUri &&
                 invalidatedFileUris.contains(library.fileUri))) {
           invalidatedImportUris.add(uri);
         }
+        for (var part in library.parts) {
+          addBuilderAndInvalidateUris(part.uri, part);
+        }
       }
-    });
+    }
+
+    userCode.loader.builders.forEach(addBuilderAndInvalidateUris);
 
     SourceGraph graph = new SourceGraph(builders);
 
@@ -188,7 +162,7 @@
       }
     }
 
-    return builders.values.toList();
+    return builders.values.where((builder) => !builder.isPart).toList();
   }
 
   @override
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 e2d9584..b2c9042 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1852,7 +1852,7 @@
       }
     }
     if (name is TypeDeclarationAccessor) {
-      push(name.buildType(arguments));
+      push(name.buildTypeWithBuiltArguments(arguments));
     } else if (name is FastaAccessor) {
       addProblem(fasta.templateNotAType.withArguments(beginToken.lexeme),
           beginToken.charOffset);
@@ -2222,16 +2222,15 @@
       if (optional("-", token)) {
         operator = "unary-";
 
-        var new_receiver = null;
         if (receiver is LargeIntAccessor) {
           int value =
               int.parse("-" + receiver.token.lexeme, onError: (_) => null);
           if (value != null) {
-            new_receiver = new ShadowIntLiteral(value)
-              ..fileOffset = offsetForToken(token);
+            push(new ShadowIntLiteral(value)
+              ..fileOffset = offsetForToken(token));
+            return;
           }
         }
-        if (new_receiver != null) receiver = new_receiver;
       }
       bool isSuper = false;
       Expression receiverValue;
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 e76982b..5f39fe4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -47,11 +47,15 @@
         Builder,
         FunctionTypeAliasBuilder,
         KernelClassBuilder,
+        KernelFunctionTypeAliasBuilder,
         KernelInvalidTypeBuilder,
+        KernelLibraryBuilder,
+        KernelTypeVariableBuilder,
         LibraryBuilder,
         LoadLibraryBuilder,
         PrefixBuilder,
-        TypeDeclarationBuilder;
+        TypeDeclarationBuilder,
+        KernelTypeBuilder;
 
 import 'kernel_shadow_ast.dart'
     show
@@ -65,10 +69,10 @@
         ShadowTypeLiteral,
         ShadowVariableAssignment;
 
-import 'kernel_type_variable_builder.dart' show KernelTypeVariableBuilder;
-
 import 'utils.dart' show offsetForToken;
 
+import 'type_algorithms.dart' show calculateBoundsForDeclaration;
+
 abstract class BuilderHelper {
   LibraryBuilder get library;
 
@@ -1050,8 +1054,8 @@
               ..fileOffset = offsetForToken(token))
           ..fileOffset = offset;
       } else {
-        super.expression = new ShadowTypeLiteral(
-            prefix?.name, buildType(null, nonInstanceAccessIsError: true))
+        super.expression = new ShadowTypeLiteral(prefix?.name,
+            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true))
           ..fileOffset = offsetForToken(token);
       }
     }
@@ -1111,7 +1115,7 @@
     }
   }
 
-  DartType buildType(List<DartType> arguments,
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
       {bool nonInstanceAccessIsError: false}) {
     if (arguments != null) {
       int expected = 0;
@@ -1138,8 +1142,68 @@
         arguments = null;
       }
     }
-    DartType type =
-        declaration.buildTypesWithBuiltArguments(helper.library, arguments);
+
+    DartType type;
+    LibraryBuilder helperLibrary = helper.library;
+    if (arguments == null &&
+        helperLibrary is KernelLibraryBuilder &&
+        helperLibrary.loader.target.strongMode) {
+      TypeDeclarationBuilder typeDeclaration = declaration;
+      if (typeDeclaration is KernelClassBuilder) {
+        typeDeclaration.calculatedBounds ??= calculateBoundsForDeclaration(
+            typeDeclaration,
+            helperLibrary.loader.target.dynamicType,
+            helperLibrary.loader.coreLibrary["Object"]);
+        type = typeDeclaration.buildType(
+            helper.library, typeDeclaration.calculatedBounds);
+      } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
+        typeDeclaration.calculatedBounds ??= calculateBoundsForDeclaration(
+            typeDeclaration,
+            helperLibrary.loader.target.dynamicType,
+            helperLibrary.loader.coreLibrary["Object"]);
+        type = typeDeclaration.buildType(
+            helper.library, typeDeclaration.calculatedBounds);
+      }
+    }
+    if (type == null) {
+      type =
+          declaration.buildTypesWithBuiltArguments(helper.library, arguments);
+    }
+    if (type is TypeParameterType) {
+      return helper.validatedTypeVariableUse(
+          type, offsetForToken(token), nonInstanceAccessIsError);
+    }
+    return type;
+  }
+
+  DartType buildType(List<KernelTypeBuilder> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    if (arguments != null) {
+      int expected = 0;
+      if (declaration is KernelClassBuilder) {
+        expected = declaration.target.typeParameters.length;
+      } else if (declaration is FunctionTypeAliasBuilder) {
+        expected = declaration.target.typeParameters.length;
+      } else if (declaration is KernelTypeVariableBuilder) {
+        // Type arguments on a type variable - error reported elsewhere.
+      } else {
+        return unhandled(
+            "${declaration.runtimeType}",
+            "TypeDeclarationAccessor.buildType",
+            offsetForToken(token),
+            helper.uri);
+      }
+      if (arguments.length != expected) {
+        helper.warnTypeArgumentsMismatch(
+            declaration.name, expected, offsetForToken(token));
+        // We ignore the provided arguments, which will in turn return the
+        // raw type below.
+        // TODO(sigmund): change to use an InvalidType and include the raw type
+        // as a recovery node once the IR can represent it (Issue #29840).
+        arguments = null;
+      }
+    }
+    DartType type = declaration.buildType(helper.library, arguments);
     if (type is TypeParameterType) {
       return helper.validatedTypeVariableUse(
           type, offsetForToken(token), nonInstanceAccessIsError);
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 b6c0c8d..3c0a807 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
@@ -327,7 +327,9 @@
       procedure.isConst = isConst;
       procedure.name = new Name(name, library.target);
     }
-    if (library.loader.target.strongMode && isSetter && returnType == null) {
+    if (library.loader.target.strongMode &&
+        (isSetter || (isOperator && name == '[]=')) &&
+        returnType == null) {
       procedure.function.returnType = const VoidType();
     }
     return procedure;
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 beb24cf..74c1484 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
@@ -174,7 +174,7 @@
     }
     var inferredType =
         inferrer.inferExpression(operand, typeContext, typeNeeded);
-    inferredType = inferrer.typeSchemaEnvironment.flattenFutures(inferredType);
+    inferredType = inferrer.typeSchemaEnvironment.unfutureType(inferredType);
     inferrer.listener.awaitExpressionExit(this, inferredType);
     return inferredType;
   }
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 1495999..9ab59f7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -244,8 +244,8 @@
       if (metadataCollector != null) {
         program.addMetadataRepository(metadataCollector.repository);
       }
-      loader.computeHierarchy(program);
       computeCoreTypes();
+      loader.computeHierarchy();
       if (!loader.target.disableTypeInference) {
         loader.prepareTopLevelInference(myClasses);
         loader.performTopLevelInference(myClasses);
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 3a1ccb2..a53c0bd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -9,7 +9,9 @@
         KernelNamedTypeBuilder,
         KernelTypeVariableBuilder,
         KernelClassBuilder,
-        KernelFunctionTypeAliasBuilder;
+        KernelFunctionTypeAliasBuilder,
+        NamedTypeBuilder,
+        TypeDeclarationBuilder;
 
 KernelTypeBuilder substituteRec(
     KernelTypeBuilder type,
@@ -75,3 +77,35 @@
   }
   return result;
 }
+
+List<KernelTypeBuilder> calculateBoundsForDeclaration(
+    TypeDeclarationBuilder typeDeclarationBuilder,
+    KernelTypeBuilder dynamicType,
+    KernelClassBuilder objectClass) {
+  List<TypeVariableBuilder> typeParameters;
+
+  if (typeDeclarationBuilder is KernelClassBuilder) {
+    typeParameters = typeDeclarationBuilder.typeVariables;
+  } else if (typeDeclarationBuilder is KernelFunctionTypeAliasBuilder) {
+    typeParameters = typeDeclarationBuilder.typeVariables;
+  }
+
+  if (typeParameters == null || typeParameters.length == 0) {
+    return null;
+  }
+
+  return calculateBounds(typeParameters, dynamicType, objectClass);
+}
+
+int instantiateToBoundInPlace(NamedTypeBuilder typeBuilder,
+    KernelTypeBuilder dynamicType, KernelClassBuilder objectClass) {
+  int count = 0;
+
+  if (typeBuilder.arguments == null) {
+    typeBuilder.arguments = calculateBoundsForDeclaration(
+        typeBuilder.builder, dynamicType, objectClass);
+    count = typeBuilder.arguments?.length ?? 0;
+  }
+
+  return count;
+}
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 ad8d6e5..062b01d 100644
--- a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -31,54 +31,67 @@
   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.
+/// Parse modifiers in the token stream, and return a [ModifierContext]
+/// with information about what was parsed.
 ModifierContext parseModifiersOpt(
     Parser parser,
     Token start,
+    Token lastModifier,
     MemberKind memberKind,
     FormalParameterKind parameterKind,
     bool isVarAllowed,
-    TypeContinuation typeContiunation) {
-  ModifierContext context = new ModifierContext(
-      parser, memberKind, parameterKind, isVarAllowed, typeContiunation);
+    TypeContinuation typeContinuation) {
+  // Parse modifiers
+  ModifierContext context = new ModifierContext(parser, memberKind,
+      parameterKind, isVarAllowed, typeContinuation, lastModifier);
   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)) {
+  if (token != lastModifier) {
     // Recovery
-    context = new ModifierRecoveryContext(
-        parser, memberKind, parameterKind, isVarAllowed, typeContiunation);
+    context = new ModifierRecoveryContext(parser, memberKind, parameterKind,
+        isVarAllowed, typeContinuation, lastModifier);
     token = context.parseOpt(start);
   }
 
   parser.listener.handleModifiers(context.modifierCount);
 
   context.typeContinuation ??=
-      (isVarAllowed || context.memberKind == MemberKind.GeneralizedFunctionType)
-          ? TypeContinuation.Required
-          : TypeContinuation.Optional;
-  context.lastModifier = token;
+      typeContinuationFromMemberKind(isVarAllowed, context.memberKind);
 
   return context;
 }
 
+/// Skip modifier tokens until the last modifier token is reached
+/// and return that token. If [token] is not a modifier, then return [token].
+Token skipToLastModifier(Token token) {
+  Token next = token.next;
+  while (isModifier(next)) {
+    token = next;
+    next = token.next;
+  }
+  return token;
+}
+
+TypeContinuation typeContinuationFromMemberKind(
+        bool isVarAllowed, MemberKind memberKind) =>
+    (isVarAllowed || memberKind == MemberKind.GeneralizedFunctionType)
+        ? TypeContinuation.Required
+        : TypeContinuation.Optional;
+
+/// This class is used to parse modifiers 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.
 class ModifierContext {
   final Parser parser;
   MemberKind memberKind;
+
+  /// When parsing the formal parameters of any function,
+  /// [parameterKind] is non-null.
   final FormalParameterKind parameterKind;
+
   final bool isVarAllowed;
   TypeContinuation typeContinuation;
   int modifierCount = 0;
@@ -89,37 +102,45 @@
   Token lastModifier;
 
   ModifierContext(this.parser, this.memberKind, this.parameterKind,
-      this.isVarAllowed, this.typeContinuation);
+      this.isVarAllowed, this.typeContinuation, this.lastModifier);
 
   bool get isCovariantFinalAllowed =>
       memberKind != MemberKind.StaticField &&
       memberKind != MemberKind.NonStaticField;
 
   Token parseOpt(Token token) {
-    if (optional('external', token.next)) {
-      token = parseExternalOpt(token);
-    }
-
-    if (optional('static', token.next)) {
-      token = parseStaticOpt(token);
-    } else if (optional('covariant', token.next)) {
-      token = parseCovariantOpt(token);
-      if (optional('final', token.next)) {
-        if (isCovariantFinalAllowed) {
-          token = parseFinal(token);
-        }
-      } else if (optional('var', token.next)) {
-        token = parseVar(token);
+    if (token != lastModifier) {
+      if (optional('external', token.next)) {
+        token = parseExternalOpt(token);
       }
-      return token;
-    }
 
-    if (optional('final', token.next)) {
-      token = parseFinal(token);
-    } else if (optional('var', token.next)) {
-      token = parseVar(token);
-    } else if (optional('const', token.next)) {
-      token = parseConst(token);
+      if (token != lastModifier) {
+        if (optional('static', token.next)) {
+          token = parseStaticOpt(token);
+        } else if (optional('covariant', token.next)) {
+          token = parseCovariantOpt(token);
+          if (token != lastModifier) {
+            if (optional('final', token.next)) {
+              if (isCovariantFinalAllowed) {
+                token = parseFinal(token);
+              }
+            } else if (optional('var', token.next)) {
+              token = parseVar(token);
+            }
+          }
+          return token;
+        }
+      }
+
+      if (token != lastModifier) {
+        if (optional('final', token.next)) {
+          token = parseFinal(token);
+        } else if (optional('var', token.next)) {
+          token = parseVar(token);
+        } else if (optional('const', token.next)) {
+          token = parseConst(token);
+        }
+      }
     }
     return token;
   }
@@ -284,9 +305,10 @@
       MemberKind memberKind,
       FormalParameterKind parameterKind,
       bool isVarAllowed,
-      TypeContinuation typeContinuation)
-      : super(
-            parser, memberKind, parameterKind, isVarAllowed, typeContinuation);
+      TypeContinuation typeContinuation,
+      Token lastModifier)
+      : super(parser, memberKind, parameterKind, isVarAllowed, typeContinuation,
+            lastModifier);
 
   @override
   Token parseOpt(Token token) {
@@ -298,7 +320,7 @@
     parser.listener = primaryListener;
 
     // Process invalid and out-of-order modifiers
-    while (isModifier(token.next)) {
+    while (token != lastModifier) {
       final value = token.next.stringValue;
       if (identical('abstract', value)) {
         token = parseAbstract(token);
@@ -433,8 +455,14 @@
 
   Token parseExtraneousModifier(Token token) {
     Token next = token.next;
-    parser.reportRecoverableErrorWithToken(
-        next, fasta.templateExtraneousModifier);
+    if (next.isModifier) {
+      parser.reportRecoverableErrorWithToken(
+          next, fasta.templateExtraneousModifier);
+    } else {
+      // TODO(danrubel): Provide more specific error messages.
+      parser.reportRecoverableErrorWithToken(
+          next, fasta.templateUnexpectedToken);
+    }
     return next;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 35a452c..fd654fe 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -81,7 +81,9 @@
         ModifierContext,
         TopLevelMethodModifierContext,
         isModifier,
-        parseModifiersOpt;
+        parseModifiersOpt,
+        skipToLastModifier,
+        typeContinuationFromMemberKind;
 
 import 'recovery_listeners.dart'
     show ClassHeaderRecoveryListener, ImportRecoveryListener;
@@ -89,7 +91,7 @@
 import 'token_stream_rewriter.dart' show TokenStreamRewriter;
 
 import 'type_continuation.dart'
-    show TypeContinuation, typeContiunationFromFormalParameterKind;
+    show TypeContinuation, typeContinuationFromFormalParameterKind;
 
 import 'util.dart' show beforeCloseBraceTokenFor, closeBraceTokenFor, optional;
 
@@ -1151,18 +1153,28 @@
   Token parseFormalParameter(
       Token token, FormalParameterKind parameterKind, MemberKind memberKind) {
     token = parseMetadataStar(token);
-    listener.beginFormalParameter(token.next, memberKind);
-    ModifierContext modifierContext = parseModifiersOpt(
-        this,
-        token,
-        memberKind,
-        parameterKind,
-        false,
-        typeContiunationFromFormalParameterKind(parameterKind));
-    TypeContinuation typeContinuation = modifierContext.typeContinuation;
-    memberKind = modifierContext.memberKind;
-    token = modifierContext.lastModifier;
-    modifierContext = null;
+    Token next = token.next;
+    listener.beginFormalParameter(next, memberKind);
+
+    TypeContinuation typeContinuation =
+        typeContinuationFromFormalParameterKind(parameterKind);
+    if (isModifier(next)) {
+      ModifierContext modifierContext = parseModifiersOpt(
+          this,
+          token,
+          skipToLastModifier(token),
+          memberKind,
+          parameterKind,
+          false,
+          typeContinuation);
+      typeContinuation = modifierContext.typeContinuation;
+      memberKind = modifierContext.memberKind;
+      token = modifierContext.lastModifier;
+      modifierContext = null;
+    } else {
+      listener.handleModifiers(0);
+      typeContinuation ??= typeContinuationFromMemberKind(false, memberKind);
+    }
 
     return parseType(token, typeContinuation, null, memberKind);
   }
@@ -1272,8 +1284,10 @@
     int kind = token.kind;
     if (IDENTIFIER_TOKEN == kind) return true;
     if (KEYWORD_TOKEN == kind) {
-      String value = token.type.lexeme;
-      return token.type.isPseudo ||
+      TokenType type = token.type;
+      String value = type.lexeme;
+      return type.isPseudo ||
+          (type.isBuiltIn && optional('.', token.next)) ||
           (identical(value, 'dynamic')) ||
           (identical(value, 'void'));
     }
@@ -1506,6 +1520,7 @@
     if (!optional('{', token.next)) {
       // Recovery
       token = parseClassHeaderRecovery(start, begin, classKeyword);
+      ensureBlock(token, fasta.templateExpectedClassBody);
     }
     token = parseClassBody(token);
     listener.endClassDeclaration(begin, token);
@@ -2718,7 +2733,8 @@
         // but missing a variable name.
         insertSyntheticIdentifier(
             token, IdentifierContext.topLevelVariableDeclaration);
-        return parseFields(beforeStart, token, true);
+        return parseFields(
+            beforeStart, token.isModifier ? token : beforeStart, token, true);
       } else {
         return reportInvalidTopLevelDeclaration(token);
       }
@@ -2741,7 +2757,16 @@
     }
     Token beforeType;
     if (!identifiers.isEmpty) {
-      if (isValidTypeReference(identifiers.head.next)) {
+      Token maybeType = identifiers.head.next;
+      if (isValidTypeReference(maybeType)) {
+        beforeType = identifiers.head;
+        identifiers = identifiers.tail;
+      } else if (maybeType.type.isBuiltIn && optional('<', maybeType.next)) {
+        // Recovery
+        // It is an error when built-in keyword is being used
+        // as a type, as in `abstract<t> foo`.
+        // This error is reported by parseFields and parseTopLevelMethod
+        // via ensureIdentifier.
         beforeType = identifiers.head;
         identifiers = identifiers.tail;
       }
@@ -2776,22 +2801,24 @@
         if (identical(token.next.kind, EOF_TOKEN)) return token;
       }
     }
-    Token afterModifiers =
-        identifiers.isNotEmpty ? identifiers.head.next.next : beforeStart.next;
+    Token lastModifier =
+        identifiers.isNotEmpty ? identifiers.head.next : beforeStart;
     return isField
-        ? parseFields(beforeStart, beforeName, true)
+        ? parseFields(beforeStart, lastModifier, beforeName, true)
         : parseTopLevelMethod(
-            beforeStart, afterModifiers, beforeType, getOrSet, beforeName);
+            beforeStart, lastModifier, beforeType, getOrSet, beforeName);
   }
 
-  Token parseFields(Token start, Token beforeName, bool isTopLevel) {
+  Token parseFields(
+      Token start, Token lastModifier, Token beforeName, bool isTopLevel) {
     ModifierContext modifierContext = parseModifiersOpt(
         this,
         start,
+        lastModifier,
         isTopLevel ? MemberKind.TopLevelField : MemberKind.NonStaticField,
         null,
         true,
-        typeContiunationFromFormalParameterKind(null));
+        typeContinuationFromFormalParameterKind(null));
     TypeContinuation typeContinuation = modifierContext.typeContinuation;
     MemberKind memberKind = modifierContext.memberKind;
     Token varFinalOrConst = modifierContext.varFinalOrConst;
@@ -2828,8 +2855,9 @@
     return token;
   }
 
-  Token parseTopLevelMethod(Token start, Token afterModifiers, Token beforeType,
+  Token parseTopLevelMethod(Token start, Token lastModifier, Token beforeType,
       Token getOrSet, Token beforeName) {
+    Token afterModifiers = lastModifier.next;
     Token beforeToken = start;
     Token token = start = start.next;
     Token name = beforeName.next;
@@ -3030,7 +3058,7 @@
           }
         } else if (token.type.isBuiltIn) {
           // Handle the edge case where a built-in keyword is being used
-          // as the identifier, as in "abstract<T>() => 0;"
+          // as the identifier, as in "abstract<T>() => 0;".
           if (optional('<', token.next)) {
             Token beforeIdentifier = previous;
             Token identifier = token;
@@ -3413,20 +3441,16 @@
   /// ;
   /// ```
   Token parseClassBody(Token token) {
-    Token previousToken = token;
     Token begin = token = token.next;
+    assert(optional('{', token));
     listener.beginClassBody(token);
-    if (!optional('{', token)) {
-      token =
-          begin = ensureBlock(previousToken, fasta.templateExpectedClassBody);
-    }
     int count = 0;
     while (notEofOrValue('}', token.next)) {
       token = parseClassMember(token);
       ++count;
     }
     token = token.next;
-    expect('}', token);
+    assert(optional('}', token));
     listener.endClassBody(count, begin, token);
     return token;
   }
@@ -3504,7 +3528,16 @@
     }
     Token beforeType;
     if (!identifiers.isEmpty) {
-      if (isValidTypeReference(identifiers.head.next)) {
+      Token maybeType = identifiers.head.next;
+      if (isValidTypeReference(maybeType)) {
+        beforeType = identifiers.head;
+        identifiers = identifiers.tail;
+      } else if (maybeType.type.isBuiltIn && optional('<', maybeType.next)) {
+        // Recovery
+        // It is an error when built-in keyword is being used
+        // as a type, as in `abstract<t> foo`.
+        // This error is reported by parseFields and parseMethod
+        // via ensureIdentifier.
         beforeType = identifiers.head;
         identifiers = identifiers.tail;
       }
@@ -3550,7 +3583,7 @@
 
     Token lastModifier = identifiers.isNotEmpty ? identifiers.head.next : start;
     token = isField
-        ? parseFields(start, beforeName, false)
+        ? parseFields(start, lastModifier, beforeName, false)
         : parseMethod(start, lastModifier, beforeType, getOrSet, beforeName);
     listener.endMember();
     return token;
@@ -5327,12 +5360,20 @@
   Token parseVariablesDeclarationMaybeSemicolon(
       Token token, bool endWithSemicolon) {
     token = parseMetadataStar(token);
-    ModifierContext modifierContext =
-        parseModifiersOpt(this, token, MemberKind.Local, null, true, null);
-    token = modifierContext.lastModifier;
-    TypeContinuation typeContinuation = modifierContext.typeContinuation;
-    MemberKind memberKind = modifierContext.memberKind;
-    modifierContext = null;
+
+    MemberKind memberKind = MemberKind.Local;
+    TypeContinuation typeContinuation;
+    if (isModifier(token.next)) {
+      ModifierContext modifierContext = parseModifiersOpt(
+          this, token, skipToLastModifier(token), memberKind, null, true, null);
+      token = modifierContext.lastModifier;
+      typeContinuation = modifierContext.typeContinuation;
+      memberKind = modifierContext.memberKind;
+      modifierContext = null;
+    } else {
+      listener.handleModifiers(0);
+      typeContinuation = typeContinuationFromMemberKind(true, memberKind);
+    }
 
     token = parseType(token, typeContinuation, null, memberKind);
     return parseVariablesDeclarationMaybeSemicolonRest(token, endWithSemicolon);
@@ -5997,30 +6038,39 @@
       listener.endMember();
       return next;
     }
+
     // Skip modifiers
     while (isModifier(next)) {
       token = next;
       next = token.next;
     }
+    Token lastModifier = token;
+
     if (isValidTypeReference(next) || optional('var', next)) {
       if (isPostIdentifierForRecovery(
           next.next, IdentifierContext.fieldDeclaration)) {
         // Looks like a field declaration but missing a field name.
         insertSyntheticIdentifier(next, IdentifierContext.fieldDeclaration);
-        return parseFields(start, next, false);
+        token = parseFields(start, lastModifier, next, false);
+        listener.endMember();
+        return token;
       } 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, next, false);
+        token = parseFields(start, lastModifier, next, false);
+        listener.endMember();
+        return token;
       }
     } 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, token, false);
+      token = parseFields(start, lastModifier, token, false);
+      listener.endMember();
+      return token;
     }
     return reportUnrecoverableErrorWithToken(
         start, fasta.templateExpectedClassMember);
diff --git a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart b/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
index a622770..300d819 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
@@ -69,7 +69,7 @@
   NamedFormalParameterAfterVar,
 }
 
-TypeContinuation typeContiunationFromFormalParameterKind(
+TypeContinuation typeContinuationFromFormalParameterKind(
     FormalParameterKind type) {
   if (type != null) {
     switch (type) {
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 23c24c9..c96b248 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -44,7 +44,9 @@
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
-import 'unhandled_listener.dart' show NullValue, Unhandled, UnhandledListener;
+import 'unhandled_listener.dart' show NullValue, UnhandledListener;
+
+import '../configuration.dart' show Configuration;
 
 enum MethodBody {
   Abstract,
@@ -143,7 +145,7 @@
   void endExport(Token exportKeyword, Token semicolon) {
     debugEvent("Export");
     List<Combinator> combinators = pop();
-    Unhandled conditionalUris = pop();
+    List<Configuration> conditionalUris = pop();
     int uriOffset = popCharOffset();
     String uri = pop();
     List<MetadataBuilder> metadata = pop();
@@ -171,16 +173,39 @@
     bool isDeferred = pop();
     int prefixOffset = pop();
     String prefix = pop(NullValue.Prefix);
-    Unhandled conditionalUris = pop();
+    List<Configuration> configurations = pop();
     int uriOffset = popCharOffset();
-    String uri = pop();
+    String uri = pop(); // For a conditional import, this is the default URI.
     List<MetadataBuilder> metadata = pop();
-    library.addImport(metadata, uri, conditionalUris, prefix, combinators,
+    library.addImport(metadata, uri, configurations, prefix, combinators,
         isDeferred, importKeyword.charOffset, prefixOffset, uriOffset);
     checkEmpty(importKeyword.charOffset);
   }
 
   @override
+  void endConditionalUris(int count) {
+    debugEvent("EndConditionalUris");
+    push(popList(count) ?? NullValue.ConditionalUris);
+  }
+
+  @override
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
+    debugEvent("EndConditionalUri");
+    int charOffset = popCharOffset();
+    String uri = pop();
+    if (equalSign != null) popCharOffset();
+    String condition = popIfNotNull(equalSign) ?? "true";
+    String dottedName = pop();
+    push(new Configuration(charOffset, dottedName, condition, uri));
+  }
+
+  @override
+  void handleDottedName(int count, Token firstIdentifier) {
+    debugEvent("DottedName");
+    push(popIdentifierList(count).join('.'));
+  }
+
+  @override
   void handleRecoverImport(Token semicolon) {
     debugEvent("RecoverImport");
     pop(); // combinators
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 a7765da..fac3d9b 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
@@ -30,7 +30,6 @@
         TypeBuilder,
         TypeDeclarationBuilder,
         TypeVariableBuilder,
-        Unhandled,
         UnresolvedType;
 
 import '../combinator.dart' show Combinator;
@@ -58,6 +57,8 @@
 
 import '../import.dart' show Import;
 
+import '../configuration.dart' show Configuration;
+
 import '../problems.dart' show unhandled;
 
 import 'source_loader.dart' show SourceLoader;
@@ -120,6 +121,7 @@
 
   Uri get uri;
 
+  @override
   bool get isPart => partOfName != null || partOfUri != null;
 
   List<UnresolvedType<T>> get types => libraryDeclaration.types;
@@ -191,7 +193,7 @@
   void addExport(
       List<MetadataBuilder> metadata,
       String uri,
-      Unhandled conditionalUris,
+      List<Configuration> conditionalUris,
       List<Combinator> combinators,
       int charOffset,
       int uriOffset) {
@@ -201,16 +203,37 @@
     exports.add(new Export(this, exportedLibrary, combinators, charOffset));
   }
 
+  String _lookupImportCondition(String dottedName) {
+    const String prefix = "dart.library.";
+    if (!dottedName.startsWith(prefix)) return "";
+    dottedName = dottedName.substring(prefix.length);
+
+    LibraryBuilder coreLibrary =
+        loader.read(resolve(this.uri, "dart:core", -1), -1);
+    LibraryBuilder imported = coreLibrary
+        .loader.builders[new Uri(scheme: 'dart', path: dottedName)];
+    return imported != null ? "true" : "";
+  }
+
   void addImport(
       List<MetadataBuilder> metadata,
       String uri,
-      Unhandled conditionalUris,
+      List<Configuration> configurations,
       String prefix,
       List<Combinator> combinators,
       bool deferred,
       int charOffset,
       int prefixCharOffset,
       int uriOffset) {
+    if (configurations != null) {
+      for (Configuration config in configurations) {
+        if (_lookupImportCondition(config.dottedName) == config.condition) {
+          uri = config.importUri;
+          break;
+        }
+      }
+    }
+
     imports.add(new Import(
         this,
         loader.read(resolve(this.uri, uri, uriOffset), charOffset,
@@ -218,6 +241,7 @@
         deferred,
         prefix,
         combinators,
+        configurations,
         charOffset,
         prefixCharOffset));
   }
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 0a200c4..9f8bf37 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -11,15 +11,12 @@
 import 'package:front_end/src/fasta/type_inference/interface_resolver.dart'
     show InterfaceResolver;
 
-import 'package:kernel/ast.dart' show Arguments, Expression, Program;
+import 'package:kernel/ast.dart' show Arguments, Expression, Library, Program;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
-import 'package:kernel/src/incremental_class_hierarchy.dart'
-    show IncrementalClassHierarchy;
-
 import '../../api_prototype/file_system.dart';
 
 import '../../base/instrumentation.dart'
@@ -543,8 +540,18 @@
     ticker.logMs("Built program");
   }
 
-  void computeHierarchy(Program program) {
-    hierarchy = new IncrementalClassHierarchy();
+  Program computeFullProgram() {
+    List<Library> libraries = <Library>[];
+    builders.forEach((Uri uri, LibraryBuilder library) {
+      if (!library.isPart && !library.isPatch) {
+        libraries.add(library.target);
+      }
+    });
+    return new Program()..libraries.addAll(libraries);
+  }
+
+  void computeHierarchy() {
+    hierarchy = new ClassHierarchy.deprecated_incremental(computeFullProgram());
     ticker.logMs("Computed class hierarchy");
   }
 
@@ -627,8 +634,8 @@
     // target those forwarding stubs.
     // TODO(paulberry): could we make this unnecessary by not clearing class
     // inference info?
-    typeInferenceEngine.classHierarchy =
-        hierarchy = new IncrementalClassHierarchy();
+    typeInferenceEngine.classHierarchy = hierarchy =
+        new ClassHierarchy.deprecated_incremental(computeFullProgram());
     ticker.logMs("Performed top level inference");
   }
 
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 e9ff8ac..1c0c539 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -34,6 +34,7 @@
   Combinators,
   Comments,
   ConditionalUris,
+  ConditionallySelectedImport,
   ConstructorInitializerSeparator,
   ConstructorInitializers,
   ConstructorReferenceContinuationAfterTypeArguments,
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
index 7cd7cd6..78cf4a8 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -9,7 +9,7 @@
 
 import 'dart:async' show Future;
 
-import 'dart:io' show Directory, File, IOSink;
+import 'dart:io' show Directory, File, IOSink, Platform;
 
 import 'dart:typed_data' show Uint8List;
 
@@ -275,7 +275,17 @@
 }
 
 Future<String> runDiff(Uri expected, String actual) async {
-  // TODO(ahe): Implement this for Windows.
+  if (Platform.isWindows) {
+    // TODO(ahe): Implement this for Windows.
+    return """
+==> Expected ($expected) <==
+${new File.fromUri(expected).readAsStringSync()}
+
+==> Actual <==
+$actual
+
+""";
+  }
   StdioProcess process = await StdioProcess
       .run("diff", <String>["-u", expected.toFilePath(), "-"], input: actual);
   return process.output;
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 5cdc260..1105396 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
@@ -458,15 +458,18 @@
         requiredParameterCount: target.function.requiredParameterCount,
         returnType: substitution.substituteType(target.function.returnType));
     Member finalTarget;
-    if (target is ForwardingStub) {
-      finalTarget = ForwardingStub.getInterfaceTarget(target);
+    if (target is Procedure && target.isForwardingStub) {
+      finalTarget = target.forwardingStubInterfaceTarget.node;
     } else if (target is SyntheticAccessor) {
       finalTarget = target._field;
     } else {
       finalTarget = target;
     }
-    return new ForwardingStub(finalTarget, name, kind, function,
-        fileUri: enclosingClass.fileUri)
+    return new Procedure(name, kind, function,
+        isAbstract: true,
+        isForwardingStub: true,
+        fileUri: enclosingClass.fileUri,
+        forwardingStubInterfaceTarget: finalTarget.reference)
       ..fileOffset = enclosingClass.fileOffset
       ..parent = enclosingClass
       ..isGenericContravariant = target.isGenericContravariant;
@@ -650,30 +653,6 @@
   }
 }
 
-/// Represents a [Procedure] generated by the front end to serve as a forwarding
-/// stub.
-///
-/// This class exists to work around dartbug.com/31519.
-/// TODO(paulberry): remove when dartbug.com/31519 is fixed.
-class ForwardingStub extends Procedure {
-  /// The interface target that this forwarding stub replaces.
-  final Member _interfaceTarget;
-
-  ForwardingStub(this._interfaceTarget, Name name, ProcedureKind kind,
-      FunctionNode function, {Uri fileUri})
-      : super(name, kind, function,
-            isAbstract: true, isForwardingStub: true, fileUri: fileUri);
-
-  /// Retrieves the [_interfaceTarget] from a forwarding stub.
-  ///
-  /// This method exists so that we don't have to expose [_interfaceTarget] as
-  /// a public getter (which might confuse clients of the front end that aren't
-  /// expecting it).
-  static Member getInterfaceTarget(ForwardingStub stub) {
-    return stub._interfaceTarget;
-  }
-}
-
 /// An [InterfaceResolver] keeps track of the information necessary to resolve
 /// method calls, gets, and sets within a chunk of code being compiled, to
 /// infer covariance annotations, and to create forwarwding stubs when necessary
@@ -1089,7 +1068,12 @@
     }
     if (procedure.kind != ProcedureKind.Setter &&
         ShadowProcedure.hasImplicitReturnType(procedure)) {
-      return true;
+      // Inference of the return type of `[]=` is handled separately by
+      // KernelProcedureBuilder.build, since there are no dependencies.
+      if (procedure.kind != ProcedureKind.Operator ||
+          procedure.name.name != '[]=') {
+        return true;
+      }
     }
     var function = procedure.function;
     for (var parameter in function.positionalParameters) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 0af6595..42119d5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -122,7 +122,7 @@
       }
     } else if (isAsync) {
       returnContext = inferrer.wrapFutureOrType(
-          inferrer.typeSchemaEnvironment.flattenFutures(returnContext));
+          inferrer.typeSchemaEnvironment.unfutureType(returnContext));
     }
     return new ClosureContext._(isAsync, isGenerator, returnContext,
         needToInferReturnType, needImplicitDowncasts);
@@ -136,26 +136,50 @@
   void handleReturn(TypeInferrerImpl inferrer, DartType type,
       Expression expression, int fileOffset) {
     if (isGenerator) return;
-    var unwrappedType = type;
-    if (isAsync) {
-      if (type is InterfaceType) {
-        if (identical(type.classNode, inferrer.coreTypes.futureClass)) {
-          unwrappedType = type.typeArguments[0];
-        } else if (identical(
-            type.classNode, inferrer.coreTypes.futureOrClass)) {
-          unwrappedType = type.typeArguments[0];
-        }
-      }
-    }
     _updateInferredReturnType(
-        inferrer, type, unwrappedType, expression, fileOffset, false);
+        inferrer, type, expression, fileOffset, true, false);
   }
 
   void handleYield(TypeInferrerImpl inferrer, bool isYieldStar, DartType type,
       Expression expression, int fileOffset) {
     if (!isGenerator) return;
+    _updateInferredReturnType(
+        inferrer, type, expression, fileOffset, false, isYieldStar);
+  }
+
+  DartType inferReturnType(TypeInferrerImpl inferrer) {
+    assert(_needToInferReturnType);
+    DartType inferredReturnType = _wrapAsyncOrGenerator(
+        inferrer, inferrer.inferReturnType(_inferredReturnType));
+    if (returnContext != null &&
+        !_analyzerSubtypeOf(inferrer, inferredReturnType, returnContext)) {
+      // If the inferred return type isn't a subtype of the context, we use the
+      // context.
+      return greatestClosure(inferrer.coreTypes, returnContext);
+    }
+
+    return inferredReturnType;
+  }
+
+  void _updateInferredReturnType(TypeInferrerImpl inferrer, DartType type,
+      Expression expression, int fileOffset, bool isReturn, bool isYieldStar) {
+    if (_needImplicitDowncasts) {
+      var expectedType = isYieldStar
+          ? _wrapAsyncOrGenerator(inferrer, returnContext)
+          : returnContext;
+      if (expectedType != null) {
+        expectedType = greatestClosure(inferrer.coreTypes, expectedType);
+        if (inferrer.checkAssignability(
+                expectedType, type, expression, fileOffset) !=
+            null) {
+          type = expectedType;
+        }
+      }
+    }
     var unwrappedType = type;
-    if (isYieldStar) {
+    if (isAsync && isReturn) {
+      unwrappedType = inferrer.typeSchemaEnvironment.unfutureType(type);
+    } else if (isYieldStar) {
       unwrappedType = inferrer.getDerivedTypeArgumentOf(
               type,
               isAsync
@@ -163,30 +187,6 @@
                   : inferrer.coreTypes.iterableClass) ??
           type;
     }
-    _updateInferredReturnType(
-        inferrer, type, unwrappedType, expression, fileOffset, isYieldStar);
-  }
-
-  DartType inferReturnType(TypeInferrerImpl inferrer) {
-    assert(_needToInferReturnType);
-    DartType inferredReturnType = inferrer.inferReturnType(_inferredReturnType);
-    if (returnContext != null &&
-        !_analyzerSubtypeOf(inferrer, inferredReturnType, returnContext)) {
-      // If the inferred return type isn't a subtype of the context, we use the
-      // context.
-      inferredReturnType = greatestClosure(inferrer.coreTypes, returnContext);
-    }
-
-    return _wrapAsyncOrGenerator(inferrer, inferredReturnType);
-  }
-
-  void _updateInferredReturnType(
-      TypeInferrerImpl inferrer,
-      DartType type,
-      DartType unwrappedType,
-      Expression expression,
-      int fileOffset,
-      bool isYieldStar) {
     if (_needToInferReturnType) {
       if (_inferredReturnType == null) {
         _inferredReturnType = unwrappedType;
@@ -195,18 +195,6 @@
             .getLeastUpperBound(_inferredReturnType, unwrappedType);
       }
     }
-    if (_needImplicitDowncasts) {
-      var expectedType = isYieldStar
-          ? _wrapAsyncOrGenerator(inferrer, returnContext)
-          : returnContext;
-      if (expectedType != null) {
-        inferrer.checkAssignability(
-            greatestClosure(inferrer.coreTypes, expectedType),
-            type,
-            expression,
-            fileOffset);
-      }
-    }
   }
 
   DartType _wrapAsyncOrGenerator(TypeInferrerImpl inferrer, DartType type) {
@@ -1431,12 +1419,8 @@
 
   DartType wrapFutureType(DartType type) {
     var typeWithoutFutureOr = type ?? const DynamicType();
-    if (type is InterfaceType &&
-        identical(type.classNode, coreTypes.futureOrClass)) {
-      typeWithoutFutureOr = type.typeArguments[0];
-    }
-    return new InterfaceType(coreTypes.futureClass,
-        <DartType>[typeSchemaEnvironment.flattenFutures(typeWithoutFutureOr)]);
+    return new InterfaceType(
+        coreTypes.futureClass, <DartType>[typeWithoutFutureOr]);
   }
 
   DartType wrapType(DartType type, Class class_) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index dba0d52..6554d8e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -84,28 +84,6 @@
     constraint.upper = getGreatestLowerBound(constraint.upper, upper);
   }
 
-  /// Implements the function "flatten" defined in the spec, where T is [type]:
-  ///
-  ///     If T = Future<S> then flatten(T) = flatten(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.  Then flatten(T) = S.
-  ///
-  ///     In any other circumstance, flatten(T) = T.
-  DartType flattenFutures(DartType type) {
-    if (type is InterfaceType) {
-      if (identical(type.classNode, coreTypes.futureClass)) {
-        return flattenFutures(type.typeArguments[0]);
-      }
-      InterfaceType futureBase =
-          hierarchy.getTypeAsInstanceOf(type, coreTypes.futureClass);
-      if (futureBase != null) {
-        return futureBase.typeArguments[0];
-      }
-    }
-    return type;
-  }
-
   /// Computes the greatest lower bound of [type1] and [type2].
   DartType getGreatestLowerBound(DartType type1, DartType type2) {
     // The greatest lower bound relation is reflexive.  Note that we don't test
diff --git a/pkg/front_end/lib/src/incremental/combine.dart b/pkg/front_end/lib/src/incremental/combine.dart
deleted file mode 100644
index d1e4096..0000000
--- a/pkg/front_end/lib/src/incremental/combine.dart
+++ /dev/null
@@ -1,437 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/kernel.dart';
-
-/// Given the list of full and partial [outlines] of libraries, combine them
-/// into a new [Program].  Different outlines can define the same node multiple
-/// times, just one is kept, and all references to synonyms are replaced with
-/// the reference to the kept version.  Call [CombineResult.undo] after
-/// finishing using the combined [Program] to restore [outlines] into their
-/// original state.
-CombineResult combine(List<Program> outlines) {
-  var combiner = new _Combiner(outlines);
-  combiner.perform();
-  return combiner.result;
-}
-
-/// The result of outlines combining; call [undo] after using to restore
-/// partial outlines into their original state.
-class CombineResult {
-  final Program program;
-
-  final Map<Library, Program> _undoLibraryToProgram = {};
-
-  final Map<Class, Library> _undoClassToLibrary = {};
-  final Map<Field, Library> _undoFieldToLibrary = {};
-  final Map<Procedure, Library> _undoProcedureToLibrary = {};
-
-  final Map<Member, Class> _undoMemberToClass = {};
-
-  final Map<Library, int> _undoLibraryToClasses = {};
-  final Map<Library, int> _undoLibraryToFields = {};
-  final Map<Library, int> _undoLibraryToProcedures = {};
-  final List<Library> _undoLibrariesWithoutExports = <Library>[];
-
-  final Map<Class, int> _undoClassToConstructors = {};
-  final Map<Class, int> _undoClassToFields = {};
-  final Map<Class, int> _undoClassToProcedures = {};
-
-  final Map<Program, _ReplacementMap> _undoReplacementMap = {};
-
-  bool _undone = false;
-
-  CombineResult(this.program);
-
-  /// Undo changes applied to partial outlines by [combine].
-  void undo() {
-    if (_undone) {
-      throw new StateError('This result has already been undone.');
-    }
-    _undone = true;
-
-    _undoLibraryToProgram.forEach((library, program) {
-      program.root.adoptChild(library.canonicalName);
-      library.parent = program;
-    });
-
-    _undoClassToLibrary.forEach((child, parent) {
-      parent.canonicalName.adoptChild(child.canonicalName);
-      child.parent = parent;
-    });
-    _undoFieldToLibrary.forEach((child, parent) {
-      var parentName = parent.canonicalName.getChild('@fields');
-      parentName.adoptChild(child.canonicalName);
-      child.parent = parent;
-    });
-    _undoProcedureToLibrary.forEach((child, parent) {
-      var qualifier = CanonicalName.getMemberQualifier(child);
-      var parentName = parent.canonicalName.getChild(qualifier);
-      parentName.adoptChild(child.canonicalName);
-      child.parent = parent;
-    });
-
-    _undoMemberToClass.forEach((child, parent) {
-      var qualifier = CanonicalName.getMemberQualifier(child);
-      var parentName = parent.canonicalName.getChild(qualifier);
-      parentName.adoptChild(child.canonicalName);
-      child.parent = parent;
-    });
-
-    _undoLibraryToClasses.forEach((library, length) {
-      library.classes.length = length;
-    });
-    _undoLibraryToFields.forEach((library, length) {
-      library.fields.length = length;
-    });
-    _undoLibraryToProcedures.forEach((library, length) {
-      library.procedures.length = length;
-    });
-    for (var library in _undoLibrariesWithoutExports) {
-      library.additionalExports.clear();
-    }
-
-    _undoClassToConstructors.forEach((class_, length) {
-      class_.constructors.length = length;
-    });
-    _undoClassToFields.forEach((class_, length) {
-      class_.fields.length = length;
-    });
-    _undoClassToProcedures.forEach((class_, length) {
-      class_.procedures.length = length;
-    });
-
-    _undoReplacementMap.forEach((outline, map) {
-      outline.accept(new _ReplaceReferencesVisitor(map, null));
-    });
-  }
-}
-
-/// Keeps the state during combining and contains the result.
-class _Combiner {
-  final List<Program> outlines;
-  final CombineResult result = new CombineResult(new Program());
-
-  /// We record here during [_combineOutline], which keys should be replaced
-  /// with which values.
-  _ReplacementMap replacementMap;
-
-  _Combiner(this.outlines);
-
-  /// Combine the [outlines] into a new [Program].
-  void perform() {
-    for (var outline in outlines) {
-      _combineOutline(outline);
-    }
-  }
-
-  /// If the [target] does not have a child with the same name as the [source],
-  /// adopt the [source] and return `null`.  Otherwise return the existing
-  /// name.
-  CanonicalName _adoptMemberName(NamedNode target, Member source) {
-    String qualifier = CanonicalName.getMemberQualifier(source);
-    CanonicalName parentName = target.canonicalName.getChild(qualifier);
-    if (source.name.isPrivate) {
-      Uri libraryUri = source.name.library.importUri;
-      parentName = parentName.getChildFromUri(libraryUri);
-    }
-    String sourceName = source.canonicalName.name;
-    if (parentName.hasChild(sourceName)) {
-      return parentName.getChild(sourceName);
-    }
-    parentName.adoptChild(source.canonicalName);
-    return null;
-  }
-
-  /// If [source] is the first node with a particular name, we remember its
-  /// original parent into [CombineResult._undoClassToLibrary], and add it
-  /// into the [target].
-  ///
-  /// If [source] is not the first node with this name, we don't add it,
-  /// instead we remember that references to this node should be replaced
-  /// with the reference to the first node.
-  void _combineClass(Library target, Class source) {
-    String name = source.name;
-    if (target.canonicalName.hasChild(name)) {
-      var existingReference = target.canonicalName.getChild(name).reference;
-      replacementMap.references[source.reference] = existingReference;
-      Class existingNode = existingReference.node;
-
-      var numberOfTypeParameters = source.typeParameters.length;
-      assert(numberOfTypeParameters == existingNode.typeParameters.length);
-      for (var i = 0; i < numberOfTypeParameters; i++) {
-        replacementMap.typeParameters[source.typeParameters[i]] =
-            existingNode.typeParameters[i];
-      }
-
-      for (var constructor in source.constructors) {
-        _combineClassMember(existingNode, constructor);
-      }
-      for (var field in source.fields) {
-        _combineClassMember(existingNode, field);
-      }
-      for (var procedure in source.procedures) {
-        _combineClassMember(existingNode, procedure);
-      }
-    } else {
-      result._undoClassToLibrary[source] = source.parent;
-      _putUndoForClassMembers(source);
-      target.canonicalName.adoptChild(source.canonicalName);
-      target.addClass(source);
-    }
-  }
-
-  /// If [source] is the first node with a particular name, we remember its
-  /// original parent into [CombineResult._undoMemberToClass], and add it
-  /// into the [target].
-  ///
-  /// If [source] is not the first node with this name, we don't add it,
-  /// instead we remember that references to this node should be replaced
-  /// with the reference to the first node.
-  void _combineClassMember(Class target, Member source) {
-    CanonicalName existing = _adoptMemberName(target, source);
-    if (existing == null) {
-      result._undoMemberToClass[source] = source.parent;
-      target.addMember(source);
-    } else {
-      replacementMap.references[source.reference] = existing.reference;
-    }
-  }
-
-  /// If [source] is the first node with a particular name, we remember its
-  /// original parent into [CombineResult._undoFieldToLibrary], and add it
-  /// into the [target].
-  ///
-  /// If [source] is not the first node with this name, we don't add it,
-  /// instead we remember that references to this node should be replaced
-  /// with the reference to the first node.
-  void _combineField(Library target, Field source) {
-    CanonicalName existing = _adoptMemberName(target, source);
-    if (existing == null) {
-      result._undoFieldToLibrary[source] = source.parent;
-      target.addField(source);
-    } else {
-      replacementMap.references[source.reference] = existing.reference;
-    }
-  }
-
-  /// If [source] is the first node with a particular name, we remember its
-  /// original parent into [CombineResult._undoFieldToLibrary], and add it
-  /// into the [target].
-  ///
-  /// If [source] is not the first node with this name, we don't add it,
-  /// instead we remember that references to this node should be replaced
-  /// with the reference to the first node.  Then we continue merging children
-  /// of the node into the first node.
-  ///
-  /// The first nodes are updated by adding more children into them.  We
-  /// remember the original lengths of their [Library.classes],
-  /// [Library.fields], and [Library.procedures] lists.  So, to undo the
-  /// changes and get rid of added children it is enough to set their lengths.
-  void _combineLibrary(Program target, Library source) {
-    String name = source.importUri.toString();
-    if (target.root.hasChild(name)) {
-      var existingReference = target.root.getChild(name).reference;
-      replacementMap.references[source.reference] = existingReference;
-      Library existingNode = existingReference.node;
-      if (existingNode.additionalExports.isEmpty &&
-          source.additionalExports.isNotEmpty) {
-        existingNode.additionalExports.addAll(source.additionalExports);
-      }
-      for (var class_ in source.classes) {
-        _combineClass(existingNode, class_);
-      }
-      for (var field in source.fields) {
-        _combineField(existingNode, field);
-      }
-      for (var procedure in source.procedures) {
-        _combineProcedure(existingNode, procedure);
-      }
-    } else {
-      result._undoLibraryToProgram[source] = source.parent;
-      result._undoLibraryToClasses[source] = source.classes.length;
-      result._undoLibraryToFields[source] = source.fields.length;
-      result._undoLibraryToProcedures[source] = source.procedures.length;
-      if (source.additionalExports.isEmpty) {
-        result._undoLibrariesWithoutExports.add(source);
-      }
-      source.classes.forEach(_putUndoForClassMembers);
-      target.root.adoptChild(source.canonicalName);
-      source.parent = target;
-      target.libraries.add(source);
-    }
-  }
-
-  void _combineOutline(Program outline) {
-    replacementMap = new _ReplacementMap();
-    for (var library in outline.libraries) {
-      _combineLibrary(result.program, library);
-    }
-    var undoMap = new _ReplacementMap();
-    result._undoReplacementMap[outline] = undoMap;
-    outline.accept(new _ReplaceReferencesVisitor(replacementMap, undoMap));
-    replacementMap = null;
-  }
-
-  /// If [source] is the first node with a particular name, we remember its
-  /// original parent into [CombineResult._undoProcedureToLibrary], and add it
-  /// into the [target].
-  ///
-  /// If [source] is not the first node with this name, we don't add it,
-  /// instead we remember that references to this node should be replaced
-  /// with the reference to the first node.
-  void _combineProcedure(Library target, Procedure source) {
-    CanonicalName existing = _adoptMemberName(target, source);
-    if (existing == null) {
-      result._undoProcedureToLibrary[source] = source.parent;
-      target.addProcedure(source);
-    } else {
-      replacementMap.references[source.reference] = existing.reference;
-    }
-  }
-
-  void _putUndoForClassMembers(Class source) {
-    result._undoClassToConstructors[source] = source.constructors.length;
-    result._undoClassToFields[source] = source.fields.length;
-    result._undoClassToProcedures[source] = source.procedures.length;
-  }
-}
-
-/// [_Combiner] fills the maps with information which [Reference]s and
-/// [TypeParameter]s should be replaced.
-class _ReplacementMap {
-  Map<Reference, Reference> references = {};
-  Map<TypeParameter, TypeParameter> typeParameters = {};
-}
-
-class _ReplaceReferencesVisitor extends RecursiveVisitor {
-  final _ReplacementMap map;
-  final _ReplacementMap undoMap;
-
-  _ReplaceReferencesVisitor(this.map, this.undoMap);
-
-  @override
-  void visitConstructorInvocation(ConstructorInvocation node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitDirectMethodInvocation(DirectMethodInvocation node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitDirectPropertyGet(DirectPropertyGet node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitDirectPropertySet(DirectPropertySet node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitInterfaceType(InterfaceType node) {
-    node.className = _newReferenceFor(node.className);
-  }
-
-  @override
-  void visitLibrary(Library node) {
-    for (var i = 0; i < node.additionalExports.length; i++) {
-      node.additionalExports[i] = _newReferenceFor(node.additionalExports[i]);
-    }
-    super.visitLibrary(node);
-  }
-
-  @override
-  void visitLibraryDependency(LibraryDependency node) {
-    node.importedLibraryReference =
-        _newReferenceFor(node.importedLibraryReference);
-  }
-
-  @override
-  void visitMethodInvocation(MethodInvocation node) {
-    node.interfaceTargetReference =
-        _newReferenceFor(node.interfaceTargetReference);
-  }
-
-  @override
-  void visitPropertyGet(PropertyGet node) {
-    node.interfaceTargetReference =
-        _newReferenceFor(node.interfaceTargetReference);
-  }
-
-  @override
-  void visitPropertySet(PropertySet node) {
-    node.interfaceTargetReference =
-        _newReferenceFor(node.interfaceTargetReference);
-  }
-
-  @override
-  void visitRedirectingInitializer(RedirectingInitializer node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitStaticGet(StaticGet node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitStaticInvocation(StaticInvocation node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitStaticSet(StaticSet node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitSuperInitializer(SuperInitializer node) {
-    node.targetReference = _newReferenceFor(node.targetReference);
-  }
-
-  @override
-  void visitSuperMethodInvocation(SuperMethodInvocation node) {
-    node.interfaceTargetReference =
-        _newReferenceFor(node.interfaceTargetReference);
-  }
-
-  @override
-  void visitSuperPropertyGet(SuperPropertyGet node) {
-    node.interfaceTargetReference =
-        _newReferenceFor(node.interfaceTargetReference);
-  }
-
-  @override
-  void visitSuperPropertySet(SuperPropertySet node) {
-    node.interfaceTargetReference =
-        _newReferenceFor(node.interfaceTargetReference);
-  }
-
-  @override
-  void visitSupertype(Supertype node) {
-    node.className = _newReferenceFor(node.className);
-  }
-
-  @override
-  void visitTypeParameterType(TypeParameterType node) {
-    TypeParameter parameter = node.parameter;
-    TypeParameter newParameter = map.typeParameters[parameter];
-    if (newParameter != null) {
-      if (undoMap != null) {
-        undoMap.typeParameters[newParameter] = parameter;
-      }
-      node.parameter = newParameter;
-    }
-  }
-
-  Reference _newReferenceFor(Reference reference) {
-    var newReference = map.references[reference];
-    if (newReference == null) return reference;
-    if (undoMap != null) undoMap.references[newReference] = reference;
-    return newReference;
-  }
-}
diff --git a/pkg/front_end/lib/src/incremental/kernel_driver.dart b/pkg/front_end/lib/src/incremental/kernel_driver.dart
index 492ad53..3bbb34f 100644
--- a/pkg/front_end/lib/src/incremental/kernel_driver.dart
+++ b/pkg/front_end/lib/src/incremental/kernel_driver.dart
@@ -19,9 +19,9 @@
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:front_end/src/incremental/file_state.dart';
 import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:meta/meta.dart';
 
@@ -370,7 +370,7 @@
         results.first.libraryResults.map((l) => l.library).toList();
     var program = new Program(nameRoot: nameRoot, libraries: coreLibraries);
     return new TypeEnvironment(
-        new CoreTypes(program), new IncrementalClassHierarchy());
+        new CoreTypes(program), new ClassHierarchy(program));
   }
 
   /// Ensure that [dillTarget] includes the [cycle] libraries.  It already
diff --git a/pkg/front_end/lib/src/incremental/reference_index.dart b/pkg/front_end/lib/src/incremental/reference_index.dart
deleted file mode 100644
index e77929a..0000000
--- a/pkg/front_end/lib/src/incremental/reference_index.dart
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-
-import 'package:kernel/kernel.dart';
-
-/// Information about libraries and nodes that use references.
-///
-/// This allows us quickly replace one library with another, that has the
-/// same API, but provided by different nodes, so different references.
-class ReferenceIndex {
-  /// The nodes in a library pointing to each reference.
-  ///
-  /// A key is an indexed library.
-  /// Its value is a map.
-  ///   A key is a target reference used in the library.
-  ///   Its value is the list of nodes in the library that use the reference.
-  final Map<Library, Map<Reference, List<Node>>> _libraryReferences = {};
-
-  /// The nodes in the program pointing to each reference.
-  ///
-  /// A key in the map is a used reference.
-  /// Its value is a set of nodes that use this reference.
-  final Map<Reference, Set<Node>> _referenceToNodes = {};
-
-  /// Index any libraries of the [program] that are not indexed yet.
-  void indexNewLibraries(Program program) {
-    for (var library in program.libraries) {
-      if (!_libraryReferences.containsKey(library)) {
-        _indexLibrary(library);
-      }
-    }
-  }
-
-  /// Remove information about references used in given [library].
-  void removeLibrary(Library library) {
-    var referencedFromNodes = _libraryReferences.remove(library);
-    if (referencedFromNodes != null) {
-      referencedFromNodes.forEach((reference, nodes) {
-        _referenceToNodes[reference]?.removeAll(nodes);
-      });
-    }
-  }
-
-  /// Remove the [oldLibrary] from the index, index the [newLibrary].  Replace
-  /// references to [oldLibrary] node with references to the corresponding
-  /// nodes in the [newLibrary].
-  ///
-  /// Canonical name trees of the [oldLibrary] and [newLibrary] are expected to
-  /// be isomorphic.
-  void replaceLibrary(Library oldLibrary, Library newLibrary) {
-    removeLibrary(oldLibrary);
-    _indexLibrary(newLibrary);
-
-    /// Visit in parallel two isomorphic name trees, and replace references.
-    void visitNames(CanonicalName oldName, CanonicalName newName) {
-      var oldReference = oldName.reference;
-      var newReference = newName.reference;
-      if (oldReference != null && newReference != null) {
-        var nodes = _referenceToNodes.remove(oldReference);
-        if (nodes != null) {
-          _referenceToNodes[newReference] = nodes;
-          var visitor = new _ReplaceVisitor(oldReference, newReference);
-          for (var node in nodes) {
-            node.accept(visitor);
-          }
-        }
-      }
-
-      // Replace references to children.
-      var oldChildren = oldName.children.iterator;
-      var newChildren = newName.children.iterator;
-      while (oldChildren.moveNext() && newChildren.moveNext()) {
-        visitNames(oldChildren.current, newChildren.current);
-      }
-    }
-
-    visitNames(oldLibrary.canonicalName, newLibrary.canonicalName);
-  }
-
-  /// Index the given [library], which is not yet indexed.
-  void _indexLibrary(Library library) {
-    var referenceToNodes = <Reference, List<Node>>{};
-    _libraryReferences[library] = referenceToNodes;
-    var visitor = new _IndexVisitor(this, library, referenceToNodes);
-    library.accept(visitor);
-  }
-}
-
-/// Visitor visits a library and records nodes and references they use.
-class _IndexVisitor extends RecursiveVisitor {
-  final ReferenceIndex index;
-  final Library libraryBeingIndexed;
-  final Map<Reference, List<Node>> referenceToNodes;
-
-  _IndexVisitor(this.index, this.libraryBeingIndexed, this.referenceToNodes);
-
-  /// Add the given [node] that uses the [reference].
-  void addNode(Node node, Reference reference) {
-    if (reference == null) return;
-    (index._referenceToNodes[reference] ??= new HashSet<Node>()).add(node);
-  }
-
-  @override
-  void visitConstructorInvocation(ConstructorInvocation node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitDirectMethodInvocation(DirectMethodInvocation node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitDirectPropertyGet(DirectPropertyGet node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitDirectPropertySet(DirectPropertySet node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitInterfaceType(InterfaceType node) {
-    addNode(node, node.className);
-    super.visitInterfaceType(node);
-  }
-
-  @override
-  void visitLibrary(Library node) {
-    for (var i = 0; i < node.additionalExports.length; i++) {
-      addNode(node, node.additionalExports[i]);
-    }
-    super.visitLibrary(node);
-  }
-
-  @override
-  void visitLibraryDependency(LibraryDependency node) {
-    addNode(node, node.importedLibraryReference);
-  }
-
-  @override
-  void visitMethodInvocation(MethodInvocation node) {
-    addNode(node, node.interfaceTargetReference);
-  }
-
-  @override
-  void visitPropertyGet(PropertyGet node) {
-    addNode(node, node.interfaceTargetReference);
-  }
-
-  @override
-  void visitPropertySet(PropertySet node) {
-    addNode(node, node.interfaceTargetReference);
-  }
-
-  @override
-  void visitRedirectingInitializer(RedirectingInitializer node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitStaticGet(StaticGet node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitStaticInvocation(StaticInvocation node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitStaticSet(StaticSet node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitSuperInitializer(SuperInitializer node) {
-    addNode(node, node.targetReference);
-  }
-
-  @override
-  void visitSuperMethodInvocation(SuperMethodInvocation node) {
-    addNode(node, node.interfaceTargetReference);
-  }
-
-  @override
-  void visitSuperPropertyGet(SuperPropertyGet node) {
-    addNode(node, node.interfaceTargetReference);
-  }
-
-  @override
-  void visitSuperPropertySet(SuperPropertySet node) {
-    addNode(node, node.interfaceTargetReference);
-  }
-
-  @override
-  void visitSupertype(Supertype node) {
-    addNode(node, node.className);
-  }
-}
-
-/// [Visitor] that replaces the [oldReference] with the [newReference] in
-/// a single [Node].
-class _ReplaceVisitor extends Visitor {
-  final Reference oldReference;
-  final Reference newReference;
-
-  _ReplaceVisitor(this.oldReference, this.newReference);
-
-  @override
-  void visitConstructorInvocation(ConstructorInvocation node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitDirectMethodInvocation(DirectMethodInvocation node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitDirectPropertyGet(DirectPropertyGet node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitDirectPropertySet(DirectPropertySet node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitInterfaceType(InterfaceType node) {
-    node.className = newReference;
-  }
-
-  @override
-  void visitLibrary(Library node) {
-    for (var i = 0; i < node.additionalExports.length; i++) {
-      if (node.additionalExports[i] == oldReference) {
-        node.additionalExports[i] = newReference;
-        return;
-      }
-    }
-  }
-
-  @override
-  void visitLibraryDependency(LibraryDependency node) {
-    node.importedLibraryReference = newReference;
-  }
-
-  @override
-  void visitMethodInvocation(MethodInvocation node) {
-    node.interfaceTargetReference = newReference;
-  }
-
-  @override
-  void visitPropertyGet(PropertyGet node) {
-    node.interfaceTargetReference = newReference;
-  }
-
-  @override
-  void visitPropertySet(PropertySet node) {
-    node.interfaceTargetReference = newReference;
-  }
-
-  @override
-  void visitRedirectingInitializer(RedirectingInitializer node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitStaticGet(StaticGet node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitStaticInvocation(StaticInvocation node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitStaticSet(StaticSet node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitSuperInitializer(SuperInitializer node) {
-    node.targetReference = newReference;
-  }
-
-  @override
-  void visitSuperMethodInvocation(SuperMethodInvocation node) {
-    node.interfaceTargetReference = newReference;
-  }
-
-  @override
-  void visitSuperPropertyGet(SuperPropertyGet node) {
-    node.interfaceTargetReference = newReference;
-  }
-
-  @override
-  void visitSuperPropertySet(SuperPropertySet node) {
-    node.interfaceTargetReference = newReference;
-  }
-
-  @override
-  void visitSupertype(Supertype node) {
-    node.className = newReference;
-  }
-}
diff --git a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart b/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
deleted file mode 100644
index 8c5a5b6..0000000
--- a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
+++ /dev/null
@@ -1,585 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
-import 'package:front_end/src/base/api_signature.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/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/ticker.dart';
-import 'package:front_end/src/fasta/uri_translator.dart';
-import 'package:front_end/src/incremental/file_state.dart';
-import 'package:front_end/src/incremental/reference_index.dart';
-import 'package:kernel/kernel.dart';
-import 'package:meta/meta.dart';
-
-/// Implementation of [IncrementalKernelGenerator].
-///
-/// The initial compilation of the entry point is performed not incrementally.
-///
-/// Each file that is transitively referenced from the entry point is read,
-/// its API signature is computed.  Then full compilation is performed, without
-/// any incrementality, to get the initial program.  When a file is invalidated,
-/// it is read again, and its API signature is recomputed.  If the API signature
-/// is the same as it was before, then only the library of the file is
-/// recompiled, and the current program is updated.  If the API signature of
-/// a file is different, all libraries that transitively use the changed file
-/// are removed from the current program, and recompiled using the remaining
-/// libraries.
-class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
-  static const MSG_PENDING_COMPUTE =
-      'A computeDelta() invocation is still executing.';
-
-  static const MSG_NO_LAST_DELTA =
-      'The last delta has been already accepted or rejected.';
-
-  static const MSG_HAS_LAST_DELTA =
-      'The last delta must be either accepted or rejected.';
-
-  /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 1;
-
-  /// Options used by the kernel compiler.
-  final ProcessedOptions options;
-
-  /// The optional SDK outline as a serialized program.
-  /// If provided, the driver will not attempt to read SDK files.
-  final List<int> _sdkOutlineBytes;
-
-  /// The [FileSystem] which should be used by the front end to access files.
-  final FileSystem _fileSystem;
-
-  /// The logger to report compilation progress.
-  final PerformanceLog _logger;
-
-  /// The [ByteStore] used to cache results.
-  final ByteStore _byteStore;
-
-  /// The object that knows how to resolve "package:" and "dart:" URIs.
-  final UriTranslator uriTranslator;
-
-  /// The URI of the program entry point.
-  final Uri _entryPoint;
-
-  /// The function to notify when files become used or unused, or `null`.
-  final WatchUsedFilesFn _watchFn;
-
-  /// The salt to mix into all hashes used as keys for serialized data.
-  List<int> _salt;
-
-  /// The current file system state.
-  FileSystemState _fsState;
-
-  /// The list of absolute file URIs that were reported through [invalidate]
-  /// and not checked for actual changes yet.
-  List<Uri> _invalidatedFiles = [];
-
-  /// The set of libraries for which the content of the library file, or
-  /// one of its parts, changed using [invalidate], and during
-  /// [_refreshInvalidatedFiles] it was found that that changes are only in
-  /// method bodies.
-  ///
-  /// If any library had an API change, this set will be empty.
-  final Set<FileState> _changedLibrariesWithSameApi = new Set<FileState>();
-
-  /// 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();
-
-  /// The [DillTarget] that represents the current [Program] state.
-  DillTarget _dillTarget;
-
-  /// Each key is the file system URI of a library.
-  /// Each value is the libraries that directly depend on the key library.
-  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].
-  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.
-  Map<Uri, Uri> _partToLibrary = {};
-
-  /// The index that keeps track of references and nodes that use them,
-  /// and allows fast reference replacement on a single library compilation.
-  final ReferenceIndex _referenceIndex = new ReferenceIndex();
-
-  /// Whether [computeDelta] is executing.
-  bool _isComputeDeltaExecuting = false;
-
-  /// The current signatures for libraries.
-  final Map<Uri, String> _currentSignatures = {};
-
-  /// The signatures for libraries produced by the last [computeDelta], or
-  /// `null` if the last delta was either accepted or rejected.
-  Map<Uri, String> _lastSignatures;
-
-  /// The object that provides additional information for tests.
-  final _TestView _testView = new _TestView();
-
-  IncrementalKernelGeneratorImpl(this.options, this.uriTranslator,
-      List<int> sdkOutlineBytes, this._entryPoint,
-      {WatchUsedFilesFn watch})
-      : _sdkOutlineBytes = sdkOutlineBytes,
-        _fileSystem = options.fileSystem,
-        _logger = options.logger,
-        _byteStore = options.byteStore,
-        _watchFn = watch {
-    _computeSalt();
-
-    Future<Null> onFileAdded(Uri uri) {
-      if (_watchFn != null) {
-        return _watchFn(uri, true);
-      }
-      return new Future.value();
-    }
-
-    _fsState = new FileSystemState(_byteStore, _fileSystem, options.target,
-        uriTranslator, _salt, onFileAdded);
-
-    // Pre-populate the Program with SDK.
-    _loadSdkOutline();
-
-    _createDillTarget();
-  }
-
-  /// Return the object that provides additional information for tests.
-  @visibleForTesting
-  _TestView get test => _testView;
-
-  @override
-  void acceptLastDelta() {
-    _throwIfNoLastDelta();
-    _currentSignatures.addAll(_lastSignatures);
-    _lastSignatures = null;
-  }
-
-  @override
-  Future<DeltaProgram> computeDelta() {
-    if (_isComputeDeltaExecuting) {
-      throw new StateError(MSG_PENDING_COMPUTE);
-    }
-
-    if (_lastSignatures != null) {
-      throw new StateError(MSG_HAS_LAST_DELTA);
-    }
-    _lastSignatures = {};
-
-    _isComputeDeltaExecuting = true;
-
-    return _runWithFrontEndContext('Compute delta', () async {
-      try {
-        await _refreshInvalidatedFiles();
-        _testView.compiledUris.clear();
-
-        // Ensure that the graph starting at the entry point is ready.
-        await _logger.runAsync('Build graph of files', () async {
-          return await _fsState.getFile(_entryPoint);
-        });
-
-        // The file graph might have changed, perform GC.
-        await _gc();
-
-        // Compile just libraries with changes to function bodies, or
-        // compile multiple libraries because of API changes.
-        if (_changedLibrariesWithSameApi.isNotEmpty) {
-          await _logger.runAsync('Compile libraries with body changes',
-              () async {
-            await _compileLibrariesWithBodyChanges();
-          });
-        } else {
-          _createDillTarget();
-
-          // Append all libraries what we still have in the current program.
-          Set<Uri> validLibraries =
-              _program.libraries.map((library) => library.importUri).toSet();
-          var validDillCount = validLibraries.length;
-          await _logger.runAsync('Load $validDillCount dill libraries',
-              () async {
-            _dillTarget.loader.appendLibraries(_program);
-            await _dillTarget.buildOutlines();
-          });
-
-          // Configure KernelTarget to compile the entry point.
-          var kernelTarget =
-              new KernelTarget(_fileSystem, false, _dillTarget, uriTranslator);
-          kernelTarget.read(_entryPoint);
-
-          // Compile the entry point.
-          await _logger.runAsync('Compile', () async {
-            await kernelTarget.buildOutlines(nameRoot: _program.root);
-            _program = await kernelTarget.buildProgram() ?? _program;
-          });
-          _program.computeCanonicalNames();
-
-          _logger.run('Compute dependencies', _computeDependencies);
-
-          // Append new libraries to the DillTarget.
-          int newDillCount = _program.libraries.length - validDillCount;
-          await _logger.runAsync('Append $newDillCount dill libraries',
-              () async {
-            _dillTarget.loader.appendLibraries(_program,
-                filter: (uri) => !validLibraries.contains(uri));
-            await _dillTarget.buildOutlines();
-          });
-        }
-
-        _logger.run('Index references', () {
-          _referenceIndex.indexNewLibraries(_program);
-        });
-
-        // Prepare libraries that changed relatively to the current state.
-        var changedLibraries = new Set<Uri>();
-        for (var library in _program.libraries) {
-          var uri = library.importUri;
-          var file = _fsState.getFileOrNull(uri);
-          if (file != null && _currentSignatures[uri] != file.signatureStr) {
-            changedLibraries.add(library.fileUri);
-            _lastSignatures[uri] = file.signatureStr;
-            _testView.compiledUris.add(uri);
-          }
-        }
-
-        // The set of affected library cycles (have different signatures),
-        // or libraries that import or export affected libraries (so VM might
-        // have inlined some code from affected libraries into them).
-        final vmRequiredLibraries = new Set<Uri>();
-
-        void gatherVmRequiredLibraries(Uri libraryUri) {
-          if (vmRequiredLibraries.add(libraryUri)) {
-            var directUsers = _directLibraryDependencies[libraryUri];
-            directUsers?.forEach(gatherVmRequiredLibraries);
-          }
-        }
-
-        changedLibraries.forEach(gatherVmRequiredLibraries);
-
-        // Compose the resulting program with new libraries.
-        var program = new Program(nameRoot: _program.root);
-        for (var library in _program.libraries) {
-          if (_sdkOutlineBytes != null && library.importUri.isScheme('dart')) {
-            continue;
-          }
-          if (vmRequiredLibraries.contains(library.fileUri)) {
-            program.uriToSource[library.fileUri] =
-                _program.uriToSource[library.fileUri];
-            for (var part in library.parts) {
-              program.uriToSource[part.fileUri] =
-                  _program.uriToSource[part.fileUri];
-            }
-            program.libraries.add(library);
-            library.parent = program;
-          }
-        }
-        program.mainMethod = _program.mainMethod;
-        _logger.writeln('Returning ${program.libraries.length} libraries.');
-        _logger.writeln('There are ${_dillTarget.loader.libraries.length} '
-            'libraries in DillTarget.');
-
-        var stateString = _ExternalState.asString(_lastSignatures);
-        return new DeltaProgram(stateString, program);
-      } finally {
-        _isComputeDeltaExecuting = false;
-      }
-    });
-  }
-
-  @override
-  void invalidate(Uri uri) {
-    _invalidatedFiles.add(uri);
-  }
-
-  @override
-  void rejectLastDelta() {
-    _throwIfNoLastDelta();
-    _lastSignatures = null;
-  }
-
-  @override
-  void reset() {
-    _currentSignatures.clear();
-    _lastSignatures = null;
-  }
-
-  @override
-  void setState(String state) {
-    if (_isComputeDeltaExecuting) {
-      throw new StateError(MSG_PENDING_COMPUTE);
-    }
-    var signatures = _ExternalState.fromString(state);
-    _currentSignatures.clear();
-    _currentSignatures.addAll(signatures);
-  }
-
-  /// The [_program] is almost valid, there are [_changedLibrariesWithSameApi]
-  /// which should be recompiled, but all other libraries are fine.
-  ///
-  /// Compile the changed libraries and update referenced in other libraries.
-  Future<Null> _compileLibrariesWithBodyChanges() async {
-    if (_changedLibrariesWithSameApi.isNotEmpty) {
-      var kernelTarget =
-          new KernelTarget(_fileSystem, false, _dillTarget, uriTranslator);
-
-      // Schedule URIs of changed libraries for compilation.
-      for (var changedLibrary in _changedLibrariesWithSameApi) {
-        _testView.compiledUris.add(changedLibrary.uri);
-        // Detach the old library.
-        var oldLibrary = _uriToLibrary[changedLibrary.fileUri];
-        _program.root.removeChild(changedLibrary.uriStr);
-        _program.libraries.remove(oldLibrary);
-        _dillTarget.loader.builders.remove(changedLibrary.uri);
-        _dillTarget.loader.libraries.remove(oldLibrary);
-        _referenceIndex.removeLibrary(oldLibrary);
-        // Schedule the library for compilation.
-        kernelTarget.read(changedLibrary.uri);
-      }
-
-      var mainReference = _program.mainMethodName;
-      await _logger.runAsync('Compile', () async {
-        await kernelTarget.buildOutlines(nameRoot: _program.root);
-        await kernelTarget.buildProgram();
-      });
-
-      // Attach the new library and replace references.
-      _logger.run('Replace references', () {
-        var builders = kernelTarget.loader.builders;
-        for (var changedLibrary in _changedLibrariesWithSameApi) {
-          Library oldLibrary = _uriToLibrary[changedLibrary.fileUri];
-          Library newLibrary = builders[changedLibrary.uri].target;
-
-          _program.root
-              .getChildFromUri(newLibrary.importUri)
-              .bindTo(newLibrary.reference);
-          newLibrary.computeCanonicalNames();
-
-          _program.root.adoptChild(newLibrary.canonicalName);
-          _program.libraries.add(newLibrary);
-
-          _uriToLibrary[changedLibrary.fileUri] = newLibrary;
-          _referenceIndex.replaceLibrary(oldLibrary, newLibrary);
-
-          // Schedule the new outline for loading.
-          // TODO(scheglov): Add a more efficient API to add one library.
-          _dillTarget.loader.appendLibraries(_program,
-              filter: (uri) => uri == newLibrary.importUri);
-
-          // If main() was defined in the recompiled library, replace it.
-          if (mainReference?.asProcedure?.enclosingLibrary == oldLibrary) {
-            mainReference = newLibrary.procedures
-                .singleWhere((p) => p.name.name == 'main')
-                .reference;
-          }
-        }
-      });
-
-      // Load outlines of replaced libraries.
-      await _dillTarget.buildOutlines();
-
-      // Restore the main() procedure reference.
-      _program.mainMethodName = mainReference;
-    }
-  }
-
-  /// Recompute [_directLibraryDependencies] for the current [_program].
-  void _computeDependencies() {
-    _directLibraryDependencies.clear();
-    _uriToLibrary.clear();
-    _partToLibrary.clear();
-
-    var processedLibraries = new Set<Library>();
-
-    void processLibrary(Library library) {
-      if (!processedLibraries.add(library)) 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);
-      }
-    }
-
-    var entryPointLibrary =
-        _program.libraries.singleWhere((lib) => lib.importUri == _entryPoint);
-    processLibrary(entryPointLibrary);
-  }
-
-  /// Compute salt and put into [_salt].
-  void _computeSalt() {
-    var saltBuilder = new ApiSignature();
-    saltBuilder.addInt(DATA_VERSION);
-    saltBuilder.addBool(options.strongMode);
-    if (_sdkOutlineBytes != null) {
-      saltBuilder.addBytes(_sdkOutlineBytes);
-    }
-    _salt = saltBuilder.toByteList();
-  }
-
-  /// Create a new, empty [_dillTarget].
-  void _createDillTarget() {
-    _dillTarget = new DillTarget(
-        new Ticker(isVerbose: false), uriTranslator, options.target);
-  }
-
-  /// Find files which are not referenced from the entry point and report
-  /// them to the watch function.
-  Future<Null> _gc() async {
-    List<FileState> removedFiles = _fsState.gc(_entryPoint);
-    if (removedFiles.isNotEmpty && _watchFn != null) {
-      for (var removedFile in removedFiles) {
-        // If a library, remove it from the program.
-        Library library = _uriToLibrary.remove(removedFile.fileUri);
-        if (library != null) {
-          _currentSignatures.remove(library.importUri);
-          _program.libraries.remove(library);
-          _program.root.removeChild(library.importUri.toString());
-          _program.uriToSource.remove(library.fileUri);
-          for (var part in library.parts) {
-            _program.uriToSource.remove(part.fileUri);
-          }
-        }
-        // Notify the client.
-        await _watchFn(removedFile.fileUri, false);
-      }
-    }
-  }
-
-  /// If SDK outline bytes are provided, load it and configure the file system
-  /// state to skip SDK library files.
-  void _loadSdkOutline() {
-    if (_sdkOutlineBytes != null) {
-      _logger.run('Load SDK outline from bytes', () {
-        loadProgramFromBytes(_sdkOutlineBytes, _program);
-        // Configure the file system state to skip the outline libraries.
-        for (var outlineLibrary in _program.libraries) {
-          _fsState.skipSdkLibraries.add(outlineLibrary.importUri);
-        }
-      });
-    }
-  }
-
-  /// Refresh all the invalidated files and update dependencies.
-  Future<Null> _refreshInvalidatedFiles() async {
-    await _logger.runAsync('Refresh invalidated files', () async {
-      // Replace the list to avoid concurrent modifications.
-      List<Uri> invalidatedFiles = _invalidatedFiles;
-      _invalidatedFiles = <Uri>[];
-
-      // Refresh the files.
-      _changedLibrariesWithSameApi.clear();
-      var filesWithDifferentApiSignature = <FileState>[];
-      for (var fileUri in invalidatedFiles) {
-        var file = _fsState.getFileByFileUri(fileUri);
-        if (file != null) {
-          _logger.writeln('Refresh $fileUri');
-          bool apiSignatureChanged = await file.refresh();
-          if (apiSignatureChanged) {
-            filesWithDifferentApiSignature.add(file);
-          } else {
-            FileState libraryFile = file;
-            Uri libraryFileUri = _partToLibrary[file.fileUri];
-            if (libraryFileUri != null) {
-              libraryFile = _fsState.getFileByFileUri(libraryFileUri);
-            }
-            _changedLibrariesWithSameApi.add(libraryFile);
-          }
-        }
-      }
-
-      if (filesWithDifferentApiSignature.isNotEmpty) {
-        _logger.writeln('API changed in $filesWithDifferentApiSignature.');
-        _changedLibrariesWithSameApi.clear();
-
-        /// Invalidate the library with the given [libraryUri],
-        /// and recursively all its clients.
-        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.toString());
-          _program.uriToSource.remove(libraryUri);
-          _currentSignatures.remove(library.importUri);
-          _referenceIndex.removeLibrary(library);
-
-          // Recursively invalidate clients.
-          Set<Uri> directDependencies =
-              _directLibraryDependencies.remove(libraryUri);
-          directDependencies?.forEach(invalidateLibrary);
-        }
-
-        // TODO(scheglov): Some changes still might be incremental.
-        for (var uri in invalidatedFiles) {
-          Uri libraryUri = _partToLibrary.remove(uri) ?? uri;
-          invalidateLibrary(libraryUri);
-        }
-      }
-    });
-  }
-
-  Future<T> _runWithFrontEndContext<T>(String msg, Future<T> f()) async {
-    return await CompilerContext.runWithOptions(options, (context) {
-      context.disableColors();
-      return _logger.runAsync(msg, f);
-    });
-  }
-
-  /// Throw [StateError] if [_lastSignatures] is `null`, i.e. there is no
-  /// last delta - it either has not been computed yet, or has been already
-  /// accepted or rejected.
-  void _throwIfNoLastDelta() {
-    if (_isComputeDeltaExecuting) {
-      throw new StateError(MSG_PENDING_COMPUTE);
-    }
-    if (_lastSignatures == null) {
-      throw new StateError(MSG_NO_LAST_DELTA);
-    }
-  }
-}
-
-class _ExternalState {
-  /// Return the JSON encoding of the [signatures].
-  static String asString(Map<Uri, String> signatures) {
-    var json = <String, String>{};
-    signatures.forEach((uri, signature) {
-      json[uri.toString()] = signature;
-    });
-    return JSON.encode(json);
-  }
-
-  /// Decode the given JSON [state] into the program state.
-  static Map<Uri, String> fromString(String state) {
-    var signatures = <Uri, String>{};
-    Map<String, String> json = JSON.decode(state);
-    json.forEach((uriStr, signature) {
-      var uri = Uri.parse(uriStr);
-      signatures[uri] = signature;
-    });
-    return signatures;
-  }
-}
-
-@visibleForTesting
-class _TestView {
-  /// The list of [Uri]s compiled for the last delta.
-  /// It does not include libraries which were reused from the last program.
-  final Set<Uri> compiledUris = new Set<Uri>();
-}
diff --git a/pkg/front_end/lib/src/minimal_incremental_kernel_generator.dart b/pkg/front_end/lib/src/minimal_incremental_kernel_generator.dart
deleted file mode 100644
index 3325ca9..0000000
--- a/pkg/front_end/lib/src/minimal_incremental_kernel_generator.dart
+++ /dev/null
@@ -1,384 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/api_prototype/incremental_kernel_generator.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/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/uri_translator.dart';
-import 'package:kernel/kernel.dart';
-import 'package:meta/meta.dart';
-
-/// Implementation of [IncrementalKernelGenerator].
-///
-/// This implementation uses simplified approach to tracking dependencies.
-/// When a change happens to a file, we invalidate this file, its library,
-/// and then transitive closure of all libraries that reference it.
-class MinimalIncrementalKernelGenerator implements IncrementalKernelGenerator {
-  static const MSG_PENDING_COMPUTE =
-      'A computeDelta() invocation is still executing.';
-
-  static const MSG_NO_LAST_DELTA =
-      'The last delta has been already accepted or rejected.';
-
-  static const MSG_HAS_LAST_DELTA =
-      'The last delta must be either accepted or rejected.';
-
-  /// Options used by the kernel compiler.
-  final ProcessedOptions _options;
-
-  /// The object that knows how to resolve "package:" and "dart:" URIs.
-  final UriTranslator uriTranslator;
-
-  /// The logger to report compilation progress.
-  final PerformanceLog _logger;
-
-  /// The URI of the program entry point.
-  final Uri _entryPoint;
-
-  /// The function to notify when files become used or unused, or `null`.
-  final WatchUsedFilesFn _watchFn;
-
-  /// A [FileSystem] or [_WatchingFileSystem] instance.
-  final FileSystem _fileSystem;
-
-  /// 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.
-  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].
-  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.
-  Map<Uri, Uri> _partToLibrary = {};
-
-  /// Whether [computeDelta] is executing.
-  bool _isComputeDeltaExecuting = false;
-
-  /// The set of libraries (file system URIs) accepted by the client, and not
-  /// yet invalidated explicitly or implicitly via a transitive dependency.
-  ///
-  /// When we produce a new delta, we put newly compiled libraries into
-  /// the [_lastLibraries] field, so [_currentLibraries] and [_lastLibraries]
-  /// don't intersect.
-  final Set<Uri> _currentLibraries = new Set<Uri>();
-
-  /// The set of new libraries (file system URIs) returned to the client by the
-  /// last [computeDelta], or `null` if the last delta was either accepted or
-  /// rejected.
-  Set<Uri> _lastLibraries;
-
-  /// The object that provides additional information for tests.
-  _TestView _testView;
-
-  MinimalIncrementalKernelGenerator(this._options, this.uriTranslator,
-      List<int> sdkOutlineBytes, this._entryPoint,
-      {WatchUsedFilesFn watch})
-      : _logger = _options.logger,
-        _watchFn = watch,
-        _fileSystem = watch == null
-            ? _options.fileSystem
-            : new _WatchingFileSystem(_options.fileSystem, watch) {
-    _testView = new _TestView();
-
-    // Pre-populate the Program with SDK.
-    if (sdkOutlineBytes != null) {
-      loadProgramFromBytes(sdkOutlineBytes, _program);
-      for (var sdkLibrary in _program.libraries) {
-        _currentLibraries.add(sdkLibrary.fileUri);
-      }
-    }
-  }
-
-  /// Return the object that provides additional information for tests.
-  @visibleForTesting
-  _TestView get test => _testView;
-
-  @override
-  void acceptLastDelta() {
-    _throwIfNoLastDelta();
-    _currentLibraries.addAll(_lastLibraries);
-    _lastLibraries = null;
-  }
-
-  @override
-  Future<DeltaProgram> computeDelta() {
-    _options.ticker.reset();
-    if (_isComputeDeltaExecuting) {
-      throw new StateError(MSG_PENDING_COMPUTE);
-    }
-
-    if (_lastLibraries != null) {
-      throw new StateError(MSG_HAS_LAST_DELTA);
-    }
-    _lastLibraries = new Set<Uri>();
-
-    _isComputeDeltaExecuting = true;
-
-    return _runWithFrontEndContext('Compute delta', () 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();
-        });
-
-        // Configure KernelTarget to compile the entry point.
-        var kernelTarget =
-            new KernelTarget(_fileSystem, false, dillTarget, uriTranslator);
-        kernelTarget.read(_entryPoint);
-
-        // 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;
-        });
-
-        await _unwatchFiles();
-
-        _logger.run('Compute dependencies', _computeDependencies);
-
-        // Compose the resulting program with new libraries.
-        var program = new Program(nameRoot: _program.root);
-        _testView.compiledUris.clear();
-        for (var library in _program.libraries) {
-          Uri uri = library.fileUri;
-          if (_currentLibraries.contains(uri)) continue;
-
-          _lastLibraries.add(uri);
-          _testView.compiledUris.add(library.importUri);
-
-          program.uriToSource[uri] = _program.uriToSource[uri];
-          for (var part in library.parts) {
-            program.uriToSource[part.fileUri] =
-                _program.uriToSource[part.fileUri];
-          }
-
-          program.libraries.add(library);
-          library.parent = program;
-        }
-        program.mainMethod = _program.mainMethod;
-
-        return new DeltaProgram('', program);
-      } finally {
-        _isComputeDeltaExecuting = false;
-      }
-    });
-  }
-
-  @override
-  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);
-      _currentLibraries.remove(libraryUri);
-
-      // Recursively invalidate dependencies.
-      Set<Uri> directDependencies =
-          _directLibraryDependencies.remove(libraryUri);
-      directDependencies?.forEach(invalidateLibrary);
-    }
-
-    Uri libraryUri = _partToLibrary.remove(uri) ?? uri;
-    invalidateLibrary(libraryUri);
-  }
-
-  @override
-  void rejectLastDelta() {
-    _throwIfNoLastDelta();
-    _lastLibraries = null;
-  }
-
-  @override
-  void reset() {
-    _currentLibraries.clear();
-    _lastLibraries = null;
-  }
-
-  @override
-  void setState(String state) {
-    // TODO(scheglov): Do we need this at all?
-    // If we don't know the previous state, we will give the client all
-    // libraries to reload. While this is suboptimal, this should not affect
-    // correctness.
-    // Note that even if we don't give the client all libraries, we will have
-    // to compile them all anyway, because this implementation does not use
-    // any persistent caching.
-  }
-
-  /// Recompute [_directLibraryDependencies] for the current [_program].
-  void _computeDependencies() {
-    _directLibraryDependencies.clear();
-    _uriToLibrary.clear();
-    _partToLibrary.clear();
-
-    var processedLibraries = new Set<Library>();
-
-    void processLibrary(Library library) {
-      if (!processedLibraries.add(library)) 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);
-      }
-    }
-
-    var entryPointLibrary = _getEntryPointLibrary();
-    processLibrary(entryPointLibrary);
-  }
-
-  Library _getEntryPointLibrary() =>
-      _program.libraries.singleWhere((lib) => lib.importUri == _entryPoint);
-
-  Future<T> _runWithFrontEndContext<T>(String msg, Future<T> f()) async {
-    return await CompilerContext.runWithOptions(_options, (context) {
-      context.disableColors();
-      return _logger.runAsync(msg, f);
-    });
-  }
-
-  /// Throw [StateError] if [_lastLibraries] is `null`, i.e. there is no
-  /// last delta - it either has not been computed yet, or has been already
-  /// accepted or rejected.
-  void _throwIfNoLastDelta() {
-    if (_isComputeDeltaExecuting) {
-      throw new StateError(MSG_PENDING_COMPUTE);
-    }
-    if (_lastLibraries == null) {
-      throw new StateError(MSG_NO_LAST_DELTA);
-    }
-  }
-
-  /// Compute the set of of files transitively referenced from the entry point,
-  /// remove all other files from [_program], and call [_watchFn] to unwatch
-  /// known files that are not longer referenced.
-  Future<Null> _unwatchFiles() async {
-    var entryPointFiles = new Set<Uri>();
-
-    // Don't remove SDK libraries.
-    for (var library in _program.libraries) {
-      if (library.importUri.isScheme('dart')) {
-        entryPointFiles.add(library.fileUri);
-        for (var part in library.parts) {
-          entryPointFiles.add(part.fileUri);
-        }
-      }
-    }
-
-    void appendTransitiveFiles(Library library) {
-      if (entryPointFiles.add(library.fileUri)) {
-        for (var part in library.parts) {
-          entryPointFiles.add(part.fileUri);
-        }
-        for (var dependency in library.dependencies) {
-          appendTransitiveFiles(dependency.targetLibrary);
-        }
-      }
-    }
-
-    // Append files transitively referenced from the entry point.
-    var entryPointLibrary = _getEntryPointLibrary();
-    appendTransitiveFiles(entryPointLibrary);
-
-    // Remove not loaded files from the set of known files.
-    if (_fileSystem is _WatchingFileSystem) {
-      _WatchingFileSystem fileSystem = _fileSystem;
-      for (Uri knownUri in fileSystem.knownFiles.toList()) {
-        if (!entryPointFiles.contains(knownUri)) {
-          await _watchFn(knownUri, false);
-          fileSystem.knownFiles.remove(knownUri);
-          _program.uriToSource.remove(knownUri);
-        }
-      }
-    }
-
-    // Remove libraries that are no longer referenced.
-    _program.libraries
-        .removeWhere((library) => !entryPointFiles.contains(library.fileUri));
-  }
-}
-
-@visibleForTesting
-class _TestView {
-  /// The list of [Uri]s compiled for the last delta.
-  /// It does not include libraries which were reused from the last program.
-  final Set<Uri> compiledUris = new Set<Uri>();
-}
-
-/// [FileSystem] that notifies [WatchUsedFilesFn] about new files.
-class _WatchingFileSystem implements FileSystem {
-  final FileSystem fileSystem;
-  final WatchUsedFilesFn watchFn;
-  final Set<Uri> knownFiles = new Set<Uri>();
-
-  _WatchingFileSystem(this.fileSystem, this.watchFn);
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    var entity = fileSystem.entityForUri(uri);
-    return new _WatchingFileSystemEntity(this, entity, watchFn);
-  }
-}
-
-/// [FileSystemEntity] that notifies the [WatchUsedFilesFn] about new files.
-class _WatchingFileSystemEntity implements FileSystemEntity {
-  final _WatchingFileSystem fileSystem;
-  final FileSystemEntity entity;
-  final WatchUsedFilesFn watchFn;
-
-  _WatchingFileSystemEntity(this.fileSystem, this.entity, this.watchFn);
-
-  @override
-  Uri get uri => entity.uri;
-
-  @override
-  Future<bool> exists() {
-    return entity.exists();
-  }
-
-  @override
-  Future<List<int>> readAsBytes() async {
-    if (fileSystem.knownFiles.add(uri)) {
-      await watchFn(uri, true);
-    }
-    return entity.readAsBytes();
-  }
-
-  @override
-  Future<String> readAsString() async {
-    if (fileSystem.knownFiles.add(uri)) {
-      await watchFn(uri, true);
-    }
-    return entity.readAsString();
-  }
-}
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 81ac570..8e6a904 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -5,14 +5,19 @@
 /// Common compiler options and helper functions used for testing.
 library front_end.testing.compiler_options_common;
 
-import 'dart:async';
+import 'dart:async' show Future;
 
-import 'dart:io' show Platform;
+import 'package:kernel/ast.dart' show Library, Program;
 
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/testing/hybrid_file_system.dart';
-import 'package:kernel/ast.dart';
+import '../api_prototype/front_end.dart'
+    show CompilerOptions, kernelForBuildUnit, kernelForProgram, summaryFor;
+
+import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
+
+import '../compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+import '../testing/hybrid_file_system.dart' show HybridFileSystem;
 
 /// Generate kernel for a script.
 ///
@@ -99,8 +104,7 @@
     ..packagesFileUri = toTestUri('.packages');
 
   if (options.sdkSummary == null) {
-    options.sdkRoot =
-        Uri.base.resolve(Platform.resolvedExecutable).resolve("./");
+    options.sdkRoot = computePlatformBinariesLocation();
   }
 }
 
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index d731a21..7a57bfc 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_test.dart
@@ -45,7 +45,7 @@
 }
 
 Future runCompiler(Uri compiler, Uri input, Uri output) async {
-  Uri dartVm = Uri.base.resolve(Platform.resolvedExecutable);
+  Uri dartVm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
   StdioProcess result = await StdioProcess.run(dartVm.toFilePath(), <String>[
     "-c",
     compiler.toFilePath(),
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index 97f02fc..1b13610 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -8,6 +8,8 @@
 
 import 'package:expect/expect.dart' show Expect;
 
+import 'package:kernel/ast.dart' show Program;
+
 import "package:front_end/src/api_prototype/compiler_options.dart"
     show CompilerOptions;
 
@@ -22,7 +24,7 @@
 import 'package:front_end/src/fasta/fasta_codes.dart' show LocatedMessage;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show FastaDelta, IncrementalCompiler;
+    show IncrementalCompiler;
 
 import 'package:front_end/src/fasta/severity.dart' show Severity;
 
@@ -53,25 +55,28 @@
   IncrementalCompiler compiler =
       new IncrementalCompiler(new CompilerContext(options));
 
-  FastaDelta delta = await compiler.computeDelta();
+  Program program = await compiler.computeDelta();
 
   if (sdkFromSource) {
     // Expect that the new program contains at least the following libraries:
     // dart:core, dart:async, and hello.dart.
-    Expect.isTrue(delta.newProgram.libraries.length > 2,
-        "${delta.newProgram.libraries.length} <= 2");
+    Expect.isTrue(
+        program.libraries.length > 2, "${program.libraries.length} <= 2");
   } else {
     // Expect that the new program contains exactly hello.dart.
-    Expect.isTrue(delta.newProgram.libraries.length == 1,
-        "${delta.newProgram.libraries.length} != 1");
+    Expect.isTrue(
+        program.libraries.length == 1, "${program.libraries.length} != 1");
   }
 
   compiler.invalidate(helloDart);
 
-  delta = await compiler.computeDelta(entryPoint: helloDart);
+  program = await compiler.computeDelta(entryPoint: helloDart);
   // Expect that the new program contains exactly hello.dart
-  Expect.isTrue(delta.newProgram.libraries.length == 1,
-      "${delta.newProgram.libraries.length} != 1");
+  Expect.isTrue(
+      program.libraries.length == 1, "${program.libraries.length} != 1");
+
+  program = await compiler.computeDelta(entryPoint: helloDart);
+  Expect.isTrue(program.libraries.isEmpty);
 }
 
 void main() {
diff --git a/pkg/front_end/test/fasta/incremental_test.dart b/pkg/front_end/test/fasta/incremental_test.dart
index 54c5e9f..d89f3a32 100644
--- a/pkg/front_end/test/fasta/incremental_test.dart
+++ b/pkg/front_end/test/fasta/incremental_test.dart
@@ -35,16 +35,8 @@
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 
-import 'package:front_end/src/incremental_kernel_generator_impl.dart'
-    show IncrementalKernelGeneratorImpl;
-
-import 'package:front_end/src/minimal_incremental_kernel_generator.dart'
-    show MinimalIncrementalKernelGenerator;
-
 import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
 
-import 'package:front_end/src/fasta/uri_translator.dart' show UriTranslator;
-
 import 'package:front_end/src/fasta/incremental_compiler.dart'
     show IncrementalCompiler;
 
@@ -59,42 +51,19 @@
 
 final Uri entryPoint = base.resolve("main.dart");
 
-enum Generator {
-  original,
-  minimal,
-  fasta,
-}
-
-Generator generatorFromString(String string) {
-  if (string == null) return Generator.fasta;
-  switch (string) {
-    case "original":
-      return Generator.original;
-    case "minimal":
-      return Generator.minimal;
-    case "fasta":
-      return Generator.fasta;
-    default:
-      throw "Unknown generator: '$string'";
-  }
-}
-
 class Context extends ChainContext {
   final CompilerContext compilerContext;
   final ExternalStateSnapshot snapshot;
   final List<CompilationMessage> errors;
-  final Generator requestedGenerator;
 
   final List<Step> steps = const <Step>[
     const ReadTest(),
-    const PrepareIncrementalKernelGenerator(),
     const RunCompilations(),
   ];
 
-  IncrementalKernelGenerator compiler;
+  final IncrementalKernelGenerator compiler;
 
-  Context(
-      this.compilerContext, this.snapshot, this.errors, this.requestedGenerator)
+  Context(this.compilerContext, this.snapshot, this.errors)
       : compiler = new IncrementalCompiler(compilerContext);
 
   ProcessedOptions get options => compilerContext.options;
@@ -150,32 +119,6 @@
   }
 }
 
-class PrepareIncrementalKernelGenerator
-    extends Step<TestCase, TestCase, Context> {
-  String get name => "prepare IKG";
-
-  const PrepareIncrementalKernelGenerator();
-
-  Future<Result<TestCase>> run(TestCase test, Context context) async {
-    if (Generator.fasta != context.requestedGenerator) {
-      context.compiler = await context
-          .runInContext<Future<IncrementalKernelGenerator>>(
-              (CompilerContext c) async {
-        UriTranslator uriTranslator = await c.options.getUriTranslator();
-        List<int> sdkOutlineBytes = await c.options.loadSdkSummaryBytes();
-        if (Generator.minimal == context.requestedGenerator) {
-          return new MinimalIncrementalKernelGenerator(c.options, uriTranslator,
-              sdkOutlineBytes, context.options.inputs.first);
-        } else {
-          return new IncrementalKernelGeneratorImpl(c.options, uriTranslator,
-              sdkOutlineBytes, context.options.inputs.first);
-        }
-      });
-    }
-    return pass(test);
-  }
-}
-
 class RunCompilations extends Step<TestCase, TestCase, Context> {
   const RunCompilations();
 
@@ -203,16 +146,18 @@
         return edits == 0 ? fail(test, "No sources found") : pass(test);
       }
       var compiler = context.compiler;
-      var delta = compiler is IncrementalCompiler
-          ? (await compiler.computeDelta(entryPoint: entryPoint))
-          : (await compiler.computeDelta());
-      // ignore: UNUSED_LOCAL_VARIABLE
-      Program program = delta.newProgram;
+      Program program = await compiler.computeDelta(entryPoint: entryPoint);
       List<CompilationMessage> errors = context.takeErrors();
-      if (errors.isNotEmpty && !test.expectations[edits].hasCompileTimeError) {
-        return fail(test, errors.join("\n"));
+      if (test.expectations[edits].hasCompileTimeError) {
+        if (errors.isEmpty) {
+          return fail(test, "Compile-time error expected, but none reported");
+        }
+      } else if (errors.isNotEmpty) {
+        return fail(
+            test, "Unexpected compile-time errors:\n  ${errors.join('\n  ')}");
+      } else if (program.libraries.length < 1) {
+        return fail(test, "The compiler detected no changes");
       }
-      context.compiler.acceptLastDelta();
     }
   }
 }
@@ -287,11 +232,7 @@
   final ExternalStateSnapshot snapshot =
       new ExternalStateSnapshot(await options.loadSdkSummary(null));
 
-  final Generator requestedGenerator =
-      generatorFromString(environment["generator"]);
-
-  return new Context(
-      new CompilerContext(options), snapshot, errors, requestedGenerator);
+  return new Context(new CompilerContext(options), snapshot, errors);
 }
 
 main([List<String> arguments = const []]) =>
diff --git a/pkg/front_end/test/fasta/testing/analyzer_loader.dart b/pkg/front_end/test/fasta/testing/analyzer_loader.dart
index d73819d..745cee4 100644
--- a/pkg/front_end/test/fasta/testing/analyzer_loader.dart
+++ b/pkg/front_end/test/fasta/testing/analyzer_loader.dart
@@ -4,39 +4,27 @@
 
 library fasta.analyzer_loader;
 
-import 'package:front_end/src/api_prototype/standard_file_system.dart';
-import 'package:kernel/ast.dart' show Program;
+import 'package:front_end/src/api_prototype/standard_file_system.dart'
+    show StandardFileSystem;
 
 import 'package:front_end/src/fasta/builder/builder.dart' show LibraryBuilder;
 
-import 'package:front_end/src/fasta/target_implementation.dart'
-    show TargetImplementation;
-
 import 'package:front_end/src/fasta/source/source_class_builder.dart'
     show SourceClassBuilder;
 
 import 'package:front_end/src/fasta/source/source_loader.dart'
     show SourceLoader;
 
-import 'analyzer_diet_listener.dart' show AnalyzerDietListener;
+import 'package:front_end/src/fasta/target_implementation.dart'
+    show TargetImplementation;
 
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/src/incremental_class_hierarchy.dart';
+import 'analyzer_diet_listener.dart' show AnalyzerDietListener;
 
 class AnalyzerLoader<L> extends SourceLoader<L> {
   AnalyzerLoader(TargetImplementation target)
       : super(StandardFileSystem.instance, false, target);
 
   @override
-  void computeHierarchy(Program program) {
-    ticker.logMs("Built analyzer element model.");
-    hierarchy = new IncrementalClassHierarchy();
-    ticker.logMs("Computed class hierarchy");
-    coreTypes = new CoreTypes(program);
-    ticker.logMs("Computed core types");
-  }
-
-  @override
   AnalyzerDietListener createDietListener(LibraryBuilder library) {
     return new AnalyzerDietListener(
         library, hierarchy, coreTypes, typeInferenceEngine);
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 21ea7b3..00f49bf 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -189,7 +189,7 @@
   static Future<FastaContext> create(
       Chain suite, Map<String, String> environment) async {
     Uri sdk = Uri.base.resolve("sdk/");
-    Uri vm = Uri.base.resolve(Platform.resolvedExecutable);
+    Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
     Uri packages = Uri.base.resolve(".packages");
     var options = new ProcessedOptions(new CompilerOptions()
       ..sdkRoot = sdk
diff --git a/pkg/front_end/test/fasta/tool_test.dart b/pkg/front_end/test/fasta/tool_test.dart
index 070a301..494cde9 100644
--- a/pkg/front_end/test/fasta/tool_test.dart
+++ b/pkg/front_end/test/fasta/tool_test.dart
@@ -144,10 +144,17 @@
 
   for (String subtool in testedSubtools) {
     print("Testing $subtool");
-    ProcessResult result =
-        Process.runSync("/bin/bash", <String>[toolPath, subtool]);
+    ProcessResult result = Process.runSync(
+        "/bin/bash", <String>[toolPath, subtool],
+        environment: <String, String>{"DART_VM": Platform.resolvedExecutable});
     Map expectation = expectations.remove(subtool);
-    Expect.equals(expectation["exitCode"], result.exitCode);
+    String combinedOutput = """
+stdout:
+${result.stdout}
+stderr:
+${result.stderr}
+""";
+    Expect.equals(expectation["exitCode"], result.exitCode, combinedOutput);
 
     switch (subtool) {
       case "scanner":
diff --git a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
index ef4fd1a..eede59b 100644
--- a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
@@ -8,7 +8,6 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:kernel/testing/mock_sdk_program.dart';
 import 'package:kernel/type_algebra.dart';
 import 'package:test/test.dart';
@@ -22,23 +21,38 @@
 
 @reflectiveTest
 class InterfaceResolverTest {
-  final testLib =
-      new Library(Uri.parse('org-dartlang:///test.dart'), name: 'lib');
+  final Library testLib;
 
-  Program program;
+  final Program program;
 
-  CoreTypes coreTypes;
+  final CoreTypes coreTypes;
 
-  ClassHierarchy classHierarchy;
+  ClassHierarchy cachedClassHierarchy;
 
-  TypeSchemaEnvironment typeEnvironment;
+  TypeSchemaEnvironment cachedTypeEnvironment;
 
-  InterfaceResolver interfaceResolver;
+  InterfaceResolver cachedInterfaceResolver;
 
-  InterfaceResolverTest() {
-    program = createMockSdkProgram();
-    program.libraries.add(testLib..parent = program);
-    resetInterfaceResolver();
+  InterfaceResolverTest()
+      : this._(new Library(Uri.parse('org-dartlang:///test.dart'), name: 'lib'),
+            createMockSdkProgram());
+
+  InterfaceResolverTest._(this.testLib, Program program)
+      : program = program..libraries.add(testLib..parent = program),
+        coreTypes = new CoreTypes(program);
+
+  ClassHierarchy get classHierarchy {
+    return cachedClassHierarchy ??= new ClassHierarchy(program);
+  }
+
+  TypeSchemaEnvironment get typeEnvironment {
+    return cachedTypeEnvironment ??=
+        new TypeSchemaEnvironment(coreTypes, classHierarchy, true);
+  }
+
+  InterfaceResolver get interfaceResolver {
+    return cachedInterfaceResolver ??=
+        new InterfaceResolver(null, typeEnvironment, null, true);
   }
 
   InterfaceType get intType => coreTypes.intClass.rawType;
@@ -70,8 +84,7 @@
       expect(interfaceMember, same(member));
     }
 
-    check(new ClosedWorldClassHierarchy(program));
-    check(new IncrementalClassHierarchy());
+    check(new ClassHierarchy(program));
   }
 
   Procedure getCandidate(Class class_, bool setter) {
@@ -125,6 +138,7 @@
       List<Supertype> implementedTypes,
       List<Procedure> procedures,
       List<Field> fields}) {
+    resetInterfaceResolver();
     var class_ = new ShadowClass(
         name: name ?? 'C',
         supertype: supertype ?? objectClass.asThisSupertype,
@@ -197,12 +211,9 @@
   }
 
   void resetInterfaceResolver() {
-    classHierarchy = new IncrementalClassHierarchy();
-    coreTypes = new CoreTypes(program);
-    typeEnvironment =
-        new TypeSchemaEnvironment(coreTypes, classHierarchy, true);
-    interfaceResolver =
-        new InterfaceResolver(null, typeEnvironment, null, true);
+    cachedClassHierarchy = null;
+    cachedTypeEnvironment = null;
+    cachedInterfaceResolver = null;
   }
 
   void test_candidate_for_field_getter() {
@@ -729,7 +740,7 @@
     expect(y.isGenericCovariantImpl, isFalse);
     expect(y.isGenericCovariantInterface, isFalse);
     expect(y.isCovariant, isTrue);
-    expect(ForwardingStub.getInterfaceTarget(stub), same(methodA));
+    expect(stub.forwardingStubInterfaceTarget.node, same(methodA));
     expect(getStubTarget(stub), same(methodA));
   }
 
@@ -777,7 +788,7 @@
     expect(y.isGenericCovariantImpl, isTrue);
     expect(y.isGenericCovariantInterface, isFalse);
     expect(y.isCovariant, isFalse);
-    expect(ForwardingStub.getInterfaceTarget(stub), same(methodA));
+    expect(stub.forwardingStubInterfaceTarget.node, same(methodA));
     expect(getStubTarget(stub), same(methodA));
   }
 
@@ -822,7 +833,7 @@
     ]);
     var nodeE = getForwardingNode(e, false);
     var stub = nodeE.finalize();
-    expect(ForwardingStub.getInterfaceTarget(stub), same(methodC));
+    expect(stub.forwardingStubInterfaceTarget.node, same(methodC));
     expect(getStubTarget(stub), same(methodC));
   }
 
@@ -855,7 +866,7 @@
         implementedTypes: [i2.asThisSupertype]);
     var nodeE = getForwardingNode(e, true);
     var stub = nodeE.finalize();
-    expect(ForwardingStub.getInterfaceTarget(stub), same(setterC));
+    expect(stub.forwardingStubInterfaceTarget.node, same(setterC));
     expect(getStubTarget(stub), same(setterC));
   }
 
@@ -870,7 +881,7 @@
         implementedTypes: [b.asThisSupertype]);
     var node = getForwardingNode(c, false);
     var stub = node.finalize();
-    expect(ForwardingStub.getInterfaceTarget(stub), same(fieldB));
+    expect(stub.forwardingStubInterfaceTarget.node, same(fieldB));
   }
 
   void test_merge_candidates_including_mixin() {
@@ -965,7 +976,7 @@
         name: 'C', implementedTypes: [a.asThisSupertype, b.asThisSupertype]);
     var node = getForwardingNode(c, false);
     var stub = node.finalize();
-    expect(ForwardingStub.getInterfaceTarget(stub), same(methodB));
+    expect(stub.forwardingStubInterfaceTarget.node, same(methodB));
     expect(getStubTarget(stub), isNull);
     expect(stub.function.returnType, intType);
   }
@@ -984,7 +995,7 @@
     ]);
     var node = getForwardingNode(d, true);
     var stub = node.finalize();
-    expect(ForwardingStub.getInterfaceTarget(stub), same(setterB));
+    expect(stub.forwardingStubInterfaceTarget.node, same(setterB));
     expect(getStubTarget(stub), isNull);
     expect(stub.function.positionalParameters[0].type, objectType);
   }
@@ -1017,11 +1028,11 @@
     var resolvedMethod = node.finalize();
     expect(resolvedMethod, same(methodC));
     expect(methodC.function.body, isNotNull);
-    expect(methodC, isNot(new isInstanceOf<ForwardingStub>()));
+    expect(methodC.forwardingStubInterfaceTarget, isNull);
     expect(getStubTarget(methodC), same(methodA));
   }
 
-  void test_resolve_with_subsitutions() {
+  void test_resolve_with_substitutions() {
     var typeParamA = new TypeParameter('T', objectType);
     var typeParamB = new TypeParameter('T', objectType);
     var typeParamC = new TypeParameter('T', objectType);
@@ -1046,7 +1057,7 @@
         ]);
     var node = getForwardingNode(d, false);
     var stub = node.finalize();
-    expect(ForwardingStub.getInterfaceTarget(stub), same(methodB));
+    expect(stub.forwardingStubInterfaceTarget.node, same(methodB));
     expect(getStubTarget(stub), isNull);
     expect(stub.function.returnType, intType);
   }
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
index 4011bfc..d51d345 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
@@ -7,7 +7,7 @@
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/testing/mock_sdk_program.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -209,8 +209,8 @@
 
   void _checkConstraints(
       DartType a, DartType b, List<String> expectedConstraints) {
-    var typeSchemaEnvironment = new TypeSchemaEnvironment(
-        coreTypes, new IncrementalClassHierarchy(), true);
+    var typeSchemaEnvironment =
+        new TypeSchemaEnvironment(coreTypes, new ClassHierarchy(program), true);
     var typeConstraintGatherer = new TypeConstraintGatherer(
         typeSchemaEnvironment, [T1.parameter, T2.parameter]);
     var constraints = typeConstraintGatherer.trySubtypeMatch(a, b)
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index 80eaee2..a8335b2 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -6,7 +6,7 @@
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/testing/mock_sdk_program.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -714,7 +714,7 @@
 
   TypeSchemaEnvironment _makeEnv() {
     return new TypeSchemaEnvironment(
-        coreTypes, new IncrementalClassHierarchy(), true);
+        coreTypes, new ClassHierarchy(program), true);
   }
 
   DartType _map(DartType key, DartType value) =>
diff --git a/pkg/front_end/test/incremental_kernel_generator_test.dart b/pkg/front_end/test/incremental_kernel_generator_test.dart
deleted file mode 100644
index 174b9d2..0000000
--- a/pkg/front_end/test/incremental_kernel_generator_test.dart
+++ /dev/null
@@ -1,1336 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-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/incremental_kernel_generator.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart';
-import 'package:front_end/src/incremental_kernel_generator_impl.dart';
-import 'package:front_end/src/api_prototype/summary_generator.dart';
-import 'package:kernel/ast.dart';
-import 'package:kernel/text/ast_to_text.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'src/incremental/mock_sdk.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(IncrementalKernelGeneratorTest);
-  });
-}
-
-@reflectiveTest
-class IncrementalKernelGeneratorTest {
-  /// Virtual filesystem for testing.
-  final fileSystem = new MemoryFileSystem(Uri.parse('org-dartlang-test:///'));
-
-  /// The used file watcher.
-  WatchUsedFilesFn watchFn = (uri, used) {};
-
-  /// The object under test.
-  IncrementalKernelGeneratorImpl generator;
-
-  /// Compute the initial [Program] for the given [entryPoint].
-  Future<DeltaProgram> getInitialState(Uri entryPoint,
-      {Uri sdkOutlineUri,
-      bool setPackages: true,
-      bool embedSourceText: true,
-      String initialState,
-      ByteStore byteStore}) async {
-    createSdkFiles(fileSystem);
-    // TODO(scheglov) Builder the SDK kernel and set it into the options.
-
-    var compilerOptions = new CompilerOptions()
-      ..fileSystem = fileSystem
-      ..byteStore = byteStore ?? new MemoryByteStore()
-//      ..logger = new PerformanceLog(stdout)
-      ..strongMode = true
-      ..chaseDependencies = true
-      ..librariesSpecificationUri =
-          Uri.parse('org-dartlang-test:///sdk/lib/libraries.json')
-      ..sdkSummary = sdkOutlineUri
-      ..embedSourceText = embedSourceText;
-
-    if (setPackages) {
-      compilerOptions.packagesFileUri =
-          Uri.parse('org-dartlang-test:///test/.packages');
-    }
-
-    generator = await IncrementalKernelGenerator
-        .newInstance(compilerOptions, entryPoint, watch: watchFn);
-
-    if (initialState != null) {
-      generator.setState(initialState);
-    }
-
-    return await generator.computeDelta();
-  }
-
-  test_acceptLastDelta() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, '');
-
-    await getInitialState(uri);
-    generator.acceptLastDelta();
-
-    // Attempt to accept the second time.
-    _assertStateError(() {
-      generator.acceptLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_NO_LAST_DELTA);
-  }
-
-  test_computeDelta_chain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var b = a;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b;
-void main() {}
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::int c2 = b::b;
-static method main() → void {}
-''');
-      // The main method is set.
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod.enclosingLibrary.fileUri, cUri);
-    }
-
-    // Update b.dart and recompile c.dart
-    writeFile(bPath, r'''
-import 'a.dart';
-var b = 1.2;
-''');
-    generator.invalidate(bUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program,
-          includes: [bUri, cUri], excludes: [aUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::double c2 = b::b;
-static method main() → void {}
-''');
-      // The main method is set even though not the entry point is updated.
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod.enclosingLibrary.fileUri, cUri);
-    }
-  }
-
-  test_computeDelta_cycle() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import 'c.dart';
-var b1 = c1;
-var b2 = c2;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b1;
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      // b.dart and c.dart form a cycle.
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::int c2 = b::b1;
-''');
-    }
-
-    // Update a.dart and recompile c.dart
-    writeFile(aPath, r'''
-var a = 1.2;
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri], excludes: [Uri.parse('dart:core')]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::double c1 = a::a;
-static field core::double c2 = b::b1;
-''');
-    }
-  }
-
-  test_computeDelta_export() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    writeFile(aPath, 'class A {}');
-    Uri bUri = writeFile(bPath, 'export "a.dart";');
-    Uri cUri = writeFile(cPath, 'export "b.dart";');
-
-    DeltaProgram delta = await getInitialState(cUri);
-    generator.acceptLastDelta();
-    Program program = delta.newProgram;
-    expect(_getLibraryText(_getLibrary(program, bUri)), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-additionalExports = (a::A)
-
-''');
-    expect(_getLibraryText(_getLibrary(program, cUri)), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-additionalExports = (a::A)
-
-''');
-  }
-
-  test_computeDelta_export_cycle() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    writeFile(aPath, 'export "b.dart"; class A {}');
-    writeFile(bPath, 'export "a.dart"; class B {}');
-    Uri cUri = writeFile(cPath, r'''
-import 'b.dart';
-A a;
-B b;
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field a::A a;
-static field b::B b;
-''');
-    }
-
-    // Update c.dart and compile.
-    writeFile(cPath, r'''
-import 'b.dart';
-A a;
-B b;
-int c;
-''');
-    generator.invalidate(cUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertCompiledUris([cUri]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-import "./b.dart" as b;
-import "dart:core" as core;
-
-static field a::A a;
-static field b::B b;
-static field core::int c;
-''');
-    }
-  }
-
-  test_computeDelta_hasAnotherRunning() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, '');
-
-    await getInitialState(uri);
-    generator.acceptLastDelta();
-
-    // Run, but don't wait.
-    var future = generator.computeDelta();
-
-    // acceptLastDelta() is failing while the future is pending.
-    _assertStateError(() {
-      generator.acceptLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_PENDING_COMPUTE);
-
-    // rejectLastDelta() is failing while the future is pending.
-    _assertStateError(() {
-      generator.rejectLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_PENDING_COMPUTE);
-
-    // Run another, this causes StateError.
-    _assertStateError(() {
-      generator.computeDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_PENDING_COMPUTE);
-
-    // Wait for the pending future.
-    await future;
-  }
-
-  test_computeDelta_includePathToMain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    String dPath = '/test/lib/d.dart';
-
-    // A --> B -> C
-    //   \-> D
-
-    Uri aUri = writeFile(aPath, r'''
-import 'b.dart';
-import 'd.dart';
-main() {
-  b();
-  d();
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'c.dart';
-b() {
-  c();
-}
-''');
-    Uri cUri = writeFile(cPath, 'c() { print(0); }');
-    Uri dUri = writeFile(dPath, 'd() {}');
-
-    {
-      DeltaProgram delta = await getInitialState(aUri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri, dUri, Uri.parse('dart:core')]);
-    }
-
-    // Update c.dart and compute the delta.
-    // It should include the changed c.dart, plus b.dart and a.dart because VM
-    // requires this (because of possible inlining). But d.dart is not on the
-    // path from main() to the changed c.dart, so it is not included.
-    writeFile(cPath, 'c() { print(1); }');
-    generator.invalidate(cUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri],
-          excludes: [dUri, Uri.parse('dart:core')]);
-      // While a.dart and b.dart are is included (VM needs them), they were not
-      // recompiled, because the change to c.dart was in the function body.
-      _assertCompiledUris([cUri]);
-    }
-  }
-
-  test_computeDelta_parts() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-library lib;
-part 'b.dart';
-''');
-    Uri bUri = writeFile(bPath, r'''
-part of lib;
-''');
-
-    DeltaProgram delta = await getInitialState(aUri);
-    Program program = delta.newProgram;
-
-    // Sources for library and its part must be present.
-    expect(program.uriToSource.keys, contains(aUri));
-    expect(program.uriToSource.keys, contains(bUri));
-  }
-
-  test_computeDelta_updateBody() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-int foo() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var f = foo;
-main() {}
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(bUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 1;
-}
-''');
-      // b.dart uses references to a.dart nodes.
-      expect((bLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-      // main() is set
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod, _getMainProcedure(bLibrary));
-    }
-
-    // Update a.dart and recompile b.dart
-    writeFile(aPath, r'''
-int foo() {
-  return 2;
-}
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      _assertCompiledUris([aUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 2;
-}
-''');
-      // b.dart uses references to the new a.dart nodes.
-      expect((bLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-      // main() is set
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod, _getMainProcedure(bLibrary));
-    }
-
-    // Update a.dart and recompile b.dart
-    writeFile(aPath, r'''
-int foo() {
-  return 3;
-}
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      _assertCompiledUris([aUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 3;
-}
-''');
-      // b.dart uses references to the new a.dart nodes.
-      expect((bLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-    }
-  }
-
-  test_computeDelta_updateBody2() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, r'''
-int foo() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-int bar() {
-  return 2;
-}
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var f1 = foo;
-var f2 = bar;
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri, cUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      Library cLibrary = _getLibrary(program, cUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 1;
-}
-''');
-      expect(_getLibraryText(bLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bar() → core::int {
-  return 2;
-}
-''');
-      // c.dart uses references to a.dart and b.dart nodes.
-      expect((cLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-      expect((cLibrary.fields[1].initializer as StaticGet).targetReference,
-          same(bLibrary.procedures[0].reference));
-    }
-
-    // Update a.dart and b.dart, and recompile c.dart
-    writeFile(aPath, r'''
-int foo() {
-  return 3;
-}
-''');
-    writeFile(bPath, r'''
-int bar() {
-  return 4;
-}
-''');
-    generator.invalidate(aUri);
-    generator.invalidate(bUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      _assertCompiledUris([aUri, bUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri, cUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      Library cLibrary = _getLibrary(program, cUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 3;
-}
-''');
-      expect(_getLibraryText(bLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bar() → core::int {
-  return 4;
-}
-''');
-      // c.dart uses references to the new a.dart and b.dart nodes.
-      expect((cLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-      expect((cLibrary.fields[1].initializer as StaticGet).targetReference,
-          same(bLibrary.procedures[0].reference));
-    }
-  }
-
-  test_computeDelta_updateBody_exportCycle() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, r'''
-export 'b.dart';
-int foo() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-export 'a.dart';
-int bar() {
-  return 1;
-}
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-var f = foo;
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri, cUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      Library cLibrary = _getLibrary(program, cUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./b.dart" as b;
-additionalExports = (b::bar)
-
-static method foo() → core::int {
-  return 1;
-}
-''');
-      // b.dart and c.dart reference "foo" from a.dart
-      var fooReference = aLibrary.procedures[0].reference;
-      expect(bLibrary.additionalExports, contains(fooReference));
-      expect((cLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(fooReference));
-    }
-
-    // Update a.dart and recompile b.dart
-    writeFile(aPath, r'''
-export 'b.dart';
-int foo() {
-  return 2;
-}
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      _assertCompiledUris([aUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri, cUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      Library cLibrary = _getLibrary(program, cUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./b.dart" as b;
-additionalExports = (b::bar)
-
-static method foo() → core::int {
-  return 2;
-}
-''');
-      // b.dart and c.dart reference "foo" from a.dart
-      var fooReference = aLibrary.procedures[0].reference;
-      expect(bLibrary.additionalExports, contains(fooReference));
-      expect((cLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(fooReference));
-    }
-  }
-
-  test_computeDelta_updateBody_hasMain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    Uri aUri = writeFile(aPath, r'''
-int foo() {
-  return 1;
-}
-main() {}
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(aUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, aUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      // main() is set
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod.enclosingLibrary, aLibrary);
-    }
-
-    // Recompile the library with main()
-    writeFile(aPath, r'''
-int foo() {
-  return 2;
-}
-main() {}
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      _assertCompiledUris([aUri]);
-      Program program = delta.newProgram;
-      Library aLibrary = _getLibrary(program, aUri);
-      // main() is set
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod.enclosingLibrary, aLibrary);
-    }
-  }
-
-  test_computeDelta_updateBody_part() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, r'''
-library lib;
-part 'b.dart';
-int foo() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-part of lib;
-int bar() {
-  return 2;
-}
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-var f1 = foo;
-var f2 = bar;
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, cUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library cLibrary = _getLibrary(program, cUri);
-      expect(_getLibraryText(aLibrary), r'''
-library lib;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 1;
-}
-static method /* from org-dartlang-test:///test/lib/b.dart */ bar() → core::int {
-  return 2;
-}
-''');
-      // b.dart uses references to a.dart nodes.
-      expect((cLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-      expect((cLibrary.fields[1].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[1].reference));
-    }
-
-    // Update b.dart and recompile.
-    writeFile(bPath, r'''
-part of lib;
-int bar() {
-  return 3;
-}
-''');
-    generator.invalidate(bUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      _assertCompiledUris([aUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, cUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library cLibrary = _getLibrary(program, cUri);
-      expect(_getLibraryText(aLibrary), r'''
-library lib;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 1;
-}
-static method /* from org-dartlang-test:///test/lib/b.dart */ bar() → core::int {
-  return 3;
-}
-''');
-      // b.dart uses references to the new a.dart nodes.
-      expect((cLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-      expect((cLibrary.fields[1].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[1].reference));
-    }
-  }
-
-  test_computeDelta_updateBody_updateApi() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-int foo() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var f = foo;
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(bUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 1;
-}
-''');
-      // b.dart uses references to a.dart nodes.
-      expect((bLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-    }
-
-    // Update a body in a.dart and compile it.
-    writeFile(aPath, r'''
-int foo() {
-  return 2;
-}
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      _assertCompiledUris([aUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 2;
-}
-''');
-      // b.dart uses references to the new a.dart nodes.
-      expect((bLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-    }
-
-    // Compile a.dart and b.dart
-    writeFile(aPath, r'''
-int foo() {
-  return 2;
-}
-int bar() {
-  return 3;
-}
-''');
-    generator.invalidate(aUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      _assertCompiledUris([aUri, bUri]);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [aUri, bUri]);
-      Library aLibrary = _getLibrary(program, aUri);
-      Library bLibrary = _getLibrary(program, bUri);
-      expect(_getLibraryText(aLibrary), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → core::int {
-  return 2;
-}
-static method bar() → core::int {
-  return 3;
-}
-''');
-      // b.dart uses references to the new a.dart nodes.
-      expect((bLibrary.fields[0].initializer as StaticGet).targetReference,
-          same(aLibrary.procedures[0].reference));
-    }
-  }
-
-  test_computeDelta_useSdkOutline() async {
-    createSdkFiles(fileSystem);
-    List<int> sdkOutlineBytes = await _computeSdkOutlineBytes();
-
-    Uri sdkOutlineUri = Uri.parse('org-dartlang-test:///sdk/outline.dill');
-    fileSystem.entityForUri(sdkOutlineUri).writeAsBytesSync(sdkOutlineBytes);
-
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-int getValue() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'dart:async';
-import 'a.dart';
-
-var a = 1;
-Future<String> b;
-''');
-
-    DeltaProgram delta =
-        await getInitialState(bUri, sdkOutlineUri: sdkOutlineUri);
-    Program program = delta.newProgram;
-    generator.acceptLastDelta();
-    _assertLibraryUris(program,
-        includes: [bUri], excludes: [Uri.parse('dart:core')]);
-
-    Library library = _getLibrary(program, bUri);
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-static field core::int a = 1;
-static field asy::Future<core::String> b;
-''');
-
-    // Update a.dart and recompile.
-    writeFile(aPath, r'''
-int getValue() {
-  return 2;
-}
-''');
-    generator.invalidate(aUri);
-    var deltaProgram = await generator.computeDelta();
-
-    // Check that the canonical names for SDK libraries are serializable.
-    serializeProgram(deltaProgram.newProgram,
-        filter: (library) => !library.importUri.isScheme('dart'));
-  }
-
-  test_embedSourceText_false() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, 'main() {}');
-
-    DeltaProgram delta = await getInitialState(uri, embedSourceText: false);
-    Program program = delta.newProgram;
-
-    // The Source object is present in the map, but is empty.
-    Source source = program.uriToSource[uri];
-    expect(source, isNotNull);
-    expect(source.source, isEmpty);
-  }
-
-  test_inferPackagesFile() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import "package:test/a.dart";
-var b = a;
-''');
-
-    // Ensures that the `.packages` file can be discovered automatically
-    // from the entry point file.
-    DeltaProgram delta = await getInitialState(bUri, setPackages: false);
-    Program program = delta.newProgram;
-    Library library = _getLibrary(program, bUri);
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "package:test/a.dart" as a;
-
-static field core::int b = a::a;
-''');
-  }
-
-  test_rejectLastDelta() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, 'var v = 1;');
-
-    // The first delta includes the library.
-    {
-      DeltaProgram delta = await getInitialState(uri);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), contains('core::int v = 1'));
-    }
-
-    // Reject the last delta, so the test library is included again.
-    generator.rejectLastDelta();
-    {
-      var delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-    }
-
-    // Attempt to reject the last delta twice.
-    generator.rejectLastDelta();
-    _assertStateError(() {
-      generator.rejectLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_NO_LAST_DELTA);
-  }
-
-  test_reset() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, 'var v = 1;');
-
-    // The first delta includes the the library.
-    {
-      DeltaProgram delta = await getInitialState(uri);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), contains('core::int v = 1'));
-    }
-
-    // Accept the last delta, the new delta is empty.
-    generator.acceptLastDelta();
-    {
-      var delta = await generator.computeDelta();
-      expect(delta.newProgram.libraries, isEmpty);
-    }
-
-    // Reset the generator, so it will resend the whole program.
-    generator.reset();
-    {
-      var delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-    }
-  }
-
-  test_setState() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-var b = 1;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b;
-''');
-
-    String initialState;
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      initialState = delta.state;
-    }
-
-    // Update a.dart, don't notify the old generator - we throw it away.
-    writeFile(aPath, 'var a = 1.2');
-
-    // Create a new generator with the initial state.
-    var delta = await getInitialState(cUri, initialState: initialState);
-
-    // Only a.dart and c.dart are in the delta.
-    // The state of b.dart is the same as in the initial state.
-    _assertLibraryUris(delta.newProgram,
-        includes: [aUri, cUri], excludes: [bUri, Uri.parse('dart:core')]);
-  }
-
-  test_updateEntryPoint() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, r'''
-main() {
-  var v = 1;
-}
-''');
-
-    String initialText = r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::int v = 1;
-}
-''';
-
-    // Compute the initial state.
-    {
-      DeltaProgram delta = await getInitialState(uri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), initialText);
-    }
-
-    // Update the entry point library.
-    writeFile(path, r'''
-main() {
-  var v = 2.3;
-}
-''');
-
-    // We have not invalidated the file, so the delta is empty.
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      expect(delta.newProgram.libraries, isEmpty);
-    }
-
-    // Invalidate the file, so get the new text.
-    generator.invalidate(uri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::double v = 2.3;
-}
-''');
-    }
-  }
-
-  test_watch() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, '');
-    Uri bUri = writeFile(bPath, '');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-''');
-
-    var usedFiles = <Uri>[];
-    var unusedFiles = <Uri>[];
-    watchFn = (Uri uri, bool used) {
-      if (used) {
-        usedFiles.add(uri);
-      } else {
-        unusedFiles.add(uri);
-      }
-      return new Future.value();
-    };
-
-    {
-      await getInitialState(cUri);
-      generator.acceptLastDelta();
-      // We use at least c.dart and a.dart now.
-      expect(usedFiles, contains(cUri));
-      expect(usedFiles, contains(aUri));
-      usedFiles.clear();
-      expect(unusedFiles, isEmpty);
-    }
-
-    // Update c.dart to reference also b.dart file.
-    writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-''');
-    generator.invalidate(cUri);
-    {
-      await generator.computeDelta();
-      generator.acceptLastDelta();
-      // The only new file is b.dart now.
-      expect(usedFiles, [bUri]);
-      usedFiles.clear();
-      expect(unusedFiles, isEmpty);
-    }
-
-    // Update c.dart to stop referencing b.dart file.
-    writeFile(cPath, r'''
-import 'a.dart';
-''');
-    generator.invalidate(cUri);
-    {
-      await generator.computeDelta();
-      generator.acceptLastDelta();
-      // No new used files.
-      expect(usedFiles, isEmpty);
-      // The file b.dart is not used anymore.
-      expect(unusedFiles, [bUri]);
-      unusedFiles.clear();
-    }
-  }
-
-  test_watch_null() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, "");
-    Uri bUri = writeFile(bPath, "");
-
-    // Set null, as if the watch function is not provided.
-    watchFn = null;
-
-    await getInitialState(bUri);
-    generator.acceptLastDelta();
-
-    // Update b.dart to import a.dart file.
-    writeFile(bPath, "import 'a.dart';");
-    generator.invalidate(bUri);
-    await generator.computeDelta();
-
-    // No exception even though the watcher function is null.
-  }
-
-  /// Write the given [text] of the file with the given [path] into the
-  /// virtual filesystem.  Return the URI of the file.
-  Uri writeFile(String path, String text) {
-    Uri uri = Uri.parse('org-dartlang-test://$path');
-    fileSystem.entityForUri(uri).writeAsStringSync(text);
-    return uri;
-  }
-
-  /// Write the given file contents to the virtual filesystem.
-  void writeFiles(Map<String, String> contents) {
-    contents.forEach(writeFile);
-  }
-
-  void _assertCompiledUris(Iterable<Uri> expected) {
-    Set<Uri> compiledUris = generator.test.compiledUris;
-    expect(compiledUris, unorderedEquals(expected));
-  }
-
-  void _assertLibraryUris(Program program,
-      {List<Uri> includes: const [], List<Uri> excludes: const []}) {
-    List<Uri> libraryUris =
-        program.libraries.map((library) => library.importUri).toList();
-    for (var shouldInclude in includes) {
-      expect(libraryUris, contains(shouldInclude));
-      var shouldIncludeFileUri = _resolveUriToFileUri(shouldInclude);
-      expect(program.uriToSource.keys, contains(shouldIncludeFileUri));
-    }
-    for (var shouldExclude in excludes) {
-      expect(libraryUris, isNot(contains(shouldExclude)));
-      var shouldExcludeFileUri = _resolveUriToFileUri(shouldExclude);
-      expect(program.uriToSource.keys, isNot(contains(shouldExcludeFileUri)));
-    }
-  }
-
-  /// Assert that invocation of [f] throws a [StateError] with the given [msg].
-  void _assertStateError(f(), String msg) {
-    try {
-      f();
-      fail('StateError expected.');
-    } on StateError catch (e) {
-      expect(e.message, msg);
-    }
-  }
-
-  Future<List<int>> _computeSdkOutlineBytes() async {
-    var options = new CompilerOptions()
-      ..fileSystem = fileSystem
-      ..sdkRoot = Uri.parse('org-dartlang-test:///sdk/')
-      ..compileSdk = true
-      ..chaseDependencies = true
-      ..strongMode = true;
-    var inputs = [Uri.parse('dart:core')];
-    return summaryFor(inputs, options);
-  }
-
-  Library _getLibrary(Program program, Uri uri) {
-    for (var library in program.libraries) {
-      if (library.importUri == uri) return library;
-    }
-    throw fail('No library found with URI "$uri"');
-  }
-
-  String _getLibraryText(Library library) {
-    StringBuffer buffer = new StringBuffer();
-    new Printer(buffer, syntheticNames: new NameSystem())
-        .writeLibraryFile(library);
-    return buffer.toString();
-  }
-
-  /// Resolve the given `dart` or `package` [inputUri] into the corresponding
-  /// file URI, or return the same URI if it is already a file URI.
-  Uri _resolveUriToFileUri(Uri inputUri) {
-    var translator = generator.uriTranslator;
-    var outputUri = translator.translate(inputUri) ?? inputUri;
-    return outputUri;
-  }
-
-  static Procedure _getMainProcedure(Library library) => library.procedures
-      .singleWhere((procedure) => procedure.name.name == 'main');
-}
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index f478b62..ee8b9a0 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -2,15 +2,41 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/fasta/fasta_codes.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart';
+import 'package:kernel/ast.dart'
+    show EmptyStatement, Program, ReturnStatement, StaticInvocation;
+
+import 'package:test/test.dart'
+    show
+        contains,
+        expect,
+        greaterThan,
+        group,
+        isEmpty,
+        isFalse,
+        isNotEmpty,
+        isNotNull,
+        isNull,
+        isTrue,
+        same,
+        test;
+
+import 'package:front_end/src/api_prototype/front_end.dart'
+    show CompilerOptions;
+
 import 'package:front_end/src/fasta/deprecated_problems.dart'
     show deprecated_InputError;
-import 'package:front_end/src/testing/compiler_common.dart';
-import 'package:kernel/ast.dart';
 
-import 'package:test/test.dart';
+import 'package:front_end/src/fasta/fasta_codes.dart' show messageMissingMain;
+
+import 'package:front_end/src/fasta/kernel/utils.dart' show serializeProgram;
+
+import 'package:front_end/src/testing/compiler_common.dart'
+    show
+        compileScript,
+        compileUnit,
+        findLibrary,
+        invalidCoreLibsSpecUri,
+        isDartCoreLibrary;
 
 main() {
   group('kernelForProgram', () {
diff --git a/pkg/front_end/test/minimal_incremental_kernel_generator_test.dart b/pkg/front_end/test/minimal_incremental_kernel_generator_test.dart
deleted file mode 100644
index da533ed..0000000
--- a/pkg/front_end/test/minimal_incremental_kernel_generator_test.dart
+++ /dev/null
@@ -1,698 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-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/incremental_kernel_generator.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart';
-import 'package:front_end/src/incremental_kernel_generator_impl.dart';
-import 'package:front_end/src/minimal_incremental_kernel_generator.dart';
-import 'package:front_end/src/api_prototype/summary_generator.dart';
-import 'package:kernel/ast.dart';
-import 'package:kernel/text/ast_to_text.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'src/incremental/mock_sdk.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(IncrementalKernelGeneratorTest);
-  });
-}
-
-@reflectiveTest
-class IncrementalKernelGeneratorTest {
-  /// Virtual filesystem for testing.
-  final fileSystem = new MemoryFileSystem(Uri.parse('org-dartlang-test:///'));
-
-  /// The used file watcher.
-  WatchUsedFilesFn watchFn = (uri, used) {};
-
-  /// The object under test.
-  MinimalIncrementalKernelGenerator generator;
-
-  /// Compute the initial [Program] for the given [entryPoint].
-  Future<DeltaProgram> getInitialState(Uri entryPoint,
-      {Uri sdkOutlineUri,
-      bool setPackages: true,
-      bool embedSourceText: true,
-      String initialState,
-      ByteStore byteStore}) async {
-    createSdkFiles(fileSystem);
-
-    var compilerOptions = new CompilerOptions()
-      ..fileSystem = fileSystem
-      ..byteStore = byteStore ?? new MemoryByteStore()
-//      ..logger = new PerformanceLog(stdout)
-      ..strongMode = true
-      ..chaseDependencies = true
-      ..librariesSpecificationUri =
-          Uri.parse('org-dartlang-test:///sdk/lib/libraries.json')
-      ..sdkSummary = sdkOutlineUri
-      ..embedSourceText = embedSourceText;
-
-    if (setPackages) {
-      compilerOptions.packagesFileUri =
-          Uri.parse('org-dartlang-test:///test/.packages');
-    }
-
-    generator = await IncrementalKernelGenerator.newInstance(
-        compilerOptions, entryPoint,
-        watch: watchFn, useMinimalGenerator: true);
-
-    if (initialState != null) {
-      generator.setState(initialState);
-    }
-
-    return await generator.computeDelta();
-  }
-
-  test_acceptLastDelta() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, '');
-
-    await getInitialState(uri);
-    generator.acceptLastDelta();
-
-    // Attempt to accept the second time.
-    _assertStateError(() {
-      generator.acceptLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_NO_LAST_DELTA);
-  }
-
-  test_compile_chain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var b = a;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b;
-void main() {}
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::int c2 = b::b;
-static method main() → void {}
-''');
-      // The main method is set.
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod.enclosingLibrary.fileUri, cUri);
-    }
-
-    // Update b.dart and recompile c.dart
-    writeFile(bPath, r'''
-import 'a.dart';
-var b = 1.2;
-''');
-    generator.invalidate(bUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program,
-          includes: [bUri, cUri], excludes: [aUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(program, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::double c2 = b::b;
-static method main() → void {}
-''');
-      // The main method is set even though not the entry point is updated.
-      expect(program.mainMethod, isNotNull);
-      expect(program.mainMethod.enclosingLibrary.fileUri, cUri);
-    }
-  }
-
-  test_compile_includePathToMain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    String dPath = '/test/lib/d.dart';
-
-    // A --> B -> C
-    //   \-> D
-
-    Uri aUri = writeFile(aPath, r'''
-import 'b.dart';
-import 'd.dart';
-main() {
-  b();
-  d();
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'c.dart';
-b() {
-  c();
-}
-''');
-    Uri cUri = writeFile(cPath, 'c() { print(0); }');
-    Uri dUri = writeFile(dPath, 'd() {}');
-
-    {
-      DeltaProgram delta = await getInitialState(aUri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri, dUri, Uri.parse('dart:core')]);
-    }
-
-    // Update c.dart and compute the delta.
-    // It should include the changed c.dart, plus b.dart and a.dart because VM
-    // requires this (because of possible inlining). But d.dart is not on the
-    // path from main() to the changed c.dart, so it is not included.
-    writeFile(cPath, 'c() { print(1); }');
-    generator.invalidate(cUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program,
-          includes: [aUri, bUri, cUri],
-          excludes: [dUri, Uri.parse('dart:core')]);
-      // This implementation of IKG invalidates all dirty files.
-      // So, when c.dart is invalidated, a.dart and b.dart also compiled.
-      _assertCompiledUris([aUri, bUri, cUri]);
-    }
-  }
-
-  test_compile_parts() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-library lib;
-part 'b.dart';
-''');
-    Uri bUri = writeFile(bPath, r'''
-part of lib;
-''');
-
-    DeltaProgram delta = await getInitialState(aUri);
-    Program program = delta.newProgram;
-
-    // Sources for library and its part must be present.
-    expect(program.uriToSource.keys, contains(aUri));
-    expect(program.uriToSource.keys, contains(bUri));
-  }
-
-  test_compile_update_part() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, r'''
-library lib;
-part 'b.dart';
-''');
-    Uri bUri = writeFile(bPath, r'''
-part of lib;
-var b = 1;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-''');
-
-    {
-      DeltaProgram delta = await getInitialState(cUri);
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program,
-          includes: [aUri, cUri, Uri.parse('dart:core')]);
-      expect(generator.test.compiledUris, contains(aUri));
-      expect(generator.test.compiledUris, contains(cUri));
-    }
-
-    // Update b.dart (which is a part) and recompile.
-    // Both libraries a.dart and c.dart are recompiled.
-    writeFile(bPath, r'''
-part of lib;
-var b = 1.2;
-''');
-    generator.invalidate(bUri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      _assertCompiledUris([aUri, cUri]);
-      Program program = delta.newProgram;
-      // a.dart and c.dart are included as libraries.
-      // b.dart is excluded because it is not a library.
-      // All a.dart, b.dart, and c.dart are included in sources.
-      _assertLibraryUris(program,
-          includes: [aUri, cUri],
-          includesSource: [aUri, bUri, cUri],
-          excludes: [bUri, Uri.parse('dart:core')],
-          excludesSource: [Uri.parse('dart:core')]);
-    }
-  }
-
-  test_compile_useSdkOutline() async {
-    createSdkFiles(fileSystem);
-    List<int> sdkOutlineBytes = await _computeSdkOutlineBytes();
-
-    Uri sdkOutlineUri = Uri.parse('org-dartlang-test:///sdk/outline.dill');
-    fileSystem.entityForUri(sdkOutlineUri).writeAsBytesSync(sdkOutlineBytes);
-
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-int getValue() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'dart:async';
-import 'a.dart';
-
-var a = 1;
-Future<String> b;
-''');
-
-    DeltaProgram delta =
-        await getInitialState(bUri, sdkOutlineUri: sdkOutlineUri);
-    Program program = delta.newProgram;
-    generator.acceptLastDelta();
-    _assertLibraryUris(program,
-        includes: [bUri], excludes: [Uri.parse('dart:core')]);
-
-    Library library = _getLibrary(program, bUri);
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-static field core::int a = 1;
-static field asy::Future<core::String> b;
-''');
-
-    // Update a.dart and recompile.
-    writeFile(aPath, r'''
-int getValue() {
-  return 2;
-}
-''');
-    generator.invalidate(aUri);
-    var deltaProgram = await generator.computeDelta();
-
-    // Check that the canonical names for SDK libraries are serializable.
-    serializeProgram(deltaProgram.newProgram,
-        filter: (library) => !library.importUri.isScheme('dart'));
-  }
-
-  test_computeDelta_hasAnotherRunning() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, '');
-
-    await getInitialState(uri);
-    generator.acceptLastDelta();
-
-    // Run, but don't wait.
-    var future = generator.computeDelta();
-
-    // acceptLastDelta() is failing while the future is pending.
-    _assertStateError(() {
-      generator.acceptLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_PENDING_COMPUTE);
-
-    // rejectLastDelta() is failing while the future is pending.
-    _assertStateError(() {
-      generator.rejectLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_PENDING_COMPUTE);
-
-    // Run another, this causes StateError.
-    _assertStateError(() {
-      generator.computeDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_PENDING_COMPUTE);
-
-    // Wait for the pending future.
-    await future;
-  }
-
-  test_embedSourceText_false() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, 'main() {}');
-
-    DeltaProgram delta = await getInitialState(uri, embedSourceText: false);
-    Program program = delta.newProgram;
-
-    // The Source object is present in the map, but is empty.
-    Source source = program.uriToSource[uri];
-    expect(source, isNotNull);
-    expect(source.source, isEmpty);
-  }
-
-  test_inferPackagesFile() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import "package:test/a.dart";
-var b = a;
-''');
-
-    // Ensures that the `.packages` file can be discovered automatically
-    // from the entry point file.
-    DeltaProgram delta = await getInitialState(bUri, setPackages: false);
-    Program program = delta.newProgram;
-    Library library = _getLibrary(program, bUri);
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "package:test/a.dart" as a;
-
-static field core::int b = a::a;
-''');
-  }
-
-  test_rejectLastDelta() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, 'var v = 1;');
-
-    // The first delta includes the the library.
-    {
-      DeltaProgram delta = await getInitialState(uri);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), contains('core::int v = 1'));
-    }
-
-    // Reject the last delta, so the test library is included again.
-    generator.rejectLastDelta();
-    {
-      var delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-    }
-
-    // Attempt to reject the last delta twice.
-    generator.rejectLastDelta();
-    _assertStateError(() {
-      generator.rejectLastDelta();
-    }, IncrementalKernelGeneratorImpl.MSG_NO_LAST_DELTA);
-  }
-
-  test_reset() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, 'var v = 1;');
-
-    // The first delta includes the the library.
-    {
-      DeltaProgram delta = await getInitialState(uri);
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), contains('core::int v = 1'));
-    }
-
-    // Accept the last delta, the new delta is empty.
-    generator.acceptLastDelta();
-    {
-      var delta = await generator.computeDelta();
-      expect(delta.newProgram.libraries, isEmpty);
-    }
-
-    // Reset the generator, so it will resend the whole program.
-    generator.reset();
-    {
-      var delta = await generator.computeDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-    }
-  }
-
-  test_updateEntryPoint() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String path = '/test/lib/test.dart';
-    Uri uri = writeFile(path, r'''
-main() {
-  var v = 1;
-}
-''');
-
-    String initialText = r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::int v = 1;
-}
-''';
-
-    // Compute the initial state.
-    {
-      DeltaProgram delta = await getInitialState(uri);
-      Program program = delta.newProgram;
-      generator.acceptLastDelta();
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), initialText);
-    }
-
-    // Update the entry point library.
-    writeFile(path, r'''
-main() {
-  var v = 2.3;
-}
-''');
-
-    // We have not invalidated the file, so the delta is empty.
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      expect(delta.newProgram.libraries, isEmpty);
-    }
-
-    // Invalidate the file, so get the new text.
-    generator.invalidate(uri);
-    {
-      DeltaProgram delta = await generator.computeDelta();
-      generator.acceptLastDelta();
-      Program program = delta.newProgram;
-      _assertLibraryUris(program, includes: [uri]);
-      Library library = _getLibrary(program, uri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::double v = 2.3;
-}
-''');
-    }
-  }
-
-  test_watch() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, '');
-    Uri bUri = writeFile(bPath, '');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-''');
-
-    var usedFiles = <Uri>[];
-    var unusedFiles = <Uri>[];
-    watchFn = (Uri uri, bool used) {
-      if (used) {
-        usedFiles.add(uri);
-      } else {
-        unusedFiles.add(uri);
-      }
-      return new Future.value();
-    };
-
-    {
-      await getInitialState(cUri);
-      generator.acceptLastDelta();
-      // We use at least c.dart and a.dart now.
-      expect(usedFiles, contains(cUri));
-      expect(usedFiles, contains(aUri));
-      usedFiles.clear();
-      expect(unusedFiles, isEmpty);
-    }
-
-    // Update c.dart to reference also b.dart file.
-    writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-''');
-    generator.invalidate(cUri);
-    {
-      await generator.computeDelta();
-      generator.acceptLastDelta();
-      // The only new file is b.dart now.
-      expect(usedFiles, [bUri]);
-      usedFiles.clear();
-      expect(unusedFiles, isEmpty);
-    }
-
-    // Update c.dart to stop referencing b.dart file.
-    writeFile(cPath, r'''
-import 'a.dart';
-''');
-    generator.invalidate(cUri);
-    {
-      await generator.computeDelta();
-      generator.acceptLastDelta();
-      // No new used files.
-      expect(usedFiles, isEmpty);
-      // The file b.dart is not used anymore.
-      expect(unusedFiles, [bUri]);
-      unusedFiles.clear();
-    }
-  }
-
-  test_watch_null() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, "");
-    Uri bUri = writeFile(bPath, "");
-
-    // Set null, as if the watch function is not provided.
-    watchFn = null;
-
-    await getInitialState(bUri);
-    generator.acceptLastDelta();
-
-    // Update b.dart to import a.dart file.
-    writeFile(bPath, "import 'a.dart';");
-    generator.invalidate(bUri);
-    await generator.computeDelta();
-
-    // No exception even though the watcher function is null.
-  }
-
-  /// Write the given [text] of the file with the given [path] into the
-  /// virtual filesystem.  Return the URI of the file.
-  Uri writeFile(String path, String text) {
-    Uri uri = Uri.parse('org-dartlang-test://$path');
-    fileSystem.entityForUri(uri).writeAsStringSync(text);
-    return uri;
-  }
-
-  /// Write the given file contents to the virtual filesystem.
-  void writeFiles(Map<String, String> contents) {
-    contents.forEach(writeFile);
-  }
-
-  void _assertCompiledUris(Iterable<Uri> expected) {
-    Set<Uri> compiledUris = generator.test.compiledUris;
-    expect(compiledUris, unorderedEquals(expected));
-  }
-
-  void _assertLibraryUris(Program program,
-      {List<Uri> includes: const [],
-      List<Uri> includesSource,
-      List<Uri> excludes: const [],
-      List<Uri> excludesSource}) {
-    List<Uri> libraryUris =
-        program.libraries.map((library) => library.importUri).toList();
-
-    for (var shouldInclude in includes) {
-      expect(libraryUris, contains(shouldInclude));
-    }
-    includesSource ??= includes;
-    for (var shouldInclude in includes) {
-      var shouldIncludeFileUri = _resolveUriToFileUri(shouldInclude);
-      expect(program.uriToSource.keys, contains(shouldIncludeFileUri));
-    }
-
-    for (var shouldExclude in excludes) {
-      expect(libraryUris, isNot(contains(shouldExclude)));
-    }
-    excludesSource ??= excludes;
-    for (var shouldExclude in excludesSource) {
-      var shouldExcludeFileUri = _resolveUriToFileUri(shouldExclude);
-      expect(program.uriToSource.keys, isNot(contains(shouldExcludeFileUri)));
-    }
-  }
-
-  /// Assert that invocation of [f] throws a [StateError] with the given [msg].
-  void _assertStateError(f(), String msg) {
-    try {
-      f();
-      fail('StateError expected.');
-    } on StateError catch (e) {
-      expect(e.message, msg);
-    }
-  }
-
-  Future<List<int>> _computeSdkOutlineBytes() async {
-    var options = new CompilerOptions()
-      ..fileSystem = fileSystem
-      ..sdkRoot = Uri.parse('org-dartlang-test:///sdk/')
-      ..compileSdk = true
-      ..chaseDependencies = true
-      ..strongMode = true;
-    var inputs = [Uri.parse('dart:core')];
-    return summaryFor(inputs, options);
-  }
-
-  Library _getLibrary(Program program, Uri uri) {
-    for (var library in program.libraries) {
-      if (library.importUri == uri) return library;
-    }
-    throw fail('No library found with URI "$uri"');
-  }
-
-  String _getLibraryText(Library library) {
-    StringBuffer buffer = new StringBuffer();
-    new Printer(buffer, syntheticNames: new NameSystem())
-        .writeLibraryFile(library);
-    return buffer.toString();
-  }
-
-  /// Resolve the given `dart` or `package` [inputUri] into the corresponding
-  /// file URI, or return the same URI if it is already a file URI.
-  Uri _resolveUriToFileUri(Uri inputUri) {
-    var translator = generator.uriTranslator;
-    var outputUri = translator.translate(inputUri) ?? inputUri;
-    return outputUri;
-  }
-}
diff --git a/pkg/front_end/test/src/incremental/combine_test.dart b/pkg/front_end/test/src/incremental/combine_test.dart
deleted file mode 100644
index 9a9b19b..0000000
--- a/pkg/front_end/test/src/incremental/combine_test.dart
+++ /dev/null
@@ -1,1932 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:front_end/src/incremental/combine.dart';
-import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/testing/mock_sdk_program.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(CombineTest);
-  });
-}
-
-@reflectiveTest
-class CombineTest {
-  Program sdk;
-  CoreTypes coreTypes;
-
-  Supertype get objectSuper => coreTypes.objectClass.asThisSupertype;
-
-  void setUp() {
-    sdk = createMockSdkProgram();
-    coreTypes = new CoreTypes(sdk);
-  }
-
-  void test_class_mergeLibrary_appendClass() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addClass(new Class(name: 'A', supertype: objectSuper));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addClass(new Class(name: 'B', supertype: objectSuper));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-
-      var classA = _getClass(libraryA, 'A');
-      expect(classA.members, isEmpty);
-
-      var classB = _getClass(libraryA, 'B');
-      expect(classB.members, isEmpty);
-    });
-  }
-
-  /// We test two cases of class declarations:
-  ///   * When a class to merge is first time declared in the first library;
-  ///   * When a class to merge is first time declared in the second library.
-  ///
-  /// With two cases of constructor declarations:
-  ///   * Already defined, so references to it should be rewritten.
-  ///   * First defined in this outline, so references to it can be kept as is.
-  ///
-  /// For each case we validate [DirectMethodInvocation], [MethodInvocation],
-  /// and [SuperMethodInvocation].
-  void test_class_procedure_constructor() {
-    var nodeToName = <NamedNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var constructorA11 = _newConstructor('a1');
-    var classA1 = new Class(
-        name: 'A', supertype: objectSuper, constructors: [constructorA11]);
-    library1.addClass(classA1);
-    nodeToName[classA1] = 'A1';
-    nodeToName[constructorA11] = 'A11';
-
-    var library2 = _newLibrary('test');
-    var constructorA12 = _newConstructor('a1');
-    var constructorA22 = _newConstructor('a2');
-    var constructorB11 = _newConstructor('b1');
-    var classA2 = new Class(
-        name: 'A',
-        supertype: objectSuper,
-        constructors: [constructorA12, constructorA22]);
-    library2.addClass(classA2);
-    var classB1 = new Class(
-        name: 'B', supertype: objectSuper, constructors: [constructorB11]);
-    library2.addClass(classB1);
-    // Use 'A.a1' and 'A.a2' to validate later how they are rewritten.
-    library2.addProcedure(_newExpressionsProcedure([
-      new ConstructorInvocation(constructorA12, new Arguments.empty()),
-      new ConstructorInvocation(constructorA22, new Arguments.empty()),
-    ], name: 'main2'));
-    library2.addClass(new Class(
-        name: 'S1',
-        supertype: classA2.asThisSupertype,
-        constructors: [
-          new Constructor(new FunctionNode(new EmptyStatement()),
-              name: new Name('c1'),
-              initializers: [
-                new SuperInitializer(constructorA12, new Arguments.empty()),
-                new SuperInitializer(constructorA22, new Arguments.empty()),
-              ]),
-          new Constructor(new FunctionNode(new EmptyStatement()),
-              name: new Name('c2'),
-              initializers: [
-                new RedirectingInitializer(
-                    constructorA12, new Arguments.empty()),
-                new RedirectingInitializer(
-                    constructorA22, new Arguments.empty()),
-              ]),
-        ]));
-    nodeToName[classA2] = 'A2';
-    nodeToName[constructorA12] = 'A12';
-    nodeToName[constructorA22] = 'A22';
-    nodeToName[constructorB11] = 'B11';
-    nodeToName[classB1] = 'B1';
-    nodeToName[constructorB11] = 'B11';
-
-    var library3 = _newLibrary('test');
-    var constructorB12 = _newConstructor('b1');
-    var constructorB22 = _newConstructor('b2');
-    var classB2 = new Class(
-        name: 'B',
-        supertype: objectSuper,
-        constructors: [constructorB12, constructorB22]);
-    library3.addClass(classB2);
-    library3.addProcedure(_newExpressionsProcedure([
-      new ConstructorInvocation(constructorB12, new Arguments.empty()),
-      new ConstructorInvocation(constructorB22, new Arguments.empty()),
-    ], name: 'main3'));
-    library3.addClass(new Class(
-        name: 'S2',
-        supertype: classB2.asThisSupertype,
-        constructors: [
-          new Constructor(new FunctionNode(new EmptyStatement()),
-              name: new Name('c1'),
-              initializers: [
-                new SuperInitializer(constructorB12, new Arguments.empty()),
-                new SuperInitializer(constructorB22, new Arguments.empty()),
-              ]),
-          new Constructor(new FunctionNode(new EmptyStatement()),
-              name: new Name('c2'),
-              initializers: [
-                new RedirectingInitializer(
-                    constructorB12, new Arguments.empty()),
-                new RedirectingInitializer(
-                    constructorB22, new Arguments.empty()),
-              ]),
-        ]));
-    nodeToName[classB2] = 'B2';
-    nodeToName[constructorB12] = 'B12';
-    nodeToName[constructorB22] = 'B22';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-    var outline3 = _newOutline([library3]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1] {
-  constructor a1[A11]();
-}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2] {
-  constructor a1[A12]();
-  constructor a2[A22]();
-}
-class B[B1] {
-  constructor b1[B11]();
-}
-class S1 extends A[A2] {
-  constructor c1() :
-      super[A12](),
-      super[A22]();
-  constructor c2() :
-      redirect[A12](),
-      redirect[A22]();
-}
-main2() {
-  ConstructorInvocation[A12]();
-  ConstructorInvocation[A22]();
-}
-''');
-    expect(_getLibraryText(library3, nodeToName), r'''
-class B[B2] {
-  constructor b1[B12]();
-  constructor b2[B22]();
-}
-class S2 extends B[B2] {
-  constructor c1() :
-      super[B12](),
-      super[B22]();
-  constructor c2() :
-      redirect[B12](),
-      redirect[B22]();
-}
-main3() {
-  ConstructorInvocation[B12]();
-  ConstructorInvocation[B22]();
-}
-''');
-
-    _runCombineTest([outline1, outline2, outline3], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1] {
-  constructor a1[A11]();
-  constructor a2[A22]();
-}
-class B[B1] {
-  constructor b1[B11]();
-  constructor b2[B22]();
-}
-class S1 extends A[A1] {
-  constructor c1() :
-      super[A11](),
-      super[A22]();
-  constructor c2() :
-      redirect[A11](),
-      redirect[A22]();
-}
-class S2 extends B[B1] {
-  constructor c1() :
-      super[B11](),
-      super[B22]();
-  constructor c2() :
-      redirect[B11](),
-      redirect[B22]();
-}
-main2() {
-  ConstructorInvocation[A11]();
-  ConstructorInvocation[A22]();
-}
-main3() {
-  ConstructorInvocation[B11]();
-  ConstructorInvocation[B22]();
-}
-''');
-    });
-  }
-
-  /// We test two cases of class declarations:
-  ///   * When a class to merge is first time declared in the first library;
-  ///   * When a class to merge is first time declared in the second library.
-  ///
-  /// With two cases of field declarations:
-  ///   * Already defined, so references to it should be rewritten.
-  ///   * First defined in this outline, so references to it can be kept as is.
-  ///
-  /// For each case we validate [DirectPropertyGet], [DirectPropertySet],
-  /// [PropertyGet], [PropertySet], [SuperPropertyGet], and [SuperPropertySet].
-  void test_class_procedure_field() {
-    var nodeToName = <NamedNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var fieldA11 = _newField('a1');
-    var classA1 =
-        new Class(name: 'A', supertype: objectSuper, fields: [fieldA11]);
-    library1.addClass(classA1);
-    nodeToName[classA1] = 'A1';
-    nodeToName[fieldA11] = 'a11';
-
-    var library2 = _newLibrary('test');
-    var fieldA12 = _newField('a1');
-    var fieldA22 = _newField('a2');
-    var fieldB11 = _newField('b1');
-    var classA2 = new Class(
-        name: 'A', supertype: objectSuper, fields: [fieldA12, fieldA22]);
-    library2.addClass(classA2);
-    var classB1 =
-        new Class(name: 'B', supertype: objectSuper, fields: [fieldB11]);
-    library2.addClass(classB1);
-    // Use 'A.a1' and 'A.a2' to validate later how they are rewritten.
-    library2.addProcedure(_newExpressionsProcedure([
-      new DirectPropertyGet(null, fieldA12),
-      new PropertyGet(null, null, fieldA12),
-      new DirectPropertySet(null, fieldA12, null),
-      new PropertySet(null, null, null, fieldA12),
-      new DirectPropertyGet(null, fieldA22),
-      new PropertyGet(null, null, fieldA22),
-      new DirectPropertySet(null, fieldA22, null),
-      new PropertySet(null, null, null, fieldA22),
-    ], name: 'main2'));
-    library2.addClass(
-        new Class(name: 'S1', supertype: classA2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperPropertyGet(null, fieldA12),
-        new SuperPropertySet(null, null, fieldA12),
-        new SuperPropertyGet(null, fieldA22),
-        new SuperPropertySet(null, null, fieldA22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classA2] = 'A2';
-    nodeToName[classB1] = 'B1';
-    nodeToName[fieldA12] = 'a12';
-    nodeToName[fieldA22] = 'a22';
-    nodeToName[fieldB11] = 'b11';
-
-    var library3 = _newLibrary('test');
-    var fieldB12 = _newField('b1');
-    var fieldB22 = _newField('b2');
-    var classB2 = new Class(
-        name: 'B', supertype: objectSuper, fields: [fieldB12, fieldB22]);
-    library3.addClass(classB2);
-    library3.addProcedure(_newExpressionsProcedure([
-      new DirectPropertyGet(null, fieldB12),
-      new PropertyGet(null, null, fieldB12),
-      new DirectPropertyGet(null, fieldB22),
-      new PropertyGet(null, null, fieldB22),
-    ], name: 'main3'));
-    library3.addClass(
-        new Class(name: 'S2', supertype: classB2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperPropertyGet(null, fieldB12),
-        new SuperPropertySet(null, null, fieldB12),
-        new SuperPropertyGet(null, fieldB22),
-        new SuperPropertySet(null, null, fieldB22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classB2] = 'B2';
-    nodeToName[fieldB12] = 'b12';
-    nodeToName[fieldB22] = 'b22';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-    var outline3 = _newOutline([library3]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1] {
-  var a1[a11];
-}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2] {
-  var a1[a12];
-  var a2[a22];
-}
-class B[B1] {
-  var b1[b11];
-}
-class S1 extends A[A2] {
-  foo() {
-    SuperPropertyGet[a12]();
-    SuperPropertySet[a12]();
-    SuperPropertyGet[a22]();
-    SuperPropertySet[a22]();
-  }
-}
-main2() {
-  DirectPropertyGet[a12]();
-  PropertyGet[a12]();
-  DirectPropertySet[a12]();
-  PropertySet[a12]();
-  DirectPropertyGet[a22]();
-  PropertyGet[a22]();
-  DirectPropertySet[a22]();
-  PropertySet[a22]();
-}
-''');
-    expect(_getLibraryText(library3, nodeToName), r'''
-class B[B2] {
-  var b1[b12];
-  var b2[b22];
-}
-class S2 extends B[B2] {
-  foo() {
-    SuperPropertyGet[b12]();
-    SuperPropertySet[b12]();
-    SuperPropertyGet[b22]();
-    SuperPropertySet[b22]();
-  }
-}
-main3() {
-  DirectPropertyGet[b12]();
-  PropertyGet[b12]();
-  DirectPropertyGet[b22]();
-  PropertyGet[b22]();
-}
-''');
-
-    _runCombineTest([outline1, outline2, outline3], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1] {
-  var a1[a11];
-  var a2[a22];
-}
-class B[B1] {
-  var b1[b11];
-  var b2[b22];
-}
-class S1 extends A[A1] {
-  foo() {
-    SuperPropertyGet[a11]();
-    SuperPropertySet[a11]();
-    SuperPropertyGet[a22]();
-    SuperPropertySet[a22]();
-  }
-}
-class S2 extends B[B1] {
-  foo() {
-    SuperPropertyGet[b11]();
-    SuperPropertySet[b11]();
-    SuperPropertyGet[b22]();
-    SuperPropertySet[b22]();
-  }
-}
-main2() {
-  DirectPropertyGet[a11]();
-  PropertyGet[a11]();
-  DirectPropertySet[a11]();
-  PropertySet[a11]();
-  DirectPropertyGet[a22]();
-  PropertyGet[a22]();
-  DirectPropertySet[a22]();
-  PropertySet[a22]();
-}
-main3() {
-  DirectPropertyGet[b11]();
-  PropertyGet[b11]();
-  DirectPropertyGet[b22]();
-  PropertyGet[b22]();
-}
-''');
-    });
-  }
-
-  /// We test two cases of class declarations:
-  ///   * When a class to merge is first time declared in the first library;
-  ///   * When a class to merge is first time declared in the second library.
-  ///
-  /// With two cases of setter declarations:
-  ///   * Already defined, so references to it should be rewritten.
-  ///   * First defined in this outline, so references to it can be kept as is.
-  ///
-  /// For each case we validate [DirectPropertyGet], [PropertyGet],
-  /// and [SuperPropertyGet].
-  void test_class_procedure_getter() {
-    var nodeToName = <NamedNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var procedureA11 = _newGetter('a1');
-    var classA1 = new Class(
-        name: 'A', supertype: objectSuper, procedures: [procedureA11]);
-    library1.addClass(classA1);
-    nodeToName[classA1] = 'A1';
-    nodeToName[procedureA11] = 'a11';
-
-    var library2 = _newLibrary('test');
-    var procedureA12 = _newGetter('a1');
-    var procedureA22 = _newGetter('a2');
-    var procedureB11 = _newGetter('b1');
-    var classA2 = new Class(
-        name: 'A',
-        supertype: objectSuper,
-        procedures: [procedureA12, procedureA22]);
-    library2.addClass(classA2);
-    var classB1 = new Class(
-        name: 'B', supertype: objectSuper, procedures: [procedureB11]);
-    library2.addClass(classB1);
-    // Use 'A.a1' and 'A.a2' to validate later how they are rewritten.
-    library2.addProcedure(_newExpressionsProcedure([
-      new DirectPropertyGet(null, procedureA12),
-      new PropertyGet(null, null, procedureA12),
-      new DirectPropertyGet(null, procedureA22),
-      new PropertyGet(null, null, procedureA22),
-    ], name: 'main2'));
-    library2.addClass(
-        new Class(name: 'S1', supertype: classA2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperPropertyGet(null, procedureA12),
-        new SuperPropertyGet(null, procedureA22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classA2] = 'A2';
-    nodeToName[classB1] = 'B1';
-    nodeToName[procedureA12] = 'a12';
-    nodeToName[procedureA22] = 'a22';
-    nodeToName[procedureB11] = 'b11';
-
-    var library3 = _newLibrary('test');
-    var procedureB12 = _newGetter('b1');
-    var procedureB22 = _newGetter('b2');
-    var classB2 = new Class(
-        name: 'B',
-        supertype: objectSuper,
-        procedures: [procedureB12, procedureB22]);
-    library3.addClass(classB2);
-    library3.addProcedure(_newExpressionsProcedure([
-      new DirectPropertyGet(null, procedureB12),
-      new PropertyGet(null, null, procedureB12),
-    ], name: 'main3'));
-    library3.addClass(
-        new Class(name: 'S2', supertype: classB2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperPropertyGet(null, procedureB12),
-        new SuperPropertyGet(null, procedureB22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classB2] = 'B2';
-    nodeToName[procedureB12] = 'b12';
-    nodeToName[procedureB22] = 'b22';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-    var outline3 = _newOutline([library3]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1] {
-  get a1[a11] => 0;
-}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2] {
-  get a1[a12] => 0;
-  get a2[a22] => 0;
-}
-class B[B1] {
-  get b1[b11] => 0;
-}
-class S1 extends A[A2] {
-  foo() {
-    SuperPropertyGet[a12]();
-    SuperPropertyGet[a22]();
-  }
-}
-main2() {
-  DirectPropertyGet[a12]();
-  PropertyGet[a12]();
-  DirectPropertyGet[a22]();
-  PropertyGet[a22]();
-}
-''');
-    expect(_getLibraryText(library3, nodeToName), r'''
-class B[B2] {
-  get b1[b12] => 0;
-  get b2[b22] => 0;
-}
-class S2 extends B[B2] {
-  foo() {
-    SuperPropertyGet[b12]();
-    SuperPropertyGet[b22]();
-  }
-}
-main3() {
-  DirectPropertyGet[b12]();
-  PropertyGet[b12]();
-}
-''');
-
-    _runCombineTest([outline1, outline2, outline3], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1] {
-  get a1[a11] => 0;
-  get a2[a22] => 0;
-}
-class B[B1] {
-  get b1[b11] => 0;
-  get b2[b22] => 0;
-}
-class S1 extends A[A1] {
-  foo() {
-    SuperPropertyGet[a11]();
-    SuperPropertyGet[a22]();
-  }
-}
-class S2 extends B[B1] {
-  foo() {
-    SuperPropertyGet[b11]();
-    SuperPropertyGet[b22]();
-  }
-}
-main2() {
-  DirectPropertyGet[a11]();
-  PropertyGet[a11]();
-  DirectPropertyGet[a22]();
-  PropertyGet[a22]();
-}
-main3() {
-  DirectPropertyGet[b11]();
-  PropertyGet[b11]();
-}
-''');
-    });
-  }
-
-  /// We test two cases of class declarations:
-  ///   * When a class to merge is first time declared in the first library;
-  ///   * When a class to merge is first time declared in the second library.
-  ///
-  /// With two cases of method declarations:
-  ///   * Already defined, so references to it should be rewritten.
-  ///   * First defined in this outline, so references to it can be kept as is.
-  ///
-  /// For each case we validate [DirectMethodInvocation], [MethodInvocation],
-  /// and [SuperMethodInvocation].
-  void test_class_procedure_method() {
-    var nodeToName = <NamedNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var procedureA11 = _newMethod('a1');
-    var classA1 = new Class(
-        name: 'A', supertype: objectSuper, procedures: [procedureA11]);
-    library1.addClass(classA1);
-    nodeToName[classA1] = 'A1';
-    nodeToName[procedureA11] = 'a11';
-
-    var library2 = _newLibrary('test');
-    var procedureA12 = _newMethod('a1');
-    var procedureA22 = _newMethod('a2');
-    var procedureB11 = _newMethod('b1');
-    var classA2 = new Class(
-        name: 'A',
-        supertype: objectSuper,
-        procedures: [procedureA12, procedureA22]);
-    library2.addClass(classA2);
-    var classB1 = new Class(
-        name: 'B', supertype: objectSuper, procedures: [procedureB11]);
-    library2.addClass(classB1);
-    // Use 'A.a1' and 'A.a2' to validate later how they are rewritten.
-    library2.addProcedure(_newExpressionsProcedure([
-      new DirectMethodInvocation(null, procedureA12, new Arguments.empty()),
-      new MethodInvocation(null, null, new Arguments.empty(), procedureA12),
-      new DirectMethodInvocation(null, procedureA22, new Arguments.empty()),
-      new MethodInvocation(null, null, new Arguments.empty(), procedureA22),
-    ], name: 'main2'));
-    library2.addClass(
-        new Class(name: 'S1', supertype: classA2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperMethodInvocation(null, null, procedureA12),
-        new SuperMethodInvocation(null, null, procedureA22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classA2] = 'A2';
-    nodeToName[classB1] = 'B1';
-    nodeToName[procedureA12] = 'a12';
-    nodeToName[procedureA22] = 'a22';
-    nodeToName[procedureB11] = 'b11';
-
-    var library3 = _newLibrary('test');
-    var procedureB12 = _newMethod('b1');
-    var procedureB22 = _newMethod('b2');
-    var classB2 = new Class(
-        name: 'B',
-        supertype: objectSuper,
-        procedures: [procedureB12, procedureB22]);
-    library3.addClass(classB2);
-    library3.addProcedure(_newExpressionsProcedure([
-      new DirectMethodInvocation(null, procedureB12, new Arguments.empty()),
-      new MethodInvocation(null, null, new Arguments.empty(), procedureB12),
-    ], name: 'main3'));
-    library3.addClass(
-        new Class(name: 'S2', supertype: classB2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperMethodInvocation(null, null, procedureB12),
-        new SuperMethodInvocation(null, null, procedureB22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classB2] = 'B2';
-    nodeToName[procedureB12] = 'b12';
-    nodeToName[procedureB22] = 'b22';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-    var outline3 = _newOutline([library3]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1] {
-  a1[a11]();
-}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2] {
-  a1[a12]();
-  a2[a22]();
-}
-class B[B1] {
-  b1[b11]();
-}
-class S1 extends A[A2] {
-  foo() {
-    SuperMethodInvocation[a12]();
-    SuperMethodInvocation[a22]();
-  }
-}
-main2() {
-  DirectMethodInvocation[a12]();
-  MethodInvocation[a12]();
-  DirectMethodInvocation[a22]();
-  MethodInvocation[a22]();
-}
-''');
-    expect(_getLibraryText(library3, nodeToName), r'''
-class B[B2] {
-  b1[b12]();
-  b2[b22]();
-}
-class S2 extends B[B2] {
-  foo() {
-    SuperMethodInvocation[b12]();
-    SuperMethodInvocation[b22]();
-  }
-}
-main3() {
-  DirectMethodInvocation[b12]();
-  MethodInvocation[b12]();
-}
-''');
-
-    _runCombineTest([outline1, outline2, outline3], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1] {
-  a1[a11]();
-  a2[a22]();
-}
-class B[B1] {
-  b1[b11]();
-  b2[b22]();
-}
-class S1 extends A[A1] {
-  foo() {
-    SuperMethodInvocation[a11]();
-    SuperMethodInvocation[a22]();
-  }
-}
-class S2 extends B[B1] {
-  foo() {
-    SuperMethodInvocation[b11]();
-    SuperMethodInvocation[b22]();
-  }
-}
-main2() {
-  DirectMethodInvocation[a11]();
-  MethodInvocation[a11]();
-  DirectMethodInvocation[a22]();
-  MethodInvocation[a22]();
-}
-main3() {
-  DirectMethodInvocation[b11]();
-  MethodInvocation[b11]();
-}
-''');
-    });
-  }
-
-  /// We test two cases of class declarations:
-  ///   * When a class to merge is first time declared in the first library;
-  ///   * When a class to merge is first time declared in the second library.
-  ///
-  /// With two cases of setter declarations:
-  ///   * Already defined, so references to it should be rewritten.
-  ///   * First defined in this outline, so references to it can be kept as is.
-  ///
-  /// For each case we validate [DirectPropertySet], [PropertySet],
-  /// and [SuperPropertySet].
-  void test_class_procedure_setter() {
-    var nodeToName = <NamedNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var procedureA11 = _newSetter('a1');
-    var classA1 = new Class(
-        name: 'A', supertype: objectSuper, procedures: [procedureA11]);
-    library1.addClass(classA1);
-    nodeToName[classA1] = 'A1';
-    nodeToName[procedureA11] = 'a11';
-
-    var library2 = _newLibrary('test');
-    var procedureA12 = _newSetter('a1');
-    var procedureA22 = _newSetter('a2');
-    var procedureB11 = _newSetter('b1');
-    var classA2 = new Class(
-        name: 'A',
-        supertype: objectSuper,
-        procedures: [procedureA12, procedureA22]);
-    library2.addClass(classA2);
-    var classB1 = new Class(
-        name: 'B', supertype: objectSuper, procedures: [procedureB11]);
-    library2.addClass(classB1);
-    // Use 'A.a1' and 'A.a2' to validate later how they are rewritten.
-    library2.addProcedure(_newExpressionsProcedure([
-      new DirectPropertySet(null, procedureA12, new IntLiteral(0)),
-      new PropertySet(null, null, new IntLiteral(0), procedureA12),
-      new DirectPropertySet(null, procedureA22, new IntLiteral(0)),
-      new PropertySet(null, null, new IntLiteral(0), procedureA22),
-    ], name: 'main2'));
-    library2.addClass(
-        new Class(name: 'S1', supertype: classA2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperPropertySet(null, new IntLiteral(0), procedureA12),
-        new SuperPropertySet(null, new IntLiteral(0), procedureA22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classA2] = 'A2';
-    nodeToName[classB1] = 'B1';
-    nodeToName[procedureA12] = 'a12';
-    nodeToName[procedureA22] = 'a22';
-    nodeToName[procedureB11] = 'b11';
-
-    var library3 = _newLibrary('test');
-    var procedureB12 = _newSetter('b1');
-    var procedureB22 = _newSetter('b2');
-    var classB2 = new Class(
-        name: 'B',
-        supertype: objectSuper,
-        procedures: [procedureB12, procedureB22]);
-    library3.addClass(classB2);
-    library3.addProcedure(_newExpressionsProcedure([
-      new DirectPropertySet(null, procedureB12, new IntLiteral(0)),
-      new PropertySet(null, null, new IntLiteral(0), procedureB12),
-    ], name: 'main3'));
-    library3.addClass(
-        new Class(name: 'S2', supertype: classB2.asThisSupertype, procedures: [
-      _newExpressionsProcedure([
-        new SuperPropertySet(null, new IntLiteral(0), procedureB12),
-        new SuperPropertySet(null, new IntLiteral(0), procedureB22),
-      ], name: 'foo')
-    ]));
-    nodeToName[classB2] = 'B2';
-    nodeToName[procedureB12] = 'b12';
-    nodeToName[procedureB22] = 'b22';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-    var outline3 = _newOutline([library3]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1] {
-  set a1[a11]();
-}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2] {
-  set a1[a12]();
-  set a2[a22]();
-}
-class B[B1] {
-  set b1[b11]();
-}
-class S1 extends A[A2] {
-  foo() {
-    SuperPropertySet[a12]();
-    SuperPropertySet[a22]();
-  }
-}
-main2() {
-  DirectPropertySet[a12]();
-  PropertySet[a12]();
-  DirectPropertySet[a22]();
-  PropertySet[a22]();
-}
-''');
-    expect(_getLibraryText(library3, nodeToName), r'''
-class B[B2] {
-  set b1[b12]();
-  set b2[b22]();
-}
-class S2 extends B[B2] {
-  foo() {
-    SuperPropertySet[b12]();
-    SuperPropertySet[b22]();
-  }
-}
-main3() {
-  DirectPropertySet[b12]();
-  PropertySet[b12]();
-}
-''');
-
-    _runCombineTest([outline1, outline2, outline3], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1] {
-  set a1[a11]();
-  set a2[a22]();
-}
-class B[B1] {
-  set b1[b11]();
-  set b2[b22]();
-}
-class S1 extends A[A1] {
-  foo() {
-    SuperPropertySet[a11]();
-    SuperPropertySet[a22]();
-  }
-}
-class S2 extends B[B1] {
-  foo() {
-    SuperPropertySet[b11]();
-    SuperPropertySet[b22]();
-  }
-}
-main2() {
-  DirectPropertySet[a11]();
-  PropertySet[a11]();
-  DirectPropertySet[a22]();
-  PropertySet[a22]();
-}
-main3() {
-  DirectPropertySet[b11]();
-  PropertySet[b11]();
-}
-''');
-    });
-  }
-
-  void test_class_typeParameter_updateReference() {
-    var nodeToName = <TreeNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var typeParameterT1 = _newTypeParameter('T');
-    var fieldA11 =
-        _newField('a1', type: new TypeParameterType(typeParameterT1));
-    var classA1 = new Class(
-        name: 'A',
-        typeParameters: [typeParameterT1],
-        supertype: objectSuper,
-        fields: [fieldA11]);
-    library1.addClass(classA1);
-    nodeToName[typeParameterT1] = 'T1';
-    nodeToName[classA1] = 'A1';
-    nodeToName[fieldA11] = 'a11';
-
-    var library2 = _newLibrary('test');
-    var typeParameterT2 = _newTypeParameter('T');
-    var fieldA12 =
-        _newField('a1', type: new TypeParameterType(typeParameterT2));
-    var fieldA22 =
-        _newField('a2', type: new TypeParameterType(typeParameterT2));
-    var classA2 = new Class(
-        name: 'A',
-        typeParameters: [typeParameterT2],
-        supertype: objectSuper,
-        fields: [fieldA12, fieldA22]);
-    nodeToName[typeParameterT2] = 'T2';
-    library2.addClass(classA2);
-    nodeToName[classA2] = 'A2';
-    nodeToName[fieldA12] = 'a12';
-    nodeToName[fieldA22] = 'a22';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1]<T[T1]> {
-  T[T1] a1[a11];
-}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2]<T[T2]> {
-  T[T2] a1[a12];
-  T[T2] a2[a22];
-}
-''');
-
-    _runCombineTest([outline1, outline2], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1]<T[T1]> {
-  T[T1] a1[a11];
-  T[T1] a2[a22];
-}
-''');
-    });
-  }
-
-  void test_class_updateReferences() {
-    var nodeToName = <TreeNode, String>{};
-
-    var library1 = _newLibrary('test');
-    var classA1 = new Class(name: 'A', supertype: objectSuper);
-    library1.addClass(classA1);
-    nodeToName[classA1] = 'A1';
-
-    var library2 = _newLibrary('test');
-    var classA2 = new Class(name: 'A', supertype: objectSuper);
-    var classB1 = new Class(name: 'B1', supertype: new Supertype(classA2, []));
-    var classB2 = new Class(
-        name: 'B2',
-        supertype: objectSuper,
-        implementedTypes: [new Supertype(classA2, [])]);
-    var classB3 = new Class(
-        name: 'B3',
-        supertype: objectSuper,
-        mixedInType: new Supertype(classA2, []));
-    var typeParameterT1 = new TypeParameter('T', new InterfaceType(classA2));
-    var classB4 = new Class(
-        name: 'B4', supertype: objectSuper, typeParameters: [typeParameterT1]);
-    library2.addClass(classA2);
-    library2.addClass(classB1);
-    library2.addClass(classB2);
-    library2.addClass(classB3);
-    library2.addClass(classB4);
-    nodeToName[classA2] = 'A2';
-    nodeToName[classB1] = 'B1';
-    nodeToName[classB2] = 'B2';
-    nodeToName[classB3] = 'B3';
-    nodeToName[classB4] = 'B4';
-    nodeToName[typeParameterT1] = 'T';
-
-    var outline1 = _newOutline([library1]);
-    var outline2 = _newOutline([library2]);
-
-    expect(_getLibraryText(library1, nodeToName), r'''
-class A[A1] {}
-''');
-    expect(_getLibraryText(library2, nodeToName), r'''
-class A[A2] {}
-class B1[B1] extends A[A2] {}
-class B2[B2] implements A[A2] {}
-class B3[B3] with A[A2] {}
-class B4[B4]<T[T] extends A[A2]> {}
-''');
-
-    _runCombineTest([outline1, outline2], (result) {
-      var library = _getLibrary(result.program, 'test');
-      expect(_getLibraryText(library, nodeToName), r'''
-class A[A1] {}
-class B1[B1] extends A[A1] {}
-class B2[B2] implements A[A1] {}
-class B3[B3] with A[A1] {}
-class B4[B4]<T[T] extends A[A1]> {}
-''');
-    });
-  }
-
-  void test_field() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addField(_newField('A'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addField(_newField('B'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getField(libraryA, 'A');
-      _getField(libraryA, 'B');
-    });
-  }
-
-  void test_field_skipDuplicate() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addField(_newField('A'));
-    libraryA1.addField(_newField('B'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addField(_newField('A'));
-    libraryA2.addField(_newField('C'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getField(libraryA, 'A');
-      _getField(libraryA, 'B');
-      _getField(libraryA, 'C');
-    });
-  }
-
-  void test_field_updateReferences() {
-    var libraryA1 = _newLibrary('a');
-    var fieldA1A = _newField('A');
-    libraryA1.addField(fieldA1A);
-
-    var libraryA2 = _newLibrary('a');
-    var fieldA2A = _newField('A');
-    libraryA2.addField(fieldA2A);
-
-    var libraryB = _newLibrary('b');
-    libraryB.addProcedure(_newExpressionsProcedure([
-      new StaticGet(fieldA2A),
-      new StaticSet(fieldA2A, new IntLiteral(0)),
-    ]));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getField(libraryA, 'A');
-
-      var libraryB = _getLibrary(result.program, 'b');
-      var main = _getProcedure(libraryB, 'main', '@methods');
-      expect((_getProcedureExpression(main, 0) as StaticGet).targetReference,
-          same(fieldA1A.reference));
-      expect((_getProcedureExpression(main, 1) as StaticSet).targetReference,
-          same(fieldA1A.reference));
-    });
-  }
-
-  void test_library_additionalExports() {
-    Map<String, Reference> addLibraryDeclarations(Library library) {
-      var A = new Class(name: 'A');
-      var B = _newField('B');
-      var C = _newMethod('C');
-      var D = _newGetter('D');
-      var E = _newSetter('E');
-      library.addClass(A);
-      library.addField(B);
-      library.addProcedure(C);
-      library.addProcedure(D);
-      library.addProcedure(E);
-      return {
-        'A': A.reference,
-        'B': B.reference,
-        'C': C.reference,
-        'D': D.reference,
-        'E': E.reference
-      };
-    }
-
-    var libraryA1 = _newLibrary('a');
-    var declarations = addLibraryDeclarations(libraryA1);
-
-    var libraryA2 = _newLibrary('a');
-    var declarations2 = addLibraryDeclarations(libraryA2);
-
-    var libraryB = _newLibrary('b');
-    libraryB.additionalExports.addAll(declarations2.values);
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      var libraryB = _getLibrary(result.program, 'b');
-      expect(libraryB.additionalExports, hasLength(declarations.length));
-      for (var declaration in _getLibraryDeclarations(libraryA)) {
-        String name = declaration.canonicalName.name;
-        Reference reference = declaration.reference;
-        expect(declarations[name], same(reference));
-        expect(libraryB.additionalExports, contains(reference));
-      }
-    });
-  }
-
-  void test_library_additionalExports_externalVersionFirst() {
-    // As if outline for "a" uses "b" (which is external).
-    // And we first see the external "b", without addition exports.
-    var libraryA = _newLibrary('a');
-    var libraryB1 = _newLibrary('b');
-
-    // As if outline for "b" exports C1 and C2 from "c".
-    // So, we see "b" with exports only as the second library.
-    var libraryB2 = _newLibrary('b');
-    var libraryC = _newLibrary('c');
-    var C1 = new Class(name: 'C1');
-    var C2 = new Class(name: 'C2');
-    libraryC.addClass(C1);
-    libraryC.addClass(C2);
-    libraryB2.additionalExports.add(C1.reference);
-    libraryB2.additionalExports.add(C2.reference);
-
-    var outline1 = _newOutline([libraryA, libraryB1]);
-    var outline2 = _newOutline([libraryB2, libraryC]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryB = _getLibrary(result.program, 'b');
-      List<Reference> exports = libraryB.additionalExports;
-      expect(exports, unorderedEquals([C1.reference, C2.reference]));
-    });
-  }
-
-  void test_library_replaceReference() {
-    var libraryA1 = _newLibrary('a');
-
-    var libraryA2 = _newLibrary('a');
-
-    var libraryB = _newLibrary('b');
-    libraryB.dependencies.add(new LibraryDependency.import(libraryA2));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-
-      var libraryB = _getLibrary(result.program, 'b');
-      expect(libraryB.dependencies, hasLength(1));
-      expect(libraryB.dependencies[0].targetLibrary, libraryA);
-    });
-  }
-
-  void test_procedure_getter() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addProcedure(_newGetter('A'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addProcedure(_newGetter('B'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@getters');
-      _getProcedure(libraryA, 'B', '@getters');
-    });
-  }
-
-  void test_procedure_getter_skipDuplicate() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addProcedure(_newGetter('A'));
-    libraryA1.addProcedure(_newGetter('B'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addProcedure(_newGetter('A'));
-    libraryA2.addProcedure(_newGetter('C'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@getters');
-      _getProcedure(libraryA, 'B', '@getters');
-      _getProcedure(libraryA, 'C', '@getters');
-    });
-  }
-
-  void test_procedure_getter_updateReferences() {
-    var libraryA1 = _newLibrary('a');
-    var procedureA1A = _newGetter('A');
-    libraryA1.addProcedure(procedureA1A);
-
-    var libraryA2 = _newLibrary('a');
-    var procedureA2A = _newGetter('A');
-    libraryA2.addProcedure(procedureA2A);
-
-    var libraryB = _newLibrary('b');
-    libraryB.addProcedure(_newExpressionsProcedure([
-      new StaticGet(procedureA2A),
-    ]));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@getters');
-
-      var libraryB = _getLibrary(result.program, 'b');
-      var main = _getProcedure(libraryB, 'main', '@methods');
-      expect((_getProcedureExpression(main, 0) as StaticGet).targetReference,
-          same(procedureA1A.reference));
-    });
-  }
-
-  void test_procedure_method() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addProcedure(_newMethod('A'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addProcedure(_newMethod('B'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@methods');
-      _getProcedure(libraryA, 'B', '@methods');
-    });
-  }
-
-  void test_procedure_method_private_updateReferences() {
-    var libraryA1 = _newLibrary('a');
-    var procedureA1A = _newMethod('_A', libraryForPrivate: libraryA1);
-    libraryA1.addProcedure(procedureA1A);
-
-    var libraryA2 = _newLibrary('a');
-    var procedureA2A = _newMethod('_A', libraryForPrivate: libraryA2);
-    libraryA2.addProcedure(procedureA2A);
-
-    var libraryB = _newLibrary('b');
-    libraryB.addProcedure(_newExpressionsProcedure([
-      new StaticInvocation(procedureA2A, new Arguments.empty()),
-    ]));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, '_A', '@methods');
-
-      var libraryB = _getLibrary(result.program, 'b');
-      var main = _getProcedure(libraryB, 'main', '@methods');
-      expect(
-          (_getProcedureExpression(main, 0) as StaticInvocation)
-              .targetReference,
-          same(procedureA1A.reference));
-    });
-  }
-
-  void test_procedure_method_skipDuplicate() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addProcedure(_newMethod('A'));
-    libraryA1.addProcedure(_newMethod('B'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addProcedure(_newMethod('A'));
-    libraryA2.addProcedure(_newMethod('C'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@methods');
-      _getProcedure(libraryA, 'B', '@methods');
-      _getProcedure(libraryA, 'C', '@methods');
-    });
-  }
-
-  void test_procedure_method_updateReferences() {
-    var libraryA1 = _newLibrary('a');
-    var procedureA1A = _newMethod('A');
-    libraryA1.addProcedure(procedureA1A);
-
-    var libraryA2 = _newLibrary('a');
-    var procedureA2A = _newMethod('A');
-    libraryA2.addProcedure(procedureA2A);
-
-    var libraryB = _newLibrary('b');
-    libraryB.addProcedure(_newExpressionsProcedure([
-      new StaticInvocation(procedureA2A, new Arguments.empty()),
-    ]));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@methods');
-
-      var libraryB = _getLibrary(result.program, 'b');
-      var main = _getProcedure(libraryB, 'main', '@methods');
-      expect(
-          (_getProcedureExpression(main, 0) as StaticInvocation)
-              .targetReference,
-          same(procedureA1A.reference));
-    });
-  }
-
-  void test_procedure_setter() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addProcedure(_newSetter('A'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addProcedure(_newSetter('B'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@setters');
-      _getProcedure(libraryA, 'B', '@setters');
-    });
-  }
-
-  void test_procedure_setter_skipDuplicate() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addProcedure(_newSetter('A'));
-    libraryA1.addProcedure(_newSetter('B'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addProcedure(_newSetter('A'));
-    libraryA2.addProcedure(_newSetter('C'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@setters');
-      _getProcedure(libraryA, 'B', '@setters');
-      _getProcedure(libraryA, 'C', '@setters');
-    });
-  }
-
-  void test_procedure_setter_updateReferences() {
-    var libraryA1 = _newLibrary('a');
-    var procedureA1A = _newSetter('A');
-    libraryA1.addProcedure(procedureA1A);
-
-    var libraryA2 = _newLibrary('a');
-    var procedureA2A = _newSetter('A');
-    libraryA2.addProcedure(procedureA2A);
-
-    var libraryB = _newLibrary('b');
-    libraryB.addProcedure(_newExpressionsProcedure([
-      new StaticSet(procedureA2A, new IntLiteral(0)),
-    ]));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2, libraryB]);
-
-    _runCombineTest([outline1, outline2], (result) {
-      var libraryA = _getLibrary(result.program, 'a');
-      _getProcedure(libraryA, 'A', '@setters');
-
-      var libraryB = _getLibrary(result.program, 'b');
-      var main = _getProcedure(libraryB, 'main', '@methods');
-      expect((_getProcedureExpression(main, 0) as StaticSet).targetReference,
-          same(procedureA1A.reference));
-    });
-  }
-
-  void test_undo_twice() {
-    var libraryA1 = _newLibrary('a');
-    libraryA1.addField(_newField('A'));
-
-    var libraryA2 = _newLibrary('a');
-    libraryA2.addField(_newField('B'));
-
-    var outline1 = _newOutline([libraryA1]);
-    var outline2 = _newOutline([libraryA2]);
-
-    var result = combine([outline1, outline2]);
-    result.undo();
-    expect(() => result.undo(), throwsStateError);
-  }
-
-  /// Get a single [Class] with the given [name].
-  /// Throw if there is not exactly one.
-  Class _getClass(Library library, String name) {
-    var results = library.classes.where((class_) => class_.name == name);
-    expect(results, hasLength(1), reason: 'Expected only one: $name');
-    Class result = results.first;
-    expect(result.parent, library);
-    expect(result.canonicalName.parent, library.canonicalName);
-    return result;
-  }
-
-  /// Get a single [Field] with the given [name].
-  /// Throw if there is not exactly one.
-  Field _getField(NamedNode parent, String name) {
-    List<Field> fields;
-    if (parent is Library) {
-      fields = parent.fields;
-    } else if (parent is Class) {
-      fields = parent.fields;
-    } else {
-      throw new ArgumentError('Only Library or Class expected');
-    }
-
-    var results = fields.where((field) => field.name.name == name);
-    expect(results, hasLength(1), reason: 'Expected only one: $name');
-    Field result = results.first;
-    expect(result.parent, parent);
-    var parentName = parent.canonicalName.getChild('@fields');
-    expect(result.canonicalName.parent, parentName);
-    return result;
-  }
-
-  /// Get a single [Library] with the given [name].
-  /// Throw if there is not exactly one.
-  Library _getLibrary(Program program, String name) {
-    var results = program.libraries.where((library) => library.name == name);
-    expect(results, hasLength(1), reason: 'Expected only one: $name');
-    var result = results.first;
-    expect(result.parent, program);
-    expect(result.canonicalName.parent, program.root);
-    return result;
-  }
-
-  /// Get a single [Procedure] with the given [name].
-  /// Throw if there is not exactly one.
-  Procedure _getProcedure(NamedNode parent, String name, String prefixName) {
-    Library enclosingLibrary;
-    List<Procedure> procedures;
-    if (parent is Library) {
-      enclosingLibrary = parent;
-      procedures = parent.procedures;
-    } else if (parent is Class) {
-      enclosingLibrary = parent.enclosingLibrary;
-      procedures = parent.procedures;
-    } else {
-      throw new ArgumentError('Only Library or Class expected');
-    }
-
-    Iterable<Procedure> results =
-        procedures.where((procedure) => procedure.name.name == name);
-    expect(results, hasLength(1), reason: 'Expected only one: $name');
-    Procedure result = results.first;
-    expect(result.parent, parent);
-
-    var parentName = parent.canonicalName.getChild(prefixName);
-    if (name.startsWith('_')) {
-      parentName = parentName.getChildFromUri(enclosingLibrary.importUri);
-    }
-    expect(result.canonicalName.parent, parentName);
-
-    return result;
-  }
-
-  /// Return the [Expression] in the [index]th statement of the [procedure]'s
-  /// block body.
-  Expression _getProcedureExpression(Procedure procedure, int index) {
-    Block mainBlock = procedure.function.body;
-    ExpressionStatement statement = mainBlock.statements[index];
-    return statement.expression;
-  }
-
-  Constructor _newConstructor(String name, {Statement body}) {
-    body ??= new EmptyStatement();
-    return new Constructor(new FunctionNode(body), name: new Name(name));
-  }
-
-  Procedure _newExpressionsProcedure(List<Expression> expressions,
-      {String name: 'main'}) {
-    var statements =
-        expressions.map((e) => new ExpressionStatement(e)).toList();
-    return new Procedure(new Name(name), ProcedureKind.Method,
-        new FunctionNode(new Block(statements)));
-  }
-
-  Field _newField(String name, {DartType type}) {
-    type ??= const DynamicType();
-    return new Field(new Name(name), type: type);
-  }
-
-  Procedure _newGetter(String name) {
-    return new Procedure(new Name(name), ProcedureKind.Getter,
-        new FunctionNode(new ExpressionStatement(new IntLiteral((0)))));
-  }
-
-  Library _newLibrary(String name) {
-    var uri = Uri.parse('org-dartlang:///$name.dart');
-    return new Library(uri, name: name);
-  }
-
-  Procedure _newMethod(String name,
-      {Statement body, Library libraryForPrivate}) {
-    body ??= new EmptyStatement();
-    return new Procedure(new Name(name, libraryForPrivate),
-        ProcedureKind.Method, new FunctionNode(body));
-  }
-
-  Program _newOutline(List<Library> libraries) {
-    var outline = new Program(libraries: libraries);
-    outline.computeCanonicalNames();
-    return outline;
-  }
-
-  Procedure _newSetter(String name) {
-    return new Procedure(
-        new Name(name),
-        ProcedureKind.Setter,
-        new FunctionNode(new EmptyStatement(),
-            positionalParameters: [new VariableDeclaration('_')]));
-  }
-
-  TypeParameter _newTypeParameter(String name) {
-    var bound = new InterfaceType(coreTypes.objectClass);
-    return new TypeParameter(name, bound);
-  }
-
-  void _runCombineTest(
-      List<Program> outlines, void checkResult(CombineResult result)) {
-    // Store the original state.
-    var states = <Program, _OutlineState>{};
-    for (var outline in outlines) {
-      states[outline] = new _OutlineState(outline);
-    }
-
-    // Combine the outlines and check the result.
-    var result = combine(outlines);
-    checkResult(result);
-
-    // Undo and verify that the state is the same as the original.
-    result.undo();
-    states.forEach((outline, state) {
-      state.verifySame();
-    });
-  }
-
-  /// Produces all declarations of the [library].
-  static Iterable<NamedNode> _getLibraryDeclarations(Library library) sync* {
-    yield* library.classes;
-    yield* library.procedures;
-    yield* library.fields;
-  }
-
-  /// Return the text presentation of the [library] that is not a normal Kernel
-  /// AST text, but includes portions that we want to test - declarations
-  /// and references.  The map [nodeToName] must have entries for all
-  /// referenced nodes, other declarations are optional.
-  static String _getLibraryText(
-      Library library, Map<TreeNode, String> nodeToName) {
-    var buffer = new StringBuffer();
-
-    String getNodeName(TreeNode node, {bool required: false}) {
-      String name = nodeToName[node];
-      if (name != null) {
-        return '[$name]';
-      } else {
-        if (required) {
-          fail('The name is required for (${node.runtimeType}) $node');
-        }
-        return '';
-      }
-    }
-
-    void writeType(DartType type) {
-      if (type is InterfaceType) {
-        String name = getNodeName(type.classNode);
-        buffer.write('${type.classNode.name}$name');
-      } else if (type is TypeParameterType) {
-        String name = getNodeName(type.parameter);
-        buffer.write('${type.parameter.name}$name');
-      } else {
-        throw new UnimplementedError('(${type.runtimeType}) $type');
-      }
-    }
-
-    void writeStatement(Statement node, String indent) {
-      if (node is ExpressionStatement) {
-        Expression expression = node.expression;
-        String prefix = expression.runtimeType.toString();
-        Member target;
-        if (expression is ConstructorInvocation) {
-          target = expression.target;
-        } else if (expression is DirectMethodInvocation) {
-          target = expression.target;
-        } else if (expression is DirectPropertyGet) {
-          target = expression.target;
-        } else if (expression is DirectPropertySet) {
-          target = expression.target;
-        } else if (expression is MethodInvocation) {
-          target = expression.interfaceTarget;
-        } else if (expression is PropertyGet) {
-          target = expression.interfaceTarget;
-        } else if (expression is PropertySet) {
-          target = expression.interfaceTarget;
-        } else if (expression is SuperMethodInvocation) {
-          target = expression.interfaceTarget;
-        } else if (expression is SuperPropertyGet) {
-          target = expression.interfaceTarget;
-        } else if (expression is SuperPropertySet) {
-          target = expression.interfaceTarget;
-        } else {
-          var type = expression.runtimeType;
-          fail('Unsupported expression: $type');
-        }
-        String name = getNodeName(target, required: true);
-        buffer.writeln('$indent$prefix$name();');
-      } else {
-        fail('Unsupported statement: (${node.runtimeType}) $node');
-      }
-    }
-
-    void writeBody(Statement body, String indent) {
-      if (body is EmptyStatement) {
-        buffer.writeln(';');
-      } else if (body is Block) {
-        buffer.write(' {');
-        if (body.statements.isNotEmpty) {
-          buffer.writeln();
-          for (var statement in body.statements) {
-            writeStatement(statement, '$indent  ');
-          }
-          buffer.writeln('$indent}');
-        } else {
-          buffer.writeln('}');
-        }
-      } else if (body is ExpressionStatement) {
-        buffer.write(' => ');
-        Expression expression = body.expression;
-        if (expression is IntLiteral) {
-          buffer.write(expression);
-        } else {
-          fail('Not implemented ${expression.runtimeType}');
-        }
-        buffer.writeln(';');
-      } else {
-        fail('Not implemented ${body.runtimeType}');
-      }
-    }
-
-    void writeField(Field node, String indent) {
-      buffer.write(indent);
-      String name = getNodeName(node, required: true);
-      if (node.type is DynamicType) {
-        buffer.write('var');
-      } else {
-        writeType(node.type);
-      }
-      buffer.writeln(' ${node.name}$name;');
-    }
-
-    void writeInitializer(Initializer node, String indent) {
-      String kind;
-      Constructor target;
-      if (node is RedirectingInitializer) {
-        kind = 'redirect';
-        target = node.target;
-      } else if (node is SuperInitializer) {
-        kind = 'super';
-        target = node.target;
-      } else {
-        fail('Not implemented ${node.runtimeType}');
-      }
-      String name = getNodeName(target, required: true);
-      buffer.write('${indent}${kind}$name()');
-    }
-
-    void writeConstructor(Constructor node, String indent) {
-      String name = getNodeName(node);
-      buffer.write('${indent}constructor ${node.name}$name()');
-      List<Initializer> initializers = node.initializers;
-      if (initializers.isNotEmpty) {
-        buffer.writeln(' :');
-        for (int i = 0; i < initializers.length; i++) {
-          Initializer initializer = initializers[i];
-          writeInitializer(initializer, '      ');
-          if (i != initializers.length - 1) {
-            buffer.writeln(',');
-          }
-        }
-      }
-      writeBody(node.function.body, indent);
-    }
-
-    void writeProcedure(NamedNode parent, Procedure node, String indent) {
-      String prefixName;
-      String kindStr;
-      ProcedureKind kind = node.kind;
-      if (kind == ProcedureKind.Method) {
-        prefixName = '@methods';
-        kindStr = '';
-      } else if (kind == ProcedureKind.Getter) {
-        prefixName = '@getters';
-        kindStr = 'get ';
-      } else if (kind == ProcedureKind.Setter) {
-        prefixName = '@setters';
-        kindStr = 'set ';
-      } else {
-        fail('Unsupported kind: $kind');
-      }
-
-      // Verify canonical names linkage.
-      var parentName = parent.canonicalName.getChild(prefixName);
-      expect(node.canonicalName.parent, parentName);
-
-      String nodeName = getNodeName(node);
-      buffer.write('$indent$kindStr${node.name}$nodeName');
-      if (kind != ProcedureKind.Getter) {
-        buffer.write('()');
-      }
-      writeBody(node.function.body, indent);
-    }
-
-    void writeSupertype(Supertype supertype) {
-      expect(supertype.typeArguments, isEmpty);
-      var clazz = supertype.classNode;
-      String name = getNodeName(clazz, required: true);
-      buffer.write('${clazz.name}$name');
-    }
-
-    void writeClass(Class node) {
-      String nodeName = getNodeName(node);
-      buffer.write('class ${node.name}$nodeName');
-
-      if (node.typeParameters.isNotEmpty) {
-        buffer.write('<');
-        for (var i = 0; i < node.typeParameters.length; i++) {
-          if (i != 0) {
-            buffer.write(', ');
-          }
-          TypeParameter typeParameter = node.typeParameters[i];
-          String name = getNodeName(typeParameter, required: true);
-          buffer.write('${typeParameter.name}$name');
-          if (typeParameter.bound != null) {
-            var bound = typeParameter.bound as InterfaceType;
-            if (bound.classNode.name != 'Object') {
-              buffer.write(' extends ');
-              writeType(typeParameter.bound);
-            }
-          }
-        }
-        buffer.write('>');
-      }
-
-      {
-        var superType = node.supertype;
-        var superClassName = superType.classNode.name;
-        if (superClassName != 'Object') {
-          buffer.write(' extends ');
-          writeSupertype(superType);
-        }
-
-        if (node.implementedTypes.isNotEmpty) {
-          buffer.write(' implements ');
-          for (var i = 0; i < node.implementedTypes.length; i++) {
-            if (i != 0) {
-              buffer.write(', ');
-            }
-            writeSupertype(node.implementedTypes[i]);
-          }
-        }
-
-        Supertype mixedInType = node.mixedInType;
-        if (mixedInType != null) {
-          buffer.write(' with ');
-          writeSupertype(mixedInType);
-        }
-      }
-
-      buffer.write(' {');
-
-      if (!node.members.isEmpty) {
-        buffer.writeln();
-        for (var field in node.fields) {
-          writeField(field, '  ');
-        }
-        for (var constructor in node.constructors) {
-          writeConstructor(constructor, '  ');
-        }
-        for (var procedure in node.procedures) {
-          writeProcedure(node, procedure, '  ');
-        }
-      }
-      buffer.writeln('}');
-    }
-
-    for (var node in library.fields) {
-      writeField(node, '');
-    }
-
-    for (var node in library.classes) {
-      writeClass(node);
-    }
-
-    for (var node in library.procedures) {
-      writeProcedure(library, node, '');
-    }
-
-    return buffer.toString();
-  }
-}
-
-/// The original state of an outline, and code that validates that after some
-/// manipulations (e.g. combine and undo) the state stays the same.
-class _OutlineState {
-  final Program outline;
-  final initialCollector = new _StateCollector();
-
-  _OutlineState(this.outline) {
-    outline.accept(initialCollector);
-  }
-
-  void verifySame() {
-    var collector = new _StateCollector();
-    outline.accept(collector);
-    expect(collector.nodes, initialCollector.nodes);
-    expect(collector.references, initialCollector.references);
-    expect(collector.typeParameters, initialCollector.typeParameters);
-    initialCollector.libraryParents.forEach((library, outline) {
-      expect(library.canonicalName.parent, outline.root);
-      expect(library.parent, outline);
-    });
-    initialCollector.nodeParents.forEach((child, parent) {
-      expect(child.parent, parent);
-      if (child is Member) {
-        var qualifier = CanonicalName.getMemberQualifier(child);
-        var parentName = parent.canonicalName.getChild(qualifier);
-        if (child.name.isPrivate) {
-          var libraryUri = child.enclosingLibrary.importUri;
-          parentName = parentName.getChildFromUri(libraryUri);
-        }
-        expect(child.canonicalName.parent, parentName);
-      } else {
-        expect(child.canonicalName.parent, parent.canonicalName);
-      }
-    });
-  }
-}
-
-class _StateCollector extends RecursiveVisitor {
-  final List<Node> nodes = [];
-  final Map<NamedNode, NamedNode> nodeParents = {};
-  final Map<Library, Program> libraryParents = {};
-  final List<Reference> references = [];
-  final List<TypeParameter> typeParameters = [];
-
-  @override
-  void defaultMemberReference(Member node) {
-    references.add(node.reference);
-  }
-
-  @override
-  void defaultNode(Node node) {
-    nodes.add(node);
-    if (node is Library) {
-      libraryParents[node] = node.parent as Program;
-    } else if (node is NamedNode) {
-      nodeParents[node] = node.parent as NamedNode;
-    }
-    super.defaultNode(node);
-  }
-
-  @override
-  void visitClassReference(Class node) {
-    references.add(node.reference);
-  }
-
-  @override
-  visitLibrary(Library node) {
-    references.addAll(node.additionalExports);
-    super.visitLibrary(node);
-  }
-
-  @override
-  visitLibraryDependency(LibraryDependency node) {
-    references.add(node.importedLibraryReference);
-    super.visitLibraryDependency(node);
-  }
-
-  @override
-  void visitTypedefReference(Typedef node) {
-    references.add(node.reference);
-  }
-
-  @override
-  void visitTypeParameterType(TypeParameterType node) {
-    typeParameters.add(node.parameter);
-  }
-}
diff --git a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart b/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
index a9cbc0b..9b33737 100644
--- a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
@@ -7,23 +7,41 @@
 /// reload on the running program.
 library front_end.incremental.hot_reload_e2e_test;
 
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
+import 'dart:async' show Completer, Future;
 
-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/api_prototype/incremental_kernel_generator.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/testing/hybrid_file_system.dart';
-import 'package:kernel/ast.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
-import 'package:test/test.dart';
+import 'dart:convert' show LineSplitter, UTF8;
 
-import '../../tool/reload.dart';
+import 'dart:io' show Directory, File, Platform, Process;
 
-main() {
+import 'package:async_helper/async_helper.dart' show asyncTest;
+
+import 'package:expect/expect.dart' show Expect;
+
+import 'package:kernel/ast.dart' show Program;
+
+import 'package:kernel/binary/limited_ast_to_binary.dart'
+    show LimitedBinaryPrinter;
+
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions;
+
+import 'package:front_end/src/api_prototype/file_system.dart' show FileSystem;
+
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalKernelGenerator;
+
+import 'package:front_end/src/api_prototype/memory_file_system.dart'
+    show MemoryFileSystem;
+
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+import 'package:front_end/src/testing/hybrid_file_system.dart'
+    show HybridFileSystem;
+
+import '../../tool/reload.dart' show RemoteVm;
+
+abstract class TestCase {
   IncrementalKernelGenerator compiler;
   MemoryFileSystem fs;
   Directory outDir;
@@ -31,7 +49,21 @@
   List<Future<String>> lines;
   Future programIsDone;
 
-  setUp(() async {
+  String get name;
+
+  Future run();
+
+  Future test() async {
+    await setUp();
+    try {
+      await run();
+      print("$name done");
+    } finally {
+      await tearDown();
+    }
+  }
+
+  setUp() async {
     outDir = Directory.systemTemp.createTempSync('hotreload_test');
     outputUri = outDir.uri.resolve('test.dill');
     var root = Uri.parse('org-dartlang-test:///');
@@ -40,20 +72,19 @@
     writeFile(fs, 'a.dart', sourceA);
     writeFile(fs, 'b.dart', sourceB);
     writeFile(fs, '.packages', '');
-    compiler = await createIncrementalCompiler(
+    compiler = createIncrementalCompiler(
         'org-dartlang-test:///a.dart', new HybridFileSystem(fs));
     await rebuild(compiler, outputUri); // this is a full compile.
-    compiler.acceptLastDelta();
-  });
+  }
 
-  tearDown(() async {
+  tearDown() async {
     outDir.deleteSync(recursive: true);
     lines = null;
-  });
+  }
 
   Future<int> computeVmPort() async {
     var portLine = await lines[0];
-    expect(observatoryPortRegExp.hasMatch(portLine), isTrue);
+    Expect.isTrue(observatoryPortRegExp.hasMatch(portLine));
     var match = observatoryPortRegExp.firstMatch(portLine);
     return int.parse(match.group(1));
   }
@@ -71,7 +102,7 @@
     var vmArgs = [
       '--enable-vm-service=0', // Note: use 0 to avoid port collisions.
       '--pause_isolates_on_start',
-      '--kernel-binaries=${dartVm.resolve(".").toFilePath()}',
+      '--kernel-binaries=${sdkRoot.toFilePath()}',
       outputUri.toFilePath()
     ];
     vmArgs.add('$reloadCount');
@@ -88,14 +119,14 @@
         new List.generate(expectedLines, (_) => new Completer<String>());
     lines = completers.map((c) => c.future).toList();
     vm.stdout.transform(UTF8.decoder).transform(splitter).listen((line) {
-      expect(i, lessThan(expectedLines));
+      Expect.isTrue(i < expectedLines);
       completers[i++].complete(line);
     }, onDone: () {
-      expect(i, expectedLines);
+      Expect.equals(expectedLines, i);
     });
 
     vm.stderr.transform(UTF8.decoder).transform(splitter).toList().then((err) {
-      expect(err, isEmpty, reason: err.join('\n'));
+      Expect.isTrue(err.isEmpty, err.join('\n'));
     });
 
     programIsDone = vm.exitCode;
@@ -107,89 +138,126 @@
     var port = await computeVmPort();
     var remoteVm = new RemoteVm(port);
     var reloadResult = await remoteVm.reload(outputUri);
-    expect(reloadResult['success'], isTrue);
-    compiler.acceptLastDelta();
+    Expect.isTrue(reloadResult['success']);
     await remoteVm.disconnect();
   }
+}
 
-  test('initial program is valid', () async {
+class InitialProgramIsValid extends TestCase {
+  @override
+  String get name => 'initial program is valid';
+
+  @override
+  Future run() async {
     await startProgram(0);
     await programIsDone;
-    expect(await lines[1], "part1 part2");
-  });
+    Expect.stringEquals("part1 part2", await lines[1]);
+  }
+}
 
-  test('reload after leaf library modification', () async {
+class ReloadAfterLeafLibraryModification extends TestCase {
+  @override
+  String get name => 'reload after leaf library modification';
+
+  @override
+  Future run() async {
     await startProgram(1);
-    expect(await lines[1], "part1 part2");
+    Expect.stringEquals("part1 part2", await lines[1]);
 
     writeFile(fs, 'b.dart', sourceB.replaceAll("part1", "part3"));
     await rebuild(compiler, outputUri);
     await hotReload();
     await programIsDone;
-    expect(await lines[2], "part3 part2");
-  });
+    Expect.stringEquals("part3 part2", await lines[2]);
+  }
+}
 
-  test('reload after non-leaf library modification', () async {
+class ReloadAfterNonLeafLibraryModification extends TestCase {
+  @override
+  String get name => "reload after non-leaf library modification";
+
+  @override
+  Future run() async {
     await startProgram(1);
-    expect(await lines[1], "part1 part2");
+    Expect.stringEquals("part1 part2", await lines[1]);
 
     writeFile(fs, 'a.dart', sourceA.replaceAll("part2", "part4"));
     await rebuild(compiler, outputUri);
     await hotReload();
     await programIsDone;
-    expect(await lines[2], "part1 part4");
-  });
+    Expect.stringEquals("part1 part4", await lines[2]);
+  }
+}
 
-  test('reload after whole program modification', () async {
+class ReloadAfterWholeProgramModification extends TestCase {
+  @override
+  String get name => "reload after whole program modification";
+
+  @override
+  Future run() async {
     await startProgram(1);
-    expect(await lines[1], "part1 part2");
+    Expect.stringEquals("part1 part2", await lines[1]);
 
     writeFile(fs, 'b.dart', sourceB.replaceAll("part1", "part5"));
     writeFile(fs, 'a.dart', sourceA.replaceAll("part2", "part6"));
     await rebuild(compiler, outputUri);
     await hotReload();
     await programIsDone;
-    expect(await lines[2], "part5 part6");
-  });
+    Expect.stringEquals("part5 part6", await lines[2]);
+  }
+}
 
-  test('reload twice', () async {
+class ReloadTwice extends TestCase {
+  @override
+  String get name => "reload twice";
+
+  @override
+  Future run() async {
     await startProgram(2);
-    expect(await lines[1], "part1 part2");
+    Expect.stringEquals("part1 part2", await lines[1]);
 
     writeFile(fs, 'b.dart', sourceB.replaceAll("part1", "part5"));
     writeFile(fs, 'a.dart', sourceA.replaceAll("part2", "part6"));
     await rebuild(compiler, outputUri);
     await hotReload();
-    expect(await lines[2], "part5 part6");
+    Expect.stringEquals("part5 part6", await lines[2]);
 
     writeFile(fs, 'b.dart', sourceB.replaceAll("part1", "part7"));
     writeFile(fs, 'a.dart', sourceA.replaceAll("part2", "part8"));
     await rebuild(compiler, outputUri);
     await hotReload();
     await programIsDone;
-    expect(await lines[3], "part7 part8");
+    Expect.stringEquals("part7 part8", await lines[3]);
+  }
+}
+
+main() {
+  asyncTest(() async {
+    await new InitialProgramIsValid().test();
+    await new ReloadAfterLeafLibraryModification().test();
+    await new ReloadAfterNonLeafLibraryModification().test();
+    await new ReloadAfterWholeProgramModification().test();
+    await new ReloadTwice().test();
   });
 }
 
-var dartVm = Uri.base.resolve(Platform.resolvedExecutable);
-var sdkRoot = dartVm.resolve("patched_sdk/");
+final Uri sdkRoot = computePlatformBinariesLocation();
 
-Future<IncrementalKernelGenerator> createIncrementalCompiler(
+IncrementalKernelGenerator createIncrementalCompiler(
     String entry, FileSystem fs) {
   var entryUri = Uri.base.resolve(entry);
   var options = new CompilerOptions()
     ..sdkRoot = sdkRoot
+    ..librariesSpecificationUri = Uri.base.resolve("sdk/lib/libraries.json")
     ..strongMode = false
-    ..compileSdk = true // the incremental generator requires the sdk sources
-    ..fileSystem = fs
-    ..byteStore = new MemoryByteStore();
-  return IncrementalKernelGenerator.newInstance(options, entryUri);
+    ..fileSystem = fs;
+  return new IncrementalKernelGenerator(options, entryUri);
 }
 
 Future<bool> rebuild(IncrementalKernelGenerator compiler, Uri outputUri) async {
   compiler.invalidate(Uri.parse("org-dartlang-test:///a.dart"));
   compiler.invalidate(Uri.parse("org-dartlang-test:///b.dart"));
-  var program = (await compiler.computeDelta()).newProgram;
+  var program = await compiler.computeDelta();
   if (program != null && !program.libraries.isEmpty) {
     await writeProgram(program, outputUri);
     return true;
diff --git a/pkg/front_end/test/src/incremental/test_all.dart b/pkg/front_end/test/src/incremental/test_all.dart
index 2c05067..3e611d9 100644
--- a/pkg/front_end/test/src/incremental/test_all.dart
+++ b/pkg/front_end/test/src/incremental/test_all.dart
@@ -4,7 +4,6 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'combine_test.dart' as combine_test;
 import 'file_state_test.dart' as file_state;
 import 'format_test.dart' as format;
 import 'kernel_driver_test.dart' as kernel_driver;
@@ -12,7 +11,6 @@
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
-    combine_test.main();
     file_state.main();
     format.main();
     kernel_driver.main();
diff --git a/pkg/front_end/test/subpackage_relationships_test.dart b/pkg/front_end/test/subpackage_relationships_test.dart
index e8331ad..a0bc923 100644
--- a/pkg/front_end/test/subpackage_relationships_test.dart
+++ b/pkg/front_end/test/subpackage_relationships_test.dart
@@ -43,7 +43,6 @@
     "lib/src/fasta/dill",
     "lib/src/fasta/kernel",
     'lib/src/fasta/source',
-    'lib/src/incremental',
   ]),
   'lib/src/api_prototype': new SubpackageRules(allowedDependencies: [
     'lib/src',
@@ -161,6 +160,7 @@
     'lib/src/fasta/scanner',
   ]),
   'lib/src/testing': new SubpackageRules(allowedDependencies: [
+    'lib/src',
     'lib/src/api_prototype',
   ]),
 };
diff --git a/pkg/front_end/test/whole_program_test.dart b/pkg/front_end/test/whole_program_test.dart
index d75f25e..6261229 100644
--- a/pkg/front_end/test/whole_program_test.dart
+++ b/pkg/front_end/test/whole_program_test.dart
@@ -8,6 +8,9 @@
 import 'package:async_helper/async_helper.dart' show asyncEnd, asyncStart;
 import 'package:testing/testing.dart' show StdioProcess;
 
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
 final Uri compiler = Uri.base.resolve('pkg/front_end/tool/_fasta/compile.dart');
 
 final Uri transform = Uri.base.resolve('pkg/kernel/bin/transform.dart');
@@ -15,7 +18,8 @@
 
 final Uri packagesFile = Uri.base.resolve('.packages');
 
-final Uri dartVm = Uri.base.resolve(Platform.resolvedExecutable);
+final Uri dartVm =
+    Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
 
 Future main() async {
   asyncStart();
@@ -47,14 +51,14 @@
 }
 
 Future runCompiler(Uri input, Uri output) async {
-  final buildDir = Uri.base.resolve(Platform.resolvedExecutable).resolve(".");
-  final platformDill = buildDir.resolve("vm_platform.dill").toFilePath();
+  final Uri platformDill =
+      computePlatformBinariesLocation().resolve("vm_platform.dill");
 
   final List<String> arguments = <String>[
     '--packages=${packagesFile.toFilePath()}',
     '-c',
     compiler.toFilePath(),
-    '--platform=$platformDill',
+    '--platform=${platformDill.toFilePath()}',
     '--output=${output.toFilePath()}',
     '--packages=${packagesFile.toFilePath()}',
     '--verify',
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index 8ce4a34..b86de60 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -145,3 +145,4 @@
 type_variable_as_super: Crash
 uninitialized_fields: Crash
 warn_unresolved_sends: Fail
+minimum_int: Crash
diff --git a/pkg/front_end/testcases/dartino/compile_time_error_004.incremental.yaml b/pkg/front_end/testcases/dartino/compile_time_error_004.incremental.yaml
index 679d2ad..704352a 100644
--- a/pkg/front_end/testcases/dartino/compile_time_error_004.incremental.yaml
+++ b/pkg/front_end/testcases/dartino/compile_time_error_004.incremental.yaml
@@ -6,7 +6,7 @@
   // Reproduce a crash when a class has a bad hierarchy
   <<<< {"messages":[],"hasCompileTimeError":1}
   typedef A(C c);
-  ==== {"messages":[],"hasCompileTimeError":1}
+  ==== []
   typedef A(Class c);
   >>>>
 
diff --git a/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml b/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml
index 455ddcc..59d245c 100644
--- a/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml
+++ b/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml
@@ -8,11 +8,9 @@
   class C {
   <<<< {"messages":[],"hasCompileTimeError":1}
     int sync*;
-  ==== {"messages":[],"hasCompileTimeError":1}
-    // TODO(ahe): Should just expect [], no compile-time error
+  ==== []
     sync();
-  ==== {"messages":[],"hasCompileTimeError":1}
-    // TODO(ahe): Should just expect [], no compile-time error
+  ==== []
   >>>>
   }
   main() {
diff --git a/pkg/front_end/testcases/dartino/fix_compile_time_error_in_field.incremental.yaml b/pkg/front_end/testcases/dartino/fix_compile_time_error_in_field.incremental.yaml
index 962e844..25bc1ad 100644
--- a/pkg/front_end/testcases/dartino/fix_compile_time_error_in_field.incremental.yaml
+++ b/pkg/front_end/testcases/dartino/fix_compile_time_error_in_field.incremental.yaml
@@ -9,8 +9,7 @@
   class C {
   <<<< {"messages":[],"hasCompileTimeError":1}
     int sync*;
-  ==== {"messages":[],"hasCompileTimeError":1}
-    // TODO(ahe): There's no compile-time error here
+  ==== []
     int sync;
   >>>>
   }
diff --git a/pkg/front_end/testcases/incremental.status b/pkg/front_end/testcases/incremental.status
index c572cda..f14d52e 100644
--- a/pkg/front_end/testcases/incremental.status
+++ b/pkg/front_end/testcases/incremental.status
@@ -4,4 +4,7 @@
 
 # Status file for the test suite ../test/fasta/incremental_test.dart.
 
-dartino/change_in_part.incremental: Crash # Parts aren't handled correctly
+dartino/override_field_with_method_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
+dartino/override_getter_with_method_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
+dartino/override_method_with_field_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
+dartino/override_method_with_getter_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
diff --git a/pkg/front_end/testcases/inference/async_await.dart b/pkg/front_end/testcases/inference/async_await.dart
new file mode 100644
index 0000000..4ebadb0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_await.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*@testedFeatures=inference*/
+library test;
+
+import 'dart:async';
+
+abstract class MyFuture implements Future<int> {}
+
+void test() async {
+  int x0;
+  Future<int> x1;
+  Future<Future<int>> x2;
+  Future<FutureOr<int>> x3;
+  Future<MyFuture> x4;
+  FutureOr<int> x5;
+  FutureOr<Future<int>> x6;
+  FutureOr<FutureOr<int>> x7;
+  FutureOr<MyFuture> x8;
+  MyFuture x9;
+
+  /*@returnType=Future<int>*/ test0() async => x0;
+  /*@returnType=Future<int>*/ test1() async => x1;
+  /*@returnType=Future<Future<int>>*/ test2() async => x2;
+  /*@returnType=Future<FutureOr<int>>*/ test3() async => x3;
+  /*@returnType=Future<MyFuture>*/ test4() async => x4;
+  /*@returnType=Future<int>*/ test5() async => x5;
+  /*@returnType=Future<Future<int>>*/ test6() async => x6;
+  /*@returnType=Future<FutureOr<int>>*/ test7() async => x7;
+  /*@returnType=Future<MyFuture>*/ test8() async => x8;
+  /*@returnType=Future<int>*/ test9() async => x9;
+
+  var /*@type=int*/ y0 = await x0;
+  var /*@type=int*/ y1 = await x1;
+  var /*@type=Future<int>*/ y2 = await x2;
+  var /*@type=FutureOr<int>*/ y3 = await x3;
+  var /*@type=MyFuture*/ y4 = await x4;
+  var /*@type=int*/ y5 = await x5;
+  var /*@type=Future<int>*/ y6 = await x6;
+  var /*@type=FutureOr<int>*/ y7 = await x7;
+  var /*@type=MyFuture*/ y8 = await x8;
+  var /*@type=int*/ y9 = await x9;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.expect
new file mode 100644
index 0000000..5b1671c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyFuture extends core::Object implements asy::Future<core::int> {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method test() → void async {
+  core::int x0;
+  asy::Future<core::int> x1;
+  asy::Future<asy::Future<core::int>> x2;
+  asy::Future<asy::FutureOr<core::int>> x3;
+  asy::Future<self::MyFuture> x4;
+  asy::FutureOr<core::int> x5;
+  asy::FutureOr<asy::Future<core::int>> x6;
+  asy::FutureOr<asy::FutureOr<core::int>> x7;
+  asy::FutureOr<self::MyFuture> x8;
+  self::MyFuture x9;
+  function test0() → dynamic async 
+    return x0;
+  function test1() → dynamic async 
+    return x1;
+  function test2() → dynamic async 
+    return x2;
+  function test3() → dynamic async 
+    return x3;
+  function test4() → dynamic async 
+    return x4;
+  function test5() → dynamic async 
+    return x5;
+  function test6() → dynamic async 
+    return x6;
+  function test7() → dynamic async 
+    return x7;
+  function test8() → dynamic async 
+    return x8;
+  function test9() → dynamic async 
+    return x9;
+  dynamic y0 = await x0;
+  dynamic y1 = await x1;
+  dynamic y2 = await x2;
+  dynamic y3 = await x3;
+  dynamic y4 = await x4;
+  dynamic y5 = await x5;
+  dynamic y6 = await x6;
+  dynamic y7 = await x7;
+  dynamic y8 = await x8;
+  dynamic y9 = await x9;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.outline.expect b/pkg/front_end/testcases/inference/async_await.dart.outline.expect
new file mode 100644
index 0000000..6da6f07
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_await.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyFuture extends core::Object implements asy::Future<core::int> {
+  default constructor •() → void
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.expect
new file mode 100644
index 0000000..a9e76dd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.expect
@@ -0,0 +1,54 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyFuture extends core::Object implements asy::Future<core::int> {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<core::int> onTimeout}) → asy::Future<core::int>;
+}
+static method test() → void async {
+  core::int x0;
+  asy::Future<core::int> x1;
+  asy::Future<asy::Future<core::int>> x2;
+  asy::Future<asy::FutureOr<core::int>> x3;
+  asy::Future<self::MyFuture> x4;
+  asy::FutureOr<core::int> x5;
+  asy::FutureOr<asy::Future<core::int>> x6;
+  asy::FutureOr<asy::FutureOr<core::int>> x7;
+  asy::FutureOr<self::MyFuture> x8;
+  self::MyFuture x9;
+  function test0() → asy::Future<core::int> async 
+    return x0;
+  function test1() → asy::Future<core::int> async 
+    return x1;
+  function test2() → asy::Future<asy::Future<core::int>> async 
+    return x2;
+  function test3() → asy::Future<asy::FutureOr<core::int>> async 
+    return x3;
+  function test4() → asy::Future<self::MyFuture> async 
+    return x4;
+  function test5() → asy::Future<core::int> async 
+    return x5;
+  function test6() → asy::Future<asy::Future<core::int>> async 
+    return x6;
+  function test7() → asy::Future<asy::FutureOr<core::int>> async 
+    return x7;
+  function test8() → asy::Future<self::MyFuture> async 
+    return x8;
+  function test9() → asy::Future<core::int> async 
+    return x9;
+  core::int y0 = await x0;
+  core::int y1 = await x1;
+  asy::Future<core::int> y2 = await x2;
+  asy::FutureOr<core::int> y3 = await x3;
+  self::MyFuture y4 = await x4;
+  core::int y5 = await x5;
+  asy::Future<core::int> y6 = await x6;
+  asy::FutureOr<core::int> y7 = await x7;
+  self::MyFuture y8 = await x8;
+  core::int y9 = await x9;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
index 9360f52..2417d16 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
@@ -7,6 +7,6 @@
   return x;
 static method test() → dynamic async {
   asy::Future<core::String> f;
-  core::String s = await self::id<asy::FutureOr<core::String>>(f) as{TypeError} core::String;
+  core::String s = await self::id<asy::FutureOr<core::String>>(f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart
new file mode 100644
index 0000000..6f16f85
--- /dev/null
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart
@@ -0,0 +1,20 @@
+// 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;
+
+class C {
+  dynamic operator []=(dynamic index, dynamic value) {}
+}
+
+abstract class I {
+  void operator []=(dynamic index, dynamic value) {}
+}
+
+class D extends C implements I {
+  operator /*@topType=void*/ []=(dynamic index, dynamic value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect
new file mode 100644
index 0000000..0403a8c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  operator []=(dynamic index, dynamic value) → dynamic {}
+}
+abstract class I extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  operator []=(dynamic index, dynamic value) → void {}
+}
+class D extends self::C implements self::I {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  operator []=(dynamic index, dynamic value) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
new file mode 100644
index 0000000..f58b066
--- /dev/null
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  operator []=(dynamic index, dynamic value) → dynamic
+    ;
+}
+abstract class I extends core::Object {
+  default constructor •() → void
+    ;
+  operator []=(dynamic index, dynamic value) → void
+    ;
+}
+class D extends self::C implements self::I {
+  default constructor •() → void
+    ;
+  operator []=(dynamic index, dynamic value) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
new file mode 100644
index 0000000..33a26ff
--- /dev/null
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  operator []=(dynamic index, dynamic value) → dynamic {}
+}
+abstract class I extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  operator []=(dynamic index, dynamic value) → void {}
+}
+class D extends self::C implements self::I {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  operator []=(dynamic index, dynamic value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart
new file mode 100644
index 0000000..9ce7fd2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.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 test checks that instantiate to bound provides missing type arguments to
+// raw interface types found in bodies of methods in cases where those types
+// refer to classes imported from compiled dill files.
+
+import 'dart:collection';
+
+class A {
+  foo() {
+    LinkedListEntry bar;
+  }
+}
+
+main() {
+  LinkedListEntry bar;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect
new file mode 100644
index 0000000..7d5f090
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
+  }
+}
+static method main() → dynamic {
+  col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart
new file mode 100644
index 0000000..a97c04f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.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 test checks that instantiate to bound provides type arguments to raw
+// interface types that are themselves used as type arguments of literal lists
+// found in method bodies.
+
+class A<T extends num> {}
+
+class B {
+  foo() {
+    var a = <A>[];
+  }
+}
+
+main() {
+  var a = <A>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
new file mode 100644
index 0000000..5ee4f7e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
@@ -0,0 +1,20 @@
+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() → dynamic {
+    core::List<self::A<core::num>> a = <self::A<core::num>>[];
+  }
+}
+static method main() → dynamic {
+  core::List<self::A<core::num>> a = <self::A<core::num>>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart
new file mode 100644
index 0000000..9fd0356
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.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 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 that are found in
+// method bodies.
+
+class A<T> {}
+
+class B<U> {
+  fun() {
+    List<A<U>> foo = <A<U>>[];
+    List<A<num>> bar = <A<num>>[];
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
new file mode 100644
index 0000000..e280168
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
@@ -0,0 +1,19 @@
+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<U extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    core::List<self::A<self::B::U>> foo = <self::A<self::B::U>>[];
+    core::List<self::A<core::num>> bar = <self::A<core::num>>[];
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart
new file mode 100644
index 0000000..eb85003
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.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 test checks that instantiate to bound provides type arguments to raw
+// interface types that are themselves used as type arguments of literal maps
+// found in method bodies.
+
+class A<T extends num> {}
+
+class B {
+  foo() {
+    var a = <A, A>{};
+  }
+}
+
+main() {
+  var a = <A, A>{};
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
new file mode 100644
index 0000000..f59f22b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
@@ -0,0 +1,20 @@
+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() → dynamic {
+    core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+  }
+}
+static method main() → dynamic {
+  core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart
new file mode 100644
index 0000000..3044ab3
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart
@@ -0,0 +1,27 @@
+// 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.  Only those interface types are considered in this test case that
+// are found in type annotations in method bodies.
+
+import 'dart:collection';
+
+class A<T> {}
+
+class C {
+  fun() {
+    A a;
+    DoubleLinkedQueue c;
+  }
+}
+
+main() {
+  A a;
+  DoubleLinkedQueue c;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
new file mode 100644
index 0000000..3cce7c5
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
@@ -0,0 +1,23 @@
+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 fun() → dynamic {
+    self::A<dynamic> a;
+    col::DoubleLinkedQueue<dynamic> c;
+  }
+}
+static method main() → dynamic {
+  self::A<dynamic> a;
+  col::DoubleLinkedQueue<dynamic> c;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart
new file mode 100644
index 0000000..511a961
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.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 test checks that instantiate to bound produces correct super-bounded
+// types from raw interface types that refer to F-bounded classes and are found
+// in method bodies.
+
+class A<T extends A<T>> {}
+
+class B {
+  foo() {
+    A a;
+  }
+}
+
+main() {
+  A a;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
new file mode 100644
index 0000000..cd81801
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
@@ -0,0 +1,20 @@
+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::•()
+    ;
+}
+class B extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    self::A<self::A<dynamic>> a;
+  }
+}
+static method main() → dynamic {
+  self::A<self::A<dynamic>> a;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart
new file mode 100644
index 0000000..77ea47d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.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 test checks that instantiate to bound provides type arguments to raw
+// typedef types that are themselves used as type arguments of literal lists and
+// are found in method bodies.
+
+typedef A<T extends num>(T p);
+
+class B {
+  foo() {
+    var a = <A>[];
+  }
+}
+
+main() {
+  var a = <A>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
new file mode 100644
index 0000000..e7f6898
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
@@ -0,0 +1,16 @@
+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() → dynamic {
+    core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+  }
+}
+static method main() → dynamic {
+  core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart
new file mode 100644
index 0000000..954d5e6
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.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.
+
+// 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 and are found in method
+// bodies.
+
+typedef A<T>(T p);
+
+class B<U> {
+  fun() {
+    List<A<U>> foo = <A<U>>[];
+    List<A<num>> bar = <A<num>>[];
+  }
+}
+
+main() {
+  List<A<num>> bar = <A<num>>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
new file mode 100644
index 0000000..16df436
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object> = (T) → dynamic;
+class B<U extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    core::List<(self::B::U) → dynamic> foo = <(self::B::U) → dynamic>[];
+    core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
+  }
+}
+static method main() → dynamic {
+  core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart
new file mode 100644
index 0000000..506f564
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.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 test checks that instantiate to bound provides type arguments to raw
+// typedef types that are themselves used as type arguments in literal maps
+// found in method bodies.
+
+typedef A<T extends num>(T p);
+
+class B {
+  foo() {
+    var a = <A, A>{};
+  }
+}
+
+main() {
+  var a = <A, A>{};
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
new file mode 100644
index 0000000..85ce2a1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
@@ -0,0 +1,16 @@
+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() → dynamic {
+    core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
+  }
+}
+static method main() → dynamic {
+  core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart
new file mode 100644
index 0000000..ab623d6
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart
@@ -0,0 +1,20 @@
+// 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 parameters.  Only those
+// typedef types are considered in the test that are found in method bodies.
+
+typedef A<T>(T p);
+
+class C {
+  foo() {
+    A a;
+  }
+}
+
+main() {
+  A a;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
new file mode 100644
index 0000000..588b68c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
@@ -0,0 +1,16 @@
+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) → dynamic a;
+  }
+}
+static method main() → dynamic {
+  (dynamic) → dynamic a;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart
new file mode 100644
index 0000000..36f36a9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.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.
+
+// This test checks that instantiate to bound produces correct super-bounded
+// types from raw typedef types that refer to F-bounded typedefs and are found
+// in method bodies.
+
+typedef A<T>(T p);
+
+typedef B<U extends A<U>>(U p);
+
+class C {
+  foo() {
+    B b;
+  }
+}
+
+main() {
+  B b;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
new file mode 100644
index 0000000..24ce2c1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object> = (T) → dynamic;
+typedef B<U extends (U) → dynamic> = (U) → dynamic;
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    ((core::Null) → dynamic) → dynamic b;
+  }
+}
+static method main() → dynamic {
+  ((core::Null) → dynamic) → dynamic b;
+}
diff --git a/pkg/front_end/testcases/minimum_int.dart b/pkg/front_end/testcases/minimum_int.dart
new file mode 100644
index 0000000..4b5a61c
--- /dev/null
+++ b/pkg/front_end/testcases/minimum_int.dart
@@ -0,0 +1 @@
+main() => print(-9223372036854775808);
diff --git a/pkg/front_end/testcases/minimum_int.dart.direct.expect b/pkg/front_end/testcases/minimum_int.dart.direct.expect
new file mode 100644
index 0000000..20fea8a
--- /dev/null
+++ b/pkg/front_end/testcases/minimum_int.dart.direct.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  return core::print(-9223372036854775808);
+
diff --git a/pkg/front_end/testcases/minimum_int.dart.outline.expect b/pkg/front_end/testcases/minimum_int.dart.outline.expect
new file mode 100644
index 0000000..e4f3929
--- /dev/null
+++ b/pkg/front_end/testcases/minimum_int.dart.outline.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+
diff --git a/pkg/front_end/testcases/minimum_int.dart.strong.expect b/pkg/front_end/testcases/minimum_int.dart.strong.expect
new file mode 100644
index 0000000..20fea8a
--- /dev/null
+++ b/pkg/front_end/testcases/minimum_int.dart.strong.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  return core::print(-9223372036854775808);
+
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 6c33f11..8f24726 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -84,23 +84,14 @@
 inference/downwards_inference_on_function_of_t_using_the_t: Fail # Issue #29798
 inference/downwards_inference_on_list_literals_infer_downwards: RuntimeError
 inference/downwards_inference_yield_yield_star: TypeCheckError
-inference/future_then_2: TypeCheckError
-inference/future_then_4: TypeCheckError
-inference/future_then_5: TypeCheckError
-inference/future_then_conditional_2: TypeCheckError
-inference/future_then_conditional_4: TypeCheckError
-inference/future_then_conditional_5: TypeCheckError
 inference/future_then_explicit_future: Fail # Issue #30040
 inference/future_then_upwards: RuntimeError
 inference/future_then_upwards_2: RuntimeError
-inference/future_union_downwards_2: TypeCheckError
-inference/future_union_downwards_4: TypeCheckError
 inference/generic_functions_return_typedef: Fail # Issue #29798
 inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
 inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
 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/infer_field_override_multiple: TypeCheckError
 inference/infer_method_missing_params: TypeCheckError
 inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
@@ -119,9 +110,8 @@
 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
+instantiate_to_bound/body_typedef_super_bounded_type: Fail
 
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index baadc31..0771100 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -266,8 +266,7 @@
     },
 
     "exclude": [
-      "^pkg/analysis_server/lib/src/analysis_server\\.dart",
-      "^pkg/dev_compiler/"
+      "^pkg/analysis_server/lib/src/analysis_server\\.dart"
     ]
   }
 }
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 141c10a..aeb2bb5 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -147,7 +147,7 @@
                       "but expected one of: 'true', 'false', 'yes', or 'no'.");
                 }
               } else if (valueSpecification == Uri) {
-                parsedValue = Uri.base.resolve(value);
+                parsedValue = Uri.base.resolveUri(new Uri.file(value));
               } else if (valueSpecification == String) {
                 parsedValue = value;
               } else if (valueSpecification is String) {
diff --git a/pkg/front_end/tool/fasta b/pkg/front_end/tool/fasta
index 9d655de..97a1833 100755
--- a/pkg/front_end/tool/fasta
+++ b/pkg/front_end/tool/fasta
@@ -10,7 +10,7 @@
 
 REPO_DIR="$(cd ${BASH_SOURCE%/*} && git rev-parse --show-toplevel)"
 
-DART_VM="${REPO_DIR}/sdk/bin/dart"
+DART_VM=${DART_VM-"${REPO_DIR}/sdk/bin/dart"}
 
 TOOL_DIR="${REPO_DIR}/pkg/front_end/tool/_fasta"
 
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 892e5a1..eb0b2b5 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -79,7 +79,9 @@
   if (new Directory('runtime/lib/').existsSync()) {
     return Uri.base.resolve("sdk/");
   }
-  return Uri.base.resolve(Platform.resolvedExecutable).resolve('patched_sdk/');
+  return Uri.base
+      .resolveUri(new Uri.file(Platform.resolvedExecutable))
+      .resolve('patched_sdk/');
 }
 
 /// Translates `dart:*` and `package:*` URIs to resolved URIs.
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index dcb5c0b..d9cf2cc 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -132,17 +132,14 @@
   final UriTranslator uriTranslator = await processedOptions.getUriTranslator();
 
   collector.start("Initial compilation");
-  var generator = await IncrementalKernelGenerator.newInstance(
-      compilerOptions, entryUri,
-      useMinimalGenerator: useMinimalGenerator);
+  var generator = new IncrementalKernelGenerator(compilerOptions, entryUri);
 
-  var delta = await generator.computeDelta();
-  generator.acceptLastDelta();
+  var program = await generator.computeDelta();
   collector.stop("Initial compilation");
   if (verbose) {
-    print("Libraries changed: ${delta.newProgram.libraries.length}");
+    print("Libraries changed: ${program.libraries.length}");
   }
-  if (delta.newProgram.libraries.length < 1) {
+  if (program.libraries.length < 1) {
     throw "No libraries were changed";
   }
 
@@ -151,14 +148,13 @@
     await applyEdits(
         changeSet.edits, overlayFs, generator, uriTranslator, verbose);
     collector.start(name);
-    delta = await generator.computeDelta();
-    generator.acceptLastDelta();
+    program = await generator.computeDelta();
     collector.stop(name);
     if (verbose) {
       print("Change '${changeSet.name}' - "
-          "Libraries changed: ${delta.newProgram.libraries.length}");
+          "Libraries changed: ${program.libraries.length}");
     }
-    if (delta.newProgram.libraries.length < 1) {
+    if (program.libraries.length < 1) {
       throw "No libraries were changed";
     }
   }
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index 06fbbd8..399de1c 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -82,7 +82,7 @@
   var program = loadProgramFromBinary(input);
 
   final coreTypes = new CoreTypes(program);
-  final hierarchy = new ClosedWorldClassHierarchy(program);
+  final hierarchy = new ClassHierarchy(program);
   switch (options['transformation']) {
     case 'continuation':
       program = cont.transformProgram(coreTypes, program);
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index f307f05..519bd6d 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -356,6 +356,7 @@
   List<Expression> annotations;
   // Only present if the 'isForwardingStub' flag is set.
   Option<MemberReference> forwardingStubSuperTarget;
+  Option<MemberReference> forwardingStubInterfaceTarget;
   // Can only be absent if abstract, but tag is there anyway.
   Option<FunctionNode> function;
 }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 89a1643..eb61c33 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1491,6 +1491,7 @@
   Uri fileUri;
 
   Reference forwardingStubSuperTarget;
+  Reference forwardingStubInterfaceTarget;
 
   Procedure(Name name, this.kind, this.function,
       {bool isAbstract: false,
@@ -1502,7 +1503,8 @@
       int transformerFlags: 0,
       this.fileUri,
       Reference reference,
-      this.forwardingStubSuperTarget})
+      this.forwardingStubSuperTarget,
+      this.forwardingStubInterfaceTarget})
       : 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 83c5af1..d43b7ff 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -932,6 +932,8 @@
             _disableLazyReading;
     var forwardingStubSuperTarget =
         readAndCheckOptionTag() ? readMemberReference() : null;
+    var forwardingStubInterfaceTarget =
+        readAndCheckOptionTag() ? readMemberReference() : null;
     var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
     var transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
@@ -947,6 +949,7 @@
       function?.parent = node;
       node.setTransformerFlagsWithoutLazyLoading(transformerFlags);
       node.forwardingStubSuperTarget = forwardingStubSuperTarget;
+      node.forwardingStubInterfaceTarget = forwardingStubInterfaceTarget;
 
       assert((node.forwardingStubSuperTarget != null) ||
           !(node.isForwardingStub && node.function.body != null));
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 3d12707..ef1edea 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -766,6 +766,7 @@
     writeUriReference(node.fileUri);
     writeAnnotationList(node.annotations);
     writeOptionalReference(node.forwardingStubSuperTarget);
+    writeOptionalReference(node.forwardingStubInterfaceTarget);
     writeOptionalNode(node.function);
     _variableIndexer = null;
 
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 36c3156..5eb3ab5 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -9,10 +9,27 @@
 import 'src/heap.dart';
 import 'type_algebra.dart';
 
+import 'src/incremental_class_hierarchy.dart' show IncrementalClassHierarchy;
+
 /// Interface for answering various subclassing queries.
 /// TODO(scheglov) Several methods are not used, or used only in tests.
 /// Check if these methods are not useful and should be removed .
 abstract class ClassHierarchy {
+  factory ClassHierarchy(Program program) {
+    int numberOfClasses = 0;
+    for (var library in program.libraries) {
+      numberOfClasses += library.classes.length;
+    }
+    return new ClosedWorldClassHierarchy._internal(program, numberOfClasses)
+      .._initialize();
+  }
+
+  /// Use [ClassHierarchy] factory instead.
+  @deprecated
+  factory ClassHierarchy.deprecated_incremental([Program program]) {
+    return new IncrementalClassHierarchy.deprecated();
+  }
+
   /// Given the [unordered] classes, return them in such order that classes
   /// occur after their superclasses.  If some superclasses are not in
   /// [unordered], they are not included.
@@ -264,8 +281,8 @@
 
   final Map<Class, _ClassInfo> _infoFor = <Class, _ClassInfo>{};
 
-  ClosedWorldClassHierarchy(Program program)
-      : this._internal(program, _countClasses(program));
+  ClosedWorldClassHierarchy._internal(this._program, int numberOfClasses)
+      : classes = new List<Class>(numberOfClasses);
 
   @override
   int getClassIndex(Class class_) => _infoFor[class_].topologicalIndex;
@@ -607,11 +624,10 @@
   @override
   ClassHierarchy applyChanges(Iterable<Class> classes) {
     if (classes.isEmpty) return this;
-    return new ClosedWorldClassHierarchy(_program);
+    return new ClassHierarchy(_program);
   }
 
-  ClosedWorldClassHierarchy._internal(this._program, int numberOfClasses)
-      : classes = new List<Class>(numberOfClasses) {
+  void _initialize() {
     // Build the class ordering based on a topological sort.
     for (var library in _program.libraries) {
       for (var classNode in library.classes) {
@@ -644,6 +660,20 @@
       _buildInterfaceMembers(class_, _infoFor[class_], setters: true);
       _buildInterfaceMembers(class_, _infoFor[class_], setters: false);
     }
+
+    for (int i = 0; i < classes.length; ++i) {
+      Class cls = classes[i];
+      if (cls == null) {
+        throw "No class at index $i.";
+      }
+      _ClassInfo info = _infoFor[cls];
+      if (info == null) {
+        throw "No info for ${cls.name} from ${cls.fileUri}.";
+      }
+      if (info.topologicalIndex != i) {
+        throw "Unexpected topologicalIndex (${info.topologicalIndex} != $i) for ${cls.name} from ${cls.fileUri}.";
+      }
+    }
   }
 
   /// Upwards traversal of the class hierarchy that orders classes so super
@@ -736,6 +766,9 @@
 
   List<Member> _buildInterfaceMembers(Class classNode, _ClassInfo info,
       {bool setters}) {
+    if (info == null) {
+      throw "${classNode.fileUri}: No class info for ${classNode.name}";
+    }
     List<Member> members =
         setters ? info.interfaceSetters : info.interfaceGettersAndCalls;
     if (members != null) return members;
@@ -918,14 +951,6 @@
     info.subtypeIntervalList = subtypeSetBuilder.buildIntervalList();
   }
 
-  static int _countClasses(Program program) {
-    int count = 0;
-    for (var library in program.libraries) {
-      count += library.classes.length;
-    }
-    return count;
-  }
-
   /// Creates a histogram such that index `N` contains the number of classes
   /// that have `N` intervals in its subclass or subtype set (whichever is
   /// larger).
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index e461650..1d0f38f 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -404,7 +404,8 @@
         isForwardingSemiStub: node.isForwardingSemiStub,
         transformerFlags: node.transformerFlags,
         fileUri: node.fileUri,
-        forwardingStubSuperTarget: node.forwardingStubSuperTarget)
+        forwardingStubSuperTarget: node.forwardingStubSuperTarget,
+        forwardingStubInterfaceTarget: node.forwardingStubInterfaceTarget)
       ..fileEndOffset = node.fileEndOffset
       ..isGenericContravariant = node.isGenericContravariant;
   }
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index c070852..c1716e4 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -19,8 +19,8 @@
 
   StrongModeTypeChecker(FailureListener failures, Program program,
       {bool ignoreSdk: false})
-      : this._(failures, new CoreTypes(program),
-            new ClosedWorldClassHierarchy(program), ignoreSdk);
+      : this._(failures, new CoreTypes(program), new ClassHierarchy(program),
+            ignoreSdk);
 
   StrongModeTypeChecker._(this.failures, CoreTypes coreTypes,
       ClassHierarchy hierarchy, bool ignoreSdk)
diff --git a/pkg/kernel/lib/src/incremental_class_hierarchy.dart b/pkg/kernel/lib/src/incremental_class_hierarchy.dart
index b5e8bd4..21f219e 100644
--- a/pkg/kernel/lib/src/incremental_class_hierarchy.dart
+++ b/pkg/kernel/lib/src/incremental_class_hierarchy.dart
@@ -11,8 +11,13 @@
 import 'package:kernel/src/heap.dart';
 import 'package:kernel/type_algebra.dart';
 
-/// Lazy and incremental implementation of [ClassHierarchy].
+/// Use [ClassHierarchy] instead.
+@deprecated
 class IncrementalClassHierarchy implements ClassHierarchy {
+  /// Use [ClassHierarchy] instead.
+  @deprecated
+  IncrementalClassHierarchy.deprecated();
+
   /// The next unique identifier for [_ClassInfo]s.
   int _nextId = 0;
 
@@ -24,7 +29,7 @@
   @override
   ClassHierarchy applyChanges(Iterable<Class> classes) {
     if (classes.isEmpty) return this;
-    return new IncrementalClassHierarchy();
+    return new IncrementalClassHierarchy.deprecated();
   }
 
   @override
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index aa5f0cf..9cb7a4d 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -33,7 +33,7 @@
     CoreTypes coreTypes,
     ClassHierarchy hierarchy}) {
   coreTypes ??= new CoreTypes(program);
-  hierarchy ??= new ClosedWorldClassHierarchy(program);
+  hierarchy ??= new ClassHierarchy(program);
 
   final typeEnvironment =
       new TypeEnvironment(coreTypes, hierarchy, strongMode: strongMode);
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index d9ebd0e..2b77554 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -760,17 +760,20 @@
   FunctionNode rewrite() {
     var statements = <Statement>[];
 
-    // _AsyncStarStreamController :controller;
+    final elementType = elementTypeFromReturnType(helper.streamClass);
+
+    // _AsyncStarStreamController<T> :controller;
     controllerVariable = new VariableDeclaration(":controller",
-        type: new InterfaceType(helper.asyncStarStreamControllerClass,
-            [elementTypeFromReturnType(helper.streamClass)]));
+        type: new InterfaceType(
+            helper.asyncStarStreamControllerClass, [elementType]));
     statements.add(controllerVariable);
 
     setupAsyncContinuations(statements);
 
-    // :controller = new _AsyncStarStreamController(:async_op);
-    var arguments =
-        new Arguments(<Expression>[new VariableGet(nestedClosureVariable)]);
+    // :controller = new _AsyncStarStreamController<T>(:async_op);
+    var arguments = new Arguments(
+        <Expression>[new VariableGet(nestedClosureVariable)],
+        types: [elementType]);
     var buildController = new ConstructorInvocation(
         helper.asyncStarStreamControllerConstructor, arguments)
       ..fileOffset = enclosingFunction.fileOffset;
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 122c5e9..cb52ecc 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -61,11 +61,27 @@
     return new InterfaceType(coreTypes.futureClass, <DartType>[type]);
   }
 
-  /// Removes any number of `Future<>` types wrapping a type.
+  /// Removes a level of `Future<>` types wrapping a type.
+  ///
+  /// This implements the function `flatten` from the spec, which unwraps a
+  /// layer of Future or FutureOr from a type.
   DartType unfutureType(DartType type) {
-    return type is InterfaceType && type.classNode == coreTypes.futureClass
-        ? unfutureType(type.typeArguments[0])
-        : type;
+    if (type is InterfaceType) {
+      if (type.classNode == coreTypes.futureOrClass ||
+          type.classNode == coreTypes.futureClass) {
+        return type.typeArguments[0];
+      }
+      // It is a compile-time error to implement, extend, or mixin FutureOr so
+      // we aren't concerned with it.  If a class implements multiple
+      // instantiations of Future, getTypeAsInstanceOf is responsible for
+      // picking the least one in the sense required by the spec.
+      InterfaceType future =
+          hierarchy.getTypeAsInstanceOf(type, coreTypes.futureClass);
+      if (future != null) {
+        return future.typeArguments[0];
+      }
+    }
+    return type;
   }
 
   /// Called if the computation of a static type failed due to a type error.
diff --git a/pkg/kernel/test/class_hierarchy_bench.dart b/pkg/kernel/test/class_hierarchy_bench.dart
index 03060ab..02d6b0c 100644
--- a/pkg/kernel/test/class_hierarchy_bench.dart
+++ b/pkg/kernel/test/class_hierarchy_bench.dart
@@ -41,7 +41,7 @@
   ClassHierarchy buildHierarchy() {
     return options['basic']
         ? new BasicClassHierarchy(program)
-        : new ClosedWorldClassHierarchy(program);
+        : new ClassHierarchy(program);
   }
 
   var watch = new Stopwatch()..start();
diff --git a/pkg/kernel/test/class_hierarchy_membench.dart b/pkg/kernel/test/class_hierarchy_membench.dart
index 4909616..dcec19a 100644
--- a/pkg/kernel/test/class_hierarchy_membench.dart
+++ b/pkg/kernel/test/class_hierarchy_membench.dart
@@ -43,7 +43,7 @@
   ClassHierarchy buildHierarchy() {
     return options['basic']
         ? new BasicClassHierarchy(program)
-        : new ClosedWorldClassHierarchy(program);
+        : new ClassHierarchy(program);
   }
 
   List<ClosedWorldClassHierarchy> keepAlive = <ClosedWorldClassHierarchy>[];
diff --git a/pkg/kernel/test/class_hierarchy_self_check.dart b/pkg/kernel/test/class_hierarchy_self_check.dart
index 4fe7e3f..1c12454 100644
--- a/pkg/kernel/test/class_hierarchy_self_check.dart
+++ b/pkg/kernel/test/class_hierarchy_self_check.dart
@@ -18,8 +18,7 @@
 
 void testClassHierarchyOnProgram(Program program, {bool verbose: false}) {
   BasicClassHierarchy basic = new BasicClassHierarchy(program);
-  ClosedWorldClassHierarchy classHierarchy =
-      new ClosedWorldClassHierarchy(program);
+  ClosedWorldClassHierarchy classHierarchy = new ClassHierarchy(program);
   int total = classHierarchy.classes.length;
   int progress = 0;
   for (var class1 in classHierarchy.classes) {
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 536d949..ee2e6c5 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -5,7 +5,6 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:kernel/testing/mock_sdk_program.dart';
 import 'package:kernel/text/ast_to_text.dart';
 import 'package:kernel/type_algebra.dart';
@@ -15,14 +14,13 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ClosedWorldClassHierarchyTest);
-    defineReflectiveTests(IncrementalClassHierarchyTest);
   });
 }
 
 @reflectiveTest
 class ClosedWorldClassHierarchyTest extends _ClassHierarchyTest {
   ClassHierarchy createClassHierarchy(Program program) {
-    return new ClosedWorldClassHierarchy(program);
+    return new ClassHierarchy(program);
   }
 
   void test_applyChanges() {
@@ -96,31 +94,6 @@
   }
 }
 
-@reflectiveTest
-class IncrementalClassHierarchyTest extends _ClassHierarchyTest {
-  ClassHierarchy createClassHierarchy(Program program) {
-    return new IncrementalClassHierarchy();
-  }
-
-  void test_applyChanges() {
-    var a = addClass(new Class(name: 'A', supertype: objectSuper));
-    addClass(new Class(name: 'B', supertype: a.asThisSupertype));
-
-    _assertTestLibraryText('''
-class A {}
-class B extends self::A {}
-''');
-
-    // No updated classes, the same hierarchy.
-    expect(hierarchy.applyChanges([]), same(hierarchy));
-
-    // Has updated classes, a new hierarchy.
-    var newHierarchy = hierarchy.applyChanges([a]);
-    expect(newHierarchy, isNot(same(hierarchy)));
-    expect(newHierarchy, new isInstanceOf<IncrementalClassHierarchy>());
-  }
-}
-
 abstract class _ClassHierarchyTest {
   Program program;
   CoreTypes coreTypes;
diff --git a/pkg/kernel/test/closures/suite.dart b/pkg/kernel/test/closures/suite.dart
index b9b8056..e29b394 100644
--- a/pkg/kernel/test/closures/suite.dart
+++ b/pkg/kernel/test/closures/suite.dart
@@ -98,7 +98,7 @@
   Future<Result<int>> run(Uri uri, ClosureConversionContext context) async {
     final File generated = new File.fromUri(uri);
     try {
-      Uri vm = Uri.base.resolve(Platform.resolvedExecutable);
+      Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
       final StdioProcess process = await StdioProcess.run(vm.toFilePath(), [
         "--reify",
         "--reify_generic_functions",
diff --git a/pkg/kernel/test/reify/suite.dart b/pkg/kernel/test/reify/suite.dart
index 4e5f7d2..0d7aca2 100644
--- a/pkg/kernel/test/reify/suite.dart
+++ b/pkg/kernel/test/reify/suite.dart
@@ -76,7 +76,7 @@
 
 Future<TestContext> createContext(
     Chain suite, Map<String, String> environment) async {
-  Uri vm = Uri.base.resolve(Platform.resolvedExecutable);
+  Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
   Uri platformBinaries = computePlatformBinariesLocation();
   Uri platform = platformBinaries.resolve("vm_platform.dill");
   bool updateExpectations = environment["updateExpectations"] == "true";
diff --git a/pkg/kernel/test/treeshaker_bench.dart b/pkg/kernel/test/treeshaker_bench.dart
index 9f9354c..07f660e 100644
--- a/pkg/kernel/test/treeshaker_bench.dart
+++ b/pkg/kernel/test/treeshaker_bench.dart
@@ -50,7 +50,7 @@
   ClassHierarchy buildClassHierarchy() {
     return options['basic']
         ? new BasicClassHierarchy(program)
-        : new ClosedWorldClassHierarchy(program);
+        : new ClassHierarchy(program);
   }
 
   CoreTypes coreTypes = new CoreTypes(program);
diff --git a/pkg/kernel/test/treeshaker_check.dart b/pkg/kernel/test/treeshaker_check.dart
index b7a9471..4d40d3d 100644
--- a/pkg/kernel/test/treeshaker_check.dart
+++ b/pkg/kernel/test/treeshaker_check.dart
@@ -23,7 +23,7 @@
   }
   var program = loadProgramFromBinary(args[0]);
   var coreTypes = new CoreTypes(program);
-  var hierarchy = new ClosedWorldClassHierarchy(program);
+  var hierarchy = new ClassHierarchy(program);
   var shaker = new TreeShaker(coreTypes, hierarchy, program);
   shaker.transform(program);
   new TreeShakingSanityCheck(shaker).visit(program);
diff --git a/pkg/kernel/test/treeshaker_dump.dart b/pkg/kernel/test/treeshaker_dump.dart
index 16c1c10..b373fbf 100644
--- a/pkg/kernel/test/treeshaker_dump.dart
+++ b/pkg/kernel/test/treeshaker_dump.dart
@@ -67,7 +67,7 @@
 
   Program program = loadProgramFromBinary(filename);
   CoreTypes coreTypes = new CoreTypes(program);
-  ClassHierarchy hierarchy = new ClosedWorldClassHierarchy(program);
+  ClassHierarchy hierarchy = new ClassHierarchy(program);
   TreeShaker shaker =
       new TreeShaker(coreTypes, hierarchy, program, strongMode: strong);
   int totalClasses = 0;
diff --git a/pkg/kernel/test/treeshaker_membench.dart b/pkg/kernel/test/treeshaker_membench.dart
index ee9e087..596ef87 100644
--- a/pkg/kernel/test/treeshaker_membench.dart
+++ b/pkg/kernel/test/treeshaker_membench.dart
@@ -39,7 +39,7 @@
   bool strongMode = options['strong'];
 
   Program program = loadProgramFromBinary(filename);
-  ClassHierarchy hierarchy = new ClosedWorldClassHierarchy(program);
+  ClassHierarchy hierarchy = new ClassHierarchy(program);
   CoreTypes coreTypes = new CoreTypes(program);
 
   int copyCount = int.parse(options['count']);
diff --git a/pkg/kernel/test/type_subtype_test.dart b/pkg/kernel/test/type_subtype_test.dart
index c75fa8a..1517b25 100644
--- a/pkg/kernel/test/type_subtype_test.dart
+++ b/pkg/kernel/test/type_subtype_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:test/test.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
@@ -223,7 +222,8 @@
       }
     }
   }
-  var hierarchy = new IncrementalClassHierarchy();
+  var program = new Program(libraries: [environment.dummyLibrary]);
+  var hierarchy = new ClassHierarchy(program);
   return new MockSubtypeTester(
       hierarchy,
       objectClass.rawType,
diff --git a/pkg/kernel/test/typecheck.dart b/pkg/kernel/test/typecheck.dart
index e5efb88..f8a054b 100644
--- a/pkg/kernel/test/typecheck.dart
+++ b/pkg/kernel/test/typecheck.dart
@@ -1,10 +1,10 @@
 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 import 'package:kernel/kernel.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:kernel/type_checker.dart';
 import 'dart:io';
 
@@ -21,7 +21,7 @@
   }
   var program = loadProgramFromBinary(args[0]);
   var coreTypes = new CoreTypes(program);
-  var hierarchy = new IncrementalClassHierarchy();
+  var hierarchy = new ClassHierarchy(program);
   new TestTypeChecker(coreTypes, hierarchy).checkProgram(program);
 }
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index c39de25..21a7c83 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -1,21 +1,18 @@
 # Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-
 # Don't run any test-like files that show up in packages directories. It
 # shouldn't be necessary to run "pub install" in these packages, but if you do
 # it shouldn't break the tests.
-*/packages/*/*: Skip
-*/*/packages/*/*: Skip
-*/*/*/packages/*/*: Skip
-*/*/*/*/packages/*/*: Skip
 */*/*/*/*/packages/*/*: Skip
-
-analysis_server/tool/spec/check_all_test: Skip  # Issue 29133
-analyzer_plugin/tool/spec/check_all_test: Skip  # Issue 29133
-
+*/*/*/*/packages/*/*: Skip
+*/*/*/packages/*/*: Skip
+*/*/packages/*/*: Skip
+*/packages/*/*: Skip
+analysis_server/tool/spec/check_all_test: Skip # Issue 29133
 analyzer/test/generated/compile_time_error_code_driver_test: Slow, Pass
 analyzer/test/generated/compile_time_error_code_kernel_test: Slow, Pass
+analyzer/test/generated/compile_time_error_code_test: Slow, Pass
 analyzer/test/generated/hint_code_kernel_test: Slow, Pass
 analyzer/test/generated/non_error_resolver_driver_test: Slow, Pass
 analyzer/test/generated/non_error_resolver_kernel_test: Slow, Pass
@@ -23,124 +20,42 @@
 analyzer/test/generated/static_warning_code_driver_test: Slow, Pass
 analyzer/test/generated/static_warning_code_kernel_test: Slow, Pass
 analyzer/test/generated/strong_mode_kernel_test: Slow, Pass
-analyzer/test/generated/compile_time_error_code_test: Slow, Pass
 analyzer/test/src/dart/analysis/driver_kernel_test: Slow, Pass
 analyzer/test/src/summary/resynthesize_kernel_test: Slow, Pass
 analyzer/test/src/task/strong/checker_test: Slow, Pass
+analyzer2dart/test/*: Skip # Analyzer2dart is not maintained anymore.
 analyzer_plugin/test/plugin/folding_mixin_test: Slow, Pass
-
-# Analyzer2dart is not maintained anymore.
-analyzer2dart/test/*: Skip
-
-dart_messages/test/dart_messages_test: Skip  # Requires a package root.
-
-# 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.
-front_end/test/fasta/rasta/*: SkipByDesign
-
-# sdk_test would take too long to complete, and should be run in a different
-# way.
-front_end/test/fasta/sdk_test: SkipByDesign
-
+analyzer_plugin/tool/spec/check_all_test: Skip # Issue 29133
+dart_messages/test/dart_messages_test: Skip # Requires a package root.
+dev_compiler/gen/*: SkipByDesign # Skip dev_compiler codegen tests
+dev_compiler/test/codegen/*: Skip # Skip dev_compiler codegen tests
+dev_compiler/test/codegen_test: Skip # Skip dev_compiler codegen tests
+dev_compiler/test/options/*: Skip # Skip dev_compiler codegen tests
+dev_compiler/test/sourcemap/*: SkipByDesign # Skip dev_compiler codegen tests
+dev_compiler/test/sourcemap/testfiles/*: SkipByDesign # Skip dev_compiler codegen tests
+dev_compiler/test/worker/*: Skip # Skip dev_compiler codegen tests
+front_end/test/fasta/analyze_test: Pass, Slow
+front_end/test/fasta/ast_builder_test: Pass, Slow
 front_end/test/fasta/bootstrap_test: Pass, Slow
 front_end/test/fasta/compile_test: Pass, Slow
-front_end/test/fasta/strong_test: Pass, Slow
 front_end/test/fasta/outline_test: Pass, Slow
-front_end/test/fasta/ast_builder_test: Pass, Slow
+front_end/test/fasta/rasta/*: SkipByDesign # Anything in rasta is input to fasta unit tests and shouldn't be run as tests.
+front_end/test/fasta/sdk_test: SkipByDesign # sdk_test would take too long to complete, and should be run in a different way.
+front_end/test/fasta/strong_test: Pass, Slow
 front_end/test/minimal_incremental_kernel_generator_test: Slow, Pass
 front_end/test/whole_program_test: Slow, Pass
-front_end/tool/incremental_perf_test: Slow, Pass
-
-# These are not tests but input for tests.
-kernel/testcases/*: Skip
-front_end/testcases/*: Skip
-
-front_end/test/fasta/analyze_test: Pass, Slow
-
-kernel/test/closures_test: Slow, Pass
-
+front_end/testcases/*: Skip # These are not tests but input for tests.
 front_end/tool/_fasta/compile_platform_test: Fail
+front_end/tool/incremental_perf_test: Slow, Pass
+kernel/test/closures_test: Slow, Pass
+kernel/testcases/*: Skip # These are not tests but input for tests.
 
-[ $use_sdk || $mode != release || $compiler != none || $runtime != vm || $arch != x64 ]
-front_end/test/whole_program_test: SkipByDesign
+[ $compiler == dart2analyzer ]
+dev_compiler/test/options/*: SkipByDesign
 
 [ $compiler != dart2analyzer ]
 analyzer/test/src/summary/summarize_fasta_test: RuntimeError, Slow
 
-[ $runtime != vm || $mode != release || $system == windows ]
-front_end/test/fasta/*: Skip
-front_end/tool/_fasta/*: Skip
-kernel/test/closures_test: Skip
-
-# Don't analyze tests in strong mode yet
-[ $compiler == dart2analyzer && $builder_tag == strong ]
-*: Skip # Issue 28649
-
-# Analyze dev_compiler but only run its tests on the vm
-[ $compiler != dart2analyzer && $runtime != vm ]
-dev_compiler/test/*: Skip
-
-[ $compiler == dart2analyzer || $runtime != vm ]
-dev_compiler/test/options/*: SkipByDesign
-
-[ $compiler == none && $runtime == drt ]
-mutation_observer: Skip # Issue 21149
-unittest/*: Skip # Issue 21949
-front_end/*: SkipByDesign
-
-[ $runtime == vm ]
-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
-analyzer/test/src/summary/resynthesize_ast_test: Pass, Slow
-analyzer/test/src/task/strong/front_end_inference_test: Pass, Slow
-
-[ $runtime == vm && $checked && $system == windows ]
-front_end/tool/perf_test: Slow, Pass
-
-[ $runtime == vm && $builder_tag == swarming ]
-front_end/test/src/incremental/hot_reload_e2e_test: Pass, RuntimeError # Please triage this failure
-
-[ $runtime == vm && $use_sdk ]
-front_end/test/fasta/*: Skip # Issue 28629
-front_end/tool/_fasta/*: Skip # Issue 28629
-compiler/tool/generate_kernel_test*: Skip # Issue 28629
-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/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
-front_end/test/summary_generator_test: SkipByDesign # depends on patched_sdk which is not built into the sdk
-front_end/test/mixin_export_test: SkipByDesign # depends on patched_sdk which is not built into the sdk
-
-[ $runtime == vm && $system == windows]
-analysis_server/*: Skip # Issue 27557
-analysis_server/test/analysis/get_errors_test: Skip # runtime error, Issue 22180
-analysis_server/test/integration/analysis/analysis_options_test: RuntimeError # Issue 24796
-analyzer/test/generated/non_error_resolver_kernel_test: RuntimeError # Issue 30785
-analyzer/tool/task_dependency_graph/check_test: Slow, Pass
-
 [ $compiler == dart2js ]
 analysis_server/test/integration: SkipByDesign # Analysis server integration tests don't make sense to run under dart2js, since the code under test always runs in the Dart vm as a subprocess.
 analyzer_cli/test/*: SkipByDesign # Only meant to run on vm
@@ -153,112 +68,162 @@
 collection/test/equality_test/05: Fail # Issue 1533
 collection/test/equality_test/none: Pass, Fail # Issue 14348
 compiler/tool/*: SkipByDesign # Only meant to run on vm
-front_end/tool/*: SkipByDesign # Only meant to run on vm
-telemetry/test/*: SkipByDesign # Only meant to run on vm
-typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
+front_end/test/dependency_grapher_test: SkipByDesign # Uses dart:io
 front_end/test/incremental_kernel_generator_test: SkipByDesign # Uses dart:io
 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/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
+front_end/test/standard_file_system_test: SkipByDesign # Uses dart:io
 front_end/test/subpackage_relationships_test: SkipByDesign # Uses dart:io
+front_end/tool/*: SkipByDesign # Only meant to run on vm
+telemetry/test/*: SkipByDesign # Only meant to run on vm
+typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
 
-[ $compiler == dart2js && $runtime != d8 ]
-front_end/test/mixin_export_test: RuntimeError # Issue 30576
+[ $compiler == none ]
+kernel/test/closures_test: Fail
 
-[ $compiler == dart2js && $fast_startup ]
-front_end/test/*: SkipByDesign # Tests written with dart:mirrors.
+[ $runtime == dart_precompiled ]
+*: SkipByDesign # The pkg test framework imports dart:mirrors.
 
-[ $compiler == dart2js && $builder_tag != dart2js_analyzer ]
-analyzer/test/*: Skip # Issue 26813
-analyzer/tool/*: Skip # Issue 26813
-analysis_server/test/*: Skip # Issue 26813
-
-[ $compiler == dart2js && $checked ]
-crypto/test/base64_test: Slow, Pass
+[ $runtime == flutter ]
+status_file/*: SkipByDesign # Only meant to run on the standalone VM.
 
 [ $runtime == jsshell ]
 async/test/stream_zip_test: RuntimeError, OK # Issue 26103. Timers are not supported.
 front_end/test/*: RuntimeError, OK, Pass # Issue 26103. Timers are not supported.
 kernel/test/*: RuntimeError, OK # Issue 26103. Timers are not supported.
 
-[ $compiler == dart2js && $runtime == d8 ]
-front_end/test/src/base/uri_resolver_test: SkipByDesign # Relies on access to file system
+[ $runtime == vm ]
+analysis_server/test/completion_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/completion: Pass, Slow
+analysis_server/test/integration/edit/format_test: Pass, Slow
+analysis_server/test/integration/edit/import_elements_test: Pass, Slow
+analysis_server/test/integration/edit/organize_directives_test: Pass, Slow
+analysis_server/test/integration/search/find_top_level_declarations_test: Pass, RuntimeError # 31571
+analyzer/test/file_system/physical_resource_provider_test: Pass, Fail # Issue 25472
+analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
+analyzer_cli/test/driver_test: Pass, Slow, Timeout
+mutation_observer: Skip # Skip tests on the VM if the package depends on dart:html
 
+[ $runtime != vm ]
+dev_compiler/test/options/*: SkipByDesign
+front_end/test/src/incremental/hot_reload_e2e_test: Skip
 
-[ $compiler == dart2js && $runtime == drt ]
-async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
-
-[ $compiler == dart2js && ($runtime == chrome || $runtime == ff) ]
-collection/test/unmodifiable_collection_test: SkipSlow # Times out. Issue 22050
-async/test/stream_zip_test: SkipSlow # Times out. Issue 22050
-
-[ $runtime == safarimobilesim ]
-# Unexplained errors only occurring on Safari 6.1 and earlier.
-typed_data/test/typed_buffers_test: RuntimeError
-
-[ $compiler == dart2js && $csp ]
-# This test cannot run under CSP because it is injecting a JavaScript polyfill
-mutation_observer: Skip
-
-[ $compiler == dart2js && $browser ]
-crypto/test/sha256_test: Slow, Pass
-crypto/test/sha1_test: Slow, Pass
+[ $system == windows ]
+front_end/test/src/incremental/hot_reload_e2e_test: Skip # Issue 31901
 
 [ $browser ]
-analyzer_cli/*: SkipByDesign # Uses dart:io.
 */test/analyzer_test: SkipByDesign # No need to run analysis tests on browser bots
 analysis_server/test/*: SkipByDesign # Uses dart:io.
 analysis_server/tool/spec/check_all_test: SkipByDesign # Uses dart:io.
 analyzer/test/*: SkipByDesign # Uses dart:io.
-analyzer/tool/task_dependency_graph/check_test: SkipByDesign # Uses dart:io.
 analyzer/tool/summary/check_test: SkipByDesign # Uses dart:io.
+analyzer/tool/task_dependency_graph/check_test: SkipByDesign # Uses dart:io.
 analyzer2dart/*: SkipByDesign # Uses dart:io.
+analyzer_cli/*: SkipByDesign # Uses dart:io.
 compiler/tool/*: SkipByDesign # Only meant to run on vm
+dart_messages/test/dart_messages_test: Skip # Uses dart:io.
 front_end/tool/*: SkipByDesign # Only meant to run on vm
 http_server/test/*: Fail, OK # Uses dart:io.
+kernel/test/*: SkipByDesign # Uses dart:io and bigints.
 observe/test/transformer_test: Fail, OK # Uses dart:io.
-observe/test/unique_message_test: SkipByDesign  # Uses dart:io.
-dart_messages/test/dart_messages_test: Skip  # Uses dart:io.
+observe/test/unique_message_test: SkipByDesign # Uses dart:io.
+status_file/*: SkipByDesign # Only meant to run on the standalone VM.
+testing/test/analyze_test: SkipByDesign
 
-[ $browser || $jscl ]
+[ $jscl ]
 kernel/test/*: SkipByDesign # Uses dart:io and bigints.
 
-[ $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
-
-[ $runtime == vm ]
-analyzer/test/file_system/physical_resource_provider_test: Pass, Fail # Issue 25472
+[ $arch == x64 && $runtime == vm && $system == windows && $checked ]
 analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
-# Skip tests on the VM if the package depends on dart:html
-mutation_observer: Skip
+
+[ $builder_tag != dart2js_analyzer && $compiler == dart2js ]
+analysis_server/test/*: Skip # Issue 26813
+analyzer/test/*: Skip # Issue 26813
+analyzer/tool/*: Skip # Issue 26813
+
+# Don't analyze tests in strong mode yet
+[ $builder_tag == strong && $compiler == dart2analyzer ]
+*: Skip # Issue 28649
+
+# Analyze dev_compiler but only run its tests on the vm
+[ $compiler != dart2analyzer && $runtime != vm ]
+dev_compiler/test/*: Skip
 
 [ $compiler == dart2js && $runtime == chrome && $system == macos ]
 third_party/di_tests/di_test: Pass, Slow # Issue 22896
 
-[ $arch == x64 && $runtime == vm && $system == windows && $checked ]
-# See: https://build.chromium.org/p/client.dart/builders/analyzer-win7-release-be/builds/3113/steps/analyzer%20unit%20tests/logs/stdio
-analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
+[ $compiler == dart2js && $runtime == d8 ]
+front_end/test/src/base/uri_resolver_test: SkipByDesign # Relies on access to file system
 
-[ $runtime == dart_precompiled ]
-*: SkipByDesign # The pkg test framework imports dart:mirrors.
+[ $compiler == dart2js && $runtime != d8 ]
+front_end/test/mixin_export_test: RuntimeError # Issue 30576
 
-[ $compiler == none ]
-kernel/test/closures_test: Fail
+[ $compiler == dart2js && $runtime == drt ]
+async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
 
-[ $runtime == vm ]
-analyzer_cli/test/driver_test: Pass, Slow, Timeout
+[ $compiler == dart2js && $browser ]
+crypto/test/sha1_test: Slow, Pass
+crypto/test/sha256_test: Slow, Pass
+
+[ $compiler == dart2js && $checked ]
+crypto/test/base64_test: Slow, Pass
+
+[ $compiler == dart2js && $csp ]
+mutation_observer: Skip # This test cannot run under CSP because it is injecting a JavaScript polyfill
+
+[ $compiler == dart2js && $fast_startup ]
+front_end/test/*: SkipByDesign # Tests written with dart:mirrors.
+
+[ $compiler == dart2js && ($runtime == chrome || $runtime == ff) ]
+async/test/stream_zip_test: SkipSlow # Times out. Issue 22050
+collection/test/unmodifiable_collection_test: SkipSlow # Times out. Issue 22050
+
+[ $compiler == none && $runtime == drt ]
+front_end/*: SkipByDesign
+mutation_observer: Skip # Issue 21149
+unittest/*: Skip # Issue 21949
 
 [ $runtime == vm && $system == windows ]
+analysis_server/*: Skip # Issue 27557
+analysis_server/test/analysis/get_errors_test: Skip # runtime error, Issue 22180
+analysis_server/test/integration/analysis/analysis_options_test: RuntimeError # Issue 24796
+analyzer/test/generated/non_error_resolver_kernel_test: RuntimeError # Issue 30785
 analyzer/test/src/task/strong/checker_test: Pass, Slow
+analyzer/tool/task_dependency_graph/check_test: Slow, Pass
 
-[ $browser ]
-testing/test/analyze_test: SkipByDesign
+[ $runtime == vm && $system == windows && $checked ]
+front_end/tool/perf_test: Slow, Pass
 
-[ $browser || $runtime == flutter ]
-status_file/*: SkipByDesign # Only meant to run on the standalone VM.
+[ $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
+analyzer/test/src/summary/resynthesize_ast_test: Pass, Slow
+analyzer/test/src/task/strong/front_end_inference_test: Pass, Slow
+
+[ $runtime == vm && $use_sdk ]
+compiler/tool/generate_kernel_test*: Skip # Issue 31899
+kernel/test/metadata_test: Skip # Issue 31900
+
+# Timeout. These tests do not run efficiently on our simulator or low-end
+# devices.
+[ $runtime == vm && ($arch == armv5te || $arch == armv6 || $arch == simarm || $arch == simarm64 || $arch == simarmv5te || $arch == simarmv6 || $arch == simdbc64) ]
+*: Skip
+
+[ $arch != x64 || $compiler != none || $mode != release || $runtime != vm ]
+front_end/test/whole_program_test: SkipByDesign
+
+[ $mode != release || $runtime != vm ]
+front_end/test/fasta/*: Skip
+front_end/tool/_fasta/*: Skip
+
+[ $mode != release || $runtime != vm || $system == windows ]
+kernel/test/closures_test: Skip
+
diff --git a/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart b/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart
index f84ecbe..4a989c2 100644
--- a/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/stacktrace_helper.dart
@@ -104,7 +104,8 @@
     List<LineException> afterExceptions: const <LineException>[],
     bool useJsMethodNamesOnAbsence: false,
     String Function(String name) jsNameConverter: identityConverter,
-    Directory forcedTmpDir: null}) async {
+    Directory forcedTmpDir: null,
+    int stackTraceLimit: 10}) async {
   Expect.isTrue(test.expectationMap.keys.contains(config),
       "No expectations found for '$config' in ${test.expectationMap.keys}");
 
@@ -132,6 +133,8 @@
   }
   print("Running d8 $output");
   List<String> d8Arguments = <String>[];
+  d8Arguments.add('--stack-trace-limit');
+  d8Arguments.add('$stackTraceLimit');
   d8Arguments.addAll(jsPreambles(input, output));
   d8Arguments.add(output);
   ProcessResult runResult = Process.runSync(d8executable, d8Arguments);
diff --git a/pkg/status_file/test/data/co19-dart2js.status b/pkg/status_file/test/data/co19-dart2js.status
index b7155e0..6f8403f 100644
--- a/pkg/status_file/test/data/co19-dart2js.status
+++ b/pkg/status_file/test/data/co19-dart2js.status
@@ -5264,1323 +5264,6 @@
 LayoutTests/fast/dom/icon-size-property_t01: Pass, RuntimeError # Issue 29632
 LayoutTests/fast/events/event-fire-order_t01: Pass, RuntimeError # Issue 29632
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-alphaImageData-behavior_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-arc-zero-lineto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-before-css_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-bezier-same-endpoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-composite-canvas_t01: Skip # Times out on Windows 8. Please triage this failure
-LayoutTests/fast/canvas/canvas-composite-stroke-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
-LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-getImageData-largeNonintegralDimensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-invalid-fillstyle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-invalid-strokestyle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-quadratic-same-endpoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImage-with-broken-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImage-with-negative-source-destination_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImageFromRect_withToDataURLAsSource_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/pointInPath_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/button-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Uses FontFace class not defined for this browser
-LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/computed-style-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/media-rule-no-whitespace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-expr-error-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-object-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/sibling-selectors-dynamic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-sharing-type-and-readonly_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Attr/direction-attribute-set-and-cleared_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/clone-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/clone-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-doctype2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/comment-not-documentElement_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/type-extension-undo-assert_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/elementFromPoint-scaled-scrolled_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
-LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path-not-in-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/vertical-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/xmlserializer-serialize-to-string-exception_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/insertAdjacentHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/dispatch-event-no-document_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-on-created-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/fire-scroll-event_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/scroll-event-phase_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError # Safarimobilesim does not support WheelEvent
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-close_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-parts-slice-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-slice-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/file-reader-abort-in-last-progress_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/file-reader-readystate_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/url-null_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-copy_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-move_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-remove_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/read-directory_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/flexbox/vertical-box-form-controls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/control-detach-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-select-webkit-user-select-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-type-change3_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/interactive-validation-assertion-by-validate-twice_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/interactive-validation-attach-assertion_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/interactive-validation-select-crash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/search-popup-crasher_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/selection-direction_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/media-query-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-js-media-except_t03: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-parsing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/mediastream/RTCIceCandidate_t01: Skip # Please triage this failure
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: Skip #  Issue 23475
-LayoutTests/fast/mediastream/constructors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t09: Skip # Times out. Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/widows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/widows_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/preferred-widths_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-property-aliases_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/boundingclientrect-subpixel-margin_t01: Skip # Issue 747
-LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/float-list-inside_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/inline-block-with-padding_t01: Skip # Issue 747
-LayoutTests/fast/sub-pixel/layout-boxes-with-zoom_t01: Pass, RuntimeError # Issue 747
-LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/size-of-span-with-different-positions_t01: Skip # Issue 747
-LayoutTests/fast/svg/getbbox_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-length_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-number_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/css-table-max-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/css-table-max-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-css-block-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-css-inline-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-html-block-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-html-inline-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/switch-table-layout-dynamic-cells_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/switch-table-layout_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-spaces_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/font-ligature-letter-spacing_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/glyph-reordering_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/ipa-tone-letters_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t03: RuntimeError # Please triage this failure
-LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/anchor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/file-http-base_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/file_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/host_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/idna2003_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/idna2008_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/ipv4_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/ipv6_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/port_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/query_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/relative-unix_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/relative-win_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/relative_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/safari-extension_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/segments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/standard-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-set-responsetype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/xpath-template-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xsl/default-html_t01: RuntimeError # Please triage this failure
-LibTest/async/Future/doWhile_A05_t01: RuntimeError # Please triage this failure
-LibTest/async/Future/forEach_A04_t02: RuntimeError # Please triage this failure
-LibTest/async/Stream/timeout_A01_t01: Pass, RuntimeError # Please triage this failure
-LibTest/async/Stream/timeout_A03_t01: Pass, RuntimeError # Please triage this failure
-LibTest/async/Stream/timeout_A04_t01: Pass, RuntimeError # Please triage this failure
-LibTest/core/List/List_A02_t01: RuntimeError # Please triage this failure
-LibTest/core/List/List_A03_t01: RuntimeError # Please triage this failure
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Issue 22200
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Issue 22200
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Issue 22200
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError # Please triage this failure
-LibTest/core/int/remainder_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/remainder_A01_t03: RuntimeError # Please triage this failure
-LibTest/core/int/toRadixString_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # Please triage this failure
-LibTest/html/Document/childNodes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Document/clone_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Document/getElementsByTagName_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/Element/onMouseWheel_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/Element/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/tagName_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/Element/transitionEndEvent_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/responseType_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/mouseWheelEvent_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Node/nodes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Node/nodes_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Node/parent_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Node/previousNode_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/close_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/document_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/find_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/find_A03_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/find_A06_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/moveBy_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/moveTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/moveTo_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/open_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/postMessage_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/postMessage_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError # Please triage this failure
-WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError # Please triage this failure
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # Please triage this failure
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # Please triage this failure
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # Please triage this failure
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-createElementNS_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-imports/link-import_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-imports/link-import_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01 : RuntimeError # In Safari mobile sim, setting innerHTML on a Frameset element does nothing.
-WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
-
 [ $compiler == dart2js && $runtime == ie11 ]
 Language/Expressions/Conditional/type_t04: Skip # Times out. Please triage this failure
 Language/Expressions/Identifier_Reference/evaluation_function_t02: Skip # Times out. Please triage this failure
diff --git a/pkg/testing/lib/src/discover.dart b/pkg/testing/lib/src/discover.dart
index 2690ce9..edcbf03 100644
--- a/pkg/testing/lib/src/discover.dart
+++ b/pkg/testing/lib/src/discover.dart
@@ -69,7 +69,9 @@
   if (dartSdkPath != null) {
     return Uri.base.resolveUri(new Uri.file(dartSdkPath));
   } else {
-    return Uri.base.resolve(Platform.resolvedExecutable).resolve("../");
+    return Uri.base
+        .resolveUri(new Uri.file(Platform.resolvedExecutable))
+        .resolve("../");
   }
 }
 
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 2fc8bf6..8a501f5 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -24,7 +24,10 @@
       help:
           'Produce kernel file for AOT compilation (enables global transformations).',
       defaultsTo: false)
-  ..addFlag('strong-mode', help: 'Enable strong mode', defaultsTo: true);
+  ..addFlag('strong-mode', help: 'Enable strong mode', defaultsTo: true)
+  ..addFlag('embed-sources',
+      help: 'Embed source files in the generated kernel program',
+      defaultsTo: true);
 
 final String _usage = '''
 Usage: dart pkg/vm/bin/gen_kernel.dart --platform vm_platform_strong.dill [options] input.dart
@@ -68,7 +71,8 @@
     ..linkedDependencies = <Uri>[Uri.base.resolve(platformKernel)]
     ..packagesFileUri = packages != null ? Uri.base.resolve(packages) : null
     ..reportMessages = true
-    ..onError = errorDetector;
+    ..onError = errorDetector
+    ..embedSourceText = options['embed-sources'];
 
   Program program = await compileToKernel(
       Uri.base.resolve(filename), compilerOptions,
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 46a4c7c..da72077 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -106,12 +106,9 @@
   @override
   Future<Program> compileInternal(Uri script) async {
     if (generator == null) {
-      generator = await IncrementalKernelGenerator.newInstance(options, script);
+      generator = new IncrementalKernelGenerator(options, script);
     }
-    DeltaProgram deltaProgram = await generator.computeDelta();
-    // TODO(aam): Accepting/rejecting should be done based on VM response.
-    generator.acceptLastDelta();
-    return deltaProgram.newProgram;
+    return await generator.computeDelta();
   }
 
   void invalidate(Uri uri) {
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 7f7158b..281f67c 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -19,6 +19,11 @@
 
 import 'transformations/devirtualization.dart' as devirtualization
     show transformProgram;
+import 'transformations/type_flow/transformer.dart' as globalTypeFlow
+    show transformProgram;
+
+// Flag to enable global type flow analysis and related transformations.
+const kUseGlobalTypeFlow = const bool.fromEnvironment('use.global.type.flow');
 
 /// Generates a kernel representation of the program whose main library is in
 /// the given [source]. Intended for whole program (non-modular) compilation.
@@ -49,7 +54,11 @@
   if (strongMode) {
     final coreTypes = new CoreTypes(program);
 
-    devirtualization.transformProgram(coreTypes, program);
+    if (kUseGlobalTypeFlow) {
+      globalTypeFlow.transformProgram(coreTypes, program);
+    } else {
+      devirtualization.transformProgram(coreTypes, program);
+    }
   }
 }
 
diff --git a/pkg/vm/lib/transformations/devirtualization.dart b/pkg/vm/lib/transformations/devirtualization.dart
index 7cca514..550ece77 100644
--- a/pkg/vm/lib/transformations/devirtualization.dart
+++ b/pkg/vm/lib/transformations/devirtualization.dart
@@ -14,8 +14,7 @@
 /// Devirtualization of method invocations based on the class hierarchy
 /// analysis. Assumes strong mode and closed world.
 Program transformProgram(CoreTypes coreTypes, Program program) {
-  new CHADevirtualization(
-          coreTypes, program, new ClosedWorldClassHierarchy(program))
+  new CHADevirtualization(coreTypes, program, new ClassHierarchy(program))
       .visitProgram(program);
   return program;
 }
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
new file mode 100644
index 0000000..871c63b
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -0,0 +1,887 @@
+// 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.
+
+/// Global type flow analysis.
+library kernel.transformations.analysis;
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
+import 'package:kernel/class_hierarchy.dart' show ClosedWorldClassHierarchy;
+import 'package:kernel/library_index.dart' show LibraryIndex;
+import 'package:kernel/type_environment.dart';
+
+import 'calls.dart';
+import 'native_code.dart';
+import 'summary.dart';
+import 'summary_collector.dart';
+import 'types.dart';
+import 'utils.dart';
+
+// TODO(alexmarkov)
+// Unordered list of various improvements in type flow analysis,
+// organized in several categories:
+//
+// === Correctness ===
+// * Add unit tests!!!
+// * Support dynamic calls via getters & dynamic tear-offs.
+// * Re-evaluate field initializer if its dependency changes (avoid
+//   re-using cached value).
+// * Handle noSuchMethod invocations correctly (especially in case of dynamic
+//   calls).
+// * Verify incremental re-calculation by fresh analysis starting with known
+//   allocated classes.
+// * Auto-generate entry_points.json during build.
+// * Support FutureOr<T> properly.
+//
+// === Precision ===
+// * Handle '==' with null.
+// * Special type inference rules for binary int operators.
+// * Support function types, better handle closures.
+// * Support generic types: substitution, passing type arguments. Figure out
+//   when generic type should be approximated.
+// * Support named parameters (remove their approximation with static types).
+//
+// === Efficiency of the analysis ===
+// * Add benchmark to measure analysis time continuously.
+// * Figure out better strategy of processing an invocation if its result is
+//   not used. Consider creating summaries eagerly (to discover allocated
+//   classes early) but analyzing them lazily.
+//
+
+/// Maintains set of dependent invocations.
+class _DependencyTracker {
+  Set<_Invocation> _dependentInvocations;
+
+  void addDependentInvocation(_Invocation invocation) {
+    if (!identical(invocation, this)) {
+      _dependentInvocations ??= new Set<_Invocation>();
+      _dependentInvocations.add(invocation);
+    }
+  }
+
+  void invalidateDependentInvocations(_WorkList workList) {
+    if (_dependentInvocations != null) {
+      _dependentInvocations.forEach(workList.invalidateInvocation);
+    }
+  }
+}
+
+/// _Invocation class represents the in-flight invocation detached from a
+/// particular call site, e.g. it is a selector and arguments.
+/// This is the basic unit of processing in type flow analysis.
+/// Call sites calling the same method with the same argument types
+/// may reuse results of the analysis through the same _Invocation instance.
+class _Invocation extends _DependencyTracker {
+  final Selector selector;
+  final Args<Type> args;
+
+  Type result;
+
+  /// Result of the invocation calculated before invocation was invalidated.
+  /// Used to check if the re-analysis of the invocation yields the same
+  /// result or not (to avoid invalidation of callers if result hasn't changed).
+  Type invalidatedResult;
+
+  bool _isPolymorphic = false;
+  Set<Call> _callSites; // Populated only if non-direct and not polymorphic.
+  Member _monomorphicTarget;
+
+  _Invocation(this.selector, this.args);
+
+  // Only take selector and args into account as _Invocation objects
+  // are cached in _InvocationsCache using selector and args as a key.
+  @override
+  bool operator ==(other) =>
+      (other is _Invocation) &&
+      (this.selector == other.selector) &&
+      (this.args == other.args);
+
+  @override
+  int get hashCode => (selector.hashCode ^ args.hashCode + 31) & kHashMask;
+
+  @override
+  String toString() => "_Invocation $selector $args";
+
+  void setPolymorphic() {
+    if (!_isPolymorphic) {
+      _isPolymorphic = true;
+      _monomorphicTarget = null;
+
+      _notifyCallSites();
+
+      _callSites = null; // No longer needed.
+    }
+  }
+
+  void setMonomorphicTarget(Member target) {
+    assertx(!_isPolymorphic);
+    assertx((_monomorphicTarget == null) || (_monomorphicTarget == target));
+    _monomorphicTarget = target;
+
+    _notifyCallSites();
+  }
+
+  void addCallSite(Call callSite) {
+    if (selector is DirectSelector) {
+      return;
+    }
+
+    _notifyCallSite(callSite);
+
+    if (!callSite.isPolymorphic) {
+      assertx(!_isPolymorphic);
+      (_callSites ??= new Set<Call>()).add(callSite);
+    }
+  }
+
+  /// Notify call site about changes in polymorphism of this invocation.
+  void _notifyCallSite(Call callSite) {
+    assert(selector is! DirectSelector);
+
+    if (_isPolymorphic) {
+      callSite.setPolymorphic();
+    } else {
+      if (_monomorphicTarget != null) {
+        callSite.addTarget(_monomorphicTarget);
+      }
+    }
+  }
+
+  /// Notify call sites monitoring this invocation about changes in
+  /// polymorphism of this invocation.
+  void _notifyCallSites() {
+    if (_callSites != null) {
+      _callSites.forEach(_notifyCallSite);
+    }
+  }
+}
+
+class _InvocationsCache {
+  final Set<_Invocation> _invocations = new Set<_Invocation>();
+
+  _Invocation getInvocation(Selector selector, Args<Type> args) {
+    _Invocation invocation = new _Invocation(selector, args);
+    _Invocation result = _invocations.lookup(invocation);
+    if (result == null) {
+      bool added = _invocations.add(invocation);
+      assertx(added);
+      result = invocation;
+    }
+    return result;
+  }
+}
+
+/// Base class for handlers of invocations of a member.
+abstract class _MemberInvocationHandler extends _DependencyTracker {
+  final Member member;
+  Summary _summary;
+
+  _MemberInvocationHandler(this.member);
+
+  Summary getSummary(TypeFlowAnalysis typeFlowAnalysis) {
+    return _summary ??= typeFlowAnalysis.summaryCollector.createSummary(member);
+  }
+
+  Type handleInvocation(
+      _Invocation invocation, TypeFlowAnalysis typeFlowAnalysis);
+
+  @override
+  String toString() => "_M $member";
+}
+
+class _ProcedureInvocationHandler extends _MemberInvocationHandler {
+  _ProcedureInvocationHandler(Member member) : super(member);
+
+  @override
+  Type handleInvocation(
+      _Invocation invocation, TypeFlowAnalysis typeFlowAnalysis) {
+    if (invocation.selector.memberAgreesToCallKind(member)) {
+      if (_isLegalNumberOfArguments(invocation)) {
+        addDependentInvocation(typeFlowAnalysis.currentInvocation);
+        return getSummary(typeFlowAnalysis).apply(
+            invocation.args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis);
+      } else {
+        return new Type.empty();
+      }
+    } else {
+      if (invocation.selector.callKind == CallKind.PropertyGet) {
+        // Tear-off.
+        // TODO(alexmarkov): capture receiver type
+        assertx((member is Procedure) &&
+            !(member as Procedure).isGetter &&
+            !(member as Procedure).isSetter);
+        typeFlowAnalysis.addRawCall(new DirectSelector(member));
+        return new Type.fromStatic(const DynamicType());
+      } else {
+        // Call via getter.
+        // TODO(alexmarkov): capture receiver type
+        assertx((invocation.selector.callKind == CallKind.Method) &&
+            (member is Procedure) &&
+            (member as Procedure).isGetter);
+        typeFlowAnalysis.addRawCall(
+            new DirectSelector(member, callKind: CallKind.PropertyGet));
+        return new Type.fromStatic(const DynamicType());
+      }
+    }
+  }
+
+  bool _isLegalNumberOfArguments(_Invocation invocation) {
+    final function = member.function;
+    assertx(function != null);
+
+    final int positionalArguments = invocation.args.positionalCount;
+
+    final int firstParamIndex = hasReceiverArg(member) ? 1 : 0;
+    final int requiredParameters =
+        firstParamIndex + function.requiredParameterCount;
+    if (positionalArguments < requiredParameters) {
+      return false;
+    }
+
+    final int positionalParameters =
+        firstParamIndex + function.positionalParameters.length;
+    if (positionalArguments > positionalParameters) {
+      return false;
+    }
+
+    return true;
+  }
+}
+
+class _FieldGetterInvocationHandler extends _MemberInvocationHandler {
+  Type value;
+
+  _FieldGetterInvocationHandler(Field member) : super(member);
+
+  Field get field => member as Field;
+
+  int get receiverCount => field.isStatic ? 0 : 1;
+
+  void ensureInitialized(TypeFlowAnalysis typeFlowAnalysis) {
+    if (value == null) {
+      // Evaluate initializer
+      final args = new Args<Type>(const <Type>[]);
+      value = getSummary(typeFlowAnalysis)
+          .apply(args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis);
+
+      // TODO(alexmarkov): re-evaluate initializer on invalidations
+    }
+  }
+
+  @override
+  Type handleInvocation(
+      _Invocation invocation, TypeFlowAnalysis typeFlowAnalysis) {
+    ensureInitialized(typeFlowAnalysis);
+
+    if (invocation.selector.callKind == CallKind.PropertyGet) {
+      assertx(invocation.args.values.length == receiverCount);
+      assertx(invocation.args.names.isEmpty);
+      addDependentInvocation(typeFlowAnalysis.currentInvocation);
+      return value;
+    } else {
+      // Call via field.
+      assertx(invocation.selector.callKind == CallKind.Method);
+      return new Type.fromStatic(const DynamicType());
+    }
+  }
+
+  @override
+  String toString() => "_GetF $member {value: $value}";
+}
+
+class _FieldSetterInvocationHandler extends _MemberInvocationHandler {
+  final _FieldGetterInvocationHandler getter;
+
+  _FieldSetterInvocationHandler(this.getter) : super(getter.field);
+
+  Field get field => getter.field;
+  int get receiverCount => getter.receiverCount;
+
+  @override
+  Type handleInvocation(
+      _Invocation invocation, TypeFlowAnalysis typeFlowAnalysis) {
+    getter.ensureInitialized(typeFlowAnalysis);
+    assertx(invocation.selector.callKind == CallKind.PropertySet);
+
+    assertx(invocation.args.values.length == receiverCount + 1);
+    assertx(invocation.args.names.isEmpty);
+    final Type setterArg = invocation.args.values[receiverCount];
+
+    final Type newType =
+        getter.value.union(setterArg, typeFlowAnalysis.hierarchyCache);
+    if (newType != getter.value) {
+      getter.invalidateDependentInvocations(typeFlowAnalysis.workList);
+      getter.value = newType;
+    }
+    return new Type.empty();
+  }
+
+  @override
+  String toString() => "_SetF $member";
+}
+
+class _DynamicInvocationHandler extends _DependencyTracker {
+  final DynamicSelector selector;
+  final Set<Member> targets = new Set<Member>();
+
+  _DynamicInvocationHandler(this.selector);
+}
+
+class _ClassData extends _DependencyTracker {
+  final Class class_;
+  final Set<_ClassData> supertypes; // List of super-types including this.
+  final Set<_ClassData> allocatedSubtypes = new Set<_ClassData>();
+
+  _ClassData(this.class_, this.supertypes) {
+    supertypes.add(this);
+  }
+
+  @override
+  String toString() => "_C $class_";
+
+  String dump() => "$this {supers: $supertypes}";
+}
+
+class _ClassHierarchyCache implements TypeHierarchy {
+  final TypeFlowAnalysis _typeFlowAnalysis;
+  final ClosedWorldClassHierarchy hierarchy;
+  final Set<Class> allocatedClasses = new Set<Class>();
+  final Map<Class, _ClassData> classes = <Class, _ClassData>{};
+
+  final Map<Member, _ProcedureInvocationHandler> _procedureHandlers =
+      <Member, _ProcedureInvocationHandler>{};
+  final Map<Field, _FieldGetterInvocationHandler> _fieldGetterHandlers =
+      <Field, _FieldGetterInvocationHandler>{};
+  final Map<Field, _FieldSetterInvocationHandler> _fieldSetterHandlers =
+      <Field, _FieldSetterInvocationHandler>{};
+  final Map<DynamicSelector, _DynamicInvocationHandler> _dynamicHandlers =
+      <DynamicSelector, _DynamicInvocationHandler>{};
+
+  _ClassHierarchyCache(this._typeFlowAnalysis, this.hierarchy);
+
+  _ClassData getClassData(Class c) {
+    return classes[c] ??= _createClassData(c);
+  }
+
+  _ClassData _createClassData(Class c) {
+    final supertypes = new Set<_ClassData>();
+    for (var sup in c.supers) {
+      supertypes.addAll(getClassData(sup.classNode).supertypes);
+    }
+    return new _ClassData(c, supertypes);
+  }
+
+  void addAllocatedClass(Class cl) {
+    assertx(!cl.isAbstract);
+
+    if (allocatedClasses.add(cl)) {
+      final _ClassData classData = getClassData(cl);
+      classData.allocatedSubtypes.add(classData);
+      classData.invalidateDependentInvocations(_typeFlowAnalysis.workList);
+
+      for (var supertype in classData.supertypes) {
+        supertype.allocatedSubtypes.add(classData);
+        supertype.invalidateDependentInvocations(_typeFlowAnalysis.workList);
+      }
+
+      for (var handler in _dynamicHandlers.values) {
+        _addDynamicTarget(cl, handler);
+      }
+    }
+  }
+
+  @override
+  bool isSubtype(DartType subType, DartType superType) {
+    tracePrint(
+        "isSubtype for sub = $subType (${subType.runtimeType}), sup = $superType (${superType.runtimeType})");
+    if (subType == superType) {
+      return true;
+    }
+
+    // TODO(alexmarkov): handle function types properly
+    if (subType is FunctionType) {
+      subType = _typeFlowAnalysis.environment.rawFunctionType;
+    }
+    if (superType is FunctionType) {
+      superType = _typeFlowAnalysis.environment.rawFunctionType;
+    }
+    // TODO(alexmarkov): handle generic types properly.
+    if (subType is TypeParameterType) {
+      subType = (subType as TypeParameterType).bound;
+    }
+    if (superType is TypeParameterType) {
+      superType = (superType as TypeParameterType).bound;
+    }
+
+    assertx(subType is InterfaceType, details: subType); // TODO(alexmarkov)
+    assertx(superType is InterfaceType, details: superType); // TODO(alexmarkov)
+
+    Class subClass = (subType as InterfaceType).classNode;
+    Class superClass = (superType as InterfaceType).classNode;
+    if (subClass == superClass) {
+      return true;
+    }
+
+    _ClassData subClassData = getClassData(subClass);
+    _ClassData superClassData = getClassData(superClass);
+
+    return subClassData.supertypes.contains(superClassData);
+  }
+
+  @override
+  Type specializeTypeCone(DartType base) {
+    tracePrint("specializeTypeCone for $base");
+    Statistics.typeConeSpecializations++;
+
+    // TODO(alexmarkov): handle function types properly
+    if (base is FunctionType) {
+      base = _typeFlowAnalysis.environment.rawFunctionType;
+    }
+
+    if (base is TypeParameterType) {
+      base = (base as TypeParameterType).bound;
+    }
+
+    assertx(base is InterfaceType); // TODO(alexmarkov)
+
+    // TODO(alexmarkov): take type arguments into account.
+
+    // TODO(alexmarkov): consider approximating type if number of allocated
+    // subtypes is too large
+
+    if (base == const DynamicType() ||
+        base == _typeFlowAnalysis.environment.objectType) {
+      return const AnyType();
+    }
+
+    _ClassData classData = getClassData((base as InterfaceType).classNode);
+
+    final allocatedSubtypes = classData.allocatedSubtypes;
+    classData.addDependentInvocation(_typeFlowAnalysis.currentInvocation);
+
+    final int numSubTypes = allocatedSubtypes.length;
+
+    if (numSubTypes == 0) {
+      return new Type.empty();
+    } else if (numSubTypes == 1) {
+      return new Type.concrete(allocatedSubtypes.single.class_.rawType);
+    } else {
+      Set<ConcreteType> types = new Set<ConcreteType>();
+      for (var sub in allocatedSubtypes) {
+        types.add(new Type.concrete(sub.class_.rawType));
+      }
+      return new SetType(types);
+    }
+  }
+
+  _MemberInvocationHandler getMemberHandler(Member member, CallKind callKind) {
+    if (member is Field) {
+      if (callKind == CallKind.PropertySet) {
+        return _fieldSetterHandlers[member] ??=
+            new _FieldSetterInvocationHandler(
+                getMemberHandler(member, CallKind.PropertyGet));
+      } else {
+        return _fieldGetterHandlers[member] ??=
+            new _FieldGetterInvocationHandler(member);
+      }
+    } else {
+      return _procedureHandlers[member] ??=
+          new _ProcedureInvocationHandler(member);
+    }
+  }
+
+  bool isMemberUsed(Member member) {
+    if (member is Field) {
+      return _fieldGetterHandlers[member]?.value != null;
+    } else {
+      return _procedureHandlers[member]?._summary != null;
+    }
+  }
+
+  Iterable<Member> getDynamicTargets(DynamicSelector selector) {
+    final handler =
+        (_dynamicHandlers[selector] ??= _createDynamicHandler(selector));
+    return handler.targets;
+  }
+
+  _DynamicInvocationHandler _createDynamicHandler(DynamicSelector selector) {
+    final handler = new _DynamicInvocationHandler(selector);
+    for (Class c in allocatedClasses) {
+      _addDynamicTarget(c, handler);
+    }
+    return handler;
+  }
+
+  void _addDynamicTarget(Class c, _DynamicInvocationHandler handler) {
+    final selector = handler.selector;
+    final member = hierarchy.getDispatchTarget(c, selector.name,
+        setter: selector.isSetter);
+    if (member != null) {
+      if (selector.memberAgreesToCallKind(member)) {
+        if (handler.targets.add(member)) {
+          handler.invalidateDependentInvocations(_typeFlowAnalysis.workList);
+        }
+      } else {
+        if (selector.callKind == CallKind.Method) {
+          // Call via getter/field.
+          // TODO(alexmarkov)
+          // assertx(false);
+        } else {
+          assertx(selector.callKind == CallKind.PropertyGet);
+          // Tear-off.
+          // TODO(alexmarkov)
+          // assertx(false);
+        }
+      }
+    }
+  }
+
+  @override
+  String toString() {
+    StringBuffer buf = new StringBuffer();
+    buf.write("_ClassHierarchyCache {\n");
+    buf.write("  allocated classes:\n");
+    allocatedClasses.forEach((c) {
+      buf.write("    $c\n");
+    });
+    buf.write("  classes:\n");
+    classes.values.forEach((c) {
+      buf.write("    ${c.dump()}\n");
+    });
+    buf.write("  handlers:\n");
+    _procedureHandlers.values.forEach((handler) {
+      buf.write("    $handler\n");
+    });
+    _fieldGetterHandlers.values.forEach((handler) {
+      buf.write("    $handler\n");
+    });
+    _fieldSetterHandlers.values.forEach((handler) {
+      buf.write("    $handler\n");
+    });
+    buf.write("}\n");
+    return buf.toString();
+  }
+}
+
+class _InvocationAnalyzer {
+  final TypeFlowAnalysis _typeFlowAnalysis;
+
+  _InvocationAnalyzer(this._typeFlowAnalysis);
+
+  Type processInvocation(_Invocation invocation) {
+    final Selector selector = invocation.selector;
+    Type result = null;
+
+    if (selector is DirectSelector) {
+      result = _processDirectInvocation(selector, invocation);
+    } else {
+      result = _processMultipleTargets(selector, invocation);
+    }
+
+    assertx(result != null);
+    invocation.result = result;
+
+    if (invocation.invalidatedResult != null) {
+      if (invocation.invalidatedResult != result) {
+        invocation.invalidateDependentInvocations(_typeFlowAnalysis.workList);
+      }
+      invocation.invalidatedResult = null;
+    }
+
+    return result;
+  }
+
+  Type _processDirectInvocation(
+      DirectSelector selector, _Invocation invocation) {
+    final handler = _typeFlowAnalysis.hierarchyCache
+        .getMemberHandler(selector.member, selector.callKind);
+    return handler.handleInvocation(invocation, _typeFlowAnalysis);
+  }
+
+  Type _processMultipleTargets(Selector selector, _Invocation invocation) {
+    Iterable<_MemberInvocationHandler> targets = _collectTargets(invocation);
+    Type result = new Type.empty();
+
+    if (targets.isEmpty) {
+      tracePrint("No targets...");
+    } else {
+      if (targets.length == 1) {
+        invocation.setMonomorphicTarget(targets.single.member);
+      } else {
+        invocation.setPolymorphic();
+      }
+      for (var handler in targets) {
+        Type type = handler.handleInvocation(invocation, _typeFlowAnalysis);
+        result = result.union(type, _typeFlowAnalysis.hierarchyCache);
+      }
+    }
+
+    // TODO(alexmarkov): handle closures more precisely
+    if ((selector is DynamicSelector) && (selector.name.name == "call")) {
+      tracePrint("Possible closure call, result is dynamic");
+      result = new Type.fromStatic(const DynamicType());
+    }
+
+    return result;
+  }
+
+  Iterable<_MemberInvocationHandler> _collectTargets(_Invocation invocation) {
+    assertx(invocation.selector is! DirectSelector);
+
+    Type receiver = invocation.args.receiver;
+    assertx(receiver != const EmptyType()); // should be filtered earlier
+
+    Set<Member> targets = new Set<Member>();
+    _collectForReceiverType(receiver, invocation.selector, targets);
+
+    return targets.map((Member member) => _typeFlowAnalysis.hierarchyCache
+        .getMemberHandler(member, invocation.selector.callKind));
+  }
+
+  void _collectForReceiverType(
+      Type receiver, Selector selector, Set<Member> targets) {
+    if (receiver is NullableType) {
+      _collectForConcreteType(
+          _typeFlowAnalysis.environment.nullType, selector, targets);
+      receiver = (receiver as NullableType).baseType;
+      assertx(receiver is! NullableType);
+    }
+
+    if (selector is InterfaceSelector) {
+      final staticReceiverType =
+          new Type.fromStatic(selector.member.enclosingClass.rawType);
+      receiver = receiver.intersection(
+          staticReceiverType, _typeFlowAnalysis.hierarchyCache);
+      assertx(receiver is! NullableType);
+
+      tracePrint("Narrowed down receiver type: $receiver");
+    }
+
+    if (receiver is ConeType) {
+      receiver = _typeFlowAnalysis.hierarchyCache
+          .specializeTypeCone((receiver as ConeType).dartType);
+    }
+
+    if (receiver is ConcreteType) {
+      _collectForConcreteType(receiver.dartType, selector, targets);
+    } else if (receiver is SetType) {
+      for (var type in receiver.types) {
+        _collectForConcreteType(type.dartType, selector, targets);
+      }
+    } else if (receiver is AnyType) {
+      _collectForSelector(selector, targets);
+    } else {
+      assertx(receiver is EmptyType);
+    }
+  }
+
+  void _collectForConcreteType(
+      DartType receiver, Selector selector, Set<Member> targets) {
+    if (receiver is FunctionType) {
+      assertx((selector is DynamicSelector) && (selector.name.name == "call"));
+      return;
+    }
+
+    assertx(receiver is InterfaceType); // TODO(alexmarkov)
+
+    Class class_ = (receiver as InterfaceType).classNode;
+
+    Member target = _typeFlowAnalysis.hierarchyCache.hierarchy
+        .getDispatchTarget(class_, selector.name, setter: selector.isSetter);
+
+    if (target != null) {
+      tracePrint("Found $target for concrete receiver type $receiver");
+      targets.add(target);
+    } else {
+      tracePrint("Target is not found for concrete receiver type $receiver");
+    }
+  }
+
+  void _collectForSelector(Selector selector, Set<Member> targets) {
+    if (selector is InterfaceSelector) {
+      // TODO(alexmarkov): support generic types and make sure inferred types
+      // are always same or better than static types.
+//      assertx(selector.member.enclosingClass ==
+//          _typeFlowAnalysis.environment.coreTypes.objectClass, details: selector);
+      selector = new DynamicSelector(selector.callKind, selector.name);
+    }
+
+    targets.addAll(_typeFlowAnalysis.hierarchyCache
+        .getDynamicTargets(selector as DynamicSelector));
+  }
+}
+
+class _WorkList {
+  final TypeFlowAnalysis _typeFlowAnalysis;
+  final Set<_Invocation> pending = new Set<_Invocation>();
+  final Set<_Invocation> processing = new Set<_Invocation>();
+  final List<_Invocation> callStack = <_Invocation>[];
+
+  _WorkList(this._typeFlowAnalysis);
+
+  void enqueueInvocation(_Invocation invocation) {
+    assertx(invocation.result == null);
+    if (!pending.add(invocation)) {
+      // Re-add the invocation to the tail of the pending queue.
+      pending.remove(invocation);
+      pending.add(invocation);
+    }
+  }
+
+  void invalidateInvocation(_Invocation invocation) {
+    Statistics.invocationsInvalidated++;
+    if (invocation.result != null) {
+      invocation.invalidatedResult = invocation.result;
+      invocation.result = null;
+    }
+    enqueueInvocation(invocation);
+  }
+
+  void process() {
+    while (pending.isNotEmpty) {
+      assertx(callStack.isEmpty && processing.isEmpty);
+      _Invocation invocation = pending.first;
+
+      // Remove from pending before processing, as the invocation
+      // could be invalidated and re-added to pending while processing.
+      pending.remove(invocation);
+
+      processInvocation(invocation);
+      assertx(invocation.result != null);
+    }
+  }
+
+  Type processInvocation(_Invocation invocation) {
+    if (invocation.result != null) {
+      // Already processed.
+      Statistics.usedCachedResultsOfInvocations++;
+      return invocation.result;
+    }
+
+    // Test if tracing is enabled to avoid expensive message formatting.
+    if (kPrintTrace) {
+      tracePrint('PROCESSING $invocation');
+    }
+
+    if (processing.add(invocation)) {
+      callStack.add(invocation);
+
+      final Type result =
+          _typeFlowAnalysis.invocationAnalyzer.processInvocation(invocation);
+
+      final last = callStack.removeLast();
+      assertx(identical(last, invocation));
+
+      processing.remove(invocation);
+
+      Statistics.invocationsProcessed++;
+      return result;
+    } else {
+      // Recursive invocation, approximate with static type.
+      Statistics.recursiveInvocationsApproximated++;
+      return new Type.fromStatic(invocation.selector.staticReturnType);
+    }
+  }
+}
+
+class TypeFlowAnalysis implements EntryPointsListener, CallHandler {
+  final TypeEnvironment environment;
+  final LibraryIndex libraryIndex;
+  final NativeCodeOracle nativeCodeOracle;
+  _ClassHierarchyCache hierarchyCache;
+  SummaryCollector summaryCollector;
+  _InvocationsCache _invocationsCache = new _InvocationsCache();
+  _InvocationAnalyzer invocationAnalyzer;
+  _WorkList workList;
+
+  TypeFlowAnalysis(
+      ClosedWorldClassHierarchy hierarchy, this.environment, this.libraryIndex,
+      {List<String> entryPointsJSONFiles})
+      : nativeCodeOracle = new NativeCodeOracle(libraryIndex) {
+    hierarchyCache = new _ClassHierarchyCache(this, hierarchy);
+    summaryCollector =
+        new SummaryCollector(environment, this, nativeCodeOracle);
+    invocationAnalyzer = new _InvocationAnalyzer(this);
+    workList = new _WorkList(this);
+
+    if (entryPointsJSONFiles != null) {
+      nativeCodeOracle.processEntryPointsJSONFiles(entryPointsJSONFiles, this);
+    }
+  }
+
+  _Invocation get currentInvocation => workList.callStack.last;
+
+  void process() {
+    workList.process();
+  }
+
+  bool isMemberUsed(Member member) => hierarchyCache.isMemberUsed(member);
+
+  Call callSite(TreeNode node) => summaryCollector.callSites[node];
+
+  /// ---- Implementation of [CallHandler] interface. ----
+
+  @override
+  Type applyCall(
+      Call callSite, Selector selector, Args<Type> args, bool isResultUsed,
+      {bool processImmediately: true}) {
+    _Invocation invocation = _invocationsCache.getInvocation(selector, args);
+
+    // Test if tracing is enabled to avoid expensive message formatting.
+    if (kPrintTrace) {
+      tracePrint("APPLY $invocation");
+    }
+
+    if (callSite != null) {
+      invocation.addCallSite(callSite);
+    }
+
+    // TODO(alexmarkov): Figure out better strategy of processing
+    // an invocation if its result is not used.
+    // Enqueueing such invocations regresses the analysis time considerably.
+
+    if (processImmediately) {
+      if (isResultUsed) {
+        invocation.addDependentInvocation(currentInvocation);
+      }
+
+      return workList.processInvocation(invocation);
+    } else {
+      assertx(!isResultUsed);
+
+      if (invocation.result == null) {
+        workList.enqueueInvocation(invocation);
+      }
+
+      return null;
+    }
+  }
+
+  /// ---- Implementation of [EntryPointsListener] interface. ----
+
+  @override
+  void addRawCall(Selector selector) {
+    debugPrint("ADD RAW CALL: $selector");
+    assertx(selector is! DynamicSelector); // TODO(alexmarkov)
+
+    applyCall(null, selector, summaryCollector.rawArguments(selector), false,
+        processImmediately: false);
+  }
+
+  @override
+  void addAllocatedClass(Class c) {
+    debugPrint("ADD ALLOCATED CLASS: $c");
+    hierarchyCache.addAllocatedClass(c);
+  }
+
+  @override
+  void addAllocatedType(InterfaceType type) {
+    tracePrint("ADD ALLOCATED TYPE: $type");
+
+    // TODO(alexmarkov): take type arguments into account.
+
+    hierarchyCache.addAllocatedClass(type.classNode);
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/calls.dart b/pkg/vm/lib/transformations/type_flow/calls.dart
new file mode 100644
index 0000000..3fb41129
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/calls.dart
@@ -0,0 +1,222 @@
+// 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.
+
+/// Declares classes which describe a call: selectors and arguments.
+library vm.transformations.type_flow.calls;
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart';
+
+import 'types.dart';
+import 'utils.dart';
+
+enum CallKind {
+  Method, // x.foo(..) or foo()
+  PropertyGet, // ... x.foo ...
+  PropertySet, // x.foo = ...
+}
+
+/// [Selector] encapsulates the way of calling (at the call site).
+abstract class Selector {
+  /// Call kind: how call is performed?
+  final CallKind callKind;
+
+  Selector(this.callKind);
+
+  /// Interface or concrete target, may be null.
+  Member get member;
+
+  /// Selector name.
+  Name get name => member.name;
+
+  bool get isSetter => (callKind == CallKind.PropertySet);
+
+  @override
+  int get hashCode => callKind.hashCode;
+
+  @override
+  bool operator ==(other) => other is Selector && other.callKind == callKind;
+
+  /// Static approximation of Dart return type.
+  DartType get staticReturnType {
+    if (member == null) {
+      return const DynamicType();
+    }
+    switch (callKind) {
+      case CallKind.Method:
+        return (member is Procedure)
+            ? member.function.returnType
+            : const BottomType();
+      case CallKind.PropertyGet:
+        return member.getterType;
+      case CallKind.PropertySet:
+        return const BottomType();
+    }
+    return null;
+  }
+
+  bool memberAgreesToCallKind(Member member) {
+    switch (callKind) {
+      case CallKind.Method:
+        return ((member is Procedure) &&
+                !member.isGetter &&
+                !member.isSetter) ||
+            (member is Constructor);
+      case CallKind.PropertyGet:
+        return (member is Field) || ((member is Procedure) && member.isGetter);
+      case CallKind.PropertySet:
+        return (member is Field) || ((member is Procedure) && member.isSetter);
+    }
+    return false;
+  }
+
+  String get _callKindPrefix {
+    switch (callKind) {
+      case CallKind.Method:
+        return '';
+      case CallKind.PropertyGet:
+        return 'get ';
+      case CallKind.PropertySet:
+        return 'set ';
+    }
+    return '';
+  }
+}
+
+/// Direct call to [member].
+class DirectSelector extends Selector {
+  final Member member;
+
+  DirectSelector(this.member, {CallKind callKind = CallKind.Method})
+      : super(callKind) {
+    assertx(memberAgreesToCallKind(member), details: member);
+  }
+
+  @override
+  int get hashCode => (super.hashCode ^ member.hashCode) & kHashMask;
+
+  @override
+  bool operator ==(other) =>
+      other is DirectSelector && super == (other) && other.member == member;
+
+  @override
+  String toString() => 'direct ${_callKindPrefix}[$member]';
+}
+
+/// Interface call via known interface target [member].
+class InterfaceSelector extends Selector {
+  final Member member;
+
+  InterfaceSelector(this.member, {CallKind callKind = CallKind.Method})
+      : super(callKind) {
+    assertx(memberAgreesToCallKind(member));
+  }
+
+  @override
+  int get hashCode => (super.hashCode ^ member.hashCode + 31) & kHashMask;
+
+  @override
+  bool operator ==(other) =>
+      other is InterfaceSelector && super == (other) && other.member == member;
+
+  @override
+  String toString() => '${_callKindPrefix}[$member]';
+}
+
+/// Dynamic call.
+class DynamicSelector extends Selector {
+  @override
+  final Name name;
+
+  DynamicSelector(CallKind callKind, this.name) : super(callKind);
+
+  @override
+  Member get member => null;
+
+  @override
+  int get hashCode => (super.hashCode ^ name.hashCode + 37) & kHashMask;
+
+  @override
+  bool operator ==(other) =>
+      other is DynamicSelector && super == (other) && other.name == name;
+
+  @override
+  String toString() => 'dynamic ${_callKindPrefix}[$name]';
+}
+
+/// Arguments passed to a call, including implicit receiver argument.
+// TODO(alexmarkov): use this class instead of List<Type> / List<TypeExpr>.
+// TODO(alexmarkov): take type arguments into account
+// TODO(alexmarkov): keep names sorted
+class Args<T extends TypeExpr> {
+  final List<T> values;
+  final List<String> names;
+  int _hashCode;
+
+  Args(this.values, {this.names = const <String>[]});
+
+  int get positionalCount => values.length - names.length;
+
+  // TODO(alexmarkov): get rid of this method
+  List<T> get positional => values.sublist(0, positionalCount);
+
+  T get receiver => values[0];
+
+  @override
+  int get hashCode => _hashCode ??= _computeHashCode();
+
+  int _computeHashCode() {
+    int hash = 1231;
+    for (var v in values) {
+      hash = (((hash * 31) & kHashMask) + v.hashCode) & kHashMask;
+    }
+    for (var n in names) {
+      hash = (((hash * 31) & kHashMask) + n.hashCode) & kHashMask;
+    }
+    return hash;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is Args<T> &&
+        (this.values.length == other.values.length) &&
+        (this.names.length == other.names.length)) {
+      for (int i = 0; i < values.length; i++) {
+        if (values[i] != other.values[i]) {
+          return false;
+        }
+      }
+      for (int i = 0; i < names.length; i++) {
+        if (names[i] != other.names[i]) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buf = new StringBuffer();
+    buf.write("(");
+    for (int i = 0; i < positionalCount; i++) {
+      if (i != 0) {
+        buf.write(", ");
+      }
+      buf.write(values[i]);
+    }
+    for (int i = 0; i < names.length; i++) {
+      if (positionalCount + i != 0) {
+        buf.write(", ");
+      }
+      buf.write(names[i]);
+      buf.write(': ');
+      buf.write(values[positionalCount + i]);
+    }
+    buf.write(")");
+    return buf.toString();
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/entry_points.json b/pkg/vm/lib/transformations/type_flow/entry_points.json
new file mode 100644
index 0000000..17b472c
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/entry_points.json
@@ -0,0 +1,2128 @@
+{
+  "roots": [
+    {
+      "library": "dart:core",
+      "class": "Object",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_LibraryPrefix",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Type",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_TypeRef",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_TypeParameter",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_BoundedType",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_MixinAppType",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Closure",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Smi",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Mint",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Bigint",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Double",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "bool",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_GrowableList",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float32x4",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int32x4",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float64x2",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "_CapabilityImpl",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "_RawReceivePortImpl",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "_SendPortImpl",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_StackTrace",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_RegExp",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_WeakProperty",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:mirrors",
+      "class": "_MirrorReference",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:collection",
+      "class": "_InternalLinkedHashMap",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:developer",
+      "class": "_UserTag",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_ImmutableList",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_OneByteString",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_TwoByteString",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_ExternalOneByteString",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_ExternalTwoByteString",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int8List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint8List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint8ClampedList",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int16List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint16List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int32List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint32List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int64List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint64List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float32List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float64List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float32x4List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int32x4List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float64x2List",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int8ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint8ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint8ClampedArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int16ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint16ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int32ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint32ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int64ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Uint64ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float32ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float64ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float32x4ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Int32x4ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_Float64x2ArrayView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ByteDataView",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalInt8Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalUint8Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalUint8ClampedArray",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalInt16Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalUint16Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalInt32Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalUint32Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalInt64Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalUint64Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalFloat32Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalFloat64Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalFloat32x4Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalInt32x4Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ExternalFloat64x2Array",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ByteBuffer",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "Null",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "AbstractClassInstantiationError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "ArgumentError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "ArgumentError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "CyclicInitializationError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "FallThroughError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "FormatException",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "NoSuchMethodError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "NullThrownError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "OutOfMemoryError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "RangeError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "RangeError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "StackOverflowError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "UnsupportedError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_AssertionError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_CastError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_InternalError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_TypeError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "IsolateSpawnException",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:io",
+      "class": "CertificateException",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:io",
+      "class": "FileSystemException",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:io",
+      "class": "HandshakeException",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:io",
+      "class": "OSError",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:io",
+      "class": "TlsException",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "name": "_completeDeferredLoads",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "name": "identityHashCode",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "AbstractClassInstantiationError",
+      "name": "AbstractClassInstantiationError._create",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "ArgumentError",
+      "name": "ArgumentError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "ArgumentError",
+      "name": "ArgumentError.value",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "CyclicInitializationError",
+      "name": "CyclicInitializationError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "FallThroughError",
+      "name": "FallThroughError._create",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "FormatException",
+      "name": "FormatException",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "NoSuchMethodError",
+      "name": "NoSuchMethodError._withType",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "NullThrownError",
+      "name": "NullThrownError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "OutOfMemoryError",
+      "name": "OutOfMemoryError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "RangeError",
+      "name": "RangeError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "RangeError",
+      "name": "RangeError.range",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "StackOverflowError",
+      "name": "StackOverflowError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "UnsupportedError",
+      "name": "UnsupportedError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_AssertionError",
+      "name": "_AssertionError._create",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_CastError",
+      "name": "_CastError._create",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_InternalError",
+      "name": "_InternalError",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_InvocationMirror",
+      "name": "_allocateInvocationMirror",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_TypeError",
+      "name": "_TypeError._create",
+      "action": "call"
+    },
+    {
+      "library": "dart:collection",
+      "name": "_rehashObjects",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "IsolateSpawnException",
+      "name": "IsolateSpawnException",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "name": "_startIsolate",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "_RawReceivePortImpl",
+      "name": "_handleMessage",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "_RawReceivePortImpl",
+      "name": "_lookupHandler",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "class": "_SendPortImpl",
+      "name": "send",
+      "action": "call"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "ByteData",
+      "name": "ByteData",
+      "action": "call"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "ByteData",
+      "name": "ByteData._view",
+      "action": "call"
+    },
+    {
+      "library": "dart:typed_data",
+      "class": "_ByteBuffer",
+      "name": "_ByteBuffer._New",
+      "action": "call"
+    },
+    {
+      "library": "dart:_vmservice",
+      "name": "boot",
+      "action": "call"
+    },
+    {
+      "library": "dart:_vmservice",
+      "name": "_registerIsolate",
+      "action": "call"
+    },
+    {
+      "library": "dart:developer",
+      "class": "Metrics",
+      "name": "_printMetrics",
+      "action": "call"
+    },
+    {
+      "library": "dart:developer",
+      "name": "_runExtension",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "name": "_runPendingImmediateCallback",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "Error",
+      "name": "_stackTrace",
+      "action": "get"
+    },
+    {
+      "library": "dart:core",
+      "class": "Error",
+      "name": "_stackTrace",
+      "action": "set"
+    },
+    {
+      "library": "dart:core",
+      "name": "_uriBaseClosure",
+      "action": "get"
+    },
+    {
+      "library": "dart:core",
+      "name": "_uriBaseClosure",
+      "action": "set"
+    },
+    {
+      "library": "dart:math",
+      "class": "_Random",
+      "name": "_state",
+      "action": "get"
+    },
+    {
+      "library": "dart:math",
+      "class": "_Random",
+      "name": "_state",
+      "action": "set"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_getPrintClosure",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_libraryFilePath",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_resolveInWorkingDirectory",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_setPackageRoot",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_setPackagesMap",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_setWorkingDirectory",
+      "action": "call"
+    },
+    {
+      "library": "dart:async",
+      "name": "_setScheduleImmediateClosure",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "name": "_getUriBaseClosure",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "name": "_getWatchSignalInternal",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "name": "_makeDatagram",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "name": "_makeUint8ListView",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "name": "_setupHooks",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "_EmbedderConfig",
+      "name": "_mayExit",
+      "action": "get"
+    },
+    {
+      "library": "dart:io",
+      "class": "_EmbedderConfig",
+      "name": "_mayExit",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ExternalBuffer",
+      "name": "end",
+      "action": "get"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ExternalBuffer",
+      "name": "start",
+      "action": "get"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ExternalBuffer",
+      "name": "data",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ExternalBuffer",
+      "name": "end",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ExternalBuffer",
+      "name": "start",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_Namespace",
+      "name": "_setupNamespace",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "_Platform",
+      "name": "_nativeScript",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ProcessStartStatus",
+      "name": "_errorCode",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_ProcessStartStatus",
+      "name": "_errorMessage",
+      "action": "set"
+    },
+    {
+      "library": "dart:io",
+      "class": "_SecureFilterImpl",
+      "name": "buffers",
+      "action": "get"
+    },
+    {
+      "library": "dart:io",
+      "class": "_SecureFilterImpl",
+      "name": "ENCRYPTED_SIZE",
+      "action": "get"
+    },
+    {
+      "library": "dart:io",
+      "class": "_SecureFilterImpl",
+      "name": "SIZE",
+      "action": "get"
+    },
+    {
+      "library": "dart:io",
+      "class": "CertificateException",
+      "name": "CertificateException",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "Directory",
+      "name": "Directory",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "File",
+      "name": "File",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "FileSystemException",
+      "name": "FileSystemException",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "HandshakeException",
+      "name": "HandshakeException",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "Link",
+      "name": "Link",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "OSError",
+      "name": "OSError",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "TlsException",
+      "name": "TlsException",
+      "action": "call"
+    },
+    {
+      "library": "dart:io",
+      "class": "X509Certificate",
+      "name": "X509Certificate._",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "name": "_getIsolateScheduleImmediateClosure",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "name": "_setupHooks",
+      "action": "call"
+    },
+    {
+      "library": "dart:isolate",
+      "name": "_startMainIsolate",
+      "action": "call"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "main",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_isolateId",
+      "action": "get"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_isolateId",
+      "action": "set"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_loadPort",
+      "action": "get"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_loadPort",
+      "action": "set"
+    },
+    {
+      "library": "dart:_internal",
+      "name": "_printClosure",
+      "action": "get"
+    },
+    {
+      "library": "dart:_internal",
+      "name": "_printClosure",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_autoStart",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_autoStart",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_ip",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_ip",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_isFuchsia",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_isFuchsia",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_isWindows",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_isWindows",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_originCheckDisabled",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_originCheckDisabled",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_port",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_port",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_signalWatch",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_signalWatch",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_traceLoading",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_traceLoading",
+      "action": "set"
+    }
+  ],
+  "native-methods": {
+    "Identical_comparison": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "ClassID_getID": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "List_allocate": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_List",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetInt8": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetUint8": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetInt16": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetUint16": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetFloat32": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetFloat64": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetFloat32x4": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "TypedData_GetInt32x4": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Double_add": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_sub": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_mul": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_div": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float32x4_fromDoubles": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_zero": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_splat": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_fromInt32x4Bits": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_fromFloat64x2": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_shuffle": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_shuffleMix": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_cmpequal": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_cmpgt": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_cmpgte": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_cmplt": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_cmplte": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_cmpnequal": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_min": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_max": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_scale": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_sqrt": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_reciprocalSqrt": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_reciprocal": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_negate": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_abs": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_clamp": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_setX": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_setY": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_setZ": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_setW": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float64x2_fromDoubles": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_zero": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_splat": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_fromFloat32x4": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_getX": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float64x2_getY": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float64x2_negate": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_abs": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_sqrt": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_scale": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_setX": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_setY": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_min": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Float64x2_max": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2",
+        "nullable": false
+      }
+    ],
+    "Int32x4_fromInts": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_fromBools": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_fromFloat32x4Bits": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_getFlagX": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Int32x4_getFlagY": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Int32x4_getFlagZ": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Int32x4_getFlagW": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Int32x4_shuffle": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_shuffleMix": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_select": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_setFlagX": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_setFlagY": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_setFlagZ": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Int32x4_setFlagW": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4",
+        "nullable": false
+      }
+    ],
+    "Bigint_getNeg": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Bigint_getUsed": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Bigint_getDigits": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint32List",
+        "nullable": false
+      }
+    ],
+    "LinkedHashMap_getIndex": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint32List",
+        "nullable": false
+      }
+    ],
+    "LinkedHashMap_getData": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_List",
+        "nullable": false
+      }
+    ],
+    "LinkedHashMap_getUsedData": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "LinkedHashMap_getHashMask": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "LinkedHashMap_getDeletedKeys": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Smi_bitNegate": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Smi_bitLength": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Smi_bitAndFromSmi": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Double_getIsNaN": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Double_getIsInfinite": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Double_getIsNegative": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Double_doubleFromInteger": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "GrowableList_allocate": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_GrowableList",
+        "nullable": false
+      }
+    ],
+    "Object_equals": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Object_runtimeType": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Type",
+        "nullable": false
+      }
+    ],
+    "Object_haveSameRuntimeType": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "String_getHashCode": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "String_getHashCode": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "OneByteString_substringUnchecked": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_OneByteString",
+        "nullable": false
+      }
+    ],
+    "OneByteString_allocate": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_OneByteString",
+        "nullable": false
+      }
+    ],
+    "Type_getHashCode": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Object_getHash": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "TypedData_Int8Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int8List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Uint8Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint8List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Uint8ClampedArray_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint8ClampedList",
+        "nullable": false
+      }
+    ],
+    "TypedData_Int16Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int16List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Uint16Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint16List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Int32Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Uint32Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint32List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Int64Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int64List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Uint64Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Uint64List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Float32Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Float64Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Float32x4Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Int32x4Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Int32x4List",
+        "nullable": false
+      }
+    ],
+    "TypedData_Float64x2Array_new": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float64x2List",
+        "nullable": false
+      }
+    ],
+    "Integer_greaterThanFromInteger": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "Integer_equalToInteger": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "bool",
+        "nullable": false
+      }
+    ],
+    "List_getLength": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "List_getLength": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "GrowableList_getLength": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "GrowableList_getCapacity": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "String_getLength": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "String_codeUnitAt": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "String_codeUnitAt": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "String_codeUnitAt": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "String_codeUnitAt": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Double_flipSignBit": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_truncate": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_round": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_floor": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_ceil": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Double_modulo": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "TypedData_length": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Smi",
+        "nullable": false
+      }
+    ],
+    "Float32x4_getX": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float32x4_getY": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float32x4_getZ": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float32x4_getW": [
+      {
+        "action": "return",
+        "library": "dart:core",
+        "class": "_Double",
+        "nullable": false
+      }
+    ],
+    "Float32x4_mul": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_sub": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ],
+    "Float32x4_add": [
+      {
+        "action": "return",
+        "library": "dart:typed_data",
+        "class": "_Float32x4",
+        "nullable": false
+      }
+    ]
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/entry_points_extra.json b/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
new file mode 100644
index 0000000..dc3849b
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
@@ -0,0 +1,76 @@
+{
+  "roots": [
+    {
+      "library": "dart:core",
+      "class": "Object",
+      "name": "noSuchMethod",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "List",
+      "name": "_fromLiteral",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "Map",
+      "name": "_fromLiteral",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_ImmutableList",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_ImmutableMap",
+      "action": "create-instance"
+    },
+    {
+      "library": "dart:core",
+      "class": "_StringBase",
+      "name": "_interpolate",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_StringBase",
+      "name": "_interpolateSingle",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "name": "_classRangeAssert",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "name": "_classIdEqualsAssert",
+      "action": "call"
+    },
+    {
+      "library": "dart:_internal",
+      "name": "_classRangeCheck",
+      "action": "call"
+    },
+    {
+      "library": "dart:core",
+      "class": "_AssertionError",
+      "name": "_evaluateAssertion",
+      "action": "call"
+    },
+    {
+      "library": "dart:_builtin",
+      "name": "_resolveScriptUri",
+      "action": "call"
+    },
+    {
+      "library": "dart:math",
+      "class": "_Random",
+      "name": "_A",
+      "action": "get"
+    }
+  ]
+}
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
new file mode 100644
index 0000000..bd07402
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -0,0 +1,219 @@
+// 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.
+
+/// Handling of native code and entry points.
+library vm.transformations.type_flow.native_code;
+
+import 'dart:convert' show JSON;
+import 'dart:core' hide Type;
+import 'dart:io' show File;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/library_index.dart' show LibraryIndex;
+
+// TODO(alexmarkov): Move findNativeName out of treeshaker and avoid dependency
+// on unrelated transformation.
+import 'package:kernel/transformations/treeshaker.dart' show findNativeName;
+
+import 'calls.dart';
+import 'types.dart';
+import 'utils.dart';
+
+class EntryPointsListener {
+  /// Add call by the given selector with arbitrary ('raw') arguments.
+  void addRawCall(Selector selector) {}
+
+  /// Add instantiation of the given class.
+  void addAllocatedClass(Class c) {}
+
+  /// Add instantiation of the given type (may be generic).
+  void addAllocatedType(InterfaceType type) {}
+}
+
+/// Provides insights into the behavior of native code.
+class NativeCodeOracle {
+  final Map<String, List<Map<String, dynamic>>> _nativeMethods =
+      <String, List<Map<String, dynamic>>>{};
+  final LibraryIndex _libraryIndex;
+
+  NativeCodeOracle(this._libraryIndex);
+
+  /// Simulate the execution of a native method by adding its entry points
+  /// using [entryPointsListener]. Returns result type of the native method.
+  Type handleNativeProcedure(
+      Member member, EntryPointsListener entryPointsListener) {
+    final String nativeName = findNativeName(member);
+    Type returnType = null;
+
+    final nativeActions = _nativeMethods[nativeName];
+
+    if (nativeActions != null) {
+      for (var action in nativeActions) {
+        if (action['action'] == 'return') {
+          final c = _libraryIndex.getClass(action['library'], action['class']);
+
+          entryPointsListener.addAllocatedClass(c);
+
+          final nullable = action['nullable'];
+          if (nullable == false) {
+            returnType = new Type.concrete(c.rawType);
+          } else if ((nullable == true) || (nullable == null)) {
+            returnType = new Type.nullable(new Type.concrete(c.rawType));
+          } else {
+            throw 'Bad entry point: unexpected nullable: "$nullable" in $action';
+          }
+        } else {
+          _addRoot(action, entryPointsListener);
+        }
+      }
+    }
+
+    if (returnType != null) {
+      return returnType;
+    } else {
+      return new Type.fromStatic(member.function.returnType);
+    }
+  }
+
+  void _addRoot(
+      Map<String, String> rootDesc, EntryPointsListener entryPointsListener) {
+    final String library = rootDesc['library'];
+    final String class_ = rootDesc['class'];
+    final String name = rootDesc['name'];
+    final String action = rootDesc['action'];
+
+    final libraryIndex = _libraryIndex;
+
+    if ((action == 'create-instance') || ((action == null) && (name == null))) {
+      if (name != null) {
+        throw 'Bad entry point: unexpected "name" element in $rootDesc';
+      }
+
+      final Class cls = libraryIndex.getClass(library, class_);
+      if (cls.isAbstract) {
+        throw 'Bad entry point: abstract class listed in $rootDesc';
+      }
+
+      entryPointsListener.addAllocatedClass(cls);
+    } else if ((action == 'call') ||
+        (action == 'get') ||
+        (action == 'set') ||
+        ((action == null) && (name != null))) {
+      if (name == null) {
+        throw 'Bad entry point: expected "name" element in $rootDesc';
+      }
+
+      final String prefix = {
+            'get': LibraryIndex.getterPrefix,
+            'set': LibraryIndex.setterPrefix
+          }[action] ??
+          '';
+
+      Member member;
+
+      if (class_ != null) {
+        final classDotPrefix = class_ + '.';
+        if ((name == class_) || name.startsWith(classDotPrefix)) {
+          // constructor
+          if (action != 'call' && action != null) {
+            throw 'Bad entry point: action "$action" is not applicable to'
+                ' constructor in $rootDesc';
+          }
+
+          final constructorName =
+              (name == class_) ? '' : name.substring(classDotPrefix.length);
+
+          member = libraryIndex.getMember(library, class_, constructorName);
+        } else {
+          member = libraryIndex.tryGetMember(library, class_, prefix + name);
+          if (member == null) {
+            member = libraryIndex.getMember(library, class_, name);
+          }
+        }
+      } else {
+        member = libraryIndex.tryGetTopLevelMember(
+            library, /* unused */ null, prefix + name);
+        if (member == null) {
+          member = libraryIndex.getTopLevelMember(library, name);
+        }
+      }
+
+      assertx(member != null);
+
+      CallKind callKind;
+
+      if (action == null) {
+        if ((member is Field) || ((member is Procedure) && member.isGetter)) {
+          callKind = CallKind.PropertyGet;
+        } else if ((member is Procedure) && member.isSetter) {
+          callKind = CallKind.PropertySet;
+        } else {
+          callKind = CallKind.Method;
+        }
+      } else {
+        callKind = const {
+          'get': CallKind.PropertyGet,
+          'set': CallKind.PropertySet,
+          'call': CallKind.Method
+        }[action];
+      }
+
+      assertx(callKind != null);
+
+      final Selector selector = member.isInstanceMember
+          ? new InterfaceSelector(member, callKind: callKind)
+          : new DirectSelector(member, callKind: callKind);
+
+      entryPointsListener.addRawCall(selector);
+
+      if ((action == null) && (member is Field) && !member.isFinal) {
+        Selector selector = member.isInstanceMember
+            ? new InterfaceSelector(member, callKind: CallKind.PropertySet)
+            : new DirectSelector(member, callKind: CallKind.PropertySet);
+
+        entryPointsListener.addRawCall(selector);
+      }
+    } else {
+      throw 'Bad entry point: unrecognized action "$action" in $rootDesc';
+    }
+  }
+
+  /// Reads JSON describing entry points and native methods from [jsonString].
+  /// Adds all global entry points using [entryPointsListener].
+  ///
+  /// The format of the JSON descriptor is described in
+  /// 'runtime/vm/compiler/aot/entry_points_json.md'.
+  void processEntryPointsJSON(
+      String jsonString, EntryPointsListener entryPointsListener) {
+    final json = JSON.decode(jsonString);
+
+    final roots = json['roots'];
+    if (roots != null) {
+      for (var root in roots) {
+        _addRoot(new Map<String, String>.from(root), entryPointsListener);
+      }
+    }
+
+    final nativeMethods = json['native-methods'];
+    if (nativeMethods != null) {
+      nativeMethods.forEach((name, actions) {
+        _nativeMethods[name] = new List<Map<String, dynamic>>.from(
+            actions.map((action) => new Map<String, dynamic>.from(action)));
+      });
+    }
+  }
+
+  /// Reads JSON files [jsonFiles] describing entry points and native methods.
+  /// Adds all global entry points using [entryPointsListener].
+  ///
+  /// The format of the JSON descriptor is described in
+  /// 'runtime/vm/compiler/aot/entry_points_json.md'.
+  void processEntryPointsJSONFiles(
+      List<String> jsonFiles, EntryPointsListener entryPointsListener) {
+    for (var file in jsonFiles) {
+      processEntryPointsJSON(
+          new File(file).readAsStringSync(), entryPointsListener);
+    }
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
new file mode 100644
index 0000000..cb5aca1
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -0,0 +1,301 @@
+// 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.
+
+/// Type flow summary of a member, function or initializer.
+library vm.transformations.type_flow.summary;
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
+
+import 'calls.dart';
+import 'types.dart';
+import 'utils.dart';
+
+abstract class CallHandler {
+  Type applyCall(
+      Call callSite, Selector selector, Args<Type> args, bool isResultUsed);
+}
+
+/// Base class for all statements in a summary.
+abstract class Statement extends TypeExpr {
+  /// Index of this statement in the [Summary].
+  int index = -1;
+
+  @override
+  Type getComputedType(List<Type> types) {
+    final type = types[index];
+    assertx(type != null);
+    return type;
+  }
+
+  String get name => "t$index";
+
+  @override
+  String toString() => name;
+
+  /// Prints body of this statement.
+  String dump();
+
+  /// Visit this statement by calling a corresponding [visitor] method.
+  void accept(StatementVisitor visitor);
+
+  /// Execute this statement and compute its resulting type.
+  Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
+      CallHandler callHandler);
+}
+
+/// Statement visitor.
+class StatementVisitor {
+  void visitDefault(TypeExpr expr) {}
+
+  void visitParameter(Parameter expr) => visitDefault(expr);
+  void visitNarrow(Narrow expr) => visitDefault(expr);
+  void visitJoin(Join expr) => visitDefault(expr);
+  void visitCall(Call expr) => visitDefault(expr);
+}
+
+/// Input parameter of the summary.
+class Parameter extends Statement {
+  final String _name;
+  final DartType staticType;
+  Type defaultValue;
+
+  Parameter(this._name, this.staticType);
+
+  String get name => _name != null ? "%$_name" : super.name;
+
+  @override
+  void accept(StatementVisitor visitor) => visitor.visitParameter(this);
+
+  @override
+  String dump() => "$name = _Parameter #$index [$staticType]";
+
+  @override
+  Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
+          CallHandler callHandler) =>
+      throw 'Unable to apply _Parameter';
+}
+
+/// Narrows down [arg] to [type].
+class Narrow extends Statement {
+  TypeExpr arg;
+  Type type;
+
+  Narrow(this.arg, this.type);
+
+  @override
+  DartType get staticType => type.staticType;
+
+  @override
+  void accept(StatementVisitor visitor) => visitor.visitNarrow(this);
+
+  @override
+  String dump() => "$name = _Narrow ($arg to $type)";
+
+  @override
+  Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
+          CallHandler callHandler) =>
+      arg.getComputedType(computedTypes).intersection(type, typeHierarchy);
+}
+
+/// Joins values from multiple sources. Its type is a union of [values].
+class Join extends Statement {
+  final String _name;
+  final DartType staticType;
+  final List<TypeExpr> values = <TypeExpr>[]; // TODO(alexmarkov): Set
+
+  Join(this._name, this.staticType);
+
+  String get name => _name ?? super.name;
+
+  @override
+  void accept(StatementVisitor visitor) => visitor.visitJoin(this);
+
+  @override
+  String dump() => "$name = _Join [$staticType] (${values.join(", ")})";
+
+  @override
+  Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
+      CallHandler callHandler) {
+    Type type = null;
+    assertx(values.isNotEmpty);
+    for (var value in values) {
+      final valueType = value.getComputedType(computedTypes);
+      type = type != null ? type.union(valueType, typeHierarchy) : valueType;
+    }
+    return type;
+  }
+}
+
+/// Call site.
+class Call extends Statement {
+  final Selector selector;
+  final Args<TypeExpr> args;
+  final DartType staticType;
+
+  Call(this.selector, this.args, this.staticType);
+
+  @override
+  void accept(StatementVisitor visitor) => visitor.visitCall(this);
+
+  @override
+  String dump() => "$name${isResultUsed ? '*' : ''} = _Call $selector $args";
+
+  @override
+  Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
+      CallHandler callHandler) {
+    final List<Type> argTypes = new List<Type>(args.values.length);
+    for (int i = 0; i < args.values.length; i++) {
+      final Type type = args.values[i].getComputedType(computedTypes);
+      if (type == const EmptyType()) {
+        debugPrint("Optimized call with empty arg");
+        return const EmptyType();
+      }
+      argTypes[i] = type;
+    }
+    if (selector is! DirectSelector) {
+      _observeReceiverType(argTypes[0]);
+    }
+    final Type result = callHandler.applyCall(this, selector,
+        new Args<Type>(argTypes, names: args.names), isResultUsed);
+    if (isResultUsed) {
+      _observeResultType(result);
+    }
+    return result;
+  }
+
+  // --- Inferred call site information. ---
+
+  int _flags = 0;
+
+  static const int kMonomorphic = (1 << 0);
+  static const int kPolymorphic = (1 << 1);
+  static const int kNullableReceiver = (1 << 2);
+  static const int kResultUsed = (1 << 3);
+  static const int kNullableResult = (1 << 4);
+
+  Member _monomorphicTarget;
+
+  Member get monomorphicTarget => _monomorphicTarget;
+
+  bool get isMonomorphic => (_flags & kMonomorphic) != 0;
+
+  bool get isPolymorphic => (_flags & kPolymorphic) != 0;
+
+  bool get isNullableReceiver => (_flags & kNullableReceiver) != 0;
+
+  bool get isResultUsed => (_flags & kResultUsed) != 0;
+
+  bool get isNullableResult => (_flags & kNullableResult) != 0;
+
+  void setResultUsed() {
+    _flags |= kResultUsed;
+  }
+
+  void setPolymorphic() {
+    _flags = (_flags & ~kMonomorphic) | kPolymorphic;
+    _monomorphicTarget = null;
+  }
+
+  void addTarget(Member target) {
+    if (!isPolymorphic) {
+      if (isMonomorphic) {
+        if (_monomorphicTarget != target) {
+          setPolymorphic();
+        }
+      } else {
+        _flags |= kMonomorphic;
+        _monomorphicTarget = target;
+      }
+    }
+  }
+
+  void _observeReceiverType(Type receiver) {
+    if (receiver is NullableType) {
+      _flags |= kNullableReceiver;
+    }
+  }
+
+  void _observeResultType(Type result) {
+    if (result is NullableType) {
+      _flags |= kNullableResult;
+    }
+    // TODO(alexmarkov): Record result types.
+  }
+}
+
+/// Summary is a linear sequence of statements representing a type flow in
+/// one member, function or initializer.
+class Summary {
+  final int parameterCount;
+  final int requiredParameterCount;
+
+  List<Statement> _statements = <Statement>[];
+  TypeExpr result = null;
+
+  Summary({this.parameterCount: 0, this.requiredParameterCount: 0});
+
+  List<Statement> get statements => _statements;
+
+  Statement add(Statement op) {
+    op.index = _statements.length;
+    _statements.add(op);
+    return op;
+  }
+
+  void reset() {
+    _statements = <Statement>[];
+  }
+
+  @override
+  String toString() {
+    return _statements.map((op) => op.dump()).join("\n") +
+        "\n" +
+        "RESULT: ${result}";
+  }
+
+  /// Apply this summary to the given arguments and return the resulting type.
+  Type apply(Args<Type> arguments, TypeHierarchy typeHierarchy,
+      CallHandler callHandler) {
+    // TODO(alexmarkov): take named parameters into account
+    final args = arguments.positional;
+
+    assertx(args.length >= requiredParameterCount);
+    assertx(args.length <= parameterCount);
+
+    // Interpret statements sequentially, calculating the result type
+    // of each statement and putting it into the 'types' list parallel
+    // to `_statements`.
+    //
+    // After normalization, statements can only reference preceding statements
+    // (they can't have forward references or loops).
+    //
+    // The first `parameterCount` statements are Parameters.
+
+    List<Type> types = new List<Type>(_statements.length);
+
+    types.setAll(0, args);
+
+    for (int i = args.length; i < parameterCount; i++) {
+      types[i] = (_statements[i] as Parameter).defaultValue;
+      assertx(types[i] != null);
+    }
+
+    for (int i = parameterCount; i < _statements.length; i++) {
+      // Test if tracing is enabled to avoid expensive message formatting.
+      if (kPrintTrace) {
+        tracePrint("EVAL ${_statements[i].dump()}");
+      }
+      types[i] = _statements[i].apply(types, typeHierarchy, callHandler);
+      if (kPrintTrace) {
+        tracePrint("RESULT ${types[i]}");
+      }
+    }
+
+    Statistics.summariesAnalyzed++;
+
+    return result.getComputedType(types);
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
new file mode 100644
index 0000000..911d7dd
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -0,0 +1,1053 @@
+// 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.
+
+/// Creation of type flow summaries out of kernel AST.
+library vm.transformations.type_flow.summary_collector;
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import 'calls.dart';
+import 'native_code.dart';
+import 'summary.dart';
+import 'types.dart';
+import 'utils.dart';
+
+/// Summary collector relies on either full or partial mixin resolution.
+/// Currently VmTarget.performModularTransformationsOnLibraries performs
+/// partial mixin resolution.
+const bool kPartialMixinResolution = true;
+
+/// Normalizes and optimizes summary after it is created.
+/// More specifically:
+/// * Breaks loops between statements.
+/// * Removes unused statements (except parameters and calls).
+/// * Eliminates joins with a single input.
+class _SummaryNormalizer extends StatementVisitor {
+  final Summary _summary;
+  Set<Statement> _processed = new Set<Statement>();
+  Set<Statement> _pending = new Set<Statement>();
+  bool _inLoop = false;
+
+  _SummaryNormalizer(this._summary);
+
+  void normalize() {
+    var statements = _summary.statements;
+    _summary.reset();
+
+    for (int i = 0; i < _summary.parameterCount; i++) {
+      _processed.add(statements[i]);
+      _summary.add(statements[i]);
+    }
+
+    for (Statement st in statements) {
+      if (st is Call) {
+        _normalizeExpr(st, false);
+      }
+    }
+
+    _summary.result = _normalizeExpr(_summary.result, true);
+  }
+
+  TypeExpr _normalizeExpr(TypeExpr st, bool isResultUsed) {
+    assertx(!_inLoop);
+    if (st is Statement) {
+      if (isResultUsed && (st is Call)) {
+        st.setResultUsed();
+      }
+      if (_processed.contains(st)) {
+        return st;
+      }
+      if (_pending.add(st)) {
+        st.accept(this);
+        _pending.remove(st);
+
+        if (_inLoop) {
+          return _handleLoop(st);
+        }
+
+        if (st is Join) {
+          if (st.values.length == 1) {
+            return st.values.single;
+          }
+        }
+
+        _processed.add(st);
+        _summary.add(st);
+        return st;
+      } else {
+        // Cyclic expression.
+        return _handleLoop(st);
+      }
+    } else {
+      assertx(st is Type);
+      return st;
+    }
+  }
+
+  TypeExpr _handleLoop(Statement st) {
+    if (st is Join) {
+      // Approximate Join with static type.
+      _inLoop = false;
+      debugPrint("Approximated ${st} with ${st.staticType}");
+      Statistics.joinsApproximatedToBreakLoops++;
+      return new Type.fromStatic(st.staticType);
+    } else {
+      // Step back until Join is found.
+      _inLoop = true;
+      return st;
+    }
+  }
+
+  @override
+  void visitNarrow(Narrow expr) {
+    expr.arg = _normalizeExpr(expr.arg, true);
+  }
+
+  @override
+  void visitJoin(Join expr) {
+    for (int i = 0; i < expr.values.length; i++) {
+      expr.values[i] = _normalizeExpr(expr.values[i], true);
+
+      if (_inLoop) {
+        return;
+      }
+    }
+  }
+
+  @override
+  void visitCall(Call expr) {
+    for (int i = 0; i < expr.args.values.length; i++) {
+      expr.args.values[i] = _normalizeExpr(expr.args.values[i], true);
+
+      if (_inLoop) {
+        return;
+      }
+    }
+  }
+}
+
+/// Create a type flow summary for a member from the kernel AST.
+class SummaryCollector extends RecursiveVisitor<TypeExpr> {
+  final TypeEnvironment _environment;
+  final EntryPointsListener _entryPointsListener;
+  final NativeCodeOracle _nativeCodeOracle;
+
+  final Map<TreeNode, Call> callSites = <TreeNode, Call>{};
+
+  Summary _summary;
+  Map<VariableDeclaration, Join> _variables;
+  Join _returnValue;
+  Parameter _receiver;
+
+  SummaryCollector(
+      this._environment, this._entryPointsListener, this._nativeCodeOracle);
+
+  Summary createSummary(Member member) {
+    debugPrint("===== ${member} =====");
+    assertx(!member.isAbstract);
+
+    _variables = <VariableDeclaration, Join>{};
+    _returnValue = null;
+    _receiver = null;
+
+    if (member is Field) {
+      _summary = new Summary();
+
+      if (member.initializer != null) {
+        _summary.result = _visit(member.initializer);
+      } else {
+        if (_isDefaultValueOfFieldObservable(member)) {
+          _summary.result = new Type.nullable(new Type.empty());
+        } else {
+          _summary.result = new Type.empty();
+        }
+      }
+    } else {
+      FunctionNode function = member.function;
+
+      final hasReceiver = hasReceiverArg(member);
+      final firstParamIndex = hasReceiver ? 1 : 0;
+
+      _summary = new Summary(
+          parameterCount:
+              firstParamIndex + function.positionalParameters.length,
+          requiredParameterCount:
+              firstParamIndex + function.requiredParameterCount);
+
+      if (hasReceiver) {
+        // TODO(alexmarkov): subclass cone
+        _receiver = _declareParameter(
+            "this", new InterfaceType(member.enclosingClass), null);
+        _environment.thisType = member.enclosingClass?.thisType;
+      }
+
+      for (VariableDeclaration param in function.positionalParameters) {
+        _declareParameter(param.name, param.type, param.initializer);
+      }
+
+      int count = 0;
+      for (VariableDeclaration param in function.positionalParameters) {
+        Join v = _declareVariable(param);
+        v.values.add(_summary.statements[firstParamIndex + count]);
+        ++count;
+      }
+
+      // TODO(alexmarkov): take named parameters into account
+      function.namedParameters.forEach(_declareVariableWithStaticType);
+
+      _returnValue = new Join("%result", function.returnType);
+      _summary.add(_returnValue);
+
+      if (member is Constructor) {
+        // Make sure instance field initializers are visited.
+        for (var f in member.enclosingClass.members) {
+          if ((f is Field) && (!f.isStatic) && (f.initializer != null)) {
+            // Implicitly evaluates and includes field initializer.
+            // TODO(alexmarkov): Consider including field initializer code into constructors.
+            _entryPointsListener.addRawCall(
+                new DirectSelector(f, callKind: CallKind.PropertyGet));
+          }
+        }
+        member.initializers.forEach(_visit);
+      }
+
+      if (function.body == null) {
+        Type type = _nativeCodeOracle.handleNativeProcedure(
+            member, _entryPointsListener);
+        if (_returnValue != null) {
+          _returnValue.values.add(type);
+        }
+      } else {
+        _visit(function.body);
+      }
+
+      if (_returnValue.values.isEmpty) {
+        _returnValue.values.add(_nullType);
+      }
+      _summary.result = _returnValue;
+      _environment.thisType = null;
+    }
+
+    debugPrint("------------ SUMMARY ------------");
+    debugPrint(_summary);
+    debugPrint("---------------------------------");
+
+    new _SummaryNormalizer(_summary).normalize();
+
+    debugPrint("---------- NORM SUMMARY ---------");
+    debugPrint(_summary);
+    debugPrint("---------------------------------");
+
+    Statistics.summariesCreated++;
+
+    return _summary;
+  }
+
+  Args<Type> rawArguments(Selector selector) {
+    final member = selector.member;
+    assertx(member != null);
+
+    List<Type> args = <Type>[];
+
+    if (hasReceiverArg(member)) {
+      assertx(member.enclosingClass != null);
+      Type receiver = new Type.cone(member.enclosingClass.rawType);
+      args.add(receiver);
+    }
+
+    switch (selector.callKind) {
+      case CallKind.Method:
+        if (member is! Field) {
+          final function = member.function;
+          assertx(function != null);
+
+          for (var decl in function.positionalParameters) {
+            args.add(new Type.fromStatic(decl.type));
+          }
+
+          // TODO(alexmarkov): take named parameters into account
+        }
+        break;
+
+      case CallKind.PropertyGet:
+        break;
+
+      case CallKind.PropertySet:
+        args.add(new Type.fromStatic(member.setterType));
+        break;
+    }
+
+    return new Args<Type>(args);
+  }
+
+  bool _isDefaultValueOfFieldObservable(Field field) {
+    if (field.isStatic) {
+      return true;
+    }
+
+    final enclosingClass = field.enclosingClass;
+    assertx(enclosingClass != null);
+
+    // Default value is not ebservable if every generative constructor
+    // is redirecting or initializes the field.
+    return !enclosingClass.constructors.every((Constructor constr) {
+      for (var initializer in constr.initializers) {
+        if ((initializer is RedirectingInitializer) ||
+            ((initializer is FieldInitializer) &&
+                (initializer.field == field))) {
+          return true;
+        }
+      }
+      return false;
+    });
+  }
+
+  TypeExpr _visit(TreeNode node) => node.accept(this);
+
+  Args<TypeExpr> _visitArguments(TypeExpr receiver, Arguments arguments) {
+    var args = <TypeExpr>[];
+    if (receiver != null) {
+      args.add(receiver);
+    }
+    for (Expression arg in arguments.positional) {
+      args.add(_visit(arg));
+    }
+    // TODO(alexmarkov): take named arguments into account
+    for (NamedExpression arg in arguments.named) {
+      _visit(arg.value);
+    }
+    return new Args<TypeExpr>(args);
+  }
+
+  Parameter _declareParameter(
+      String name, DartType type, Expression initializer) {
+    final param = new Parameter(name, type);
+    _summary.add(param);
+    assertx(param.index < _summary.parameterCount);
+    if (param.index >= _summary.requiredParameterCount) {
+      // TODO(alexmarkov): get actual type of constant initializer
+      param.defaultValue = (initializer != null)
+          ? new Type.fromStatic(initializer.getStaticType(_environment))
+          : _nullType;
+    } else {
+      assertx(initializer == null);
+    }
+    return param;
+  }
+
+  Join _declareVariable(VariableDeclaration decl) {
+    Join v = new Join(decl.name, decl.type);
+    _summary.add(v);
+    _variables[decl] = v;
+    if (decl.initializer != null) {
+      v.values.add(_visit(decl.initializer));
+    }
+    return v;
+  }
+
+  void _declareVariableWithStaticType(VariableDeclaration decl) {
+    Join v = _declareVariable(decl);
+    v.values.add(new Type.fromStatic(v.staticType));
+  }
+
+  Call _makeCall(TreeNode node, Selector selector, Args<TypeExpr> args) {
+    DartType staticType =
+        (node is Expression) ? node.getStaticType(_environment) : null;
+    Call call = new Call(selector, args, staticType);
+    _summary.add(call);
+    callSites[node] = call;
+    return call;
+  }
+
+  TypeExpr _makeNarrow(TypeExpr arg, Type type) {
+    if (arg is Type) {
+      // TODO(alexmarkov): more constant folding
+      if ((arg is NullableType) && (arg.baseType == const AnyType())) {
+        debugPrint("Optimized _Narrow of dynamic");
+        return type;
+      }
+    }
+    Narrow narrow = new Narrow(arg, type);
+    _summary.add(narrow);
+    return narrow;
+  }
+
+  Type _staticType(Expression node) =>
+      new Type.fromStatic(node.getStaticType(_environment));
+
+  Type _concreteType(DartType t) =>
+      (t == _environment.nullType) ? _nullType : new Type.concrete(t);
+
+  Type _cachedBoolType;
+  Type get _boolType =>
+      _cachedBoolType ??= new Type.cone(_environment.boolType);
+
+  Type _cachedDoubleType;
+  Type get _doubleType =>
+      _cachedDoubleType ??= new Type.cone(_environment.doubleType);
+
+  Type _cachedIntType;
+  Type get _intType => _cachedIntType ??= new Type.cone(_environment.intType);
+
+  Type _cachedStringType;
+  Type get _stringType =>
+      _cachedStringType ??= new Type.cone(_environment.stringType);
+
+  Type _cachedNullType;
+  Type get _nullType => _cachedNullType ??= new Type.nullable(new Type.empty());
+
+  Class get _superclass => _environment.thisType.classNode.superclass;
+
+  void _handleNestedFunctionNode(FunctionNode node) {
+    var oldReturn = _returnValue;
+    var oldVariables = _variables;
+    _returnValue = null;
+    _variables = <VariableDeclaration, Join>{};
+    _variables.addAll(oldVariables);
+
+    // Approximate parameters of nested functions with static types.
+    node.positionalParameters.forEach(_declareVariableWithStaticType);
+    node.namedParameters.forEach(_declareVariableWithStaticType);
+
+    _visit(node.body);
+
+    _returnValue = oldReturn;
+    _variables = oldVariables;
+  }
+
+  @override
+  defaultTreeNode(TreeNode node) =>
+      throw 'Unexpected node ${node.runtimeType}: $node at ${node.location}';
+
+  @override
+  TypeExpr visitAsExpression(AsExpression node) {
+    TypeExpr operand = _visit(node.operand);
+    Type type = new Type.fromStatic(node.type);
+    return _makeNarrow(operand, type);
+  }
+
+  @override
+  TypeExpr visitBoolLiteral(BoolLiteral node) {
+    return _boolType;
+  }
+
+  @override
+  TypeExpr visitIntLiteral(IntLiteral node) {
+    return _intType;
+  }
+
+  @override
+  TypeExpr visitDoubleLiteral(DoubleLiteral node) {
+    return _doubleType;
+  }
+
+  @override
+  TypeExpr visitConditionalExpression(ConditionalExpression node) {
+    _visit(node.condition);
+
+    Join v = new Join(null, node.getStaticType(_environment));
+    _summary.add(v);
+    v.values.add(_visit(node.then));
+    v.values.add(_visit(node.otherwise));
+    return _makeNarrow(v, _staticType(node));
+  }
+
+  @override
+  TypeExpr visitConstructorInvocation(ConstructorInvocation node) {
+    final receiver = _concreteType(node.constructedType);
+
+    _entryPointsListener.addAllocatedType(node.constructedType);
+
+    final args = _visitArguments(receiver, node.arguments);
+    _makeCall(node, new DirectSelector(node.target), args);
+    return receiver;
+  }
+
+  @override
+  TypeExpr visitDirectMethodInvocation(DirectMethodInvocation node) {
+    final receiver = _visit(node.receiver);
+    final args = _visitArguments(receiver, node.arguments);
+    assertx(node.target is! Field);
+    assertx(!node.target.isGetter && !node.target.isSetter);
+    return _makeCall(node, new DirectSelector(node.target), args);
+  }
+
+  @override
+  TypeExpr visitDirectPropertyGet(DirectPropertyGet node) {
+    final receiver = _visit(node.receiver);
+    final args = new Args<TypeExpr>([receiver]);
+    final target = node.target;
+    if ((target is Field) || ((target is Procedure) && target.isGetter)) {
+      return _makeCall(node,
+          new DirectSelector(target, callKind: CallKind.PropertyGet), args);
+    } else {
+      // Tear-off.
+      // TODO(alexmarkov): capture receiver type
+      _entryPointsListener.addRawCall(new DirectSelector(target));
+      return _staticType(node);
+    }
+  }
+
+  @override
+  TypeExpr visitDirectPropertySet(DirectPropertySet node) {
+    final receiver = _visit(node.receiver);
+    final value = _visit(node.value);
+    final args = new Args<TypeExpr>([receiver, value]);
+    final target = node.target;
+    assertx((target is Field) || ((target is Procedure) && target.isSetter));
+    _makeCall(
+        node, new DirectSelector(target, callKind: CallKind.PropertySet), args);
+    return value;
+  }
+
+  @override
+  TypeExpr visitFunctionExpression(FunctionExpression node) {
+    _handleNestedFunctionNode(node.function);
+    // TODO(alexmarkov): support function types.
+    // return _concreteType(node.function.functionType);
+    return _staticType(node);
+  }
+
+  @override
+  visitInstantiation(Instantiation node) {
+    _visit(node.expression);
+    // TODO(alexmarkov): support generic & function types.
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitInvalidExpression(InvalidExpression node) {
+    return new Type.empty();
+  }
+
+  @override
+  TypeExpr visitIsExpression(IsExpression node) {
+    _visit(node.operand);
+    return _boolType;
+  }
+
+  @override
+  TypeExpr visitLet(Let node) {
+    _declareVariable(node.variable);
+    return _visit(node.body);
+  }
+
+  @override
+  TypeExpr visitListLiteral(ListLiteral node) {
+    node.expressions.forEach(_visit);
+    // TODO(alexmarkov): concrete type
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitLogicalExpression(LogicalExpression node) {
+    _visit(node.left);
+    _visit(node.right);
+    return _boolType;
+  }
+
+  @override
+  TypeExpr visitMapLiteral(MapLiteral node) {
+    for (var entry in node.entries) {
+      _visit(entry.key);
+      _visit(entry.value);
+    }
+    // TODO(alexmarkov): concrete type
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitMethodInvocation(MethodInvocation node) {
+    final receiver = _visit(node.receiver);
+    final args = _visitArguments(receiver, node.arguments);
+    final target = node.interfaceTarget;
+    if (target == null) {
+      if (node.name.name == '==') {
+        assertx(args.values.length == 2);
+        if ((args.values[0] == _nullType) || (args.values[1] == _nullType)) {
+          return _boolType;
+        }
+        _makeCall(node, new DynamicSelector(CallKind.Method, node.name), args);
+        return new Type.nullable(_boolType);
+      }
+      if (node.name.name == 'call') {
+        final recvType = node.receiver.getStaticType(_environment);
+        if ((recvType is FunctionType) ||
+            (recvType == _environment.rawFunctionType)) {
+          // Call to a Function.
+          return _staticType(node);
+        }
+      }
+      return _makeCall(
+          node, new DynamicSelector(CallKind.Method, node.name), args);
+    }
+    if ((target is Field) || ((target is Procedure) && target.isGetter)) {
+      // Call via field.
+      _makeCall(
+          node,
+          new InterfaceSelector(target, callKind: CallKind.PropertyGet),
+          new Args<TypeExpr>([receiver]));
+      return _staticType(node);
+    } else {
+      // TODO(alexmarkov): overloaded arithmetic operators
+      return _makeCall(node, new InterfaceSelector(target), args);
+    }
+  }
+
+  @override
+  TypeExpr visitPropertyGet(PropertyGet node) {
+    var receiver = _visit(node.receiver);
+    var args = new Args<TypeExpr>([receiver]);
+    final target = node.interfaceTarget;
+    if (target == null) {
+      return _makeCall(
+          node, new DynamicSelector(CallKind.PropertyGet, node.name), args);
+    }
+    if ((target is Field) || ((target is Procedure) && target.isGetter)) {
+      return _makeCall(node,
+          new InterfaceSelector(target, callKind: CallKind.PropertyGet), args);
+    } else {
+      // Tear-off.
+      // TODO(alexmarkov): capture receiver type
+      _entryPointsListener.addRawCall(new InterfaceSelector(target));
+      return _staticType(node);
+    }
+  }
+
+  @override
+  TypeExpr visitPropertySet(PropertySet node) {
+    var receiver = _visit(node.receiver);
+    var value = _visit(node.value);
+    var args = new Args<TypeExpr>([receiver, value]);
+    final target = node.interfaceTarget;
+    if (target == null) {
+      _makeCall(
+          node, new DynamicSelector(CallKind.PropertySet, node.name), args);
+    } else {
+      assertx((target is Field) || ((target is Procedure) && target.isSetter));
+      _makeCall(node,
+          new InterfaceSelector(target, callKind: CallKind.PropertySet), args);
+    }
+    return value;
+  }
+
+  @override
+  TypeExpr visitSuperMethodInvocation(SuperMethodInvocation node) {
+    assertx(kPartialMixinResolution);
+    assertx(_receiver != null, details: node);
+    final args = _visitArguments(_receiver, node.arguments);
+    // Re-resolve target due to partial mixin resolution.
+    final target =
+        _environment.hierarchy.getDispatchTarget(_superclass, node.name);
+    if (target == null) {
+      return new Type.empty();
+    } else {
+      if ((target is Field) || ((target is Procedure) && target.isGetter)) {
+        // Call via field.
+        _makeCall(
+            node,
+            new DirectSelector(target, callKind: CallKind.PropertyGet),
+            new Args<TypeExpr>([_receiver]));
+        return _staticType(node);
+      } else {
+        return _makeCall(node, new DirectSelector(target), args);
+      }
+    }
+  }
+
+  @override
+  TypeExpr visitSuperPropertyGet(SuperPropertyGet node) {
+    assertx(kPartialMixinResolution);
+    assertx(_receiver != null, details: node);
+    final args = new Args<TypeExpr>([_receiver]);
+    // Re-resolve target due to partial mixin resolution.
+    final target =
+        _environment.hierarchy.getDispatchTarget(_superclass, node.name);
+    if (target == null) {
+      return new Type.empty();
+    } else {
+      if ((target is Field) || ((target is Procedure) && target.isGetter)) {
+        return _makeCall(node,
+            new DirectSelector(target, callKind: CallKind.PropertyGet), args);
+      } else {
+        // Tear-off.
+        // TODO(alexmarkov): capture receiver type
+        _entryPointsListener.addRawCall(new DirectSelector(target));
+        return _staticType(node);
+      }
+    }
+  }
+
+  @override
+  TypeExpr visitSuperPropertySet(SuperPropertySet node) {
+    assertx(kPartialMixinResolution);
+    assertx(_receiver != null, details: node);
+    final value = _visit(node.value);
+    final args = new Args<TypeExpr>([_receiver, value]);
+    // Re-resolve target due to partial mixin resolution.
+    final target = _environment.hierarchy
+        .getDispatchTarget(_superclass, node.name, setter: true);
+    if (target != null) {
+      assertx((target is Field) || ((target is Procedure) && target.isSetter));
+      return _makeCall(node,
+          new DirectSelector(target, callKind: CallKind.PropertySet), args);
+    }
+    return value;
+  }
+
+  @override
+  TypeExpr visitNot(Not node) {
+    _visit(node.operand);
+    return _boolType;
+  }
+
+  @override
+  TypeExpr visitNullLiteral(NullLiteral node) {
+    return _nullType;
+  }
+
+  @override
+  TypeExpr visitRethrow(Rethrow node) {
+    return new Type.empty();
+  }
+
+  @override
+  TypeExpr visitStaticGet(StaticGet node) {
+    final args = new Args<TypeExpr>(const <TypeExpr>[]);
+    final target = node.target;
+    if ((target is Field) || (target is Procedure) && target.isGetter) {
+      return _makeCall(node,
+          new DirectSelector(target, callKind: CallKind.PropertyGet), args);
+    } else {
+      // Tear-off.
+      _entryPointsListener.addRawCall(new DirectSelector(target));
+      return _staticType(node);
+    }
+  }
+
+  @override
+  TypeExpr visitStaticInvocation(StaticInvocation node) {
+    final args = _visitArguments(null, node.arguments);
+    final target = node.target;
+    assertx((target is! Field) && !target.isGetter && !target.isSetter);
+    return _makeCall(node, new DirectSelector(target), args);
+  }
+
+  @override
+  TypeExpr visitStaticSet(StaticSet node) {
+    final value = _visit(node.value);
+    final args = new Args<TypeExpr>([value]);
+    final target = node.target;
+    assertx((target is Field) || (target is Procedure) && target.isSetter);
+    _makeCall(
+        node, new DirectSelector(target, callKind: CallKind.PropertySet), args);
+    return value;
+  }
+
+  @override
+  TypeExpr visitStringConcatenation(StringConcatenation node) {
+    node.expressions.forEach(_visit);
+    return _stringType;
+  }
+
+  @override
+  TypeExpr visitStringLiteral(StringLiteral node) {
+    return _stringType;
+  }
+
+  @override
+  TypeExpr visitSymbolLiteral(SymbolLiteral node) {
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitThisExpression(ThisExpression node) {
+    assertx(_receiver != null, details: node);
+    return _receiver;
+  }
+
+  @override
+  TypeExpr visitThrow(Throw node) {
+    _visit(node.expression);
+    return new Type.empty();
+  }
+
+  @override
+  TypeExpr visitTypeLiteral(TypeLiteral node) {
+    return new Type.cone(_environment.typeType);
+  }
+
+  @override
+  TypeExpr visitVariableGet(VariableGet node) {
+    Join v = _variables[node.variable];
+    if (v == null) {
+      throw 'Unable to find variable ${node.variable}';
+    }
+
+    if ((node.promotedType != null) &&
+        (node.promotedType != const DynamicType())) {
+      return _makeNarrow(v, new Type.cone(node.promotedType));
+    }
+
+    return v;
+  }
+
+  @override
+  TypeExpr visitVariableSet(VariableSet node) {
+    Join v = _variables[node.variable];
+    assertx(v != null, details: node);
+
+    TypeExpr value = _visit(node.value);
+    v.values.add(value);
+    return value;
+  }
+
+  @override
+  TypeExpr visitLoadLibrary(LoadLibrary node) {
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitVectorCreation(VectorCreation node) {
+    // TODO(alexmarkov): List<_Context>?
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitVectorGet(VectorGet node) {
+    _visit(node.vectorExpression);
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitVectorSet(VectorSet node) {
+    _visit(node.vectorExpression);
+    return _visit(node.value);
+  }
+
+  @override
+  TypeExpr visitVectorCopy(VectorCopy node) {
+    _visit(node.vectorExpression);
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitClosureCreation(ClosureCreation node) {
+    _visit(node.contextVector);
+    return _staticType(node);
+  }
+
+  @override
+  TypeExpr visitAssertStatement(AssertStatement node) {
+    _visit(node.condition);
+    if (node.message != null) {
+      _visit(node.message);
+    }
+    return null;
+  }
+
+  @override
+  TypeExpr visitBlock(Block node) {
+    node.statements.forEach(_visit);
+    return null;
+  }
+
+  @override
+  TypeExpr visitBreakStatement(BreakStatement node) => null;
+
+  @override
+  TypeExpr visitContinueSwitchStatement(ContinueSwitchStatement node) => null;
+
+  @override
+  TypeExpr visitDoStatement(DoStatement node) {
+    _visit(node.body);
+    _visit(node.condition);
+    return null;
+  }
+
+  @override
+  TypeExpr visitEmptyStatement(EmptyStatement node) => null;
+
+  @override
+  TypeExpr visitExpressionStatement(ExpressionStatement node) {
+    _visit(node.expression);
+    return null;
+  }
+
+  @override
+  TypeExpr visitForInStatement(ForInStatement node) {
+    _visit(node.iterable);
+    // TODO(alexmarkov): try to infer more precise type from 'iterable'
+    _declareVariableWithStaticType(node.variable);
+    _visit(node.body);
+    return null;
+  }
+
+  @override
+  TypeExpr visitForStatement(ForStatement node) {
+    node.variables.forEach(visitVariableDeclaration);
+    if (node.condition != null) {
+      _visit(node.condition);
+    }
+    node.updates.forEach(_visit);
+    _visit(node.body);
+    return null;
+  }
+
+  @override
+  TypeExpr visitFunctionDeclaration(FunctionDeclaration node) {
+    Join v = _declareVariable(node.variable);
+    // TODO(alexmarkov): support function types.
+    // v.values.add(_concreteType(node.function.functionType));
+    v.values.add(new Type.fromStatic(v.staticType));
+    _handleNestedFunctionNode(node.function);
+    return null;
+  }
+
+  @override
+  TypeExpr visitIfStatement(IfStatement node) {
+    _visit(node.condition);
+    _visit(node.then);
+    if (node.otherwise != null) {
+      _visit(node.otherwise);
+    }
+    return null;
+  }
+
+  @override
+  TypeExpr visitLabeledStatement(LabeledStatement node) {
+    _visit(node.body);
+    return null;
+  }
+
+  @override
+  TypeExpr visitReturnStatement(ReturnStatement node) {
+    if (node.expression != null) {
+      TypeExpr ret = _visit(node.expression);
+      if (_returnValue != null) {
+        _returnValue.values.add(ret);
+      }
+    }
+    return null;
+  }
+
+  @override
+  visitSwitchStatement(SwitchStatement node) {
+    _visit(node.expression);
+    for (var switchCase in node.cases) {
+      switchCase.expressions.forEach(_visit);
+      _visit(switchCase.body);
+    }
+  }
+
+  @override
+  visitTryCatch(TryCatch node) {
+    _visit(node.body);
+    for (var catchClause in node.catches) {
+      if (catchClause.exception != null) {
+        _declareVariableWithStaticType(catchClause.exception);
+      }
+      if (catchClause.stackTrace != null) {
+        _declareVariableWithStaticType(catchClause.stackTrace);
+      }
+      _visit(catchClause.body);
+    }
+  }
+
+  @override
+  visitTryFinally(TryFinally node) {
+    _visit(node.body);
+    _visit(node.finalizer);
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    final v = _declareVariable(node);
+    if (node.initializer == null) {
+      v.values.add(_nullType);
+    }
+  }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    _visit(node.condition);
+    _visit(node.body);
+  }
+
+  @override
+  visitYieldStatement(YieldStatement node) {
+    _visit(node.expression);
+  }
+
+  @override
+  visitFieldInitializer(FieldInitializer node) {
+    final value = _visit(node.value);
+    final args = new Args<TypeExpr>([_receiver, value]);
+    _makeCall(node,
+        new DirectSelector(node.field, callKind: CallKind.PropertySet), args);
+  }
+
+  @override
+  visitRedirectingInitializer(RedirectingInitializer node) {
+    final args = _visitArguments(_receiver, node.arguments);
+    _makeCall(node, new DirectSelector(node.target), args);
+  }
+
+  @override
+  visitSuperInitializer(SuperInitializer node) {
+    final args = _visitArguments(_receiver, node.arguments);
+
+    Constructor target = null;
+    if (kPartialMixinResolution) {
+      // Re-resolve target due to partial mixin resolution.
+      for (var replacement in _superclass.constructors) {
+        if (node.target.name == replacement.name) {
+          target = replacement;
+          break;
+        }
+      }
+    } else {
+      target = node.target;
+    }
+    assertx(target != null);
+    _makeCall(node, new DirectSelector(target), args);
+  }
+
+  @override
+  visitLocalInitializer(LocalInitializer node) {
+    visitVariableDeclaration(node.variable);
+  }
+
+  @override
+  visitAssertInitializer(AssertInitializer node) {
+    _visit(node.statement);
+  }
+
+  @override
+  visitInvalidInitializer(InvalidInitializer node) {}
+}
+
+class CreateAllSummariesVisitor extends RecursiveVisitor<Null> {
+  final TypeEnvironment _environment;
+  final SummaryCollector _summaryColector;
+
+  CreateAllSummariesVisitor(this._environment)
+      : _summaryColector = new SummaryCollector(_environment,
+            new EntryPointsListener(), new NativeCodeOracle(null));
+
+  @override
+  defaultMember(Member m) {
+    if (!m.isAbstract) {
+      _summaryColector.createSummary(m);
+    }
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
new file mode 100644
index 0000000..2947b68
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -0,0 +1,119 @@
+// 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.
+
+/// Transformations based on type flow analysis.
+library vm.transformations.type_flow.transformer;
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/library_index.dart' show LibraryIndex;
+import 'package:kernel/type_environment.dart';
+
+import 'analysis.dart';
+import 'calls.dart';
+import 'summary_collector.dart';
+import 'utils.dart';
+import '../devirtualization.dart' show Devirtualization;
+import '../../metadata/direct_call.dart';
+
+const bool kDumpAllSummaries =
+    const bool.fromEnvironment('global.type.flow.dump.all.summaries');
+
+/// Whole-program type flow analysis and transformation.
+/// Assumes strong mode and closed world.
+Program transformProgram(CoreTypes coreTypes, Program program) {
+  final hierarchy = new ClassHierarchy(program);
+  final types = new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
+  final libraryIndex = new LibraryIndex.all(program);
+
+  if (kDumpAllSummaries) {
+    Statistics.reset();
+    new CreateAllSummariesVisitor(types).visitProgram(program);
+    Statistics.print("All summaries statistics");
+  }
+
+  Statistics.reset();
+  final analysisStopWatch = new Stopwatch()..start();
+
+  final typeFlowAnalysis = new TypeFlowAnalysis(hierarchy, types, libraryIndex,
+      // TODO(alexmarkov): Pass entry points descriptors from command line.
+      entryPointsJSONFiles: [
+        'pkg/vm/lib/transformations/type_flow/entry_points.json',
+        'pkg/vm/lib/transformations/type_flow/entry_points_extra.json',
+      ]);
+
+  Procedure main = program.mainMethod;
+  final Selector mainSelector = new DirectSelector(main);
+  typeFlowAnalysis.addRawCall(mainSelector);
+  typeFlowAnalysis.process();
+
+  analysisStopWatch.stop();
+
+  final transformsStopWatch = new Stopwatch()..start();
+
+  new DropMethodBodiesVisitor(typeFlowAnalysis).visitProgram(program);
+
+  new TFADevirtualization(program, typeFlowAnalysis).visitProgram(program);
+
+  transformsStopWatch.stop();
+
+  statPrint("TF analysis took ${analysisStopWatch.elapsedMilliseconds}ms");
+  statPrint("TF transforms took ${transformsStopWatch.elapsedMilliseconds}ms");
+
+  Statistics.print("TFA statistics");
+
+  return program;
+}
+
+/// Devirtualization based on results of type flow analysis.
+class TFADevirtualization extends Devirtualization {
+  final TypeFlowAnalysis _typeFlowAnalysis;
+
+  TFADevirtualization(Program program, this._typeFlowAnalysis)
+      : super(_typeFlowAnalysis.environment.coreTypes, program,
+            _typeFlowAnalysis.environment.hierarchy);
+
+  @override
+  DirectCallMetadata getDirectCall(TreeNode node, Member target,
+      {bool setter = false}) {
+    final callSite = _typeFlowAnalysis.callSite(node);
+    if (callSite != null) {
+      final Member singleTarget = callSite.monomorphicTarget;
+      if (singleTarget != null) {
+        return new DirectCallMetadata(
+            singleTarget, callSite.isNullableReceiver);
+      }
+    }
+    return null;
+  }
+}
+
+/// Drop method bodies using results of type flow analysis.
+class DropMethodBodiesVisitor extends RecursiveVisitor<Null> {
+  final TypeFlowAnalysis _typeFlowAnalysis;
+
+  DropMethodBodiesVisitor(this._typeFlowAnalysis);
+
+  @override
+  defaultMember(Member m) {
+    if (!m.isAbstract && !_typeFlowAnalysis.isMemberUsed(m)) {
+      if (m.function != null && m.function.body != null) {
+        m.function.body = new ExpressionStatement(
+            new Throw(new StringLiteral("TFA Error: $m")))
+          ..parent = m.function;
+        debugPrint("Dropped $m");
+      } else if ((m is Field) &&
+          (m.initializer != null) &&
+          (m.initializer is! NullLiteral)) {
+        m.isConst = false;
+        m.initializer = new Throw(new StringLiteral("TFA Error: $m"))
+          ..parent = m;
+        debugPrint("Dropped $m");
+      }
+    }
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
new file mode 100644
index 0000000..a73bdd6
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -0,0 +1,463 @@
+// 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.
+
+/// Declares the type system used by global type flow analysis.
+library vm.transformations.type_flow.types;
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart';
+
+import 'utils.dart';
+
+/// Abstract interface to type hierarchy information used by types.
+abstract class TypeHierarchy {
+  /// Test if [subType] is a subtype of [superType].
+  bool isSubtype(DartType subType, DartType superType);
+
+  /// Return a more specific type for the type cone with [base] root.
+  /// May return EmptyType, AnyType, ConcreteType or a SetType.
+  Type specializeTypeCone(DartType base);
+}
+
+/// Basic normalization of Dart types.
+/// Currently used to approximate generic and function types.
+DartType _normalizeDartType(DartType type) {
+  if (type is InterfaceType) {
+    // TODO(alexmarkov): take generic type arguments into account
+    return type.classNode.rawType;
+  } else if (type is FunctionType) {
+    // TODO(alexmarkov): support function types
+    return const DynamicType();
+  } else if (type is TypeParameterType) {
+    // TODO(alexmarkov): instantiate type parameters if possible
+    return _normalizeDartType(type.bound);
+  }
+  return type;
+}
+
+/// Base class for type expressions.
+/// Type expression is either a [Type] or a statement in a summary.
+abstract class TypeExpr {
+  const TypeExpr();
+
+  /// Static [DartType] approximation.
+  /// May not be available for certain inferred types (such as [EmptyType] and
+  /// [SetType]) as they don't have corresponding Dart types.
+  DartType get staticType;
+
+  /// Returns computed type of this type expression.
+  /// [types] is the list of types computed for the statements in the summary.
+  Type getComputedType(List<Type> types);
+}
+
+/// Base class for types inferred by the type flow analysis.
+/// [Type] describes a specific set of values (Dart instances) and does not
+/// directly correspond to a Dart type.
+abstract class Type extends TypeExpr {
+  const Type();
+
+  /// Create an empty type.
+  factory Type.empty() => const EmptyType();
+
+  /// Create a non-nullable type representing a subtype cone. It contains
+  /// instances of all Dart types which extend, mix-in or implement [dartType].
+  factory Type.cone(DartType dartType) {
+    dartType = _normalizeDartType(dartType);
+    if (dartType == const DynamicType()) {
+      return const AnyType();
+    } else {
+      return new ConeType(dartType);
+    }
+  }
+
+  /// Create a type representing instances of a specific class (no subtypes
+  /// or `null` object).
+  factory Type.concrete(DartType dartType) {
+    // Catch certain unexpected types before _normalizeDartType() erases them.
+    assertx(dartType is! FunctionType);
+    assertx(dartType is! TypeParameterType);
+    return new ConcreteType(_normalizeDartType(dartType));
+  }
+
+  /// Create a nullable type - union of [t] and the `null` object.
+  factory Type.nullable(Type t) => new NullableType(t);
+
+  /// Create a Type which corresponds to a set of instances constrained by
+  /// Dart type annotation [dartType].
+  factory Type.fromStatic(DartType dartType) {
+    dartType = _normalizeDartType(dartType);
+    if (dartType == const DynamicType()) {
+      return new Type.nullable(const AnyType());
+    } else if (dartType == const BottomType()) {
+      return new Type.nullable(new Type.empty());
+    }
+    return new Type.nullable(new ConeType(dartType));
+  }
+
+  @override
+  DartType get staticType;
+
+  @override
+  Type getComputedType(List<Type> types) => this;
+
+  /// Order of precedence for evaluation of union/intersection.
+  int get order;
+
+  /// Calculate union of this and [other] types.
+  Type union(Type other, TypeHierarchy typeHierarchy);
+
+  /// Calculate intersection of this and [other] types.
+  Type intersection(Type other, TypeHierarchy typeHierarchy);
+}
+
+/// Order of precedence between types for evaluation of union/intersection.
+enum TypeOrder {
+  Empty,
+  Nullable,
+  Any,
+  Set,
+  Cone,
+  Concrete,
+}
+
+/// Type representing the empty set of instances.
+class EmptyType extends Type {
+  const EmptyType();
+
+  @override
+  DartType get staticType => throw 'Unable to get static type of empty type';
+
+  @override
+  int get hashCode => 997;
+
+  @override
+  bool operator ==(other) => (other is EmptyType);
+
+  @override
+  String toString() => "_T {}";
+
+  @override
+  int get order => TypeOrder.Empty.index;
+
+  @override
+  Type union(Type other, TypeHierarchy typeHierarchy) => other;
+
+  @override
+  Type intersection(Type other, TypeHierarchy typeHierarchy) => this;
+}
+
+/// Nullable type represents a union of a (non-nullable) type and the `null`
+/// object. Other kinds of types do not contain `null` object (even AnyType).
+class NullableType extends Type {
+  final Type baseType;
+
+  NullableType(this.baseType) {
+    assertx(baseType != null);
+    assertx(baseType is! NullableType);
+  }
+
+  @override
+  DartType get staticType =>
+      (baseType is EmptyType) ? const BottomType() : baseType.staticType;
+
+  @override
+  int get hashCode => (baseType.hashCode + 31) & kHashMask;
+
+  @override
+  bool operator ==(other) =>
+      (other is NullableType) && (this.baseType == other.baseType);
+
+  @override
+  String toString() => "${baseType}?";
+
+  @override
+  int get order => TypeOrder.Nullable.index;
+
+  @override
+  Type union(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.union(this, typeHierarchy);
+    }
+    if (other is NullableType) {
+      return new NullableType(baseType.union(other.baseType, typeHierarchy));
+    } else {
+      return new NullableType(baseType.union(other, typeHierarchy));
+    }
+  }
+
+  @override
+  Type intersection(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.intersection(this, typeHierarchy);
+    }
+    if (other is NullableType) {
+      return new NullableType(
+          baseType.intersection(other.baseType, typeHierarchy));
+    } else {
+      return baseType.intersection(other, typeHierarchy);
+    }
+  }
+}
+
+/// Type representing any instance except `null`.
+/// Semantically equivalent to ConeType of Object, but more efficient.
+class AnyType extends Type {
+  const AnyType();
+
+  @override
+  DartType get staticType => const DynamicType();
+
+  @override
+  int get hashCode => 991;
+
+  @override
+  bool operator ==(other) => (other is AnyType);
+
+  @override
+  String toString() => "_T ANY";
+
+  @override
+  int get order => TypeOrder.Any.index;
+
+  @override
+  Type union(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.union(this, typeHierarchy);
+    }
+    return this;
+  }
+
+  @override
+  Type intersection(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.intersection(this, typeHierarchy);
+    }
+    return other;
+  }
+}
+
+/// SetType is a union of concrete types T1, T2, ..., Tn, where n >= 2.
+/// It represents the set of instances which types are in the {T1, T2, ..., Tn}.
+class SetType extends Type {
+  final Set<ConcreteType> types;
+  int _hashCode;
+
+  SetType(this.types) {
+    assertx(types.length >= 2);
+  }
+
+  @override
+  DartType get staticType => throw 'Unable to get static type of set type';
+
+  @override
+  int get hashCode => _hashCode ??= _computeHashCode();
+
+  int _computeHashCode() {
+    int hash = 1237;
+    // Hash code should not depend on the order of types.
+    for (var t in types) {
+      hash = (hash ^ t.hashCode) & kHashMask;
+    }
+    return hash;
+  }
+
+  @override
+  bool operator ==(other) =>
+      (other is SetType) &&
+      // TODO(alexmarkov): make it more efficient
+      (types.length == other.types.length) &&
+      this.types.containsAll(other.types) &&
+      other.types.containsAll(this.types);
+
+  @override
+  String toString() => "_T ${types}";
+
+  @override
+  int get order => TypeOrder.Set.index;
+
+  @override
+  Type union(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.union(this, typeHierarchy);
+    }
+    if (other is SetType) {
+      return new SetType(this.types.union(other.types));
+    } else if (other is ConcreteType) {
+      return types.contains(other)
+          ? this
+          : new SetType(new Set.from(this.types)..add(other));
+    } else if (other is ConeType) {
+      return typeHierarchy
+          .specializeTypeCone(other.dartType)
+          .union(this, typeHierarchy);
+    } else {
+      throw 'Unexpected type $other';
+    }
+  }
+
+  @override
+  Type intersection(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.intersection(this, typeHierarchy);
+    }
+    if (other is SetType) {
+      Set<ConcreteType> set = this.types.intersection(other.types);
+      final size = set.length;
+      if (size == 0) {
+        return const EmptyType();
+      } else if (size == 1) {
+        return set.single;
+      } else {
+        return new SetType(set);
+      }
+    } else if (other is ConcreteType) {
+      return types.contains(other) ? other : const EmptyType();
+    } else if (other is ConeType) {
+      return typeHierarchy
+          .specializeTypeCone(other.dartType)
+          .intersection(this, typeHierarchy);
+    } else {
+      throw 'Unexpected type $other';
+    }
+  }
+}
+
+/// Type representing a subtype cone. It contains instances of all
+/// Dart types which extend, mix-in or implement [dartType].
+/// TODO(alexmarkov): Introduce cones of types which extend but not implement.
+class ConeType extends Type {
+  final DartType dartType;
+
+  ConeType(this.dartType) {
+    assertx(dartType != null);
+  }
+
+  @override
+  DartType get staticType => dartType;
+
+  @override
+  int get hashCode => (dartType.hashCode + 37) & kHashMask;
+
+  @override
+  bool operator ==(other) =>
+      (other is ConeType) && (this.dartType == other.dartType);
+
+  @override
+  String toString() => "_T (${dartType})+";
+
+  @override
+  int get order => TypeOrder.Cone.index;
+
+  @override
+  Type union(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.union(this, typeHierarchy);
+    }
+    if (other is ConeType) {
+      if (this == other) {
+        return this;
+      }
+      if (typeHierarchy.isSubtype(other.dartType, this.dartType)) {
+        return this;
+      }
+      if (typeHierarchy.isSubtype(this.dartType, other.dartType)) {
+        return other;
+      }
+    }
+    return typeHierarchy
+        .specializeTypeCone(dartType)
+        .union(other, typeHierarchy);
+  }
+
+  @override
+  Type intersection(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.intersection(this, typeHierarchy);
+    }
+    if (other is ConeType) {
+      if (this == other) {
+        return this;
+      }
+      if (typeHierarchy.isSubtype(other.dartType, this.dartType)) {
+        return other;
+      }
+      if (typeHierarchy.isSubtype(this.dartType, other.dartType)) {
+        return this;
+      }
+    } else if (other is ConcreteType) {
+      if (typeHierarchy.isSubtype(other.dartType, this.dartType)) {
+        return other;
+      } else {
+        return const EmptyType();
+      }
+    }
+    return typeHierarchy
+        .specializeTypeCone(dartType)
+        .intersection(other, typeHierarchy);
+  }
+}
+
+/// Type representing a set of instances of a specific Dart class (no subtypes
+/// or `null` object).
+class ConcreteType extends Type {
+  final DartType dartType;
+
+  ConcreteType(this.dartType) {
+    assertx((dartType is FunctionType) ||
+        ((dartType is InterfaceType) &&
+            !(dartType as InterfaceType).classNode.isAbstract));
+  }
+
+  @override
+  DartType get staticType => dartType;
+
+  @override
+  int get hashCode => (dartType.hashCode ^ 0x1234) & kHashMask;
+
+  @override
+  bool operator ==(other) =>
+      (other is ConcreteType) && (this.dartType == other.dartType);
+
+  @override
+  String toString() => "_T (${dartType})";
+
+  @override
+  int get order => TypeOrder.Concrete.index;
+
+  @override
+  Type union(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.union(this, typeHierarchy);
+    }
+    if (other is ConcreteType) {
+      if (this == other) {
+        return this;
+      } else {
+        final Set<ConcreteType> types = new Set<ConcreteType>();
+        types.add(this);
+        types.add(other);
+        return new SetType(types);
+      }
+    } else {
+      throw 'Unexpected type $other';
+    }
+  }
+
+  @override
+  Type intersection(Type other, TypeHierarchy typeHierarchy) {
+    if (other.order < this.order) {
+      return other.intersection(this, typeHierarchy);
+    }
+    if (other is ConcreteType) {
+      if (this == other) {
+        return this;
+      } else {
+        return const EmptyType();
+      }
+    } else {
+      throw 'Unexpected type $other';
+    }
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
new file mode 100644
index 0000000..865907e
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -0,0 +1,84 @@
+// 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.
+
+/// Declares miscellaneous utility functions and constants for type flow
+/// analysis.
+library vm.transformations.type_flow.utils;
+
+import 'package:kernel/ast.dart' show Member, Constructor;
+
+const bool kPrintTrace =
+    const bool.fromEnvironment('global.type.flow.print.trace');
+
+const bool kPrintDebug =
+    const bool.fromEnvironment('global.type.flow.print.debug');
+
+const bool kPrintStats =
+    const bool.fromEnvironment('global.type.flow.print.stats');
+
+/// Extended 'assert': always checks condition.
+assertx(bool cond, {details}) {
+  if (!cond) {
+    throw 'Assertion failed.' + (details != null ? ' Details: $details' : '');
+  }
+}
+
+tracePrint(Object message) {
+  if (kPrintTrace) {
+    print(message);
+  }
+}
+
+debugPrint(Object message) {
+  if (kPrintDebug) {
+    print(message);
+  }
+}
+
+statPrint(Object message) {
+  if (kPrintStats) {
+    print(message);
+  }
+}
+
+const int kHashMask = 0x3fffffff;
+
+bool hasReceiverArg(Member member) =>
+    member.isInstanceMember || (member is Constructor);
+
+/// Holds various statistic counters for type flow analysis.
+class Statistics {
+  static int summariesCreated = 0;
+  static int summariesAnalyzed = 0;
+  static int joinsApproximatedToBreakLoops = 0;
+  static int invocationsProcessed = 0;
+  static int usedCachedResultsOfInvocations = 0;
+  static int invocationsInvalidated = 0;
+  static int recursiveInvocationsApproximated = 0;
+  static int typeConeSpecializations = 0;
+
+  /// Resets statistic counters.
+  static void reset() {
+    summariesCreated = 0;
+    summariesAnalyzed = 0;
+    joinsApproximatedToBreakLoops = 0;
+    invocationsProcessed = 0;
+    usedCachedResultsOfInvocations = 0;
+    invocationsInvalidated = 0;
+    recursiveInvocationsApproximated = 0;
+  }
+
+  static void print(String caption) {
+    statPrint("""${caption}:
+    ${summariesCreated} summaries created
+    ${summariesAnalyzed} summaries analyzed
+    ${joinsApproximatedToBreakLoops} joins are approximated to break loops
+    ${invocationsProcessed} invocations processed
+    ${usedCachedResultsOfInvocations} times cached result of invocation is used
+    ${invocationsInvalidated} invocations invalidated
+    ${recursiveInvocationsApproximated} recursive invocations approximated
+    ${typeConeSpecializations} type cones specialized
+    """);
+  }
+}
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 33b06b9..6afa317 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -648,14 +648,36 @@
   executable = true
 }
 
+action("kernel_service_dill_cc") {
+  deps = [
+    "../../utils/kernel-service:kernel_service_dill",
+  ]
+  script = "../tools/dill_to_data_cc.py"
+  inputs = [
+    "../tools/dill_to_data_cc.py",
+    "$root_gen_dir/kernel_service.dill",
+  ]
+  outputs = [
+    "$root_gen_dir/kernel_service.dill.cc",
+  ]
+  args = [
+    "--dill_file=" + rebase_path("$root_gen_dir/kernel_service.dill"),
+    "--data_symbol=kKernelServiceDill",
+    "--size_symbol=kKernelServiceDillSize",
+    "--output=" + rebase_path("$root_gen_dir/kernel_service.dill.cc"),
+  ]
+}
+
 source_set("dart_snapshot_cc") {
   deps = [
     ":isolate_snapshot_data_assembly",
     ":isolate_snapshot_instructions_assembly",
+    ":kernel_service_dill_cc",
     ":vm_snapshot_data_assembly",
     ":vm_snapshot_instructions_assembly",
   ]
   sources = [
+    "$root_gen_dir/kernel_service.dill.cc",
     "$target_gen_dir/isolate_snapshot_data.S",
     "$target_gen_dir/isolate_snapshot_instructions.S",
     "$target_gen_dir/vm_snapshot_data.S",
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index e9f85168..9cffabf 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -135,7 +135,7 @@
 
 // Embedder Entrypoint:
 // The embedder calls this method with the current working directory.
-void _setWorkingDirectory(cwd) {
+void _setWorkingDirectory(String cwd) {
   if (!_setupCompleted) {
     _setupHooks();
   }
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index b1141b2..3329221 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -4,19 +4,59 @@
 
 #include "bin/dfe.h"
 #include "bin/dartutils.h"
+#include "bin/directory.h"
 #include "bin/error_exit.h"
 #include "bin/file.h"
+#include "bin/platform.h"
+#include "bin/utils.h"
 
 #include "vm/kernel.h"
 
+extern "C" {
+extern const uint8_t kKernelServiceDill[];
+extern intptr_t kKernelServiceDillSize;
+}
+
 namespace dart {
 namespace bin {
 
+#if defined(DART_NO_SNAPSHOT) || defined(DART_PRECOMPILER)
+const uint8_t* kernel_service_dill = NULL;
+const intptr_t kernel_service_dill_size = 0;
+#else
+const uint8_t* kernel_service_dill = kKernelServiceDill;
+const intptr_t kernel_service_dill_size = kKernelServiceDillSize;
+#endif
+
+const char kKernelServiceSnapshot[] = "kernel-service.dart.snapshot";
+const char kSnapshotsDirectory[] = "snapshots";
 const char kPlatformBinaryName[] = "vm_platform.dill";
 const char kPlatformStrongBinaryName[] = "vm_platform_strong.dill";
 
+void* DFE::kKernelServiceProgram = NULL;
+
+static char* GetDirectoryPrefixFromExeName() {
+  const char* name = Platform::GetExecutableName();
+  const char* sep = File::PathSeparator();
+  // Locate the last occurance of |sep| in |name|.
+  intptr_t i;
+  for (i = strlen(name) - 1; i >= 0; --i) {
+    const char* str = name + i;
+    if (strstr(str, sep) == str) {
+      break;
+    }
+  }
+
+  if (i < 0) {
+    return strdup("");
+  }
+
+  return StringUtils::StrNDup(name, i + 1);
+}
+
 DFE::DFE()
-    : frontend_filename_(NULL),
+    : use_dfe_(false),
+      frontend_filename_(NULL),
       kernel_binaries_path_(NULL),
       platform_binary_filename_(NULL),
       kernel_platform_(NULL),
@@ -24,6 +64,9 @@
       kernel_file_specified_(false) {}
 
 DFE::~DFE() {
+  if (frontend_filename_ != NULL) {
+    free(frontend_filename_);
+  }
   frontend_filename_ = NULL;
 
   free(kernel_binaries_path_);
@@ -39,6 +82,46 @@
   application_kernel_binary_ = NULL;
 }
 
+char* DFE::FrontendFilename() {
+  if (frontend_filename_ == NULL) {
+    // Look for the frontend snapshot next to the executable.
+    char* dir_prefix = GetDirectoryPrefixFromExeName();
+    // |dir_prefix| includes the last path seperator.
+    frontend_filename_ =
+        OS::SCreate(NULL, "%s%s", dir_prefix, kKernelServiceSnapshot);
+
+    if (!File::Exists(NULL, frontend_filename_)) {
+      // If the frontend snapshot is not found next to the executable,
+      // then look for it in the "snapshots" directory.
+      free(frontend_filename_);
+      // |dir_prefix| includes the last path seperator.
+      frontend_filename_ =
+          OS::SCreate(NULL, "%s%s%s%s", dir_prefix, kSnapshotsDirectory,
+                      File::PathSeparator(), kKernelServiceSnapshot);
+    }
+
+    free(dir_prefix);
+    if (!File::Exists(NULL, frontend_filename_)) {
+      free(frontend_filename_);
+      frontend_filename_ = NULL;
+    }
+  }
+  return frontend_filename_;
+}
+
+static void NoopRelease(uint8_t* buffer) {}
+
+void* DFE::KernelServiceProgram() {
+  if (kernel_service_dill == NULL) {
+    return NULL;
+  }
+  if (kKernelServiceProgram == NULL) {
+    kKernelServiceProgram = Dart_ReadKernelBinary(
+        kernel_service_dill, kernel_service_dill_size, NoopRelease);
+  }
+  return kKernelServiceProgram;
+}
+
 void DFE::SetKernelBinaries(const char* name) {
   kernel_binaries_path_ = strdup(name);
 }
@@ -171,6 +254,10 @@
 bool DFE::TryReadKernelFile(const char* script_uri,
                             const uint8_t** kernel_ir,
                             intptr_t* kernel_ir_size) const {
+  if (strlen(script_uri) >= 8 && strncmp(script_uri, "file:///", 8) == 0) {
+    script_uri = script_uri + 7;
+  }
+
   *kernel_ir = NULL;
   *kernel_ir_size = -1;
   void* script_file = DartUtils::OpenFile(script_uri, false);
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index d644b19..ead2c75 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -18,9 +18,16 @@
   DFE();
   ~DFE();
 
-  const char* frontend_filename() const { return frontend_filename_; }
-  void set_frontend_filename(const char* name) { frontend_filename_ = name; }
-  bool UseDartFrontend() const { return frontend_filename_ != NULL; }
+  char* FrontendFilename();
+  void set_frontend_filename(const char* name) {
+    if (frontend_filename_ != NULL) {
+      free(frontend_filename_);
+    }
+    frontend_filename_ = strdup(name);
+    set_use_dfe();
+  }
+  void set_use_dfe() { use_dfe_ = true; }
+  bool UseDartFrontend() const { return use_dfe_; }
 
   const char* GetPlatformBinaryFilename();
 
@@ -64,6 +71,8 @@
   // valid kernel file, false otherwise.
   void* ReadScript(const char* script_uri) const;
 
+  static void* KernelServiceProgram();
+
  private:
   // Tries to read [script_uri] as a Kernel IR file.
   // Returns `true` if successful and sets [kernel_file] and [kernel_length]
@@ -74,7 +83,8 @@
                          const uint8_t** kernel_ir,
                          intptr_t* kernel_ir_size) const;
 
-  const char* frontend_filename_;
+  bool use_dfe_;
+  char* frontend_filename_;
   char* kernel_binaries_path_;
   char* platform_binary_filename_;
   void* kernel_platform_;
@@ -85,6 +95,8 @@
 
   bool kernel_file_specified_;  // Kernel file was specified on the cmd line.
 
+  static void* kKernelServiceProgram;
+
   DISALLOW_COPY_AND_ASSIGN(DFE);
 };
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index f5e48a8..82ab90e 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -1392,8 +1392,13 @@
     isolate_data->set_dependencies(new MallocGrowableArray<char*>());
   }
 
+  Dart_IsolateFlags isolate_flags;
+  Dart_IsolateFlagsInitialize(&isolate_flags);
+  // We need to capture the vmservice library in the core snapshot, so load it
+  // in the main isolate as well.
+  isolate_flags.load_vmservice_library = true;
   Dart_Isolate isolate = Dart_CreateIsolateFromKernel(
-      NULL, NULL, kernel_program, NULL, isolate_data, &error);
+      NULL, NULL, kernel_program, &isolate_flags, isolate_data, &error);
   if (isolate == NULL) {
     delete isolate_data;
     Log::PrintErr("%s\n", error);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index f50e9ccd..892417f 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -299,51 +299,60 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 // Returns newly created Kernel Isolate on success, NULL on failure.
 // For now we only support the kernel isolate coming up from an
-// application snapshot or from sources which are compiled by the
-// VM parser.
-static Dart_Isolate CreateAndSetupKernelIsolate(const char* main,
+// application snapshot or from a .dill file.
+static Dart_Isolate CreateAndSetupKernelIsolate(const char* script_uri,
+                                                const char* main,
                                                 const char* package_root,
                                                 const char* packages_config,
                                                 Dart_IsolateFlags* flags,
                                                 char** error,
                                                 int* exit_code) {
-  if (!dfe.UseDartFrontend()) {
-    *error = strdup("Kernel isolate not supported.");
-    return NULL;
-  }
-  const char* script_uri = dfe.frontend_filename();
+  const char* kernel_snapshot_uri = dfe.FrontendFilename();
+  const char* uri =
+      kernel_snapshot_uri != NULL ? kernel_snapshot_uri : script_uri;
+
   if (packages_config == NULL) {
     packages_config = Options::packages_file();
   }
 
-  // Kernel isolate uses an app snapshot or the core libraries snapshot.
+  Dart_Isolate isolate;
+  IsolateData* isolate_data = NULL;
   bool isolate_run_app_snapshot = false;
-  const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
-  const uint8_t* isolate_snapshot_instructions =
-      core_isolate_snapshot_instructions;
-  AppSnapshot* app_snapshot = Snapshot::TryReadAppSnapshot(script_uri);
-  if (app_snapshot != NULL) {
-    isolate_run_app_snapshot = true;
-    const uint8_t* ignore_vm_snapshot_data;
-    const uint8_t* ignore_vm_snapshot_instructions;
-    app_snapshot->SetBuffers(
-        &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
-        &isolate_snapshot_data, &isolate_snapshot_instructions);
+  if (kernel_snapshot_uri != NULL) {
+    // Kernel isolate uses an app snapshot or the core libraries snapshot.
+    const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
+    const uint8_t* isolate_snapshot_instructions =
+        core_isolate_snapshot_instructions;
+    AppSnapshot* app_snapshot = Snapshot::TryReadAppSnapshot(uri);
+    if (app_snapshot != NULL) {
+      isolate_run_app_snapshot = true;
+      const uint8_t* ignore_vm_snapshot_data;
+      const uint8_t* ignore_vm_snapshot_instructions;
+      app_snapshot->SetBuffers(
+          &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
+          &isolate_snapshot_data, &isolate_snapshot_instructions);
+    }
+    IsolateData* isolate_data =
+        new IsolateData(uri, package_root, packages_config, app_snapshot);
+    isolate = Dart_CreateIsolate(
+        DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
+        isolate_snapshot_instructions, flags, isolate_data, error);
+  } else {
+    void* kernel_service_program = DFE::KernelServiceProgram();
+    IsolateData* isolate_data =
+        new IsolateData(uri, package_root, packages_config, NULL);
+    isolate_data->kernel_program = kernel_service_program;
+    isolate = Dart_CreateIsolateFromKernel(uri, main, kernel_service_program,
+                                           flags, isolate_data, error);
   }
 
-  IsolateData* isolate_data =
-      new IsolateData(script_uri, package_root, packages_config, app_snapshot);
-  Dart_Isolate isolate = Dart_CreateIsolate(
-      DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
-      isolate_snapshot_instructions, flags, isolate_data, error);
   if (isolate == NULL) {
     delete isolate_data;
     return NULL;
   }
 
-  return IsolateSetupHelper(isolate, false, script_uri, package_root,
-                            packages_config, isolate_snapshot_data,
-                            isolate_run_app_snapshot, error, exit_code);
+  return IsolateSetupHelper(isolate, false, uri, package_root, packages_config,
+                            true, isolate_run_app_snapshot, error, exit_code);
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -381,6 +390,11 @@
                                isolate_snapshot_instructions, flags,
                                isolate_data, error);
 #else
+  // Set the flag to load the vmservice library. If not set, the kernel
+  // loader might skip loading it. This is flag is not relevant for the
+  // non-kernel flow.
+  ASSERT(flags != NULL);
+  flags->load_vmservice_library = true;
   if (dfe.UsePlatformBinary()) {
     isolate = Dart_CreateIsolateFromKernel(
         script_uri, NULL, dfe.kernel_platform(), flags, isolate_data, error);
@@ -537,8 +551,9 @@
   int exit_code = 0;
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) {
-    return CreateAndSetupKernelIsolate(main, package_root, package_config,
-                                       flags, error, &exit_code);
+    return CreateAndSetupKernelIsolate(script_uri, main, package_root,
+                                       package_config, flags, error,
+                                       &exit_code);
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   if (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0) {
@@ -600,7 +615,7 @@
 }
 
 static bool FileModifiedCallback(const char* url, int64_t since) {
-  if (strncmp(url, "file:///", 8) == 0) {
+  if (strncmp(url, "file:///", 8) != 0) {
     // If it isn't a file on local disk, we don't know if it has been
     // modified.
     return true;
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 24a2bb8..03b348f 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -66,6 +66,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 DFE* Options::dfe_ = NULL;
 
+DEFINE_BOOL_OPTION_CB(preview_dart_2, { Options::dfe()->set_use_dfe(); });
+
 DEFINE_STRING_OPTION_CB(dfe, { Options::dfe()->set_frontend_filename(value); });
 
 DEFINE_STRING_OPTION_CB(kernel_binaries,
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 2db739a..1aec6f8 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -1720,7 +1720,8 @@
   }
 }
 
-class _RawDatagramSocket extends Stream implements RawDatagramSocket {
+class _RawDatagramSocket extends Stream<RawSocketEvent>
+    implements RawDatagramSocket {
   _NativeSocket _socket;
   StreamController<RawSocketEvent> _controller;
   bool _readEventsEnabled = true;
@@ -1728,7 +1729,7 @@
 
   _RawDatagramSocket(this._socket) {
     var zone = Zone.current;
-    _controller = new StreamController(
+    _controller = new StreamController<RawSocketEvent>(
         sync: true,
         onListen: _onSubscriptionStateChange,
         onCancel: _onSubscriptionStateChange,
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 5cc3992..ce36ebc 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -562,6 +562,7 @@
   Dart_QualifiedFunctionName* entry_points;
   bool reify_generic_functions;
   bool strong;
+  bool load_vmservice_library;
 } Dart_IsolateFlags;
 
 /**
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index b9fb751..dc6b038 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -25,13 +25,8 @@
     native "Internal_makeFixedListUnmodifiable";
 
 @patch
-Object extractTypeArguments<T>(T instance, Function extract) {
-  // TODO(31371): Implement this correctly for Dart 2.0.
-  // In Dart 1.0, instantiating the generic with dynamic (which this does),
-  // gives you an object that can be used anywhere a more specific type is
-  // expected, so this works for now.
-  return extract();
-}
+Object extractTypeArguments<T>(T instance, Function extract)
+    native "Internal_extractTypeArguments";
 
 class VMLibraryHooks {
   // Example: "dart:isolate _Timer._factory"
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 7b83079..5f3e449 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -311,6 +311,144 @@
 #endif  // defined(ARCH_IS_64_BIT)
 }
 
+static bool ExtractInterfaceTypeArgs(Zone* zone,
+                                     const Class& instance_cls,
+                                     const TypeArguments& instance_type_args,
+                                     const Class& interface_cls,
+                                     TypeArguments* interface_type_args) {
+  Class& cur_cls = Class::Handle(zone, instance_cls.raw());
+  // The following code is a specialization of Class::TypeTestNonRecursive().
+  Array& interfaces = Array::Handle(zone);
+  AbstractType& interface = AbstractType::Handle(zone);
+  Class& cur_interface_cls = Class::Handle(zone);
+  TypeArguments& cur_interface_type_args = TypeArguments::Handle(zone);
+  Error& error = Error::Handle(zone);
+  while (true) {
+    // Additional subtyping rules related to 'FutureOr' are not applied.
+    if (cur_cls.raw() == interface_cls.raw()) {
+      *interface_type_args = instance_type_args.raw();
+      return true;
+    }
+    interfaces = cur_cls.interfaces();
+    for (intptr_t i = 0; i < interfaces.Length(); i++) {
+      interface ^= interfaces.At(i);
+      ASSERT(interface.IsFinalized() && !interface.IsMalbounded());
+      cur_interface_cls = interface.type_class();
+      cur_interface_type_args = interface.arguments();
+      if (!cur_interface_type_args.IsNull() &&
+          !cur_interface_type_args.IsInstantiated()) {
+        error = Error::null();
+        cur_interface_type_args = cur_interface_type_args.InstantiateFrom(
+            instance_type_args, Object::null_type_arguments(), kNoneFree,
+            &error, NULL, NULL, Heap::kNew);
+        if (!error.IsNull()) {
+          continue;  // Another interface may work better.
+        }
+      }
+      if (ExtractInterfaceTypeArgs(zone, cur_interface_cls,
+                                   cur_interface_type_args, interface_cls,
+                                   interface_type_args)) {
+        return true;
+      }
+    }
+    cur_cls = cur_cls.SuperClass();
+    if (cur_cls.IsNull()) {
+      return false;
+    }
+  }
+}
+
+DEFINE_NATIVE_ENTRY(Internal_extractTypeArguments, 2) {
+  const Instance& instance =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Instance& extract =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(1));
+
+  Class& interface_cls = Class::Handle(zone);
+  intptr_t num_type_args = 0;  // Remains 0 when executing Dart 1.0 code.
+  // TODO(regis): Check for strong mode too?
+  if (Isolate::Current()->reify_generic_functions()) {
+    const TypeArguments& function_type_args =
+        TypeArguments::Handle(zone, arguments->NativeTypeArgs());
+    if (function_type_args.Length() == 1) {
+      const AbstractType& function_type_arg =
+          AbstractType::Handle(zone, function_type_args.TypeAt(0));
+      if (function_type_arg.IsType() &&
+          (function_type_arg.arguments() == TypeArguments::null())) {
+        interface_cls = function_type_arg.type_class();
+        num_type_args = interface_cls.NumTypeParameters();
+      }
+    }
+    if (num_type_args == 0) {
+      Exceptions::ThrowArgumentError(String::Handle(
+          zone,
+          String::New(
+              "single function type argument must specify a generic class")));
+    }
+  }
+  if (instance.IsNull()) {
+    Exceptions::ThrowArgumentError(instance);
+  }
+  // Function 'extract' must be generic and accept the same number of type args,
+  // unless we execute Dart 1.0 code.
+  if (extract.IsNull() || !extract.IsClosure() ||
+      ((num_type_args > 0) &&  // Dart 1.0 if num_type_args == 0.
+       (Function::Handle(zone, Closure::Cast(extract).function())
+            .NumTypeParameters() != num_type_args))) {
+    Exceptions::ThrowArgumentError(String::Handle(
+        zone,
+        String::New("argument 'extract' is not a generic function or not one "
+                    "accepting the correct number of type arguments")));
+  }
+  TypeArguments& extracted_type_args = TypeArguments::Handle(zone);
+  if (num_type_args > 0) {
+    // The passed instance must implement interface_cls.
+    TypeArguments& interface_type_args = TypeArguments::Handle(zone);
+    interface_type_args = TypeArguments::New(num_type_args);
+    Class& instance_cls = Class::Handle(zone, instance.clazz());
+    TypeArguments& instance_type_args = TypeArguments::Handle(zone);
+    if (instance_cls.NumTypeArguments() > 0) {
+      instance_type_args = instance.GetTypeArguments();
+    }
+    if (!ExtractInterfaceTypeArgs(zone, instance_cls, instance_type_args,
+                                  interface_cls, &interface_type_args)) {
+      Exceptions::ThrowArgumentError(String::Handle(
+          zone, String::New("type of argument 'instance' is not a subtype of "
+                            "the function type argument")));
+    }
+    if (!interface_type_args.IsNull()) {
+      extracted_type_args = TypeArguments::New(num_type_args);
+      const intptr_t offset = interface_cls.NumTypeArguments() - num_type_args;
+      AbstractType& type_arg = AbstractType::Handle(zone);
+      for (intptr_t i = 0; i < num_type_args; i++) {
+        type_arg = interface_type_args.TypeAt(offset + i);
+        extracted_type_args.SetTypeAt(i, type_arg);
+      }
+      extracted_type_args = extracted_type_args.Canonicalize();  // Can be null.
+    }
+  }
+  // Call the closure 'extract'.
+  Array& args_desc = Array::Handle(zone);
+  Array& args = Array::Handle(zone);
+  if (extracted_type_args.IsNull()) {
+    args_desc = ArgumentsDescriptor::New(0, 1);
+    args = Array::New(1);
+    args.SetAt(0, extract);
+  } else {
+    args_desc = ArgumentsDescriptor::New(num_type_args, 1);
+    args = Array::New(2);
+    args.SetAt(0, extracted_type_args);
+    args.SetAt(1, extract);
+  }
+  const Object& result =
+      Object::Handle(zone, DartEntry::InvokeClosure(args, args_desc));
+  if (result.IsError()) {
+    Exceptions::PropagateError(Error::Cast(result));
+    UNREACHABLE();
+  }
+  return result.raw();
+}
+
 DEFINE_NATIVE_ENTRY(Internal_prependTypeArguments, 3) {
   const TypeArguments& function_type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
diff --git a/runtime/observatory/lib/src/cli/command.dart b/runtime/observatory/lib/src/cli/command.dart
index a0d8fa1..b2a1ab7 100644
--- a/runtime/observatory/lib/src/cli/command.dart
+++ b/runtime/observatory/lib/src/cli/command.dart
@@ -9,7 +9,7 @@
 // line from the pieces.
 List<String> _splitLine(String line) {
   line = line.trimLeft();
-  var args = [];
+  var args = <String>[];
   int pos = 0;
   while (pos < line.length) {
     int startPos = pos;
@@ -44,7 +44,7 @@
   }
 
   // A command may optionally have sub-commands.
-  List<Command> _children = [];
+  List<Command> _children = <Command>[];
 
   _CommandBase _parent;
   int get _depth => (_parent == null ? 0 : _parent._depth + 1);
@@ -53,7 +53,8 @@
   //
   // Given a list of arguments to this command, provide a list of
   // possible completions for those arguments.
-  Future<List<String>> complete(List<String> args) => new Future.value([]);
+  Future<List<String>> complete(List<String> args) =>
+      new Future.value(<String>[]);
 
   // Override in subclasses to provide command-specific execution.
   Future run(List<String> args);
@@ -77,12 +78,12 @@
   // arguments.
   List<Command> _match(List<String> args, bool preferExact) {
     if (args.isEmpty) {
-      return [];
+      return <Command>[];
     }
     bool lastArg = (args.length == 1);
     var matches = _matchLocal(args[0], !lastArg || preferExact);
     if (matches.isEmpty) {
-      return [];
+      return <Command>[];
     } else if (matches.length == 1) {
       var childMatches = matches[0]._match(args.sublist(1), preferExact);
       if (childMatches.isEmpty) {
@@ -104,7 +105,7 @@
           args[args.length - 1] == '') {
         // Special case allowance for an empty particle at the end of
         // the command.
-        completions = [''];
+        completions = <String>[''];
       }
       var prefix = _concatArgs(args, _depth);
       return completions.map((str) => '${prefix}${str}').toList();
@@ -134,7 +135,7 @@
     var commands = _match(args, false);
     if (commands.isEmpty) {
       // No matching commands.
-      return new Future.value([]);
+      return new Future.value(<String>[]);
     }
     int matchLen = commands[0]._depth;
     if (matchLen < args.length) {
@@ -147,7 +148,7 @@
       } else {
         // An ambiguous prefix match leaves us nowhere.  The user is
         // typing a bunch of stuff that we don't know how to complete.
-        return new Future.value([]);
+        return new Future.value(<String>[]);
       }
     }
 
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 1b9159b..4189138 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -458,6 +458,8 @@
 abstract class Location implements M.Location {
   Script get script;
   int get tokenPos;
+  Future<int> getLine();
+  Future<int> getColumn();
 }
 
 /// A [SourceLocation] represents a location or range in the source code.
@@ -1362,7 +1364,7 @@
   static const kPossibleBreakpointsReport = 'PossibleBreakpoints';
   static const kProfileReport = '_Profile';
 
-  Future<ServiceMap> getSourceReport(List<String> report_kinds,
+  Future<ServiceObject> getSourceReport(List<String> report_kinds,
       [Script script, int startPos, int endPos]) {
     var params = <String, dynamic>{'reports': report_kinds};
     if (script != null) {
@@ -2448,7 +2450,8 @@
     functions.sort(ServiceObject.LexicalSortName);
   }
 
-  Future<ServiceObject> evaluate(String expression, {Map scope}) {
+  Future<ServiceObject> evaluate(String expression,
+      {Map<String, ServiceObject> scope}) {
     return isolate.eval(this, expression, scope: scope);
   }
 
@@ -2626,7 +2629,8 @@
     subclasses.sort(ServiceObject.LexicalSortName);
   }
 
-  Future<ServiceObject> evaluate(String expression, {Map scope}) {
+  Future<ServiceObject> evaluate(String expression,
+      {Map<String, ServiceObject> scope}) {
     return isolate.eval(this, expression, scope: scope);
   }
 
@@ -2991,7 +2995,8 @@
     return 'a ${clazz.name}';
   }
 
-  Future<ServiceObject> evaluate(String expression, {Map scope}) {
+  Future<ServiceObject> evaluate(String expression,
+      {Map<String, ServiceObject> scope}) {
     return isolate.eval(this, expression, scope: scope);
   }
 
@@ -3588,7 +3593,7 @@
     library = map['library'];
   }
 
-  void _parseTokenPosTable(List<List<int>> table) {
+  void _parseTokenPosTable(List/*<List<int>>*/ table) {
     if (table == null) {
       return;
     }
@@ -4398,7 +4403,7 @@
     }
   }
 
-  void _processDescriptors(List<Map> descriptors) {
+  void _processDescriptors(List/*<Map>*/ descriptors) {
     for (Map descriptor in descriptors) {
       var pcOffset = int.parse(descriptor['pcOffset'], radix: 16);
       var address = startAddress + pcOffset;
@@ -4558,7 +4563,7 @@
   String toString() => "ServiceMetric($_id)";
 }
 
-Future<Null> printFrames(List<Frame> frames) async {
+Future<Null> printFrames(List/*<Frame>*/ frames) async {
   for (int i = 0; i < frames.length; i++) {
     final Frame frame = frames[i];
     String frameText = await frame.toUserString();
diff --git a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
index 5c645b5..318afa2 100644
--- a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
+++ b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
@@ -62,13 +62,15 @@
     expect(await futureBpt2.location.getColumn(), equals(3));
 
     // The first breakpoint hits before value is modified.
-    expect((await rootLib.evaluate('value')).valueAsString, equals('0'));
+    Instance result = await rootLib.evaluate('value');
+    expect(result.valueAsString, equals('0'));
 
     isolate.resume();
     await hasStoppedAtBreakpoint(isolate);
 
     // The second breakpoint hits after value has been modified once.
-    expect((await rootLib.evaluate('value')).valueAsString, equals('1'));
+    result = await rootLib.evaluate('value');
+    expect(result.valueAsString, equals('1'));
 
     // Remove the breakpoints.
     expect(
diff --git a/runtime/observatory/tests/service/address_mapper_test.dart b/runtime/observatory/tests/service/address_mapper_test.dart
index 05fbf36..6cc023e 100644
--- a/runtime/observatory/tests/service/address_mapper_test.dart
+++ b/runtime/observatory/tests/service/address_mapper_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--compile_all --error_on_bad_type --error_on_bad_override
+// VMOptions=--error_on_bad_type --error_on_bad_override
 
 import 'package:observatory/object_graph.dart';
 import 'package:unittest/unittest.dart';
diff --git a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
index 00c1268..6781af7 100644
--- a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
+++ b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
@@ -4,24 +4,25 @@
 // VMOptions=--error_on_bad_type --error_on_bad_override --verbose-debug
 // VMOptions=--error_on_bad_type --error_on_bad_override --verbose-debug --stacktrace-every=55 --stress-async-stacks
 
+import 'dart:async';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
 printSync() {
-  print('sync'); // Line 11
+  print('sync'); // Line 12
 }
 
 printAsync() async {
-  print('async'); // Line 15
+  print('async'); // Line 16
 }
 
 printAsyncStar() async* {
-  print('async*'); // Line 19
+  print('async*'); // Line 20
 }
 
 printSyncStar() sync* {
-  print('sync*'); // Line 23
+  print('sync*'); // Line 24
 }
 
 var testerReady = false;
@@ -38,38 +39,38 @@
   var stream = printAsyncStar();
   var iterator = printSyncStar();
 
-  print('middle'); // Line 41
+  print('middle'); // Line 42
 
   future.then((v) => print(v));
   stream.toList();
   iterator.toList();
 }
 
-testAsync(Isolate isolate) async {
+Future testAsync(Isolate isolate) async {
   await isolate.rootLibrary.load();
   var script = isolate.rootLibrary.scripts[0];
 
-  var bp1 = await isolate.addBreakpoint(script, 11);
+  var bp1 = await isolate.addBreakpoint(script, 12);
   expect(bp1, isNotNull);
   expect(bp1 is Breakpoint, isTrue);
-  var bp2 = await isolate.addBreakpoint(script, 15);
+  var bp2 = await isolate.addBreakpoint(script, 16);
   expect(bp2, isNotNull);
   expect(bp2 is Breakpoint, isTrue);
-  var bp3 = await isolate.addBreakpoint(script, 19);
+  var bp3 = await isolate.addBreakpoint(script, 20);
   expect(bp3, isNotNull);
   expect(bp3 is Breakpoint, isTrue);
-  var bp4 = await isolate.addBreakpoint(script, 23);
+  var bp4 = await isolate.addBreakpoint(script, 24);
   expect(bp4, isNotNull);
   expect(bp4 is Breakpoint, isTrue);
-  var bp5 = await isolate.addBreakpoint(script, 41);
+  var bp5 = await isolate.addBreakpoint(script, 42);
   print("BP5 - $bp5");
   expect(bp5, isNotNull);
   expect(bp5 is Breakpoint, isTrue);
 
   var hits = [];
 
-  isolate.rootLibrary.evaluate('testerReady = true;').then((Instance result) {
-    expect(result.valueAsString, equals('true'));
+  isolate.rootLibrary.evaluate('testerReady = true;').then((result) {
+    expect((result as Instance).valueAsString, equals('true'));
   });
 
   var stream = await isolate.vm.getEventStream(VM.kDebugStream);
diff --git a/runtime/observatory/tests/service/bad_reload_test.dart b/runtime/observatory/tests/service/bad_reload_test.dart
index 00665f7..b099a56 100644
--- a/runtime/observatory/tests/service/bad_reload_test.dart
+++ b/runtime/observatory/tests/service/bad_reload_test.dart
@@ -66,9 +66,9 @@
     );
     // Observe that it failed.
     expect(response['success'], isFalse);
-    List<Map<String, dynamic>> notices = response['details']['notices'];
+    List/*<Map<String, dynamic>>*/ notices = response['details']['notices'];
     expect(notices.length, equals(1));
-    Map<String, dynamic> reasonForCancelling = notices[0];
+    Map/*<String, dynamic>*/ reasonForCancelling = notices[0];
     expect(reasonForCancelling['type'], equals('ReasonForCancelling'));
     expect(reasonForCancelling['message'], contains('library_isnt_here_man'));
 
diff --git a/runtime/observatory/tests/service/bad_web_socket_address_test.dart b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
index 3a4843c..2f63d9f 100644
--- a/runtime/observatory/tests/service/bad_web_socket_address_test.dart
+++ b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
@@ -9,7 +9,7 @@
 
 void testBadWebSocket() {
   var vm = new WebSocketVM(new WebSocketVMTarget('ws://karatekid/ws'));
-  vm.load().catchError(expectAsync((error) {
+  vm.load().then<dynamic>((_) => null).catchError(expectAsync((error) {
     expect(error, new isInstanceOf<NetworkRpcException>());
   }));
 }
diff --git a/runtime/observatory/tests/service/capture_stdio_test.dart b/runtime/observatory/tests/service/capture_stdio_test.dart
index 102b1e8..449d9dd 100644
--- a/runtime/observatory/tests/service/capture_stdio_test.dart
+++ b/runtime/observatory/tests/service/capture_stdio_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--compile_all --error_on_bad_type --error_on_bad_override
+// VMOptions=--error_on_bad_type --error_on_bad_override
 
 import 'dart:async';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/command_test.dart b/runtime/observatory/tests/service/command_test.dart
index bf90f07..a463443 100644
--- a/runtime/observatory/tests/service/command_test.dart
+++ b/runtime/observatory/tests/service/command_test.dart
@@ -36,18 +36,18 @@
 
 void testCommandComplete() {
   RootCommand cmd = new RootCommand([
-    new TestCommand(null, 'alpha', []),
-    new TestCommand(null, 'game', [
-      new TestCommand(null, 'checkers', []),
-      new TestCommand(null, 'chess', [])
+    new TestCommand(null, 'alpha', <Command>[]),
+    new TestCommand(null, 'game', <Command>[
+      new TestCommand(null, 'checkers', <Command>[]),
+      new TestCommand(null, 'chess', <Command>[])
     ]),
-    new TestCommand(null, 'gamera', [
-      new TestCommand(null, 'london', []),
-      new TestCommand(null, 'tokyo', []),
-      new TestCommand(null, 'topeka', [])
+    new TestCommand(null, 'gamera', <Command>[
+      new TestCommand(null, 'london', <Command>[]),
+      new TestCommand(null, 'tokyo', <Command>[]),
+      new TestCommand(null, 'topeka', <Command>[])
     ]),
     new TestCompleteCommand(
-        null, 'count', [new TestCommand(null, 'chocula', [])])
+        null, 'count', <Command>[new TestCommand(null, 'chocula', <Command>[])])
   ]);
 
   // Show all commands.
@@ -147,7 +147,8 @@
 void testCommandRunSimple() {
   // Run a simple command.
   StringBuffer out = new StringBuffer();
-  RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', [])]);
+  RootCommand cmd =
+      new RootCommand([new TestCommand(out, 'alpha', <Command>[])]);
 
   // Full name dispatch works.  Argument passing works.
   cmd.runCommand('alpha dog').then(expectAsync((_) {
@@ -164,8 +165,10 @@
   // Run a simple command.
   StringBuffer out = new StringBuffer();
   RootCommand cmd = new RootCommand([
-    new TestCommand(out, 'alpha',
-        [new TestCommand(out, 'beta', []), new TestCommand(out, 'gamma', [])])
+    new TestCommand(out, 'alpha', [
+      new TestCommand(out, 'beta', <Command>[]),
+      new TestCommand(out, 'gamma', <Command>[])
+    ])
   ]);
 
   cmd.runCommand('a b').then(expectAsync((_) {
@@ -180,7 +183,8 @@
 void testCommandRunNotFound() {
   // Run a simple command.
   StringBuffer out = new StringBuffer();
-  RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', [])]);
+  RootCommand cmd =
+      new RootCommand([new TestCommand(out, 'alpha', <Command>[])]);
 
   cmd.runCommand('goose').catchError(expectAsync((e) {
     expect(e.toString(), equals("No such command: 'goose'"));
@@ -190,8 +194,10 @@
 void testCommandRunAmbiguous() {
   // Run a simple command.
   StringBuffer out = new StringBuffer();
-  RootCommand cmd = new RootCommand(
-      [new TestCommand(out, 'alpha', []), new TestCommand(out, 'ankle', [])]);
+  RootCommand cmd = new RootCommand([
+    new TestCommand(out, 'alpha', <Command>[]),
+    new TestCommand(out, 'ankle', <Command>[])
+  ]);
 
   cmd.runCommand('a 55').catchError(expectAsync((e) {
     expect(e.toString(), equals("Command 'a 55' is ambiguous: [alpha, ankle]"));
@@ -205,10 +211,10 @@
 void testCommandRunAlias() {
   // Run a simple command.
   StringBuffer out = new StringBuffer();
-  var aliasCmd = new TestCommand(out, 'alpha', []);
+  var aliasCmd = new TestCommand(out, 'alpha', <Command>[]);
   aliasCmd.alias = 'a';
   RootCommand cmd =
-      new RootCommand([aliasCmd, new TestCommand(out, 'ankle', [])]);
+      new RootCommand([aliasCmd, new TestCommand(out, 'ankle', <Command>[])]);
 
   cmd.runCommand('a 55').then(expectAsync((_) {
     expect(out.toString(), equals('executing alpha([55])\n'));
diff --git a/runtime/observatory/tests/service/dev_fs_spawn_test.dart b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
index 79f2ba5..1ed42cf 100644
--- a/runtime/observatory/tests/service/dev_fs_spawn_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
@@ -156,7 +156,7 @@
     result = await vm.invokeRpcNoUpgrade('_spawnUri', {
       'token': 'mySpawnToken1',
       'uri': '${fsUri}${filePaths[1]}',
-      'args': ['one', 'two', 'three']
+      'args': <String>['one', 'two', 'three']
     });
     expect(result['type'], equals('Success'));
     spawnedIsolate = await completer.future;
diff --git a/runtime/observatory/tests/service/eval_internal_class_test.dart b/runtime/observatory/tests/service/eval_internal_class_test.dart
index fc0b2b8..3027965 100644
--- a/runtime/observatory/tests/service/eval_internal_class_test.dart
+++ b/runtime/observatory/tests/service/eval_internal_class_test.dart
@@ -12,7 +12,7 @@
 
     Class classLibrary = await root.clazz.load();
     print(classLibrary);
-    var result = await classLibrary.evaluate('3 + 4');
+    dynamic result = await classLibrary.evaluate('3 + 4');
     print(result);
     expect(result is DartError, isTrue);
     expect(result.message, contains('Cannot evaluate'));
@@ -24,7 +24,7 @@
     expect(result is DartError, isTrue);
     expect(result.message, contains('Cannot evaluate'));
 
-    var someArray = await root.evaluate("new List(2)");
+    Instance someArray = await root.evaluate("new List(2)");
     print(someArray);
     expect(someArray is Instance, isTrue);
     Class classArray = await someArray.clazz.load();
diff --git a/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart b/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
index 6f1f727..c74c4be 100644
--- a/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
@@ -6,6 +6,7 @@
 // Tests that expressions evaluated in a frame see the same scope as the
 // frame's method.
 
+import 'dart:async';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
@@ -28,7 +29,7 @@
   obj.test();
 }
 
-testerDo(Isolate isolate) async {
+Future testerDo(Isolate isolate) async {
   await hasStoppedAtBreakpoint(isolate);
 
   // Make sure we are in the right place.
@@ -39,7 +40,7 @@
   expect(stack['frames'][topFrame].function.dartOwner.name,
       equals('Superclass&Klass'));
 
-  var result;
+  Instance result;
 
   result = await isolate.evalFrame(topFrame, '_local');
   print(result);
diff --git a/runtime/observatory/tests/service/evaluate_activation_test.dart b/runtime/observatory/tests/service/evaluate_activation_test.dart
index c326cea..fc87190 100644
--- a/runtime/observatory/tests/service/evaluate_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_test.dart
@@ -7,6 +7,7 @@
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
+import 'dart:async';
 import 'dart:math' as math;
 
 breakHere() {}
@@ -67,7 +68,7 @@
   }
 }
 
-testMethod(Isolate isolate) async {
+Future testMethod(Isolate isolate) async {
   // silence analyzer.
   expect(math.sqrt(4), equals(2));
   Library rootLib = await isolate.rootLibrary.load();
@@ -118,7 +119,7 @@
   expect(hitBreakpoint, isTrue);
 }
 
-testMethod2(Isolate isolate) async {
+Future testMethod2(Isolate isolate) async {
   Library rootLib = await isolate.rootLibrary.load();
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
@@ -167,7 +168,7 @@
   expect(hitBreakpoint, isTrue);
 }
 
-testMethod3(Isolate isolate) async {
+Future testMethod3(Isolate isolate) async {
   Library rootLib = await isolate.rootLibrary.load();
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
@@ -209,7 +210,7 @@
 }
 
 
-testMethod4(Isolate isolate) async {
+Future testMethod4(Isolate isolate) async {
   Library rootLib = await isolate.rootLibrary.load();
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
diff --git a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
index dcf1002..0e021dc 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
@@ -27,7 +27,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 16);
 
-    var result = await isolate.evalFrame(topFrame, "x");
+    Instance result = await isolate.evalFrame(topFrame, "x");
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -40,7 +40,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 18);
 
-    var result = await isolate.evalFrame(topFrame, "z");
+    Instance result = await isolate.evalFrame(topFrame, "z");
     print(result);
     expect(result.valueAsString, equals("7"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
index 0c76684..34c4358 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
@@ -31,7 +31,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 15);
 
-    var result = await isolate.evalFrame(topFrame, "x");
+    Instance result = await isolate.evalFrame(topFrame, "x");
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -44,7 +44,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 18);
 
-    var result = await isolate.evalFrame(topFrame, "z");
+    Instance result = await isolate.evalFrame(topFrame, "z");
     print(result);
     expect(result.valueAsString, equals("7"));
   },
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 4c7e9b0..bb8cd78 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
@@ -45,25 +45,26 @@
     var thing2 = thing2Field.staticValue;
     print(thing2);
 
-    var result = await isolate
-        .evalFrame(0, "x + y + a + b", scope: {"a": thing1, "b": thing2});
+    Instance result = await isolate.evalFrame(0, "x + y + a + b",
+        scope: <String, ServiceObject>{"a": thing1, "b": thing2});
     print(result);
     expect(result.valueAsString, equals('2033'));
 
-    result = await isolate
-        .evalFrame(0, "local + a + b", scope: {"a": thing1, "b": thing2});
+    result = await isolate.evalFrame(0, "local + a + b",
+        scope: <String, ServiceObject>{"a": thing1, "b": thing2});
     print(result);
     expect(result.valueAsString, equals('2033'));
 
     // Note the eval's scope is shadowing the locals' scope.
-    result =
-        await isolate.evalFrame(0, "x + y", scope: {"x": thing1, "y": thing2});
+    result = await isolate.evalFrame(0, "x + y",
+        scope: <String, ServiceObject>{"x": thing1, "y": thing2});
     print(result);
     expect(result.valueAsString, equals('7'));
 
     bool didThrow = false;
     try {
-      await lib.evaluate("x + y", scope: {"x": lib, "y": lib});
+      await lib.evaluate("x + y",
+          scope: <String, ServiceObject>{"x": lib, "y": lib});
     } catch (e) {
       didThrow = true;
       expect(e.toString(),
@@ -73,8 +74,8 @@
 
     didThrow = false;
     try {
-      result =
-          await lib.evaluate("x + y", scope: {"not&an&identifier": thing1});
+      result = await lib.evaluate("x + y",
+          scope: <String, ServiceObject>{"not&an&identifier": thing1});
       print(result);
     } catch (e) {
       didThrow = true;
diff --git a/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
index 04c3385..c29a44c 100644
--- a/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
@@ -31,7 +31,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 15);
 
-    var result = await isolate.evalFrame(topFrame, "x");
+    Instance result = await isolate.evalFrame(topFrame, "x");
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -44,7 +44,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 18);
 
-    var result = await isolate.evalFrame(topFrame, "z");
+    Instance result = await isolate.evalFrame(topFrame, "z");
     print(result);
     expect(result.valueAsString, equals("7"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
index c2d8aff..c779326 100644
--- a/runtime/observatory/tests/service/evaluate_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
@@ -27,12 +27,14 @@
     var thing2 = thing2Field.staticValue;
     print(thing2);
 
-    var result = await lib.evaluate("x + y", scope: {"x": thing1, "y": thing2});
+    Instance result = await lib.evaluate("x + y",
+        scope: <String, ServiceObject>{"x": thing1, "y": thing2});
     expect(result.valueAsString, equals('7'));
 
     bool didThrow = false;
     try {
-      result = await lib.evaluate("x + y", scope: {"x": lib, "y": lib});
+      result = await lib.evaluate("x + y",
+          scope: <String, ServiceObject>{"x": lib, "y": lib});
       print(result);
     } catch (e) {
       didThrow = true;
@@ -43,8 +45,8 @@
 
     didThrow = false;
     try {
-      result =
-          await lib.evaluate("x + y", scope: {"not&an&identifier": thing1});
+      result = await lib.evaluate("x + y",
+          scope: <String, ServiceObject>{"not&an&identifier": thing1});
       print(result);
     } catch (e) {
       didThrow = true;
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index b7b125ce..e00fe7a 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -38,9 +38,6 @@
 evaluate_activation_in_method_class_test: CompileTimeError # Issue 24478
 get_isolate_after_language_error_test: SkipByDesign
 
-[ $compiler == dartk ]
-next_through_simple_async_test: Pass, Fail # Issue 29145
-
 # Kernel version of tests
 [ $compiler != dartk ]
 add_breakpoint_rpc_kernel_test: SkipByDesign # kernel specific version of add_breakpoint_rpc_test
@@ -79,13 +76,12 @@
 # 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) ]
+bad_reload_test: RuntimeError # Please triage.
 coverage_leaf_function_test: RuntimeError # Please triage.
 coverage_optimized_function_test: RuntimeError # Please triage.
 dev_fs_spawn_test: RuntimeError # Please triage.
-developer_service_get_isolate_id_test: RuntimeError # Please triage.
 get_object_rpc_test: RuntimeError # Please triage.
 get_source_report_test: RuntimeError # Please triage.
-issue_30555_test: RuntimeError # Please triage.
 library_dependency_test: RuntimeError # Please triage.
 reload_sources_test: Timeout, Skip # Please triage.
 set_name_rpc_test: RuntimeError # Please triage.
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 903a5a5..75bbb40 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -5,28 +5,25 @@
 # Kernel works slightly different. There are kernel specific versions.
 # These are the non-kernel specific versions so skip tests and allow errors.
 [ $compiler == dartk ]
-*_reload_*: Skip # no reload support for now
 add_breakpoint_rpc_test: SkipByDesign # non-kernel specific version of add_breakpoint_rpc_kernel_test.
-address_mapper_test: CompileTimeError # These 3 tests fail with 'dart:vmservice_io': error: [...] native function 'VMServiceIO_Shutdown' (0 arguments) cannot be found because of '--compile_all'
-address_mapper_test: Crash
-async_generator_breakpoint_test: Skip # Issue 29158, Async debugging
 async_single_step_out_test: RuntimeError # Issue 29158, Async debugging
 async_star_single_step_into_test: RuntimeError # Issue 29158, Async debugging
 async_star_step_out_test: RuntimeError # Issue 29158, Async debugging
 async_step_out_test: RuntimeError # Issue 29158, Async debugging
 awaiter_async_stack_contents_test: RuntimeError # Issue 29158, Async debugging
-capture_stdio_test: CompileTimeError # These 3 tests fail with 'dart:vmservice_io': error: [...] native function 'VMServiceIO_Shutdown' (0 arguments) cannot be found because of '--compile_all'
-capture_stdio_test: Crash
+complex_reload_test: RuntimeError
 developer_extension_test: CompileTimeError
-eval_internal_class_test: Skip # no evaluation test for now
-evaluate_*: Skip # no evaluation test for now
+eval_internal_class_test: RuntimeError
+evaluate_activation_in_method_class_test: RuntimeError
+evaluate_activation_test/instance: RuntimeError
+evaluate_activation_test/scope: RuntimeError
+evaluate_in_sync_star_activation_test: RuntimeError
 get_isolate_after_language_error_test: CompileTimeError
-isolate_lifecycle_test: Pass, RuntimeError # Inherited from service.status
 library_dependency_test: CompileTimeError # Deferred loading kernel issue 28335.
 pause_on_unhandled_async_exceptions2_test: RuntimeError # --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
 pause_on_unhandled_async_exceptions_test: RuntimeError #  --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
 step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
-vm_restart_test: Crash
+unused_changes_in_last_reload_test: RuntimeError
 
 [ $compiler == dartkp ]
 *: Skip # Non-kernel also skips precompiled mode.
@@ -42,84 +39,43 @@
 [ $compiler == dartk && $mode == debug && $strong ]
 external_service_disappear_test: Crash # Issue 31587
 
-# Issue 31587
-[ $compiler == dartk && $strong ]
-add_breakpoint_rpc_kernel_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_function_test: RuntimeError
-breakpoint_in_parts_class_test: RuntimeError
-breakpoint_two_args_checked_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
+[ $compiler == dartk && $system == windows ]
+coverage_leaf_function_test: RuntimeError
+coverage_optimized_function_test: Skip # Timeout
+get_source_report_test: RuntimeError
+step_test: Pass, Slow
+step_through_constructor_test: Pass, Slow
+
+[ $compiler == dartk && $system == windows && $strong ]
+add_breakpoint_rpc_kernel_test: Skip # Timeout
+issue_30555_test: Skip # Timeout
+next_through_implicit_call_test: Skip # Timeout
+next_through_operator_bracket_on_super_test: Skip # Timeout
+next_through_operator_bracket_on_this_test: Skip # Timeout
+next_through_operator_bracket_test: Skip # Timeout
+next_through_simple_async_test: Skip # Timeout
+step_through_constructor_calls_test: Skip # Timeout
+step_through_property_set_test: Skip # Timeout
+
+[ $compiler == dartk && $system == windows && !$strong ]
 code_test: RuntimeError
-command_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: Skip # Timeout
 get_object_rpc_test: RuntimeError
-get_object_store_rpc_test: RuntimeError
 get_stack_rpc_test: RuntimeError
-issue_25465_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
+next_through_catch_test: Skip # Timeout
+next_through_for_loop_with_break_and_continue_test: Skip # Timeout
+next_through_simple_async_test: Skip # Timeout
+step_test: Skip # Timeout
+step_through_constructor_test: Skip # Timeout
+
+[ $compiler == dartk && $strong ]
+awaiter_async_stack_contents_test: RuntimeError
+external_service_asynchronous_invocation_test: CompileTimeError # Issue 31696
+external_service_disappear_test: CompileTimeError # Issue 31696
+external_service_notification_invocation_test: CompileTimeError # Issue 31696
+external_service_registration_test: CompileTimeError # Issue 31696
+external_service_registration_via_notification_test: CompileTimeError # Issue 31696
+external_service_synchronous_invocation_test: CompileTimeError # Issue 31696
+get_object_rpc_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/tests/vm/dart/data_uri_spawn_test.dart b/runtime/tests/vm/dart/data_uri_spawn_test.dart
index 25a18c1..4d2d023 100644
--- a/runtime/tests/vm/dart/data_uri_spawn_test.dart
+++ b/runtime/tests/vm/dart/data_uri_spawn_test.dart
@@ -20,7 +20,7 @@
 """;
 
     RawReceivePort receivePort;
-    receivePort = new RawReceivePort(expectAsync((int message) {
+    receivePort = new RawReceivePort(expectAsync((message) {
       expect(message, equals(42));
       receivePort.close();
     }));
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d2ec7b8..4390d0f 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -186,14 +186,12 @@
 cc/DartAPI_LookupLibrary: Crash
 cc/DartAPI_NativeFieldAccess: Fail
 cc/DartAPI_NegativeNativeFieldInIsolateMessage: Crash
-cc/DartAPI_New: Crash
 cc/DartAPI_ParsePatchLibrary: Crash
 cc/DartAPI_PropagateError: Fail
 cc/DartAPI_StackOverflowStackTraceInfoArrowFunction: Fail
 cc/DartAPI_StackOverflowStackTraceInfoBraceFunction1: Fail
 cc/DartAPI_StackOverflowStackTraceInfoBraceFunction2: Fail
 cc/DartAPI_TestNativeFieldsAccess: Crash
-cc/DartAPI_TypeGetParameterizedTypes: Crash
 cc/DebuggerAPI_BreakpointStubPatching: Fail
 cc/DebuggerAPI_GetClosureInfo: Fail
 cc/DebuggerAPI_InterruptIsolate: SkipSlow
@@ -211,8 +209,6 @@
 cc/IsolateReload_ChangeInstanceFormat8: Skip
 cc/IsolateReload_ClassFieldAdded: Skip # Crash, Timeout
 cc/IsolateReload_ClassFieldAdded2: Skip # Crash, Timeout
-cc/IsolateReload_DanglingGetter_Class: Fail
-cc/IsolateReload_DanglingGetter_Instance: Fail
 cc/IsolateReload_DanglingGetter_Library: Fail
 cc/IsolateReload_DanglingSetter_Class: Fail
 cc/IsolateReload_DanglingSetter_Instance: Fail
@@ -226,7 +222,6 @@
 cc/IsolateReload_ImportedLibModified: Crash
 cc/IsolateReload_ImportedMixinFunction: Crash
 cc/IsolateReload_LibraryHide: Crash
-cc/IsolateReload_LibraryLookup: Fail
 cc/IsolateReload_LibraryShow: Crash
 cc/IsolateReload_LiveStack: Fail
 cc/IsolateReload_MainLibModified: Crash
@@ -243,16 +238,7 @@
 cc/IsolateReload_RunNewFieldInitializersWithConsts: Skip
 cc/IsolateReload_ShapeChangeRetainsHash: Skip
 cc/IsolateReload_SmiFastPathStubs: Fail
-cc/IsolateReload_TearOff_AddArguments: Fail
-cc/IsolateReload_TearOff_AddArguments2: Fail
-cc/IsolateReload_TearOff_Class_Identity: Fail
-cc/IsolateReload_TearOff_Instance_Equality: Fail
-cc/IsolateReload_TearOff_Library_Identity: Fail
-cc/IsolateReload_TearOff_List_Set: Fail
 cc/IsolateReload_TopLevelParseError: Fail
-cc/IsolateReload_TypeIdentity: Fail
-cc/IsolateReload_TypeIdentityGeneric: Fail
-cc/IsolateReload_TypeIdentityParameter: Fail
 cc/IsolateReload_TypedefToNotTypedef: Fail
 cc/Parser_AllocateVariables_CaptureLoopVar: Fail
 cc/Parser_AllocateVariables_CapturedVar: Fail
@@ -296,9 +282,7 @@
 cc/SourceReport_PossibleBreakpoints_Simple: Fail
 cc/StackTraceFormat: Fail
 cc/UseDartApi: Fail
-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/data_uri_import_test/utf16: MissingRuntimeError
 dart/spawn_shutdown_test: SkipSlow
 
 [ $compiler == dartk && $runtime == vm && $system == macos ]
@@ -325,21 +309,61 @@
 cc/Parser_AllocateVariables_NestedCapturedVar: Crash
 cc/Parser_AllocateVariables_TwoChains: Crash
 
+[ $compiler == dartk && $system == linux ]
+cc/IsolateReload_DanglingGetter_Class: Fail
+cc/IsolateReload_DanglingGetter_Instance: Fail
+cc/IsolateReload_LibraryLookup: Fail
+cc/IsolateReload_TearOff_AddArguments: Fail
+cc/IsolateReload_TearOff_AddArguments2: Fail
+cc/IsolateReload_TearOff_Class_Identity: Fail
+cc/IsolateReload_TearOff_Instance_Equality: Fail
+cc/IsolateReload_TearOff_Library_Identity: Fail
+cc/IsolateReload_TearOff_List_Set: Fail
+cc/IsolateReload_TypeIdentity: Fail
+cc/IsolateReload_TypeIdentityGeneric: Fail
+cc/IsolateReload_TypeIdentityParameter: Fail
+
+[ $compiler == dartk && $system == windows ]
+cc/DartAPI_New: Fail
+cc/DartAPI_TypeGetParameterizedTypes: Fail
+cc/IsolateReload_DanglingGetter_Class: Crash
+cc/IsolateReload_DanglingGetter_Instance: Crash
+cc/IsolateReload_LibraryLookup: Crash
+cc/IsolateReload_TearOff_AddArguments: Crash
+cc/IsolateReload_TearOff_AddArguments2: Crash
+cc/IsolateReload_TearOff_Class_Identity: Crash
+cc/IsolateReload_TearOff_Instance_Equality: Crash
+cc/IsolateReload_TearOff_Library_Identity: Crash
+cc/IsolateReload_TearOff_List_Set: Crash
+cc/IsolateReload_TypeIdentity: Crash
+cc/IsolateReload_TypeIdentityGeneric: Crash
+cc/IsolateReload_TypeIdentityParameter: Crash
+cc/Profiler_BasicSourcePosition: Fail
+cc/Profiler_CodeTicks: Fail
+cc/Profiler_FunctionTicks: Fail
+cc/Profiler_ToggleRecordAllocation: Fail
+cc/Profiler_TrivialRecordAllocation: Fail
+cc/Service_Address: Fail
+cc/Service_Code: Fail
+dart/redirection_type_shuffling_test/00: Fail
+dart/redirection_type_shuffling_test/none: Fail
+
+[ $compiler == dartk && $system != windows ]
+cc/DartAPI_New: Crash
+cc/DartAPI_TypeGetParameterizedTypes: Crash
+dart/redirection_type_shuffling_test/00: Crash
+dart/redirection_type_shuffling_test/none: Crash
+
 [ $compiler == dartk && $strong ]
-dart/data_uri_spawn_test: CompileTimeError # Issue 31586
 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
 
 [ $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).
diff --git a/runtime/tools/dill_to_data_cc.py b/runtime/tools/dill_to_data_cc.py
new file mode 100755
index 0000000..b3b1211
--- /dev/null
+++ b/runtime/tools/dill_to_data_cc.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+#
+# 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.
+
+# Script to create a cc file with uint8 array of bytes corresponding to the
+# content of given a dill file.
+
+import optparse
+import sys
+
+# Option => Help mapping.
+OPTION_MAP = {
+  'dill_file': 'Path to the input dill file.',
+  'data_symbol': 'The C name for the data array.',
+  'size_symbol': 'The C name for the data size variable.',
+  'output': 'Path to the generated cc file.',
+}
+
+
+def BuildOptionParser():
+  parser = optparse.OptionParser()
+  for opt, help_text in OPTION_MAP.iteritems():
+    parser.add_option('--%s' % opt, type='string', help=help_text)
+  return parser
+
+
+def ValidateOptions(options):
+  for opt in OPTION_MAP.keys():
+    if getattr(options, opt) is None:
+      sys.stderr.write('--%s option not specified.\n' % opt)
+      return False
+  return True
+
+
+def WriteData(input_filename, data_symbol, output_file):
+  output_file.write('uint8_t %s[] = {\n' % data_symbol)
+  with open(input_filename, 'rb') as f:
+    first = True
+    size = 0
+    for byte in f.read():
+      if first:
+        output_file.write('  %d' % ord(byte))
+        first = False
+      else:
+        output_file.write(',\n  %d' % ord(byte))
+      size += 1
+  output_file.write('\n};\n')
+  return size
+
+
+def WriteSize(size_symbol, size, output_file):
+  output_file.write('intptr_t %s = %d;\n' % (size_symbol, size))
+
+
+def Main():
+  opt_parser = BuildOptionParser()
+  (options, args) = opt_parser.parse_args()
+  if not ValidateOptions(options):
+    opt_parser.print_help()
+    return 1
+  if args:
+    sys.stderr.write('Unknown args: "%s"\n' % str(args))
+    parser.print_help()
+    return 1
+
+  with open(options.output, 'w') as output_file:
+    output_file.write('#include <stdint.h>\n')
+    output_file.write('extern "C" {\n')
+    size = WriteData(options.dill_file, options.data_symbol, output_file)
+    WriteSize(options.size_symbol, size, output_file)
+    output_file.write("}")
+
+
+if __name__ == '__main__':
+  sys.exit(Main())
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 2bc5b48..f3eeafe 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -314,6 +314,7 @@
   V(Internal_makeListFixedLength, 1)                                           \
   V(Internal_makeFixedListUnmodifiable, 1)                                     \
   V(Internal_inquireIs64Bit, 0)                                                \
+  V(Internal_extractTypeArguments, 2)                                          \
   V(Internal_prependTypeArguments, 3)                                          \
   V(InvocationMirror_decodePositionalCountEntry, 1)                            \
   V(InvocationMirror_decodeTypeArgsLenEntry, 1)                                \
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 13190f9..e2b8ec5 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -251,6 +251,20 @@
   return false;
 }
 
+bool AotCallSpecializer::TryInlineFieldAccess(StaticCallInstr* call) {
+  if (call->function().IsImplicitGetterFunction()) {
+    Field& field =
+        Field::ZoneHandle(call->function().LookupImplicitGetterSetterField());
+    if (should_clone_fields_) {
+      field = field.CloneFromOriginal();
+    }
+    InlineImplicitInstanceGetter(call, field);
+    return true;
+  }
+
+  return false;
+}
+
 Value* AotCallSpecializer::PrepareStaticOpInput(Value* input,
                                                 intptr_t cid,
                                                 Instruction* call) {
@@ -403,7 +417,7 @@
           } else {
             left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
             right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
-            replacement = new BinaryInt64OpInstr(
+            replacement = new (Z) BinaryInt64OpInstr(
                 op_kind, left_value, right_value, Thread::kNoDeoptId,
                 Instruction::kNotSpeculative);
           }
@@ -437,7 +451,7 @@
       break;
   }
 
-  if (replacement != NULL) {
+  if (replacement != NULL && !replacement->ComputeCanDeoptimize()) {
     if (FLAG_trace_strong_mode_types) {
       THR_Print("[Strong mode] Optimization: replacing %s with %s\n",
                 instr->ToCString(), replacement->ToCString());
@@ -825,6 +839,13 @@
   }
 }
 
+void AotCallSpecializer::VisitStaticCall(StaticCallInstr* instr) {
+  if (TryInlineFieldAccess(instr)) {
+    return;
+  }
+  CallSpecializer::VisitStaticCall(instr);
+}
+
 bool AotCallSpecializer::TryExpandCallThroughGetter(const Class& receiver_class,
                                                     InstanceCallInstr* call) {
   // If it's an accessor call it can't be a call through getter.
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.h b/runtime/vm/compiler/aot/aot_call_specializer.h
index aba4766..68705f7 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.h
+++ b/runtime/vm/compiler/aot/aot_call_specializer.h
@@ -26,6 +26,7 @@
   void ReplaceArrayBoundChecks();
 
   virtual void VisitInstanceCall(InstanceCallInstr* instr);
+  virtual void VisitStaticCall(StaticCallInstr* instr);
   virtual void VisitPolymorphicInstanceCall(
       PolymorphicInstanceCallInstr* instr);
 
@@ -44,6 +45,7 @@
   bool TryReplaceWithHaveSameRuntimeType(InstanceCallInstr* call);
 
   bool TryInlineFieldAccess(InstanceCallInstr* call);
+  bool TryInlineFieldAccess(StaticCallInstr* call);
 
   Value* PrepareStaticOpInput(Value* input, intptr_t cid, Instruction* call);
 
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index e7efe16..bdb87e3 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -777,7 +777,7 @@
         Class::Handle(Isolate::Current()->class_table()->At(result_cid));
     DescribeClass(&writer, result_cls);
 
-    writer.PrintProperty("nullable", "false");
+    writer.PrintPropertyBool("nullable", false);
 
     writer.CloseObject();
     writer.CloseArray();
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 0e3de9c..139069e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -2474,7 +2474,7 @@
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
     if (constant_pool_allowed()) {
-      const int32_t offset = Array::element_offset(FindImmediate(value));
+      const int32_t offset = ObjectPool::element_offset(FindImmediate(value));
       LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
     } else {
       LoadPatchableImmediate(rd, value, cond);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 94bd1ae..94e3379 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -984,12 +984,16 @@
 
 // Returns 'true' if regular code generation should be skipped.
 bool FlowGraphCompiler::TryIntrinsify() {
-  // Intrinsification skips arguments checks, therefore disable if in checked
-  // mode or strong mode.
-  if (FLAG_intrinsify && !isolate()->argument_type_checks()) {
+  if (FLAG_intrinsify) {
     const Class& owner = Class::Handle(parsed_function().function().Owner());
     String& name = String::Handle(parsed_function().function().name());
 
+    // Intrinsification skips arguments checks, therefore disable if in checked
+    // mode or strong mode.
+    //
+    // Though for implicit getters, which have only the receiver as parameter,
+    // there are no checks necessary in any case and we can therefore intrinsify
+    // them even in checked mode and strong mode.
     if (parsed_function().function().kind() == RawFunction::kImplicitGetter) {
       // TODO(27590) Store Field object inside RawFunction::data_ if possible.
       name = Field::NameFromGetter(name);
@@ -1004,19 +1008,21 @@
         return !isolate()->use_field_guards();
       }
       return false;
-    }
-    if (parsed_function().function().kind() == RawFunction::kImplicitSetter) {
-      // TODO(27590) Store Field object inside RawFunction::data_ if possible.
-      name = Field::NameFromSetter(name);
-      const Field& field = Field::Handle(owner.LookupFieldAllowPrivate(name));
-      ASSERT(!field.IsNull());
+    } else if (parsed_function().function().kind() ==
+               RawFunction::kImplicitSetter) {
+      if (!isolate()->argument_type_checks()) {
+        // TODO(27590) Store Field object inside RawFunction::data_ if possible.
+        name = Field::NameFromSetter(name);
+        const Field& field = Field::Handle(owner.LookupFieldAllowPrivate(name));
+        ASSERT(!field.IsNull());
 
-      if (field.is_instance() &&
-          (FLAG_precompiled_mode || field.guarded_cid() == kDynamicCid)) {
-        GenerateInlinedSetter(field.Offset());
-        return !isolate()->use_field_guards();
+        if (field.is_instance() &&
+            (FLAG_precompiled_mode || field.guarded_cid() == kDynamicCid)) {
+          GenerateInlinedSetter(field.Offset());
+          return !isolate()->use_field_guards();
+        }
+        return false;
       }
-      return false;
     }
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index b9de1f8..08f36a7 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -188,7 +188,15 @@
   __ Bind(&fall_through);
 }
 
-// Clobbers RCX.
+// Call stub to perform subtype test using a cache (see
+// stub_code_x64.cc:GenerateSubtypeNTestCacheStub)
+//
+// Inputs:
+//   - RAX : instance to test against.
+//   - RDX : instantiator type arguments (if necessary).
+//   - RCX : function type arguments (if necessary).
+//
+// Preserves RAX/RCX/RDX.
 RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
@@ -197,37 +205,27 @@
     Register temp_reg,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
+  ASSERT(temp_reg == kNoRegister);
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(zone(), SubtypeTestCache::New());
-  __ LoadUniqueObject(temp_reg, type_test_cache);
-  __ pushq(temp_reg);      // Subtype test cache.
-  __ pushq(instance_reg);  // Instance.
+  __ LoadUniqueObject(R9, type_test_cache);
   if (test_kind == kTestTypeOneArg) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ PushObject(Object::null_object());  // Unused instantiator type args.
-    __ PushObject(Object::null_object());  // Unused function type args.
     __ Call(*StubCode::Subtype1TestCache_entry());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ PushObject(Object::null_object());  // Unused instantiator type args.
-    __ PushObject(Object::null_object());  // Unused function type args.
     __ Call(*StubCode::Subtype2TestCache_entry());
   } else if (test_kind == kTestTypeFourArgs) {
-    __ pushq(instantiator_type_arguments_reg);
-    __ pushq(function_type_arguments_reg);
+    ASSERT(RDX == instantiator_type_arguments_reg);
+    ASSERT(RCX == function_type_arguments_reg);
     __ Call(*StubCode::Subtype4TestCache_entry());
   } else {
     UNREACHABLE();
   }
-  // Result is in RCX: null -> not found, otherwise Bool::True or Bool::False.
-  ASSERT(instance_reg != RCX);
-  ASSERT(temp_reg != RCX);
-  __ Drop(2);
-  __ popq(instance_reg);  // Restore receiver.
-  __ popq(temp_reg);      // Discard.
-  GenerateBoolToJump(RCX, is_instance_lbl, is_not_instance_lbl);
+  // Result is in R8: null -> not found, otherwise Bool::True or Bool::False.
+  GenerateBoolToJump(R8, is_instance_lbl, is_not_instance_lbl);
   return type_test_cache.raw();
 }
 
@@ -301,7 +299,7 @@
   // Regular subtype test cache involving instance's type arguments.
   const Register kInstantiatorTypeArgumentsReg = kNoRegister;
   const Register kFunctionTypeArgumentsReg = kNoRegister;
-  const Register kTempReg = R10;
+  const Register kTempReg = kNoRegister;
   return GenerateCallSubtypeTestStub(kTestTypeTwoArgs, kInstanceReg,
                                      kInstantiatorTypeArgumentsReg,
                                      kFunctionTypeArgumentsReg, kTempReg,
@@ -320,9 +318,13 @@
 }
 
 // Testing against an instantiated type with no arguments, without
-// SubtypeTestCache.
-// RAX: instance to test against (preserved).
-// Clobbers R10, R13.
+// SubtypeTestCache
+//
+// Inputs:
+//   - RAX : instance to test against
+//
+// Preserves RAX/RCX/RDX.
+//
 // Returns true if there is a fallthrough.
 bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
     TokenPosition token_pos,
@@ -387,9 +389,13 @@
 }
 
 // Uses SubtypeTestCache to store instance class and result.
-// RAX: instance to test.
-// Clobbers R10, R13.
 // Immediate class test already done.
+//
+// Inputs:
+//   RAX : instance to test against.
+//
+// Preserves RAX/RCX/RDX.
+//
 // TODO(srdjan): Implement a quicker subtype check, as type test
 // arrays can grow too high, but they may be useful when optimizing
 // code (type-feedback).
@@ -410,7 +416,7 @@
 
   const Register kInstantiatorTypeArgumentsReg = kNoRegister;
   const Register kFunctionTypeArgumentsReg = kNoRegister;
-  const Register kTempReg = R10;
+  const Register kTempReg = kNoRegister;
   return GenerateCallSubtypeTestStub(kTestTypeOneArg, kInstanceReg,
                                      kInstantiatorTypeArgumentsReg,
                                      kFunctionTypeArgumentsReg, kTempReg,
@@ -418,20 +424,27 @@
 }
 
 // Generates inlined check if 'type' is a type parameter or type itself
-// RAX: instance (preserved).
-// Clobbers RDI, RDX, R10.
+//
+// Inputs:
+//   - RAX : instance to test against.
+//   - RDX : instantiator type arguments (if necessary).
+//   - RCX : function type arguments (if necessary).
+//
+// Preserves RAX/RCX/RDX.
 RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
+  const Register kInstanceReg = RAX;
+  const Register kInstantiatorTypeArgumentsReg = RDX;
+  const Register kFunctionTypeArgumentsReg = RCX;
+  const Register kTempReg = kNoRegister;
   __ Comment("UninstantiatedTypeTest");
   ASSERT(!type.IsInstantiated());
   // Skip check if destination is a dynamic type.
   if (type.IsTypeParameter()) {
     const TypeParameter& type_param = TypeParameter::Cast(type);
-    __ movq(RDX, Address(RSP, 1 * kWordSize));  // Get instantiator type args.
-    __ movq(RCX, Address(RSP, 0 * kWordSize));  // Get function type args.
     // RDX: instantiator type arguments.
     // RCX: function type arguments.
     const Register kTypeArgumentsReg =
@@ -463,13 +476,6 @@
     __ jmp(&fall_through);
 
     __ Bind(&not_smi);
-    // RAX: instance.
-    // RDX: instantiator type arguments.
-    // RCX: function type arguments.
-    const Register kInstanceReg = RAX;
-    const Register kInstantiatorTypeArgumentsReg = RDX;
-    const Register kFunctionTypeArgumentsReg = RCX;
-    const Register kTempReg = R10;
     const SubtypeTestCache& type_test_cache = SubtypeTestCache::ZoneHandle(
         zone(), GenerateCallSubtypeTestStub(
                     kTestTypeFourArgs, kInstanceReg,
@@ -479,16 +485,10 @@
     return type_test_cache.raw();
   }
   if (type.IsType()) {
-    const Register kInstanceReg = RAX;
-    const Register kInstantiatorTypeArgumentsReg = RDX;
-    const Register kFunctionTypeArgumentsReg = RCX;
     __ testq(kInstanceReg, Immediate(kSmiTagMask));  // Is instance Smi?
     __ j(ZERO, is_not_instance_lbl);
-    __ movq(kInstantiatorTypeArgumentsReg, Address(RSP, 1 * kWordSize));
-    __ movq(kFunctionTypeArgumentsReg, Address(RSP, 0 * kWordSize));
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator(s).
-    const Register kTempReg = R10;
     return GenerateCallSubtypeTestStub(kTestTypeFourArgs, kInstanceReg,
                                        kInstantiatorTypeArgumentsReg,
                                        kFunctionTypeArgumentsReg, kTempReg,
@@ -498,13 +498,12 @@
 }
 
 // Inputs:
-// - RAX: instance to test against (preserved).
-// - RDX: optional instantiator type arguments (preserved).
-// - RCX: optional function type arguments (preserved).
-// Clobbers R10, R13.
-// Returns:
-// - preserved instance in RAX, optional instantiator type arguments in RDX, and
-//   optional function type arguments in RCX.
+//   - RAX : instance to test against.
+//   - RDX : instantiator type arguments.
+//   - RCX : function type arguments.
+//
+// Preserves RAX/RCX/RDX.
+//
 // Note that this inlined code must be followed by the runtime_call code, as it
 // may fall through to it. Otherwise, this inline code will jump to the label
 // is_instance or to the label is_not_instance.
@@ -557,9 +556,6 @@
   ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
   ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType());
 
-  __ pushq(RDX);  // Store instantiator type arguments.
-  __ pushq(RCX);  // Store function type arguments.
-
   Label is_instance, is_not_instance;
   // If type is instantiated and non-parameterized, we can inline code
   // checking whether the tested instance is a Smi.
@@ -577,6 +573,7 @@
 
   // Generate inline instanceof test.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
+  // The registers RAX, RCX, RDX are preserved across the call.
   test_cache =
       GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
@@ -584,8 +581,6 @@
   Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
-    __ movq(RDX, Address(RSP, 1 * kWordSize));  // Get instantiator type args.
-    __ movq(RCX, Address(RSP, 0 * kWordSize));  // Get function type args.
     __ PushObject(Object::null_object());       // Make room for the result.
     __ pushq(RAX);                              // Push the instance.
     __ PushObject(type);                        // Push the type.
@@ -607,8 +602,6 @@
   __ Bind(&is_instance);
   __ LoadObject(RAX, Bool::Get(true));
   __ Bind(&done);
-  __ popq(RCX);  // Remove pushed function type arguments.
-  __ popq(RDX);  // Remove pushed instantiator type arguments.
 }
 
 // Optimize assignable type check by adding inlined tests for:
@@ -635,8 +628,6 @@
   ASSERT(dst_type.IsMalformedOrMalbounded() ||
          (!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
           !dst_type.IsVoidType()));
-  __ pushq(RDX);  // Store instantiator type arguments.
-  __ pushq(RCX);  // Store function type arguments.
   // A null object is always assignable and is returned as result.
   Label is_assignable, runtime_call;
   __ CompareObject(RAX, Object::null_object());
@@ -654,19 +645,16 @@
     __ int3();
 
     __ Bind(&is_assignable);  // For a null object.
-    __ popq(RCX);             // Remove pushed function type arguments.
-    __ popq(RDX);             // Remove pushed instantiator type arguments.
     return;
   }
 
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
+  // The registers RAX, RCX, RDX are preserved across the call.
   test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
                                         &runtime_call);
 
   __ Bind(&runtime_call);
-  __ movq(RDX, Address(RSP, 1 * kWordSize));  // Get instantiator type args.
-  __ movq(RCX, Address(RSP, 0 * kWordSize));  // Get function type args.
   __ PushObject(Object::null_object());       // Make room for the result.
   __ pushq(RAX);                              // Push the source object.
   __ PushObject(dst_type);  // Push the type of the destination.
@@ -682,8 +670,6 @@
   __ popq(RAX);
 
   __ Bind(&is_assignable);
-  __ popq(RCX);  // Remove pushed function type arguments.
-  __ popq(RDX);  // Remove pushed instantiator type arguments.
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 09a1915..3f48338 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -880,7 +880,11 @@
   const Register result = locs()->out(0).reg();
 
   // All arguments are already @SP due to preceding PushArgument()s.
-  ASSERT(ArgumentCount() == function().NumParameters());
+  ASSERT(ArgumentCount() == function().NumParameters() +
+                                (function().IsGeneric() &&
+                                 Isolate::Current()->reify_generic_functions())
+             ? 1
+             : 0);
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index fa52fc8..2826114 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -769,7 +769,11 @@
   const Register result = locs()->out(0).reg();
 
   // All arguments are already @SP due to preceding PushArgument()s.
-  ASSERT(ArgumentCount() == function().NumParameters());
+  ASSERT(ArgumentCount() == function().NumParameters() +
+                                (function().IsGeneric() &&
+                                 Isolate::Current()->reify_generic_functions())
+             ? 1
+             : 0);
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index cb56455..da721b8 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -818,7 +818,11 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
 
   // All arguments are already @ESP due to preceding PushArgument()s.
-  ASSERT(ArgumentCount() == function().NumParameters());
+  ASSERT(ArgumentCount() == function().NumParameters() +
+                                (function().IsGeneric() &&
+                                 Isolate::Current()->reify_generic_functions())
+             ? 1
+             : 0);
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 5fcdd8e..31bf621 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -784,7 +784,11 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
 
   // All arguments are already @RSP due to preceding PushArgument()s.
-  ASSERT(ArgumentCount() == function().NumParameters());
+  ASSERT(ArgumentCount() == function().NumParameters() +
+                                (function().IsGeneric() &&
+                                 Isolate::Current()->reify_generic_functions())
+             ? 1
+             : 0);
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 5b2837a..5fa342f 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -1069,6 +1069,8 @@
             // before 'SelectRepresentations' which inserts conversion nodes.
             callee_graph->TryOptimizePatterns();
             DEBUG_ASSERT(callee_graph->VerifyUseLists());
+
+            callee_graph->Canonicalize();
 #else
             UNREACHABLE();
 #endif  // DART_PRECOMPILER
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 89d05fc..3d85d3a 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -878,6 +878,12 @@
 
     AddReceiverCheck(call);
   }
+  InlineImplicitInstanceGetter(call, field);
+  return true;
+}
+
+void CallSpecializer::InlineImplicitInstanceGetter(Definition* call,
+                                                   const Field& field) {
   LoadFieldInstr* load = new (Z) LoadFieldInstr(
       new (Z) Value(call->ArgumentAt(0)), &field,
       AbstractType::ZoneHandle(Z, field.type()), call->token_pos(),
@@ -895,7 +901,6 @@
       it.Current()->SetReachingType(NULL);
     }
   }
-  return true;
 }
 
 bool CallSpecializer::TryInlineInstanceSetter(InstanceCallInstr* instr,
diff --git a/runtime/vm/compiler/call_specializer.h b/runtime/vm/compiler/call_specializer.h
index aa53961..d74784e 100644
--- a/runtime/vm/compiler/call_specializer.h
+++ b/runtime/vm/compiler/call_specializer.h
@@ -34,8 +34,8 @@
                   bool should_clone_fields)
       : FlowGraphVisitor(flow_graph->reverse_postorder()),
         speculative_policy_(speculative_policy),
-        flow_graph_(flow_graph),
-        should_clone_fields_(should_clone_fields) {}
+        should_clone_fields_(should_clone_fields),
+        flow_graph_(flow_graph) {}
 
   virtual ~CallSpecializer() {}
 
@@ -111,7 +111,10 @@
   virtual bool TryOptimizeStaticCallUsingStaticTypes(StaticCallInstr* call) = 0;
 
  protected:
+  void InlineImplicitInstanceGetter(Definition* call, const Field& field);
+
   SpeculativeInliningPolicy* speculative_policy_;
+  const bool should_clone_fields_;
 
  private:
   bool TypeCheckAsClassEquality(const AbstractType& type);
@@ -169,7 +172,6 @@
       const AbstractType& type);
 
   FlowGraph* flow_graph_;
-  const bool should_clone_fields_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index 0b92e55..1e12eda 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -3318,15 +3318,24 @@
 
   const ParsedFunction& pf = owner_->parsed_function();
   const String& name = String::ZoneHandle(Z, function.native_name());
-  ZoneGrowableArray<PushArgumentInstr*>& args =
-      *new (Z) ZoneGrowableArray<PushArgumentInstr*>(function.NumParameters());
+  const intptr_t num_params = function.NumParameters();
+  ZoneGrowableArray<PushArgumentInstr*>* args = NULL;
+  if (function.IsGeneric() && owner()->isolate()->reify_generic_functions()) {
+    args = new (Z) ZoneGrowableArray<PushArgumentInstr*>(1 + num_params);
+    LocalVariable* type_args = pf.RawTypeArgumentsVariable();
+    ASSERT(type_args != NULL);
+    Value* value = Bind(new (Z) LoadLocalInstr(*type_args, node->token_pos()));
+    args->Add(PushArgument(value));
+  } else {
+    args = new (Z) ZoneGrowableArray<PushArgumentInstr*>(num_params);
+  }
   for (intptr_t i = 0; i < function.NumParameters(); ++i) {
     LocalVariable* parameter = pf.RawParameterVariable(i);
     Value* value = Bind(new (Z) LoadLocalInstr(*parameter, node->token_pos()));
-    args.Add(PushArgument(value));
+    args->Add(PushArgument(value));
   }
   NativeCallInstr* native_call = new (Z) NativeCallInstr(
-      &name, &function, FLAG_link_natives_lazily, node->token_pos(), &args);
+      &name, &function, FLAG_link_natives_lazily, node->token_pos(), args);
   ReturnDefinition(native_call);
 }
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 13adddf..9cf6b55 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
@@ -231,6 +232,11 @@
         forwarding_stub_super_target_ = builder_->ReadCanonicalNameReference();
       }
       if (++next_read_ == field) return;
+    case kForwardingStubInterfaceTarget:
+      if (builder_->ReadTag() == kSomething) {
+        builder_->ReadCanonicalNameReference();
+      }
+      if (++next_read_ == field) return;
     case kFunction:
       if (builder_->ReadTag() == kSomething)
         builder_->SkipFunctionNode();  // read function node.
@@ -1422,6 +1428,15 @@
       builder_->SkipConstantReference();
       return;
     }
+    case kInstantiation: {
+      VisitExpression();
+      const intptr_t list_length =
+          builder_->ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitDartType();  // read ith type.
+      }
+      return;
+    }
     default:
       H.ReportError("Unsupported tag at this point: %d.", tag);
       UNREACHABLE();
@@ -3442,7 +3457,8 @@
   }
 }
 
-void StreamingFlowGraphBuilder::ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub) {
+void StreamingFlowGraphBuilder::ReadUntilFunctionNode(
+    ParsedFunction* set_forwarding_stub) {
   const Tag tag = PeekTag();
   if (tag == kProcedure) {
     ProcedureHelper procedure_helper(this);
@@ -3451,8 +3467,8 @@
       // Running a procedure without a function node doesn't make sense.
       UNREACHABLE();
     }
-    if (set_forwarding_stub != NULL && flow_graph_builder_ && procedure_helper.IsForwardingStub() &&
-        !procedure_helper.IsAbstract()) {
+    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_);
@@ -3874,14 +3890,80 @@
   Fragment body(instruction_cursor);
   body += flow_graph_builder_->CheckStackOverflowInPrologue();
 
+  // Forwarding the type parameters is complicated by our approach to
+  // implementing the partial tearoff instantiation.
+  //
+  // When a tearoff is partially applied to a set of type arguments, the type
+  // arguments are saved in the closure's "function_type_arguments" field. The
+  // partial type application operator is guaranteed to provide arguments for
+  // all of a generic tearoff's type parameters, so we will only have to forward
+  // type arguments from the caller or from the closure object. In other words,
+  // if there are type arguments saved on the tearoff, we must throw
+  // NoSuchMethod.
   intptr_t type_args_len = 0;
   if (I->reify_generic_functions() && function.IsGeneric()) {
-    type_args_len = target.NumTypeParameters();
     ASSERT(parsed_function()->function_type_arguments() != NULL);
+    type_args_len = target.NumTypeParameters();
+
+    Fragment copy_type_args;
+
+    LocalVariable* closure =
+        parsed_function()->node_sequence()->scope()->VariableAt(0);
+    copy_type_args += LoadLocal(closure);
+    copy_type_args += LoadField(Closure::function_type_arguments_offset());
+
+    TargetEntryInstr *is_instantiated, *is_not_instantiated;
+    copy_type_args +=
+        BranchIfNull(&is_not_instantiated, &is_instantiated, /*negate=*/false);
+    JoinEntryInstr* join = BuildJoinEntry();
+
+    // We found type arguments saved on the tearoff to be provided to the
+    // function.
+
+    Fragment copy_instantiated_args(is_instantiated);
+
+    copy_instantiated_args +=
+        LoadLocal(parsed_function()->function_type_arguments());
+
+    TargetEntryInstr *no_type_args, *passed_type_args;
+    copy_instantiated_args +=
+        BranchIfNull(&no_type_args, &passed_type_args, /*negate=*/false);
+
+    Fragment use_instantiated_args(no_type_args);
+    use_instantiated_args += LoadLocal(closure);
+    use_instantiated_args +=
+        LoadField(Closure::function_type_arguments_offset());
+    use_instantiated_args += StoreLocal(
+        TokenPosition::kNoSource, parsed_function()->function_type_arguments());
+    use_instantiated_args += Drop();
+    use_instantiated_args += Goto(join);
+
+    Fragment goto_nsm(passed_type_args);
+    goto_nsm += Goto(flow_graph_builder_->BuildThrowNoSuchMethod());
+
+    // The tearoff was not partially applied, so we forward type arguments from
+    // the caller.
+    Fragment forward_caller_args(is_not_instantiated);
+    forward_caller_args += Goto(join);
+
+    body += Fragment(copy_type_args.entry, join);
     body += LoadLocal(parsed_function()->function_type_arguments());
     body += PushArgument();
   }
 
+  FunctionNodeHelper function_node_helper(this);
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+
+  // Tearoffs of static methods needs to perform arguments checks since static
+  // methods they forward to don't do it themselves.
+  if (I->argument_type_checks() && !target.NeedsArgumentTypeChecks(I)) {
+    AlternativeReadingScope _(reader_);
+    body += BuildArgumentTypeChecks();
+  }
+
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+
   // Load all the arguments.
   if (!target.is_static()) {
     // The context has a fixed shape: a single variable which is the
@@ -3891,10 +3973,6 @@
     body += PushArgument();
   }
 
-  FunctionNodeHelper function_node_helper(this);
-  function_node_helper.ReadUntilExcluding(
-      FunctionNodeHelper::kPositionalParameters);
-
   // Positional.
   intptr_t positional_argument_count = ReadListLength();
   for (intptr_t i = 0; i < positional_argument_count; ++i) {
@@ -3936,6 +4014,105 @@
                 flow_graph_builder_->last_used_block_id_, prologue_info);
 }
 
+Fragment StreamingFlowGraphBuilder::BuildArgumentTypeChecks() {
+  FunctionNodeHelper function_node_helper(this);
+  function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
+  const Function& dart_function = parsed_function()->function();
+
+  Fragment body;
+
+  const Function* forwarding_target = NULL;
+  if (parsed_function()->is_forwarding_stub()) {
+    NameIndex target_name = parsed_function()->forwarding_stub_super_target();
+    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
+    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())) {
+      ASSERT(!bound.IsDynamicType());
+      TypeParameter& param = TypeParameter::Handle(Z);
+      if (dart_function.IsFactory()) {
+        param ^= TypeArguments::Handle(
+                     Class::Handle(dart_function.Owner()).type_parameters())
+                     .TypeAt(i);
+      } else {
+        param ^=
+            TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
+      }
+      ASSERT(param.IsFinalized());
+      body += CheckTypeArgumentBound(param, bound, name);
+    }
+  }
+
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+
+  // 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.
+    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.
+  }
+
+  // Named.
+  list_length = ReadListLength();
+  for (intptr_t i = 0; i < list_length; ++i) {
+    // ith variable 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.
+  }
+
+  return body;
+}
+
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) {
   // The prologue builder needs the default parameter values.
   SetupDefaultParameterValues();
@@ -4100,100 +4277,10 @@
 
   // If we run in checked mode or strong mode, we have to check the type of the
   // passed arguments.
-  if (I->argument_type_checks()) {
+  if (dart_function.NeedsArgumentTypeChecks(I)) {
     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
-      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())) {
-        ASSERT(!bound.IsDynamicType());
-        TypeParameter& param = TypeParameter::Handle(Z);
-        if (dart_function.IsFactory()) {
-          param ^= TypeArguments::Handle(
-                       Class::Handle(dart_function.Owner()).type_parameters())
-                       .TypeAt(i);
-        } else {
-          param ^=
-              TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
-        }
-        ASSERT(param.IsFinalized());
-        body += CheckTypeArgumentBound(param, bound, name);
-      }
-    }
-
-    function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
-    function_node_helper.ReadUntilExcluding(
-        FunctionNodeHelper::kPositionalParameters);
-
-    // 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.
-      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.
-    }
-
-    // Named.
-    list_length = ReadListLength();
-    for (intptr_t i = 0; i < list_length; ++i) {
-      // ith variable 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.
-    }
-
-    function_node_helper.SetNext(FunctionNodeHelper::kPositionalParameters);
+    body += BuildArgumentTypeChecks();
   }
 
   function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody);
@@ -4536,6 +4623,8 @@
       return BuildClosureCreation(position);
     case kConstantExpression:
       return BuildConstantExpression(position);
+    case kInstantiation:
+      return BuildPartialTearoffInstantiation(position);
     default:
       H.ReportError("Unsupported tag at this point: %d.", tag);
       UNREACHABLE();
@@ -5037,6 +5126,10 @@
       SkipVariableDeclaration();  // read variable declaration.
       SkipExpression();           // read expression.
       return;
+    case kInstantiation:
+      SkipExpression();       // read expression.
+      SkipListOfDartTypes();  // read type arguments.
+      return;
     case kVectorCreation:
       ReadUInt();  // read value.
       return;
@@ -7875,6 +7968,67 @@
   return Constant(Object::ZoneHandle(Z, H.constants().At(constant_index)));
 }
 
+Fragment StreamingFlowGraphBuilder::BuildPartialTearoffInstantiation(
+    TokenPosition* position) {
+  if (position != NULL) *position = TokenPosition::kNoSource;
+
+  // Create a copy of the closure.
+
+  Fragment instructions = BuildExpression();
+  LocalVariable* original_closure = MakeTemporary();
+
+  instructions += AllocateObject(
+      TokenPosition::kNoSource,
+      Class::ZoneHandle(Z, I->object_store()->closure_class()), 0);
+  LocalVariable* new_closure = MakeTemporary();
+
+  instructions += LoadLocal(new_closure);
+
+  intptr_t num_type_args = ReadListLength();
+  const TypeArguments* type_args = &T.BuildTypeArguments(num_type_args);
+
+  // Even if all dynamic types are passed in, we need to put a vector in here to
+  // distinguish this partially applied tearoff from a normal tearoff. This is
+  // necessary because the tearoff wrapper (BuildGraphOfImplicitClosureFunction)
+  // needs to throw NSM if type arguments are passed to a partially applied
+  // tearoff.
+  if (type_args->IsNull()) {
+    type_args =
+        &TypeArguments::ZoneHandle(Z, TypeArguments::New(num_type_args));
+    for (intptr_t i = 0; i < num_type_args; ++i) {
+      type_args->SetTypeAt(i, Type::ZoneHandle(Z, Type::DynamicType()));
+    }
+  }
+  instructions += TranslateInstantiatedTypeArguments(*type_args);
+  instructions += StoreInstanceField(TokenPosition::kNoSource,
+                                     Closure::function_type_arguments_offset());
+
+  // Copy over the target function.
+  instructions += LoadLocal(new_closure);
+  instructions += LoadLocal(original_closure);
+  instructions += LoadField(Closure::function_offset());
+  instructions +=
+      StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset());
+
+  // Copy over the instantiator type arguments.
+  instructions += LoadLocal(new_closure);
+  instructions += LoadLocal(original_closure);
+  instructions += LoadField(Closure::instantiator_type_arguments_offset());
+  instructions += StoreInstanceField(
+      TokenPosition::kNoSource, Closure::instantiator_type_arguments_offset());
+
+  // Copy over the context.
+  instructions += LoadLocal(new_closure);
+  instructions += LoadLocal(original_closure);
+  instructions += LoadField(Closure::context_offset());
+  instructions +=
+      StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
+
+  instructions += DropTempsPreserveTop(1);  // drop old closure
+
+  return instructions;
+}
+
 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() {
   Fragment instructions = BuildExpression();  // read expression.
   instructions += Drop();
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 96d73be..638f638 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -246,6 +246,7 @@
     kSourceUriIndex,
     kAnnotations,
     kForwardingStubSuperTarget,
+    kForwardingStubInterfaceTarget,
     kFunction,
     kEnd,
   };
@@ -1101,6 +1102,7 @@
                         const Function& interface_target,
                         intptr_t argument_check_bits = 0,
                         intptr_t type_argument_check_bits = 0);
+  Fragment BuildArgumentTypeChecks();
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
   Fragment TranslateInstantiatedTypeArguments(
@@ -1228,6 +1230,7 @@
   Fragment BuildVectorCopy(TokenPosition* position);
   Fragment BuildClosureCreation(TokenPosition* position);
   Fragment BuildConstantExpression(TokenPosition* position);
+  Fragment BuildPartialTearoffInstantiation(TokenPosition* position);
 
   Fragment BuildExpressionStatement();
   Fragment BuildBlock();
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 9e776f9..cc5a679 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1397,7 +1397,12 @@
 Fragment FlowGraphBuilder::NativeCall(const String* name,
                                       const Function* function) {
   InlineBailout("kernel::FlowGraphBuilder::NativeCall");
-  ArgumentArray arguments = GetArguments(function->NumParameters());
+  const intptr_t num_args =
+      function->NumParameters() +
+      ((function->IsGeneric() && Isolate::Current()->reify_generic_functions())
+           ? 1
+           : 0);
+  ArgumentArray arguments = GetArguments(num_args);
   NativeCallInstr* call =
       new (Z) NativeCallInstr(name, function, FLAG_link_natives_lazily,
                               TokenPosition::kNoSource, arguments);
@@ -2015,6 +2020,11 @@
       break;
     default: {
       String& name = String::ZoneHandle(Z, function.native_name());
+      if (function.IsGeneric() &&
+          Isolate::Current()->reify_generic_functions()) {
+        body += LoadLocal(parsed_function_->RawTypeArgumentsVariable());
+        body += PushArgument();
+      }
       for (intptr_t i = 0; i < function.NumParameters(); ++i) {
         body += LoadLocal(parsed_function_->RawParameterVariable(i));
         body += PushArgument();
@@ -2544,6 +2554,18 @@
   return Fragment(instr);
 }
 
+JoinEntryInstr* BaseFlowGraphBuilder::BuildThrowNoSuchMethod() {
+  JoinEntryInstr* nsm = BuildJoinEntry();
+
+  Fragment failing(nsm);
+  const Code& nsm_handler =
+      Code::ZoneHandle(StubCode::CallClosureNoSuchMethod_entry()->code());
+  failing += LoadArgDescriptor();
+  failing += TailCall(nsm_handler);
+
+  return nsm;
+}
+
 RawObject* EvaluateMetadata(const Field& metadata_field) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 10d4733..167e13b 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -598,6 +598,13 @@
 
   intptr_t AllocateTryIndex() { return next_used_try_index_++; }
 
+  Fragment LoadArgDescriptor() {
+    ASSERT(parsed_function_->has_arg_desc_var());
+    return LoadLocal(parsed_function_->arg_desc_var());
+  }
+
+  JoinEntryInstr* BuildThrowNoSuchMethod();
+
  protected:
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
   intptr_t CurrentTryIndex();
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index b467adf..3fa4854 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -78,18 +78,6 @@
   }
 }
 
-JoinEntryInstr* PrologueBuilder::BuildThrowNoSuchMethod() {
-  JoinEntryInstr* nsm = BuildJoinEntry();
-
-  Fragment failing(nsm);
-  const Code& nsm_handler =
-      Code::ZoneHandle(StubCode::CallClosureNoSuchMethod_entry()->code());
-  failing += LoadArgDescriptor();
-  failing += TailCall(nsm_handler);
-
-  return nsm;
-}
-
 Fragment PrologueBuilder::BuildTypeArgumentsLengthCheck(bool strong,
                                                         JoinEntryInstr* nsm,
                                                         bool expect_type_args) {
diff --git a/runtime/vm/compiler/frontend/prologue_builder.h b/runtime/vm/compiler/frontend/prologue_builder.h
index a77767e..5e89638 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.h
+++ b/runtime/vm/compiler/frontend/prologue_builder.h
@@ -50,8 +50,6 @@
   intptr_t last_used_block_id() const { return last_used_block_id_; }
 
  private:
-  JoinEntryInstr* BuildThrowNoSuchMethod();
-
   Fragment BuildTypeArgumentsLengthCheck(bool strong,
                                          JoinEntryInstr* nsm,
                                          bool expect_type_args);
@@ -68,11 +66,6 @@
     return parsed_function_->RawParameterVariable(index);
   }
 
-  Fragment LoadArgDescriptor() {
-    ASSERT(parsed_function_->has_arg_desc_var());
-    return LoadLocal(parsed_function_->arg_desc_var());
-  }
-
   const Instance& DefaultParameterValueAt(intptr_t i) {
     if (parsed_function_->default_parameter_values() != NULL) {
       return parsed_function_->DefaultParameterValueAt(i);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 7043b36..2fde805 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -9079,17 +9079,18 @@
   EXPECT(Dart_IsError(result));
 }
 
-void NotifyIdleNative(Dart_NativeArguments args) {
+void NotifyIdleShortNative(Dart_NativeArguments args) {
   Dart_NotifyIdle(Dart_TimelineGetMicros() + 10 * kMicrosecondsPerMillisecond);
 }
 
-static Dart_NativeFunction NotifyIdle_native_lookup(Dart_Handle name,
-                                                    int argument_count,
-                                                    bool* auto_setup_scope) {
-  return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleNative);
+static Dart_NativeFunction NotifyIdleShort_native_lookup(
+    Dart_Handle name,
+    int argument_count,
+    bool* auto_setup_scope) {
+  return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleShortNative);
 }
 
-TEST_CASE(DartAPI_NotifyIdle) {
+TEST_CASE(DartAPI_NotifyIdleShort) {
   const char* kScriptChars =
       "void notifyIdle() native 'Test_nativeFunc';\n"
       "void main() {\n"
@@ -9104,7 +9105,38 @@
       "  }\n"
       "}\n";
   Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, &NotifyIdle_native_lookup);
+      TestCase::LoadTestScript(kScriptChars, &NotifyIdleShort_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+}
+
+void NotifyIdleLongNative(Dart_NativeArguments args) {
+  Dart_NotifyIdle(Dart_TimelineGetMicros() + 100 * kMicrosecondsPerMillisecond);
+}
+
+static Dart_NativeFunction NotifyIdleLong_native_lookup(
+    Dart_Handle name,
+    int argument_count,
+    bool* auto_setup_scope) {
+  return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleLongNative);
+}
+
+TEST_CASE(DartAPI_NotifyIdleLong) {
+  const char* kScriptChars =
+      "void notifyIdle() native 'Test_nativeFunc';\n"
+      "void main() {\n"
+      "  var v;\n"
+      "  for (var i = 0; i < 100; i++) {\n"
+      "    var t = new List();\n"
+      "    for (var j = 0; j < 10000; j++) {\n"
+      "      t.add(new List(100));\n"
+      "    }\n"
+      "    v = t;\n"
+      "    notifyIdle();\n"
+      "  }\n"
+      "}\n";
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, &NotifyIdleLong_native_lookup);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 }
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 5fab765..6129213 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -112,11 +112,6 @@
   Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
   ScopedIsolateStackLimits stack_limit(thread, current_sp);
-  if (ArgumentsDescriptor(arguments_descriptor).TypeArgsLen() > 0) {
-    const String& message = String::Handle(String::New(
-        "Unsupported invocation of Dart generic function with type arguments"));
-    return ApiError::New(message);
-  }
   if (!function.HasCode()) {
     const Object& result =
         Object::Handle(zone, Compiler::CompileFunction(thread, function));
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 5fe75f3..7299746 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -359,7 +359,10 @@
   // Because we use a deadline instead of a timeout, we automatically take any
   // time used up by a scavenge into account when deciding if we can complete
   // a mark-sweep on time.
-  if (old_space_.ShouldPerformIdleMarkSweep(deadline)) {
+  if (old_space_.ShouldPerformIdleMarkCompact(deadline)) {
+    TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
+    CollectOldSpaceGarbage(thread, kCompaction);
+  } else if (old_space_.ShouldPerformIdleMarkSweep(deadline)) {
     TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
     CollectOldSpaceGarbage(thread, kIdle);
   }
@@ -628,7 +631,7 @@
     case kOldSpace:
       return "old space";
     case kCompaction:
-      return "compaction";
+      return "compact";
     case kFull:
       return "full";
     case kIdle:
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 8ac564f..bfa0a76 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -69,10 +69,6 @@
                              reinterpret_cast<uword>(func));
 }
 
-intptr_t InstructionPattern::OffsetFromPPIndex(intptr_t index) {
-  return Array::element_offset(index);
-}
-
 // Decodes a load sequence ending at 'end' (the last instruction of the load
 // sequence is the instruction before the one at end).  Returns a pointer to
 // the first instruction in the sequence.  Returns the register being loaded
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index f352e88..10c74f5 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -50,8 +50,6 @@
   // instruction load from the pool pointer in PP using the destination
   // register reg as a temporary for the base address.
   static void EncodeLoadWordFromPoolFixed(uword end, int32_t offset);
-
-  static intptr_t OffsetFromPPIndex(intptr_t index);
 };
 
 class CallPattern : public ValueObject {
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 42dffff..b755770 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -788,6 +788,7 @@
 #undef INIT_FROM_FLAG
   api_flags->use_dart_frontend = false;
   api_flags->entry_points = NULL;
+  api_flags->load_vmservice_library = false;
 }
 
 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const {
@@ -798,6 +799,7 @@
 #undef INIT_FROM_FIELD
   api_flags->use_dart_frontend = use_dart_frontend();
   api_flags->entry_points = NULL;
+  api_flags->load_vmservice_library = should_load_vmservice();
 }
 
 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) {
@@ -824,6 +826,7 @@
 #undef SET_FROM_FLAG
 
   set_use_dart_frontend(api_flags.use_dart_frontend);
+  set_should_load_vmservice(api_flags.load_vmservice_library);
 
   // Copy entry points list.
   ASSERT(embedder_entry_points_ == NULL);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 4016ff9..6a569bc 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -680,6 +680,13 @@
     isolate_flags_ = IsServiceIsolateBit::update(value, isolate_flags_);
   }
 
+  bool should_load_vmservice() const {
+    return ShouldLoadVmServiceBit::decode(isolate_flags_);
+  }
+  void set_should_load_vmservice(bool value) {
+    isolate_flags_ = ShouldLoadVmServiceBit::update(value, isolate_flags_);
+  }
+
   Dart_QualifiedFunctionName* embedder_entry_points() const {
     return embedder_entry_points_;
   }
@@ -841,7 +848,8 @@
   V(UseFieldGuards)                                                            \
   V(UseOsr)                                                                    \
   V(Obfuscate)                                                                 \
-  V(CompactionInProgress)
+  V(CompactionInProgress)                                                      \
+  V(ShouldLoadVmService)
 
   // Isolate specific flags.
   enum FlagBits {
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 5ebbd9e..1375924 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -532,9 +532,11 @@
   const String& root_lib_url =
       (root_script_url == NULL) ? old_root_lib_url
                                 : String::Handle(String::New(root_script_url));
+  bool root_lib_modified = false;
 
   // Check to see if the base url of the loaded libraries has moved.
   if (!old_root_lib_url.Equals(root_lib_url)) {
+    root_lib_modified = true;
     const char* old_root_library_url_c = old_root_lib_url.ToCString();
     const char* root_library_url_c = root_lib_url.ToCString();
     const intptr_t common_suffix_length =
@@ -595,7 +597,7 @@
     TIR_Print("---- EXITED TAG HANDLER\n");
   } else {
     // Check to see which libraries have been modified.
-    modified_libs_ = FindModifiedLibraries(force_reload);
+    modified_libs_ = FindModifiedLibraries(force_reload, root_lib_modified);
   }
   if (!modified_libs_->Contains(old_root_lib.index())) {
     ASSERT(modified_libs_->IsEmpty());
@@ -928,7 +930,8 @@
   }
 }
 
-BitVector* IsolateReloadContext::FindModifiedLibraries(bool force_reload) {
+BitVector* IsolateReloadContext::FindModifiedLibraries(bool force_reload,
+                                                       bool root_lib_modified) {
   Thread* thread = Thread::Current();
   int64_t last_reload = I->last_reload_timestamp();
 
@@ -1001,6 +1004,13 @@
 
   BitVector* modified_libs = new (Z) BitVector(Z, num_libs);
 
+  if (root_lib_modified) {
+    // The root library was either moved or replaced. Mark it as modified to
+    // force a reload of the potential root library replacement.
+    lib ^= object_store()->root_library();
+    modified_libs->Add(lib.index());
+  }
+
   for (intptr_t lib_idx = 0; lib_idx < num_libs; lib_idx++) {
     lib ^= libs.At(lib_idx);
     if (lib.is_dart_scheme() || modified_libs->Contains(lib_idx)) {
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index b2180ea..a8e860d 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -231,7 +231,7 @@
   void CheckpointClasses();
 
   bool ScriptModifiedSince(const Script& script, int64_t since);
-  BitVector* FindModifiedLibraries(bool force_reload);
+  BitVector* FindModifiedLibraries(bool force_reload, bool root_lib_modified);
 
   void CheckpointLibraries();
 
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 5d8388c..10c8a24 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -163,7 +163,6 @@
       thread_(Thread::Current()),
       zone_(thread_->zone()),
       isolate_(thread_->isolate()),
-      is_service_isolate_(ServiceIsolate::NameEquals(I->name())),
       patch_classes_(Array::ZoneHandle(zone_)),
       library_kernel_offset_(-1),  // Set to the correct value in LoadLibrary
       correction_offset_(-1),      // Set to the correct value in LoadLibrary
@@ -582,7 +581,7 @@
 
   LibraryHelper library_helper(&builder_);
   library_helper.ReadUntilIncluding(LibraryHelper::kCanonicalName);
-  if (!is_service_isolate_ && !FLAG_precompiled_mode) {
+  if (!FLAG_precompiled_mode && !I->should_load_vmservice()) {
     StringIndex lib_name_index =
         H.CanonicalNameString(library_helper.canonical_name_);
     if (H.StringEquals(lib_name_index, kVMServiceIOLibraryUri)) {
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index d49b2d9..5acf8fd 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -257,7 +257,6 @@
   Thread* thread_;
   Zone* zone_;
   Isolate* isolate_;
-  bool is_service_isolate_;
   Array& patch_classes_;
   ActiveClass active_class_;
   // This is the offset of the current library within
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index a083201..f7151e3 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -77,8 +77,11 @@
 // following signature:
 //   void function_name(NativeArguments arguments);
 // Inside the function, arguments are accessed as follows:
-//   const Instance& arg0 = Instance::CheckedHandle(arguments.ArgAt(0));
-//   const Smi& arg1 = Smi::CheckedHandle(arguments.ArgAt(1));
+//   const Instance& arg0 = Instance::CheckedHandle(arguments.NativeArgAt(0));
+//   const Smi& arg1 = Smi::CheckedHandle(arguments.NativeArgAt(1));
+// If the function is generic, type arguments are accessed as follows:
+//   const TypeArguments& type_args =
+//       TypeArguments::Handle(arguments.NativeTypeArgs());
 // The return value is set as follows:
 //   arguments.SetReturn(result);
 // NOTE: Since we pass 'this' as a pass-by-value argument in the stubs we don't
@@ -87,6 +90,8 @@
 class NativeArguments {
  public:
   Thread* thread() const { return thread_; }
+
+  // Includes type arguments vector.
   int ArgCount() const { return ArgcBits::decode(argc_tag_); }
 
   RawObject* ArgAt(int index) const {
@@ -103,6 +108,7 @@
     return *arg_ptr;
   }
 
+  // Does not include hidden type arguments vector.
   int NativeArgCount() const {
     int function_bits = FunctionBits::decode(argc_tag_);
     return ArgCount() - NumHiddenArgs(function_bits);
@@ -110,9 +116,11 @@
 
   RawObject* NativeArg0() const {
     int function_bits = FunctionBits::decode(argc_tag_);
-    if (function_bits == (kClosureFunctionBit | kInstanceFunctionBit)) {
+    if ((function_bits & (kClosureFunctionBit | kInstanceFunctionBit)) ==
+        (kClosureFunctionBit | kInstanceFunctionBit)) {
       // Retrieve the receiver from the context.
-      const Object& closure = Object::Handle(ArgAt(0));
+      const int closure_index = (function_bits & kGenericFunctionBit) ? 1 : 0;
+      const Object& closure = Object::Handle(ArgAt(closure_index));
       const Context& context =
           Context::Handle(Closure::Cast(closure).context());
       return context.At(0);
@@ -130,6 +138,11 @@
     return ArgAt(actual_index);
   }
 
+  RawTypeArguments* NativeTypeArgs() {
+    ASSERT(ToGenericFunction());
+    return TypeArguments::RawCast(ArgAt(0));
+  }
+
   void SetReturn(const Object& value) const { *retval_ = value.raw(); }
 
   RawObject* ReturnValue() const {
@@ -166,7 +179,7 @@
   static int ComputeArgcTag(const Function& function) {
     ASSERT(function.is_native());
     ASSERT(!function.IsGenerativeConstructor());  // Not supported.
-    int tag = ArgcBits::encode(function.NumParameters());
+    int argc = function.NumParameters();
     int function_bits = 0;
     if (!function.is_static()) {
       function_bits |= kInstanceFunctionBit;
@@ -174,6 +187,11 @@
     if (function.IsClosureFunction()) {
       function_bits |= kClosureFunctionBit;
     }
+    if (function.IsGeneric() && Isolate::Current()->reify_generic_functions()) {
+      function_bits |= kGenericFunctionBit;
+      argc++;
+    }
+    int tag = ArgcBits::encode(argc);
     tag = FunctionBits::update(function_bits, tag);
     return tag;
   }
@@ -182,12 +200,13 @@
   enum {
     kInstanceFunctionBit = 1,
     kClosureFunctionBit = 2,
+    kGenericFunctionBit = 4,
   };
   enum ArgcTagBits {
     kArgcBit = 0,
     kArgcSize = 24,
     kFunctionBit = 24,
-    kFunctionSize = 2,
+    kFunctionSize = 3,
   };
   class ArgcBits : public BitField<intptr_t, int32_t, kArgcBit, kArgcSize> {};
   class FunctionBits
@@ -221,15 +240,24 @@
     return (FunctionBits::decode(argc_tag_) & kClosureFunctionBit);
   }
 
+  // Returns true if the arguments are those of a generic function call.
+  bool ToGenericFunction() const {
+    return (FunctionBits::decode(argc_tag_) & kGenericFunctionBit);
+  }
+
   int NumHiddenArgs(int function_bits) const {
+    int num_hidden_args = 0;
     // For static closure functions, the closure at index 0 is hidden.
     // In the instance closure function case, the receiver is accessed from
     // the context and the closure at index 0 is hidden, so the apparent
     // argument count remains unchanged.
-    if (function_bits == kClosureFunctionBit) {
-      return 1;
+    if ((function_bits & kClosureFunctionBit) == kClosureFunctionBit) {
+      num_hidden_args++;
     }
-    return 0;
+    if ((function_bits & kGenericFunctionBit) == kGenericFunctionBit) {
+      num_hidden_args++;
+    }
+    return num_hidden_args;
   }
 
   Thread* thread_;      // Current thread pointer.
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index c8344d0..3264ed9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5585,22 +5585,24 @@
 }
 
 RawField* Function::LookupImplicitGetterSetterField() const {
-  ASSERT((kind() == RawFunction::kImplicitGetter) ||
-         (kind() == RawFunction::kImplicitSetter) ||
-         (kind() == RawFunction::kImplicitStaticFinalGetter));
-  const Class& owner = Class::Handle(Owner());
-  ASSERT(!owner.IsNull());
-  const Array& fields = Array::Handle(owner.fields());
-  ASSERT(!fields.IsNull());
-  Field& field = Field::Handle();
-  for (intptr_t i = 0; i < fields.Length(); i++) {
-    field ^= fields.At(i);
-    ASSERT(!field.IsNull());
-    if (field.token_pos() == token_pos()) {
-      return field.raw();
-    }
+  // TODO(27590) Store Field object inside RawFunction::data_ if possible.
+  Zone* Z = Thread::Current()->zone();
+  String& field_name = String::Handle(Z, name());
+  switch (kind()) {
+    case RawFunction::kImplicitGetter:
+    case RawFunction::kImplicitStaticFinalGetter:
+      field_name = Field::NameFromGetter(field_name);
+      break;
+    case RawFunction::kImplicitSetter:
+      field_name = Field::NameFromSetter(field_name);
+      break;
+    default:
+      UNREACHABLE();
   }
-  return Field::null();
+  ASSERT(field_name.IsSymbol());
+  const Class& owner = Class::Handle(Z, Owner());
+  ASSERT(!owner.IsNull());
+  return owner.LookupField(field_name);
 }
 
 RawFunction* Function::parent_function() const {
@@ -6531,25 +6533,34 @@
   // Note that parent pointers in newly instantiated signatures still points to
   // the original uninstantiated parent signatures. That is not a problem.
   const Function& parent = Function::Handle(zone, parent_function());
-  ASSERT(!HasInstantiatedSignature(kAny, num_free_fun_type_params));
 
-  // A generic typedef may declare a non-generic function type and get
-  // instantiated with unrelated function type parameters. In that case, its
-  // signature is still uninstantiated, because these type parameters are
-  // free (they are not declared by the typedef).
-  // For that reason, we only adjust num_free_fun_type_params if this
-  // signature is generic or has a generic parent.
-  if (IsGeneric() || HasGenericParent()) {
-    // We only consider the function type parameters declared by the parents
-    // of this signature function as free.
-    const int num_parent_type_params = NumParentTypeParameters();
-    if (num_parent_type_params < num_free_fun_type_params) {
-      num_free_fun_type_params = num_parent_type_params;
+  // See the comment on kCurrentAndEnclosingFree to understand why we don't
+  // adjust 'num_free_fun_type_params' downward in this case.
+  bool delete_type_parameters = false;
+  if (num_free_fun_type_params == kCurrentAndEnclosingFree) {
+    num_free_fun_type_params = kAllFree;
+    delete_type_parameters = true;
+  } else {
+    ASSERT(!HasInstantiatedSignature(kAny, num_free_fun_type_params));
+
+    // A generic typedef may declare a non-generic function type and get
+    // instantiated with unrelated function type parameters. In that case, its
+    // signature is still uninstantiated, because these type parameters are
+    // free (they are not declared by the typedef).
+    // For that reason, we only adjust num_free_fun_type_params if this
+    // signature is generic or has a generic parent.
+    if (IsGeneric() || HasGenericParent()) {
+      // We only consider the function type parameters declared by the parents
+      // of this signature function as free.
+      const int num_parent_type_params = NumParentTypeParameters();
+      if (num_parent_type_params < num_free_fun_type_params) {
+        num_free_fun_type_params = num_parent_type_params;
+      }
     }
   }
 
   Function& sig = Function::Handle(zone, Function::null());
-  if (IsConvertedClosureFunction()) {
+  if (IsConvertedClosureFunction() && !delete_type_parameters) {
     sig = Function::NewConvertedClosureFunction(
         String::Handle(zone, name()), parent, TokenPosition::kNoSource);
     // TODO(30455): Kernel generic methods undone. Handle type parameters
@@ -6560,7 +6571,9 @@
   } else {
     sig = Function::NewSignatureFunction(owner, parent,
                                          TokenPosition::kNoSource, space);
-    sig.set_type_parameters(TypeArguments::Handle(zone, type_parameters()));
+    if (!delete_type_parameters) {
+      sig.set_type_parameters(TypeArguments::Handle(zone, type_parameters()));
+    }
   }
 
   AbstractType& type = AbstractType::Handle(zone, result_type());
@@ -6585,6 +6598,10 @@
     sig.SetParameterTypeAt(i, type);
   }
   sig.set_parameter_names(Array::Handle(zone, parameter_names()));
+
+  if (delete_type_parameters) {
+    ASSERT(sig.HasInstantiatedSignature(kFunctions));
+  }
   return sig.raw();
 }
 
@@ -7474,7 +7491,9 @@
     return genericity == kCurrentClass || NumTypeParameters() == 0;
   }
 
-  if (genericity != kCurrentClass) {
+  if (num_free_fun_type_params == kCurrentAndEnclosingFree) {
+    num_free_fun_type_params = kAllFree;
+  } else if (genericity != kCurrentClass) {
     // A generic typedef may declare a non-generic function type and get
     // instantiated with unrelated function type parameters. In that case, its
     // signature is still uninstantiated, because these type parameters are
@@ -15699,18 +15718,12 @@
   }
   const Class& cls = Class::Handle(clazz());
   if (cls.IsClosureClass()) {
-    const Function& signature =
-        Function::Handle(Closure::Cast(*this).function());
+    Function& signature =
+        Function::Handle(Closure::Cast(*this).GetInstantiatedSignature(
+            Thread::Current()->zone()));
     Type& type = Type::Handle(signature.SignatureType());
-    if (!type.IsInstantiated()) {
-      const TypeArguments& instantiator_type_arguments = TypeArguments::Handle(
-          Closure::Cast(*this).instantiator_type_arguments());
-      const TypeArguments& function_type_arguments =
-          TypeArguments::Handle(Closure::Cast(*this).function_type_arguments());
-      // No bound error possible, since the instance exists.
-      type ^= type.InstantiateFrom(instantiator_type_arguments,
-                                   function_type_arguments, kAllFree, NULL,
-                                   NULL, NULL, space);
+    if (!type.IsFinalized()) {
+      type.SetIsFinalized();
     }
     type ^= type.Canonicalize();
     return type.raw();
@@ -15797,16 +15810,8 @@
     }
     Function& other_signature =
         Function::Handle(zone, Type::Cast(instantiated_other).signature());
-    Function& sig_fun = Function::Handle(zone, Closure::Cast(*this).function());
-    if (!sig_fun.HasInstantiatedSignature()) {
-      const TypeArguments& instantiator_type_arguments = TypeArguments::Handle(
-          zone, Closure::Cast(*this).instantiator_type_arguments());
-      const TypeArguments& function_type_arguments = TypeArguments::Handle(
-          zone, Closure::Cast(*this).function_type_arguments());
-      sig_fun = sig_fun.InstantiateSignatureFrom(instantiator_type_arguments,
-                                                 function_type_arguments,
-                                                 kAllFree, Heap::kOld);
-    }
+    const Function& sig_fun =
+        Function::Handle(Closure::Cast(*this).GetInstantiatedSignature(zone));
     return sig_fun.IsSubtypeOf(other_signature, bound_error, NULL, Heap::kOld);
   }
   TypeArguments& type_arguments = TypeArguments::Handle(zone);
@@ -22435,6 +22440,26 @@
   return reinterpret_cast<RawClosure*>(raw);
 }
 
+RawFunction* Closure::GetInstantiatedSignature(Zone* zone) const {
+  Function& sig_fun = Function::Handle(zone, function());
+  const TypeArguments& fn_type_args =
+      TypeArguments::Handle(zone, function_type_arguments());
+  const TypeArguments& inst_type_args =
+      TypeArguments::Handle(zone, instantiator_type_arguments());
+  // We detect the case of a partial tearoff type application and substitute the
+  // type arguments for the type parameters of the function.
+  intptr_t num_free_params =
+      sig_fun.IsImplicitClosureFunction() && !fn_type_args.IsNull()
+          ? kCurrentAndEnclosingFree
+          : kAllFree;
+  if (num_free_params == kCurrentAndEnclosingFree ||
+      !sig_fun.HasInstantiatedSignature(kAny)) {
+    return sig_fun.InstantiateSignatureFrom(inst_type_args, fn_type_args,
+                                            num_free_params, Heap::kOld);
+  }
+  return sig_fun.raw();
+}
+
 intptr_t StackTrace::Length() const {
   const Array& code_array = Array::Handle(raw_ptr()->code_array_);
   return code_array.Length();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 235b297..32d073e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2053,6 +2053,19 @@
 // Often used constants for number of free function type parameters.
 enum {
   kNoneFree = 0,
+
+  // 'kCurrentAndEnclosingFree' is used when partially applying a signature
+  // function to a set of type arguments. It indicates that the set of type
+  // parameters declared by the current function and enclosing functions should
+  // be considered free, and the current function type parameters should be
+  // substituted as well.
+  //
+  // For instance, if the signature "<T>(T, R) => T" is instantiated with
+  // function type arguments [int, String] and kCurrentAndEnclosingFree is
+  // supplied, the result of the instantiation will be "(String, int) => int".
+  kCurrentAndEnclosingFree = kMaxInt32 - 1,
+
+  // Only parameters declared by enclosing functions are free.
   kAllFree = kMaxInt32,
 };
 
@@ -2375,6 +2388,12 @@
   }
   bool IsInFactoryScope() const;
 
+  bool NeedsArgumentTypeChecks(Isolate* I) const {
+    return (I->strong() &&
+            (!is_static() || kind() == RawFunction::kConstructor)) ||
+           I->type_checks();
+  }
+
   TokenPosition token_pos() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return TokenPosition();
@@ -8646,6 +8665,8 @@
                          const Context& context,
                          Heap::Space space = Heap::kNew);
 
+  RawFunction* GetInstantiatedSignature(Zone* zone) const;
+
  private:
   static RawClosure* New();
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 4fce257..62e072a 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -163,7 +163,7 @@
 // before / mark-sweep time). This is a conservative value observed running
 // Flutter on a Nexus 4. After the first mark-sweep, we instead use a value
 // based on the device's actual speed.
-static const intptr_t kConservativeInitialMarkSweepSpeed = 20;
+static const intptr_t kConservativeInitialMarkSpeed = 20;
 
 PageSpace::PageSpace(Heap* heap,
                      intptr_t max_capacity_in_words,
@@ -192,7 +192,7 @@
                              FLAG_old_gen_growth_time_ratio),
       gc_time_micros_(0),
       collections_(0),
-      mark_sweep_words_per_micro_(kConservativeInitialMarkSweepSpeed) {
+      mark_words_per_micro_(kConservativeInitialMarkSpeed) {
   // We aren't holding the lock but no one can reference us yet.
   UpdateMaxCapacityLocked();
   UpdateMaxUsed();
@@ -839,7 +839,7 @@
 }
 
 bool PageSpace::ShouldPerformIdleMarkSweep(int64_t deadline) {
-  // To make a consistent decision, we should not yeild for a safepoint in the
+  // To make a consistent decision, we should not yield for a safepoint in the
   // middle of deciding whether to perform an idle GC.
   NoSafepointScope no_safepoint;
 
@@ -852,17 +852,56 @@
     if (tasks() > 0) {
       // A concurrent sweeper is running. If we start a mark sweep now
       // we'll have to wait for it, and this wait time is not included in
-      // mark_sweep_words_per_micro_.
+      // mark_words_per_micro_.
       return false;
     }
   }
 
   int64_t estimated_mark_completion =
-      OS::GetCurrentMonotonicMicros() +
-      UsedInWords() / mark_sweep_words_per_micro_;
+      OS::GetCurrentMonotonicMicros() + UsedInWords() / mark_words_per_micro_;
   return estimated_mark_completion <= deadline;
 }
 
+bool PageSpace::ShouldPerformIdleMarkCompact(int64_t deadline) {
+  // To make a consistent decision, we should not yield for a safepoint in the
+  // middle of deciding whether to perform an idle GC.
+  NoSafepointScope no_safepoint;
+
+  // Discount two pages to account for the newest data and code pages, whose
+  // partial use doesn't indicate fragmentation.
+  const intptr_t excess_in_words =
+      usage_.capacity_in_words - usage_.used_in_words - 2 * kPageSizeInWords;
+  const double excess_ratio = static_cast<double>(excess_in_words) /
+                              static_cast<double>(usage_.capacity_in_words);
+  const bool fragmented = excess_ratio > 0.05;
+
+  if (!fragmented &&
+      !page_space_controller_.NeedsIdleGarbageCollection(usage_)) {
+    return false;
+  }
+
+  {
+    MonitorLocker locker(tasks_lock());
+    if (tasks() > 0) {
+      // A concurrent sweeper is running. If we start a mark sweep now
+      // we'll have to wait for it, and this wait time is not included in
+      // mark_words_per_micro_.
+      return false;
+    }
+  }
+
+  // Assuming compaction takes as long as marking.
+  intptr_t mark_compact_words_per_micro = mark_words_per_micro_ / 2;
+  if (mark_compact_words_per_micro == 0) {
+    mark_compact_words_per_micro = 1;  // Prevent division by zero.
+  }
+
+  int64_t estimated_mark_compact_completion =
+      OS::GetCurrentMonotonicMicros() +
+      UsedInWords() / mark_compact_words_per_micro;
+  return estimated_mark_compact_completion <= deadline;
+}
+
 void PageSpace::CollectGarbage(bool compact) {
   Thread* thread = Thread::Current();
   Isolate* isolate = heap_->isolate();
@@ -1001,14 +1040,13 @@
     page_space_controller_.EvaluateGarbageCollection(
         usage_before, GetCurrentUsage(), start, end);
 
-    int64_t mark_sweep_micros = end - start;
-    if (mark_sweep_micros == 0) {
-      mark_sweep_micros = 1;
+    int64_t mark_micros = mid3 - start;
+    if (mark_micros == 0) {
+      mark_micros = 1;  // Prevent division by zero.
     }
-    mark_sweep_words_per_micro_ =
-        usage_before.used_in_words / mark_sweep_micros;
-    if (mark_sweep_words_per_micro_ == 0) {
-      mark_sweep_words_per_micro_ = 1;
+    mark_words_per_micro_ = usage_before.used_in_words / mark_micros;
+    if (mark_words_per_micro_ == 0) {
+      mark_words_per_micro_ = 1;  // Prevent division by zero.
     }
 
     heap_->RecordTime(kConcurrentSweep, pre_safe_point - pre_wait_for_sweepers);
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index d7a76a5..e83f354 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -301,6 +301,7 @@
   void WriteProtectCode(bool read_only);
 
   bool ShouldPerformIdleMarkSweep(int64_t deadline);
+  bool ShouldPerformIdleMarkCompact(int64_t deadline);
 
   void AddGCTime(int64_t micros) { gc_time_micros_ += micros; }
 
@@ -442,7 +443,7 @@
 
   int64_t gc_time_micros_;
   intptr_t collections_;
-  intptr_t mark_sweep_words_per_micro_;
+  intptr_t mark_words_per_micro_;
 
   friend class ExclusivePageIterator;
   friend class ExclusiveCodePageIterator;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index fe0b255..e80abb7 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -8359,9 +8359,6 @@
       nesting_level -= 2;
     } else if (ct == Token::kVOID) {
       ConsumeToken();
-      if (!IsFunctionTypeSymbol()) {
-        return false;
-      }
       continue;
     } else if (ct == Token::kIDENT) {
       if (IsFunctionTypeSymbol()) {
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index f918b24..87b3b3c 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -513,7 +513,7 @@
 }
 
 bool Scavenger::ShouldPerformIdleScavenge(int64_t deadline) {
-  // To make a consistent decision, we should not yeild for a safepoint in the
+  // To make a consistent decision, we should not yield for a safepoint in the
   // middle of deciding whether to perform an idle GC.
   NoSafepointScope no_safepoint;
 
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 6776065..876f645 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -1324,7 +1324,6 @@
 
   // Load argument descriptor.
   argdesc_ = arguments_descriptor.raw();
-  ASSERT(ArgumentsDescriptor(arguments_descriptor).TypeArgsLen() == 0);
 
   // Ready to start executing bytecode. Load entry point and corresponding
   // object pool.
@@ -3952,6 +3951,8 @@
     const bool has_dart_caller = (reinterpret_cast<uword>(pc) & 2) == 0;
     const intptr_t argc = has_dart_caller ? Bytecode::DecodeArgc(pc[-1])
                                           : (reinterpret_cast<uword>(pc) >> 2);
+    const bool has_function_type_args =
+        has_dart_caller && SimulatorHelpers::ArgDescTypeArgsLen(argdesc_) > 0;
 
     SP = FrameArguments(FP, 0);
     RawObject** args = SP - argc;
@@ -3961,7 +3962,7 @@
     }
 
     *++SP = null_value;
-    *++SP = args[0];  // Closure object.
+    *++SP = args[has_function_type_args ? 1 : 0];  // Closure object.
     *++SP = argdesc_;
     *++SP = null_value;  // Array of arguments (will be filled).
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 4ded309..9b9ca0b 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -822,9 +822,11 @@
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ ldr(R4, Address(R1, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // No need to check for type args, disallowed by DartEntry::InvokeFunction.
-  // Load number of arguments into R9.
+  // Load number of arguments into R9 and adjust count for type arguments.
+  __ ldr(R3, FieldAddress(R4, ArgumentsDescriptor::type_args_len_offset()));
   __ ldr(R9, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
+  __ cmp(R3, Operand(0));
+  __ AddImmediate(R9, R9, Smi::RawValue(1), NE);  // Include the type arguments.
   __ SmiUntag(R9);
 
   // Compute address of 'arguments array' data area into R2.
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index a071130..e23bb90 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -868,9 +868,12 @@
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ LoadFromOffset(R4, R1, VMHandles::kOffsetOfRawPtrInHandle);
 
-  // No need to check for type args, disallowed by DartEntry::InvokeFunction.
-  // Load number of arguments into S5.
+  // Load number of arguments into R5 and adjust count for type arguments.
   __ LoadFieldFromOffset(R5, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R3, R4, ArgumentsDescriptor::type_args_len_offset());
+  __ AddImmediate(TMP, R5, 1);  // Include the type arguments.
+  __ cmp(R3, Operand(0));
+  __ csinc(R5, R5, TMP, EQ);  // R5 <- (R3 == 0) ? R5 : TMP + 1 (R5 : R5 + 2).
   __ SmiUntag(R5);
 
   // Compute address of 'arguments array' data area into R2.
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 2707fc7..9ef1116 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -739,9 +739,16 @@
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
   __ movl(EDX, Address(EDX, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // No need to check for type args, disallowed by DartEntry::InvokeFunction.
-  // Load number of arguments into EBX.
+  // Load number of arguments into EBX and adjust count for type arguments.
   __ movl(EBX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
+  __ cmpl(FieldAddress(EDX, ArgumentsDescriptor::type_args_len_offset()),
+          Immediate(0));
+  Label args_count_ok;
+  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
+  __ addl(EBX, Immediate(Smi::RawValue(1)));  // Include the type arguments.
+  __ Bind(&args_count_ok);
+  // Save number of arguments as Smi on stack, replacing ArgumentsDesc.
+  __ movl(Address(EBP, kArgumentsDescOffset), EBX);
   __ SmiUntag(EBX);
 
   // Set up arguments for the dart call.
@@ -769,11 +776,8 @@
   __ movl(EAX, Address(EAX, VMHandles::kOffsetOfRawPtrInHandle));
   __ call(FieldAddress(EAX, Code::entry_point_offset()));
 
-  // Reread the arguments descriptor array to obtain the number of passed
-  // arguments.
+  // Read the saved number of passed arguments as Smi.
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
-  __ movl(EDX, Address(EDX, VMHandles::kOffsetOfRawPtrInHandle));
-  __ movl(EDX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
   // Get rid of arguments pushed on the stack.
   __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 0363b27..5183d28 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -756,7 +756,7 @@
   // | saved PC (return to DartEntry::InvokeFunction) |
 
   const intptr_t kInitialOffset = 2;
-  // Save arguments descriptor array.
+  // Save arguments descriptor array, later replaced by Smi argument count.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset)*kWordSize;
   __ pushq(kArgDescReg);
 
@@ -807,9 +807,16 @@
   // Push arguments. At this point we only need to preserve kTargetCodeReg.
   ASSERT(kTargetCodeReg != RDX);
 
-  // No need to check for type args, disallowed by DartEntry::InvokeFunction.
-  // Load number of arguments into RBX.
+  // Load number of arguments into RBX and adjust count for type arguments.
   __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
+  __ cmpq(FieldAddress(R10, ArgumentsDescriptor::type_args_len_offset()),
+          Immediate(0));
+  Label args_count_ok;
+  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
+  __ addq(RBX, Immediate(Smi::RawValue(1)));  // Include the type arguments.
+  __ Bind(&args_count_ok);
+  // Save number of arguments as Smi on stack, replacing saved ArgumentsDesc.
+  __ movq(Address(RBP, kArgumentsDescOffset), RBX);
   __ SmiUntag(RBX);
 
   // Compute address of 'arguments array' data area into RDX.
@@ -835,11 +842,9 @@
   __ movq(kTargetCodeReg, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ call(kTargetCodeReg);  // R10 is the arguments descriptor array.
 
-  // Read the saved arguments descriptor array to obtain the number of passed
-  // arguments.
-  __ movq(kArgDescReg, Address(RBP, kArgumentsDescOffset));
-  __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
-  __ movq(RDX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
+  // Read the saved number of passed arguments as Smi.
+  __ movq(RDX, Address(RBP, kArgumentsDescOffset));
+
   // Get rid of arguments pushed on the stack.
   __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
 
@@ -1702,59 +1707,67 @@
   __ jmp(&done_stepping, Assembler::kNearJump);
 }
 
-// Used to check class and type arguments. Arguments passed on stack:
-// TOS + 0: return address.
-// TOS + 1: function type arguments (only if n == 4, can be raw_null).
-// TOS + 2: instantiator type arguments (only if n == 4, can be raw_null).
-// TOS + 3: instance.
-// TOS + 4: SubtypeTestCache.
-// Result in RCX: null -> not found, otherwise result (true or false).
+// Used to check class and type arguments. Arguments passed in registers:
+//
+// Inputs:
+//   - R9  : RawSubtypeTestCache
+//   - RAX : instance to test against.
+//   - RDX : instantiator type arguments (for n=4).
+//   - RCX : function type arguments (for n=4).
+//
+//   - TOS + 0: return address.
+//
+// Preserves R9/RAX/RCX/RDX.
+//
+// Result in R8: null -> not found, otherwise result (true or false).
 static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
   ASSERT((n == 1) || (n == 2) || (n == 4));
-  const intptr_t kFunctionTypeArgumentsInBytes = 1 * kWordSize;
-  const intptr_t kInstantiatorTypeArgumentsInBytes = 2 * kWordSize;
-  const intptr_t kInstanceOffsetInBytes = 3 * kWordSize;
-  const intptr_t kCacheOffsetInBytes = 4 * kWordSize;
-  __ movq(RAX, Address(RSP, kInstanceOffsetInBytes));
-  __ LoadObject(R9, Object::null_object());
+
+  const Register kCacheReg = R9;
+  const Register kInstanceReg = RAX;
+  const Register kInstantiatorTypeArgumentsReg = RDX;
+  const Register kFunctionTypeArgumentsReg = RCX;
+
+  __ LoadObject(R8, Object::null_object());
   if (n > 1) {
-    __ LoadClass(R10, RAX);
+    __ LoadClass(R10, kInstanceReg);
     // Compute instance type arguments into R13.
     Label has_no_type_arguments;
-    __ movq(R13, R9);
+    __ movq(R13, R8);
     __ movl(RDI,
             FieldAddress(R10,
                          Class::type_arguments_field_offset_in_words_offset()));
     __ cmpl(RDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
-    __ movq(R13, FieldAddress(RAX, RDI, TIMES_8, 0));
+    __ movq(R13, FieldAddress(kInstanceReg, RDI, TIMES_8, 0));
     __ Bind(&has_no_type_arguments);
   }
-  __ LoadClassId(R10, RAX);
+  __ LoadClassId(R10, kInstanceReg);
   // RAX: instance, R10: instance class id.
   // R13: instance type arguments or null, used only if n > 1.
-  __ movq(RDX, Address(RSP, kCacheOffsetInBytes));
-  // RDX: SubtypeTestCache.
-  __ movq(RDX, FieldAddress(RDX, SubtypeTestCache::cache_offset()));
-  __ addq(RDX, Immediate(Array::data_offset() - kHeapObjectTag));
-  // RDX: Entry start.
+  __ movq(RSI, kCacheReg);
+  // RSI: SubtypeTestCache.
+  __ movq(RSI, FieldAddress(RSI, SubtypeTestCache::cache_offset()));
+  __ addq(RSI, Immediate(Array::data_offset() - kHeapObjectTag));
+  // RSI: Entry start.
   // R10: instance class id.
   // R13: instance type arguments (still null if closure).
   Label loop, found, not_found, next_iteration;
   __ SmiTag(R10);
   __ cmpq(R10, Immediate(Smi::RawValue(kClosureCid)));
   __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
-  __ movq(R13, FieldAddress(RAX, Closure::function_type_arguments_offset()));
-  __ cmpq(R13, R9);  // Cache cannot be used for generic closures.
+  __ movq(R13, FieldAddress(kInstanceReg,
+                            Closure::function_type_arguments_offset()));
+  __ cmpq(R13, R8);  // Cache cannot be used for generic closures.
   __ j(NOT_EQUAL, &not_found, Assembler::kNearJump);
-  __ movq(R13,
-          FieldAddress(RAX, Closure::instantiator_type_arguments_offset()));
-  __ movq(R10, FieldAddress(RAX, Closure::function_offset()));
+  __ movq(R13, FieldAddress(kInstanceReg,
+                            Closure::instantiator_type_arguments_offset()));
+  __ movq(R10, FieldAddress(kInstanceReg, Closure::function_offset()));
   // R10: instance class id as Smi or function.
   __ Bind(&loop);
-  __ movq(RDI, Address(RDX, kWordSize *
+  __ movq(RDI, Address(RSI, kWordSize *
                                 SubtypeTestCache::kInstanceClassIdOrFunction));
-  __ cmpq(RDI, R9);
+  __ cmpq(RDI, R8);
   __ j(EQUAL, &not_found, Assembler::kNearJump);
   __ cmpq(RDI, R10);
   if (n == 1) {
@@ -1762,34 +1775,33 @@
   } else {
     __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
     __ movq(RDI,
-            Address(RDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
+            Address(RSI, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
     __ cmpq(RDI, R13);
     if (n == 2) {
       __ j(EQUAL, &found, Assembler::kNearJump);
     } else {
       __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
       __ movq(RDI,
-              Address(RDX, kWordSize *
+              Address(RSI, kWordSize *
                                SubtypeTestCache::kInstantiatorTypeArguments));
-      __ cmpq(RDI, Address(RSP, kInstantiatorTypeArgumentsInBytes));
+      __ cmpq(RDI, kInstantiatorTypeArgumentsReg);
       __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
-      __ movq(RDI, Address(RDX, kWordSize *
+      __ movq(RDI, Address(RSI, kWordSize *
                                     SubtypeTestCache::kFunctionTypeArguments));
-      __ cmpq(RDI, Address(RSP, kFunctionTypeArgumentsInBytes));
+      __ cmpq(RDI, kFunctionTypeArgumentsReg);
       __ j(EQUAL, &found, Assembler::kNearJump);
     }
   }
 
   __ Bind(&next_iteration);
-  __ addq(RDX, Immediate(kWordSize * SubtypeTestCache::kTestEntryLength));
+  __ addq(RSI, Immediate(kWordSize * SubtypeTestCache::kTestEntryLength));
   __ jmp(&loop, Assembler::kNearJump);
   // Fall through to not found.
   __ Bind(&not_found);
-  __ movq(RCX, R9);
   __ ret();
 
   __ Bind(&found);
-  __ movq(RCX, Address(RDX, kWordSize * SubtypeTestCache::kTestResult));
+  __ movq(R8, Address(RSI, kWordSize * SubtypeTestCache::kTestResult));
   __ ret();
 }
 
@@ -1799,7 +1811,8 @@
 // TOS + 2: raw_null.
 // TOS + 3: instance.
 // TOS + 4: SubtypeTestCache.
-// Result in RCX: null -> not found, otherwise result (true or false).
+// Result in R8: null -> not found, otherwise result (true or false).
+// Preserves RCX/RDX.
 void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
   GenerateSubtypeNTestCacheStub(assembler, 1);
 }
@@ -1810,7 +1823,8 @@
 // TOS + 2: raw_null.
 // TOS + 3: instance.
 // TOS + 4: SubtypeTestCache.
-// Result in RCX: null -> not found, otherwise result (true or false).
+// Result in R8: null -> not found, otherwise result (true or false).
+// Preserves RCX/RDX.
 void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
   GenerateSubtypeNTestCacheStub(assembler, 2);
 }
@@ -1821,7 +1835,8 @@
 // TOS + 2: instantiator type arguments (can be raw_null).
 // TOS + 3: instance.
 // TOS + 4: SubtypeTestCache.
-// Result in RCX: null -> not found, otherwise result (true or false).
+// Result in R8: null -> not found, otherwise result (true or false).
+// Preserves RCX/RDX.
 void StubCode::GenerateSubtype4TestCacheStub(Assembler* assembler) {
   GenerateSubtypeNTestCacheStub(assembler, 4);
 }
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 665d4bd..41adf01 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -46,7 +46,6 @@
 # ........dartdevk.dart.snapshot
 # ........kernel_summary_worker.dart.snapshot
 # ........pub.dart.snapshot
-# ........utils_wrapper.dart.snapshot
 #.........resources/
 #...........dartdoc/
 #..............packages
@@ -171,8 +170,8 @@
     "../utils/pub",
   ],
   [
-    "utils_wrapper",
-    "../utils/compiler:utils_wrapper",
+    "kernel-service",
+    "../utils/kernel-service",
   ],
 ]
 
@@ -565,9 +564,9 @@
   ]
   gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
   sources = [
-    "$gen_dir/kernel/ddc_sdk.dill",
     # TODO(vsm): Remove post CFE.
     "$gen_dir/ddc_sdk.sum",
+    "$gen_dir/kernel/ddc_sdk.dill",
   ]
   outputs = [
     "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}",
@@ -650,7 +649,8 @@
   deps = [
     "../utils/dartdevc:dartdevc_sdk_kernel_summary",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  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",
@@ -667,7 +667,8 @@
   deps = [
     "../utils/dartdevc:dartdevc_sdk_kernel_summary",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  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",
@@ -684,7 +685,8 @@
   deps = [
     "../utils/dartdevc:dartdevc_sdk_kernel_summary",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  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",
@@ -700,7 +702,8 @@
   deps = [
     "../utils/dartdevc:dartdevc_sdk_kernel_summary",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk_kernel_summary", "target_gen_dir")
+  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",
@@ -719,12 +722,12 @@
   ]
   deps = [
     ":copy_dev_compiler_js_amd",
-    ":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",
     ":copy_dev_compiler_js_common_kernel",
+    ":copy_dev_compiler_js_es6",
     ":copy_dev_compiler_js_es6_kernel",
+    ":copy_dev_compiler_js_legacy",
     ":copy_dev_compiler_js_legacy_kernel",
   ]
 }
diff --git a/sdk/bin/dart2js b/sdk/bin/dart2js
index d2e9833..124d295 100755
--- a/sdk/bin/dart2js
+++ b/sdk/bin/dart2js
@@ -41,6 +41,7 @@
     EXTRA_VM_OPTIONS+=('--checked')
     ;;
 esac
+EXTRA_VM_OPTIONS+=('--no_limit_ints_to_64_bits')
 
 # We allow extra vm options to be passed in through an environment variable.
 if [[ $DART_VM_OPTIONS ]]; then
diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat
index c078660..92058d5 100644
--- a/sdk/bin/dart2js.bat
+++ b/sdk/bin/dart2js.bat
@@ -20,7 +20,7 @@
 set DART=%BIN_DIR%\dart
 
 set EXTRA_OPTIONS=
-set EXTRA_VM_OPTIONS=
+set EXTRA_VM_OPTIONS=--no_limit_ints_to_64_bits
 
 if _%DART2JS_DEVELOPER_MODE%_ == _1_ (
   set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --checked
diff --git a/sdk/bin/dart2js_sdk b/sdk/bin/dart2js_sdk
index 286859a..89155dc 100755
--- a/sdk/bin/dart2js_sdk
+++ b/sdk/bin/dart2js_sdk
@@ -48,6 +48,7 @@
     EXTRA_VM_OPTIONS+=('--checked')
     ;;
 esac
+EXTRA_VM_OPTIONS+=('--no_limit_ints_to_64_bits')
 
 # We allow extra vm options to be passed in through an environment variable.
 if [[ $DART_VM_OPTIONS ]]; then
diff --git a/sdk/bin/dart2js_sdk.bat b/sdk/bin/dart2js_sdk.bat
index 9f01c0f..b581cb3 100755
--- a/sdk/bin/dart2js_sdk.bat
+++ b/sdk/bin/dart2js_sdk.bat
@@ -21,7 +21,7 @@
 set SNAPSHOT=%BIN_DIR%\snapshots\dart2js.dart.snapshot
 
 set EXTRA_OPTIONS=
-set EXTRA_VM_OPTIONS=
+set EXTRA_VM_OPTIONS=--no_limit_ints_to_64_bits
 
 if _%DART2JS_DEVELOPER_MODE%_ == _1_ (
   set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --checked
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index bd015af..bcd1f22 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -34,7 +34,7 @@
 /// means that `FutureOr<Object>` is equivalent to `Object`.
 ///
 /// As a corollary, `FutureOr<Object>` is equivalent to
-/// `FutureOr<FutureOr<Object>>`, `FutureOr<Future<Object>> is equivalent to
+/// `FutureOr<FutureOr<Object>>`, `FutureOr<Future<Object>>` is equivalent to
 /// `Future<Object>`.
 abstract class FutureOr<T> {
   // Private generative constructor, so that it is not subclassable, mixable, or
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index d60f50b..2999bc0 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -32,6 +32,23 @@
   factory Queue.from(Iterable elements) = ListQueue<E>.from;
 
   /**
+   * Adapts [source] to be a `Queue<T>`.
+   *
+   * Any time the queue would produce an element that is not a [T],
+   * the element access will throw.
+   *
+   * Any time a [T] value is attempted stored into the adapted queue,
+   * the store will throw unless the value is also an instance of [S].
+   *
+   * If all accessed elements of [source] are actually instances of [T],
+   * and if all elements stored into the returned queue are actually instance
+   * of [S],
+   * then the returned queue can be used as a `Queue<T>`.
+   */
+  static Queue<T> castFrom<S, T>(Queue<S> source) =>
+      new CastQueue<S, T>(source);
+
+  /**
    * Removes and returns the first element of this queue.
    *
    * The queue must not be empty when this method is called.
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index e91b3a8..e140f01 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -118,7 +118,7 @@
    * instances of [T], or if only elements that are actually instances of [T]
    * are accessed, then the resulting iterable can be used as an `Iterable<T>`.
    */
-  static Iterable<T> castTo<S, T>(Iterable<S> source) =>
+  static Iterable<T> castFrom<S, T>(Iterable<S> source) =>
       new CastIterable<S, T>(source);
 
   /**
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index 3f3f381..c64809c 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -169,7 +169,7 @@
    * of [S],
    * then the returned list can be used as a `List<T>`.
    */
-  static List<T> castTo<S, T>(List<S> source) => new CastList<S, T>(source);
+  static List<T> castFrom<S, T>(List<S> source) => new CastList<S, T>(source);
 
   /**
    * Returns the object at the given [index] in the list
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index 316febb..b7929f6 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -156,7 +156,7 @@
    * and if all entries added to the returned map have [K] keys and [V]] values,
    * then the returned map can be used as a `Map<K2, V2>`.
    */
-  static Map<K2, V2> castTo<K, V, K2, V2>(Map<K, V> source) =>
+  static Map<K2, V2> castFrom<K, V, K2, V2>(Map<K, V> source) =>
       new CastMap<K, V, K2, V2>(source);
 
   /**
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index 1813fc7..aec8be6 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -98,7 +98,7 @@
    * of [S],
    * then the returned set can be used as a `Set<T>`.
    */
-  static Set<T> castTo<S, T>(Set<S> source, {Set<R> Function<R>() newSet}) =>
+  static Set<T> castFrom<S, T>(Set<S> source, {Set<R> Function<R>() newSet}) =>
       new CastSet<S, T>(source, newSet);
 
   /**
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index b0fe86d..a59e7ca 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -511,12 +511,21 @@
       return encodeInvalidParamError(message, 'uri');
     }
     var args = message.params['args'];
-    if (args != null && args is! List<String>) {
-      return encodeInvalidParamError(message, 'args');
+    var argsOfString = new List<String>();
+    if (args != null) {
+      if (args is! List) {
+        return encodeInvalidParamError(message, 'args');
+      }
+      for (var arg in args) {
+        if (arg is! String) {
+          return encodeInvalidParamError(message, 'args');
+        }
+        argsOfString.add(arg);
+      }
     }
     var msg = message.params['message'];
 
-    Isolate.spawnUri(Uri.parse(uri), args, msg).then((isolate) {
+    Isolate.spawnUri(Uri.parse(uri), argsOfString, msg).then((isolate) {
       _spawnUriNotify(isolate.controlPort, token);
     }).catchError((e) {
       _spawnUriNotify(e.toString(), token);
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 9c6b0b9..d81a4d4 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -32,12 +32,8 @@
 Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError # Please triage this failure
 Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError # Please triage this failure
 Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError # Please triage this failure
-Language/Expressions/Constants/exception_t02: Crash # Issue 31762
 Language/Expressions/Constants/identifier_denotes_a_constant_t06: MissingCompileTimeError # Issue 26580
 Language/Expressions/Constants/identifier_denotes_a_constant_t07: MissingCompileTimeError # Issue 26580
-Language/Expressions/Constants/literal_number_t01: Crash # Issue 31762
-Language/Expressions/Constants/math_operators_t01: Crash # Issue 31762
-Language/Expressions/Constants/math_operators_t06: Crash # Issue 31762
 Language/Expressions/Function_Invocation/async_cleanup_t01: Skip # https://github.com/dart-lang/sdk/issues/28873
 Language/Expressions/Function_Invocation/async_cleanup_t03: Skip # https://github.com/dart-lang/sdk/issues/28873
 Language/Expressions/Function_Invocation/async_cleanup_t05: Skip # https://github.com/dart-lang/sdk/issues/28873
@@ -54,12 +50,8 @@
 Language/Expressions/Maps/static_type_dynamic_t01: CompileTimeError # Maybe ok. Issue 17207
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
-Language/Expressions/Numbers/static_type_of_int_t01: Crash # Issue 31762
-Language/Expressions/Numbers/syntax_t06: Crash # Issue 31762
 Language/Expressions/Numbers/syntax_t06: Fail # Issue 21098
-Language/Expressions/Numbers/syntax_t09: Crash # Issue 31762
 Language/Expressions/Numbers/syntax_t09: Fail # Issue 21098
-Language/Expressions/Numbers/syntax_t10: Crash # Issue 31762
 Language/Expressions/Object_Identity/Object_Identity/constant_objects_t01: Fail # Issue 11551, also related to issue 563, 18738
 Language/Expressions/Object_Identity/Object_Identity/double_t02: Fail # Issue 11551, also related to issue 563, 18738
 Language/Expressions/Object_Identity/constant_objects_t01: RuntimeError # Please triage this failure
@@ -191,64 +183,19 @@
 LibTest/core/RegExp/Pattern_semantics/splitQueryString_A02_t01: Pass, RuntimeError # https://github.com/dart-lang/sdk/issues/29814
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # Expected to fail because double.INFINITY is int.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # Expected to fail because double.NEGATIVE_INFINITY is int.
-LibTest/core/double/isInfinite_A01_t03: Crash # Issue 31762
-LibTest/core/double/operator_GE_A01_t02: Crash # Issue 31762
-LibTest/core/double/operator_GT_A01_t02: Crash # Issue 31762
-LibTest/core/double/operator_LE_A01_t02: Crash # Issue 31762
-LibTest/core/double/operator_LT_A01_t02: Crash # Issue 31762
-LibTest/core/int/abs_A01_t01: Crash # Issue 31762
-LibTest/core/int/ceilToDouble_A01_t01: Crash # Issue 31762
-LibTest/core/int/ceil_A01_t01: Crash # Issue 31762
-LibTest/core/int/compareTo_A01_t01: Crash # Issue 31762
-LibTest/core/int/floorToDouble_A01_t01: Crash # Issue 31762
-LibTest/core/int/floor_A01_t01: Crash # Issue 31762
-LibTest/core/int/hashCode_A01_t01: Crash # Issue 31762
 LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
 LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
-LibTest/core/int/isEven_A01_t01: Crash # Issue 31762
-LibTest/core/int/isInfinite_A01_t01: Crash # Issue 31762
-LibTest/core/int/isNaN_A01_t01: Crash # Issue 31762
-LibTest/core/int/isNegative_A01_t01: Crash # Issue 31762
 LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
-LibTest/core/int/isOdd_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_AND_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_AND_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_GE_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_GT_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/operator_GT_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_LE_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_LT_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/operator_LT_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_NOT_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_NOT_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
 LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_OR_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_XOR_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/operator_addition_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_division_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_left_shift_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_multiplication_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_remainder_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_remainder_A01_t02: Crash # Issue 31762
 LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
-LibTest/core/int/operator_right_shift_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_subtraction_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_truncating_division_A01_t01: Crash # Issue 31762
-LibTest/core/int/operator_truncating_division_A01_t02: Crash # Issue 31762
-LibTest/core/int/operator_unary_minus_A01_t01: Crash # Issue 31762
-LibTest/core/int/parse_A01_t01: Crash # Issue 31762
-LibTest/core/int/remainder_A01_t01: Crash # Issue 31762
-LibTest/core/int/remainder_A01_t02: Crash # Issue 31762
-LibTest/core/int/roundToDouble_A01_t01: Crash # Issue 31762
-LibTest/core/int/round_A01_t01: Crash # Issue 31762
-LibTest/core/int/toDouble_A01_t01: Crash # Issue 31762
 LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/toInt_A01_t01: Crash # Issue 31762
-LibTest/core/int/truncateToDouble_A01_t01: Crash # Issue 31762
-LibTest/core/int/truncate_A01_t01: Crash # Issue 31762
 LibTest/html/Element/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
 LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/html/IFrameElement/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
@@ -271,8 +218,6 @@
 LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/pow_A04_t01: Fail # co19-roll r587: Please triage this failure
-LibTest/math/pow_A09_t01: Crash # Issue 31762
-LibTest/math/pow_A10_t01: Crash # Issue 31762
 LibTest/math/pow_A14_t01: Fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A16_t01: Fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/ByteData/*Int64*: Fail # co19-roll r569: Please triage this failure
@@ -293,7 +238,6 @@
 LibTest/typed_data/ByteData/getInt16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getInt32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getInt32_A02_t02: Fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/getInt64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getInt8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getInt8_A02_t02: Fail # Issue 12989
@@ -301,7 +245,6 @@
 LibTest/typed_data/ByteData/getUint16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getUint32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getUint32_A02_t02: Fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/getUint64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getUint8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getUint8_A02_t02: Fail # Issue 12989
@@ -313,7 +256,6 @@
 LibTest/typed_data/ByteData/setInt16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setInt32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setInt32_A02_t02: Fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/setInt64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setInt8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setInt8_A02_t02: Fail # Issue 12989
@@ -321,7 +263,6 @@
 LibTest/typed_data/ByteData/setUint16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setUint32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setUint32_A02_t02: Fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/setUint64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setUint8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setUint8_A02_t02: Fail # Issue 12989
@@ -361,10 +302,6 @@
 LibTest/typed_data/Int32List/Int32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int32List/Int32List_A02_t01: Fail # co19-roll r576: Please triage this failure
 LibTest/typed_data/Int64List/*: Fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int64List/Int64List.fromList_A01_t01: Crash # Issue 31762
-LibTest/typed_data/Int64List/Int64List.fromList_A01_t02: Crash # Issue 31762
-LibTest/typed_data/Int64List/Int64List.view_A01_t01: Crash # Issue 31762
-LibTest/typed_data/Int64List/Int64List.view_A01_t02: Crash # Issue 31762
 LibTest/typed_data/Int64List/Int64List_A02_t01: Pass # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int8List/Int8List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int8List/Int8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
@@ -379,10 +316,6 @@
 LibTest/typed_data/Uint32List/Uint32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint32List/Uint32List_A02_t01: Fail # co19-roll r576: Please triage this failure
 LibTest/typed_data/Uint64List/*: Fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: Crash # Issue 31762
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: Crash # Issue 31762
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: Crash # Issue 31762
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: Crash # Issue 31762
 LibTest/typed_data/Uint64List/Uint64List_A02_t01: Pass # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
@@ -1604,8 +1537,8 @@
 LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: Pass, RuntimeError # Issue 29634
 LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/error-reporting_t01: Pass, RuntimeError # Issue 29634
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: Pass, RuntimeError # Issue 29634
 LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: Pass, RuntimeError # Issue 29634
@@ -6919,1323 +6852,6 @@
 WebPlatformTest/webstorage/event_session_storagearea_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
 WebPlatformTest/webstorage/event_session_url_t01: Skip # Times out. Please triage this failure
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-alphaImageData-behavior_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-arc-zero-lineto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-before-css_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-bezier-same-endpoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-composite-canvas_t01: Skip # Times out on Windows 8. Please triage this failure
-LayoutTests/fast/canvas/canvas-composite-stroke-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
-LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-getImageData-largeNonintegralDimensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-invalid-fillstyle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-invalid-strokestyle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-quadratic-same-endpoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImage-with-broken-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImage-with-negative-source-destination_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/drawImageFromRect_withToDataURLAsSource_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/pointInPath_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/button-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Uses FontFace class not defined for this browser
-LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/computed-style-with-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/media-rule-no-whitespace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-expr-error-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-object-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/sibling-selectors-dynamic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-sharing-type-and-readonly_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Attr/direction-attribute-set-and-cleared_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/clone-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/clone-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-doctype2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/comment-not-documentElement_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/type-extension-undo-assert_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/elementFromPoint-scaled-scrolled_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
-LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path-not-in-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/vertical-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/xmlserializer-serialize-to-string-exception_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/insertAdjacentHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/dispatch-event-no-document_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-on-created-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/fire-scroll-event_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/scroll-event-phase_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError # Safarimobilesim does not support WheelEvent
-LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-close_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-parts-slice-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/blob-slice-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/file-reader-abort-in-last-progress_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/file-reader-readystate_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/url-null_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-copy_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-move_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-remove_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/read-directory_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/flexbox/vertical-box-form-controls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/control-detach-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-select-webkit-user-select-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-type-change3_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/interactive-validation-assertion-by-validate-twice_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/interactive-validation-attach-assertion_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/interactive-validation-select-crash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/search-popup-crasher_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/selection-direction_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/media-query-list_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-js-media-except_t03: RuntimeError # Please triage this failure
-LayoutTests/fast/media/mq-parsing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/mediastream/RTCIceCandidate_t01: Skip # Please triage this failure
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: Skip #  Issue 23475
-LayoutTests/fast/mediastream/constructors_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t09: Skip # Times out. Please triage this failure
-LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/widows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/widows_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/preferred-widths_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/parsing/parsing-shape-property-aliases_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/boundingclientrect-subpixel-margin_t01: Skip # Issue 747
-LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/float-list-inside_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/inline-block-with-padding_t01: Skip # Issue 747
-LayoutTests/fast/sub-pixel/layout-boxes-with-zoom_t01: Pass, RuntimeError # Issue 747
-LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/size-of-span-with-different-positions_t01: Skip # Issue 747
-LayoutTests/fast/svg/getbbox_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-length_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/svg/whitespace-number_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/css-table-max-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/css-table-max-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-css-block-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-css-inline-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-html-block-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/min-width-html-inline-table_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/switch-table-layout-dynamic-cells_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/switch-table-layout_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/find-spaces_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/font-ligature-letter-spacing_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/glyph-reordering_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/ipa-tone-letters_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t03: RuntimeError # Please triage this failure
-LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/anchor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/file-http-base_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/file_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/host_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/idna2003_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/idna2008_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/ipv4_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/ipv6_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/port_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/query_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/relative-unix_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/relative-win_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/relative_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/safari-extension_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/segments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/url/standard-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-set-responsetype_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
-LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xpath/xpath-template-element_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/xsl/default-html_t01: RuntimeError # Please triage this failure
-LibTest/async/Future/doWhile_A05_t01: RuntimeError # Please triage this failure
-LibTest/async/Future/forEach_A04_t02: RuntimeError # Please triage this failure
-LibTest/async/Stream/timeout_A01_t01: Pass, RuntimeError # Please triage this failure
-LibTest/async/Stream/timeout_A03_t01: Pass, RuntimeError # Please triage this failure
-LibTest/async/Stream/timeout_A04_t01: Pass, RuntimeError # Please triage this failure
-LibTest/core/List/List_A02_t01: RuntimeError # Please triage this failure
-LibTest/core/List/List_A03_t01: RuntimeError # Please triage this failure
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Issue 22200
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Issue 22200
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Issue 22200
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError # Please triage this failure
-LibTest/core/int/remainder_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/int/remainder_A01_t03: RuntimeError # Please triage this failure
-LibTest/core/int/toRadixString_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # Please triage this failure
-LibTest/html/Document/childNodes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Document/clone_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Document/getElementsByTagName_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/Element/onMouseWheel_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/Element/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/tagName_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/Element/transitionEndEvent_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/responseType_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/mouseWheelEvent_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Safari mobile sim does not support WheelEvent
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # Please triage this failure
-LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Node/nodes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Node/nodes_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Node/parent_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Node/previousNode_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/close_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/document_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/find_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/find_A03_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/find_A06_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/moveBy_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/moveTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/moveTo_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/open_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/postMessage_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/postMessage_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError # Please triage this failure
-WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError # Please triage this failure
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # Please triage this failure
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # Please triage this failure
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # Please triage this failure
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-createElementNS_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # Please triage this failure
-WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-imports/link-import_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-imports/link-import_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # In Safari mobile sim, setting innerHTML on a Frameset element does nothing.
-WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: Skip # Times out. Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
-
 [ $compiler == dart2js && $browser ]
 LayoutTests/fast/css-generated-content/bug91547_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Test reloads itself. Issue 18558.
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 1ba9697..fdc9c63 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -2,15 +2,14 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# dartk: JIT failures
 [ $compiler == dartk ]
+Language/Expressions/Constants/depending_on_itself_t03: Crash
 Language/Expressions/Instance_Creation/Const/canonicalized_t05: RuntimeError
 Language/Expressions/Object_Identity/string_t01: RuntimeError
 Language/Expressions/Strings/adjacent_strings_t02: RuntimeError
 Language/Metadata/before_type_param_t01: RuntimeError
 LibTest/isolate/Isolate/spawnUri_A01_t03: Pass, Timeout
 
-# dartk: precompilation failures
 [ $compiler == dartkp ]
 Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: Pass
 Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
@@ -20,6 +19,7 @@
 Language/Expressions/Constants/depending_on_itself_t01: Crash # New entries after going from kernel-service to batch-mode compilation. Please investigate.
 Language/Expressions/Constants/depending_on_itself_t02: MissingCompileTimeError
 Language/Expressions/Constants/depending_on_itself_t02: Crash # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Expressions/Constants/depending_on_itself_t03: Crash
 Language/Expressions/Null/extend_or_implement_t02: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
 Language/Expressions/Null/extend_or_implement_t03: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
 Language/Expressions/Null/extend_or_implement_t04: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
@@ -38,7 +38,6 @@
 LibTest/core/DateTime/parse_A01_t03: Crash # Please triage.
 LibTest/core/DateTime/parse_A03_t01: Crash # Please triage.
 
-# dartk: JIT failures (debug)
 [ $compiler == dartk && $mode == debug ]
 LibTest/isolate/Isolate/spawnUri_A01_t04: Pass, Slow, Timeout
 
@@ -60,7 +59,6 @@
 Language/Mixins/Mixin_Application/syntax_t16: RuntimeError # Please triaage.
 LibTest/isolate/*/*: Skip
 
-# dartk: precompilation failures (debug)
 [ $compiler == dartkp && $mode == debug ]
 Language/Functions/External_Functions/not_connected_to_a_body_t01: Crash
 
@@ -71,7 +69,6 @@
 Language/Classes/Constructors/Generative_Constructors/execution_t04: Crash
 Language/Classes/Instance_Variables/constant_t01: Crash
 
-# dartk: checked mode failures
 [ $checked && ($compiler == dartk || $compiler == dartkp) ]
 Language/Classes/Constructors/Factories/arguments_type_t01: RuntimeError
 Language/Classes/Constructors/Factories/function_type_t02: Fail # dartbug.com/30527
@@ -127,7 +124,6 @@
 Language/Expressions/Constants/bitwise_operators_t03: Crash
 Language/Expressions/Constants/bitwise_operators_t04: Crash
 Language/Expressions/Constants/bitwise_operators_t06: Crash
-Language/Expressions/Constants/depending_on_itself_t03: Crash
 Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
 Language/Expressions/Constants/exception_t04: MissingCompileTimeError
 Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
@@ -204,6 +200,7 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
 Language/Types/Static_Types/deferred_type_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
+Language/Types/Type_Void/syntax_t01: Pass # Issue 30470
 Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
 Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
 LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # No support for deferred libraries.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 88395aa..0f5f5bf 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -292,6 +292,7 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError # Issue 25748
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
+Language/Types/Type_Void/syntax_t01: MissingCompileTimeError # Issue co19/30264
 LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
 LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Large integers
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Large integers
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index d8143a3..0e8f954 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -5,7 +5,6 @@
 import 'dart:io' hide Link;
 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/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
@@ -28,13 +27,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, computeClosureData, computeKernelClosureData,
-        skipForKernel: skipForKernel,
-        options: [
-          Flags.disableTypeInference,
-          // TODO(redemption): Enable inlining.
-          Flags.disableInlining
-        ],
-        args: args);
+        skipForKernel: skipForKernel, args: args);
   });
 }
 
diff --git a/tests/compiler/dart2js/closure/data/generic_strong.dart b/tests/compiler/dart2js/closure/data/generic_strong.dart
new file mode 100644
index 0000000..1fbe9ca
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/generic_strong.dart
@@ -0,0 +1,140 @@
+// 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 Class1<T> {
+  /*element: Class1.field:hasThis*/
+  var field = /*fields=[T],free=[T],hasThis*/ () => T;
+
+  /*element: Class1.funcField:hasThis*/
+  Function funcField;
+
+  /*element: Class1.:hasThis*/
+  Class1() {
+    field = /*fields=[T],free=[T],hasThis*/ () => T;
+  }
+
+  /*element: Class1.setFunc:hasThis*/
+  Class1.setFunc(this.funcField);
+
+  /*element: Class1.fact:*/
+  factory Class1.fact() => new Class1<T>();
+
+  /*element: Class1.fact2:*/
+  factory Class1.fact2() =>
+      new Class1.setFunc(/*fields=[T],free=[T]*/ () => new Set<T>());
+
+  /*element: Class1.method1:hasThis*/
+  method1() => T;
+
+  /*element: Class1.method2:hasThis*/
+  method2() {
+    return /*fields=[this],free=[this],hasThis*/ () => T;
+  }
+
+  /*element: Class1.method3:hasThis*/
+  method3<S>() => S;
+
+  /*element: Class1.method4:hasThis*/
+  method4<S>() {
+    return /*fields=[S],free=[S],hasThis*/ () => S;
+  }
+
+  /*element: Class1.method5:hasThis*/
+  method5() {
+    /*hasThis*/ local<S>() {
+      return /*fields=[S],free=[S],hasThis*/ () => S;
+    }
+
+    return local<double>();
+  }
+
+  /*element: Class1.method6:hasThis*/
+  method6<S>() {
+    /*fields=[S],free=[S],hasThis*/ local<U>() {
+      return /*fields=[S,U],free=[S,U],hasThis*/ () => '$S$U';
+    }
+
+    var local2 = /*fields=[S,this],free=[S,this],hasThis*/ (o) {
+      return /*fields=[S,this],free=[S,this],hasThis*/ () => new Map<T, S>();
+    };
+    return local2(local<double>());
+  }
+
+  /*element: Class1.staticMethod1:*/
+  static staticMethod1<S>() => S;
+
+  /*element: Class1.staticMethod2:*/
+  static staticMethod2<S>() {
+    return /*fields=[S],free=[S]*/ () => S;
+  }
+
+  /*element: Class1.staticMethod3:*/
+  static staticMethod3() {
+    local<S>() {
+      return /*fields=[S],free=[S]*/ () => S;
+    }
+
+    return local<double>();
+  }
+
+  /*element: Class1.staticMethod4:*/
+  static staticMethod4<S>() {
+    /*fields=[S],free=[S]*/ local<U>() {
+      return /*fields=[S,U],free=[S,U]*/ () => '$S$U';
+    }
+
+    var local2 = /*fields=[S],free=[S]*/ (o) {
+      return /*fields=[S],free=[S]*/ () => new Set<S>();
+    };
+    return local2(local<double>());
+  }
+}
+
+/*element: topLevelMethod1:*/
+topLevelMethod1<S>() => S;
+
+/*element: topLevelMethod2:*/
+topLevelMethod2<S>() {
+  return /*fields=[S],free=[S]*/ () => S;
+}
+
+/*element: topLevelMethod3:*/
+topLevelMethod3() {
+  local<S>() {
+    return /*fields=[S],free=[S]*/ () => S;
+  }
+
+  return local<double>();
+}
+
+/*element: topLevelMethod4:*/
+topLevelMethod4<S>() {
+  /*fields=[S],free=[S]*/ local<U>() {
+    return /*fields=[S,U],free=[S,U]*/ () => '$S$U';
+  }
+
+  var local2 = /*fields=[S],free=[S]*/ (o) {
+    return /*fields=[S],free=[S]*/ () => new Set<S>();
+  };
+  return local2(local<double>());
+}
+
+/*element: main:*/
+main() {
+  new Class1<int>().method1();
+  new Class1<int>.fact().method2();
+  new Class1<int>.fact2().funcField() is Set;
+  new Class1<int>().method3<double>();
+  new Class1<int>().method4<double>();
+  new Class1<int>().method5();
+  new Class1<int>().method6<double>();
+  Class1.staticMethod1<double>();
+  Class1.staticMethod2<double>();
+  Class1.staticMethod3();
+  Class1.staticMethod4<double>();
+  topLevelMethod1<double>();
+  topLevelMethod2<double>();
+  topLevelMethod3();
+  topLevelMethod4<double>();
+}
diff --git a/tests/compiler/dart2js/inference/list_tracer_length_test.dart b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
similarity index 94%
rename from tests/compiler/dart2js/inference/list_tracer_length_test.dart
rename to tests/compiler/dart2js/codegen/list_tracer_length_test.dart
index 5ad3506..d5e8d72 100644
--- a/tests/compiler/dart2js/inference/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// TODO(johnniwinther): Currently this only works with the mock compiler.
+/// TODO(johnniwinther): Move this to the codegen folder. Currently this only
+/// works with the mock compiler.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
similarity index 95%
rename from tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
rename to tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
index b1d315f..03ae59c 100644
--- a/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// TODO(johnniwinther): Currently this only works with the mock compiler.
+/// TODO(johnniwinther): Move this to the codegen folder. Currently this only
+/// works with the mock compiler.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index 81bc5bc..e755932 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/inference/type_inference8_test.dart b/tests/compiler/dart2js/codegen/type_inference8_test.dart
similarity index 100%
rename from tests/compiler/dart2js/inference/type_inference8_test.dart
rename to tests/compiler/dart2js/codegen/type_inference8_test.dart
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index dcf56c9..f9c5d2d 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -9,17 +9,16 @@
 codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
 codegen/load_elimination_test: Pass, Slow
 codegen/logical_expression_test: Fail # Issue 17027
-codegen/number_output_test: RuntimeError # Issue 31762
 codegen/simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
 deferred_loading/deferred_loading_test: Slow, Pass
 equivalence/id_equivalence_test: Pass, Slow
-inference/inference_test: Slow, Pass
+inference/inference0_test: Slow, Pass
+inference/inference1_test: Slow, Pass
 inference/simple_inferrer_const_closure2_test: Fail # Issue 16507
 inference/simple_inferrer_const_closure_test: Fail # Issue 16507
 inference/simple_inferrer_global_field_closure_test: Fail # Issue 16507
 inference/swarm_test: Slow, Pass
 inlining/inlining_test: Slow, Pass
-js/js_parser_test: RuntimeError # Issue 31762
 kernel/*: Slow, Pass
 kernel/compile_from_dill_fast_startup_test: RuntimeError # Test must be updated to support FE with patching.
 kernel/compile_from_dill_test: RuntimeError # Test must be updated to support FE with patching.
@@ -47,18 +46,13 @@
 serialization/compilation4_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/compilation5_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/compilation_1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
-serialization/equivalence_test: RuntimeError # Issue 31762
-serialization/impact_test: RuntimeError # Issue 31762
 serialization/library_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
-serialization/model0_test: RuntimeError # Issue 31762
 serialization/model1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model3_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model4_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model5_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model_1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/native_data_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
-serialization/reserialization_test: RuntimeError # Issue 31762
-serialization/resolved_ast_test: RuntimeError # Issue 31762
 sourcemaps/source_mapping_invokes_test: Pass, Slow
 sourcemaps/source_mapping_operators_test: Pass, Slow
 sourcemaps/source_mapping_test: Pass, Slow
diff --git a/tests/compiler/dart2js/data/deferred_helper.dart b/tests/compiler/dart2js/deferred/data/deferred_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/data/deferred_helper.dart
rename to tests/compiler/dart2js/deferred/data/deferred_helper.dart
diff --git a/tests/compiler/dart2js/data/deferred_lib.dart b/tests/compiler/dart2js/deferred/data/deferred_lib.dart
similarity index 100%
rename from tests/compiler/dart2js/data/deferred_lib.dart
rename to tests/compiler/dart2js/deferred/data/deferred_lib.dart
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 59b43ee..c4f9e1a 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -18,9 +18,7 @@
 
 import 'package:kernel/ast.dart' as ir;
 
-const List<String> skipForKernel = const <String>[
-  'dont_inline_deferred_constants.dart',
-];
+const List<String> skipForKernel = const <String>[];
 
 ///  Add in options to pass to the compiler like
 /// `Flags.disableTypeInference` or `Flags.disableInlining`
@@ -97,6 +95,7 @@
   if (member is FieldElement && member.isConst) {
     var node = member.initializer;
     var constant = compiler.constants.getConstantValue(member.constant);
+    if (constant.isPrimitive) return;
     _registerValue(
         new NodeId(node.getBeginToken().charOffset, IdKind.node),
         outputUnitString(data.outputUnitForConstant(constant)),
@@ -136,6 +135,7 @@
   if (memberNode is ir.Field && memberNode.isConst) {
     ir.Expression node = memberNode.initializer;
     ConstantValue constant = elementMap.getConstantValue(node);
+    if (constant.isPrimitive) return;
     SourceSpan span = computeSourceSpanFromTreeNode(node);
     if (node is ir.ConstructorInvocation ||
         node is ir.ListLiteral ||
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
index a3a279d..1cb567c9 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
@@ -48,7 +48,7 @@
 /// ---------------------------------------------------------------------------
 
 /*element: C6:OutputUnit(1, {lib2})*/
-const C6 = /*OutputUnit(1, {lib2})*/ "string6";
+const C6 = "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/dont_inline_deferred_constants_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
index 5f3267e..1fefeae 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
@@ -6,18 +6,27 @@
 import "dont_inline_deferred_constants_main.dart" as main;
 
 /*element: C1:OutputUnit(1, {lib1})*/
-const C1 = /*OutputUnit(1, {lib1})*/ "string1";
+const C1 = "string1";
+
+/*element: C1b:OutputUnit(1, {lib1})*/
+const C1b = /*OutputUnit(1, {lib1})*/ const C("string1");
 
 /*element: C2:OutputUnit(1, {lib1})*/
-const C2 = /*OutputUnit(1, {lib1})*/ 1010;
+const C2 = 1010;
+
+/*element: C2b:OutputUnit(1, {lib1})*/
+const C2b = /*OutputUnit(1, {lib1})*/ const C(1010);
 
 class D {
   /*element: D.C3:OutputUnit(1, {lib1})*/
-  static const C3 = /*OutputUnit(1, {lib1})*/ "string2";
+  static const C3 = "string2";
+
+  /*element: D.C3b:OutputUnit(1, {lib1})*/
+  static const C3b = /*OutputUnit(1, {lib1})*/ const C("string2");
 }
 
 /*element: C4:OutputUnit(1, {lib1})*/
-const C4 = /*OutputUnit(main, {})*/ "string4";
+const C4 = "string4";
 
 /*element: C5:OutputUnit(1, {lib1})*/
 const C5 = /*OutputUnit(main, {})*/ const C(1);
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 c53f32a..c1d65c5 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
@@ -6,7 +6,7 @@
 import "dont_inline_deferred_constants_main.dart" as main;
 
 /*element: C4:OutputUnit(3, {lib2})*/
-const C4 = /*OutputUnit(main, {})*/ "string4";
+const C4 = "string4";
 
 /*element: C5:OutputUnit(3, {lib2})*/
 const C5 = /*OutputUnit(main, {})*/ const C(1);
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 4e781f5..a68724a 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
@@ -6,7 +6,7 @@
 import 'dont_inline_deferred_constants_lib2.dart' deferred as lib2;
 
 /*element: c:OutputUnit(main, {})*/
-const c = /*OutputUnit(main, {})*/ "string3";
+const c = "string3";
 
 class C {
   /*element: C.p:OutputUnit(main, {})*/
@@ -26,8 +26,11 @@
       lib1.foo();
       lib2.foo();
       print(lib1.C1);
+      print(lib1.C1b);
       print(lib1.C2);
+      print(lib1.C2b);
       print(lib1.D.C3);
+      print(lib1.D.C3b);
       print(c);
       print(lib1.C4);
       print(lib2.C4);
diff --git a/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
index 76d0448..96717ad 100644
--- a/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
@@ -39,7 +39,7 @@
     tmpDir = directory;
     String newPath = path.join(directory.path, "dart2js_batch2_run.dart");
     File source = new File.fromUri(
-        Platform.script.resolve("../data/dart2js_batch2_run.dart"));
+        Platform.script.resolve("data/dart2js_batch2_run.dart"));
     source.copySync(newPath);
   });
 }
diff --git a/tests/compiler/dart2js/data/dart2js_batch2_run.dart b/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
similarity index 100%
rename from tests/compiler/dart2js/data/dart2js_batch2_run.dart
rename to tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
diff --git a/tests/compiler/dart2js/data/exit_code_helper.dart b/tests/compiler/dart2js/end_to_end/data/exit_code_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/data/exit_code_helper.dart
rename to tests/compiler/dart2js/end_to_end/data/exit_code_helper.dart
diff --git a/tests/compiler/dart2js/end_to_end/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
index 9898b8b..cd70154 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -242,7 +242,7 @@
 
     List<String> args = new List<String>.from(options)
       ..add("--library-root=${Uri.base.resolve('sdk/')}")
-      ..add("tests/compiler/dart2js/data/exit_code_helper.dart");
+      ..add("tests/compiler/dart2js/end_to_end/data/exit_code_helper.dart");
     Future result = entry.internalMain(args);
     return result.catchError((e, s) {
       // Capture crashes.
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 24f265c..2d85a02 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -363,19 +363,33 @@
     bool forUserLibrariesOnly: true,
     Callback setUpFunction,
     ComputeClassDataFunction computeClassDataFromAst,
-    ComputeClassDataFunction computeClassDataFromKernel}) async {
+    ComputeClassDataFunction computeClassDataFromKernel,
+    int shards: 1,
+    int shardIndex: 0}) async {
   args = args.toList();
   bool verbose = args.remove('-v');
+  bool shouldContinue = args.remove('-c');
+  bool continued = false;
 
   var relativeDir = dataDir.uri.path.replaceAll(Uri.base.path, '');
   print('Data dir: ${relativeDir}');
-  await for (FileSystemEntity entity in dataDir.list()) {
+  List<FileSystemEntity> entities = dataDir.listSync();
+  if (shards > 1) {
+    int start = entities.length * shardIndex ~/ shards;
+    int end = entities.length * (shardIndex + 1) ~/ shards;
+    entities = entities.sublist(start, end);
+  }
+  for (FileSystemEntity entity in entities) {
     String name = entity.uri.pathSegments.last;
-    if (args.isNotEmpty && !args.contains(name)) continue;
+    if (args.isNotEmpty && !args.contains(name) && !continued) continue;
+    if (shouldContinue) continued = true;
     List<String> testOptions = options.toList();
     if (name.endsWith('_ea.dart')) {
       testOptions.add(Flags.enableAsserts);
+    } else if (name.endsWith('_strong.dart')) {
+      testOptions.add(Flags.strongMode);
     }
+
     print('----------------------------------------------------------------');
     print('Test: $name');
     // Pretend this is a dart2js_native test to allow use of 'native' keyword
@@ -420,7 +434,7 @@
 
     if (setUpFunction != null) setUpFunction();
 
-    if (skipForAst.contains(name)) {
+    if (skipForAst.contains(name) || testOptions.contains(Flags.strongMode)) {
       print('--skipped for ast-----------------------------------------------');
     } else {
       print('--from ast------------------------------------------------------');
@@ -531,6 +545,12 @@
   if (id is NodeId) {
     return new SourceSpan(mainUri, id.value, id.value + 1);
   } else if (id is ElementId) {
+    String memberName = id.memberName;
+    bool isSetter = false;
+    if (memberName != '[]=' && memberName.endsWith('=')) {
+      isSetter = true;
+      memberName = memberName.substring(0, memberName.length - 1);
+    }
     LibraryEntity library = elementEnvironment.lookupLibrary(mainUri);
     if (id.className != null) {
       ClassEntity cls =
@@ -538,23 +558,22 @@
       if (cls == null) {
         throw new ArgumentError("No class '${id.className}' in $mainUri.");
       }
-      MemberEntity member =
-          elementEnvironment.lookupClassMember(cls, id.memberName);
+      MemberEntity member = elementEnvironment
+          .lookupClassMember(cls, memberName, setter: isSetter);
       if (member == null) {
         ConstructorEntity constructor =
-            elementEnvironment.lookupConstructor(cls, id.memberName);
+            elementEnvironment.lookupConstructor(cls, memberName);
         if (constructor == null) {
-          throw new ArgumentError(
-              "No class member '${id.memberName}' in $cls.");
+          throw new ArgumentError("No class member '${memberName}' in $cls.");
         }
         return constructor;
       }
       return member;
     } else {
-      MemberEntity member =
-          elementEnvironment.lookupLibraryMember(library, id.memberName);
+      MemberEntity member = elementEnvironment
+          .lookupLibraryMember(library, memberName, setter: isSetter);
       if (member == null) {
-        throw new ArgumentError("No member '${id.memberName}' in $mainUri.");
+        throw new ArgumentError("No member '${memberName}' in $mainUri.");
       }
       return member;
     }
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index d37f502..bb72432 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -8,37 +8,40 @@
 import 'package:args/args.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/inferrer/inferrer_engine.dart';
 import 'package:compiler/src/io/source_file.dart';
 import 'package:compiler/src/source_file_provider.dart';
 import '../kernel/test_helpers.dart';
 import 'id_equivalence_helper.dart';
 
-show(List<String> args, ComputeMemberDataFunction computeAstData,
-    ComputeMemberDataFunction computeKernelData) async {
+ArgParser createArgParser() {
   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);
+  return argParser;
+}
+
+show(ArgResults argResults, ComputeMemberDataFunction computeAstData,
+    ComputeMemberDataFunction computeKernelData) async {
   if (argResults.wasParsed('colors')) {
     useColors = argResults['colors'];
   }
   bool verbose = argResults['verbose'];
   bool useKernel = argResults['use-kernel'];
 
-  InferrerEngineImpl.useSorterForTesting = true;
   String file = argResults.rest.first;
   Uri entryPoint = Uri.base.resolve(nativeToUriPath(file));
   List<String> show;
-  if (argResults.rest.length > 1) {
+  if (argResults['all']) {
+    show = null;
+  } else if (argResults.rest.length > 1) {
     show = argResults.rest.skip(1).toList();
   } else {
     show = [entryPoint.pathSegments.last];
   }
 
-  List<String> options = <String>[];
+  List<String> options = <String>[stopAfterTypeInference];
   if (useKernel) {
     options.add(Flags.useKernel);
   }
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index ce8349f..4065293 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -15,13 +15,8 @@
 const String SOURCE = r'''
 import 'package:meta/dart2js.dart';
 
-// TODO(johnniwinther): Remove these when the needed RTI is correctly computed
-// for function type variables.
-test(o) => o is double || o is String || o is int;
-
 @noInline
 method1<T>(T t) {
-  test(t);
   print('method1:');
   print('$t is $T = ${t is T}');
   print('"foo" is $T = ${"foo" is T}');
@@ -30,8 +25,6 @@
 
 @noInline
 method2<T, S>(S s, T t) {
-  test(t);
-  test(s);
   print('method2:');
   print('$t is $T = ${t is T}');
   print('$s is $T = ${s is T}');
@@ -42,8 +35,6 @@
 
 @tryInline
 method3<T, S>(T t, S s) {
-  test(t);
-  test(s);
   print('method3:');
   print('$t is $T = ${t is T}');
   print('$s is $T = ${s is T}');
@@ -76,7 +67,6 @@
 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}');
@@ -95,7 +85,6 @@
 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}');
@@ -168,11 +157,13 @@
 
 main(List<String> args) {
   asyncTest(() async {
-    Compiler compiler = await runWithD8(
-        memorySourceFiles: {'main.dart': SOURCE},
-        options: [Flags.useKernel, Flags.strongMode],
-        expectedOutput: OUTPUT,
-        printJs: args.contains('-v'));
+    Compiler compiler = await runWithD8(memorySourceFiles: {
+      'main.dart': SOURCE
+    }, options: [
+      Flags.useKernel,
+      Flags.strongMode,
+      Flags.disableRtiOptimization
+    ], expectedOutput: OUTPUT, printJs: args.contains('-v'));
     ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
 
diff --git a/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
deleted file mode 100644
index 4047641..0000000
--- a/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
+++ /dev/null
@@ -1,297 +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.
-/// Currently it only works with the mock compiler.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/types/masks.dart';
-import 'package:expect/expect.dart';
-
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-void compileAndFind(String code, String className, String memberName,
-    bool disableInlining, check(compiler, element)) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(code, uri, disableInlining: disableInlining);
-  asyncTest(() => compiler.run(uri).then((_) {
-        ClassElement cls = findElement(compiler, className);
-        var member = cls.lookupLocalMember(memberName);
-        return check(compiler, member);
-      }));
-}
-
-const String TEST_1 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() { new A().x("s"); }
-""";
-
-const String TEST_2 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() { new A().x(1); }
-""";
-
-const String TEST_3 = r"""
-  class A {
-    x(p) => x(p - 1);
-  }
-  main() { new A().x(1); }
-""";
-
-const String TEST_4 = r"""
-  class A {
-    x(p) => x(p - 1);
-  }
-  main() { new A().x(1.5); }
-""";
-
-const String TEST_5 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() {
-    new A().x(1);
-    new A().x(1.5);
-  }
-""";
-
-const String TEST_6 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() {
-    new A().x(1.5);
-    new A().x(1);
-  }
-""";
-
-const String TEST_7a = r"""
-  class A {
-    x(p) => x("x");
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-const String TEST_7b = r"""
-  class A {
-    x(p) => x("x");
-  }
-  main() {
-    new A().x({});
-  }
-""";
-
-const String TEST_8 = r"""
-  class A {
-    x(p1, p2, p3) => x(p1, "x", {});
-  }
-  main() {
-    new A().x(1, 2, 3);
-  }
-""";
-
-const String TEST_9 = r"""
-  class A {
-    x(p1, p2) => x(p1, p2);
-  }
-  main() {
-    new A().x(1, 2);
-  }
-""";
-
-const String TEST_10 = r"""
-  class A {
-    x(p1, p2) => x(p1, p2);
-  }
-  void f(p) {
-    p.x("x", "y");
-  }
-  main() {
-    f(null);
-    new A().x(1, 2);
-  }
-""";
-
-const String TEST_11 = r"""
-  class A {
-    x(p1, p2) => x(1, 2);
-  }
-  main() {
-    new A().x("x", "y");
-  }
-""";
-
-const String TEST_12 = r"""
-  class A {
-    x(p1, [p2 = 1]) => 1;
-  }
-  main() {
-    new A().x("x", 1);
-    new A().x("x");
-  }
-""";
-
-const String TEST_13 = r"""
-  class A {
-    x(p) => 1;
-  }
-  f(p) => p.x(2.2);
-  main() {
-    new A().x(1);
-    f(new A());
-  }
-""";
-
-const String TEST_14 = r"""
-  class A {
-    x(p1, [p2 = "s"]) => 1;
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-const String TEST_15 = r"""
-  class A {
-    x(p1, [p2 = true]) => 1;
-  }
-  f(p) => p.a("x");
-  main() {
-    new A().x("x");
-    new A().x("x", false);
-    f(null);
-  }
-""";
-
-const String TEST_16 = r"""
-  class A {
-    x(p1, [p2 = 1, p3 = "s"]) => 1;
-  }
-  main() {
-    new A().x(1);
-    new A().x(1, 2);
-    new A().x(1, 2, "x");
-    new A().x(1, p2: 2);
-    new A().x(1, p3: "x");
-    new A().x(1, p3: "x", p2: 2);
-    new A().x(1, p2: 2, p3: "x");
-  }
-""";
-
-const String TEST_17 = r"""
-  class A {
-    x(p1, [p2 = 1, p3 = "s"]) => 1;
-  }
-  main() {
-    new A().x(1, true, 1.1);
-    new A().x(1, false, 2.2);
-    new A().x(1, p3: 3.3, p2: true);
-    new A().x(1, p2: false, p3: 4.4);
-  }
-""";
-
-const String TEST_18 = r"""
-  class A {
-    x(p1, p2) => x(p1, p2);
-  }
-  class B extends A {
-  }
-  main() {
-    new B().x("a", "b");
-    new A().x(1, 2);
-  }
-""";
-
-typedef List<TypeMask> TestCallback(CommonMasks masks);
-
-void doTest(String test, bool enableInlining, TestCallback f) {
-  compileAndFind(test, 'A', 'x', enableInlining, (compiler, element) {
-    var inferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = inferrer.closedWorld;
-    var expectedTypes = f(closedWorld.commonMasks);
-    var signature = element.functionSignature;
-    int index = 0;
-    signature.forEachParameter((Element element) {
-      Expect.equals(expectedTypes[index++],
-          simplify(inferrer.getTypeOfParameter(element), closedWorld), test);
-    });
-    Expect.equals(index, expectedTypes.length);
-  });
-}
-
-void runTest(String test, TestCallback f) {
-  doTest(test, false, f);
-  doTest(test, true, f);
-}
-
-void test() {
-  runTest(TEST_1, (commonMasks) => [commonMasks.stringType]);
-  runTest(TEST_2, (commonMasks) => [commonMasks.uint31Type]);
-  runTest(TEST_3, (commonMasks) => [commonMasks.intType]);
-  runTest(TEST_4, (commonMasks) => [commonMasks.numType]);
-  runTest(TEST_5, (commonMasks) => [commonMasks.numType]);
-  runTest(TEST_6, (commonMasks) => [commonMasks.numType]);
-  runTest(TEST_7a, (commonMasks) => [commonMasks.interceptorType]);
-  runTest(TEST_7b, (commonMasks) => [commonMasks.dynamicType.nonNullable()]);
-
-  runTest(
-      TEST_8,
-      (commonMasks) => [
-            commonMasks.uint31Type,
-            commonMasks.interceptorType,
-            commonMasks.dynamicType.nonNullable()
-          ]);
-  runTest(TEST_9,
-      (commonMasks) => [commonMasks.uint31Type, commonMasks.uint31Type]);
-  runTest(TEST_10,
-      (commonMasks) => [commonMasks.uint31Type, commonMasks.uint31Type]);
-  runTest(
-      TEST_11,
-      (commonMasks) =>
-          [commonMasks.interceptorType, commonMasks.interceptorType]);
-
-  runTest(TEST_12,
-      (commonMasks) => [commonMasks.stringType, commonMasks.uint31Type]);
-
-  runTest(TEST_13, (commonMasks) => [commonMasks.numType]);
-
-  runTest(TEST_14,
-      (commonMasks) => [commonMasks.uint31Type, commonMasks.stringType]);
-
-  runTest(
-      TEST_15, (commonMasks) => [commonMasks.stringType, commonMasks.boolType]);
-
-  runTest(
-      TEST_16,
-      (commonMasks) => [
-            commonMasks.uint31Type,
-            commonMasks.uint31Type,
-            commonMasks.stringType
-          ]);
-
-  runTest(
-      TEST_17,
-      (commonMasks) => [
-            commonMasks.uint31Type,
-            commonMasks.boolType,
-            commonMasks.doubleType
-          ]);
-
-  runTest(
-      TEST_18,
-      (commonMasks) =>
-          [commonMasks.interceptorType, commonMasks.interceptorType]);
-}
-
-void main() {
-  test();
-}
diff --git a/tests/compiler/dart2js/inference/callers/field_access.dart b/tests/compiler/dart2js/inference/callers/field_access.dart
new file mode 100644
index 0000000..71699e9
--- /dev/null
+++ b/tests/compiler/dart2js/inference/callers/field_access.dart
@@ -0,0 +1,20 @@
+// 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: B.:[main]*/
+class A {
+  /*element: A.field:[main]*/
+  var field;
+}
+
+/*element: A.:[main]*/
+class B {
+  /*element: B.field:[main]*/
+  var field;
+}
+
+main() {
+  new A().field;
+  new B().field;
+}
diff --git a/tests/compiler/dart2js/inference/callers_test.dart b/tests/compiler/dart2js/inference/callers_test.dart
new file mode 100644
index 0000000..b88f07f
--- /dev/null
+++ b/tests/compiler/dart2js/inference/callers_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/inferrer_engine.dart';
+import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
+import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
+import 'package:compiler/src/tree/nodes.dart' as ast;
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  InferrerEngineImpl.retainDataForTesting = true;
+  asyncTest(() async {
+    Directory dataDir =
+        new Directory.fromUri(Platform.script.resolve('callers'));
+    await checkTests(dataDir, computeMemberAstCallers, computeMemberIrCallers,
+        args: args, options: [stopAfterTypeInference]);
+  });
+}
+
+/// Compute callers data for [_member] as a [MemberElement].
+///
+/// Fills [actualMap] with the data.
+void computeMemberAstCallers(
+    Compiler compiler, MemberEntity _member, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  MemberElement member = _member;
+  ResolvedAst resolvedAst = member.resolvedAst;
+  compiler.reporter.withCurrentElement(member.implementation, () {
+    new CallersAstComputer(compiler.reporter, actualMap, resolvedAst,
+            compiler.globalInference.typesInferrerInternal)
+        .run();
+  });
+}
+
+abstract class ComputeValueMixin<T> {
+  TypeGraphInferrer get inferrer;
+
+  String getMemberValue(MemberEntity member) {
+    Iterable<MemberEntity> callers = inferrer.getCallersOfForTesting(member);
+    if (callers != null) {
+      List<String> names = callers.map((MemberEntity member) {
+        StringBuffer sb = new StringBuffer();
+        if (member.enclosingClass != null) {
+          sb.write(member.enclosingClass.name);
+          sb.write('.');
+        }
+        sb.write(member.name);
+        if (member.isSetter) {
+          sb.write('=');
+        }
+        return sb.toString();
+      }).toList()
+        ..sort();
+      return '[${names.join(',')}]';
+    }
+    return null;
+  }
+}
+
+/// AST visitor for computing side effects data for a member.
+class CallersAstComputer extends AstDataExtractor
+    with ComputeValueMixin<ast.Node> {
+  final TypeGraphInferrer inferrer;
+
+  CallersAstComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
+      ResolvedAst resolvedAst, this.inferrer)
+      : super(reporter, actualMap, resolvedAst);
+
+  @override
+  String computeElementValue(Id id, AstElement element) {
+    if (element.isParameter) {
+      return null;
+    } else if (element.isLocal && element.isFunction) {
+      LocalFunctionElement localFunction = element;
+      return getMemberValue(localFunction.callMethod);
+    } else {
+      MemberElement member = element.declaration;
+      return getMemberValue(member);
+    }
+  }
+
+  @override
+  String computeNodeValue(Id id, ast.Node node, [AstElement element]) {
+    if (element != null && element.isLocal && element.isFunction) {
+      return computeElementValue(id, element);
+    }
+    return null;
+  }
+}
+
+/// Compute callers data for [member] from kernel based inference.
+///
+/// Fills [actualMap] with the data.
+void computeMemberIrCallers(
+    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+  MemberDefinition definition = elementMap.getMemberDefinition(member);
+  new CallersIrComputer(
+          compiler.reporter,
+          actualMap,
+          elementMap,
+          compiler.globalInference.typesInferrerInternal,
+          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
+      .run(definition.node);
+}
+
+/// AST visitor for computing side effects data for a member.
+class CallersIrComputer extends IrDataExtractor
+    with ComputeValueMixin<ir.Node> {
+  final TypeGraphInferrer inferrer;
+  final KernelToElementMapForBuilding _elementMap;
+  final ClosureDataLookup<ir.Node> _closureDataLookup;
+
+  CallersIrComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
+      this._elementMap, this.inferrer, this._closureDataLookup)
+      : super(reporter, actualMap);
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/inference/concrete_type_inference_test.dart b/tests/compiler/dart2js/inference/concrete_type_inference_test.dart
deleted file mode 100644
index 4b1b6b5..0000000
--- a/tests/compiler/dart2js/inference/concrete_type_inference_test.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import '../compiler_helper.dart';
-
-Future compileAndFind(String code, String name, check(compiler, element)) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(code, uri);
-  return compiler.run(uri).then((_) {
-    var element = findElement(compiler, name);
-    check(compiler, element);
-  });
-}
-
-void checkPrintType(String expression, checkType(closedWorld, type)) {
-  asyncTest(() => compileAndFind('main() { print($expression); }', 'print',
-          (compiler, printElement) {
-        var parameter = printElement.functionSignature.requiredParameters.first;
-        checkType(compiler.resolutionWorldBuilder.closedWorldForTesting,
-            _typeOf(compiler, parameter));
-      }));
-
-  asyncTest(() =>
-      compileAndFind('main() { var x = print; print($expression); }', 'print',
-          (compiler, printElement) {
-        var parameter = printElement.functionSignature.requiredParameters.first;
-        checkType(compiler.resolutionWorldBuilder.closedWorldForTesting,
-            _typeOf(compiler, parameter));
-      }));
-
-  asyncTest(() => compileAndFind(
-          'main() { print($expression); print($expression); }', 'print',
-          (compiler, printElement) {
-        var parameter = printElement.functionSignature.requiredParameters.first;
-        checkType(compiler.resolutionWorldBuilder.closedWorldForTesting,
-            _typeOf(compiler, parameter));
-      }));
-}
-
-void testBasicTypes() {
-  checkPrintType('true', (closedWorld, type) {
-    if (type.isForwarding) type = type.forwardTo;
-    Expect.identical(closedWorld.commonMasks.boolType, type);
-  });
-  checkPrintType('1.5', (closedWorld, type) {
-    Expect.identical(closedWorld.commonMasks.doubleType, type);
-  });
-  checkPrintType('1', (closedWorld, type) {
-    Expect.identical(closedWorld.commonMasks.uint31Type, type);
-  });
-  checkPrintType('[]', (closedWorld, type) {
-    if (type.isForwarding) type = type.forwardTo;
-    Expect.identical(closedWorld.commonMasks.growableListType, type);
-  });
-  checkPrintType('null', (closedWorld, type) {
-    Expect.identical(closedWorld.commonMasks.nullType, type);
-  });
-  checkPrintType('"foo"', (closedWorld, type) {
-    Expect.isTrue(
-        closedWorld.commonMasks.stringType.containsOnlyString(closedWorld));
-  });
-}
-
-void testOptionalParameters() {
-  compileAndFind('fisk(a, [b, c]) {} main() { fisk(1); }', 'fisk',
-      (compiler, fiskElement) {
-    var firstParameter = fiskElement.functionSignature.requiredParameters[0];
-    var secondParameter = fiskElement.functionSignature.optionalParameters[0];
-    var thirdParameter = fiskElement.functionSignature.optionalParameters[1];
-    var commonMasks =
-        compiler.resolutionWorldBuilder.closedWorldForTesting.commonMasks;
-    Expect.identical(commonMasks.uint31Type, _typeOf(compiler, firstParameter));
-    Expect.identical(commonMasks.nullType, _typeOf(compiler, secondParameter));
-    Expect.identical(commonMasks.nullType, _typeOf(compiler, thirdParameter));
-  });
-}
-
-void main() {
-  testBasicTypes();
-  testOptionalParameters();
-}
-
-_typeOf(compiler, parameter) =>
-    compiler.globalInference.results.resultOfParameter(parameter).type;
diff --git a/tests/compiler/dart2js/inference/data/call_site.dart b/tests/compiler/dart2js/inference/data/call_site.dart
new file mode 100644
index 0000000..e9bcd9f
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/call_site.dart
@@ -0,0 +1,309 @@
+// 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();
+}
+
+/*element: A1.:[exact=A1]*/
+class A1 {
+  /*element: A1.x1:Value([exact=JSString], value: "s")*/
+  x1(
+          /*Value([exact=JSString], value: "s")*/ p) =>
+      p;
+}
+
+/*element: test1:[null]*/
+test1() {
+  new A1(). /*invoke: [exact=A1]*/ x1("s");
+}
+
+/*element: A2.:[exact=A2]*/
+class A2 {
+  /*element: A2.x2:[exact=JSUInt31]*/
+  x2(/*[exact=JSUInt31]*/ p) => p;
+}
+
+/*element: test2:[null]*/
+test2() {
+  new A2(). /*invoke: [exact=A2]*/ x2(1);
+}
+
+/*element: A3.:[exact=A3]*/
+class A3 {
+  /*element: A3.x3:[empty]*/
+  x3(/*[subclass=JSInt]*/ p) => /*invoke: [exact=A3]*/ x3(
+      p /*invoke: [subclass=JSInt]*/ - 1);
+}
+
+/*element: test3:[null]*/
+test3() {
+  new A3(). /*invoke: [exact=A3]*/ x3(1);
+}
+
+/*element: A4.:[exact=A4]*/
+class A4 {
+  /*element: A4.x4:[empty]*/
+  x4(/*[subclass=JSNumber]*/ p) => /*invoke: [exact=A4]*/ x4(
+      p /*invoke: [subclass=JSNumber]*/ - 1);
+}
+
+/*element: test4:[null]*/
+test4() {
+  new A4(). /*invoke: [exact=A4]*/ x4(1.5);
+}
+
+/*element: A5.:[exact=A5]*/
+class A5 {
+  /*element: A5.x5:Union([exact=JSDouble], [exact=JSUInt31])*/
+  x5(
+          /*Union([exact=JSDouble], [exact=JSUInt31])*/ p) =>
+      p;
+}
+
+/*element: test5:[null]*/
+test5() {
+  new A5(). /*invoke: [exact=A5]*/ x5(1);
+  new A5(). /*invoke: [exact=A5]*/ x5(1.5);
+}
+
+/*element: A6.:[exact=A6]*/
+class A6 {
+  /*element: A6.x6:Union([exact=JSDouble], [exact=JSUInt31])*/
+  x6(
+          /*Union([exact=JSDouble], [exact=JSUInt31])*/ p) =>
+      p;
+}
+
+/*element: test6:[null]*/
+test6() {
+  new A6(). /*invoke: [exact=A6]*/ x6(1.5);
+  new A6(). /*invoke: [exact=A6]*/ x6(1);
+}
+
+/*element: A7.:[exact=A7]*/
+class A7 {
+  /*element: A7.x7:[empty]*/
+  x7(
+      /*Union([exact=JSString], [exact=JSUInt31])*/ p) => /*invoke: [exact=A7]*/ x7("x");
+}
+
+/*element: test7:[null]*/
+test7() {
+  new A7(). /*invoke: [exact=A7]*/ x7(1);
+}
+
+/*element: A8.:[exact=A8]*/
+class A8 {
+  /*element: A8.x8:[empty]*/
+  x8(
+          /*Union([exact=JSString], [subclass=JsLinkedHashMap])*/ p) =>
+      /*invoke: [exact=A8]*/ x8("x");
+}
+
+/*element: test8:[null]*/
+test8() {
+  new A8(). /*invoke: [exact=A8]*/ x8({});
+}
+
+/*element: A9.:[exact=A9]*/
+class A9 {
+  /*element: A9.x9:[empty]*/ x9(
+          /*[exact=JSUInt31]*/ p1,
+          /*Union([exact=JSString], [exact=JSUInt31])*/ p2,
+          /*Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/ p3) =>
+      /*invoke: [exact=A9]*/ x9(p1, "x", {});
+}
+
+/*element: test9:[null]*/
+test9() {
+  new A9(). /*invoke: [exact=A9]*/ x9(1, 2, 3);
+}
+
+/*element: A10.:[exact=A10]*/
+class A10 {
+  /*element: A10.x10:[empty]*/ x10(
+      /*[exact=JSUInt31]*/ p1,
+      /*[exact=JSUInt31]*/ p2) => /*invoke: [exact=A10]*/ x10(p1, p2);
+}
+
+/*element: test10:[null]*/
+test10() {
+  new A10(). /*invoke: [exact=A10]*/ x10(1, 2);
+}
+
+/*element: A11.:[exact=A11]*/
+class A11 {
+  /*element: A11.x11:[empty]*/
+  x11(
+      /*[exact=JSUInt31]*/ p1,
+      /*[exact=JSUInt31]*/ p2) => /*invoke: [exact=A11]*/ x11(p1, p2);
+}
+
+/*element: f11:[null]*/
+void f11(/*[null]*/ p) {
+  p. /*invoke: [null]*/ x11("x", "y");
+}
+
+/*element: test11:[null]*/
+test11() {
+  f11(null);
+  new A11(). /*invoke: [exact=A11]*/ x11(1, 2);
+}
+
+/*element: A12.:[exact=A12]*/
+class A12 {
+  /*element: A12.x12:[empty]*/
+  x12(
+          /*Union([exact=JSString], [exact=JSUInt31])*/ p1,
+          /*Union([exact=JSString], [exact=JSUInt31])*/ p2) =>
+      /*invoke: [exact=A12]*/ x12(1, 2);
+}
+
+/*element: test12:[null]*/
+test12() {
+  new A12(). /*invoke: [exact=A12]*/ x12("x", "y");
+}
+
+/*element: A13.:[exact=A13]*/
+class A13 {
+  /*element: A13.x13:[exact=JSUInt31]*/
+  x13(
+          /*Value([exact=JSString], value: "x")*/ p1,
+          [/*[exact=JSUInt31]*/ p2 = 1]) =>
+      1;
+}
+
+/*element: test13:[null]*/
+test13() {
+  new A13(). /*invoke: [exact=A13]*/ x13("x", 1);
+  new A13(). /*invoke: [exact=A13]*/ x13("x");
+}
+
+/*element: A14.:[exact=A14]*/
+class A14 {
+  /*element: A14.x14:[exact=JSUInt31]*/
+  x14(
+          /*Union([exact=JSDouble], [exact=JSUInt31])*/ p) =>
+      1;
+}
+
+/*element: f14:[exact=JSUInt31]*/
+f14(/*[exact=A14]*/ p) => p. /*invoke: [exact=A14]*/ x14(2.2);
+
+/*element: test14:[null]*/
+test14() {
+  new A14(). /*invoke: [exact=A14]*/ x14(1);
+  f14(new A14());
+}
+
+/*element: A15.:[exact=A15]*/
+class A15 {
+  /*element: A15.x15:[exact=JSUInt31]*/
+  x15(/*[exact=JSUInt31]*/ p1,
+          [/*Value([exact=JSString], value: "s")*/ p2 = "s"]) =>
+      1;
+}
+
+/*element: test15:[null]*/
+test15() {
+  new A15(). /*invoke: [exact=A15]*/ x15(1);
+}
+
+/*element: A16.:[exact=A16]*/
+class A16 {
+  /*element: A16.x16:[exact=JSUInt31]*/
+  x16(
+          /*Value([exact=JSString], value: "x")*/ p1,
+          [/*[exact=JSBool]*/ p2 = true]) =>
+      1;
+}
+
+/*element: f16:[empty]*/
+f16(/*[null]*/ p) => p. /*invoke: [null]*/ a("x");
+
+/*element: test16:[null]*/
+test16() {
+  new A16(). /*invoke: [exact=A16]*/ x16("x");
+  new A16(). /*invoke: [exact=A16]*/ x16("x", false);
+  f16(null);
+}
+
+/*element: A17.:[exact=A17]*/
+class A17 {
+  /*element: A17.x17:[exact=JSUInt31]*/
+  x17(/*[exact=JSUInt31]*/ p1,
+          [/*[exact=JSUInt31]*/ p2 = 1, /*[exact=JSString]*/ p3 = "s"]) =>
+      1;
+}
+
+/*element: test17:[null]*/
+test17() {
+  new A17(). /*invoke: [exact=A17]*/ x17(1);
+  new A17(). /*invoke: [exact=A17]*/ x17(1, 2);
+  new A17(). /*invoke: [exact=A17]*/ x17(1, 2, "x");
+  // ignore: undefined_named_parameter
+  new A17(). /*invoke: [exact=A17]*/ x17(1, p2: 2);
+  // ignore: undefined_named_parameter
+  new A17(). /*invoke: [exact=A17]*/ x17(1, p3: "x");
+  // ignore: undefined_named_parameter
+  new A17(). /*invoke: [exact=A17]*/ x17(1, p3: "x", p2: 2);
+  // ignore: undefined_named_parameter
+  new A17(). /*invoke: [exact=A17]*/ x17(1, p2: 2, p3: "x");
+}
+
+/*element: A18.:[exact=A18]*/
+class A18 {
+  /*element: A18.x18:[exact=JSUInt31]*/
+  x18(/*[exact=JSUInt31]*/ p1,
+          [/*[exact=JSBool]*/ p2 = 1, /*[exact=JSDouble]*/ p3 = "s"]) =>
+      1;
+}
+
+/*element: test18:[null]*/
+test18() {
+  new A18(). /*invoke: [exact=A18]*/ x18(1, true, 1.1);
+  new A18(). /*invoke: [exact=A18]*/ x18(1, false, 2.2);
+  // ignore: undefined_named_parameter
+  new A18(). /*invoke: [exact=A18]*/ x18(1, p3: 3.3, p2: true);
+  // ignore: undefined_named_parameter
+  new A18(). /*invoke: [exact=A18]*/ x18(1, p2: false, p3: 4.4);
+}
+
+/*element: A19.:[exact=A19]*/
+class A19 {
+  /*element: A19.x19:[empty]*/
+  x19(
+          /*Union([exact=JSString], [exact=JSUInt31])*/ p1,
+          /*Union([exact=JSString], [exact=JSUInt31])*/ p2) =>
+      /*invoke: [subclass=A19]*/ x19(p1, p2);
+}
+
+/*element: B19.:[exact=B19]*/
+class B19 extends A19 {}
+
+/*element: test19:[null]*/
+test19() {
+  new B19(). /*invoke: [exact=B19]*/ x19("a", "b");
+  new A19(). /*invoke: [exact=A19]*/ x19(1, 2);
+}
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance.dart b/tests/compiler/dart2js/inference/data/closurization_instance.dart
new file mode 100644
index 0000000..13f52ca
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closurization_instance.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: main:[null]*/
+main() {
+  closurizedCallToString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Implicit/explicit .call on instance method tear-off.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class.:[exact=Class]*/
+class Class {
+  /*element: Class.method:[exact=JSUInt31]*/
+  method() => 42;
+}
+
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: closurizedCallToString:[empty]*/
+closurizedCallToString() {
+  var c = new Class();
+  var local = c. /*[exact=Class]*/ method;
+  local. /*invoke: [subclass=Closure]*/ toString();
+  local();
+  local
+      . /*invoke: [empty]*/
+      toString();
+  local.call();
+  return local
+      . /*invoke: [empty]*/
+      toString();
+}
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
new file mode 100644
index 0000000..8dd31e7
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
@@ -0,0 +1,40 @@
+// 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() {
+  closurizedCallToString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Implicit/explicit .call on instance method tear-off with a non synthesized
+// '.call' method in the closed world.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class.:[exact=Class]*/
+class Class {
+  /*element: Class.call:Value([exact=JSBool], value: true)*/
+  call() => true;
+
+  /*element: Class.method:[exact=JSUInt31]*/
+  method() => 42;
+}
+
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [exact=Class].
+/*element: closurizedCallToString:[exact=JSString]*/
+closurizedCallToString() {
+  var c = new Class();
+  c.call(); // Make `Class.call` live.
+  var local = c. /*[exact=Class]*/ method;
+  local. /*invoke: [subtype=Function]*/ toString();
+  local();
+  local
+      . /*invoke: [exact=Class]*/
+      toString();
+  local.call();
+  return local
+      . /*invoke: [exact=Class]*/
+      toString();
+}
diff --git a/tests/compiler/dart2js/inference/data/closurization_local_call.dart b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
new file mode 100644
index 0000000..30e4983
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
@@ -0,0 +1,37 @@
+// 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() {
+  closurizedCallToString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Implicit/explicit .call on a local variable with a non synthesized '.call'
+// method in the closed world.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class.:[exact=Class]*/
+class Class {
+  /*element: Class.call:Value([exact=JSBool], value: true)*/
+  call() => true;
+}
+
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [exact=Class].
+/*element: closurizedCallToString:[exact=JSString]*/
+closurizedCallToString() {
+  var c = new Class();
+  c.call(); // Make `Class.call` live.
+  var local = /*[exact=JSUInt31]*/ () => 42;
+  local. /*invoke: [subtype=Function]*/ toString();
+  local();
+  local
+      . /*invoke: [exact=Class]*/
+      toString();
+  local.call();
+  return local
+      . /*invoke: [exact=Class]*/
+      toString();
+}
diff --git a/tests/compiler/dart2js/inference/data/closurization_static.dart b/tests/compiler/dart2js/inference/data/closurization_static.dart
new file mode 100644
index 0000000..e93e641
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closurization_static.dart
@@ -0,0 +1,31 @@
+// 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() {
+  closurizedCallToString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Implicit/explicit .call on static method tear-off.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method:[exact=JSUInt31]*/
+method() => 42;
+
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: closurizedCallToString:[empty]*/
+closurizedCallToString() {
+  var local = method;
+  local. /*invoke: [subclass=Closure]*/ toString();
+  local();
+  local
+      . /*invoke: [empty]*/
+      toString();
+  local.call();
+  return local
+      . /*invoke: [empty]*/
+      toString();
+}
diff --git a/tests/compiler/dart2js/inference/data/closurization_static_call.dart b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
new file mode 100644
index 0000000..b4d00d8
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
@@ -0,0 +1,40 @@
+// 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() {
+  closurizedCallToString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Implicit/explicit .call on static method tear-off with a non synthesized
+// '.call' method in the closed world.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method:[exact=JSUInt31]*/
+method() => 42;
+
+/*element: Class.:[exact=Class]*/
+class Class {
+  /*element: Class.call:Value([exact=JSBool], value: true)*/
+  call() => true;
+}
+
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [exact=Class].
+/*element: closurizedCallToString:[exact=JSString]*/
+closurizedCallToString() {
+  var c = new Class();
+  c.call(); // Make `Class.call` live.
+  var local = method;
+  local. /*invoke: [subtype=Function]*/ toString();
+  local();
+  local
+      . /*invoke: [exact=Class]*/
+      toString();
+  local.call();
+  return local
+      . /*invoke: [exact=Class]*/
+      toString();
+}
diff --git a/tests/compiler/dart2js/inference/data/dictionary_types.dart b/tests/compiler/dart2js/inference/data/dictionary_types.dart
new file mode 100644
index 0000000..f6f3cc4
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/dictionary_types.dart
@@ -0,0 +1,196 @@
+// 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();
+}
+
+/*element: dictionaryA1:Map([subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+var dictionaryA1 = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
+
+/*element: dictionaryB1:Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+var dictionaryB1 = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
+
+/*element: otherDict1:Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSString]), map: {stringTwo: Value([exact=JSString], value: "anotherString"), intTwo: [exact=JSUInt31]})*/
+var otherDict1 = {'stringTwo': "anotherString", 'intTwo': 84};
+
+/*element: int1:[exact=JSUInt31]*/
+var int1 = 0;
+
+/*element: anotherInt1:[exact=JSUInt31]*/
+var anotherInt1 = 0;
+
+/*element: nullOrInt1:[null|exact=JSUInt31]*/
+var nullOrInt1 = 0;
+
+/*element: dynamic1:[null|subclass=Object]*/
+var dynamic1 = 0;
+
+/*element: test1:[null]*/
+test1() {
+  dictionaryA1
+      . /*invoke: Map([subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+      addAll(otherDict1);
+  dictionaryB1
+      . /*invoke: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+      addAll({'stringTwo': "anotherString", 'intTwo': 84});
+  int1 = dictionaryB1
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+      ['int'];
+  anotherInt1 = otherDict1
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSString]), map: {stringTwo: Value([exact=JSString], value: "anotherString"), intTwo: [exact=JSUInt31]})*/
+      ['intTwo'];
+  dynamic1 = dictionaryA1
+      /*Map([subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/ [
+      'int'];
+  nullOrInt1 = dictionaryB1
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+      ['intTwo'];
+}
+
+/*element: dictionaryA2:Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+var dictionaryA2 = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
+
+/*element: dictionaryB2:Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), intTwo: [exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+var dictionaryB2 = {'string': "aString", 'intTwo': 42, 'list': []};
+
+/*element: nullOrInt2:[null|exact=JSUInt31]*/
+var nullOrInt2 = 0;
+
+/*element: aString2:[exact=JSString]*/
+var aString2 = "";
+
+/*element: doubleOrNull2:[null|exact=JSDouble]*/
+var doubleOrNull2 = 22.2;
+
+/*element: test2:[null]*/
+test2() {
+  var union = dictionaryA2
+          /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+          ['foo']
+      ? dictionaryA2
+      : dictionaryB2;
+  nullOrInt2 = union
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {int: [null|exact=JSUInt31], double: [null|exact=JSDouble], string: Value([exact=JSString], value: "aString"), intTwo: [null|exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      ['intTwo'];
+  aString2 = union
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {int: [null|exact=JSUInt31], double: [null|exact=JSDouble], string: Value([exact=JSString], value: "aString"), intTwo: [null|exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      ['string'];
+  doubleOrNull2 = union
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {int: [null|exact=JSUInt31], double: [null|exact=JSDouble], string: Value([exact=JSString], value: "aString"), intTwo: [null|exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      ['double'];
+}
+
+/*element: dictionary3:Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+var dictionary3 = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
+/*element: keyD3:Value([exact=JSString], value: "double")*/
+var keyD3 = 'double';
+
+/*element: keyI3:Value([exact=JSString], value: "int")*/
+var keyI3 = 'int';
+
+/*element: keyN3:Value([exact=JSString], value: "notFoundInMap")*/
+var keyN3 = 'notFoundInMap';
+
+/*element: knownDouble3:[exact=JSDouble]*/
+var knownDouble3 = 42.2;
+
+/*element: intOrNull3:[null|exact=JSUInt31]*/
+var intOrNull3 = dictionary3
+    /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+    [keyI3];
+
+/*element: justNull3:[null]*/
+var justNull3 = dictionary3
+    /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+    [keyN3];
+
+/*element: test3:[null]*/
+test3() {
+  knownDouble3 = dictionary3
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [exact=JSExtendableArray], [exact=JSUInt31], [null|exact=JSString]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSDouble], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      [keyD3];
+  // ignore: unused_local_variable
+  var x = [intOrNull3, justNull3];
+}
+
+class A4 {
+/*element: A4.:[exact=A4]*/
+  A4();
+/*element: A4.foo4:[exact=JSUInt31]*/
+  foo4(
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSString]), map: {anInt: [exact=JSUInt31], aString: Value([exact=JSString], value: "theString")})*/ value) {
+    return value /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSString]), map: {anInt: [exact=JSUInt31], aString: Value([exact=JSString], value: "theString")})*/ [
+        'anInt'];
+  }
+}
+
+class B4 {
+/*element: B4.:[exact=B4]*/
+  B4();
+
+/*element: B4.foo4:[exact=JSUInt31]*/
+  foo4(
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSString]), map: {anInt: [exact=JSUInt31], aString: Value([exact=JSString], value: "theString")})*/ value) {
+    return 0;
+  }
+}
+
+/*element: test4:[null]*/
+test4() {
+  var dictionary = {'anInt': 42, 'aString': "theString"};
+  var it;
+  if ([true, false]
+      /*Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/
+      [0]) {
+    it = new A4();
+  } else {
+    it = new B4();
+  }
+  print(it. /*invoke: Union([exact=A4], [exact=B4])*/ foo4(
+          dictionary) /*invoke: [exact=JSUInt31]*/ +
+      2);
+}
+
+/*element: dict5:Map([null|subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+var dict5 = makeMap5([1, 2]);
+
+/*element: notInt5:[null|subclass=Object]*/
+var notInt5 = 0;
+
+/*element: alsoNotInt5:[null|subclass=Object]*/
+var alsoNotInt5 = 0;
+
+/*element: makeMap5:Map([subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+makeMap5(
+    /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/ values) {
+  return {
+    'moo': values
+        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+        [0],
+    'boo': values
+        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+        [1]
+  };
+}
+
+/*element: test5:[null]*/
+test5() {
+  dict5
+      /*update: Map([null|subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+      ['goo'] = 42;
+  var closure =
+      /*Map([null|subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+      () => dict5;
+  notInt5 = closure()['boo'];
+  alsoNotInt5 = dict5
+      /*Map([null|subclass=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+      ['goo'];
+  print("$notInt5 and $alsoNotInt5.");
+}
diff --git a/tests/compiler/dart2js/inference/data/local_functions.dart b/tests/compiler/dart2js/inference/data/local_functions.dart
index 5e24e6b..c64f6a5 100644
--- a/tests/compiler/dart2js/inference/data/local_functions.dart
+++ b/tests/compiler/dart2js/inference/data/local_functions.dart
@@ -94,29 +94,35 @@
 // Implicit .call on a local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: closureToString:[exact=JSString]*/
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: closureToString:[empty]*/
 closureToString() {
   var local = /*[null]*/ () {};
   local();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [empty]*/ toString();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Explicit .call on a local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: closureCallToString:[exact=JSString]*/
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: closureCallToString:[empty]*/
 closureCallToString() {
   var local = /*[null]*/ () {};
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [empty]*/ toString();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Operator == on the result of a parameter invocation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: _callCompare:[exact=callCompare_closure]*/
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: _callCompare:[empty]*/
 _callCompare(int /*[subclass=Closure]*/ compare({a, b})) {
   compare(a: 0, b: 1) == 0;
   return compare;
@@ -139,7 +145,7 @@
   method1() {}
 }
 
-/*element: _callClosure:[exact=callClosure_closure]*/
+/*element: _callClosure:[empty]*/
 _callClosure(/*[subclass=Closure]*/ f({c})) {
   f(c: new Class1()).method1();
   return f;
diff --git a/tests/compiler/dart2js/inference/data/local_functions_call.dart b/tests/compiler/dart2js/inference/data/local_functions_call.dart
new file mode 100644
index 0000000..308de0f
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/local_functions_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.
+
+// This is the same test as `closureCallToString` in 'local_functions.dart' but
+// with a different expectancy because the closed world contains less '.call'
+// methods.
+
+/*element: main:[null]*/
+main() {
+  closureCallToString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Explicit .call on a local variable.
+////////////////////////////////////////////////////////////////////////////////
+
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: closureCallToString:[empty]*/
+closureCallToString() {
+  var local = /*[null]*/ () {};
+  local.call();
+  return local
+      .
+      /*invoke: [empty]*/
+      toString();
+}
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
new file mode 100644
index 0000000..fb02458
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
@@ -0,0 +1,189 @@
+// 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();
+}
+
+/*element: aDouble1:[null|exact=JSDouble]*/
+double aDouble1 = 42.5;
+
+/*element: aList1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+List aList1 = [42];
+
+/*element: consume1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+consume1(
+        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x) =>
+    x;
+
+/*element: test1:[null]*/
+test1() {
+  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
+  theMap
+      /*update: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSDouble], map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: [null|exact=JSDouble]})*/
+      ['d'] = 5.5;
+  /*iterator: [exact=LinkedHashMapKeyIterable]*/
+  /*current: [exact=LinkedHashMapKeyIterator]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  for (var key in theMap.
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSDouble], map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: [null|exact=JSDouble]})*/
+      keys) {
+    aDouble1 = theMap
+        /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSDouble], map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: [null|exact=JSDouble]})*/
+        [key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume1(aList1);
+}
+
+/*element: aDouble2:[null|exact=JSDouble]*/
+double aDouble2 = 42.5;
+
+/*element: aList2:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+List aList2 = [42];
+
+/*element: consume2:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+consume2(
+        /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x) =>
+    x;
+
+/*element: test2:[null]*/
+test2() {
+  dynamic theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
+  theMap
+      /*update: Map([subclass=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSDouble])*/
+      [aList2] = 5.5;
+  /*iterator: [exact=LinkedHashMapKeyIterable]*/
+  /*current: [exact=LinkedHashMapKeyIterator]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  for (var key in theMap.
+      /*Map([subclass=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSDouble])*/
+      keys) {
+    aDouble2 = theMap
+        /*Map([subclass=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSDouble])*/
+        [key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume2(aList2);
+}
+
+/*element: aDouble3:Union([exact=JSDouble], [null|exact=JSExtendableArray])*/
+double aDouble3 = 42.5;
+
+/*element: aList3:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+List aList3 = [42];
+
+/*element: consume3:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+consume3(
+        /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x) =>
+    x;
+
+/*element: test3:[null]*/
+test3() {
+  dynamic theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
+  theMap
+      /*update: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [null|exact=JSExtendableArray]), map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
+      ['d'] = aList3;
+  /*iterator: [exact=LinkedHashMapKeyIterable]*/
+  /*current: [exact=LinkedHashMapKeyIterator]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  for (var key in theMap.
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [null|exact=JSExtendableArray]), map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
+      keys) {
+    aDouble3 = theMap
+        /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [null|exact=JSExtendableArray]), map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
+        [key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume3(aList3);
+}
+
+/*element: aDouble4:[null|exact=JSDouble]*/
+double aDouble4 = 42.5;
+
+/*element: aList4:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+List aList4 = [42];
+
+/*element: consume4:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+consume4(
+        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x) =>
+    x;
+
+/*element: test4:[null]*/
+test4() {
+  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, 'd': 5.5};
+  /*iterator: [exact=LinkedHashMapKeyIterable]*/
+  /*current: [exact=LinkedHashMapKeyIterator]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  for (var key in theMap.
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSDouble], map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: [exact=JSDouble]})*/
+      keys) {
+    aDouble4 = theMap
+        /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSDouble], map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: [exact=JSDouble]})*/
+        [key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume4(aList4);
+}
+
+/*element: aDouble5:[null|exact=JSDouble]*/
+double aDouble5 = 42.5;
+
+/*element: aList5:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+List aList5 = [42];
+
+/*element: consume5:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+consume5(
+        /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x) =>
+    x;
+
+/*element: test5:[null]*/
+test5() {
+  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, aList5: 5.5};
+  /*iterator: [exact=LinkedHashMapKeyIterable]*/
+  /*current: [exact=LinkedHashMapKeyIterator]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  for (var key in theMap.
+      /*Map([subclass=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSDouble])*/
+      keys) {
+    aDouble5 = theMap
+        /*Map([subclass=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSDouble])*/
+        [key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume5(aList5);
+}
+
+/*element: aDouble6:Union([null|exact=JSDouble], [null|exact=JSExtendableArray])*/
+double aDouble6 = 42.5;
+/*element: aList6:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+List aList6 = [42];
+
+/*element: consume6:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+consume6(
+        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x) =>
+    x;
+
+/*element: test6:[null]*/
+test6() {
+  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, 'd': aList6};
+  /*iterator: [exact=LinkedHashMapKeyIterable]*/
+  /*current: [exact=LinkedHashMapKeyIterator]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  for (var key in theMap.
+      /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [null|exact=JSExtendableArray]), map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+      keys) {
+    aDouble6 = theMap
+        /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([null|exact=JSDouble], [null|exact=JSExtendableArray]), map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+        [key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume6(aList6);
+}
diff --git a/tests/compiler/dart2js/inference/data/refine_locals.dart b/tests/compiler/dart2js/inference/data/refine_locals.dart
index cb1c021..bc437fb 100644
--- a/tests/compiler/dart2js/inference/data/refine_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_locals.dart
@@ -163,14 +163,16 @@
 // Refine the type of a local variable through a sequence of invocations.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: _refineToClosureLocal:[exact=_refineToClosureLocal_closure]*/
+/*element: _refineToClosureLocal:[empty]*/
 _refineToClosureLocal() {
   var f = /*[null]*/ ({/*[exact=JSUInt31]*/ a}) {};
   f(a: 0);
   return f;
 }
 
-/*element: _refineToClosureLocalCall:[exact=_refineToClosureLocalCall_closure]*/
+// TODO(johnniwinther): Fix the refined type. Missing call methods in the closed
+// world leads to concluding [empty].
+/*element: _refineToClosureLocalCall:[empty]*/
 _refineToClosureLocalCall() {
   var f = /*[null]*/ ({/*[exact=JSUInt31]*/ b}) {};
   f.call(b: 0);
diff --git a/tests/compiler/dart2js/inference/dictionary_types_test.dart b/tests/compiler/dart2js/inference/dictionary_types_test.dart
deleted file mode 100644
index 1d934e6..0000000
--- a/tests/compiler/dart2js/inference/dictionary_types_test.dart
+++ /dev/null
@@ -1,173 +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:expect/expect.dart';
-
-import '../memory_compiler.dart';
-
-var SOURCES = const {
-  'AddAll.dart': """
-  var dictionaryA = {'string': "aString", 'int': 42, 'double': 21.5,
-                     'list': []};
-  var dictionaryB = {'string': "aString", 'int': 42, 'double': 21.5,
-                     'list': []};
-  var otherDict = {'stringTwo' : "anotherString", 'intTwo' : 84};
-  var int = 0;
-  var anotherInt = 0;
-  var nullOrInt = 0;
-  var dynamic = 0;
-
-  main() {
-    dictionaryA.addAll(otherDict);
-    dictionaryB.addAll({'stringTwo' : "anotherString", 'intTwo' : 84});
-    int = dictionaryB['int'];
-    anotherInt = otherDict['intTwo'];
-    dynamic = dictionaryA['int'];
-    nullOrInt = dictionaryB['intTwo'];
-  }
-""",
-  'Union.dart': """
-  var dictionaryA = {'string': "aString", 'int': 42, 'double': 21.5,
-                     'list': []};
-  var dictionaryB = {'string': "aString", 'intTwo': 42, 'list': []};
-  var nullOrInt = 0;
-  var aString = "";
-  var doubleOrNull = 22.2;
-  var key = "string";
-
-  main() {
-    var union = dictionaryA['foo'] ? dictionaryA : dictionaryB;
-    nullOrInt = union['intTwo'];
-    aString = union['string'];
-    doubleOrNull = union['double'];
-  }
-""",
-  'ValueType.dart': """
-  var dictionary = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
-  var keyD = 'double';
-  var keyI = 'int';
-  var keyN = 'notFoundInMap';
-  var knownDouble = 42.2;
-  var intOrNull = dictionary[keyI];
-  var justNull = dictionary[keyN];
-
-  main() {
-    knownDouble = dictionary[keyD];
-    var x = [intOrNull, justNull];
-  }
-""",
-  'Propagation.dart': """
-  class A {
-    A();
-    foo(value) {
-      return value['anInt'];
-    }
-  }
-
-  class B {
-    B();
-    foo(value) {
-      return 0;
-    }
-  }
-
-  main() {
-    var dictionary = {'anInt': 42, 'aString': "theString"};
-    var it;
-    if ([true, false][0]) {
-      it = new A();
-    } else {
-      it = new B();
-    }
-    print(it.foo(dictionary) + 2);
-  }
-""",
-  'Bailout.dart': """
-  var dict = makeMap([1,2]);
-  var notInt = 0;
-  var alsoNotInt = 0;
-
-  makeMap(values) {
-    return {'moo': values[0], 'boo': values[1]};
-  }
-
-  main () {
-    dict['goo'] = 42;
-    var closure = () => dict;
-    notInt = closure()['boo'];
-    alsoNotInt = dict['goo'];
-    print("\$notInt and \$alsoNotInt.");
-  }
-"""
-};
-
-void main() {
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
-  });
-}
-
-runTests({bool useKernel}) async {
-  await compileAndTest("AddAll.dart", (types, getType, closedWorld) {
-    Expect.equals(getType('int'), types.uint31Type);
-    Expect.equals(getType('anotherInt'), types.uint31Type);
-    Expect.equals(getType('dynamic'), types.dynamicType);
-    Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
-  }, useKernel: useKernel);
-  await compileAndTest("Union.dart", (types, getType, closedWorld) {
-    Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
-    Expect.isTrue(getType('aString').containsOnlyString(closedWorld));
-    Expect.equals(getType('doubleOrNull'), types.doubleType.nullable());
-  }, useKernel: useKernel);
-  await compileAndTest("ValueType.dart", (types, getType, closedWorld) {
-    Expect.equals(getType('knownDouble'), types.doubleType);
-    Expect.equals(getType('intOrNull'), types.uint31Type.nullable());
-    Expect.equals(getType('justNull'), types.nullType);
-  }, useKernel: useKernel);
-  await compileAndTest("Propagation.dart", (code) {
-    Expect.isFalse(code.contains("J.\$add\$ns"));
-  }, createCode: true, useKernel: useKernel);
-  await compileAndTest("Bailout.dart", (types, getType, closedWorld) {
-    Expect.equals(getType('notInt'), types.dynamicType);
-    Expect.equals(getType('alsoNotInt'), types.dynamicType);
-    Expect.isFalse(getType('dict').isDictionary);
-  }, useKernel: useKernel);
-}
-
-compileAndTest(source, checker,
-    {bool createCode: false, bool useKernel}) async {
-  CompilationResult result = await runCompiler(
-      entryPoint: Uri.parse('memory:' + source),
-      memorySourceFiles: SOURCES,
-      beforeRun: (compiler) {
-        compiler.stopAfterTypeInference = !createCode;
-      },
-      options: useKernel ? [Flags.useKernel] : []);
-  var compiler = result.compiler;
-  var typesInferrer = compiler.globalInference.typesInferrerInternal;
-  var closedWorld = typesInferrer.closedWorld;
-  var elementEnvironment = closedWorld.elementEnvironment;
-  var commonMasks = closedWorld.commonMasks;
-  getType(String name) {
-    var element = elementEnvironment.lookupLibraryMember(
-        elementEnvironment.mainLibrary, name);
-    Expect.isNotNull(element, "No class '$name' found.");
-    return typesInferrer.getTypeOfMember(element);
-  }
-
-  if (!createCode) {
-    checker(commonMasks, getType, closedWorld);
-  } else {
-    var element = elementEnvironment.mainFunction;
-    var code = compiler.backend.getGeneratedCode(element);
-    checker(code);
-  }
-}
diff --git a/tests/compiler/dart2js/inference/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/inference/field_type_simple_inferer_test.dart
deleted file mode 100644
index 6b46ce7..0000000
--- a/tests/compiler/dart2js/inference/field_type_simple_inferer_test.dart
+++ /dev/null
@@ -1,689 +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.
-/// Currently it only works with the mock compiler.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/types/types.dart' show TypeMask;
-import 'package:compiler/src/world.dart' show ClosedWorld;
-
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-void compileAndFind(String code, String className, String memberName,
-    bool disableInlining, check(compiler, element)) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(code, uri, disableInlining: disableInlining);
-  asyncTest(() => compiler.run(uri).then((_) {
-        dynamic cls = findElement(compiler, className);
-        var member = cls.lookupMember(memberName);
-        check(compiler, member);
-      }));
-}
-
-const String TEST_1 = r"""
-  class A {
-    int f;
-  }
-  main() { new A(); }
-""";
-
-const String TEST_2 = r"""
-  class A {
-    int f1;
-    int f2 = 1;
-  }
-  main() { new A(); }
-""";
-
-const String TEST_3 = r"""
-  class A {
-    int f1;
-    int f2;
-    A() : f1 = 1;
-  }
-  main() { new A().f2 = 2; }
-""";
-
-const String TEST_4 = r"""
-  class A {
-    int f1;
-    int f2;
-    A() : f1 = 1;
-  }
-  main() {
-    A a = new A();
-    a.f1 = "a";
-    a.f2 = "a";
-  }
-""";
-
-const String TEST_5 = r"""
-  class A {
-    int f1 = 1;
-    int f2 = 1;
-    A(x) {
-      f1 = "1";
-      if (x) {
-        f2 = "1";
-      } else {
-        f2 = "2";
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_6 = r"""
-  class A {
-    int f1 = 1;
-    int f2 = 1;
-    A(x) {
-      f1 = "1";
-      if (x) {
-        f2 = "1";
-      } else {
-        f2 = "2";
-      }
-      if (x) {
-        f2 = new List();
-      } else {
-        f2 = new List();
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_7 = r"""
-  class A {
-    int f1 = 1;
-    int f2 = 1;
-    A(x) {
-      f1 = "1";
-      if (x) {
-        f2 = "1";
-      } else {
-        f2 = "2";
-      }
-      if (x) {
-        f1 = new List();
-        f2 = new List();
-      } else {
-        f2 = new List();
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_8 = r"""
-  class A {
-    int f;
-    A(x) {
-      if (x) {
-        f = "1";
-      } else {
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_9 = r"""
-  class A {
-    int f;
-    A(x) {
-      if (x) {
-      } else {
-        f = "1";
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_10 = r"""
-  class A {
-    int f;
-    A() {
-      f = 1;
-    }
-    m() => f + 1;
-  }
-  void f(x) { x.f = "2"; }
-  main() {
-    A a;
-    f(a);
-    a = new A();
-    a.m();
-  }
-""";
-
-const String TEST_11 = r"""
-  class S {
-    int fs = 1;
-    ms() { fs = 1; }
-  }
-
-  class A extends S {
-    m() { ms(); }
-  }
-
-  main() {
-    A a = new A();
-    a.m();
-  }
-""";
-
-const String TEST_12 = r"""
-  class S {
-    int fs = 1;
-    S() { fs = "2"; }
-  }
-
-  class A extends S {
-  }
-
-  main() {
-    A a = new A();
-  }
-""";
-
-const String TEST_13 = r"""
-  class S {
-    int fs;
-    S() { fs = 1; }
-  }
-
-  class A extends S {
-    A() { fs = 1; }
-  }
-
-  main() {
-    A a = new A();
-  }
-""";
-
-const String TEST_14 = r"""
-  class A {
-    var f;
-    A() { f = 1; }
-    A.other() { f = 2; }
-  }
-
-  main() {
-    A a = new A();
-    a = new A.other();
-  }
-""";
-
-const String TEST_15 = r"""
-  class A {
-    var f;
-    A() { f = "1"; }
-    A.other() { f = new List(); }
-  }
-
-  main() {
-    A a = new A();
-    a = new A.other();
-  }
-""";
-
-const String TEST_16 = r"""
-  class A {
-    var f;
-    A() { f = "1"; }
-    A.other() : f = 1 { }
-  }
-
-  main() {
-    A a = new A();
-    a = new A.other();
-  }
-""";
-
-const String TEST_17 = r"""
-  g([p]) => p.f = 1;
-  class A {
-    var f;
-    A(x) {
-      var a;
-      if (x) {
-        a = this;
-      } else {
-        a = g;
-      }
-      a(this);
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_18 = r"""
-  class A {
-    var f1;
-    var f2;
-    var f3;
-    A(x) {
-      f1 = 1;
-      var a;
-      if (x) {
-        f2 = "1";
-        a = this;
-      } else {
-        a = 1;
-        f2 = "1";
-      }
-      f3 = a;
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_19 = r"""
-  class A {
-    var f1;
-    var f2;
-    var f3;
-    A(x) {
-      f1 = 1;
-      var a;
-      if (x) {
-        f2 = "1";
-        a = this;
-      } else {
-        a = 1;
-        f2 = "1";
-      }
-      f3 = a;
-      a();
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_20 = r"""
-  class A {
-    var f;
-    A() {
-      for (f in this) {
-      }
-    }
-    get iterator => this;
-    get current => 42;
-    bool moveNext() => false;
-  }
-  main() {
-    new A();
-  }
-""";
-
-const String TEST_21 = r"""
-  class A {
-    var f;
-    A() {
-      for (var i in this) {
-      }
-      f = 42;
-    }
-    get iterator => null;
-  }
-  main() {
-    new A();
-  }
-""";
-
-const String TEST_22 = r"""
-  class A {
-    var f1;
-    var f2;
-    var f3;
-    A() {
-      f1 = 42;
-      f2 = f1 == null ? 42 : f3 == null ? 41: 43;
-      f3 = 'foo';
-    }
-  }
-  main() {
-    new A();
-  }
-""";
-
-const String TEST_23 = r"""
-  class A {
-    var f1 = 42;
-    var f2 = 42;
-    var f3 = 42;
-    var f4 = 42;
-    A() {
-      // Test string interpolation.
-      '${f1 = null}';
-      // Test string juxtaposition.
-      ''
-      '${f2 = null}';
-      // Test list literal.
-      [f3 = null];
-      // Test map literal.
-      var c = {'foo': f4 = null };
-    }
-  }
-  main() {
-    new A();
-  }
-""";
-
-const String TEST_24 = r"""
-  class A {
-    var f1 = 42;
-    var f2 = 42;
-    var f3 = 42;
-    final f4;
-    var f5;
-    var f6 = null;
-    A() : f4 = 42 {
-      f1++;
-      f2 += 42;
-      var f6 = 'foo';
-      this.f6 = f6;
-    }
-    A.foo(other) : f3 = other.f3, f4 = other.f4, f5 = other.bar();
-    operator+(other) => 'foo';
-    bar() => 42.5;
-  }
-  class B extends A {
-    bar() => 42;
-  }
-  main() {
-    new A();
-    new A.foo(new A());
-    new A.foo(new B());
-
-  }
-""";
-
-const String TEST_25 = r"""
-  class A {
-    var f1 = 42;
-  }
-  class B {
-    var f1 = '42';
-  }
-  main() {
-    new B();
-    new A().f1 = new A().f1;
-  }
-""";
-
-const String TEST_26 = r"""
-  class A {
-    var f1 = 42;
-  }
-  class B {
-    var f1 = 54;
-  }
-  main() {
-    new A().f1 = [new B(), new A()][0].f1 + 42;
-  }
-""";
-
-const String TEST_27 = r"""
-  class A {
-    var f1;
-    var f2;
-    A() {
-      this.f1 = 42;
-      this.f2 = 42;
-    }
-  }
-  class B extends A {
-    set f2(value) {}
-  }
-  main() {
-    new A();
-    new B();
-  }
-""";
-
-const String TEST_28 = r"""
-  class A {
-    var f1;
-    var f2;
-    A(x) {
-      this.f1 = x;
-      if (x == 0) return;
-      this.f2 = x;
-    }
-  }
-  main() {
-    new A(0);
-    new A(1);
-  }
-""";
-
-const String TEST_29 = r"""
-  class A {
-    var f1;
-    var f2;
-    A(x) {
-      this.f1 = x;
-      if (x == 0) {
-      } else {
-        return;
-      }
-      this.f2 = x;
-    }
-  }
-  main() {
-    new A(0);
-    new A(1);
-  }
-""";
-
-const String TEST_30 = r"""
-  class A {
-    var f1;
-    var f2;
-    var f3;
-    A(x) {
-      this.f1 = x;
-      if (x == 0) {
-        this.f2 = 1;
-      } else {
-        this.f2 = x;
-        return;
-      }
-      this.f3 = x;
-    }
-  }
-  main() {
-    new A(0);
-    new A(1);
-  }
-""";
-
-typedef TypeMask TestCallback(ClosedWorld closedWorld);
-
-void doTest(
-    String test, bool disableInlining, Map<String, TestCallback> fields) {
-  fields.forEach((String name, TestCallback f) {
-    compileAndFind(test, 'A', name, disableInlining, (compiler, field) {
-      var inferrer = compiler.globalInference.typesInferrerInternal;
-      var closedWorld = inferrer.closedWorld;
-      TypeMask type = f(closedWorld);
-      TypeMask inferredType =
-          simplify(inferrer.getTypeOfMember(field), closedWorld);
-      Expect.equals(type, inferredType, '$name of:\n$test');
-    });
-  });
-}
-
-void runTest(String test, Map<String, TestCallback> fields) {
-  doTest(test, false, fields);
-  doTest(test, true, fields);
-}
-
-void test() {
-  runTest(TEST_1, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.nullType
-  });
-  runTest(TEST_2, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.nullType,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type
-  });
-  runTest(TEST_3, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-  runTest(TEST_4, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.interceptorType,
-    'f2': (closedWorld) => closedWorld.commonMasks.stringType.nullable()
-  });
-
-  // TODO(ngeoffray): We should try to infer that the initialization
-  // code at the declaration site of the fields does not matter.
-  runTest(TEST_5, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.interceptorType,
-    'f2': (closedWorld) => closedWorld.commonMasks.interceptorType,
-  });
-  runTest(TEST_6, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.interceptorType,
-    'f2': (closedWorld) => closedWorld.commonMasks.interceptorType,
-  });
-  runTest(TEST_7, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.interceptorType,
-    'f2': (closedWorld) => closedWorld.commonMasks.interceptorType,
-  });
-
-  runTest(TEST_8, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.stringType.nullable()
-  });
-  runTest(TEST_9, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.stringType.nullable()
-  });
-  runTest(TEST_10, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.uint31Type
-  });
-  runTest(TEST_11, <String, TestCallback>{
-    'fs': (closedWorld) => closedWorld.commonMasks.uint31Type
-  });
-
-  // TODO(ngeoffray): We should try to infer that the initialization
-  // code at the declaration site of the fields does not matter.
-  runTest(TEST_12, <String, TestCallback>{
-    'fs': (closedWorld) => closedWorld.commonMasks.interceptorType
-  });
-
-  runTest(TEST_13, <String, TestCallback>{
-    'fs': (closedWorld) => closedWorld.commonMasks.uint31Type
-  });
-  runTest(TEST_14, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.uint31Type
-  });
-  runTest(TEST_15, <String, TestCallback>{
-    'f': (closedWorld) {
-      ClassElement cls = closedWorld.commonElements.jsIndexableClass;
-      return new TypeMask.nonNullSubtype(cls, closedWorld);
-    }
-  });
-  runTest(TEST_16, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.interceptorType
-  });
-  runTest(TEST_17, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-  runTest(TEST_18, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.stringType,
-    'f3': (closedWorld) => closedWorld.commonMasks.dynamicType
-  });
-  runTest(TEST_19, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.stringType,
-    'f3': (closedWorld) => closedWorld.commonMasks.dynamicType
-  });
-  runTest(TEST_20, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-  runTest(TEST_21, <String, TestCallback>{
-    'f': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-
-  runTest(TEST_22, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f3': (closedWorld) => closedWorld.commonMasks.stringType.nullable()
-  });
-
-  runTest(TEST_23, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable(),
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable(),
-    'f3': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable(),
-    'f4': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-
-  runTest(TEST_24, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.positiveIntType,
-    'f2': (closedWorld) => closedWorld.commonMasks.positiveIntType,
-    'f3': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f4': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f5': (closedWorld) => closedWorld.commonMasks.numType.nullable(),
-    'f6': (closedWorld) => closedWorld.commonMasks.stringType.nullable()
-  });
-
-  runTest(TEST_25, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type
-  });
-  runTest(TEST_26, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.positiveIntType
-  });
-  runTest(TEST_27, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-  runTest(TEST_28, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-  runTest(TEST_29, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-  runTest(TEST_30, <String, TestCallback>{
-    'f1': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f2': (closedWorld) => closedWorld.commonMasks.uint31Type,
-    'f3': (closedWorld) => closedWorld.commonMasks.uint31Type.nullable()
-  });
-}
-
-void main() {
-  test();
-}
diff --git a/tests/compiler/dart2js/inference/inference0_test.dart b/tests/compiler/dart2js/inference/inference0_test.dart
new file mode 100644
index 0000000..3f3ae82
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference0_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'inference_test_helper.dart';
+
+main(List<String> args) {
+  runTests(args, 0);
+}
diff --git a/tests/compiler/dart2js/inference/inference1_test.dart b/tests/compiler/dart2js/inference/inference1_test.dart
new file mode 100644
index 0000000..ba475ac
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference1_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'inference_test_helper.dart';
+
+main(List<String> args) {
+  runTests(args, 1);
+}
diff --git a/tests/compiler/dart2js/inference/inference_test.dart b/tests/compiler/dart2js/inference/inference_test.dart
deleted file mode 100644
index ac40734..0000000
--- a/tests/compiler/dart2js/inference/inference_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-import 'package:async_helper/async_helper.dart';
-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,
-        libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
-        forUserLibrariesOnly: true,
-        args: args,
-        options: [stopAfterTypeInference],
-        skipForKernel: skipForKernel);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index ac64daa..8e760c1 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/compiler.dart';
@@ -16,6 +18,31 @@
 import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+const List<String> skipForKernel = const <String>[
+  // TODO(johnniwinther): Remove this when issue 31767 is fixed.
+  'mixin_constructor_default_parameter_values.dart',
+];
+
+main(List<String> args) {
+  runTests(args);
+}
+
+runTests(List<String> args, [int shardIndex]) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    await checkTests(
+        dataDir, computeMemberAstTypeMasks, computeMemberIrTypeMasks,
+        libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
+        forUserLibrariesOnly: true,
+        args: args,
+        options: [stopAfterTypeInference],
+        skipForKernel: skipForKernel,
+        shardIndex: shardIndex ?? 0,
+        shards: shardIndex != null ? 2 : 1);
+  });
+}
 
 /// Compute type inference data for [_member] as a [MemberElement].
 ///
diff --git a/tests/compiler/dart2js/inference/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
index b9f5e819..613f8a3 100644
--- a/tests/compiler/dart2js/inference/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
+import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/types/types.dart' show ContainerTypeMask, TypeMask;
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
 
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 String generateTest(String listAllocation) {
   return """
@@ -189,58 +187,76 @@
 }
 
 void main() {
-  doTest('[]', nullify: false); // Test literal list.
-  doTest('new List()', nullify: false); // Test growable list.
-  doTest('new List(1)', nullify: true); // Test fixed list.
-  doTest('new List.filled(1, 0)', nullify: false); // Test List.filled.
-  doTest('new List.filled(1, null)', nullify: true); // Test List.filled.
+  runTest({bool useKernel}) async {
+    // Test literal list.
+    await doTest('[]', nullify: false, useKernel: useKernel);
+    // Test growable list.
+    await doTest('new List()', nullify: false, useKernel: useKernel);
+    // Test fixed list.
+    await doTest('new List(1)', nullify: true, useKernel: useKernel);
+    // Test List.filled.
+    await doTest('new List.filled(1, 0)', nullify: false, useKernel: useKernel);
+    // Test List.filled.
+    await doTest('new List.filled(1, null)',
+        nullify: true, useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
 
-void doTest(String allocation, {bool nullify}) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(generateTest(allocation), uri,
-      expectedErrors: 0, expectedWarnings: 1);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
+doTest(String allocation, {bool nullify, bool useKernel}) async {
+  String source = generateTest(allocation);
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': source},
+      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;
 
-        checkType(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          ContainerTypeMask mask = typesInferrer.getTypeOfMember(element);
-          if (nullify) type = type.nullable();
-          Expect.equals(type, simplify(mask.elementType, closedWorld), name);
-        }
+  checkType(String name, type) {
+    var element = findMember(closedWorld, name);
+    ContainerTypeMask mask = typesInferrer.getTypeOfMember(element);
+    if (nullify) type = type.nullable();
+    Expect.equals(type, simplify(mask.elementType, closedWorld), name);
+  }
 
-        checkType('listInField', commonMasks.numType);
-        checkType('listPassedToMethod', commonMasks.numType);
-        checkType('listReturnedFromMethod', commonMasks.numType);
-        checkType('listUsedWithCascade', commonMasks.numType);
-        checkType('listUsedInClosure', commonMasks.numType);
-        checkType('listPassedToSelector', commonMasks.numType);
-        checkType('listReturnedFromSelector', commonMasks.numType);
-        checkType('listUsedWithAddAndInsert', commonMasks.numType);
-        checkType('listUsedWithConstraint', commonMasks.positiveIntType);
-        checkType('listEscapingFromSetter', commonMasks.numType);
-        checkType('listUsedInLocal', commonMasks.numType);
-        checkType('listEscapingInSetterValue', commonMasks.numType);
-        checkType('listEscapingInIndex', commonMasks.numType);
-        checkType('listEscapingInIndexSet', commonMasks.uint31Type);
-        checkType('listEscapingTwiceInIndexSet', commonMasks.numType);
-        checkType('listSetInNonFinalField', commonMasks.numType);
-        checkType('listWithChangedLength', commonMasks.uint31Type.nullable());
+  checkType('listInField', commonMasks.numType);
+  checkType('listPassedToMethod', commonMasks.numType);
+  checkType('listReturnedFromMethod', commonMasks.numType);
+  checkType('listUsedWithCascade', commonMasks.numType);
+  checkType('listUsedInClosure', commonMasks.numType);
+  checkType('listPassedToSelector', commonMasks.numType);
+  checkType('listReturnedFromSelector', commonMasks.numType);
+  checkType('listUsedWithAddAndInsert', commonMasks.numType);
+  checkType('listUsedWithConstraint', commonMasks.positiveIntType);
+  checkType('listEscapingFromSetter', commonMasks.numType);
+  checkType('listUsedInLocal', commonMasks.numType);
+  checkType('listEscapingInSetterValue', commonMasks.numType);
+  checkType('listEscapingInIndex', commonMasks.numType);
+  checkType('listEscapingInIndexSet', commonMasks.uint31Type);
+  // TODO(johnniwinther): Since Iterable.iterableToString is part of the closed
+  // world we find the `dynamicType` instead of `numType`.
+  checkType('listEscapingTwiceInIndexSet', commonMasks.dynamicType);
+  checkType('listSetInNonFinalField', commonMasks.numType);
+  checkType('listWithChangedLength', commonMasks.uint31Type.nullable());
 
-        checkType('listPassedToClosure', commonMasks.dynamicType);
-        checkType('listReturnedFromClosure', commonMasks.dynamicType);
-        checkType('listUsedWithNonOkSelector', commonMasks.dynamicType);
-        checkType('listPassedAsOptionalParameter', commonMasks.numType);
-        checkType('listPassedAsNamedParameter', commonMasks.numType);
-        checkType('listStoredInList', commonMasks.uint31Type);
-        checkType('listStoredInListButEscapes', commonMasks.dynamicType);
+  checkType('listPassedToClosure', commonMasks.dynamicType);
+  checkType('listReturnedFromClosure', commonMasks.dynamicType);
+  checkType('listUsedWithNonOkSelector', commonMasks.dynamicType);
+  checkType('listPassedAsOptionalParameter', commonMasks.numType);
+  checkType('listPassedAsNamedParameter', commonMasks.numType);
+  checkType('listStoredInList', commonMasks.uint31Type);
+  checkType('listStoredInListButEscapes', commonMasks.dynamicType);
 
-        if (!allocation.contains('filled')) {
-          checkType('listUnset', new TypeMask.nonNullEmpty());
-          checkType('listOnlySetWithConstraint', new TypeMask.nonNullEmpty());
-        }
-      }));
+  if (!allocation.contains('filled')) {
+    checkType('listUnset', new TypeMask.nonNullEmpty());
+    checkType('listOnlySetWithConstraint', new TypeMask.nonNullEmpty());
+  }
 }
diff --git a/tests/compiler/dart2js/inference/map_tracer_keys_test.dart b/tests/compiler/dart2js/inference/map_tracer_keys_test.dart
deleted file mode 100644
index e968733..0000000
--- a/tests/compiler/dart2js/inference/map_tracer_keys_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/types/types.dart' show ContainerTypeMask, TypeMask;
-
-import '../compiler_helper.dart';
-
-String generateTest(String key, String value, bool initial) {
-  return """
-double aDouble = 42.5;
-List aList = [42];
-
-consume(x) => x;
-
-main() {
-""" +
-      (initial
-          ? """
-  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, $key: $value};
-"""
-          : """
-  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
-  theMap[$key] = $value;
-""") +
-      """
-  for (var key in theMap.keys) {
-    aDouble = theMap[key];
-  }
-  // We have to reference it somewhere, so that it always gets resolved.
-  consume(aList);
-}
-""";
-}
-
-void main() {
-  // Test using keys without the list floating in
-  doTest();
-  // Test using keys with the list floating in as key
-  doTest(key: "aList", bail: true);
-  // Test using keys with the list floating in as value
-  doTest(value: "aList");
-  // And the above where we add the list as part of the map literal.
-  doTest(initial: true);
-  doTest(key: "aList", bail: true, initial: true);
-  doTest(value: "aList", initial: true);
-}
-
-void doTest(
-    {String key: "'d'",
-    String value: "5.5",
-    bool bail: false,
-    bool initial: false}) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(generateTest(key, value, initial), uri,
-      expectedErrors: 0, expectedWarnings: 0);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var commonMasks = typesInferrer.closedWorld.commonMasks;
-        MemberElement aDouble = findElement(compiler, 'aDouble');
-        var aDoubleType = typesInferrer.getTypeOfMember(aDouble);
-        MemberElement aList = findElement(compiler, 'aList');
-        var aListType = typesInferrer.getTypeOfMember(aList);
-
-        Expect.equals(aDoubleType, commonMasks.doubleType);
-        Expect.isTrue(aListType is ContainerTypeMask);
-        ContainerTypeMask container = aListType;
-        TypeMask elementType = container.elementType;
-        if (bail) {
-          Expect.equals(elementType, commonMasks.dynamicType);
-        } else {
-          Expect.equals(elementType, commonMasks.uint31Type);
-        }
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index ddac6fd..0c1e02b 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -2,15 +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.
 
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
 import 'package:compiler/src/types/types.dart' show MapTypeMask, TypeMask;
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
 
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 String generateTest(String mapAllocation) {
   return """
@@ -119,6 +121,8 @@
 }
 
 main() {
+  anInt++;
+
   mapReturnedFromMethod[aKey] = anInt;
   bar()[aKey] = aDouble;
 
@@ -202,90 +206,103 @@
 }
 
 void main() {
-  // Test empty literal map
-  doTest('{}');
-  // Test preset map of <String,uint32>
-  doTest('{presetKey : anInt}', "presetKey", "anInt");
-  // Test preset map of <Double,uint32>
-  doTest('{aDouble : anInt}', "aDouble", "anInt");
+  runTests({bool useKernel}) async {
+    // Test empty literal map
+    await doTest('{}', useKernel: useKernel);
+    // Test preset map of <String,uint32>
+    await doTest('{presetKey : anInt}',
+        keyElementName: "presetKey",
+        valueElementName: "anInt",
+        useKernel: useKernel);
+    // Test preset map of <Double,uint32>
+    await doTest('{aDouble : anInt}',
+        keyElementName: "aDouble",
+        valueElementName: "anInt",
+        useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
 
-void doTest(String allocation,
-    [String keyElementName, String valueElementName]) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(generateTest(allocation), uri,
-      expectedErrors: 0, expectedWarnings: 1);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var keyType, valueType;
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
-        var emptyType = new TypeMask.nonNullEmpty();
-        MemberElement aKey = findElement(compiler, 'aKey');
-        var aKeyType = typesInferrer.getTypeOfMember(aKey);
-        if (keyElementName != null) {
-          MemberElement keyElement = findElement(compiler, keyElementName);
-          keyType = typesInferrer.getTypeOfMember(keyElement);
-        }
-        if (valueElementName != null) {
-          MemberElement valueElement = findElement(compiler, valueElementName);
-          valueType = typesInferrer.getTypeOfMember(valueElement);
-        }
-        if (keyType == null) keyType = emptyType;
-        if (valueType == null) valueType = emptyType;
+doTest(String allocation,
+    {String keyElementName, String valueElementName, bool useKernel}) async {
+  String source = generateTest(allocation);
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': source},
+      options: useKernel ? [Flags.useKernel] : []);
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+  TypeMask keyType, valueType;
+  TypeGraphInferrer typesInferrer =
+      compiler.globalInference.typesInferrerInternal;
+  ClosedWorld closedWorld = typesInferrer.closedWorld;
+  CommonMasks commonMasks = closedWorld.commonMasks;
+  TypeMask emptyType = new TypeMask.nonNullEmpty();
+  MemberEntity aKey = findMember(closedWorld, 'aKey');
+  TypeMask aKeyType = typesInferrer.getTypeOfMember(aKey);
+  if (keyElementName != null) {
+    MemberEntity keyElement = findMember(closedWorld, keyElementName);
+    keyType = typesInferrer.getTypeOfMember(keyElement);
+  }
+  if (valueElementName != null) {
+    MemberEntity valueElement = findMember(closedWorld, valueElementName);
+    valueType = typesInferrer.getTypeOfMember(valueElement);
+  }
+  if (keyType == null) keyType = emptyType;
+  if (valueType == null) valueType = emptyType;
 
-        checkType(String name, keyType, valueType) {
-          MemberElement element = findElement(compiler, name);
-          MapTypeMask mask = typesInferrer.getTypeOfMember(element);
-          Expect.equals(keyType, simplify(mask.keyType, closedWorld), name);
-          Expect.equals(valueType, simplify(mask.valueType, closedWorld), name);
-        }
+  checkType(String name, keyType, valueType) {
+    MemberEntity element = findMember(closedWorld, name);
+    MapTypeMask mask = typesInferrer.getTypeOfMember(element);
+    Expect.equals(keyType, simplify(mask.keyType, closedWorld), name);
+    Expect.equals(valueType, simplify(mask.valueType, closedWorld), name);
+  }
 
-        K(TypeMask other) =>
-            simplify(keyType.union(other, closedWorld), closedWorld);
-        V(TypeMask other) =>
-            simplify(valueType.union(other, closedWorld), closedWorld)
-                .nullable();
+  K(TypeMask other) => simplify(keyType.union(other, closedWorld), closedWorld);
+  V(TypeMask other) =>
+      simplify(valueType.union(other, closedWorld), closedWorld).nullable();
 
-        checkType('mapInField', K(aKeyType), V(commonMasks.numType));
-        checkType('mapPassedToMethod', K(aKeyType), V(commonMasks.numType));
-        checkType('mapReturnedFromMethod', K(aKeyType), V(commonMasks.numType));
-        checkType('mapUsedWithCascade', K(aKeyType), V(commonMasks.numType));
-        checkType('mapUsedInClosure', K(aKeyType), V(commonMasks.numType));
-        checkType('mapPassedToSelector', K(aKeyType), V(commonMasks.numType));
-        checkType(
-            'mapReturnedFromSelector', K(aKeyType), V(commonMasks.numType));
-        checkType(
-            'mapUsedWithConstraint', K(aKeyType), V(commonMasks.uint31Type));
-        checkType('mapEscapingFromSetter', K(aKeyType), V(commonMasks.numType));
-        checkType('mapUsedInLocal', K(aKeyType), V(commonMasks.numType));
-        checkType(
-            'mapEscapingInSetterValue', K(aKeyType), V(commonMasks.numType));
-        checkType('mapEscapingInIndex', K(aKeyType), V(commonMasks.numType));
-        checkType(
-            'mapEscapingInIndexSet', K(aKeyType), V(commonMasks.uint31Type));
-        checkType(
-            'mapEscapingTwiceInIndexSet', K(aKeyType), V(commonMasks.numType));
-        checkType('mapSetInNonFinalField', K(aKeyType), V(commonMasks.numType));
+  checkType('mapInField', K(aKeyType), V(commonMasks.numType));
+  checkType('mapPassedToMethod', K(aKeyType), V(commonMasks.numType));
+  checkType('mapReturnedFromMethod', K(aKeyType), V(commonMasks.numType));
+  checkType('mapUsedWithCascade', K(aKeyType), V(commonMasks.numType));
+  checkType('mapUsedInClosure', K(aKeyType), V(commonMasks.numType));
+  checkType('mapPassedToSelector', K(aKeyType), V(commonMasks.numType));
+  checkType('mapReturnedFromSelector', K(aKeyType), V(commonMasks.numType));
+  checkType(
+      'mapUsedWithConstraint', K(aKeyType), V(commonMasks.positiveIntType));
+  checkType('mapEscapingFromSetter', K(aKeyType), V(commonMasks.numType));
+  checkType('mapUsedInLocal', K(aKeyType), V(commonMasks.numType));
+  checkType('mapEscapingInSetterValue', K(aKeyType), V(commonMasks.numType));
+  checkType('mapEscapingInIndex', K(aKeyType), V(commonMasks.numType));
+  checkType(
+      'mapEscapingInIndexSet', K(aKeyType), V(commonMasks.positiveIntType));
+  // TODO(johnniwinther): Reenable this when we don't bail out due to
+  // (benign) JS calls.
+  //checkType('mapEscapingTwiceInIndexSet', K(aKeyType), V(commonMasks.numType));
+  checkType('mapSetInNonFinalField', K(aKeyType), V(commonMasks.numType));
 
-        checkType('mapPassedToClosure', K(commonMasks.dynamicType),
-            V(commonMasks.dynamicType));
-        checkType('mapReturnedFromClosure', K(commonMasks.dynamicType),
-            V(commonMasks.dynamicType));
-        checkType('mapUsedWithNonOkSelector', K(commonMasks.dynamicType),
-            V(commonMasks.dynamicType));
-        checkType('mapPassedAsOptionalParameter', K(aKeyType),
-            V(commonMasks.numType));
-        checkType(
-            'mapPassedAsNamedParameter', K(aKeyType), V(commonMasks.numType));
-        checkType('mapStoredInList', K(aKeyType), V(commonMasks.uint31Type));
-        checkType('mapStoredInListButEscapes', K(commonMasks.dynamicType),
-            V(commonMasks.dynamicType));
-        checkType('mapStoredInMap', K(aKeyType), V(commonMasks.uint31Type));
-        checkType('mapStoredInMapButEscapes', K(commonMasks.dynamicType),
-            V(commonMasks.dynamicType));
+  checkType('mapPassedToClosure', K(commonMasks.dynamicType),
+      V(commonMasks.dynamicType));
+  checkType('mapReturnedFromClosure', K(commonMasks.dynamicType),
+      V(commonMasks.dynamicType));
+  checkType('mapUsedWithNonOkSelector', K(commonMasks.dynamicType),
+      V(commonMasks.dynamicType));
+  checkType(
+      'mapPassedAsOptionalParameter', K(aKeyType), V(commonMasks.numType));
+  checkType('mapPassedAsNamedParameter', K(aKeyType), V(commonMasks.numType));
+  checkType('mapStoredInList', K(aKeyType), V(commonMasks.uint31Type));
+  checkType('mapStoredInListButEscapes', K(commonMasks.dynamicType),
+      V(commonMasks.dynamicType));
+  checkType('mapStoredInMap', K(aKeyType), V(commonMasks.uint31Type));
+  checkType('mapStoredInMapButEscapes', K(commonMasks.dynamicType),
+      V(commonMasks.dynamicType));
 
-        checkType('mapUnset', K(emptyType), V(emptyType));
-        checkType('mapOnlySetWithConstraint', K(aKeyType), V(emptyType));
-      }));
+  checkType('mapUnset', K(emptyType), V(emptyType));
+  checkType('mapOnlySetWithConstraint', K(aKeyType), V(emptyType));
 }
diff --git a/tests/compiler/dart2js/inference/show.dart b/tests/compiler/dart2js/inference/show.dart
index 6870b5f..3d7c465 100644
--- a/tests/compiler/dart2js/inference/show.dart
+++ b/tests/compiler/dart2js/inference/show.dart
@@ -4,9 +4,35 @@
 
 /// Helper program that shows the inferrer data on a dart program.
 
+import 'package:args/args.dart';
+import 'package:compiler/src/inferrer/inferrer_engine.dart';
+import '../equivalence/id_equivalence_helper.dart';
 import '../equivalence/show_helper.dart';
 import 'inference_test_helper.dart';
+import 'side_effects_test.dart';
+import 'callers_test.dart';
 
 main(List<String> args) async {
-  await show(args, computeMemberAstTypeMasks, computeMemberIrTypeMasks);
+  ArgParser argParser = createArgParser();
+  argParser.addFlag('inference', defaultsTo: true);
+  argParser.addFlag('side-effects', defaultsTo: false);
+  argParser.addFlag('callers', defaultsTo: false);
+  ArgResults results = argParser.parse(args);
+
+  ComputeMemberDataFunction astFunction;
+  ComputeMemberDataFunction kernelFunction;
+  if (results['side-effects']) {
+    astFunction = computeMemberAstSideEffects;
+    kernelFunction = computeMemberIrSideEffects;
+  }
+  if (results['callers']) {
+    InferrerEngineImpl.retainDataForTesting = true;
+    astFunction = computeMemberAstCallers;
+    kernelFunction = computeMemberIrCallers;
+  } else {
+    InferrerEngineImpl.useSorterForTesting = true;
+    astFunction = computeMemberAstTypeMasks;
+    kernelFunction = computeMemberIrTypeMasks;
+  }
+  await show(results, astFunction, kernelFunction);
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_callers_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_callers_test.dart
deleted file mode 100644
index 91fd918..0000000
--- a/tests/compiler/dart2js/inference/simple_inferrer_callers_test.dart
+++ /dev/null
@@ -1,67 +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 computation of callers of an element works when two
-// elements of the same name are being invoked in the same method.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/common_elements.dart';
-import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
-import 'package:compiler/src/world.dart' show ClosedWorld, ClosedWorldRefiner;
-
-import '../compiler_helper.dart';
-
-const String TEST = """
-class A {
-  var field;
-}
-
-class B {
-  var field;
-}
-
-main() {
-  new A().field;
-  new B().field;
-}
-""";
-
-// Create our own type inferrer to avoid clearing out the internal
-// data structures.
-class MyInferrer extends AstTypeGraphInferrer {
-  MyInferrer(compiler, closedWorld, closedWorldRefiner)
-      : super(compiler, closedWorld, closedWorldRefiner);
-  clear() {}
-}
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri, analyzeOnly: true);
-  asyncTest(() => compiler.run(uri).then((_) {
-        ElementEnvironment elementEnvironment =
-            compiler.frontendStrategy.elementEnvironment;
-        ClosedWorldRefiner closedWorldRefiner =
-            compiler.closeResolution(elementEnvironment.mainFunction);
-        ClosedWorld closedWorld =
-            compiler.resolutionWorldBuilder.closedWorldForTesting;
-        var inferrer =
-            new MyInferrer(compiler, closedWorld, closedWorldRefiner);
-        compiler.globalInference.typesInferrerInternal = inferrer;
-        compiler.globalInference.runGlobalTypeInference(
-            closedWorld.elementEnvironment.mainFunction,
-            closedWorld,
-            closedWorldRefiner);
-        var mainElement = findElement(compiler, 'main');
-        dynamic classA = findElement(compiler, 'A');
-        var fieldA = classA.lookupLocalMember('field');
-        dynamic classB = findElement(compiler, 'B');
-        var fieldB = classB.lookupLocalMember('field');
-
-        Expect.isTrue(inferrer.getCallersOf(fieldA).contains(mainElement));
-        Expect.isTrue(inferrer.getCallersOf(fieldB).contains(mainElement));
-      }));
-}
diff --git a/tests/compiler/dart2js/inlining/inlining_viewer.dart b/tests/compiler/dart2js/inlining/inlining_viewer.dart
index ed25d93..9ec0739 100644
--- a/tests/compiler/dart2js/inlining/inlining_viewer.dart
+++ b/tests/compiler/dart2js/inlining/inlining_viewer.dart
@@ -10,5 +10,6 @@
 
 main(List<String> args) async {
   JavaScriptBackend.cacheCodegenImpactForTesting = true;
-  await show(args, computeMemberAstInlinings, computeMemberIrInlinings);
+  await show(createArgParser().parse(args), computeMemberAstInlinings,
+      computeMemberIrInlinings);
 }
diff --git a/tests/compiler/dart2js/js/js_parser_test.dart b/tests/compiler/dart2js/js/js_parser_test.dart
index 7d76533..ac5c6a0 100644
--- a/tests/compiler/dart2js/js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js/js_parser_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 import 'package:expect/expect.dart';
 import 'package:compiler/src/js/js.dart' as jsAst;
 import 'package:compiler/src/js/js.dart' show js;
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 4fc6919..25e5600 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -72,8 +72,12 @@
 Expando<MemorySourceFileProvider> expando =
     new Expando<MemorySourceFileProvider>();
 
+// Cached kernel state for non-strong mode.
 fe.InitializedCompilerState kernelInitializedCompilerState;
 
+// Cached kernel state for strong mode.
+fe.InitializedCompilerState strongKernelInitializedCompilerState;
+
 /// memorySourceFiles can contain a map of string filename to string file
 /// contents or string file name to binary file contents (hence the `dynamic`
 /// type for the second parameter).
@@ -110,14 +114,20 @@
   if (beforeRun != null) {
     beforeRun(compiler);
   }
+  fe.InitializedCompilerState compilerState;
   bool isSuccess = await compiler.run(entryPoint);
   if (compiler.libraryLoader is KernelLibraryLoaderTask) {
     KernelLibraryLoaderTask loader = compiler.libraryLoader;
-    kernelInitializedCompilerState = loader.initializedCompilerState;
+    if (compiler.options.strongMode) {
+      compilerState = strongKernelInitializedCompilerState =
+          loader.initializedCompilerState;
+    } else {
+      compilerState =
+          kernelInitializedCompilerState = loader.initializedCompilerState;
+    }
   }
   return new CompilationResult(compiler,
-      isSuccess: isSuccess,
-      kernelInitializedCompilerState: kernelInitializedCompilerState);
+      isSuccess: isSuccess, kernelInitializedCompilerState: compilerState);
 }
 
 CompilerImpl compilerFor(
@@ -172,21 +182,25 @@
     outputProvider = const NullCompilerOutput();
   }
 
+  CompilerOptions compilerOptions = new CompilerOptions.parse(
+      entryPoint: entryPoint,
+      resolutionInputs: resolutionInputs,
+      libraryRoot: libraryRoot,
+      packageRoot: packageRoot,
+      options: options,
+      environment: {},
+      platformBinaries: platformBinaries,
+      packageConfig: packageConfig,
+      packagesDiscoveryProvider: packagesDiscoveryProvider);
+  if (compilerOptions.strongMode) {
+    compilerOptions.kernelInitializedCompilerState =
+        strongKernelInitializedCompilerState;
+  } else {
+    compilerOptions.kernelInitializedCompilerState =
+        kernelInitializedCompilerState;
+  }
   CompilerImpl compiler = new CompilerImpl(
-      provider,
-      outputProvider,
-      diagnosticHandler,
-      new CompilerOptions.parse(
-          entryPoint: entryPoint,
-          resolutionInputs: resolutionInputs,
-          libraryRoot: libraryRoot,
-          packageRoot: packageRoot,
-          options: options,
-          environment: {},
-          platformBinaries: platformBinaries,
-          packageConfig: packageConfig,
-          packagesDiscoveryProvider: packagesDiscoveryProvider)
-        ..kernelInitializedCompilerState = kernelInitializedCompilerState);
+      provider, outputProvider, diagnosticHandler, compilerOptions);
 
   if (cachedCompiler != null) {
     Map copiedLibraries = {};
diff --git a/tests/compiler/dart2js/data/mirrors_helper.dart b/tests/compiler/dart2js/mirrors/data/mirrors_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/data/mirrors_helper.dart
rename to tests/compiler/dart2js/mirrors/data/mirrors_helper.dart
diff --git a/tests/compiler/dart2js/output_type_test.dart b/tests/compiler/dart2js/output_type_test.dart
index 85338dd..0e07a75 100644
--- a/tests/compiler/dart2js/output_type_test.dart
+++ b/tests/compiler/dart2js/output_type_test.dart
@@ -79,7 +79,7 @@
     PRINT_GRAPH = true;
     TRACE_FILTER_PATTERN_FOR_TEST = 'x';
     await test([
-      'tests/compiler/dart2js/data/deferred_helper.dart',
+      'tests/compiler/dart2js/deferred/data/deferred_helper.dart',
       '--out=custom.js',
       '--deferred-map=def/deferred.json',
       Flags.dumpInfo,
@@ -111,7 +111,7 @@
 
     await test(
         [
-          'tests/compiler/dart2js/data/deferred_helper.dart',
+          'tests/compiler/dart2js/deferred/data/deferred_helper.dart',
           Flags.useContentSecurityPolicy,
         ]..addAll(additionOptionals),
         expectedOutput,
@@ -120,7 +120,7 @@
     if (!useKernel) {
       // Option --resolve-only is only supported for the old frontend.
       await test([
-        'tests/compiler/dart2js/data/deferred_helper.dart',
+        'tests/compiler/dart2js/deferred/data/deferred_helper.dart',
         '--out=custom.data',
         '--resolve-only',
       ], [
diff --git a/tests/compiler/dart2js/receiver_type_test.dart b/tests/compiler/dart2js/receiver_type_test.dart
index c408182..711633f 100644
--- a/tests/compiler/dart2js/receiver_type_test.dart
+++ b/tests/compiler/dart2js/receiver_type_test.dart
@@ -56,7 +56,9 @@
     TypeMask mask = new TypeMask.nonNullSubclass(cls, closedWorld);
     TypeMask receiverType = closedWorld.computeReceiverType(callSelector, mask);
     if (cls.isClosure) {
-      String expected = '$mask';
+      // TODO(johnniwinther): Expect mask based on 'cls' when all synthesized
+      // call methods are registered.
+      String expected = '[empty]'; //'$mask';
       Expect.equals(expected, '${receiverType}',
           "Unexpected receiver type for $callSelector on $mask");
       closureCount++;
diff --git a/tests/compiler/dart2js/rti/data/type_literal.dart b/tests/compiler/dart2js/rti/data/type_literal.dart
index 5e09e8a..4cc8c0b 100644
--- a/tests/compiler/dart2js/rti/data/type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal.dart
@@ -4,9 +4,66 @@
 
 /*class: A:needsArgs,exp*/
 class A<T> {
-  m() => T;
+  instanceMethod() => T;
+
+  /*ast.element: A.staticMethod:exp*/
+  /*kernel.element: A.staticMethod:needsArgs,exp*/
+  static staticMethod<S>() => S;
+
+  /*ast.element: A.staticMethodNested:exp*/
+  /*kernel.element: A.staticMethodNested:needsArgs,exp*/
+  static staticMethodNested<S>() {
+    var inner = () => S;
+    return inner();
+  }
+
+  /*ast.element: A.genericMethod:exp*/
+  /*kernel.element: A.genericMethod:needsArgs,exp*/
+  genericMethod<S>() => S;
+
+  /*ast.element: A.genericMethodNested:exp*/
+  /*kernel.element: A.genericMethodNested:needsArgs,exp*/
+  genericMethodNested<S>() {
+    var inner = () => S;
+    return inner();
+  }
+
+  localFunction() {
+    /*ast.exp*/ /*kernel.needsArgs,exp*/ local<S>() => S;
+
+    return local<bool>();
+  }
+
+  localFunctionNested() {
+    /*ast.exp*/ /*kernel.needsArgs,exp*/ local<S>() {
+      var inner = () => S;
+      return inner();
+    }
+
+    return local<bool>();
+  }
+}
+
+/*ast.element: topLevelMethod:exp*/
+/*kernel.element: topLevelMethod:needsArgs,exp*/
+topLevelMethod<S>() => S;
+
+/*ast.element: topLevelMethodNested:exp*/
+/*kernel.element: topLevelMethodNested:needsArgs,exp*/
+topLevelMethodNested<S>() {
+  var inner = () => S;
+  return inner();
 }
 
 main() {
-  new A<int>().m();
+  var a = new A<int>();
+  a.instanceMethod();
+  a.genericMethod<String>();
+  a.genericMethodNested<String>();
+  a.localFunction();
+  a.localFunctionNested();
+  A.staticMethod<double>();
+  A.staticMethodNested<double>();
+  topLevelMethod<num>();
+  topLevelMethodNested<num>();
 }
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index 5ca31af..18981ca 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -41,10 +41,11 @@
 };
 
 main() {
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
     CompilationResult result = await runCompiler(
         memorySourceFiles: {'main.dart': code},
-        options: [Flags.disableRtiOptimization, Flags.disableInlining]);
+        options: [Flags.disableRtiOptimization, Flags.disableInlining]
+          ..addAll(useKernel ? [Flags.useKernel] : []));
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
@@ -80,6 +81,13 @@
     LibraryEntity library = elementEnvironment.mainLibrary;
     elementEnvironment.forEachClass(library, processClass);
     elementEnvironment.forEachLibraryMember(library, processMember);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/rti/rti_need_test.dart b/tests/compiler/dart2js/rti/rti_need_test.dart
index ba20c2f..67de10c 100644
--- a/tests/compiler/dart2js/rti/rti_need_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test.dart
@@ -17,6 +17,7 @@
 import 'package:compiler/src/js_backend/runtime_types.dart';
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/ssa/builder.dart' as ast;
 import 'package:compiler/src/universe/world_builder.dart';
 import 'package:kernel/ast.dart' as ir;
@@ -114,7 +115,7 @@
     }
     ClassEntity frontendClass = getFrontendClass(backendClass);
     comma = findDependencies(sb, comma, frontendClass);
-    if (rtiNeedBuilder.classesUsingTypeVariableExpression
+    if (rtiNeedBuilder.classesUsingTypeVariableLiterals
         .contains(frontendClass)) {
       sb.write('${comma}exp');
       comma = ',';
@@ -146,16 +147,30 @@
         sb.write('${comma}needsSignature');
         comma = ',';
       }
-      if (frontendClosure != null &&
-          rtiNeed.localFunctionNeedsSignature(frontendClosure)) {
-        sb.write('${comma}needsSignature');
-        comma = ',';
+      if (frontendClosure != null) {
+        if (frontendClosure is LocalFunctionElement &&
+            rtiNeed.localFunctionNeedsSignature(frontendClosure)) {
+          sb.write('${comma}needsSignature');
+          comma = ',';
+        }
+        if (rtiNeedBuilder.localFunctionsUsingTypeVariableLiterals
+            .contains(frontendClosure)) {
+          sb.write('${comma}exp');
+          comma = ',';
+        }
       }
-      comma = findDependencies(sb, comma, frontendMember);
-      comma = findChecks(
-          sb, comma, 'explicit', frontendMember, rtiNeedBuilder.isChecks);
-      comma = findChecks(sb, comma, 'implicit', frontendMember,
-          rtiNeedBuilder.implicitIsChecks);
+      if (frontendMember != null) {
+        if (rtiNeedBuilder.methodsUsingTypeVariableLiterals
+            .contains(frontendMember)) {
+          sb.write('${comma}exp');
+          comma = ',';
+        }
+        comma = findDependencies(sb, comma, frontendMember);
+        comma = findChecks(
+            sb, comma, 'explicit', frontendMember, rtiNeedBuilder.isChecks);
+        comma = findChecks(sb, comma, 'implicit', frontendMember,
+            rtiNeedBuilder.implicitIsChecks);
+      }
     }
     return sb.toString();
   }
@@ -332,7 +347,17 @@
   }
 
   @override
-  Local getFrontendClosure(MemberEntity member) => null;
+  Local getFrontendClosure(MemberEntity member) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    ir.Node node = backendStrategy.elementMap.getMemberDefinition(member).node;
+    if (node is ir.FunctionDeclaration || node is ir.FunctionExpression) {
+      KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
+      KernelToElementMapForImpact frontendElementMap =
+          frontendStrategy.elementMap;
+      return frontendElementMap.getLocalFunction(node);
+    }
+    return null;
+  }
 }
 
 class RtiClassNeedIrComputer extends DataRegistry
diff --git a/tests/compiler/dart2js/serialization/equivalence_test.dart b/tests/compiler/dart2js/serialization/equivalence_test.dart
index 1508168..8aa3f25 100644
--- a/tests/compiler/dart2js/serialization/equivalence_test.dart
+++ b/tests/compiler/dart2js/serialization/equivalence_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 library dart2js.serialization_test;
 
 import 'dart:io';
diff --git a/tests/compiler/dart2js/serialization/impact_test.dart b/tests/compiler/dart2js/serialization/impact_test.dart
index 3b40213..1e5ce1e 100644
--- a/tests/compiler/dart2js/serialization/impact_test.dart
+++ b/tests/compiler/dart2js/serialization/impact_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 library dart2js.serialization_impact_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/serialization/model0_test.dart b/tests/compiler/dart2js/serialization/model0_test.dart
index c4ef537..3731bd1 100644
--- a/tests/compiler/dart2js/serialization/model0_test.dart
+++ b/tests/compiler/dart2js/serialization/model0_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 library dart2js.serialization.model0_test;
 
 import 'model_test_helper.dart' as test;
diff --git a/tests/compiler/dart2js/serialization/reserialization_test.dart b/tests/compiler/dart2js/serialization/reserialization_test.dart
index 540541b..8814e54 100644
--- a/tests/compiler/dart2js/serialization/reserialization_test.dart
+++ b/tests/compiler/dart2js/serialization/reserialization_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 library dart2js.reserialization_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/serialization/resolved_ast_test.dart b/tests/compiler/dart2js/serialization/resolved_ast_test.dart
index 191cea5..5c7b3a1 100644
--- a/tests/compiler/dart2js/serialization/resolved_ast_test.dart
+++ b/tests/compiler/dart2js/serialization/resolved_ast_test.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.
 
+// VMOptions= --no_limit_ints_to_64_bits
 library dart2js.serialization_resolved_ast_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart b/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
index 9f0bccb..f12212a 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
@@ -648,7 +648,9 @@
   final String name;
   final int offset;
 
-  CodeLocation(this.uri, this.name, this.offset);
+  CodeLocation(this.uri, this.name, this.offset) {
+    assert(uri != null);
+  }
 
   String toString() => '$uri:$name:$offset';
 
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
index 23aede2..75c211b 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
@@ -180,6 +180,12 @@
           if (interval != null && interval.contains(sourcePosition)) {
             AstElement innerElement = findInnermost(element);
             String expectedName = computeElementNameForSourceMaps(innerElement);
+            int stubIndex = name.indexOf('[function-entry');
+            if (stubIndex != -1) {
+              Expect.isTrue(innerElement is FunctionElement,
+                  "Unexpected element $innerElement for stub '$name'.");
+              name = name.substring(0, stubIndex);
+            }
             if (name != expectedName) {
               // For the code
               //    (){}();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
new file mode 100644
index 0000000..f9a6d06
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:meta/dart2js.dart';
+
+main() {
+  var c = new Class();
+  c. /*1:main*/ instancePositional1(0);
+}
+
+class Class {
+  @noInline
+  /*2:Class.instancePositional1[function-entry$1]*/ instancePositional1(a,
+      [b = 42, c = 87]) {
+    print('instancePositional1($a,$b,$c)');
+    /*3:Class.instancePositional1*/ instancePositional2(1, 2);
+  }
+
+  @noInline
+  /*4:Class.instancePositional2[function-entry$2]*/ instancePositional2(a,
+      [b = 42, c = 87]) {
+    print('instancePositional2($a,$b,$c)');
+    /*5:Class.instancePositional2*/ instancePositional3(3, 4, 5);
+  }
+
+  @noInline
+  instancePositional3(a, [b = 42, c = 87]) {
+    print('instancePositional3($a,$b,$c)');
+    /*6:Class.instancePositional3*/ instanceNamed1(0);
+  }
+
+  @noInline
+  /*7:Class.instanceNamed1[function-entry$1]*/ instanceNamed1(a,
+      {b: 42, c: 87, d: 735}) {
+    print('instanceNamed1($a,b:$b,c:$c,d:$d)');
+    /*8:Class.instanceNamed1*/ instanceNamed2(1, b: 2);
+  }
+
+  @noInline
+  /*9:Class.instanceNamed2[function-entry$1$b]*/ instanceNamed2(a,
+      {b: 42, c: 87, d: 735}) {
+    print('instanceNamed2($a,b:$b,c:$c,d:$d)');
+    /*10:Class.instanceNamed2*/ instanceNamed3(3, c: 123);
+  }
+
+  @noInline
+  /*11:Class.instanceNamed3[function-entry$1$c]*/ instanceNamed3(a,
+      {b: 42, c: 87, d: 735}) {
+    print('instanceNamed3($a,b:$b,c:$c,d:$d)');
+    /*12:Class.instanceNamed3*/ instanceNamed4(4, c: 45, b: 76);
+  }
+
+  @noInline
+  /*13:Class.instanceNamed4[function-entry$1$b$c]*/ instanceNamed4(a,
+      {b: 42, c: 87, d: 735}) {
+    print('instanceNamed4($a,b:$b,c:$c,d:$d)');
+    /*14:Class.instanceNamed4*/ instanceNamed5(5, c: 6, b: 7, d: 8);
+  }
+
+  @noInline
+  instanceNamed5(a, {b: 42, c: 87, d: 735}) {
+    print('instanceNamed5($a,b:$b,c:$c,d:$d)');
+    /*18:Class.instanceNamed5[function-entry$0].local*/ local([e = 42]) {
+      print('instanceNamed5.local($e)');
+      /*19:Class.instanceNamed5.local*/ throw '>ExceptionMarker<';
+    }
+
+    var anonymous = /*16:Class.instanceNamed5[function-entry$0].<anonymous function>*/ (
+        {f: 87}) {
+      print('instanceNamed5.<anonymous(f:$f)');
+      /*17:Class.instanceNamed5.<anonymous function>*/ local();
+    };
+    anonymous. /*15:Class.instanceNamed5*/ call();
+  }
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index 12fd748..76ed3de 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
@@ -92,7 +92,11 @@
       jsPreambles: (input, output) =>
           ['sdk/lib/_internal/js_runtime/lib/preambles/d8.js'],
       afterExceptions: testAfterExceptions,
-      beforeExceptions: beforeExceptions);
+      beforeExceptions: beforeExceptions,
+      verbose: verbose,
+      printJs: printJs,
+      writeJs: writeJs,
+      stackTraceLimit: 100);
 }
 
 /// Lines allowed before the intended stack trace. Typically from helper
@@ -119,4 +123,13 @@
   const LineException('_Future._propagateToListeners', 'future_impl.dart'),
   const LineException(
       '_Future._addListener.<anonymous function>', 'future_impl.dart'),
+  const LineException('_microtaskLoop', 'schedule_microtask.dart'),
+  const LineException('_startMicrotaskLoop', 'schedule_microtask.dart'),
+  const LineException('_AsyncRun._scheduleImmediateJsOverride.internalCallback',
+      'async_patch.dart'),
+  const LineException('invokeClosure.<anonymous function>', 'js_helper.dart'),
+  const LineException('_IsolateContext.eval', 'isolate_helper.dart'),
+  const LineException('_callInIsolate', 'isolate_helper.dart'),
+  const LineException('invokeClosure', 'js_helper.dart'),
+  const LineException('convertDartClosureToJS', 'js_helper.dart'),
 ];
diff --git a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
index 2a1a1f1..194dfed 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
@@ -598,8 +598,9 @@
 </html>
 ''');
 
-  new File(out).writeAsStringSync(sb.toString());
-  print('Diff generated in $out');
+  File file = new File(out);
+  file.writeAsStringSync(sb.toString());
+  print('Diff generated in ${file.absolute.uri}');
 }
 
 class CodeLinesResult {
@@ -729,9 +730,11 @@
       locations = [];
     }
     List<CodeLocation> codeLocations = locations
+        .where((l) => l.sourceUri != null)
         .map((l) => new CodeLocation(l.sourceUri, l.sourceName, l.offset))
         .toList();
     List<CodeSource> codeSourceList = locations
+        .where((l) => l.sourceUri != null)
         .map(codeSources.sourceLocationToCodeSource)
         .where((c) => c != null)
         .toList();
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
index a7e9645..f1c2423 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
@@ -158,7 +158,7 @@
     {bool verbose: true}) async {
   SourceMapProcessor processor = new SourceMapProcessor(uri);
   SourceMaps sourceMaps = await processor.process(
-      ['--csp', '--disable-inlining']..addAll(options),
+      [Flags.useContentSecurityPolicy, Flags.disableInlining]..addAll(options),
       verbose: verbose);
   TestResult result = new TestResult(config, filename, processor);
   for (SourceMapInfo info in sourceMaps.elementSourceMapInfos.values) {
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index eeb49d4..933e5f3 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -6,20 +6,14 @@
 recursive_import_test: Skip # Issue 27441
 
 [ $compiler == dart2js ]
-21579_test: Crash # Issue 31762
 class_test: Fail
 constant_javascript_semantics4_test: Fail, OK
-constant_javascript_semantics_test/01: Crash # Issue 31762
-constant_javascript_semantics_test/02: Crash # Issue 31762
-constant_javascript_semantics_test/03: Crash # Issue 31762
-constant_javascript_semantics_test/04: Crash # Issue 31762
-constant_javascript_semantics_test/none: Crash # Issue 31762
 dummy_compiler_test: Slow, Pass
+local_function_call_test: RuntimeError # Issue 31879
 mirror_printer_test: Pass, Slow # Issue 25940, 16473
 mirrors_used_closure_test: Fail # Issue 17939
 no_such_method_test: Fail # Wrong Invocation.memberName.
 recursive_import_test: Slow, Pass
-round_constant_folding_test: Crash # Issue 31762
 statements_test: Fail
 typed_locals_test: Fail
 
@@ -84,7 +78,6 @@
 deferred/deferred_mirrors2_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred/reflect_multiple_annotations_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred/reflect_multiple_default_arg_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred/uninstantiated_type_variable_test: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 deferred_custom_loader_test: RuntimeError
 deferred_fail_and_retry_test: RuntimeError
 deferred_fail_and_retry_worker_test: Fail
@@ -120,8 +113,6 @@
 recursive_import_test: CompileTimeError
 reflect_native_types_test: RuntimeError
 regress/4562_test/none: CompileTimeError
-string_interpolation_dynamic_test: RuntimeError
-string_interpolation_test: RuntimeError
 type_constant_switch_test/01: MissingCompileTimeError
 unconditional_dartio_import_test: RuntimeError
 
@@ -132,15 +123,9 @@
 js_interop_test: RuntimeError # Issue 31082
 
 [ $compiler == dart2js && $dart2js_with_kernel ]
-21579_test: CompileTimeError # Large integer literal
-constant_javascript_semantics_test/01: Pass # Issue 31762
-constant_javascript_semantics_test/02: Pass # Issue 31762
-constant_javascript_semantics_test/03: CompileTimeError # Large integer literal
-constant_javascript_semantics_test/04: CompileTimeError # Large integer literal
-constant_javascript_semantics_test/none: CompileTimeError # Large integer literal
 dummy_compiler_test: Crash # Issue 31715
 recursive_import_test: Crash # Issue 31715
-round_constant_folding_test: CompileTimeError # Large integer literal
+typevariable_typedef_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(A.T) in (local(A.foo#func)) for j:constructor(B.).
 
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 23056_test: Pass
@@ -164,91 +149,95 @@
 private_symbol_literal_test/06: MissingCompileTimeError
 recursive_import_test: CompileTimeError
 regress/4562_test/none: CompileTimeError
-string_interpolation_dynamic_test: RuntimeError
-string_interpolation_test: RuntimeError
 type_constant_switch_test/01: MissingCompileTimeError
 unconditional_dartio_import_test: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
-21666_test: RuntimeError
+21666_test: CompileTimeError
+23056_test: CompileTimeError
 closure_capture2_test: RuntimeError
-closure_type_reflection2_test: RuntimeError
-closure_type_reflection_test: RuntimeError
+closure_type_reflection2_test: CompileTimeError
+closure_type_reflection_test: CompileTimeError
 constant_javascript_semantics_test/01: MissingCompileTimeError
-deferred/deferred_mirrors1_test: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
-deferred/deferred_mirrors2_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred/reflect_multiple_annotations_test: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
-deferred/reflect_multiple_default_arg_test: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
+deferred/deferred_mirrors1_test: CompileTimeError
+deferred/deferred_mirrors2_test: CompileTimeError
+deferred/reflect_multiple_annotations_test: CompileTimeError
+deferred/reflect_multiple_default_arg_test: CompileTimeError
 deferred_custom_loader_test: RuntimeError
 deferred_fail_and_retry_test: RuntimeError
 deferred_fail_and_retry_worker_test: Fail
-invalid_annotation2_test/none: RuntimeError
+inference_nsm_mirrors_test: CompileTimeError
+invalid_annotation2_test/none: CompileTimeError
 label_test/06: MissingCompileTimeError
-mirror_invalid_field_access2_test: RuntimeError
-mirror_invalid_field_access3_test: RuntimeError
-mirror_invalid_field_access4_test: RuntimeError
-mirror_invalid_field_access_test: RuntimeError
-mirror_invalid_invoke2_test: RuntimeError
-mirror_invalid_invoke3_test: RuntimeError
-mirror_invalid_invoke_test: RuntimeError
-mirror_printer_test/01: RuntimeError
-mirror_printer_test/none: RuntimeError
-mirror_test: RuntimeError
-mirror_type_inference_field2_test: RuntimeError
-mirror_type_inference_field_test: RuntimeError
-mirror_type_inference_function_test: RuntimeError
-mirrors_declarations_filtering_test: RuntimeError
-mirrors_used_metatargets_test: RuntimeError
-mirrors_used_native_test: RuntimeError
-mirrors_used_warning2_test: RuntimeError
-mirrors_used_warning_test/minif: RuntimeError
-mirrors_used_warning_test/none: RuntimeError
+mirror_enqueuer_regression_test: CompileTimeError
+mirror_invalid_field_access2_test: CompileTimeError
+mirror_invalid_field_access3_test: CompileTimeError
+mirror_invalid_field_access4_test: CompileTimeError
+mirror_invalid_field_access_test: CompileTimeError
+mirror_invalid_invoke2_test: CompileTimeError
+mirror_invalid_invoke3_test: CompileTimeError
+mirror_invalid_invoke_test: CompileTimeError
+mirror_printer_test/01: CompileTimeError
+mirror_printer_test/none: CompileTimeError
+mirror_test: CompileTimeError
+mirror_type_inference_field2_test: CompileTimeError
+mirror_type_inference_field_test: CompileTimeError
+mirror_type_inference_function_test: CompileTimeError
+mirrors_declarations_filtering_test: CompileTimeError
+mirrors_used_metatargets_test: CompileTimeError
+mirrors_used_native_test: CompileTimeError
+mirrors_used_warning2_test: CompileTimeError
+mirrors_used_warning_test/minif: CompileTimeError
+mirrors_used_warning_test/none: CompileTimeError
+no_such_method_mirrors_test: CompileTimeError
 private_symbol_literal_test/01: MissingCompileTimeError
 private_symbol_literal_test/02: MissingCompileTimeError
 private_symbol_literal_test/03: MissingCompileTimeError
 private_symbol_literal_test/04: MissingCompileTimeError
 private_symbol_literal_test/05: MissingCompileTimeError
 private_symbol_literal_test/06: MissingCompileTimeError
-reflect_native_types_test: RuntimeError
+reflect_native_types_test: CompileTimeError
 regress/4562_test/none: CompileTimeError
-string_interpolation_dynamic_test: RuntimeError
-string_interpolation_test: RuntimeError
 type_constant_switch_test/01: MissingCompileTimeError
 unconditional_dartio_import_test: RuntimeError # Issue 30902
 
 [ $compiler == dart2js && $dart2js_with_kernel && $minified ]
-21666_test: RuntimeError
-closure_type_reflection2_test: RuntimeError
-closure_type_reflection_test: RuntimeError
+21666_test: CompileTimeError
+23056_test: CompileTimeError
+closure_type_reflection2_test: CompileTimeError
+closure_type_reflection_test: CompileTimeError
 constant_javascript_semantics_test/01: MissingCompileTimeError
-deferred/deferred_mirrors1_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred/deferred_mirrors2_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
+deferred/deferred_mirrors1_test: CompileTimeError
+deferred/deferred_mirrors2_test: CompileTimeError
 deferred/reflect_multiple_annotations_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 deferred/reflect_multiple_default_arg_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 deferred_custom_loader_test: RuntimeError
 deferred_fail_and_retry_test: RuntimeError
 deferred_fail_and_retry_worker_test: Fail
 dummy_compiler_test: CompileTimeError
-invalid_annotation2_test/none: RuntimeError
+inference_nsm_mirrors_test: CompileTimeError
+invalid_annotation2_test/none: CompileTimeError
 label_test/06: MissingCompileTimeError
-mirror_invalid_field_access2_test: RuntimeError
-mirror_invalid_field_access3_test: RuntimeError
-mirror_invalid_field_access4_test: RuntimeError
-mirror_invalid_field_access_test: RuntimeError
-mirror_invalid_invoke2_test: RuntimeError
-mirror_invalid_invoke3_test: RuntimeError
-mirror_invalid_invoke_test: RuntimeError
-mirror_printer_test/01: RuntimeError
-mirror_printer_test/none: RuntimeError
-mirror_test: RuntimeError
-mirror_type_inference_field2_test: RuntimeError
-mirror_type_inference_field_test: RuntimeError
-mirror_type_inference_function_test: RuntimeError
-mirrors_declarations_filtering_test: RuntimeError
-mirrors_used_metatargets_test: RuntimeError
-mirrors_used_native_test: RuntimeError
-mirrors_used_warning2_test: RuntimeError
-mirrors_used_warning_test/none: RuntimeError
+mirror_enqueuer_regression_test: CompileTimeError
+mirror_invalid_field_access2_test: CompileTimeError
+mirror_invalid_field_access3_test: CompileTimeError
+mirror_invalid_field_access4_test: CompileTimeError
+mirror_invalid_field_access_test: CompileTimeError
+mirror_invalid_invoke2_test: CompileTimeError
+mirror_invalid_invoke3_test: CompileTimeError
+mirror_invalid_invoke_test: CompileTimeError
+mirror_printer_test/01: CompileTimeError
+mirror_printer_test/none: CompileTimeError
+mirror_test: CompileTimeError
+mirror_type_inference_field2_test: CompileTimeError
+mirror_type_inference_field_test: CompileTimeError
+mirror_type_inference_function_test: CompileTimeError
+mirrors_declarations_filtering_test: CompileTimeError
+mirrors_used_metatargets_test: CompileTimeError
+mirrors_used_native_test: CompileTimeError
+mirrors_used_warning2_test: CompileTimeError
+mirrors_used_warning_test/none: CompileTimeError
+no_such_method_mirrors_test: CompileTimeError
 private_symbol_literal_test/01: MissingCompileTimeError
 private_symbol_literal_test/02: MissingCompileTimeError
 private_symbol_literal_test/03: MissingCompileTimeError
@@ -256,16 +245,16 @@
 private_symbol_literal_test/05: MissingCompileTimeError
 private_symbol_literal_test/06: MissingCompileTimeError
 recursive_import_test: CompileTimeError
-reflect_native_types_test: RuntimeError
+reflect_native_types_test: CompileTimeError
 regress/4562_test/none: CompileTimeError
-string_interpolation_dynamic_test: RuntimeError
-string_interpolation_test: RuntimeError
 type_constant_switch_test/01: MissingCompileTimeError
 unconditional_dartio_import_test: RuntimeError # Issue 30902
 
 [ $compiler == dart2js && !$dart2js_with_kernel ]
 expose_this1_test: RuntimeError # Issue 31254
 expose_this2_test: RuntimeError # Issue 31254
+string_interpolation_dynamic_test: Fail # CRLF handling clarified, see Issue 23562
+string_interpolation_test: Fail # CRLF handling clarified, see Issue 23562
 
 [ $compiler == dart2js && $fast_startup ]
 21666_test: Fail # mirrors not supported
@@ -311,8 +300,9 @@
 mirrors_used_warning_test/minif: Fail, OK # Tests warning that minified code will be broken.
 runtime_type_test: Fail, OK # Tests extected output of Type.toString().
 to_string_test: Fail # Issue 7179.
+typevariable_typedef_test: Fail, OK # Tests extected output of Type.toString().
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == chromeOnAndroid || $runtime == drt || $runtime == ff || $runtime == safari || $runtime == safarimobilesim) ]
+[ $compiler == dart2js && ($runtime == chrome || $runtime == chromeOnAndroid || $runtime == drt || $runtime == ff || $runtime == safari) ]
 isolate2_test/01: Fail # Issue 14458.
 
 [ $compiler == dart2js && ($runtime == chrome || $runtime == d8 || $runtime == drt) ]
diff --git a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
index ab10b07..91e9487 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/string_interpolation_test.dart b/tests/compiler/dart2js_extra/string_interpolation_test.dart
index 3407260..beded4c 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/typevariable_typedef_test.dart b/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
new file mode 100644
index 0000000..5dc6d2b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+typedef T Func<T>(T x);
+
+class A<T> {
+  final Box<T> box;
+  A._(this.box);
+  A.foo(Func<T> func) : this._(new Box<T>(func));
+}
+
+class Box<T> {
+  final Func<T> func;
+  Box(this.func);
+}
+
+class B extends A {
+  B() : super.foo((x) => x);
+}
+
+main() {
+  var x = new B();
+  Expect.equals(x.runtimeType.toString(), 'B');
+}
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index c339153..29cb393 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -40,11 +40,12 @@
 bound_closure_super_test: RuntimeError
 compute_this_script_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/types.dart': Failed assertion: line 63 pos 12: '!result.isEmpty': is not true.
 fake_thing_test: RuntimeError
-mirror_intercepted_field_test: RuntimeError
+mirror_intercepted_field_test: CompileTimeError
 native_library_same_name_used_frog_test: CompileTimeError
-native_mirror_test: RuntimeError
-native_no_such_method_exception4_frog_test: RuntimeError
-native_no_such_method_exception5_frog_test: RuntimeError
+native_mirror_test: CompileTimeError
+native_no_such_method_exception3_frog_test: CompileTimeError
+native_no_such_method_exception4_frog_test: CompileTimeError
+native_no_such_method_exception5_frog_test: CompileTimeError
 subclassing_constructor_1_test: RuntimeError
 subclassing_super_call_test: RuntimeError
 subclassing_super_field_1_test: RuntimeError
@@ -53,11 +54,12 @@
 [ $compiler == dart2js && $dart2js_with_kernel && $minified ]
 bound_closure_super_test: RuntimeError
 fake_thing_test: RuntimeError
-mirror_intercepted_field_test: RuntimeError
+mirror_intercepted_field_test: CompileTimeError
 native_library_same_name_used_frog_test: CompileTimeError
-native_mirror_test: RuntimeError
-native_no_such_method_exception4_frog_test: RuntimeError
-native_no_such_method_exception5_frog_test: RuntimeError
+native_mirror_test: CompileTimeError
+native_no_such_method_exception3_frog_test: CompileTimeError
+native_no_such_method_exception4_frog_test: CompileTimeError
+native_no_such_method_exception5_frog_test: CompileTimeError
 optimization_hints_test: RuntimeError
 subclassing_constructor_1_test: RuntimeError
 subclassing_super_call_test: RuntimeError
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index e418d9e..8a40903 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -12,33 +12,7 @@
 string_test: StaticWarning, OK # Test generates error on purpose.
 
 [ $compiler == dart2js ]
-bit_twiddling_bigint_test: Crash # Issue 31762
-bit_twiddling_test: Crash # Issue 31762
-double_ceil_test: Crash # Issue 31762
-double_floor_test: Crash # Issue 31762
-double_round_test: Crash # Issue 31762
-double_truncate_test: Crash # Issue 31762
-int_ceil_test: Crash # Issue 31762
-int_ceil_to_double_test: Crash # Issue 31762
-int_floor_test: Crash # Issue 31762
-int_floor_to_double_test: Crash # Issue 31762
-int_from_environment_test: Crash # Issue 31762
-int_modulo_arith_test/bignum: Crash # Issue 31762
-int_modulo_arith_test/modPow: Crash # Issue 31762
-int_modulo_arith_test/none: Crash # Issue 31762
-int_parse_radix_test/02: Crash # Issue 31762
-int_round_test: Crash # Issue 31762
-int_round_to_double_test: Crash # Issue 31762
-int_to_int_test: Crash # Issue 31762
-int_truncate_test: Crash # Issue 31762
-int_truncate_to_double_test: Crash # Issue 31762
-integer_to_radix_string_test: Crash # Issue 31762
-integer_to_string_test/01: Crash # Issue 31762
-num_parse_test/01: Crash # Issue 31762
-num_parse_test/none: Crash # Issue 31762
-num_sign_test: Crash # Issue 31762
 regexp/pcre_test: Pass, Slow # Issue 21593
-regress_r21715_test: Crash # Issue 31762
 
 [ $compiler == precompiler ]
 apply3_test: SkipByDesign # Imports dart:mirrors
@@ -89,6 +63,11 @@
 string_case_test/01: RuntimeError # jsshell does not recognize character 223 aka \xdf
 unicode_test: RuntimeError # jsshell does not recognize character 223 aka \xdf
 
+[ $runtime == safari ]
+double_round3_test: RuntimeError
+double_round_to_double2_test: Pass, Fail, OK
+string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
+
 [ $strong ]
 *: SkipByDesign # tests/corelib_2 has the strong mode versions of these tests.
 
@@ -133,12 +112,6 @@
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
-string_split_test: RuntimeError # Issue 21431
-string_trimlr_test/01: Fail
-string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
 [ $compiler == dart2js && !$browser ]
 package_resource_test: RuntimeError # Issue 26842
 
@@ -245,7 +218,7 @@
 symbol_test/03: MissingCompileTimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
-apply3_test: RuntimeError
+apply3_test: CompileTimeError
 big_integer_arith_vm_test/add: RuntimeError
 big_integer_arith_vm_test/div: RuntimeError
 big_integer_arith_vm_test/gcd: RuntimeError
@@ -288,7 +261,7 @@
 symbol_test/03: MissingCompileTimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $minified ]
-apply3_test: RuntimeError
+apply3_test: CompileTimeError
 big_integer_arith_vm_test/add: RuntimeError
 big_integer_arith_vm_test/div: RuntimeError
 big_integer_arith_vm_test/gcd: RuntimeError
@@ -404,15 +377,10 @@
 *: Skip
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
+big_integer_arith_vm_test: CompileTimeError # Large integer literal
 big_integer_parsed_arith_vm_test: RuntimeError # Large integers
 big_integer_parsed_div_rem_vm_test: RuntimeError # Large integers
 big_integer_parsed_mul_div_vm_test: RuntimeError # Large integers
-regexp/capture-3: Pass, Slow, Timeout # Issues 21593 and 22008
-regexp/global_test: Skip # Timeout. Issue 21709 and 21708
-regexp/pcre_test: Pass, Slow, Timeout # Issues 21593 and 22008
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm || ($compiler == dart2js && $dart2js_with_kernel) ]
-big_integer_arith_vm_test: CompileTimeError # Large integer literal
 bit_twiddling_bigint_test: CompileTimeError # Large integer literal
 bit_twiddling_test: CompileTimeError # Large integer literal
 double_ceil_test: CompileTimeError # Large integer literal
@@ -436,6 +404,9 @@
 num_parse_test/01: CompileTimeError # Large integer literal
 num_parse_test/none: CompileTimeError # Large integer literal
 num_sign_test: CompileTimeError # Large integer literal
+regexp/capture-3: Pass, Slow, Timeout # Issues 21593 and 22008
+regexp/global_test: Skip # Timeout. Issue 21709 and 21708
+regexp/pcre_test: Pass, Slow, Timeout # Issues 21593 and 22008
 regress_r21715_test: CompileTimeError # Large integer literal
 
 # Firefox takes advantage of the ECMAScript number parsing cop-out clause
@@ -446,11 +417,6 @@
 [ $runtime == ff || $runtime == jsshell ]
 double_parse_test/02: Fail, OK
 
-[ $runtime == safari || $runtime == safarimobilesim ]
-double_round3_test: RuntimeError
-double_round_to_double2_test: Pass, Fail, OK
-string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
 [ $hot_reload || $hot_reload_rollback ]
 big_integer_huge_mul_vm_test: Pass, Slow # Slow
 big_integer_parsed_mul_div_vm_test: Pass, Slow # Slow.
diff --git a/tests/corelib_2/cast_test.dart b/tests/corelib_2/cast_test.dart
index b4e805c..feee4e2 100644
--- a/tests/corelib_2/cast_test.dart
+++ b/tests/corelib_2/cast_test.dart
@@ -18,7 +18,7 @@
   // Down-cast
   {
     // An iterable that (likely) can do direct access.
-    var dIterable = Iterable.castTo<C, D>(iterable);
+    var dIterable = Iterable.castFrom<C, D>(iterable);
 
     Expect.throws(() => dIterable.first, null, "1.first");
     Expect.equals(d, dIterable.elementAt(1));
@@ -31,7 +31,7 @@
 
   {
     // An iterable that cannot do direct access.
-    var dIterable2 = Iterable.castTo<C, D>(iterable.where((_) => true));
+    var dIterable2 = Iterable.castFrom<C, D>(iterable.where((_) => true));
 
     Expect.throws(() => dIterable2.first, null, "2.first");
     Expect.equals(d, dIterable2.elementAt(1));
@@ -46,7 +46,7 @@
     // Iterable that definitely won't survive accessing element 2.
     var iterable3 = new Iterable<C>.generate(
         elements.length, (n) => n == 3 ? throw "untouchable" : elements[n]);
-    var dIterable3 = Iterable.castTo<C, D>(iterable3);
+    var dIterable3 = Iterable.castFrom<C, D>(iterable3);
 
     Expect.throws(() => dIterable3.first, null, "3.first");
     Expect.equals(d, dIterable3.elementAt(1));
@@ -60,7 +60,7 @@
 
   // Up-cast.
   {
-    var oIterable4 = Iterable.castTo<C, Object>(iterable);
+    var oIterable4 = Iterable.castFrom<C, Object>(iterable);
     Expect.listEquals(elements, oIterable4.toList());
   }
 }
@@ -68,7 +68,7 @@
 void testList() {
   // Down-cast.
   var list = new List<C>.from(elements);
-  var dList = List.castTo<C, D>(list);
+  var dList = List.castFrom<C, D>(list);
 
   Expect.throws(() => dList.first); // C is not D.
   Expect.equals(d, dList[1]);
@@ -83,7 +83,7 @@
 
   // Up-cast.
   var list2 = new List<C>.from(elements);
-  var dList2 = List.castTo<C, Object>(list2);
+  var dList2 = List.castFrom<C, Object>(list2);
   Expect.listEquals(elements, dList2);
   Expect.throws(() => dList2[2] = new Object()); // Cannot set non-C.
   Expect.listEquals(elements, dList2);
@@ -93,7 +93,7 @@
   var set = new Set<C>.from(elements); // Linked HashSet.
   Expect.listEquals(elements, set.toList()); // Preserves order.
 
-  var dSet = Set.castTo<C, D>(set);
+  var dSet = Set.castFrom<C, D>(set);
 
   // Preserves order.
   Expect.throws(() => dSet.first); // C is not D.
@@ -116,7 +116,7 @@
 
   // Up-cast
   var set2 = new Set<C>.from(elements);
-  var dSet2 = Set.castTo<C, Object>(set2);
+  var dSet2 = Set.castFrom<C, Object>(set2);
 
   var newObject = new Object();
   Expect.throws(() => dSet2.add(newObject));
@@ -129,7 +129,7 @@
   // Custom emptySet.
 
   var set3 = new Set<C>.from(elements);
-  var dSet3 = Set.castTo<C, Object>(set3, newSet: <T>() => new HashSet<T>());
+  var dSet3 = Set.castFrom<C, Object>(set3, newSet: <T>() => new HashSet<T>());
 
   var toSet3 = dSet3.toSet();
   Expect.isTrue(toSet3 is HashSet<Object>);
@@ -140,7 +140,7 @@
 void testMap() {
   var map = new Map.fromIterables(elements, elements);
 
-  var dMap = Map.castTo<C, C, D, D>(map);
+  var dMap = Map.castFrom<C, C, D, D>(map);
 
   Expect.isTrue(dMap is Map<D, D>);
 
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 80c5092..fefc9fc 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -9,16 +9,7 @@
 
 [ $compiler == dart2js ]
 date_time11_test: RuntimeError, Pass # Fails when US is on winter time, issue 31285.
-double_ceil_test/int64: Crash # Issue 31762
-double_floor_test/int64: Crash # Issue 31762
-double_round_test/int64: Crash # Issue 31762
-double_truncate_test/int64: Crash # Issue 31762
 hash_set_test/01: RuntimeError # Issue 11551
-int_from_environment_test: Crash # Issue 31762
-int_parse_radix_test/01: Crash # Issue 31762
-int_parse_radix_test/02: Crash # Issue 31762
-int_parse_radix_test/badTypes: Crash # Issue 31762
-int_parse_radix_test/none: Crash # Issue 31762
 integer_to_radix_string_test: RuntimeError # Issue 29921
 string_static_test: MissingCompileTimeError
 
@@ -26,52 +17,18 @@
 error_stack_trace_test/static: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
-bool_from_environment2_test/01: MissingCompileTimeError
-bool_from_environment2_test/02: MissingCompileTimeError
-bool_from_environment2_test/03: MissingCompileTimeError
-bool_from_environment2_test/04: MissingCompileTimeError
-from_environment_const_type_test/01: Pass
-from_environment_const_type_test/02: MissingCompileTimeError
-from_environment_const_type_test/03: MissingCompileTimeError
-from_environment_const_type_test/04: MissingCompileTimeError
-from_environment_const_type_test/05: Pass
-from_environment_const_type_test/06: MissingCompileTimeError
-from_environment_const_type_test/07: MissingCompileTimeError
-from_environment_const_type_test/08: MissingCompileTimeError
-from_environment_const_type_test/09: MissingCompileTimeError
-from_environment_const_type_test/10: Pass
-from_environment_const_type_test/11: MissingCompileTimeError
-from_environment_const_type_test/12: MissingCompileTimeError
-from_environment_const_type_test/13: MissingCompileTimeError
-from_environment_const_type_test/14: MissingCompileTimeError
-from_environment_const_type_test/15: Pass
-from_environment_const_type_test/16: MissingCompileTimeError
-from_environment_const_type_test/none: Pass
-from_environment_const_type_undefined_test/02: MissingCompileTimeError
-from_environment_const_type_undefined_test/03: MissingCompileTimeError
-from_environment_const_type_undefined_test/04: MissingCompileTimeError
-from_environment_const_type_undefined_test/06: MissingCompileTimeError
-from_environment_const_type_undefined_test/07: MissingCompileTimeError
-from_environment_const_type_undefined_test/08: MissingCompileTimeError
-from_environment_const_type_undefined_test/09: MissingCompileTimeError
-from_environment_const_type_undefined_test/11: MissingCompileTimeError
-from_environment_const_type_undefined_test/12: MissingCompileTimeError
-from_environment_const_type_undefined_test/13: MissingCompileTimeError
-from_environment_const_type_undefined_test/14: MissingCompileTimeError
-from_environment_const_type_undefined_test/16: MissingCompileTimeError
+apply3_test: CompileTimeError
+bool_from_environment2_test/03: Crash
 int_modulo_arith_test/modPow: RuntimeError
 int_modulo_arith_test/none: RuntimeError
-int_parse_radix_bad_handler_test: MissingCompileTimeError
+iterable_reduce_test/01: CompileTimeError
 map_test: Crash # crash in front_end.
-string_from_environment3_test/01: MissingCompileTimeError
-string_from_environment3_test/02: MissingCompileTimeError
-string_from_environment3_test/03: MissingCompileTimeError
-string_from_environment3_test/04: MissingCompileTimeError
+null_nosuchmethod_test/01: CompileTimeError
+null_nosuchmethod_test/none: CompileTimeError
+string_from_environment3_test/03: Crash
 symbol_reserved_word_test/04: MissingCompileTimeError
-symbol_reserved_word_test/05: MissingCompileTimeError
 symbol_reserved_word_test/07: MissingCompileTimeError
 symbol_reserved_word_test/10: MissingCompileTimeError
-symbol_test/01: MissingCompileTimeError
 symbol_test/02: MissingCompileTimeError
 symbol_test/03: MissingCompileTimeError
 
@@ -112,11 +69,13 @@
 string_trimlr_test/02: RuntimeError # Flutter Issue 9111
 
 [ $runtime == jsshell ]
-string_case_test/01: Fail, OK
+string_case_test/01: Fail, OK # German double S.
 unicode_test: Fail
 
-[ $runtime == vm ]
-string_case_test/01: RuntimeError
+[ $runtime == safari ]
+double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
+double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
+string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
 
 [ !$strong ]
 cast_test: SkipByDesign # Uses generic method parameters.
@@ -161,7 +120,7 @@
 symbol_reserved_word_test/05: MissingCompileTimeError # Issue 30245
 
 # All static_tests have expected compile-time errors.
-[ $compiler != dart2analyzer && $compiler != dartdevc && $compiler != dartk && $compiler != dartkp && $strong ]
+[ $compiler != dart2analyzer && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $strong ]
 core_runtime_types_static_test: MissingCompileTimeError
 splay_tree_test/01: MissingCompileTimeError
 splay_tree_test/02: MissingCompileTimeError
@@ -189,7 +148,7 @@
 list_test/*: RuntimeError # dart2js doesn't implement strong mode covariance checks
 nan_infinity_test/01: RuntimeError
 regexp/pcre_test: Pass, Slow # Issue 21593
-string_split_test: RuntimeError # does not return List<String>
+string_split_test: RuntimeError # Issue 30548: does not return List<String>
 
 [ $compiler == dart2js && $runtime != none && !$checked ]
 growable_list_test: RuntimeError # Concurrent modifications test always runs
@@ -207,11 +166,6 @@
 regexp/no-extensions_test: RuntimeError
 regexp/overflow_test: RuntimeError
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
-string_trimlr_test/01: Fail
-string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
 [ $compiler == dart2js && !$browser ]
 package_resource_test: RuntimeError # Issue 26842
 
@@ -277,8 +231,9 @@
 *: SkipByDesign
 
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked && $strong ]
-apply3_test: RuntimeError
+apply3_test: CompileTimeError
 cast_test: RuntimeError
+dynamic_nosuchmethod_test: CompileTimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 iterable_return_type_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
@@ -300,9 +255,9 @@
 *: SkipByDesign
 
 [ $compiler == dart2js && $dart2js_with_kernel && $minified && $strong ]
-apply3_test: RuntimeError
+apply3_test: CompileTimeError
 cast_test: RuntimeError
-dynamic_nosuchmethod_test: RuntimeError
+dynamic_nosuchmethod_test: CompileTimeError
 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).
 iterable_element_at_test/static: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(_LinkedCustomHashSet.#x), local(_LinkedCustomHashSet.#)) for j:closure_call(_LinkedCustomHashSet__LinkedCustomHashSet_closure.call).
@@ -344,6 +299,138 @@
 dynamic_nosuchmethod_test: Fail # mirrors not supported
 
 [ $compiler == dartdevc && $runtime != none ]
+symbol_operator_test: RuntimeError # Issue 29921
+
+[ $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp ]
+iterable_element_at_test/static: MissingCompileTimeError
+
+[ $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $runtime != none ]
+map_keys2_test: RuntimeError # needs Dart 2 is checks
+
+[ $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && ($compiler != dart2analyzer || !$strong) ]
+iterable_mapping_test/01: MissingCompileTimeError
+
+[ $compiler != dartdevc && $compiler != dartdevk && $checked && !$strong ]
+core_runtime_types_static_test: MissingCompileTimeError
+splay_tree_test/01: MissingCompileTimeError
+splay_tree_test/02: MissingCompileTimeError
+string_base_vm_static_test: MissingCompileTimeError
+string_replace_static_test: MissingCompileTimeError
+string_static_test: MissingCompileTimeError
+
+[ $compiler != dartdevc && $runtime != none && !$checked && !$strong ]
+null_nosuchmethod_test: RuntimeError # needs Dart 2 or checked mode
+
+# 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 && $mode == debug && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+bigint_parse_radix_test: Pass, Timeout # Please triage.
+bigint_test: Pass, Timeout # Please triage.
+
+# ===== dartk + vm status lines =====
+[ $compiler == dartk && $runtime == vm && $strong ]
+apply3_test: CompileTimeError # Issue 31402 (Invocation arguments)
+bool_from_environment2_test/03: MissingCompileTimeError
+compare_to2_test: RuntimeError
+iterable_empty_test: RuntimeError
+iterable_fold_test/02: RuntimeError
+iterable_reduce_test/01: CompileTimeError # Issue 31533
+iterable_reduce_test/none: RuntimeError
+iterable_to_list_test/01: RuntimeError
+iterable_to_list_test/none: RuntimeError
+json_map_test: RuntimeError
+list_replace_range_test: RuntimeError
+list_set_all_test: RuntimeError
+null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
+null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+string_from_environment3_test/03: MissingCompileTimeError
+string_trimlr_test/02: RuntimeError
+symbol_operator_test/03: RuntimeError
+symbol_reserved_word_test/04: MissingCompileTimeError
+symbol_reserved_word_test/06: RuntimeError
+symbol_reserved_word_test/07: MissingCompileTimeError
+symbol_reserved_word_test/09: RuntimeError
+symbol_reserved_word_test/10: MissingCompileTimeError
+symbol_reserved_word_test/12: RuntimeError
+symbol_test/02: MissingCompileTimeError
+symbol_test/03: MissingCompileTimeError
+symbol_test/none: RuntimeError
+unicode_test: RuntimeError
+
+# ===== dartkp + dart_precompiled status lines =====
+[ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
+bool_from_environment2_test/03: MissingCompileTimeError
+compare_to2_test: RuntimeError
+iterable_empty_test: RuntimeError
+iterable_fold_test/02: RuntimeError
+iterable_reduce_test/01: CompileTimeError # Issue 31533
+iterable_reduce_test/none: RuntimeError
+iterable_to_list_test/01: RuntimeError
+iterable_to_list_test/none: RuntimeError
+json_map_test: RuntimeError
+list_replace_range_test: RuntimeError
+list_set_all_test: RuntimeError
+null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
+null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+regexp/stack-overflow_test: RuntimeError
+string_from_environment3_test/03: MissingCompileTimeError
+string_trimlr_test/02: RuntimeError
+symbol_operator_test/03: RuntimeError
+symbol_reserved_word_test/04: MissingCompileTimeError
+symbol_reserved_word_test/06: RuntimeError
+symbol_reserved_word_test/07: MissingCompileTimeError
+symbol_reserved_word_test/09: RuntimeError
+symbol_reserved_word_test/10: MissingCompileTimeError
+symbol_reserved_word_test/12: RuntimeError
+symbol_test/02: MissingCompileTimeError
+symbol_test/03: MissingCompileTimeError
+symbol_test/none: RuntimeError
+unicode_test: RuntimeError
+
+[ $compiler == none && $runtime == drt ]
+string_from_environment2_test: Skip
+string_from_environment3_test: Skip
+string_from_environment_test: Skip
+
+[ $compiler == none && ($runtime == flutter || $runtime == vm) ]
+iterable_to_set_test: RuntimeError # is-checks do not implement strong mode type system
+string_trimlr_test/02: RuntimeError # Issue 29060
+
+[ $compiler == precompiler && $runtime == dart_precompiled && !$checked ]
+iterable_generate_test/01: RuntimeError
+splay_tree_from_iterable_test: RuntimeError
+
+[ $runtime == dart_precompiled && $minified ]
+apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
+error_stack_trace1_test: Skip # Expects unobfuscated stack trace
+
+[ $runtime == drt && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk) ]
+string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
+
+[ $runtime != drt && ($compiler == app_jit || $compiler == none || $compiler == precompiler) ]
+symbol_test/02: MissingCompileTimeError # Issue 11669
+symbol_test/03: MissingCompileTimeError # Issue 11669
+
+[ $runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk) ]
+bit_twiddling_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
+compare_to2_test: RuntimeError, OK # Requires fixed-size int64 support.
+double_ceil_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
+double_floor_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
+double_round_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
+double_truncate_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
+hash_set_test/01: RuntimeError # Issue 11551
+int_modulo_arith_test/modPow: RuntimeError # Issue 29921
+int_parse_with_limited_ints_test: Skip # dart2js and dartdevc don't know about --limit-ints-to-64-bits
+integer_arith_vm_test/modPow: RuntimeError # Issues 10245, 30170
+integer_parsed_arith_vm_test: RuntimeError # Issues 10245, 29921
+integer_parsed_div_rem_vm_test: RuntimeError # Issue 29921
+integer_parsed_mul_div_vm_test: RuntimeError # Issue 29921
+json_map_test: RuntimeError
+regress_r21715_test: RuntimeError # Requires fixed-size int64 support.
+typed_data_with_limited_ints_test: Skip # dart2js and dartdevc don't know about --limit-ints-to-64-bits
+
+[ $runtime != none && ($compiler == dartdevc || $compiler == dartdevk) ]
 apply2_test: RuntimeError # Issue 29921
 apply3_test: RuntimeError # Issue 29921
 bigint_test: Pass, Slow
@@ -413,7 +500,6 @@
 regexp/zero-length-alternatives_test: RuntimeError # Issue 29921
 regress_r21715_test: RuntimeError # Issue 29921
 string_operations_with_null_test: RuntimeError # Issue 29921
-symbol_operator_test: RuntimeError # Issue 29921
 symbol_operator_test/03: RuntimeError # Issue 29921
 symbol_reserved_word_test/06: RuntimeError # Issue 29921
 symbol_reserved_word_test/09: RuntimeError # Issue 29921
@@ -421,145 +507,11 @@
 symbol_test/none: RuntimeError # Issue 29921
 typed_data_with_limited_ints_test: Skip # dartdevc doesn't know about --limit-ints-to-64-bits
 
-[ $compiler != dartdevc && $compiler != dartk && $compiler != dartkp ]
-iterable_element_at_test/static: MissingCompileTimeError
-
-[ $compiler != dartdevc && $compiler != dartk && $compiler != dartkp && $runtime != none ]
-map_keys2_test: RuntimeError # needs Dart 2 is checks
-
-[ $compiler != dartdevc && $compiler != dartk && $compiler != dartkp && ($compiler != dart2analyzer || !$strong) ]
-iterable_mapping_test/01: MissingCompileTimeError
-
-[ $compiler != dartdevc && $runtime != none && !$checked && !$strong ]
-null_nosuchmethod_test: RuntimeError # needs Dart 2 or checked mode
-
-[ $compiler != dartdevc && $checked && !$strong ]
-core_runtime_types_static_test: MissingCompileTimeError
-splay_tree_test/01: MissingCompileTimeError
-splay_tree_test/02: MissingCompileTimeError
-string_base_vm_static_test: MissingCompileTimeError
-string_replace_static_test: MissingCompileTimeError
-string_static_test: MissingCompileTimeError
-
-# 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 && $mode == debug && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-bigint_parse_radix_test: Pass, Timeout # Please triage.
-bigint_test: Pass, Timeout # Please triage.
-
-# ===== dartk + vm status lines =====
-[ $compiler == dartk && $runtime == vm && $strong ]
-apply3_test: CompileTimeError # Issue 31402 (Invocation arguments)
-bool_from_environment2_test/03: MissingCompileTimeError
-compare_to2_test: RuntimeError
-iterable_empty_test: RuntimeError
-iterable_fold_test/02: RuntimeError
-iterable_reduce_test/01: CompileTimeError # Issue 31533
-iterable_reduce_test/none: RuntimeError
-iterable_to_list_test/01: RuntimeError
-iterable_to_list_test/none: RuntimeError
-json_map_test: RuntimeError
-list_replace_range_test: RuntimeError
-list_set_all_test: RuntimeError
-null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
-null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-splay_tree_from_iterable_test: RuntimeError
-string_case_test/01: RuntimeError
-string_from_environment3_test/03: MissingCompileTimeError
-string_trimlr_test/02: RuntimeError
-symbol_operator_test/03: RuntimeError
-symbol_reserved_word_test/04: MissingCompileTimeError
-symbol_reserved_word_test/06: RuntimeError
-symbol_reserved_word_test/07: MissingCompileTimeError
-symbol_reserved_word_test/09: RuntimeError
-symbol_reserved_word_test/10: MissingCompileTimeError
-symbol_reserved_word_test/12: RuntimeError
-symbol_test/02: MissingCompileTimeError
-symbol_test/03: MissingCompileTimeError
-symbol_test/none: RuntimeError
-unicode_test: RuntimeError
-
-# ===== dartkp + dart_precompiled status lines =====
-[ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
-bool_from_environment2_test/03: MissingCompileTimeError
-compare_to2_test: RuntimeError
-iterable_empty_test: RuntimeError
-iterable_fold_test/02: RuntimeError
-iterable_reduce_test/01: CompileTimeError # Issue 31533
-iterable_reduce_test/none: RuntimeError
-iterable_to_list_test/01: RuntimeError
-iterable_to_list_test/none: RuntimeError
-json_map_test: RuntimeError
-list_replace_range_test: RuntimeError
-list_set_all_test: RuntimeError
-null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
-null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-regexp/stack-overflow_test: RuntimeError
-splay_tree_from_iterable_test: RuntimeError
-string_case_test/01: RuntimeError
-string_from_environment3_test/03: MissingCompileTimeError
-string_trimlr_test/02: RuntimeError
-symbol_operator_test/03: RuntimeError
-symbol_reserved_word_test/04: MissingCompileTimeError
-symbol_reserved_word_test/06: RuntimeError
-symbol_reserved_word_test/07: MissingCompileTimeError
-symbol_reserved_word_test/09: RuntimeError
-symbol_reserved_word_test/10: MissingCompileTimeError
-symbol_reserved_word_test/12: RuntimeError
-symbol_test/02: MissingCompileTimeError
-symbol_test/03: MissingCompileTimeError
-symbol_test/none: RuntimeError
-unicode_test: RuntimeError
-
-[ $compiler == none && $runtime == drt ]
-string_from_environment2_test: Skip
-string_from_environment3_test: Skip
-string_from_environment_test: Skip
-
-[ $compiler == none && $runtime == vm ]
-string_static_test: MissingCompileTimeError
-
-[ $compiler == none && ($runtime == flutter || $runtime == vm) ]
-iterable_to_set_test: RuntimeError # is-checks do not implement strong mode type system
-string_trimlr_test/02: RuntimeError # Issue 29060
-
-[ $compiler == precompiler && $runtime == dart_precompiled && !$checked ]
-iterable_generate_test/01: RuntimeError
-splay_tree_from_iterable_test: RuntimeError
-
-[ $runtime == dart_precompiled && $minified ]
-apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
-error_stack_trace1_test: Skip # Expects unobfuscated stack trace
-
-[ $runtime == drt && ($compiler == dart2js || $compiler == dartdevc) ]
-string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
-[ $runtime != drt && ($compiler == app_jit || $compiler == none || $compiler == precompiler) ]
-symbol_test/02: MissingCompileTimeError # Issue 11669
-symbol_test/03: MissingCompileTimeError # Issue 11669
-
-[ $runtime != none && ($compiler == dart2js || $compiler == dartdevc) ]
-bit_twiddling_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-compare_to2_test: RuntimeError, OK # Requires fixed-size int64 support.
-double_ceil_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-double_floor_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-double_round_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-double_truncate_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-hash_set_test/01: RuntimeError # Issue 11551
-int_modulo_arith_test/modPow: RuntimeError # Issue 29921
-int_parse_with_limited_ints_test: Skip # dart2js and dartdevc don't know about --limit-ints-to-64-bits
-integer_arith_vm_test/modPow: RuntimeError # Issues 10245, 30170
-integer_parsed_arith_vm_test: RuntimeError # Issues 10245, 29921
-integer_parsed_div_rem_vm_test: RuntimeError # Issue 29921
-integer_parsed_mul_div_vm_test: RuntimeError # Issue 29921
-json_map_test: RuntimeError
-regress_r21715_test: RuntimeError # Requires fixed-size int64 support.
-typed_data_with_limited_ints_test: Skip # dart2js and dartdevc don't know about --limit-ints-to-64-bits
-
+# We no longer expect Dart2 tests to run with the standalone VM without the new
+# common front end, but for now we get better coverage by still running them in
+# checked mode, which is mostly Dart2-compatible.
 [ $runtime == vm && !$checked && ($compiler == app_jit || $compiler == none) ]
-iterable_generate_test/01: RuntimeError
-splay_tree_from_iterable_test: RuntimeError
+*: Skip
 
 [ !$checked && !$strong ]
 core_runtime_types_static_test: MissingCompileTimeError
@@ -612,7 +564,6 @@
 
 [ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
 compare_to2_test: Fail # Issue 4018
-string_case_test/01: Fail # Bug 18061
 symbol_operator_test/03: Fail # Issue 11669
 symbol_reserved_word_test/06: RuntimeError # Issue 11669, With the exception of 'void', new Symbol() should not accept reserved words.
 symbol_reserved_word_test/09: RuntimeError # Issue 11669, With the exception of 'void', new Symbol() should not accept reserved words.
@@ -671,6 +622,7 @@
 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 # Issue 31533
 
 [ $compiler == dartkp || $compiler == precompiler ]
 apply3_test: SkipByDesign
@@ -688,17 +640,12 @@
 integer_parsed_arith_vm_test/02: RuntimeError # Issue 31346
 integer_parsed_div_rem_vm_test/01: RuntimeError # Issue 31346
 integer_to_radix_string_test/01: RuntimeError # Issue 31346
-string_split_test: RuntimeError # does not return List<String>
+string_case_test/01: RuntimeError # Issue 18061: German double S.
 
 [ $runtime == ff || $runtime == jsshell ]
 double_parse_test/02: Fail, OK # Issue 30468
 regexp/UC16_test: RuntimeError
 
-[ $runtime == safari || $runtime == safarimobilesim ]
-double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
-double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
-string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
 [ $hot_reload || $hot_reload_rollback ]
 bigint_parse_radix_test: Pass, Timeout # Issue 31659
 bigint_test: Pass, Crash # Issue 31660
diff --git a/tests/corelib_2/splay_tree_from_iterable_test.dart b/tests/corelib_2/splay_tree_from_iterable_test.dart
index 08ceba3..7118f4a 100644
--- a/tests/corelib_2/splay_tree_from_iterable_test.dart
+++ b/tests/corelib_2/splay_tree_from_iterable_test.dart
@@ -119,14 +119,14 @@
   Expect.isFalse(map is SplayTreeMap<dynamic, int>);
 }
 
-typedef String intToString(int v);
-typedef bool intToBool(int v);
+typedef String objectToString(Object v);
+typedef bool objectToBool(Object v);
 
 // Test in checked mode with explicitly given types.
 void typedTest() {
   // Assign functions to typed function variables.
-  intToString key = (int v) => "$v";
-  intToBool value = (int v) => v.isOdd;
+  objectToString key = (v) => "$v";
+  objectToBool value = (v) => (v as int).isOdd;
   Function id = (int i) => i;
 
   Expect.throws(() {
diff --git a/tests/corelib_2/string_split_test.dart b/tests/corelib_2/string_split_test.dart
index 353cbe4..f15ac1f 100644
--- a/tests/corelib_2/string_split_test.dart
+++ b/tests/corelib_2/string_split_test.dart
@@ -21,11 +21,6 @@
   }
   List actual = string.split(pattern);
 
-  // Check that the list is growable/mutable
-  actual
-    ..add('42')
-    ..removeLast();
-
   // Ensure that the correct type is reified.
   actual = actual as List<String>;
   Expect.throwsTypeError(() => actual.add(42),
diff --git a/tests/html/html.status b/tests/html/html.status
index 66809df..a61443a 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -123,6 +123,15 @@
 
 [ $runtime == safari ]
 audiobuffersourcenode_test/functional: RuntimeError
+canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
+canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
+element_animate_test: Fail # Element.animate not supported on these browsers.
+element_test: Pass, Fail # Issue 21434
+element_types_test/supported_content: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+element_types_test/supported_datalist: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+element_types_test/supported_shadow: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+fileapi_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+gamepad_test: Fail # Safari does not support Navigator.getGamepads()
 indexeddb_1_test/functional: Skip # Times out. Issue 21433
 indexeddb_2_test: RuntimeError # Issue 21433
 indexeddb_3_test: Skip # Times out 1 out of 10.
@@ -133,20 +142,17 @@
 input_element_test/supported_month: RuntimeError
 input_element_test/supported_time: RuntimeError
 input_element_test/supported_week: RuntimeError
+media_stream_test/supported_MediaStreamEvent: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+media_stream_test/supported_MediaStreamTrackEvent: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+media_stream_test/supported_media: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+mediasource_test: Pass, Fail # MediaSource only available on Safari 8 desktop, we can't express that.
 notification_test/constructors: Fail # Safari doesn't let us access the fields of the Notification to verify them.
+rtc_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+shadow_dom_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
+speechrecognition_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
 touchevent_test/supported: Fail # Safari does not support TouchEvents
-
-[ $runtime == safarimobilesim ]
-element_offset_test/offset: RuntimeError # Issue 18573
-element_types_test/supported_meter: RuntimeError # Issue 18573
-element_types_test/supported_template: Fail
-event_test: RuntimeError # Safarimobilesim does not support WheelEvent
-indexeddb_1_test/supported: Fail
-notification_test/constructors: Pass # Safari mobile will pass this test on the basis that notifications aren't supported at all.
-notification_test/supported_notification: RuntimeError # Issue 22869
-performance_api_test/supported: Fail
-wheelevent_test: RuntimeError # Safarimobilesim does not support WheelEvent
-xhr_test/json: Fail # Safari doesn't support JSON response type
+webgl_1_test: Pass, Fail # Issue 8219
+worker_api_test: Skip # Issue 13221
 
 [ $builder_tag == strong && $compiler == dart2analyzer ]
 *: Skip # Issue 28649
@@ -343,7 +349,7 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime == ff) ]
 request_animation_frame_test: Skip # Async test hangs.
 
-[ $compiler == dart2js && ($runtime == ff || $runtime == safari || $runtime == safarimobilesim || $ie) ]
+[ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
 fontface_test: Fail # Fontface not supported on these.
@@ -366,26 +372,6 @@
 [ $runtime == dart_precompiled || $runtime == vm ]
 *: Skip
 
-[ $runtime == safari || $runtime == safarimobilesim ]
-canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
-canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
-element_animate_test: Fail # Element.animate not supported on these browsers.
-element_test: Pass, Fail # Issue 21434
-element_types_test/supported_content: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-element_types_test/supported_datalist: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-element_types_test/supported_shadow: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-fileapi_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-gamepad_test: Fail # Safari does not support Navigator.getGamepads()
-media_stream_test/supported_MediaStreamEvent: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-media_stream_test/supported_MediaStreamTrackEvent: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-media_stream_test/supported_media: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-mediasource_test: Pass, Fail # MediaSource only available on Safari 8 desktop, we can't express that.
-rtc_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-shadow_dom_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-speechrecognition_test/supported: Fail # Safari Feature support statuses - All changes should be accompanied by platform support annotation changes.
-webgl_1_test: Pass, Fail # Issue 8219
-worker_api_test: Skip # Issue 13221
-
 [ $system == windows || $runtime == drt && $system == macos ]
 xhr_test/xhr: Skip # Times out.  Issue 21527
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 2b1df1d..1365973 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -27,6 +27,12 @@
 spawn_uri_vm_test: SkipByDesign # Test uses a ".dart" URI.
 stacktrace_message_test: RuntimeError # Fails to send stacktrace object.
 
+[ $compiler == dartk ]
+message3_test/int32x4: Crash
+
+[ $compiler == dartkp ]
+message3_test/int32x4: Crash
+
 [ $mode == product ]
 issue_24243_parent_isolate_test: Skip # Requires checked mode
 
@@ -67,9 +73,6 @@
 cross_isolate_message_test: Skip # Issue 12627
 message_test: Skip # Issue 12627
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-compile_time_error_test/none: Pass, Slow
-
 [ $compiler == dart2js && !$browser && $fast_startup ]
 isolate_current_test: Fail # please triage
 
@@ -103,9 +106,18 @@
 [ $compiler == dart2js && ($runtime == chrome || $runtime == chromeOnAndroid || $runtime == drt || $runtime == ff || $runtime == safari) ]
 isolate_stress_test: Pass, Slow # Issue 10697
 
+[ $compiler == dartk && $system == windows && $strong ]
+issue_22778_test: Fail
+message3_test/int32x4: Fail
+
+[ $compiler == dartk && $system == windows && !$strong ]
+message3_test/int32x4: Fail
+
+[ $compiler == dartk && $system != windows && $strong ]
+issue_22778_test: Crash
+
 [ $compiler == dartk && $strong ]
 issue_21398_parent_isolate1_test: RuntimeError
-issue_22778_test: Crash
 message3_test/byteBuffer: RuntimeError
 message3_test/constInstance: RuntimeError
 message3_test/constList: RuntimeError
@@ -118,7 +130,7 @@
 mint_maker_test: CompileTimeError
 spawn_function_custom_class_test: CompileTimeError
 spawn_uri_nested_vm_test: CompileTimeError
-static_function_test: CompileTimeError
+static_function_test: CompileTimeError, Timeout
 typed_message_test: CompileTimeError
 unresolved_ports_test: CompileTimeError, Pass, Timeout # Fails to compile on opt counter builder (#31838)
 
@@ -126,7 +138,38 @@
 # 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) ]
-*: Skip
+checked_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+count_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+cross_isolate_message_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+error_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+error_exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+illegal_msg_function_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+illegal_msg_mirror_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate_complex_messages_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+issue_21398_parent_isolate1_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+issue_21398_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+issue_24243_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+mandel_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+message2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+message_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+mint_maker_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+nested_spawn2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+nested_spawn_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+raw_port_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+request_reply_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_function_custom_class_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_function_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_exported_main_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_missing_from_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_missing_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_multi_test/01: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_multi_test/none: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_nested_vm_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+spawn_uri_vm_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+static_function_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+unresolved_ports_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
@@ -135,7 +178,7 @@
 scenarios/short_package/short_package_test: Fail, OK # We do not plan to support the tested behavior anyway.
 
 [ $mode == debug && ($compiler == dartk || $compiler == dartkp) ]
-static_function_test: Skip # Flaky (https://github.com/dart-lang/sdk/issues/30063).
+static_function_test: Skip # Times out. Issue 31855
 
 [ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
 compile_time_error_test/01: Skip # Issue 12587
@@ -152,7 +195,6 @@
 deferred_in_isolate2_test: Skip # Timeout. Deferred loading kernel issue 28335.
 deferred_in_isolate_test: Skip # Timeout. Deferred loading kernel issue 28335.
 issue_21398_parent_isolate2_test/01: Skip # Timeout. Deferred loading kernel issue 28335.
-message3_test/int32x4: Crash
 ping_pause_test: Pass, Timeout
 spawn_function_custom_class_test: Pass, Timeout
 spawn_uri_nested_vm_test: Pass, Timeout
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index c90979a..a39cb57 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -6,7 +6,6 @@
 unsorted/invocation_errors_test: Pass
 unsorted/loop_test: Skip
 unsorted/nsm_dispatcher_test: Skip # The test uses Symbol without MirrorsUsed
-unsorted/simple_literal_test: Crash # Issue 31762
 unsorted/super_initializer_test: Skip
 unsorted/super_mixin_test: CompileTimeError
 
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 9458eea..b61f8d0 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -7,21 +7,9 @@
 
 # VM specific tests that should not be run by dart2js.
 [ $compiler == dart2js ]
-arithmetic_test: Crash # Issue 31762
 assertion_initializer_test: Crash
-bit_operations_test/01: Crash # Issue 31762
-bit_operations_test/02: Crash # Issue 31762
-bit_operations_test/03: Crash # Issue 31762
-bit_operations_test/04: Crash # Issue 31762
-bit_operations_test/none: Crash # Issue 31762
-deopt_inlined_function_lazy_test: Crash # Issue 31762
-deopt_smi_op_test: RuntimeError # Issue 31762
 generalized_void_syntax_test: CompileTimeError
-guess_cid_test: Crash # Issue 31762
-identical_closure2_test: Crash # Issue 31762
-int2_test: Crash # Issue 31762
-mint_compares_test: Crash # Issue 31762
-number_identity_test: Crash # Issue 31762
+local_function_test: RuntimeError # Issue 31879
 vm/*: Skip # Issue 12699
 
 [ $arch == ia32 && $compiler == dart2js && $runtime == d8 ]
@@ -52,8 +40,8 @@
 [ $compiler == dart2js && $runtime == none && $dart2js_with_kernel ]
 *: Fail, Pass, Crash # TODO(sigmund): we should have no crashes when migration completes
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-call_through_getter_test: Fail, OK # Safari codegen bug, fixed on some versions of Safari 7.1 (Version 7.1 (9537.85.10.17.1))
+[ $compiler == dart2js && $runtime == safari ]
+round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $system == windows && ($runtime == chrome || $runtime == ff) ]
 string_literals_test: RuntimeError # Issue 27533
@@ -122,9 +110,6 @@
 compile_time_constant_checked_test/01: Fail
 compile_time_constant_checked_test/02: MissingCompileTimeError
 compile_time_constant_checked_test/03: Fail
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_constructor2_test/13: MissingCompileTimeError
 const_constructor2_test/14: MissingCompileTimeError
@@ -159,7 +144,6 @@
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 cyclic_constructor_test/01: Crash # Issue 30856
 deferred_call_empty_before_load_test: RuntimeError
-deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -495,17 +479,6 @@
 [ $compiler == dart2js && !$checked && $enable_asserts ]
 bool_check_test: RuntimeError # Issue 29647
 
-[ $compiler == dart2js && $dart2js_with_kernel ]
-arithmetic_test: CompileTimeError # Large integer literal
-bit_operations_test: CompileTimeError # Large integer literal
-deopt_inlined_function_lazy_test: CompileTimeError # Large integer literal
-guess_cid_test: CompileTimeError # Large integer literal
-identical_closure2_test: CompileTimeError # Large integer literal
-int2_test: CompileTimeError # Large integer literal
-mint_compares_test: CompileTimeError # Large integer literal
-number_identity_test: CompileTimeError # Large integer literal
-vm/regress_14903_test: CompileTimeError # Large integer literal
-
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_error2_test/none: CompileTimeError
@@ -531,9 +504,6 @@
 class_cycle_test/03: MissingCompileTimeError
 closure_in_field_test/01: RuntimeError
 closure_in_field_test/02: RuntimeError
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_error_multiply_initialized_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/04: MissingCompileTimeError
@@ -556,7 +526,6 @@
 constructor_redirect2_test/01: MissingCompileTimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 cyclic_constructor_test/01: Crash # Stack Overflow
-deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -848,13 +817,11 @@
 closure_in_field_test/01: RuntimeError
 closure_in_field_test/02: RuntimeError
 closure_self_reference_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/nodes.dart': Failed assertion: line 641 pos 12: 'isClosed()': is not true.
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_error_multiply_initialized_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_evaluation_test/01: RuntimeError
+const_evaluation_test/01: CompileTimeError
+const_evaluation_test/none: CompileTimeError
 const_factory_with_body_test/01: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
@@ -874,10 +841,8 @@
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 cyclic_constructor_test/01: Crash # Issue 30856
 deferred_call_empty_before_load_test: RuntimeError
-deferred_closurize_load_library_test: RuntimeError
-deferred_constraints_constants_test/default_argument2: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
-deferred_constraints_constants_test/none: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
-deferred_constraints_constants_test/reference_after_load: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
+deferred_constraints_constants_test/none: CompileTimeError
+deferred_constraints_constants_test/reference_after_load: CompileTimeError
 deferred_constraints_type_annotation_test/as_operation: RuntimeError
 deferred_constraints_type_annotation_test/catch_check: RuntimeError
 deferred_constraints_type_annotation_test/is_check: RuntimeError
@@ -896,7 +861,7 @@
 duplicate_implements_test/04: MissingCompileTimeError
 dynamic_prefix_core_test/01: RuntimeError
 dynamic_prefix_core_test/none: RuntimeError
-enum_mirror_test: RuntimeError
+enum_mirror_test: CompileTimeError
 example_constructor_test: RuntimeError
 expect_test: RuntimeError
 external_test/10: MissingRuntimeError
@@ -905,6 +870,7 @@
 factory_redirection_test/07: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
+field_increment_bailout_test: CompileTimeError
 field_initialization_order_test: RuntimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
@@ -917,7 +883,6 @@
 full_stacktrace1_test: RuntimeError
 full_stacktrace2_test: RuntimeError
 full_stacktrace3_test: RuntimeError
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 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_type_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_type_expression_test/03: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
@@ -930,20 +895,23 @@
 identical_closure2_test: RuntimeError
 if_null_assignment_behavior_test/14: RuntimeError
 infinity_test: RuntimeError
-instance_creation_in_function_annotation_test: RuntimeError
+instance_creation_in_function_annotation_test: CompileTimeError
 integer_division_by_zero_test: RuntimeError
 internal_library_test/02: Crash # type 'DillLibraryBuilder' is not a subtype of type 'SourceLibraryBuilder<KernelTypeBuilder, Library>' of 'value' where
-invocation_mirror2_test: RuntimeError
+invocation_mirror2_test: CompileTimeError
 invocation_mirror_empty_arguments_test: RuntimeError
+invocation_mirror_invoke_on2_test: CompileTimeError
+invocation_mirror_invoke_on_test: CompileTimeError
 invocation_mirror_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 2521 pos 14: 'arguments.named.isEmpty': is not true.
 issue13474_test: RuntimeError
-issue21079_test: RuntimeError
+issue21079_test: CompileTimeError
 left_shift_test: RuntimeError
 library_env_test/has_mirror_support: RuntimeError
 library_env_test/has_no_html_support: RuntimeError
 library_env_test/has_no_io_support: RuntimeError
 list_literal4_test: RuntimeError
 main_not_a_function_test/01: CompileTimeError
+many_overridden_no_such_method_test: CompileTimeError
 map_literal4_test: RuntimeError
 method_name_test: CompileTimeError
 method_override5_test: RuntimeError
@@ -1078,12 +1046,12 @@
 named_parameters_type_test/03: MissingRuntimeError
 nan_identical_test: RuntimeError
 no_main_test/01: CompileTimeError
-null_test/02: MissingCompileTimeError
-null_test/03: MissingCompileTimeError
-null_test/none: RuntimeError
+no_such_method_test: CompileTimeError
+null_test/none: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError
 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.
+overridden_no_such_method_test: CompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -1102,9 +1070,12 @@
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
-redirecting_factory_reflection_test: RuntimeError
+redirecting_factory_reflection_test: CompileTimeError
+regress_13462_0_test: CompileTimeError
+regress_13462_1_test: CompileTimeError
 regress_13494_test: RuntimeError
 regress_17382_test: RuntimeError
+regress_18535_test: CompileTimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_22936_test/01: RuntimeError
 regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
@@ -1115,7 +1086,7 @@
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28217_test/01: MissingCompileTimeError
 regress_28217_test/none: MissingCompileTimeError
-regress_28255_test: RuntimeError
+regress_28255_test: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
@@ -1126,7 +1097,8 @@
 static_getter_no_setter1_test/01: RuntimeError
 static_getter_no_setter2_test/01: RuntimeError
 static_getter_no_setter3_test/01: RuntimeError
-super_call4_test: Crash # Assertion failure: Missing scope info for j:method(E.boz).
+super_call4_test: CompileTimeError
+super_getter_setter_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -1166,15 +1138,11 @@
 class_cycle_test/03: MissingCompileTimeError
 closure_in_field_test/01: RuntimeError
 closure_in_field_test/02: RuntimeError
-conditional_import_string_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-conditional_import_string_test: RuntimeError
-conditional_import_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-conditional_import_test: RuntimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_error_multiply_initialized_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_evaluation_test/01: RuntimeError
+const_evaluation_test/01: CompileTimeError
+const_evaluation_test/none: CompileTimeError
 const_factory_with_body_test/01: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
@@ -1200,11 +1168,8 @@
 cyclic_type_test/03: RuntimeError
 cyclic_type_test/04: RuntimeError
 deferred_call_empty_before_load_test: RuntimeError
-deferred_closurize_load_library_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_closurize_load_library_test: RuntimeError
-deferred_constraints_constants_test/default_argument2: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_constants_test/none: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_constants_test/reference_after_load: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
+deferred_constraints_constants_test/none: CompileTimeError
+deferred_constraints_constants_test/reference_after_load: CompileTimeError
 deferred_constraints_type_annotation_test/as_operation: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 deferred_constraints_type_annotation_test/as_operation: RuntimeError
 deferred_constraints_type_annotation_test/catch_check: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
@@ -1229,7 +1194,7 @@
 duplicate_implements_test/04: MissingCompileTimeError
 dynamic_prefix_core_test/01: RuntimeError
 dynamic_prefix_core_test/none: RuntimeError
-enum_mirror_test: RuntimeError
+enum_mirror_test: CompileTimeError
 example_constructor_test: RuntimeError
 expect_test: RuntimeError
 external_test/10: MissingRuntimeError
@@ -1240,6 +1205,7 @@
 factory_redirection_test/07: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
+field_increment_bailout_test: CompileTimeError
 field_initialization_order_test: RuntimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
@@ -1264,20 +1230,23 @@
 identical_closure2_test: RuntimeError
 if_null_assignment_behavior_test/14: RuntimeError
 infinity_test: RuntimeError
-instance_creation_in_function_annotation_test: RuntimeError
+instance_creation_in_function_annotation_test: CompileTimeError
 integer_division_by_zero_test: RuntimeError
 internal_library_test/02: Crash # NoSuchMethodError: Class 'DillLibraryBuilder' has no instance getter 'mixinApplicationClasses'.
-invocation_mirror2_test: RuntimeError
+invocation_mirror2_test: CompileTimeError
 invocation_mirror_empty_arguments_test: RuntimeError
+invocation_mirror_invoke_on2_test: CompileTimeError
+invocation_mirror_invoke_on_test: CompileTimeError
 invocation_mirror_test: RuntimeError
 issue13474_test: RuntimeError
-issue21079_test: RuntimeError
+issue21079_test: CompileTimeError
 left_shift_test: RuntimeError
 library_env_test/has_mirror_support: RuntimeError
 library_env_test/has_no_html_support: RuntimeError
 library_env_test/has_no_io_support: RuntimeError
 list_literal4_test: RuntimeError
 main_not_a_function_test/01: CompileTimeError
+many_overridden_no_such_method_test: CompileTimeError
 map_literal4_test: RuntimeError
 method_name_test: CompileTimeError
 method_override5_test: RuntimeError
@@ -1413,11 +1382,11 @@
 named_parameters_type_test/03: MissingRuntimeError
 nan_identical_test: RuntimeError
 no_main_test/01: CompileTimeError
-null_test/02: MissingCompileTimeError
-null_test/03: MissingCompileTimeError
-null_test/none: RuntimeError
+no_such_method_test: CompileTimeError
+null_test/none: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError
+overridden_no_such_method_test: CompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -1435,9 +1404,12 @@
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
-redirecting_factory_reflection_test: RuntimeError
+redirecting_factory_reflection_test: CompileTimeError
+regress_13462_0_test: CompileTimeError
+regress_13462_1_test: CompileTimeError
 regress_13494_test: RuntimeError
 regress_17382_test: RuntimeError
+regress_18535_test: CompileTimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_21795_test: RuntimeError
 regress_22936_test/01: RuntimeError
@@ -1449,7 +1421,7 @@
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28217_test/01: MissingCompileTimeError
 regress_28217_test/none: MissingCompileTimeError
-regress_28255_test: RuntimeError
+regress_28255_test: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stack_trace_test: RuntimeError
@@ -1461,7 +1433,8 @@
 static_getter_no_setter1_test/01: RuntimeError
 static_getter_no_setter2_test/01: RuntimeError
 static_getter_no_setter3_test/01: RuntimeError
-super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
+super_call4_test: CompileTimeError
+super_getter_setter_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -1679,9 +1652,6 @@
 mixin_mixin_bound_test: RuntimeError # Issue 12605
 symbol_conflict_test: RuntimeError # Issue 23857
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
-round_test: Fail, OK # Common JavaScript engine Math.round bug.
-
 [ !$dart2js_with_kernel && $minified ]
 regress_21795_test: RuntimeError # Issue 12605
 stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
diff --git a/tests/language_2/dynamic_test.dart b/tests/language_2/dynamic_test.dart
index 97e97bf..5fe8529 100644
--- a/tests/language_2/dynamic_test.dart
+++ b/tests/language_2/dynamic_test.dart
@@ -47,7 +47,7 @@
   Expect.isTrue(m3 is Iface<String, num>);
   Expect.isTrue(m3 is! Iface<num, String>);
 
-  F1<int> f1 = (String s, int i) => s[i];
+  F1<int> f1 = (dynamic s, int i) => s[i];
   Expect.isTrue(f1 is F1<int>);
 
   HasFieldDynamic has_field = new HasFieldDynamic();
diff --git a/tests/language_2/function_test.dart b/tests/language_2/function_test.dart
index 334d48a..aa5f087 100644
--- a/tests/language_2/function_test.dart
+++ b/tests/language_2/function_test.dart
@@ -351,6 +351,7 @@
     UntypedFunction2 uf2 = null;
     Foo foo = null;
     Foo<int, String> fooIntString = null;
+    Foo<Object, Object> fooObjectObject = null;
 
     f = uf;
     f = uf2;
@@ -362,9 +363,11 @@
     foo = f;
     fooIntString = f;
 
-    foo = fooIntString;
     fooIntString = foo;
 
+    foo = fooObjectObject;
+    fooObjectObject = foo;
+
     uf = uf2;
     uf2 = uf;
   }
diff --git a/tests/language_2/index_assign_operator_infer_return_type_test.dart b/tests/language_2/index_assign_operator_infer_return_type_test.dart
new file mode 100644
index 0000000..357c281
--- /dev/null
+++ b/tests/language_2/index_assign_operator_infer_return_type_test.dart
@@ -0,0 +1,20 @@
+// 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 C {
+  dynamic operator []=(dynamic index, dynamic value) {}
+}
+
+abstract class I {
+  void operator []=(dynamic index, dynamic value) {}
+}
+
+class D extends C implements I {
+  // Even though `C` and `I` define different return types for `operator[]=`, it
+  // should still be possible to infer a return type here, since the return type
+  // of `operator[]=` is always inferred as `void`.
+  operator []=(dynamic index, dynamic value) {}
+}
+
+main() {}
diff --git a/tests/language_2/instantiate_tearoff_test.dart b/tests/language_2/instantiate_tearoff_test.dart
index 892be77..1c50f7f 100644
--- a/tests/language_2/instantiate_tearoff_test.dart
+++ b/tests/language_2/instantiate_tearoff_test.dart
@@ -6,21 +6,38 @@
 
 T f<T>(T x) => x;
 
+int intToInt(int x) => x;
+String stringToString(String x) => x;
+
 main() {
   int Function(int) intFunc = f;
   dynamic intFuncDynamic = intFunc;
   Expect.isTrue(intFuncDynamic is int Function(int));
   Expect.isFalse(intFuncDynamic is String Function(String));
   Expect.equals(intFuncDynamic(1), 1);
+  Expect.equals("${intFuncDynamic.runtimeType}", "${intToInt.runtimeType}");
   Expect.throwsTypeError(() {
     intFuncDynamic('oops');
   });
+  Expect.throwsNoSuchMethodError(() {
+    intFuncDynamic<String>('oops');
+  });
   String Function(String) stringFunc = f;
   dynamic stringFuncDynamic = stringFunc;
   Expect.isTrue(stringFuncDynamic is String Function(String));
   Expect.isFalse(stringFuncDynamic is int Function(int));
   Expect.equals(stringFuncDynamic('hello'), 'hello');
+  Expect.equals(
+      "${stringFuncDynamic.runtimeType}", "${stringToString.runtimeType}");
   Expect.throwsTypeError(() {
     stringFuncDynamic(1);
   });
+  Expect.throwsNoSuchMethodError(() {
+    stringFuncDynamic<int>(1);
+  });
+  dynamic Function(dynamic) dynamicFunc = f;
+  dynamic dynamicFuncDynamic = dynamicFunc;
+  Expect.throwsNoSuchMethodError(() {
+    dynamicFuncDynamic<int>(1);
+  });
 }
diff --git a/tests/language_2/issue13179_test.dart b/tests/language_2/issue13179_test.dart
index 0439cea..d1492b4 100644
--- a/tests/language_2/issue13179_test.dart
+++ b/tests/language_2/issue13179_test.dart
@@ -6,7 +6,7 @@
 
 int count = 0;
 
-void f([void f([x]) = f]) {
+void f([void f([Null x]) = f]) {
   count++;
   if (f != null) {
     f(null);
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 00f785d..146c5dd 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -22,13 +22,10 @@
 stacktrace_demangle_ctors_test: SkipByDesign # Names are not scrubbed.
 type_checks_in_factory_method_test: SkipByDesign # Requires checked mode.
 
-[ $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $strong ]
+[ $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $strong ]
 type_promotion_functions_test: CompileTimeError # Issue 30895: This test requires a complete rewrite for 2.0.
 
-[ $compiler != dartdevc && !$checked ]
-function_type/*: Skip # Needs checked mode.
-
-[ $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $strong ]
+[ $compiler != dart2js && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $strong ]
 compile_time_constant_static5_test/11: CompileTimeError # Issue 30546
 compile_time_constant_static5_test/16: CompileTimeError # Issue 30546
 compile_time_constant_static5_test/21: CompileTimeError # Issue 30546
@@ -37,15 +34,25 @@
 issue_25671b_test/01: CompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError # Issue 30906.
 
+[ $compiler != dartdevc && !$checked ]
+function_type/*: Skip # Needs checked mode.
+
 [ $compiler != dartk && $compiler != dartkp && $mode == debug && $runtime == vm ]
 built_in_identifier_type_annotation_test/15: Crash # Not supported by legacy VM front-end.
 
 [ $compiler == none && $runtime == drt && !$checked ]
 assertion_initializer_const_error_test/01: Fail
 
+# We no longer expect Dart2 tests to run with the standalone VM without the new
+# common front end, but for now we get better coverage by still running them in
+# checked mode, which is mostly Dart2-compatible.
+[ $compiler == none && $runtime == vm && !$checked ]
+*: Skip
+
 [ $compiler != spec_parser && !$checked && !$strong ]
 closure_type_test: RuntimeError
 map_literal1_test/01: MissingCompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/02: RuntimeError # Requires type check.
 
 [ $compiler != spec_parser && !$strong ]
 class_literal_static_test: MissingCompileTimeError # Requires strong mode
@@ -98,6 +105,9 @@
 map_literal4_test/04: MissingCompileTimeError
 map_literal4_test/05: MissingCompileTimeError
 map_literal4_test/06: MissingCompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/03: MissingCompileTimeError # Issue #31426
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError # Issue #31426
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError # Issue #31426
 number_identifier_test/05: MissingCompileTimeError
 number_identifier_test/08: MissingCompileTimeError
 number_identifier_test/09: MissingCompileTimeError
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index b7c2b77..803fd57 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -45,6 +45,7 @@
 getter_declaration_negative_test: CompileTimeError
 getter_setter_in_lib_test: Fail # Issue 23286
 import_core_prefix_test: StaticWarning
+index_assign_operator_infer_return_type_test: StaticWarning
 initializing_formal_final_test: MissingCompileTimeError
 inst_field_initializer1_negative_test: CompileTimeError
 instance_call_wrong_argument_count_negative_test: Fail # Issue 11585
@@ -69,8 +70,8 @@
 list_literal_negative_test: CompileTimeError
 map_literal_negative_test: CompileTimeError
 method_override7_test/03: Fail # Issue 11497
-method_override_test: StaticWarning
 method_override_test: CompileTimeError
+method_override_test: StaticWarning
 mixin_supertype_subclass2_test/02: MissingStaticWarning # Issue 25614
 mixin_supertype_subclass2_test/05: MissingStaticWarning # Issue 25614
 mixin_supertype_subclass3_test/02: MissingStaticWarning # Issue 25614
@@ -1133,39 +1134,48 @@
 void_type_override_test/none: CompileTimeError # Issue 30177
 void_type_usage_test/call_as: CompileTimeError # Issue 30177
 void_type_usage_test/call_for: CompileTimeError # Issue 30177
+void_type_usage_test/call_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/call_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/field_assign: CompileTimeError # Issue 30177
 void_type_usage_test/field_assign2: CompileTimeError # Issue 30177
 void_type_usage_test/final_local_as: CompileTimeError # Issue 30177
 void_type_usage_test/final_local_for: CompileTimeError # Issue 30177
+void_type_usage_test/final_local_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/final_local_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/global_as: CompileTimeError # Issue 30177
 void_type_usage_test/global_for: CompileTimeError # Issue 30177
 void_type_usage_test/global_for_in2: CompileTimeError # Issue 30177
+void_type_usage_test/global_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/global_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/instance2_as: CompileTimeError # Issue 30177
 void_type_usage_test/instance2_for: CompileTimeError # Issue 30177
 void_type_usage_test/instance2_for_in3: CompileTimeError # Issue 30177
+void_type_usage_test/instance2_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/instance2_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/instance3_as: CompileTimeError # Issue 30177
 void_type_usage_test/instance3_for: CompileTimeError # Issue 30177
 void_type_usage_test/instance3_for_in3: CompileTimeError # Issue 30177
+void_type_usage_test/instance3_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/instance3_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/instance_as: CompileTimeError # Issue 30177
 void_type_usage_test/instance_for: CompileTimeError # Issue 30177
+void_type_usage_test/instance_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/instance_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/local_as: CompileTimeError # Issue 30177
 void_type_usage_test/local_assign: CompileTimeError # Issue 30177
 void_type_usage_test/local_for: CompileTimeError # Issue 30177
 void_type_usage_test/local_for_in2: CompileTimeError # Issue 30177
+void_type_usage_test/local_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/local_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/none: CompileTimeError # Issue 30177
 void_type_usage_test/param_as: CompileTimeError # Issue 30177
 void_type_usage_test/param_for: CompileTimeError # Issue 30177
 void_type_usage_test/param_for_in2: CompileTimeError # Issue 30177
+void_type_usage_test/param_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/param_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/paren_as: CompileTimeError # Issue 30177
 void_type_usage_test/paren_for: CompileTimeError # Issue 30177
+void_type_usage_test/paren_return_to_void: CompileTimeError # Issue 30177
 void_type_usage_test/paren_stmt: CompileTimeError # Issue 30177
 void_type_usage_test/setter_assign: CompileTimeError # Issue 30177
 
@@ -1363,6 +1373,7 @@
 invalid_cast_test/10: MissingCompileTimeError
 invalid_cast_test/11: MissingCompileTimeError
 invocation_mirror_test: StaticWarning
+issue13179_test: StaticWarning
 known_identifier_prefix_error_test/*: MissingCompileTimeError # Error only in strong mode.
 known_identifier_prefix_error_test/none: Pass
 least_upper_bound_expansive_test/01: MissingCompileTimeError
@@ -1488,6 +1499,7 @@
 named_parameters_type_test/01: MissingCompileTimeError
 named_parameters_type_test/02: MissingCompileTimeError
 named_parameters_type_test/03: MissingCompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/03: MissingCompileTimeError # Strong mode error
 object_has_no_call_method_test/02: MissingCompileTimeError
 object_has_no_call_method_test/05: MissingCompileTimeError
 object_has_no_call_method_test/08: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index a8e5484..64b68c3 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -20,7 +20,6 @@
 argument_assignability_function_typed_test/03: RuntimeError
 argument_assignability_function_typed_test/04: RuntimeError
 argument_assignability_function_typed_test/05: RuntimeError
-arithmetic_test: Crash # Issue 31762
 assign_static_type_test/01: MissingCompileTimeError
 assign_static_type_test/02: MissingCompileTimeError
 assign_static_type_test/03: MissingCompileTimeError
@@ -134,7 +133,6 @@
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deopt_smi_op_test: RuntimeError # Issue 31762
 dynamic_field_test/01: MissingCompileTimeError
 dynamic_field_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/01: MissingCompileTimeError
@@ -254,7 +252,6 @@
 getter_no_setter_test/03: MissingCompileTimeError
 getter_override_test/03: MissingCompileTimeError
 getters_setters2_test/02: MissingCompileTimeError
-guess_cid_test: RuntimeError # Issue 31762
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -416,7 +413,6 @@
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
 method_override_test: RuntimeError
-mint_compares_test: Crash # Issue 31762
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -595,6 +591,7 @@
 regress_23408_test: RuntimeError
 regress_26133_test: MissingCompileTimeError
 regress_27572_test: MissingCompileTimeError
+regress_30516_test: CompileTimeError # Issue 30515.
 regress_31057_test: RuntimeError
 regress_31591_test: RuntimeError, OK # strong mode only
 return_type_test: MissingCompileTimeError
@@ -1064,9 +1061,6 @@
 field_type_check2_test/01: MissingRuntimeError
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
-[ $compiler == dart2js && $runtime == safarimobilesim && !$dart2js_with_kernel ]
-call_through_getter_test: Fail, OK
-
 [ $compiler == dart2js && $system == windows && !$dart2js_with_kernel ]
 string_literals_test: Pass, RuntimeError # Failures on dart2js-win7-chrome-4-4-be and dart2js-win7-ie11ff-4-4-be
 
@@ -1110,8 +1104,6 @@
 closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
 conditional_method_invocation_test/05: MissingCompileTimeError
 conditional_method_invocation_test/06: MissingCompileTimeError
 conditional_method_invocation_test/07: MissingCompileTimeError
@@ -1152,7 +1144,6 @@
 conditional_property_increment_decrement_test/34: MissingCompileTimeError
 conditional_property_increment_decrement_test/39: MissingCompileTimeError
 conditional_property_increment_decrement_test/40: MissingCompileTimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_constructor2_test/05: MissingCompileTimeError
 const_constructor2_test/06: MissingCompileTimeError
@@ -1207,7 +1198,6 @@
 covariant_subtyping_test: CompileTimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
 deferred_call_empty_before_load_test: RuntimeError
-deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -1587,7 +1577,6 @@
 function_subtype_inline2_test: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel ]
-arithmetic_test: Pass # Issue 31762
 bug31436_test: RuntimeError
 built_in_identifier_type_annotation_test/22: Crash # Issue 28815
 built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28815
@@ -1635,7 +1624,6 @@
 invalid_cast_test/10: MissingCompileTimeError
 invalid_cast_test/11: MissingCompileTimeError
 library_env_test/has_no_mirror_support: Pass
-mint_compares_test: Pass # Issue 31762
 object_has_no_call_method_test/02: MissingCompileTimeError
 object_has_no_call_method_test/05: MissingCompileTimeError
 object_has_no_call_method_test/08: MissingCompileTimeError
@@ -1666,8 +1654,6 @@
 closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
 conditional_method_invocation_test/05: MissingCompileTimeError
 conditional_method_invocation_test/06: MissingCompileTimeError
 conditional_method_invocation_test/07: MissingCompileTimeError
@@ -1708,7 +1694,6 @@
 conditional_property_increment_decrement_test/34: MissingCompileTimeError
 conditional_property_increment_decrement_test/39: MissingCompileTimeError
 conditional_property_increment_decrement_test/40: MissingCompileTimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_constructor2_test/05: MissingCompileTimeError
 const_constructor2_test/06: MissingCompileTimeError
@@ -1766,7 +1751,6 @@
 covariant_subtyping_unsafe_call3_test: RuntimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
 deferred_call_empty_before_load_test: RuntimeError
-deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -2162,8 +2146,6 @@
 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
 conditional_method_invocation_test/06: MissingCompileTimeError
 conditional_method_invocation_test/07: MissingCompileTimeError
@@ -2204,7 +2186,6 @@
 conditional_property_increment_decrement_test/34: MissingCompileTimeError
 conditional_property_increment_decrement_test/39: MissingCompileTimeError
 conditional_property_increment_decrement_test/40: MissingCompileTimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_constructor2_test/05: MissingCompileTimeError
 const_constructor2_test/06: MissingCompileTimeError
@@ -2222,7 +2203,8 @@
 const_dynamic_type_literal_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_evaluation_test/01: RuntimeError
+const_evaluation_test/01: CompileTimeError
+const_evaluation_test/none: CompileTimeError
 const_factory_with_body_test/01: MissingCompileTimeError
 const_init2_test/02: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
@@ -2263,10 +2245,8 @@
 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
-deferred_constraints_constants_test/default_argument2: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
-deferred_constraints_constants_test/none: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
-deferred_constraints_constants_test/reference_after_load: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
+deferred_constraints_constants_test/none: CompileTimeError
+deferred_constraints_constants_test/reference_after_load: CompileTimeError
 deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
 deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
 deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
@@ -2304,7 +2284,7 @@
 duplicate_implements_test/03: MissingCompileTimeError
 duplicate_implements_test/04: MissingCompileTimeError
 dynamic_prefix_core_test/none: RuntimeError
-enum_mirror_test: RuntimeError
+enum_mirror_test: CompileTimeError
 enum_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 expect_test: RuntimeError
 external_test/10: MissingRuntimeError
@@ -2313,6 +2293,7 @@
 factory_redirection_test/07: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
+field_increment_bailout_test: CompileTimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
@@ -2378,14 +2359,16 @@
 infinity_test: RuntimeError
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
-instance_creation_in_function_annotation_test: RuntimeError
+instance_creation_in_function_annotation_test: CompileTimeError
 instanceof2_test: RuntimeError
 instanceof4_test/01: RuntimeError
 instanceof4_test/none: RuntimeError
 integer_division_by_zero_test: RuntimeError
 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
+invocation_mirror2_test: CompileTimeError
+invocation_mirror_invoke_on2_test: CompileTimeError
+invocation_mirror_invoke_on_test: CompileTimeError
 is_malformed_type_test/94: MissingCompileTimeError
 is_malformed_type_test/95: MissingCompileTimeError
 is_malformed_type_test/96: MissingCompileTimeError
@@ -2399,7 +2382,7 @@
 issue15606_test/01: MissingCompileTimeError
 issue18628_1_test/01: MissingCompileTimeError
 issue18628_2_test/01: MissingCompileTimeError
-issue21079_test: RuntimeError
+issue21079_test: CompileTimeError
 issue23244_test: RuntimeError
 known_identifier_prefix_error_test/01: MissingCompileTimeError
 known_identifier_prefix_error_test/02: MissingCompileTimeError
@@ -2438,6 +2421,7 @@
 list_literal_syntax_test/03: MissingCompileTimeError
 malformed2_test/00: MissingCompileTimeError
 many_generic_instanceof_test: RuntimeError
+many_overridden_no_such_method_test: CompileTimeError
 map_literal11_test/none: MissingRuntimeError
 map_literal1_test/01: MissingCompileTimeError
 map_literal3_test/01: MissingCompileTimeError
@@ -2551,6 +2535,11 @@
 nan_identical_test: RuntimeError
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
 no_main_test/01: CompileTimeError
+no_such_method_test: CompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/02: RuntimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/03: MissingCompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 not_enough_positional_arguments_test/00: MissingCompileTimeError
 not_enough_positional_arguments_test/01: MissingCompileTimeError
 not_enough_positional_arguments_test/02: MissingCompileTimeError
@@ -2558,10 +2547,8 @@
 not_enough_positional_arguments_test/05: MissingCompileTimeError
 not_enough_positional_arguments_test/06: MissingCompileTimeError
 not_enough_positional_arguments_test/07: MissingCompileTimeError
-null_test/02: MissingCompileTimeError
-null_test/03: MissingCompileTimeError
-null_test/mirrors: RuntimeError
-null_test/none: RuntimeError
+null_test/mirrors: CompileTimeError
+null_test/none: CompileTimeError
 number_identifier_test/05: MissingCompileTimeError
 number_identifier_test/08: MissingCompileTimeError
 number_identifier_test/09: MissingCompileTimeError
@@ -2572,6 +2559,7 @@
 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
+overridden_no_such_method_test: CompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -2595,7 +2583,10 @@
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
-redirecting_factory_reflection_test: RuntimeError
+redirecting_factory_reflection_test: CompileTimeError
+regress_13462_0_test: CompileTimeError
+regress_13462_1_test: CompileTimeError
+regress_18535_test: CompileTimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
@@ -2605,7 +2596,7 @@
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28217_test/01: MissingCompileTimeError
 regress_28217_test/none: MissingCompileTimeError
-regress_28255_test: RuntimeError
+regress_28255_test: CompileTimeError
 regress_28341_test: RuntimeError
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
@@ -2617,7 +2608,8 @@
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
 stacktrace_rethrow_nonerror_test: RuntimeError
 stacktrace_test: RuntimeError # Issue 12698
-super_call4_test: Crash # Assertion failure: Missing scope info for j:method(E.boz).
+super_call4_test: CompileTimeError
+super_getter_setter_test: CompileTimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
 switch_case_test/00: MissingCompileTimeError
@@ -2740,6 +2732,7 @@
 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_return_to_void: 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.
@@ -2751,6 +2744,7 @@
 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_return_to_void: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 192 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.
@@ -2767,6 +2761,7 @@
 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_return_to_void: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 192 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.
@@ -2777,38 +2772,46 @@
 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_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_return_to_void: 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_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_return_to_void: CompileTimeError
 void_type_usage_test/paren_stmt: CompileTimeError
 void_type_usage_test/setter_assign: CompileTimeError
 wrong_number_type_arguments_test/none: Pass
@@ -2909,8 +2912,6 @@
 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
 conditional_method_invocation_test/06: MissingCompileTimeError
 conditional_method_invocation_test/07: MissingCompileTimeError
@@ -2951,7 +2952,6 @@
 conditional_property_increment_decrement_test/34: MissingCompileTimeError
 conditional_property_increment_decrement_test/39: MissingCompileTimeError
 conditional_property_increment_decrement_test/40: MissingCompileTimeError
-config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_constructor2_test/05: MissingCompileTimeError
 const_constructor2_test/06: MissingCompileTimeError
@@ -2969,7 +2969,8 @@
 const_dynamic_type_literal_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/02: MissingCompileTimeError
 const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_evaluation_test/01: RuntimeError
+const_evaluation_test/01: CompileTimeError
+const_evaluation_test/none: CompileTimeError
 const_factory_with_body_test/01: MissingCompileTimeError
 const_init2_test/02: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
@@ -3010,10 +3011,8 @@
 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
-deferred_constraints_constants_test/default_argument2: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_constants_test/none: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_constants_test/reference_after_load: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
+deferred_constraints_constants_test/none: CompileTimeError
+deferred_constraints_constants_test/reference_after_load: CompileTimeError
 deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
 deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
 deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
@@ -3051,7 +3050,7 @@
 duplicate_implements_test/03: MissingCompileTimeError
 duplicate_implements_test/04: MissingCompileTimeError
 dynamic_prefix_core_test/none: RuntimeError
-enum_mirror_test: RuntimeError
+enum_mirror_test: CompileTimeError
 expect_test: RuntimeError
 external_test/10: MissingRuntimeError
 external_test/13: MissingRuntimeError
@@ -3060,6 +3059,7 @@
 factory_redirection_test/07: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
+field_increment_bailout_test: CompileTimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
@@ -3119,13 +3119,15 @@
 infinity_test: RuntimeError
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
-instance_creation_in_function_annotation_test: RuntimeError
+instance_creation_in_function_annotation_test: CompileTimeError
 instanceof2_test: RuntimeError
 instanceof4_test/01: RuntimeError
 instanceof4_test/none: RuntimeError
 integer_division_by_zero_test: RuntimeError
 internal_library_test/02: Crash # NoSuchMethodError: Class 'DillLibraryBuilder' has no instance getter 'mixinApplicationClasses'.
-invocation_mirror2_test: RuntimeError
+invocation_mirror2_test: CompileTimeError
+invocation_mirror_invoke_on2_test: CompileTimeError
+invocation_mirror_invoke_on_test: CompileTimeError
 invocation_mirror_test: RuntimeError
 is_malformed_type_test/94: MissingCompileTimeError
 is_malformed_type_test/95: MissingCompileTimeError
@@ -3140,7 +3142,7 @@
 issue15606_test/01: MissingCompileTimeError
 issue18628_1_test/01: MissingCompileTimeError
 issue18628_2_test/01: MissingCompileTimeError
-issue21079_test: RuntimeError
+issue21079_test: CompileTimeError
 issue23244_test: RuntimeError
 known_identifier_prefix_error_test/01: MissingCompileTimeError
 known_identifier_prefix_error_test/02: MissingCompileTimeError
@@ -3179,6 +3181,7 @@
 list_literal_syntax_test/03: MissingCompileTimeError
 malformed2_test/00: MissingCompileTimeError
 many_generic_instanceof_test: RuntimeError
+many_overridden_no_such_method_test: CompileTimeError
 map_literal11_test/none: MissingRuntimeError
 map_literal1_test/01: MissingCompileTimeError
 map_literal3_test/01: MissingCompileTimeError
@@ -3289,6 +3292,11 @@
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
 no_main_test/01: CompileTimeError
 no_such_method_native_test: RuntimeError
+no_such_method_test: CompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/02: RuntimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/03: MissingCompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 not_enough_positional_arguments_test/00: MissingCompileTimeError
 not_enough_positional_arguments_test/01: MissingCompileTimeError
 not_enough_positional_arguments_test/02: MissingCompileTimeError
@@ -3296,10 +3304,8 @@
 not_enough_positional_arguments_test/05: MissingCompileTimeError
 not_enough_positional_arguments_test/06: MissingCompileTimeError
 not_enough_positional_arguments_test/07: MissingCompileTimeError
-null_test/02: MissingCompileTimeError
-null_test/03: MissingCompileTimeError
-null_test/mirrors: RuntimeError
-null_test/none: RuntimeError
+null_test/mirrors: CompileTimeError
+null_test/none: CompileTimeError
 number_identifier_test/05: MissingCompileTimeError
 number_identifier_test/08: MissingCompileTimeError
 number_identifier_test/09: MissingCompileTimeError
@@ -3309,6 +3315,7 @@
 operator5_test: MissingCompileTimeError
 operator_equals_test: MissingCompileTimeError
 optimized_constant_array_string_access_test: MissingCompileTimeError
+overridden_no_such_method_test: CompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
 override_field_method4_negative_test: Fail
@@ -3331,7 +3338,10 @@
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
-redirecting_factory_reflection_test: RuntimeError
+redirecting_factory_reflection_test: CompileTimeError
+regress_13462_0_test: CompileTimeError
+regress_13462_1_test: CompileTimeError
+regress_18535_test: CompileTimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_21795_test: RuntimeError
 regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
@@ -3342,7 +3352,7 @@
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28217_test/01: MissingCompileTimeError
 regress_28217_test/none: MissingCompileTimeError
-regress_28255_test: RuntimeError
+regress_28255_test: CompileTimeError
 regress_28341_test: RuntimeError
 regress_29784_test/01: Crash # Issue 29784
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
@@ -3355,7 +3365,8 @@
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
 stacktrace_test: RuntimeError # Issue 12698
-super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
+super_call4_test: CompileTimeError
+super_getter_setter_test: CompileTimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
 switch_case_test/00: MissingCompileTimeError
@@ -3477,39 +3488,48 @@
 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: CompileTimeError
 void_type_usage_test/paren_stmt: CompileTimeError
 void_type_usage_test/setter_assign: CompileTimeError
 wrong_number_type_arguments_test/none: Pass
@@ -3526,7 +3546,6 @@
 bad_constructor_test/05: CompileTimeError
 bad_typedef_test/00: Crash # Issue 28214
 bug31436_test: RuntimeError
-built_in_identifier_type_annotation_test/13: Crash # Issue 28815
 built_in_identifier_type_annotation_test/22: MissingCompileTimeError # Error only in strong mode
 built_in_identifier_type_annotation_test/30: Crash # Issue 28815
 built_in_identifier_type_annotation_test/52: Crash # Issue 28815
@@ -3545,7 +3564,6 @@
 built_in_identifier_type_annotation_test/66: Crash # Issue 28815
 built_in_identifier_type_annotation_test/67: Crash # Issue 28815
 built_in_identifier_type_annotation_test/68: Crash # Issue 28815
-built_in_identifier_type_annotation_test/81: Crash # Issue 28815
 call_function_apply_test: RuntimeError # Issue 23873
 canonical_const2_test: RuntimeError, OK # Issue 1533
 closure_param_null_to_object_test: RuntimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 88ab234..2e88f06 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -55,6 +55,7 @@
 initializing_formal_final_test: MissingCompileTimeError
 instantiate_tearoff_after_contravariance_check_test: RuntimeError
 instantiate_tearoff_of_call_test: RuntimeError
+instantiate_tearoff_test: RuntimeError
 interface_test/00: MissingCompileTimeError
 internal_library_test/01: MissingCompileTimeError # Issue 29920
 issue31596_test: CompileTimeError
@@ -124,7 +125,6 @@
 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
-arithmetic_test: RuntimeError # Issue 31763
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc02: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc03: MissingCompileTimeError
@@ -144,7 +144,7 @@
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
 async_return_types_test/wrongReturnType: Crash # Maltyped input from Fasta, issue 31414
-await_test: CompileTimeError # Issue 31541
+await_test: Crash # Issue 31541
 bad_named_parameters2_test/01: MissingCompileTimeError
 bad_named_parameters_test/01: MissingCompileTimeError
 bad_named_parameters_test/02: MissingCompileTimeError
@@ -269,7 +269,6 @@
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
-dynamic_test: CompileTimeError
 emit_const_fields_test: CompileTimeError # Issue 31533
 export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
@@ -385,7 +384,6 @@
 instance_call_wrong_argument_count_negative_test: Fail
 instantiate_tearoff_of_call_test: CompileTimeError
 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'.
@@ -418,7 +416,6 @@
 method_override8_test/01: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
-mint_compares_test: RuntimeError # Issue 31763
 mixin_black_listed_test/02: MissingCompileTimeError
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
@@ -598,6 +595,7 @@
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
 regress_30339_test: CompileTimeError
+regress_30516_test: CompileTimeError # Issue 30470.
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
@@ -716,11 +714,10 @@
 
 [ $compiler == dartdevk && $runtime != none ]
 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
+conditional_import_string_test: CompileTimeError # Test is broken
+conditional_import_test: CompileTimeError # Test is broken
 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'
 enum_duplicate_test/01: RuntimeError # NoSuchMethodError: method not found: '<Unexpected Null Value>'
 enum_duplicate_test/02: RuntimeError # NoSuchMethodError: method not found: '<Unexpected Null Value>'
 enum_duplicate_test/none: RuntimeError # NoSuchMethodError: method not found: '<Unexpected Null Value>'
@@ -729,7 +726,6 @@
 enum_private_test/none: RuntimeError # NoSuchMethodError: method not found: '<Unexpected Null Value>'
 enum_test: RuntimeError # NoSuchMethodError: method not found: '<Unexpected Null Value>'
 f_bounded_equality_test: RuntimeError # Expect.equals(expected: <dynamic>, actual: <Real>) fails.
-field_override_optimization_test: RuntimeError # Expect.fail('This should also be unreachable')
 first_class_types_test: RuntimeError # Expect.equals(expected: <List>, actual: <List<int>>) fails.
 forwarding_stub_tearoff_test: RuntimeError
 function_subtype_bound_closure1_test: RuntimeError # Expect.isTrue(false, 'foo is Foo') fails.
@@ -737,7 +733,6 @@
 function_subtype_bound_closure5_test: RuntimeError # ReferenceError: TAndStringToint is not defined
 function_subtype_bound_closure5a_test: RuntimeError # ReferenceError: TAndStringToint is not defined
 function_subtype_bound_closure6_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_bound_closure7_test: RuntimeError # ReferenceError: TTodynamic is not defined
 function_subtype_cast0_test: RuntimeError # CastError: Casting value of type '(int) => void' to type '(dynamic) => void' which is incompatible
 function_subtype_cast2_test: RuntimeError # ReferenceError: TTovoid is not defined
 function_subtype_cast3_test: RuntimeError # ReferenceError: TTovoid is not defined
@@ -760,11 +755,7 @@
 generic_closure_test/none: RuntimeError # ReferenceError: TToT is not defined
 generic_function_dcall_test: RuntimeError
 generic_list_checked_test: RuntimeError # Expect.throws fails: Did not throw
-generic_methods_tearoff_specialization_test: RuntimeError
-generic_methods_unused_parameter_test: RuntimeError # Expect.isTrue(false) fails.
 generic_test: RuntimeError # ReferenceError: BOfT is not defined
-instantiate_tearoff_after_contravariance_check_test: RuntimeError
-instantiate_tearoff_test: RuntimeError
 library_env_test/has_io_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 library_env_test/has_mirror_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 library_env_test/has_no_html_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
@@ -793,6 +784,7 @@
 runtime_type_function_test: RuntimeError # Expect.fail('Type print string does not match expectation
 syncstar_yield_test/copyParameters: RuntimeError # Expect.equals(expected: <2>, actual: <3>) fails.
 type_literal_test: RuntimeError # Expect.equals(expected: <Func>, actual: <(bool) => int>) fails.
+instantiate_tearoff_test: RuntimeError
 
 # Compiler tests for dartdevc and dartdevk.  These contain common expectations
 # for all runtimes including $runtime == none.  They are organized by: shared
@@ -888,6 +880,7 @@
 nan_identical_test: RuntimeError # Issue 29920; Unsupported operation: Uint64 accessor not supported by dart2js.
 nested_switch_label_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 no_such_method_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError # Issue #31425
 null_test/mirrors: RuntimeError # Uses mirrors.; ReferenceError: GenericOfT is not defined
 number_identity2_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
 numbers_test: RuntimeError # Issue 29920; Expect.equals(expected: <false>, actual: <true>) fails.
@@ -929,6 +922,7 @@
 multiline_newline_test/04r: MissingCompileTimeError
 multiline_newline_test/05: MissingCompileTimeError
 multiline_newline_test/05r: MissingCompileTimeError
+no_such_method_tearoff_fta_test: RuntimeError # Issue http://dartbug.com/31897
 override_field_test/03: MissingCompileTimeError
 override_inheritance_abstract_test/02: MissingCompileTimeError
 override_inheritance_abstract_test/03: MissingCompileTimeError
@@ -957,43 +951,51 @@
 void_type_override_test/none: CompileTimeError # Issue 30514
 void_type_usage_test/call_as: CompileTimeError # Issue 30514
 void_type_usage_test/call_for: CompileTimeError # Issue 30514
+void_type_usage_test/call_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/call_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/field_assign: CompileTimeError # Issue 30514
 void_type_usage_test/field_assign2: CompileTimeError # Issue 30514
 void_type_usage_test/final_local_as: CompileTimeError # Issue 30514
 void_type_usage_test/final_local_for: CompileTimeError # Issue 30514
+void_type_usage_test/final_local_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/final_local_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/global_as: CompileTimeError # Issue 30514
 void_type_usage_test/global_for: CompileTimeError # Issue 30514
 void_type_usage_test/global_for_in2: CompileTimeError # Issue 30514
+void_type_usage_test/global_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/global_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/instance2_as: CompileTimeError # Issue 30514
 void_type_usage_test/instance2_for: CompileTimeError # Issue 30514
 void_type_usage_test/instance2_for_in3: CompileTimeError # Issue 30514
+void_type_usage_test/instance2_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/instance2_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/instance3_as: CompileTimeError # Issue 30514
 void_type_usage_test/instance3_for: CompileTimeError # Issue 30514
 void_type_usage_test/instance3_for_in3: CompileTimeError # Issue 30514
+void_type_usage_test/instance3_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/instance3_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/instance_as: CompileTimeError # Issue 30514
 void_type_usage_test/instance_for: CompileTimeError # Issue 30514
+void_type_usage_test/instance_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/instance_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/local_as: CompileTimeError # Issue 30514
 void_type_usage_test/local_assign: CompileTimeError # Issue 30514
 void_type_usage_test/local_for: CompileTimeError # Issue 30514
 void_type_usage_test/local_for_in2: CompileTimeError # Issue 30514
+void_type_usage_test/local_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/local_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/none: CompileTimeError # Issue 30514
 void_type_usage_test/param_as: CompileTimeError # Issue 30514
 void_type_usage_test/param_for: CompileTimeError # Issue 30514
 void_type_usage_test/param_for_in2: CompileTimeError # Issue 30514
+void_type_usage_test/param_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/param_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/paren_as: CompileTimeError # Issue 30514
 void_type_usage_test/paren_for: CompileTimeError # Issue 30514
+void_type_usage_test/paren_return_to_void: CompileTimeError # Issue 30514
 void_type_usage_test/paren_stmt: CompileTimeError # Issue 30514
 void_type_usage_test/setter_assign: CompileTimeError # Issue 30514
 
 [ $compiler == dartdevk || $compiler == dartdevc && $runtime == none ]
 instantiate_type_variable_test/01: CompileTimeError
 setter_no_getter_call_test/01: CompileTimeError
-
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 66efda2..5d9d5ee 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -9,7 +9,6 @@
 # in the existing sections, if possible keep the alphabetic ordering. If we are
 # missing a section you need, please reach out to sigmund@ to see the best way
 # to add them.
-# ===== Skip dartk and darkp in !$strong mode ====
 
 [ $compiler == dartkp ]
 generic_no_such_method_dispatcher_test: RuntimeError # Issue 31424
@@ -82,11 +81,6 @@
 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
@@ -231,18 +225,7 @@
 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
+async_star_test/02: RuntimeError # Issue 31402 (Invocation arguments)
 bad_named_parameters2_test/01: MissingCompileTimeError
 bad_named_parameters_test/01: MissingCompileTimeError
 bad_named_parameters_test/02: MissingCompileTimeError
@@ -278,10 +261,6 @@
 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
@@ -337,12 +316,9 @@
 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_type2_test: RuntimeError, CompileTimeError
+cyclic_type_test/02: RuntimeError, CompileTimeError
+cyclic_type_test/04: RuntimeError, CompileTimeError
 cyclic_type_variable_test/01: MissingCompileTimeError
 cyclic_type_variable_test/02: MissingCompileTimeError
 cyclic_type_variable_test/03: MissingCompileTimeError
@@ -376,19 +352,16 @@
 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_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.
@@ -398,7 +371,6 @@
 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.
@@ -414,7 +386,6 @@
 external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory2_test/03: MissingCompileTimeError
@@ -438,8 +409,6 @@
 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
@@ -463,11 +432,9 @@
 function_type_alias6_test/none: RuntimeError
 function_type_alias_test: RuntimeError
 generalized_void_syntax_test: CompileTimeError # Issue #30176.
-generic_async_star_test: RuntimeError
 generic_closure_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_bounds_test: CompileTimeError
-generic_function_dcall_test: CompileTimeError
 generic_function_dcall_test: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
@@ -475,17 +442,12 @@
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
 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: 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_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
@@ -495,16 +457,12 @@
 implicit_this_test/04: 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
 invocation_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
-issue13179_test: CompileTimeError # Issue 31402 (Parameter default value)
 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
-language_2/least_upper_bound_expansive_test/none: CompileTimeError
 least_upper_bound_expansive_test/none: CompileTimeError
 library_env_test/has_html_support: RuntimeError # KernelVM bug: Configurable imports.
 library_env_test/has_no_io_support: RuntimeError # KernelVM bug: Configurable imports.
@@ -609,6 +567,8 @@
 nested_generic_closure_test: RuntimeError
 no_main_test/01: DartkCrash
 no_main_test/01: Skip
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError # Issue #31426
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError # Issue #31426
 null_no_such_method_test: CompileTimeError # Issue 31533
 optional_named_parameters_test/02: MissingCompileTimeError
 optional_named_parameters_test/04: MissingCompileTimeError
@@ -662,15 +622,12 @@
 override_inheritance_no_such_method_test/13: MissingCompileTimeError
 parser_quirks_test: CompileTimeError # Issue 31533
 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_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
 regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_22976_test/01: CompileTimeError # Issue 31402 (Variable declaration)
 regress_23089_test: Crash
@@ -684,6 +641,7 @@
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
+regress_30516_test: CompileTimeError # Issue 30470.
 setter4_test: MissingCompileTimeError # Issue 14736
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
@@ -715,6 +673,7 @@
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
+syntax_test/59: Pass # Issue 30470.
 type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
@@ -751,44 +710,68 @@
 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: CompileTimeError
 void_type_usage_test/paren_stmt: CompileTimeError
 void_type_usage_test/setter_assign: CompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
 
+[ $compiler == dartk && $system == windows && $strong ]
+ct_const2_test: Fail
+hello_dart_test: Fail
+recursive_mixin_test: Fail
+redirecting_factory_reflection_test: Fail
+
+[ $compiler == dartk && $system != windows && $strong ]
+hello_dart_test: Crash
+recursive_mixin_test: Crash
+redirecting_factory_reflection_test: Crash
+
+[ $compiler == dartk && $strong ]
+cha_deopt2_test: CompileTimeError, DartkCrash # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt3_test: CompileTimeError, DartkCrash # KernelVM bug: Deferred loading kernel issue 28335.
+
 # 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.
@@ -798,7 +781,6 @@
 duplicate_implements_test/01: MissingCompileTimeError # Please triage.
 duplicate_implements_test/02: 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.
 mixin_black_listed_test/02: MissingCompileTimeError # Please triage.
 null_test/02: MissingCompileTimeError # Please triage.
@@ -1009,7 +991,6 @@
 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
@@ -1058,17 +1039,7 @@
 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
+async_star_test/02: RuntimeError, CompileTimeError # Issue 31402 (Invocation arguments)
 bad_named_parameters2_test/01: MissingCompileTimeError
 bad_named_parameters_test/01: MissingCompileTimeError
 bad_named_parameters_test/02: MissingCompileTimeError
@@ -1137,8 +1108,8 @@
 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_dynamic_type_literal_test/02: 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.
@@ -1162,7 +1133,6 @@
 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.
@@ -1209,8 +1179,7 @@
 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_redirecting_factory_test: CompileTimeError, Fail, Crash # Issue 23408, KernelVM bug: Deferred loading kernel issue 28335.
 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.
@@ -1226,19 +1195,16 @@
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
-dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
+dynamic_test: RuntimeError # 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
+export_ambiguous_main_negative_test: Skip # Issue 29895 Fail Issue 14763
+export_double_same_main_test: Skip # Issue 29895 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
@@ -1265,8 +1231,6 @@
 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
@@ -1291,10 +1255,9 @@
 function_type_alias6_test/none: RuntimeError
 function_type_alias_test: RuntimeError
 generalized_void_syntax_test: CompileTimeError # Issue #30176
-generic_async_star_test: RuntimeError
 generic_closure_test: RuntimeError
 generic_function_bounds_test: CompileTimeError
-generic_function_dcall_test: CompileTimeError
+generic_function_dcall_test: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_list_checked_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -1307,9 +1270,8 @@
 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 # 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
@@ -1346,22 +1308,17 @@
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_creation_in_function_annotation_test: SkipByDesign
-instantiate_tearoff_after_contravariance_check_test: CompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
-instantiate_tearoff_test: CompileTimeError
 invocation_mirror2_test: SkipByDesign
 invocation_mirror_invoke_on2_test: SkipByDesign
 invocation_mirror_invoke_on_test: SkipByDesign
 invocation_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
-issue13179_test: CompileTimeError # Issue 31402 (Parameter default value)
 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
-language_2/least_upper_bound_expansive_test/none: CompileTimeError
 least_upper_bound_expansive_test/none: RuntimeError
-least_upper_bound_expansive_test/none: CompileTimeError
 library_env_test/has_html_support: RuntimeError # KernelVM bug: Configurable imports.
 library_env_test/has_mirror_support: RuntimeError, OK
 library_env_test/has_no_io_support: RuntimeError # KernelVM bug: Configurable imports.
@@ -1466,6 +1423,9 @@
 no_main_test/01: Skip
 no_such_method_mock_test: RuntimeError
 no_such_method_test: SkipByDesign
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/04: RuntimeError # Issue #31911
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError # Issue #31426
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError # Issue #31426
 null_no_such_method_test: CompileTimeError # Issue 31533
 null_test/02: MissingCompileTimeError
 null_test/03: MissingCompileTimeError
@@ -1551,6 +1511,7 @@
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
+regress_30516_test: CompileTimeError # Issue 30470.
 setter4_test: MissingCompileTimeError # Issue 14736
 setter_no_getter_test/01: Pass, CompileTimeError # Issue 31533 (started passing after switching to batch-mode)
 setter_override_test/01: MissingCompileTimeError
@@ -1585,6 +1546,7 @@
 syntax_test/31: MissingCompileTimeError
 syntax_test/32: MissingCompileTimeError
 syntax_test/33: MissingCompileTimeError
+syntax_test/59: Pass # Issue 30470.
 type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
@@ -1654,39 +1616,48 @@
 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: 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_return_to_void: CompileTimeError
 void_type_usage_test/paren_stmt: CompileTimeError
 void_type_usage_test/setter_assign: CompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 5a95759..6bedfa3 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -282,7 +282,6 @@
 export_ambiguous_main_negative_test: Skip # Issue 29895
 export_ambiguous_main_test: Crash
 export_double_same_main_test: Skip # Issue 29895
-extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory1_test/00: MissingCompileTimeError
@@ -878,6 +877,7 @@
 switch_fallthru_test/01: MissingCompileTimeError
 symbol_literal_test/01: MissingCompileTimeError
 sync_generator1_test/01: MissingCompileTimeError
+syntax_test/59: MissingCompileTimeError,OK # Issue 30516.
 top_level_getter_no_setter1_test: MissingCompileTimeError
 top_level_getter_no_setter2_test: MissingCompileTimeError
 transitive_private_library_access_test: MissingCompileTimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index f967113..54520a6 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -310,7 +310,6 @@
 enum_private_test/02: MissingCompileTimeError
 error_stacktrace_test/00: MissingCompileTimeError
 export_ambiguous_main_test: MissingCompileTimeError
-extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory1_test/00: MissingCompileTimeError
@@ -834,6 +833,7 @@
 switch_fallthru_test/01: MissingCompileTimeError
 symbol_literal_test/01: MissingCompileTimeError
 sync_generator1_test/01: MissingCompileTimeError
+syntax_test/59: MissingCompileTimeError,OK # Issue 30516.
 top_level_getter_no_setter1_test: MissingCompileTimeError
 top_level_getter_no_setter2_test: MissingCompileTimeError
 transitive_private_library_access_test: MissingCompileTimeError
diff --git a/tests/language_2/no_such_method_tearoff_fta_test.dart b/tests/language_2/no_such_method_tearoff_fta_test.dart
new file mode 100644
index 0000000..163dc7e
--- /dev/null
+++ b/tests/language_2/no_such_method_tearoff_fta_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+void foo() {}
+
+main() {
+  final dynamic tearoff = foo;
+
+  Expect.throwsNoSuchMethodError(() {
+    tearoff<String>(3);
+  }, 'Providing type arguments to a non-generic tearoff should throw go NSM.');
+}
diff --git a/tests/language_2/nosuchmethod_forwarding/README.md b/tests/language_2/nosuchmethod_forwarding/README.md
index 15cf2d2..bc759e3 100644
--- a/tests/language_2/nosuchmethod_forwarding/README.md
+++ b/tests/language_2/nosuchmethod_forwarding/README.md
@@ -5,4 +5,4 @@
 implicitly for all method signatures in the interface of a class that
 declares a non-trivial `noSuchMethod`. For more details, please check
 the
-[feature specification](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/nosuchmethod-forwarding.md).
\ No newline at end of file
+[feature specification](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/nosuchmethod-forwarding.md).
diff --git a/tests/language_2/nosuchmethod_forwarding/nosuchmethod_forwarding_test.dart b/tests/language_2/nosuchmethod_forwarding/nosuchmethod_forwarding_test.dart
new file mode 100644
index 0000000..d54a784
--- /dev/null
+++ b/tests/language_2/nosuchmethod_forwarding/nosuchmethod_forwarding_test.dart
@@ -0,0 +1,54 @@
+// 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.
+
+// Testing that `noSuchMethod` appears to use implicit forwarders (we don't
+// care how it's actually implemented, but it should look like that).
+
+import 'package:expect/expect.dart';
+
+// "Template" class: Something to emulate.
+class A {
+  int foo(String s) => s.length;
+}
+
+// Emulate `A`, but only dynamically.
+class B {
+  noSuchMethod(_) => 31;
+}
+
+// Emulate `A`, including its type.
+class C implements A {
+  noSuchMethod(_) => 41;
+}
+
+// Emulate `A` with its type, based on an inherited `noSuchMethod`.
+class D extends B implements A {}
+
+void test(A a, int expectedValue) {
+  // Regular superinterfaces can be supported by `noSuchMethod`.
+  Expect.equals(expectedValue, a.foo('Hello!')); //# 04: ok
+
+  // `noSuchMethod` triggers generation of forwarders, so a statically
+  // known instance method tear-off yields a `Function`, also when invoked
+  // dynamically.
+  Expect.isTrue(a.foo is Function); //# 05: ok
+  Expect.isTrue((a as dynamic).foo is Function); //# 06: ok
+
+  // For an unknown member name the invocation must be dynamic, and in that
+  // case it does not match a forwarder, but we invoke `noSuchMethod`.
+  Expect.equals(expectedValue, (a as dynamic).bar); //# 07: ok
+}
+
+main() {
+  // Dynamic invocations can make a `B` seem to implement `A`.
+  Expect.equals(31, (new B() as dynamic).foo('Hello!')); //# 01: ok
+
+  // But `noSuchMethod` does not affect the type or interface of a class.
+  A a; //# 02: continued
+  Expect.throws(() => a = new B() as dynamic); //# 02: ok
+  new B().foo('Hello!'); //# 03: compile-time error
+
+  test(new C(), 41);
+  test(new D(), 31);
+}
diff --git a/tests/language_2/regress_30516_test.dart b/tests/language_2/regress_30516_test.dart
new file mode 100644
index 0000000..d62e4d6
--- /dev/null
+++ b/tests/language_2/regress_30516_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef void RecognizerCallback<T>();
+typedef void GestureTapCancelCallback();
+GestureTapCancelCallback onTapCancel;
+T invokeCallback<T>(String name, RecognizerCallback<T> callback,
+    {String debugReport()}) {}
+main() {
+  invokeCallback<void>('spontaneous onTapCancel', onTapCancel);
+}
diff --git a/tests/language_2/void_type_usage_test.dart b/tests/language_2/void_type_usage_test.dart
index 0b91393..64a040b 100644
--- a/tests/language_2/void_type_usage_test.dart
+++ b/tests/language_2/void_type_usage_test.dart
@@ -6,7 +6,7 @@
 
 void use(dynamic x) { }
 
-void testVoidParam(void x) {
+testVoidParam(void x) {
   x;  //# param_stmt: ok
   true ? x : x;  //# param_conditional: compile-time error
   for (x; false; x) {}   //# param_for: ok
@@ -34,7 +34,7 @@
   x..toString();  //# param_cascade: compile-time error
 }
 
-void testVoidCall(void f()) {
+testVoidCall(void f()) {
   f();  //# call_stmt: ok
   true ? f() : f();  //# call_conditional: compile-time error
   for (f(); false; f()) {}   //# call_for: ok
@@ -60,7 +60,7 @@
   f()..toString();  //# call_cascade: compile-time error
 }
 
-void testVoidLocal() {
+testVoidLocal() {
   void x;
   x = 42;   //# local_assign: ok
   x;  //# local_stmt: ok
@@ -90,7 +90,7 @@
   x..toString();  //# local_cascade: compile-time error
 }
 
-void testVoidFinalLocal() {
+testVoidFinalLocal() {
   final void x = null;
   x = 42;   //# final_local_assign: compile-time error
   x;  //# final_local_stmt: ok
@@ -121,7 +121,7 @@
 }
 
 void global;
-void testVoidGlobal() {
+testVoidGlobal() {
   global;  //# global_stmt: ok
   true ? global : global;  //# global_conditional: compile-time error
   for (global; false; global) {}   //# global_for: ok
@@ -149,7 +149,7 @@
   global..toString();  //# global_cascade: compile-time error
 }
 
-void testVoidConditional() {
+testVoidConditional() {
   void x;
   (true ? x : x);   //# conditional_parens: compile-time error
   true ? x : x;  //# conditional_stmt: compile-time error
@@ -203,7 +203,6 @@
   for (var v in true ? x : 499) {}   //# conditional_for_in: compile-time error
 }
 
-
 class A<T> {
   T x;
 
@@ -231,8 +230,7 @@
   }
 }
 
-
-void testInstanceField() {
+testInstanceField() {
   A<void> a = new A<void>();
   a.x = 499;  //# field_assign: ok
   a.x;  //# instance_stmt: ok
@@ -317,7 +315,7 @@
   c.x..toString();  //# instance3_cascade: compile-time error
 }
 
-void testParenthesized() {
+testParenthesized() {
   void x;
   (x);  //# paren_stmt: ok
   true ? (x) : (x);  //# paren_conditional: compile-time error
@@ -344,6 +342,26 @@
   (x)..toString();  //# paren_cascade: compile-time error
 }
 
+void testReturnToVoid(void x, void f()) {
+  void y;
+  final void z;
+  A<void> a = new A<void>();
+  B b = new B();
+  C c = new C();
+  return x;   //# param_return_to_void: ok
+  return f();   //# call_return_to_void: ok
+  return y;   //# local_return_to_void: ok
+  return z;   //# final_local_return_to_void: ok
+  return global;   //# global_return_to_void: ok
+  return true ? x : x;   //# conditional_return_to_void: compile-time error
+  return true ? 499 : x;   //# conditional2_return_to_void: compile-time error
+  return true ? x : 499;   //# conditional3_return_to_void: compile-time error
+  return a.x;   //# instance_return_to_void: ok
+  return b.x;   //# instance2_return_to_void: ok
+  return c.x;   //# instance3_return_to_void: ok
+  return (x);   //# paren_return_to_void: ok
+}
+
 main() {
   try {
     testVoidParam(499);
@@ -353,8 +371,9 @@
     testVoidConditional();
     testInstanceField();
     testParenthesized();
+    testReturnToVoid(499, () {});
   } catch (e) {
     // Silently eat all dynamic errors.
-    // This test is only testing static warnings.
+    // This test is only testing static analysis.
   }
-}
\ No newline at end of file
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 627c0be..bf9e495 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -27,12 +27,9 @@
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
 convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by dart2js.
-convert/base64_test/01: Crash # Issue 31762
 convert/chunked_conversion_utf88_test: Slow, Pass
-convert/utf82_test: Crash # Issue 31762
 convert/utf85_test: Slow, Pass
 developer/timeline_test: Skip # Not supported
-math/double_pow_test: Crash # Issue 31762
 math/double_pow_test: RuntimeError
 math/low_test: RuntimeError
 mirrors/class_declarations_test/none: RuntimeError # Issue 13440
@@ -124,7 +121,6 @@
 mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
 mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
 profiler/metrics_num_test: Skip # Because of a int / double type test.
-typed_data/int32x4_bigint_test: Crash # Issue 31762
 typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
 typed_data/int64_list_load_store_test: RuntimeError # Issue 10275
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
@@ -153,6 +149,11 @@
 async/stream_event_transformed_test: Skip # Flutter Issue 9113
 mirrors/*: Skip # Flutter does not support mirrors.
 
+[ $runtime == safari ]
+convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
+typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
+typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
+
 [ $runtime == vm ]
 convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Infrequent timeouts.
 
@@ -184,6 +185,11 @@
 convert/streamed_conversion_json_utf8_decode_test: Skip # Timeout.
 mirrors/immutable_collections_test: SkipSlow # Timeout.
 
+[ $builder_tag == mac10_7 && $runtime == safari ]
+typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+
 [ $builder_tag == strong && $compiler == dart2analyzer ]
 *: Skip # Issue 28649
 
@@ -238,10 +244,6 @@
 async/zone_empty_description2_test: RuntimeError # Timer interface not supported: Issue 7728.
 mirrors/mirrors_reader_test: Skip # Running in v8 suffices. Issue 16589 - RuntimeError.  Issue 22130 - Crash (out of memory).
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-mirrors/mirrors_reader_test: SkipSlow # Times out. Issue 20806.
-mirrors/null_test: Fail # Issue 16831
-
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Pass, Slow # Issue 12029.
 
@@ -280,20 +282,34 @@
 math/math2_test: RuntimeError
 math/math_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 && $mode == debug && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
 mirrors/invocation_fuzz_test/smi: Pass, Slow
 mirrors/variable_is_const_test/01: Crash # Please triage.
 
+[ $compiler == dartk && $system == windows ]
+mirrors/invoke_throws_test: Fail
+mirrors/list_constructor_test/01: Fail
+mirrors/list_constructor_test/none: Fail
+mirrors/mirrors_test: Fail
+mirrors/redirecting_factory_test/01: Fail
+mirrors/redirecting_factory_test/02: Fail
+mirrors/redirecting_factory_test/none: Fail
+
+[ $compiler == dartk && $system != windows ]
+mirrors/invoke_throws_test: Crash
+mirrors/list_constructor_test/01: Crash
+mirrors/list_constructor_test/none: Crash
+mirrors/mirrors_test: Crash
+mirrors/redirecting_factory_test/01: Crash
+mirrors/redirecting_factory_test/02: Crash
+mirrors/redirecting_factory_test/none: Crash
+
 # 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) ]
 mirrors/invocation_fuzz_test/smi: Crash # Please triage.
 mirrors/library_uri_io_test: RuntimeError # Please triage.
-mirrors/spawn_function_root_library_test: Skip
 
 [ $compiler != dartk && $compiler != dartkp && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
 mirrors/initializing_formals_test/01: Fail # initializing formals are implicitly final as of Dart 1.21
@@ -394,7 +410,6 @@
 mirrors/invocation_fuzz_test/string: Crash
 mirrors/invoke_private_test: RuntimeError
 mirrors/invoke_private_wrong_library_test: RuntimeError
-mirrors/invoke_throws_test: Crash
 mirrors/library_declarations_test/none: RuntimeError
 mirrors/library_enumeration_deferred_loading_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/library_exports_hidden_test: RuntimeError
@@ -407,8 +422,6 @@
 mirrors/library_imports_prefixed_test: RuntimeError
 mirrors/library_imports_shown_test: RuntimeError
 mirrors/library_metadata_test: RuntimeError
-mirrors/list_constructor_test/01: Crash
-mirrors/list_constructor_test/none: Crash
 mirrors/load_library_test: RuntimeError
 mirrors/metadata_allowed_values_test/13: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/14: MissingCompileTimeError
@@ -421,7 +434,6 @@
 mirrors/mirrors_nsm_mismatch_test: RuntimeError
 mirrors/mirrors_nsm_test/dart2js: RuntimeError
 mirrors/mirrors_reader_test: Crash
-mirrors/mirrors_test: Crash
 mirrors/mirrors_used_inheritance_test: RuntimeError
 mirrors/mirrors_used_typedef_declaration_test/01: RuntimeError
 mirrors/mirrors_used_typedef_declaration_test/none: RuntimeError
@@ -434,9 +446,6 @@
 mirrors/private_class_field_test: RuntimeError
 mirrors/private_symbol_test: RuntimeError
 mirrors/private_types_test: RuntimeError
-mirrors/redirecting_factory_test/01: Crash
-mirrors/redirecting_factory_test/02: Crash
-mirrors/redirecting_factory_test/none: Crash
 mirrors/reflect_class_test/01: RuntimeError
 mirrors/reflect_class_test/02: RuntimeError
 mirrors/reflect_class_test/none: RuntimeError
@@ -475,27 +484,15 @@
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
 async/timer_not_available_test: Fail, OK
+convert/base64_test/01: CompileTimeError # Large integer literal
 convert/json_utf8_chunk_test: RuntimeError # Large integers
+convert/utf82_test: CompileTimeError # Large integer literal
 js/*: Skip
+math/double_pow_test: CompileTimeError # Large integer literal
 mirrors/deferred_type_test: CompileTimeError, OK # Don't have a multitest marker for dynamic compile time errors.
 mirrors/native_class_test: Fail, OK # This test is meant to run in a browser.
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm || ($compiler == dart2js && $dart2js_with_kernel) ]
-convert/base64_test/01: CompileTimeError # Large integer literal
-convert/utf82_test: CompileTimeError # Large integer literal
-math/double_pow_test: CompileTimeError # Large integer literal
 typed_data/int32x4_bigint_test: CompileTimeError # Large integer literal
 
-[ $runtime == safari || $runtime == safarimobilesim ]
-convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
-typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-
-[ $runtime == safarimobilesim || $builder_tag == mac10_7 && $runtime == safari ]
-typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-
 [ $hot_reload || $hot_reload_rollback ]
 async/stream_transformer_test: Pass, Fail # Closure identity
 mirrors/fake_function_with_call_test: SkipByDesign # Method equality
diff --git a/tests/lib_2/async/slow_consumer2_test.dart b/tests/lib_2/async/slow_consumer2_test.dart
index 460c920..6b1ab56 100644
--- a/tests/lib_2/async/slow_consumer2_test.dart
+++ b/tests/lib_2/async/slow_consumer2_test.dart
@@ -31,7 +31,8 @@
   Future addStream(Stream stream) {
     Completer result = new Completer();
     var subscription;
-    subscription = stream.listen((List<int> data) {
+    subscription = stream.listen((Object _data) {
+      List<int> data = _data;
       receivedCount += data.length;
       usedBufferSize += data.length;
       bufferedData.add(data);
diff --git a/tests/lib_2/async/slow_consumer3_test.dart b/tests/lib_2/async/slow_consumer3_test.dart
index c005198..17de0e0 100644
--- a/tests/lib_2/async/slow_consumer3_test.dart
+++ b/tests/lib_2/async/slow_consumer3_test.dart
@@ -31,7 +31,8 @@
   Future addStream(Stream stream) {
     Completer result = new Completer();
     var subscription;
-    subscription = stream.listen((List<int> data) {
+    subscription = stream.listen((Object _data) {
+      List<int> data = _data;
       receivedCount += data.length;
       usedBufferSize += data.length;
       bufferedData.add(data);
diff --git a/tests/lib_2/async/slow_consumer_test.dart b/tests/lib_2/async/slow_consumer_test.dart
index 9cd3b94..9a3c92e 100644
--- a/tests/lib_2/async/slow_consumer_test.dart
+++ b/tests/lib_2/async/slow_consumer_test.dart
@@ -29,7 +29,8 @@
     bool done = false;
     Completer completer = new Completer();
     var subscription;
-    subscription = stream.listen((List<int> data) {
+    subscription = stream.listen((Object _data) {
+      List data = _data;
       current = current.then((count) {
         // Simulated amount of time it takes to handle the data.
         int ms = data.length * 1000 ~/ bytesPerSecond;
diff --git a/tests/lib_2/async/stream_from_iterable_test.dart b/tests/lib_2/async/stream_from_iterable_test.dart
index b58d9df..9367cc7 100644
--- a/tests/lib_2/async/stream_from_iterable_test.dart
+++ b/tests/lib_2/async/stream_from_iterable_test.dart
@@ -59,7 +59,7 @@
   });
 
   test("iterable-paused", () {
-    Stream stream = new Stream.fromIterable(iter);
+    var stream = new Stream<int>.fromIterable(iter);
     Events actual = new Events();
     StreamSubscription subscription;
     subscription = stream.listen((int value) {
diff --git a/tests/lib_2/convert/json_toEncodable_reviver_test.dart b/tests/lib_2/convert/json_toEncodable_reviver_test.dart
index 5ef66ec..f5f8313 100644
--- a/tests/lib_2/convert/json_toEncodable_reviver_test.dart
+++ b/tests/lib_2/convert/json_toEncodable_reviver_test.dart
@@ -12,7 +12,7 @@
   A(this.x);
 }
 
-toEncodable(A a) => {"A": a.x};
+toEncodable(Object a) => {"A": (a as A).x};
 reviver(key, value) {
   if (value is Map && value.length == 1 && value["A"] != null) {
     return new A(value["A"]);
diff --git a/tests/lib_2/convert/streamed_conversion_json_utf8_encode_test.dart b/tests/lib_2/convert/streamed_conversion_json_utf8_encode_test.dart
index 71f7ca9..c4f1a44 100644
--- a/tests/lib_2/convert/streamed_conversion_json_utf8_encode_test.dart
+++ b/tests/lib_2/convert/streamed_conversion_json_utf8_encode_test.dart
@@ -19,7 +19,7 @@
   return controller.stream.transform(jsonUtf8.encoder);
 }
 
-void testUnpaused(List<int> expected, Stream stream) {
+void testUnpaused(List<int> expected, Stream<List<int>> stream) {
   asyncStart();
   stream.toList().then((list) {
     var combined = <int>[];
@@ -29,7 +29,7 @@
   });
 }
 
-void testWithPauses(List<int> expected, Stream stream) {
+void testWithPauses(List<int> expected, Stream<List<int>> stream) {
   asyncStart();
   var accumulated = <int>[];
   var sub;
diff --git a/tests/lib_2/convert/streamed_conversion_utf8_encode_test.dart b/tests/lib_2/convert/streamed_conversion_utf8_encode_test.dart
index 64ee6c2..3daba03 100644
--- a/tests/lib_2/convert/streamed_conversion_utf8_encode_test.dart
+++ b/tests/lib_2/convert/streamed_conversion_utf8_encode_test.dart
@@ -25,7 +25,7 @@
   return controller.stream.transform(utf8.encoder);
 }
 
-void testUnpaused(List<int> expected, Stream stream) {
+void testUnpaused(List<int> expected, Stream<List<int>> stream) {
   asyncStart();
   stream.toList().then((list) {
     var combined = [];
@@ -36,7 +36,7 @@
   });
 }
 
-void testWithPauses(List<int> expected, Stream stream) {
+void testWithPauses(List<int> expected, Stream<List<int>> stream) {
   asyncStart();
   var combined = <int>[];
   var sub;
diff --git a/tests/lib_2/isolate/browser/typed_data_message_test.dart b/tests/lib_2/isolate/browser/typed_data_message_test.dart
index b000d4d..3070fc0 100644
--- a/tests/lib_2/isolate/browser/typed_data_message_test.dart
+++ b/tests/lib_2/isolate/browser/typed_data_message_test.dart
@@ -95,7 +95,8 @@
   test("send objects and receive them back", () {
     ReceivePort response = new ReceivePort();
     Isolate.spawn(pingPong, response.sendPort);
-    response.first.then((SendPort remote) {
+    response.first.then((_remote) {
+      SendPort remote = _remote;
       // Send objects and receive them back.
       for (int i = 0; i < elements.length; i++) {
         var sentObject = elements[i];
diff --git a/tests/lib_2/isolate/count_test.dart b/tests/lib_2/isolate/count_test.dart
index e4f88e9..740631c 100644
--- a/tests/lib_2/isolate/count_test.dart
+++ b/tests/lib_2/isolate/count_test.dart
@@ -12,7 +12,8 @@
   int count = 0;
   var port = new ReceivePort();
   replyTo.send(["init", port.sendPort]);
-  port.listen((int message) {
+  port.listen((_message) {
+    int message = _message;
     if (message == -1) {
       expect(count, 10);
       replyTo.send(["done"]);
diff --git a/tests/lib_2/isolate/handle_error2_test.dart b/tests/lib_2/isolate/handle_error2_test.dart
index 508690b..452b46a 100644
--- a/tests/lib_2/isolate/handle_error2_test.dart
+++ b/tests/lib_2/isolate/handle_error2_test.dart
@@ -33,7 +33,7 @@
 /// Returns a list of `[isolate, commandPort]` in a future.
 Future spawn(entry) {
   ReceivePort reply = new ReceivePort();
-  Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  var isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
   return isolate.then((Isolate isolate) {
     isolate.setErrorsFatal(false);
     isolate.resume(isolate.pauseCapability);
diff --git a/tests/lib_2/isolate/handle_error3_test.dart b/tests/lib_2/isolate/handle_error3_test.dart
index eeac985..e725822 100644
--- a/tests/lib_2/isolate/handle_error3_test.dart
+++ b/tests/lib_2/isolate/handle_error3_test.dart
@@ -33,7 +33,7 @@
 /// Returns a list of `[isolate, commandPort]` in a future.
 Future spawn(entry) {
   ReceivePort reply = new ReceivePort();
-  Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  var isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
   return isolate.then((Isolate isolate) {
     isolate.setErrorsFatal(false);
     isolate.resume(isolate.pauseCapability);
diff --git a/tests/lib_2/isolate/illegal_msg_function_test.dart b/tests/lib_2/isolate/illegal_msg_function_test.dart
index adda26e..89baaf2 100644
--- a/tests/lib_2/isolate/illegal_msg_function_test.dart
+++ b/tests/lib_2/isolate/illegal_msg_function_test.dart
@@ -25,7 +25,8 @@
   // Ignore returned Future.
   Isolate.spawn(echo, port.sendPort);
 
-  port.first.then((SendPort snd) {
+  port.first.then((_snd) {
+    SendPort snd = _snd;
     int function(x) => x + 2;
     try {
       snd.send(function);
diff --git a/tests/lib_2/isolate/illegal_msg_mirror_test.dart b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
index a86b5dc..af5773b 100644
--- a/tests/lib_2/isolate/illegal_msg_mirror_test.dart
+++ b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
@@ -31,7 +31,8 @@
   // Ignore returned Future.
   Isolate.spawn(echo, port.sendPort);
 
-  port.first.then((SendPort snd) {
+  port.first.then((_snd) {
+    SendPort snd = _snd;
     final methodMirror = reflectClass(Class).declarations[#method];
     try {
       snd.send(methodMirror);
diff --git a/tests/lib_2/isolate/isolate_current_test.dart b/tests/lib_2/isolate/isolate_current_test.dart
index e2e2d99..bdd62ea 100644
--- a/tests/lib_2/isolate/isolate_current_test.dart
+++ b/tests/lib_2/isolate/isolate_current_test.dart
@@ -59,8 +59,8 @@
   };
 
   Isolate.spawn(replyCurrent, [p.sendPort, asList]).then((Isolate isolate) {
-    return response.future.then((Isolate isolate2) {
-      expectIsolateEquals(isolate, isolate2);
+    return response.future.then((isolate2) {
+      expectIsolateEquals(isolate, isolate2 as Isolate);
       asyncEnd();
     });
   });
@@ -98,8 +98,8 @@
   };
 
   Isolate.spawn(expectCurrent, [p.sendPort, asList]).then((Isolate isolate) {
-    return response.future.then((SendPort port) {
-      port.send(transform(isolate));
+    return response.future.then((port) {
+      (port as SendPort).send(transform(isolate));
     });
   });
 }
diff --git a/tests/lib_2/isolate/kill_test.dart b/tests/lib_2/isolate/kill_test.dart
index 2bf89cd..62a4dd1 100644
--- a/tests/lib_2/isolate/kill_test.dart
+++ b/tests/lib_2/isolate/kill_test.dart
@@ -21,7 +21,8 @@
   var completer = new Completer(); // Completed by first reply from isolate.
   RawReceivePort reply = new RawReceivePort(completer.complete);
   Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
-    completer.future.then((SendPort echoPort) {
+    completer.future.then((_echoPort) {
+      SendPort echoPort = _echoPort;
       List result = [];
       reply.handler = (v) {
         result.add(v);
diff --git a/tests/lib_2/isolate/mandel_isolate_test.dart b/tests/lib_2/isolate/mandel_isolate_test.dart
index 16db3c0..ee21f1e 100644
--- a/tests/lib_2/isolate/mandel_isolate_test.dart
+++ b/tests/lib_2/isolate/mandel_isolate_test.dart
@@ -107,8 +107,8 @@
   void processLine(int y) {
     ReceivePort reply = new ReceivePort();
     _port.send([y, reply.sendPort]);
-    reply.first.then((List<int> message) {
-      _state.notifyProcessedLine(this, y, message);
+    reply.first.then((message) {
+      _state.notifyProcessedLine(this, y, message as List<int>);
     });
   }
 
diff --git a/tests/lib_2/isolate/message3_test.dart b/tests/lib_2/isolate/message3_test.dart
index 95fc7a4..be4d5e2 100644
--- a/tests/lib_2/isolate/message3_test.dart
+++ b/tests/lib_2/isolate/message3_test.dart
@@ -256,8 +256,8 @@
     x[0] = 22;
     Expect.equals(22, x[0]);
     // Must be extendable.
-    x["gee"] = 499;
-    Expect.equals(499, x["gee"]);
+    x[123] = 499;
+    Expect.equals(499, x[123]);
   });
 
   Map cyclicMap = {};
@@ -457,7 +457,8 @@
   Isolate
       .spawn(echoMain, [initialReplyPort.sendPort, testPort.sendPort])
       .then((_) => initialReplyPort.first)
-      .then((SendPort ping) {
+      .then((_ping) {
+        SendPort ping = _ping;
         runTests(ping, checks);
         Expect.isTrue(checks.length > 0);
         completer.future.then((_) => ping.send("halt")).then((_) => asyncEnd());
diff --git a/tests/lib_2/isolate/mint_maker_test.dart b/tests/lib_2/isolate/mint_maker_test.dart
index b5d350b..e9f5f5b 100644
--- a/tests/lib_2/isolate/mint_maker_test.dart
+++ b/tests/lib_2/isolate/mint_maker_test.dart
@@ -44,8 +44,8 @@
 
   void createPurse(int balance, handlePurse(PurseWrapper purse)) {
     ReceivePort reply = new ReceivePort();
-    reply.first.then((SendPort purse) {
-      handlePurse(new PurseWrapper(purse));
+    reply.first.then((purse) {
+      handlePurse(new PurseWrapper(purse as SendPort));
     });
     _mint.send([balance, reply.sendPort]);
   }
@@ -103,10 +103,10 @@
 
   PurseWrapper(this._purse) {}
 
-  void _sendReceive(message, replyHandler(reply)) {
+  void _sendReceive<T>(String message, replyHandler(T reply)) {
     ReceivePort reply = new ReceivePort();
     _purse.send([message, reply.sendPort]);
-    reply.first.then(replyHandler);
+    reply.first.then((a) => replyHandler(a as T));
   }
 
   void queryBalance(handleBalance(int balance)) {
@@ -127,9 +127,9 @@
 mintMakerWrapper(SendPort replyPort) {
   ReceivePort receiver = new ReceivePort();
   replyPort.send(receiver.sendPort);
-  receiver.listen((SendPort replyTo) {
+  receiver.listen((replyTo) {
     Mint mint = new Mint();
-    replyTo.send(mint.port);
+    (replyTo as SendPort).send(mint.port);
   });
 }
 
@@ -147,8 +147,8 @@
 
   void makeMint(handleMint(MintWrapper mint)) {
     ReceivePort reply = new ReceivePort();
-    reply.first.then((SendPort mint) {
-      handleMint(new MintWrapper(mint));
+    reply.first.then((mint) {
+      handleMint(new MintWrapper(mint as SendPort));
     });
     _port.send(reply.sendPort);
   }
diff --git a/tests/lib_2/isolate/typed_message_test.dart b/tests/lib_2/isolate/typed_message_test.dart
index 6c6d52e..4bb2770 100644
--- a/tests/lib_2/isolate/typed_message_test.dart
+++ b/tests/lib_2/isolate/typed_message_test.dart
@@ -16,7 +16,8 @@
   print("Starting log server.");
   ReceivePort port = new ReceivePort();
   replyTo.send(port.sendPort);
-  port.first.then((List<int> message) {
+  port.first.then((_message) {
+    List<int> message = _message;
     print("Log $message");
     Expect.equals(5, message.length);
     Expect.equals(0, message[0]);
diff --git a/tests/lib_2/isolate/unresolved_ports_test.dart b/tests/lib_2/isolate/unresolved_ports_test.dart
index b6ca58d..4634cd0 100644
--- a/tests/lib_2/isolate/unresolved_ports_test.dart
+++ b/tests/lib_2/isolate/unresolved_ports_test.dart
@@ -41,7 +41,7 @@
       .then((msg) => msg[1].send('${msg[0]}\nBob says: we are all coming!'));
 }
 
-Future<SendPort> spawnFunction(function) {
+Future spawnFunction(function) {
   ReceivePort init = new ReceivePort();
   Isolate.spawn(function, init.sendPort);
   return init.first;
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 6bcb0a9..40162ef 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -74,7 +74,14 @@
 html/xhr_test/json: Fail # IE10 returns string, not JSON object
 
 [ $runtime == safari ]
+convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 html/audiobuffersourcenode_test/functional: RuntimeError
+html/canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
+html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
+html/element_animate_test: Fail # Element.animate not supported on these browsers.
+html/element_test: Pass, Fail # Issue 21434
+html/fileapi_supported_test: Fail
+html/gamepad_test: Fail # Safari does not support Navigator.getGamepads()
 html/indexeddb_1_test/functional: Skip # Times out. Issue 21433
 html/indexeddb_2_test: RuntimeError # Issue 21433
 html/indexeddb_3_test: Skip # Times out 1 out of 10.
@@ -85,17 +92,17 @@
 html/input_element_month_test: RuntimeError
 html/input_element_time_test: RuntimeError
 html/input_element_week_test: RuntimeError
+html/media_stream_test: Pass, Fail
+html/mediasource_test: Pass, Fail # MediaSource only available on Safari 8 desktop, we can't express that.
 html/notification_test: Fail # Safari doesn't let us access the fields of the Notification to verify them.
+html/rtc_test: Fail
+html/shadow_dom_test: Fail
+html/speechrecognition_test: Fail
 html/touchevent_test: Fail # Safari does not support TouchEvents
-
-[ $runtime == safarimobilesim ]
-html/element_offset_test/offset: RuntimeError # Issue 18573
-html/event_test: RuntimeError # Safarimobilesim does not support WheelEvent
-html/indexeddb_1_test/supported: Fail
-html/notification_test: RuntimeError # Issue 22869
-html/performance_api_test/supported: Fail
-html/wheelevent_test: RuntimeError # Safarimobilesim does not support WheelEvent
-html/xhr_test/json: Fail # Safari doesn't support JSON response type
+html/webgl_1_test: Pass, Fail # Issue 8219
+html/worker_api_test: Skip # Issue 13221
+typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
+typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
 
 [ $csp ]
 isolate/browser/package_resolve_browser_hook_test: SkipByDesign # Test written in a way that violates CSP.
@@ -118,6 +125,11 @@
 typed_data/int32x4_static_test/01: MissingCompileTimeError
 typed_data/int32x4_static_test/02: MissingCompileTimeError
 
+[ $builder_tag == mac10_7 && $runtime == safari ]
+typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+
 [ $compiler != dart2analyzer && $runtime != none && $checked && !$strong ]
 mirrors/redirecting_factory_different_type_test/02: RuntimeError
 
@@ -215,29 +227,6 @@
 isolate/isolate_stress_test: Skip # Issue 12588: Uses dart:html. This should be able to pass when we have wrapper-less tests.
 isolate/stacktrace_message_test: RuntimeError # Fails to send stacktrace object.
 
-[ $runtime == safari || $runtime == safarimobilesim ]
-convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
-html/canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
-html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
-html/element_animate_test: Fail # Element.animate not supported on these browsers.
-html/element_test: Pass, Fail # Issue 21434
-html/fileapi_supported_test: Fail
-html/gamepad_test: Fail # Safari does not support Navigator.getGamepads()
-html/media_stream_test: Pass, Fail
-html/mediasource_test: Pass, Fail # MediaSource only available on Safari 8 desktop, we can't express that.
-html/rtc_test: Fail
-html/shadow_dom_test: Fail
-html/speechrecognition_test: Fail
-html/webgl_1_test: Pass, Fail # Issue 8219
-html/worker_api_test: Skip # Issue 13221
-typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-
-[ $runtime == safarimobilesim || $builder_tag == mac10_7 && $runtime == safari ]
-typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-
 [ $system == windows || $runtime == drt && $system == macos ]
 html/xhr_test/xhr: Skip # Times out.  Issue 21527
 
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 4125ad3..6cd6ce0 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -84,6 +84,7 @@
 convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
 html/element_classes_test: RuntimeError # Issue 30291
 html/element_types_keygen_test: RuntimeError # Issue 29055
+html/file_sample_test: Pass, RuntimeError
 html/fileapi_directory_test: Fail # TODO(dart2js-team): Please triage this failure.
 html/fileapi_entry_test: Pass, Fail # TODO(dart2js-team): Please triage this failure.
 html/fileapi_file_test: Fail # TODO(dart2js-team): Please triage this failure.
@@ -165,12 +166,10 @@
 html/dart_object_local_storage_test: Skip # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
 html/element_animate_test/timing_dict: RuntimeError # Issue 26730
 html/element_classes_test: RuntimeError # Issue 27535
-html/element_types_content_test: RuntimeError # Issue 29922
-html/element_types_content_test: Pass, RuntimeError # Issue 28983
+html/element_types_content_test: Pass, RuntimeError # Issues 28983, 29922
 html/element_types_keygen_test: RuntimeError # Issue 29922
 html/element_types_keygen_test: Fail
-html/element_types_shadow_test: RuntimeError # Issue 29922
-html/element_types_shadow_test: Pass, RuntimeError # Issue 28983
+html/element_types_shadow_test: Pass, RuntimeError # Issues 28983, 29922
 html/file_sample_test: Skip # FileSystem not supported on FireFox.
 html/fileapi_supported_test: Skip # FileSystem not supported on FireFox.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on FireFox.
@@ -272,9 +271,6 @@
 isolate/cross_isolate_message_test: Skip # Issue 12627
 isolate/message_test: Skip # Issue 12627
 
-[ $compiler == dart2js && $runtime == safarimobilesim ]
-isolate/compile_time_error_test/none: Pass, Slow
-
 [ $compiler == dart2js && $system == linux ]
 html/interactive_geolocation_test: Skip # Requires allowing geo location.
 
@@ -397,8 +393,8 @@
 html/js_array_test: CompileTimeError
 html/js_array_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
 html/js_dart_to_string_test: Crash # 'file:*/pkg/compiler/lib/src/common_elements.dart': Failed assertion: line 405 pos 12: 'element.name == '=='': is not true.
-html/js_dispatch_property_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
 html/js_dispatch_property_test: CompileTimeError
+html/js_dispatch_property_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
 html/js_function_getter_test: CompileTimeError
 html/js_function_getter_test/call getter as function: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
 html/js_function_getter_trust_types_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
@@ -781,7 +777,7 @@
 html/fileapi_file_test: Fail, Pass # TODO(dart2js-team): Please triage this failure.
 isolate/browser/issue_12474_test: RuntimeError # packageRoot not implemented.
 
-[ $compiler == dart2js && ($runtime == ff || $runtime == safari || $runtime == safarimobilesim || $ie) ]
+[ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
 html/custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 html/custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
 html/fontface_test: Fail # Fontface not supported on these.
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index e1fbe36..8d082b1 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -3,8 +3,85 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartdevc ]
+async/futures_test: RuntimeError # Issue 29922
+html/xhr_test/xhr: RuntimeError # Issue 29922, strong mode cast failure
+
+[ $compiler == dartdevk ]
+async/future_or_strong_test: RuntimeError
+async/future_value_chain4_test: CompileTimeError
+async/slow_consumer_test: CompileTimeError
+async/zone_run_unary_test: CompileTimeError # Issue 31537
+collection/list_test: RuntimeError
+convert/chunked_conversion1_test: RuntimeError
+convert/chunked_conversion_utf82_test: RuntimeError
+convert/chunked_conversion_utf86_test: RuntimeError
+convert/chunked_conversion_utf87_test: RuntimeError
+convert/codec1_test: RuntimeError
+convert/utf82_test: RuntimeError
+html/debugger_test: CompileTimeError
+html/js_typed_interop_anonymous2_exp_test: Crash
+html/js_typed_interop_anonymous2_test: RuntimeError
+html/js_typed_interop_anonymous_exp_test: Crash
+html/js_typed_interop_anonymous_test: RuntimeError
+html/js_typed_interop_anonymous_unreachable_exp_test: Crash
+html/js_typed_interop_dynamic_test: RuntimeError
+html/js_typed_interop_lazy_test/01: RuntimeError
+html/js_typed_interop_lazy_test/none: RuntimeError
+html/js_typed_interop_side_cast_exp_test/01: Crash
+html/js_typed_interop_side_cast_exp_test/none: Crash
+html/js_typed_interop_side_cast_test: RuntimeError
+html/js_typed_interop_test: RuntimeError
+html/js_typed_interop_type2_test/01: RuntimeError
+html/js_typed_interop_type2_test/none: RuntimeError
+js/prototype_access_test: RuntimeError
+
+[ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ]
+html/element_animate_test/timing_dict: RuntimeError # Issue 29922
+html/element_types_keygen_test: RuntimeError # Issue 29055
+html/js_dispatch_property_test: Skip # Timeout Issue 31030
+html/touchevent_test: RuntimeError # Issue 29922
+
+[ $runtime == drt && ($compiler == dartdevc || $compiler == dartdevk) ]
+html/svg_test: RuntimeError # Issue 29922
+math/math2_test: RuntimeError # Issue 29922
+math/math_test: RuntimeError # Issue 29922
+
+[ $system == linux && ($compiler == dartdevc || $compiler == dartdevk) ]
+html/interactive_geolocation_test: Skip # Requires allowing geo location.
+html/interactive_media_test: RuntimeError
+
+[ $system == macos && ($compiler == dartdevc || $compiler == dartdevk) ]
+html/client_rect_test: Pass, RuntimeError # Issue 31019
+html/css_test: Pass, RuntimeError # Issue 31019
+
+[ $system == windows && ($compiler == dartdevc || $compiler == dartdevk) ]
+html/xhr_test/xhr: Skip # Times out. Issue 21527
+
+[ $compiler == dartdevc || $compiler == dartdevk ]
+async/async_await_sync_completer_test: RuntimeError # Issue 29922
+async/async_await_zones_test: RuntimeError # Issue 29922
+async/future_or_bad_type_test/implements: RuntimeError # Issue 29922
+async/future_or_bad_type_test/none: RuntimeError # Issue 29922
+async/future_test: RuntimeError # Issue 29922
+async/slow_consumer_test: Pass, Timeout # Issue 29922
+async/stream_controller_async_test: RuntimeError
+async/stream_distinct_test: RuntimeError # Issue 29922
+async/stream_join_test: RuntimeError
+async/stream_subscription_as_future_test: RuntimeError
+async/timer_not_available_test: RuntimeError
+convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by DDC/dart2js.
+convert/chunked_conversion_utf88_test: Slow, Pass
+convert/json_utf8_chunk_test: Slow, Pass
+convert/streamed_conversion_json_utf8_encode_test: Pass, Timeout # Issue 29922
+convert/streamed_conversion_utf8_decode_test: Slow, Pass
+convert/streamed_conversion_utf8_encode_test: Pass, Timeout # Issue 29922
+convert/utf85_test: Slow, Pass
+html/async_spawnuri_test: RuntimeError # Issue 29922
+html/async_test: RuntimeError # Issue 29922
+html/client_rect_test: RuntimeError # Issue 29922, seems to be a reified type problem with DOMClientRect
 html/custom/attribute_changed_callback_test: Skip # Issue 31577
 html/custom/constructor_calls_created_synchronously_test: Skip # Issue 31577
+html/custom/created_callback_test: RuntimeError
 html/custom/created_callback_test: Skip # Issue 31577
 html/custom/document_register_basic_test: Skip # Issue 31577
 html/custom/document_register_template_test: Skip # Issue 31577
@@ -22,65 +99,15 @@
 html/custom/mirrors_2_test: Skip # Issue 31577
 html/custom/mirrors_test: Crash # Issue 29922
 html/custom/regress_194523002_test: Crash # Issue 29922
-html/deferred_multi_app_htmltest: Skip # Issue 29919
-html/fontface_loaded_test: RuntimeError
-html/gamepad_test: RuntimeError # Issue 31029
-html/no_linked_scripts_htmltest: Skip # Issue 29919
-html/scripts_htmltest: Skip # Issue 29919
-html/transferables_test: CompileTimeError # Issue 30975
-html/two_scripts_htmltest: Skip # Issue 29919
-isolate/*: SkipByDesign # No support for dart:isolate in dart4web (http://dartbug.com/30538)
-js/null_test: RuntimeError # Issue 30652
-math/double_pow_test: RuntimeError # Issue 29922
-math/low_test: RuntimeError # Issue 29922
-math/random_big_test: RuntimeError # Issue 29922
-mirrors/*: SkipByDesign # Mirrors not supported on web in Dart 2.0.
-profiler/metrics_num_test: Skip # Because of an int / double type test.
-
-[ $compiler == dartdevk ]
-async/zone_run_unary_test: CompileTimeError # Issue 31537
-
-[ $compiler == dartdevc && $runtime == chrome ]
-html/element_animate_test/timing_dict: RuntimeError # Issue 29922
-html/element_types_keygen_test: RuntimeError # Issue 29055
-html/js_dispatch_property_test: Skip # Timeout Issue 31030
-html/touchevent_test: RuntimeError # Issue 29922
-
-[ $compiler == dartdevc && $runtime == drt ]
-html/svg_test: RuntimeError # Issue 29922
-math/math2_test: RuntimeError # Issue 29922
-math/math_test: RuntimeError # Issue 29922
-
-[ $compiler == dartdevc && $runtime != none ]
-async/async_await_sync_completer_test: RuntimeError # Issue 29922
-async/async_await_zones_test: RuntimeError # Issue 29922
-async/future_or_bad_type_test/implements: RuntimeError # Issue 29922
-async/future_or_bad_type_test/none: RuntimeError # Issue 29922
-async/future_test: RuntimeError # Issue 29922
-async/futures_test: RuntimeError # Issue 29922
-async/slow_consumer_test: Pass, Timeout # Issue 29922
-async/stream_controller_async_test: RuntimeError
-async/stream_distinct_test: RuntimeError # Issue 29922
-async/stream_join_test: RuntimeError
-async/stream_subscription_as_future_test: RuntimeError
-async/timer_not_available_test: RuntimeError
-convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by DDC/dart2js.
-convert/chunked_conversion_utf88_test: Slow, Pass
-convert/json_utf8_chunk_test: Slow, Pass
-convert/streamed_conversion_json_utf8_encode_test: Pass, Timeout # Issue 29922
-convert/streamed_conversion_utf8_decode_test: Slow, Pass
-convert/streamed_conversion_utf8_encode_test: Pass, Timeout # Issue 29922
-convert/utf85_test: Slow, Pass
-html/async_spawnuri_test: RuntimeError # Issue 29922
-html/async_test: RuntimeError # Issue 29922
-html/client_rect_test: RuntimeError # Issue 29922, seems to be a reified type problem with DOMClientRect
-html/custom/created_callback_test: RuntimeError
 html/custom_element_method_clash_test: Skip # Issue 29922
 html/custom_element_name_clash_test: Skip # Issue 29922
 html/custom_elements_23127_test: Skip # Issue 29922
 html/custom_elements_test: Skip # Issue 29922
+html/deferred_multi_app_htmltest: Skip # Issue 29919
 html/element_classes_svg_test: RuntimeError # Issue 29922
 html/element_classes_test: RuntimeError # Issue 29922
+html/fontface_loaded_test: RuntimeError
+html/gamepad_test: RuntimeError # Issue 31029
 html/indexeddb_1_test/functional: RuntimeError # Issue 29922, strong mode cast failure
 html/indexeddb_2_test: RuntimeError, Skip # Times out. Issue 29922, strong mode cast failure
 html/interactive_media_test: Skip # requests interactive permissions (camera, geolocation)
@@ -92,12 +119,20 @@
 html/js_util_test: RuntimeError # Issue 29922
 html/media_stream_test: RuntimeError # Issue 29922
 html/mediasource_test: RuntimeError # Issue 29922
+html/no_linked_scripts_htmltest: Skip # Issue 29919
+html/scripts_htmltest: Skip # Issue 29919
+html/transferables_test: CompileTimeError # Issue 30975
 html/transition_event_test: Pass, RuntimeError, Timeout # Issue 29922, this test seems flaky
+html/two_scripts_htmltest: Skip # Issue 29919
 html/webgl_extensions_test: RuntimeError # Issue 31017
 html/worker_api_test: RuntimeError # Issue 29922
 html/xhr_cross_origin_test/functional: RuntimeError # Issue 29922
-html/xhr_test/xhr: RuntimeError # Issue 29922, strong mode cast failure
+isolate/*: SkipByDesign # No support for dart:isolate in dart4web (http://dartbug.com/30538)
+js/null_test: RuntimeError # Issue 30652
+math/double_pow_test: RuntimeError # Issue 29922
+math/low_test: RuntimeError # Issue 29922
 math/random_big_test: RuntimeError # Issue 29922
+mirrors/*: SkipByDesign # Mirrors not supported on web in Dart 2.0.
 mirrors/private_types_test: RuntimeError # Issue 29922
 mirrors/reflect_runtime_type_test: RuntimeError # Issue 29922
 mirrors/reflect_uninstantiated_class_test: RuntimeError # Issue 29922
@@ -106,18 +141,8 @@
 mirrors/reflected_type_typedefs_test: RuntimeError # Issue 29922
 mirrors/reflected_type_typevars_test: RuntimeError # Issue 29922
 mirrors/regress_14304_test: RuntimeError # Issue 29922
+profiler/metrics_num_test: Skip # Because of an int / double type test.
 typed_data/int32x4_arithmetic_test/int64: RuntimeError # Issue 29922
 typed_data/int64_list_load_store_test: RuntimeError # Issue 29922
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 29922
 
-[ $compiler == dartdevc && $runtime != none && $system == macos ]
-html/client_rect_test: Pass, RuntimeError # Issue 31019
-html/css_test: Pass, RuntimeError # Issue 31019
-
-[ $compiler == dartdevc && $system == linux ]
-html/interactive_geolocation_test: Skip # Requires allowing geo location.
-html/interactive_media_test: RuntimeError
-
-[ $compiler == dartdevc && $system == windows ]
-html/xhr_test/xhr: Skip # Times out. Issue 21527
-
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 0508dbe..cebcb02 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -16,7 +16,13 @@
 
 [ $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 isolate/isolate_complex_messages_test: Crash
-isolate/static_function_test: Skip # Flaky (https://github.com/dart-lang/sdk/issues/30063).
+mirrors/library_exports_shown_test: Crash # 31916
+mirrors/library_imports_deferred_test: Crash # 31916
+mirrors/library_imports_hidden_test: Crash # 31916
+mirrors/library_imports_metadata_test: Crash # 31916
+mirrors/library_imports_prefixed_show_hide_test: Crash # 31916
+mirrors/library_imports_prefixed_test: Crash # 31916
+mirrors/library_imports_shown_test: Crash # 31916
 mirrors/other_declarations_location_test: Crash # assertion error, TypeParameter not having position.
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
@@ -26,24 +32,23 @@
 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
 
+[ $compiler == dartk && $runtime == vm && !$checked && $strong ]
+mirrors/invocation_fuzz_test/emptyarray: Crash
+mirrors/invocation_fuzz_test/false: Crash
+mirrors/invocation_fuzz_test/none: Crash
+mirrors/invocation_fuzz_test/string: Crash
+
 # ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
 async/async_await_sync_completer_test: RuntimeError
 async/future_or_strong_test: RuntimeError
 async/future_value_chain4_test: CompileTimeError # Issue 31616
 async/slow_consumer2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/slow_consumer3_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/slow_consumer_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_controller_async_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_from_iterable_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_join_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_subscription_as_future_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/timer_cancel2_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -55,67 +60,44 @@
 convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Infrequent timeouts.
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: MissingCompileTimeError
-isolate/count_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/handle_error2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/handle_error3_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/illegal_msg_function_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/illegal_msg_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/isolate_current_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/issue_21398_parent_isolate1_test: RuntimeError # Issue 31402 (List literal)
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/kill_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/mandel_isolate_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/byteBuffer: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constInstance: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constList: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constList_identical: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constMap: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/fun: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/int32x4: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+isolate/message3_test/int32x4: Crash # 31916
 isolate/message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/mint_maker_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/ping_pause_test: Pass, Timeout
 isolate/spawn_function_custom_class_test: Pass, Timeout
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
-isolate/static_function_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/typed_message_test: CompileTimeError # Issue 31402 (Invocation arguments)
+isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 js/datetime_roundtrip_test: CompileTimeError
 js/null_test: CompileTimeError
 js/prototype_access_test: CompileTimeError
 mirrors/abstract_class_test: RuntimeError
-mirrors/abstract_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/class_declarations_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/class_declarations_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+mirrors/class_declarations_test/01: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/class_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/class_mirror_location_test: RuntimeError
-mirrors/closures_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/constructor_kinds_test/01: RuntimeError
 mirrors/constructor_kinds_test/none: RuntimeError
-mirrors/constructor_optional_args_test: CompileTimeError
-mirrors/constructor_optional_args_test: Crash # Issue 29201
 mirrors/constructor_private_name_test: RuntimeError
 mirrors/constructors_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/dart2js_mirrors_test: CompileTimeError # Issue 31537
+mirrors/dart2js_mirrors_test: Crash # 31916
 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
+mirrors/deferred_mirrors_test: Crash # 31916
 mirrors/deferred_mirrors_update_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/deferred_mirrors_update_test: RuntimeError
-mirrors/deferred_type_test: CompileTimeError
-mirrors/deferred_type_test: RuntimeError
-mirrors/empty_test: Crash
-mirrors/empty_test: RuntimeError
-mirrors/enum_test: CompileTimeError # Issue 31402 (Invocation arguments)
+mirrors/deferred_type_test: CompileTimeError, RuntimeError
+mirrors/empty_test: Crash, RuntimeError
+mirrors/enum_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/equality_test: RuntimeError
 mirrors/function_type_mirror_test: RuntimeError
 mirrors/generic_bounded_by_type_parameter_test/02: MissingCompileTimeError
 mirrors/generic_bounded_test/01: MissingCompileTimeError
 mirrors/generic_bounded_test/02: MissingCompileTimeError
-mirrors/generic_class_declaration_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/generic_f_bounded_mixin_application_test: RuntimeError
 mirrors/generic_function_typedef_test: RuntimeError
 mirrors/generic_interface_test/01: MissingCompileTimeError
@@ -131,22 +113,12 @@
 mirrors/generics_test/none: RuntimeError
 mirrors/hot_get_field_test: RuntimeError
 mirrors/hot_set_field_test: RuntimeError
-mirrors/inherit_field_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/intercepted_class_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/intercepted_object_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/invocation_fuzz_test/emptyarray: Crash
-mirrors/invocation_fuzz_test/false: Crash
-mirrors/invocation_fuzz_test/none: Crash
-mirrors/invocation_fuzz_test/string: Crash
+mirrors/intercepted_object_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/invoke_private_test: RuntimeError
 mirrors/invoke_private_wrong_library_test: RuntimeError
-mirrors/invoke_throws_test: Crash
-mirrors/invoke_throws_test: RuntimeError
-mirrors/lazy_static_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_declarations_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_declarations_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_enumeration_deferred_loading_test: CompileTimeError # Deferred loading kernel issue 28335.
+mirrors/library_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/library_enumeration_deferred_loading_test: RuntimeError
+mirrors/library_enumeration_deferred_loading_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/library_exports_hidden_test: RuntimeError, Crash
 mirrors/library_exports_hidden_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/library_exports_shown_test: RuntimeError
@@ -155,54 +127,43 @@
 mirrors/library_imports_bad_metadata_test/none: Crash
 mirrors/library_imports_deferred_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/library_imports_deferred_test: RuntimeError
-mirrors/library_imports_hidden_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_imports_hidden_test: RuntimeError
-mirrors/library_imports_metadata_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_imports_metadata_test: RuntimeError
-mirrors/library_imports_prefixed_show_hide_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_imports_prefixed_show_hide_test: RuntimeError
-mirrors/library_imports_prefixed_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_imports_prefixed_test: RuntimeError
-mirrors/library_imports_shown_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_imports_shown_test: RuntimeError
+mirrors/library_imports_hidden_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/library_imports_metadata_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/library_imports_prefixed_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/library_imports_shown_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/library_metadata_test: RuntimeError
-mirrors/list_constructor_test/01: Crash
-mirrors/list_constructor_test/01: RuntimeError
-mirrors/list_constructor_test/none: Crash
-mirrors/list_constructor_test/none: RuntimeError
-mirrors/load_library_test: Crash
-mirrors/load_library_test: RuntimeError
+mirrors/list_constructor_test/01: Crash, RuntimeError
+mirrors/list_constructor_test/none: Crash, RuntimeError
+mirrors/load_library_test: Crash, RuntimeError
 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: RuntimeError
-mirrors/metadata_constructed_constant_test: Crash
+mirrors/metadata_constructed_constant_test: Crash, RuntimeError
 mirrors/metadata_scope_test/none: RuntimeError
 mirrors/method_mirror_location_test: RuntimeError
-mirrors/method_mirror_name_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/method_mirror_source_line_ending_test: Crash
 mirrors/method_mirror_source_test: Crash
 mirrors/mirrors_nsm_mismatch_test: CompileTimeError # Issue 31533
 mirrors/mirrors_nsm_test/dart2js: CompileTimeError # Issue 31533
 mirrors/mirrors_nsm_test/none: CompileTimeError # Issue 31533
 mirrors/mirrors_reader_test: Crash
-mirrors/mirrors_test: CompileTimeError # Issue 31537
+mirrors/mirrors_test: Crash
 mirrors/mirrors_used*: SkipByDesign # Invalid tests. MirrorsUsed does not have a specification, and dart:mirrors is not required to hide declarations that are not covered by any MirrorsUsed annotation.
 mirrors/mirrors_used_inheritance_test: RuntimeError
 mirrors/mirrors_used_typedef_declaration_test/01: RuntimeError
 mirrors/mirrors_used_typedef_declaration_test/none: RuntimeError
-mirrors/mixin_application_test: CompileTimeError # Issue 31402 (Invocation arguments)
+mirrors/mixin_application_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/mixin_members_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/mixin_simple_test: RuntimeError
 mirrors/mixin_test: RuntimeError
 mirrors/native_class_test: SkipByDesign # Imports dart:html
-mirrors/no_metadata_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/operator_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/other_declarations_location_test: RuntimeError
 mirrors/parameter_annotation_mirror_test: RuntimeError
 mirrors/parameter_metadata_test: RuntimeError
 mirrors/parameter_metadata_test: Crash
-mirrors/parameter_of_mixin_app_constructor_test: CompileTimeError # Issue 31402 (Invocation arguments)
+mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/parameter_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/parameter_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/private_class_field_test: RuntimeError
@@ -211,13 +172,10 @@
 mirrors/private_types_test: RuntimeError
 mirrors/redirecting_factory_different_type_test/01: Crash
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
-mirrors/redirecting_factory_different_type_test/02: Crash
-mirrors/redirecting_factory_different_type_test/none: Crash
 mirrors/redirecting_factory_test/01: Crash
 mirrors/redirecting_factory_test/02: Crash
 mirrors/redirecting_factory_test/none: Crash
 mirrors/reflect_class_test/none: RuntimeError
-mirrors/reflect_model_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/reflected_type_classes_test/01: RuntimeError
 mirrors/reflected_type_function_type_test: RuntimeError
 mirrors/reflected_type_generics_test/01: RuntimeError
@@ -230,13 +188,10 @@
 mirrors/relation_subclass_test: CompileTimeError # Issue 31533
 mirrors/relation_subtype_test: RuntimeError
 mirrors/repeated_private_anon_mixin_app_test: RuntimeError
-mirrors/return_type_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/static_members_easier_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/static_members_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/static_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/symbol_validation_test/01: CompileTimeError # Issue 31537
-mirrors/symbol_validation_test/none: CompileTimeError # Issue 31537
-mirrors/synthetic_accessor_properties_test: CompileTimeError # Issue 31402 (Invocation arguments)
+mirrors/static_members_easier_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/static_members_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/symbol_validation_test/01: RuntimeError # Issue 31537
+mirrors/symbol_validation_test/none: RuntimeError # Issue 31537
 mirrors/type_variable_is_static_test: RuntimeError
 mirrors/type_variable_owner_test/01: RuntimeError
 mirrors/typearguments_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -254,14 +209,30 @@
 typed_data/int32x4_static_test/01: Pass # Issue 31402 (Invocation arguments)
 typed_data/int32x4_static_test/02: Pass # Issue 31402 (Invocation arguments)
 
+[ $compiler == dartk && $system == windows && $strong ]
+isolate/issue_22778_test: Fail
+mirrors/constructor_optional_args_test: Fail
+mirrors/invoke_throws_test: Fail
+mirrors/list_constructor_test/01: Fail
+mirrors/list_constructor_test/none: Fail
+mirrors/redirecting_factory_different_type_test/02: Fail
+mirrors/redirecting_factory_different_type_test/none: Fail
+
+[ $compiler == dartk && $system != windows && $strong ]
+isolate/issue_22778_test: Crash
+mirrors/constructor_optional_args_test: Crash
+mirrors/invoke_throws_test: Crash
+mirrors/list_constructor_test/01: Crash
+mirrors/list_constructor_test/none: Crash
+mirrors/redirecting_factory_different_type_test/02: Crash
+mirrors/redirecting_factory_different_type_test/none: Crash
+
 [ $compiler == dartk && $strong ]
 async/future_test/01: RuntimeError
 async/future_test/none: RuntimeError
-async/slow_consumer2_test: RuntimeError
-async/slow_consumer_test: RuntimeError
+async/slow_consumer2_test: RuntimeError # Issue 31402 (Invocation arguments)
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
-async/stream_from_iterable_test: RuntimeError
 async/stream_join_test: RuntimeError
 async/stream_subscription_as_future_test: RuntimeError
 async/timer_cancel2_test: RuntimeError
@@ -269,37 +240,18 @@
 async/timer_isActive_test: RuntimeError
 async/timer_repeat_test: RuntimeError
 async/zone_run_unary_test: RuntimeError
-convert/json_toEncodable_reviver_test: CompileTimeError
-isolate/count_test: Timeout
-isolate/illegal_msg_function_test: RuntimeError
-isolate/illegal_msg_mirror_test: RuntimeError
-isolate/isolate_current_test: RuntimeError
-isolate/issue_22778_test: Crash
 isolate/kill_self_synchronously_test: RuntimeError
-isolate/kill_test: RuntimeError
-isolate/mandel_isolate_test: RuntimeError
-isolate/message3_test/byteBuffer: RuntimeError
-isolate/message3_test/constInstance: RuntimeError
-isolate/message3_test/constList: RuntimeError
-isolate/message3_test/constList_identical: RuntimeError
-isolate/message3_test/constMap: RuntimeError
-isolate/message3_test/fun: RuntimeError
-isolate/message3_test/int32x4: RuntimeError
-isolate/message3_test/none: RuntimeError
 isolate/message_test: RuntimeError
 isolate/mint_maker_test: RuntimeError
 isolate/ping_pause_test: RuntimeError
 isolate/request_reply_test: Pass, Timeout
 isolate/stacktrace_message_test: RuntimeError
-isolate/typed_message_test: RuntimeError
 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
 mirrors/fake_function_with_call_test: RuntimeError
 mirrors/generic_bounded_by_type_parameter_test/none: RuntimeError
 mirrors/generic_bounded_test/none: RuntimeError
-mirrors/generic_class_declaration_test: RuntimeError
 mirrors/generic_f_bounded_test/01: RuntimeError
 mirrors/generic_f_bounded_test/none: RuntimeError
 mirrors/generic_local_function_test: RuntimeError
@@ -316,10 +268,8 @@
 mirrors/instance_members_unimplemented_interface_test: RuntimeError
 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
 mirrors/metadata_const_map_test: Crash
 mirrors/mixin_members_test: RuntimeError
@@ -328,7 +278,6 @@
 mirrors/parameter_is_const_test/none: RuntimeError
 mirrors/parameter_test/01: RuntimeError
 mirrors/parameter_test/none: RuntimeError
-mirrors/reflect_model_test: RuntimeError
 mirrors/reflected_type_classes_test/01: MissingCompileTimeError
 mirrors/reflected_type_classes_test/02: MissingCompileTimeError
 mirrors/reflected_type_classes_test/03: MissingCompileTimeError
@@ -336,7 +285,6 @@
 mirrors/reflected_type_test/02: MissingCompileTimeError
 mirrors/reflected_type_test/03: MissingCompileTimeError
 mirrors/regress_16321_test/none: Crash
-mirrors/return_type_test: RuntimeError
 mirrors/top_level_accessors_test/01: MissingCompileTimeError
 mirrors/type_argument_is_type_variable_test: RuntimeError
 mirrors/typearguments_mirror_test: RuntimeError
@@ -348,14 +296,33 @@
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-isolate/*: Skip
+isolate/count_test: RuntimeError
+isolate/cross_isolate_message_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/error_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/error_exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/issue_21398_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/issue_24243_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/mandel_isolate_test: RuntimeError
+isolate/message2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/nested_spawn2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/nested_spawn_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/raw_port_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/request_reply_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_function_custom_class_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_function_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_uri_exported_main_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_uri_multi_test/none: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_uri_nested_vm_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_uri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/spawn_uri_vm_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/unresolved_ports_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 mirrors/invocation_fuzz_test/emptyarray: CompileTimeError, Pass # Please triage.
 mirrors/invocation_fuzz_test/false: CompileTimeError, Pass # Please triage.
 mirrors/invocation_fuzz_test/none: CompileTimeError # Please triage.
 mirrors/invocation_fuzz_test/smi: CompileTimeError, DartkCrash, Crash, Pass # Please triage.
 mirrors/invocation_fuzz_test/string: CompileTimeError, Pass # Please triage.
-mirrors/library_uri_io_test: CompileTimeError # Please triage.
-mirrors/spawn_function_root_library_test: Skip
+mirrors/library_uri_io_test: RuntimeError # Please triage.
 
 # ===== Skip dartk and darkp in !$strong mode ====
 [ $compiler == dartk && !$strong ]
@@ -372,66 +339,30 @@
 async/future_test/01: RuntimeError
 async/future_test/none: RuntimeError
 async/future_value_chain4_test: CompileTimeError # Issue 31616
-async/slow_consumer2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/slow_consumer3_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/slow_consumer_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_controller_async_test: CompileTimeError # Issue 31402 (Invocation arguments)
+async/slow_consumer2_test: RuntimeError # Issue 31402 (Invocation arguments)
+async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
-async/stream_first_where_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_from_iterable_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_iterator_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_join_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_last_where_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic3_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic4_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic5_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic6_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_single_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_single_to_multi_subscriber_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_state_nonzero_timer_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_state_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_subscription_as_future_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_subscription_cancel_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_timeout_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_transform_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_transformation_broadcast_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_cancel1_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_cancel2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_cancel_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_isActive_test: CompileTimeError # Issue 31402 (Invocation arguments)
+async/stream_join_test: RuntimeError
+async/stream_subscription_as_future_test: RuntimeError
+async/timer_cancel2_test: RuntimeError
+async/timer_cancel_test: RuntimeError
+async/timer_isActive_test: RuntimeError
 async/timer_not_available_test: RuntimeError
-async/timer_repeat_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_test: CompileTimeError # Issue 31402 (Invocation arguments)
+async/timer_repeat_test: RuntimeError
 async/zone_run_unary_test: CompileTimeError # Issue 31537
-convert/json_toEncodable_reviver_test: CompileTimeError
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: Crash
 isolate/compile_time_error_test/01: MissingCompileTimeError
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
-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/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
-isolate/kill_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/byteBuffer: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constInstance: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constList: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constList_identical: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/constMap: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/fun: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/int32x4: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message3_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
+isolate/message3_test/int32x4: Crash # 31916
 isolate/ping_pause_test: Crash
 isolate/ping_pause_test: Pass, Timeout
 isolate/spawn_function_custom_class_test: Pass, Timeout
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
-isolate/timer_isolate_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/typed_message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 js/datetime_roundtrip_test: CompileTimeError
 js/null_test: CompileTimeError
 js/prototype_access_test: CompileTimeError
diff --git a/tests/lib_2/mirrors/mirrors_test.dart b/tests/lib_2/mirrors/mirrors_test.dart
index c3ef03b..44f1467 100644
--- a/tests/lib_2/mirrors/mirrors_test.dart
+++ b/tests/lib_2/mirrors/mirrors_test.dart
@@ -194,7 +194,7 @@
       equals(const Symbol('MirrorsTest.Class.field')));
 }
 
-testLibraryUri(var value, bool check(Uri)) {
+testLibraryUri(var value, bool check(Uri uri)) {
   var valueMirror = reflect(value);
   ClassMirror valueClass = valueMirror.type;
   LibraryMirror valueLibrary = valueClass.owner;
diff --git a/tests/lib_2/mirrors/stringify.dart b/tests/lib_2/mirrors/stringify.dart
index c89fc2e..32cc653 100644
--- a/tests/lib_2/mirrors/stringify.dart
+++ b/tests/lib_2/mirrors/stringify.dart
@@ -16,7 +16,8 @@
 stringifyMap(Map map) {
   var buffer = new StringBuffer();
   bool first = true;
-  for (String key in map.keys.map(MirrorSystem.getName).toList()..sort()) {
+  var names = map.keys.map((s) => MirrorSystem.getName(s)).toList()..sort();
+  for (String key in names) {
     if (!first) buffer.write(', ');
     first = false;
     buffer.write(key);
diff --git a/tests/lib_2/mirrors/symbol_validation_test.dart b/tests/lib_2/mirrors/symbol_validation_test.dart
index f65255a..5b3b2e3 100644
--- a/tests/lib_2/mirrors/symbol_validation_test.dart
+++ b/tests/lib_2/mirrors/symbol_validation_test.dart
@@ -61,7 +61,7 @@
       .expand((op) => [".$op", "$op.x", "x$op", "_x.$op"])
       .forEach(invalidSymbol);
   operators
-      .expand((op) => operators.contains("$op=") ? [] : ["x.$op=", "$op="])
+      .expand<String>((op) => operators.contains("$op=") ? [] : ["x.$op=", "$op="])
       .forEach(invalidSymbol);
 
   var simpleSymbols = [
diff --git a/tests/standalone_2/io/addlatexhash_test.dart b/tests/standalone_2/io/addlatexhash_test.dart
index a748de2..d586a35 100755
--- a/tests/standalone_2/io/addlatexhash_test.dart
+++ b/tests/standalone_2/io/addlatexhash_test.dart
@@ -9,7 +9,7 @@
 import 'package:path/path.dart' as path;
 import '../../../tools/addlatexhash.dart';
 
-final execDir = path.dirname(path.fromUri(Platform.executable));
+final execDir = path.dirname(Platform.resolvedExecutable);
 final dartRootDir = path.dirname(path.dirname(execDir));
 final dartRootPath = dartRootDir.toString();
 
diff --git a/tests/standalone_2/io/http_proxy_advanced_test.dart b/tests/standalone_2/io/http_proxy_advanced_test.dart
index 8b5e252..fda2388 100644
--- a/tests/standalone_2/io/http_proxy_advanced_test.dart
+++ b/tests/standalone_2/io/http_proxy_advanced_test.dart
@@ -150,7 +150,7 @@
   }
 
   Future<ProxyServer> start() {
-    var x = new Completer();
+    var x = new Completer<ProxyServer>();
     var host = ipV6 ? "::1" : "localhost";
     HttpServer.bind(host, 0).then((s) {
       server = s;
@@ -257,8 +257,8 @@
                 .add(HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
             // Copy all content.
             return request.pipe(clientRequest);
-          }).then((HttpClientResponse clientResponse) {
-            clientResponse.pipe(request.response);
+          }).then((clientResponse) {
+            (clientResponse as HttpClientResponse).pipe(request.response);
           });
         }
       });
diff --git a/tests/standalone_2/io/http_proxy_test.dart b/tests/standalone_2/io/http_proxy_test.dart
index e885cce..bd07700 100644
--- a/tests/standalone_2/io/http_proxy_test.dart
+++ b/tests/standalone_2/io/http_proxy_test.dart
@@ -139,7 +139,7 @@
   }
 
   Future<ProxyServer> start() {
-    var x = new Completer();
+    var x = new Completer<ProxyServer>();
     var host = ipV6 ? "::1" : "localhost";
     HttpServer.bind(host, 0).then((s) {
       server = s;
@@ -245,8 +245,8 @@
                 .add(HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
             // Copy all content.
             return request.pipe(clientRequest);
-          }).then((HttpClientResponse clientResponse) {
-            clientResponse.pipe(request.response);
+          }).then((clientResponse) {
+            (clientResponse as HttpClientResponse).pipe(request.response);
           });
         }
       });
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 198f5b6..924b2f6 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -99,7 +99,6 @@
 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
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index ca96d89..83be5c7 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -24,10 +24,8 @@
 io/compile_all_test: Crash
 io/http_client_request_test: Pass, Timeout
 io/http_compression_test: RuntimeError
-io/http_proxy_test: CompileTimeError
 io/secure_builtin_roots_test: Timeout
 io/socket_finalizer_test: Pass, Timeout
-map_insert_remove_oom_test: Crash
 no_support_debugger_test: Skip # kernel-service snapshot not compatible with flag disabled
 package/package1_test: CompileTimeError
 package/package_test: CompileTimeError
@@ -37,24 +35,25 @@
 regress_29350_test: MissingCompileTimeError
 regress_29350_test/none: Pass # Issue 31537
 
+[ $compiler == dartk && $system == windows && $strong ]
+io/compile_all_test: Fail
+io/file_stream_test: RuntimeError # Issue 31904
+io/platform_test: RuntimeError # Issue 31904
+io/process_non_ascii_test: RuntimeError # Issue 31904
+io/regress_7679_test: RuntimeError # Issue 31904
+map_insert_remove_oom_test: Skip # Timeout
+
+[ $compiler == dartk && $system != windows && $strong ]
+map_insert_remove_oom_test: Crash
+
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
 io/directory_list_sync_test: Timeout, Pass # Please triage.
-io/echo_server_stream_test: Skip # Uses isolates which don't work in batch mode.
 io/file_blocking_lock_test: Pass, Crash # Please triage.
 io/file_lock_test: RuntimeError # Please triage.
-io/http_advanced_test: Skip # Uses isolates which don't work in batch mode.
-io/http_basic_test: Skip # Uses isolates which don't work in batch mode.
-io/http_read_test: Skip # Uses isolates which don't work in batch mode.
-io/pipe_server_test: Skip # Uses isolates which don't work in batch mode.
-io/platform_test: Skip # Uses isolates which don't work in batch mode.
-io/raw_synchronous_socket_test: Skip # Uses isolates which don't work in batch mode.
-io/socket_close_test: Skip # Uses isolates which don't work in batch mode.
-io/socket_finalizer_test: Skip # Uses isolates which don't work in batch mode.
-io/socket_many_connections_test: Skip # Uses isolates which don't work in batch mode.
-io/stdio_socket_finalizer_test: Skip # Uses isolates which don't work in batch mode.
+io/platform_test: RuntimeError # Please triage.
 io/test_extension_fail_test: RuntimeError # Please traige.
 io/test_extension_test: RuntimeError # Please traige.
 map_insert_remove_oom_test: Pass # Please triage.
@@ -63,12 +62,6 @@
 package/scenarios/packages_file_strange_formatting/empty_lines_test: CompileTimeError # Please triage.
 package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: CompileTimeError # Please triage.
 package/scenarios/packages_option_only/packages_option_only_test: CompileTimeError # Please triage.
-regress_26031_test: RuntimeError # Please triage.
-regress_28854_1_test: RuntimeError # Please triage.
-regress_28854_2_test: RuntimeError # Please triage.
-typed_array_int64_uint64_test: RuntimeError # Please triage.
-typed_array_test: RuntimeError # Please triage.
-typed_data_isolate_test: RuntimeError # Please triage.
 
 # ===== Skip dartk and darkp in !$strong mode ====
 [ $compiler == dartk && !$strong ]
diff --git a/tools/VERSION b/tools/VERSION
index 0015155..f7edf31 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 17
+PRERELEASE 18
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 784895d..f71c0a7 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -118,7 +118,8 @@
       "builders": [
         "vm-kernel-precomp-linux-release-x64",
         "vm-kernel-precomp-linux-release-simarm",
-        "vm-kernel-precomp-linux-release-simarm64"
+        "vm-kernel-precomp-linux-release-simarm64",
+        "vm-kernel-precomp-win-release-x64"
       ],
       "meta": {
         "description": "This configuration is used by the vm kernel release builder."
@@ -234,7 +235,8 @@
         "vm-kernel-linux-release-simdbc64",
         "vm-kernel-linux-release-x64",
         "vm-kernel-mac-debug-x64",
-        "vm-kernel-mac-release-x64"
+        "vm-kernel-mac-release-x64",
+        "vm-kernel-win-release-x64"
       ],
       "meta": {
         "description": "This configuration is for the kernel builder group."
@@ -316,7 +318,9 @@
             "--checked",
             "--strong",
             "--use-sdk",
-            "language_2"
+            "language_2",
+            "corelib_2",
+            "lib_2"
           ]
         },
         {
@@ -375,8 +379,7 @@
             "--use-sdk",
             "language_2",
             "corelib_2",
-            "lib_2",
-            "lib_strong"
+            "lib_2"
           ]
         },
         {
@@ -386,7 +389,9 @@
             "--checked",
             "--strong",
             "--use-sdk",
-            "language_2"
+            "language_2",
+            "corelib_2",
+            "lib_2"
           ]
         },
         {
@@ -1238,6 +1243,7 @@
             "--compiler=none",
             "--runtime=vm",
             "--checked",
+            "--timeout=120",
             "--use-sdk",
             "pkg/front_end"
           ]
@@ -1301,7 +1307,8 @@
             "--use-sdk",
             "--compiler=none",
             "--runtime=vm",
-            "--checked"
+            "--checked",
+            "--timeout=120"
           ],
           "tests": ["pkg"]
         },
diff --git a/tools/gardening/lib/src/results/configurations.dart b/tools/gardening/lib/src/results/configurations.dart
index 09d900b..6bde17a 100644
--- a/tools/gardening/lib/src/results/configurations.dart
+++ b/tools/gardening/lib/src/results/configurations.dart
@@ -114,7 +114,6 @@
           Runtime.ie11,
           Runtime.opera,
           Runtime.chromeOnAndroid,
-          Runtime.safariMobileSim
         ];
 
       case Compiler.dartdevc:
@@ -250,7 +249,6 @@
   static const ie11 = const Runtime._('ie11');
   static const opera = const Runtime._('opera');
   static const chromeOnAndroid = const Runtime._('chromeOnAndroid');
-  static const safariMobileSim = const Runtime._('safarimobilesim');
   static const contentShellOnAndroid = const Runtime._('ContentShellOnAndroid');
   static const selfCheck = const Runtime._('self_check');
   static const none = const Runtime._('none');
@@ -272,7 +270,6 @@
     ie11,
     opera,
     chromeOnAndroid,
-    safariMobileSim,
     contentShellOnAndroid,
     selfCheck,
     none
@@ -302,7 +299,6 @@
         chrome,
         firefox,
         chromeOnAndroid,
-        safariMobileSim,
         contentShellOnAndroid
       ].contains(this);
 
@@ -337,7 +333,6 @@
       case ie11:
       case opera:
       case chromeOnAndroid:
-      case safariMobileSim:
       case contentShellOnAndroid:
         return Compiler.dart2js;
 
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 94890e3..dd66be3 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -84,9 +84,6 @@
       case Runtime.safari:
         browser = new Safari();
         break;
-      case Runtime.safariMobileSim:
-        browser = new SafariMobileSimulator();
-        break;
       case Runtime.ie9:
       case Runtime.ie10:
       case Runtime.ie11:
@@ -517,69 +514,6 @@
   String toString() => "Chrome";
 }
 
-class SafariMobileSimulator extends Safari {
-  /**
-   * Directories where safari simulator stores state. We delete these if the
-   * resetBrowserConfiguration is set
-   */
-  static const List<String> CACHE_DIRECTORIES = const [
-    "Library/Application Support/iPhone Simulator/7.1/Applications"
-  ];
-
-  // Helper function to delete many directories recursively.
-  Future<bool> deleteIfExists(Iterable<String> paths) async {
-    for (var path in paths) {
-      Directory directory = new Directory(path);
-      if (await directory.exists()) {
-        _logEvent("Deleting $path");
-        try {
-          await directory.delete(recursive: true);
-        } catch (error) {
-          _logEvent("Failure trying to delete $path: $error");
-          return false;
-        }
-      } else {
-        _logEvent("$path is not present");
-      }
-    }
-    return true;
-  }
-
-  // Clears the cache if the static resetBrowserConfiguration flag is set.
-  // Returns false if the command to actually clear the cache did not complete.
-  Future<bool> resetConfiguration() {
-    if (!Browser.resetBrowserConfiguration) return new Future.value(true);
-    var home = Platform.environment['HOME'];
-    var paths = CACHE_DIRECTORIES.map((s) => "$home/$s");
-    return deleteIfExists(paths);
-  }
-
-  Future<bool> start(String url) {
-    _logEvent("Starting safari mobile simulator browser on: $url");
-    return resetConfiguration().then((success) {
-      if (!success) {
-        _logEvent("Could not clear cache, exiting");
-        return false;
-      }
-      var args = [
-        "-SimulateApplication",
-        "/Applications/Xcode.app/Contents/Developer/Platforms/"
-            "iPhoneSimulator.platform/Developer/SDKs/"
-            "iPhoneSimulator7.1.sdk/Applications/MobileSafari.app/"
-            "MobileSafari",
-        "-u",
-        url
-      ];
-      return startBrowserProcess(_binary, args).catchError((e) {
-        _logEvent("Running $_binary --version failed with $e");
-        return false;
-      });
-    });
-  }
-
-  String toString() => "SafariMobileSimulator";
-}
-
 class IE extends Browser {
   Future<String> getVersion() {
     var args = [
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index 8d562ce..253e153 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -179,6 +179,18 @@
     return _servers;
   }
 
+  /// Returns true if this configuration uses the new front end (fasta)
+  /// as the first stage of compilation.
+  bool get usesFasta {
+    var fastaCompilers = const [
+      Compiler.dartk,
+      Compiler.dartkp,
+      Compiler.dartdevk
+    ];
+    return fastaCompilers.contains(compiler) ||
+        compiler == Compiler.dart2js && useDart2JSWithKernel;
+  }
+
   /// Returns true if this configuration is considered Dart 2.0 configuration
   /// by VM (which is identified by using common front-end and strong mode).
   /// In this case instead of invoking VM binary directly we use
@@ -306,11 +318,6 @@
       Runtime.safari: const {
         System.macos: '/Applications/Safari.app/Contents/MacOS/Safari'
       },
-      Runtime.safariMobileSim: const {
-        System.macos: '/Applications/Xcode.app/Contents/Developer/Platforms/'
-            'iPhoneSimulator.platform/Developer/Applications/'
-            'iPhone Simulator.app/Contents/MacOS/iPhone Simulator'
-      },
       Runtime.ie9: const {
         System.windows: 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
       },
@@ -457,6 +464,7 @@
         'csp': isCsp,
         'system': system.name,
         'vm_options': vmOptions,
+        'fasta': usesFasta,
         'use_sdk': useSdk,
         'builder_tag': builderTag,
         'fast_startup': useFastStartup,
@@ -580,7 +588,6 @@
           Runtime.ie11,
           Runtime.opera,
           Runtime.chromeOnAndroid,
-          Runtime.safariMobileSim
         ];
 
       case Compiler.dartdevc:
@@ -716,7 +723,6 @@
   static const ie11 = const Runtime._('ie11');
   static const opera = const Runtime._('opera');
   static const chromeOnAndroid = const Runtime._('chromeOnAndroid');
-  static const safariMobileSim = const Runtime._('safarimobilesim');
   static const contentShellOnAndroid = const Runtime._('ContentShellOnAndroid');
   static const selfCheck = const Runtime._('self_check');
   static const none = const Runtime._('none');
@@ -738,7 +744,6 @@
     ie11,
     opera,
     chromeOnAndroid,
-    safariMobileSim,
     contentShellOnAndroid,
     selfCheck,
     none
@@ -768,7 +773,6 @@
         chrome,
         firefox,
         chromeOnAndroid,
-        safariMobileSim,
         contentShellOnAndroid
       ].contains(this);
 
@@ -803,7 +807,6 @@
       case ie11:
       case opera:
       case chromeOnAndroid:
-      case safariMobileSim:
       case contentShellOnAndroid:
         return Compiler.dart2js;
 
diff --git a/tools/testing/dart/environment.dart b/tools/testing/dart/environment.dart
index 2e98e5f..1b9dc2d 100644
--- a/tools/testing/dart/environment.dart
+++ b/tools/testing/dart/environment.dart
@@ -20,8 +20,9 @@
   "compiler": new _Variable((c) => c.compiler.name, Compiler.names),
   "csp": new _Variable.bool((c) => c.isCsp),
   "dart2js_with_kernel": new _Variable.bool((c) => c.useDart2JSWithKernel),
-  "fast_startup": new _Variable.bool((c) => c.useFastStartup),
   "enable_asserts": new _Variable.bool((c) => c.useEnableAsserts),
+  "fast_startup": new _Variable.bool((c) => c.useFastStartup),
+  "fasta": new _Variable.bool((c) => c.usesFasta),
   "host_checked": new _Variable.bool((c) => c.isHostChecked),
   "host_unchecked": new _Variable.bool((c) => !c.isHostChecked),
   "hot_reload": new _Variable.bool((c) => c.hotReload),
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index 9f43481..c7482f3 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -29,7 +29,6 @@
       case Runtime.ie9:
       case Runtime.opera:
       case Runtime.safari:
-      case Runtime.safariMobileSim:
         // TODO(ahe): Replace this with one or more browser runtimes.
         return new DummyRuntimeConfiguration();
 
diff --git a/tools/testing/dart/status_reporter.dart b/tools/testing/dart/status_reporter.dart
index 37ea7dc..0f33e17 100644
--- a/tools/testing/dart/status_reporter.dart
+++ b/tools/testing/dart/status_reporter.dart
@@ -54,7 +54,7 @@
       'compiler': 'none'
     },
     {
-      'runtimes': ['safari', 'safarimobilesim'],
+      'runtimes': ['safari'],
       'modes': ['release'],
       'archs': ['ia32'],
       'compiler': 'dart2js'
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 0bc7943..1867b2a 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -586,13 +586,10 @@
     if (!useSdk) {
       _dart2JsBootstrapDependencies = [];
     } else {
-      var snapshotPath = new Path(buildDir)
-          .join(new Path('dart-sdk/bin/snapshots/'
-              'utils_wrapper.dart.snapshot'))
-          .absolute
-          .toString();
       _dart2JsBootstrapDependencies = [
-        new Uri(scheme: 'file', path: snapshotPath)
+        Uri.base
+            .resolveUri(new Uri.directory(buildDir))
+            .resolve('dart-sdk/bin/snapshots/dart2js.dart.snapshot')
       ];
     }
   }
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index fa28255..10f3a35 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -18,6 +18,10 @@
 template("application_snapshot") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
   assert(defined(invoker.training_args), "Must specify 'training_args'")
+  vm_args = []
+  if (defined(invoker.vm_args)) {
+    vm_args = invoker.vm_args
+  }
   main_dart = invoker.main_dart
   training_args = invoker.training_args
   name = target_name
@@ -59,7 +63,7 @@
       "--packages=$dot_packages",
       "--snapshot=$abs_output",
       "--snapshot-depfile=$abs_depfile",
-    ]
+    ] + vm_args
 
     if (dart_snapshot_kind == "script") {
       args += [
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index 391a10b..36ede78 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -25,7 +25,7 @@
   output = "$target_gen_dir/dartdoc_files.stamp"
 }
 
-compiled_action("dart2js_create_snapshot_entries") {
+compiled_action("dart2js_create_snapshot_entry") {
   tool = "../../runtime/bin:dart"
   deps = [
     ":dart2js_files_stamp",
@@ -44,11 +44,8 @@
     "../../tools/VERSION",
   ]
 
-  utils_output = "$target_gen_dir/utils_wrapper.dart"
-  dart2js_output = "$target_gen_dir/dart2js.dart"
   outputs = [
-    utils_output,
-    dart2js_output,
+    "$target_gen_dir/dart2js.dart"
   ]
 
   args = [
@@ -61,8 +58,9 @@
 
 application_snapshot("dart2js") {
   deps = [
-    ":dart2js_create_snapshot_entries",
+    ":dart2js_create_snapshot_entry",
   ]
+  vm_args = ["--no_limit_ints_to_64_bits"]
   main_dart = "$target_gen_dir/dart2js.dart"
   training_args = [
     "--packages=" + rebase_path("../../.packages"),
@@ -72,14 +70,6 @@
   ]
 }
 
-application_snapshot("utils_wrapper") {
-  deps = [
-    ":dart2js_create_snapshot_entries",
-  ]
-  main_dart = "$target_gen_dir/utils_wrapper.dart"
-  training_args = [ "--help" ]
-}
-
 compile_platform("compile_dart2js_platform") {
   sources = [
     "../../sdk/lib/libraries.json",
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
deleted file mode 100644
index d36b792..0000000
--- a/utils/compiler/create_snapshot.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-Future<String> getVersion(var rootPath) {
-  var suffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
-  var printVersionScript = rootPath.resolve("tools/print_version.py");
-  return Process
-      .run("python$suffix", [printVersionScript.toFilePath()]).then((result) {
-    if (result.exitCode != 0) {
-      throw "Could not generate version";
-    }
-    return result.stdout.trim();
-  });
-}
-
-Future<String> getSnapshotGenerationFile(var args, var rootPath) {
-  var dart2js = rootPath.resolve(args["dart2js_main"]);
-  return getVersion(rootPath).then((version) {
-    var snapshotGenerationText = """
-import '${dart2js.toFilePath(windows: false)}' as dart2jsMain;
-import 'dart:io';
-
-void main(List<String> arguments) {
-  if (arguments.length < 1) throw "No tool given as argument";
-  String tool = arguments[0];
-  if (tool == "dart2js") {
-    dart2jsMain.BUILD_ID = "$version";
-    dart2jsMain.main(arguments.skip(1).toList());
-  }
-}
-
-""";
-    return snapshotGenerationText;
-  });
-}
-
-Future<String> getDart2jsSnapshotGenerationFile(var args, var rootPath) {
-  var dart2js = rootPath.resolve(args["dart2js_main"]);
-  return getVersion(rootPath).then((version) {
-    var snapshotGenerationText = """
-import '${dart2js.toFilePath(windows: false)}' as dart2jsMain;
-
-void main(List<String> arguments) {
-  dart2jsMain.BUILD_ID = "$version";
-  dart2jsMain.main(arguments);
-}
-""";
-    return snapshotGenerationText;
-  });
-}
-
-void writeSnapshotFile(var path, var content) {
-  File file = new File(path);
-  var writer = file.openSync(mode: FileMode.WRITE);
-  writer.writeStringSync(content);
-  writer.close();
-}
-
-Future createSnapshot(var dart_file) {
-  return Process.run(Platform.executable, [
-    "--packages=../../.packages",
-    "--snapshot=$dart_file.snapshot",
-    dart_file
-  ]).then((result) {
-    if (result.exitCode != 0) {
-      print("Could not generate snapshot: result code ${result.exitCode}");
-      print(result.stdout);
-      print(result.stderr);
-      throw "Could not generate snapshot";
-    }
-  });
-}
-
-/**
- * Takes the following arguments:
- * --output_dir=val     The full path to the output_dir.
- * --dart2js_main=val   The path to the dart2js main script relative to root.
- */
-void main(List<String> arguments) {
-  var validArguments = ["--output_dir", "--dart2js_main"];
-  var args = {};
-  for (var argument in arguments) {
-    var argumentSplit = argument.split("=");
-    if (argumentSplit.length != 2) throw "Invalid argument $argument, no =";
-    if (!validArguments.contains(argumentSplit[0])) {
-      throw "Invalid argument $argument";
-    }
-    args[argumentSplit[0].substring(2)] = argumentSplit[1];
-  }
-  if (!args.containsKey("dart2js_main")) throw "Please specify dart2js_main";
-  if (!args.containsKey("output_dir")) throw "Please specify output_dir";
-
-  var scriptFile = Uri.base.resolveUri(Platform.script);
-  var path = scriptFile.resolve(".");
-  var rootPath = path.resolve("../..");
-  getSnapshotGenerationFile(args, rootPath).then((result) {
-    var wrapper = "${args['output_dir']}/utils_wrapper.dart";
-    writeSnapshotFile(wrapper, result);
-    createSnapshot(wrapper);
-  });
-
-  getDart2jsSnapshotGenerationFile(args, rootPath).then((result) {
-    var wrapper = "${args['output_dir']}/dart2js.dart";
-    writeSnapshotFile(wrapper, result);
-    createSnapshot(wrapper);
-  });
-}
diff --git a/utils/compiler/create_snapshot_entry.dart b/utils/compiler/create_snapshot_entry.dart
index 99fb301..2c6497b 100644
--- a/utils/compiler/create_snapshot_entry.dart
+++ b/utils/compiler/create_snapshot_entry.dart
@@ -2,6 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Generates a wrapper around dart2js to ship with the SDK.
+///
+/// The only reason to create this wrapper is to be able to embed the sdk
+/// version information into the compiler.
 import 'dart:io';
 import 'dart:async';
 
@@ -17,27 +21,6 @@
   });
 }
 
-Future<String> getSnapshotGenerationFile(var args, var rootPath) {
-  var dart2js = rootPath.resolve(args["dart2js_main"]);
-  return getVersion(rootPath).then((version) {
-    var snapshotGenerationText = """
-import '${dart2js.toFilePath(windows: false)}' as dart2jsMain;
-import 'dart:io';
-
-void main(List<String> arguments) {
-  if (arguments.length < 1) throw "No tool given as argument";
-  String tool = arguments[0];
-  if (tool == "dart2js") {
-    dart2jsMain.BUILD_ID = "$version";
-    dart2jsMain.main(arguments.skip(1).toList());
-  }
-}
-
-""";
-    return snapshotGenerationText;
-  });
-}
-
 Future<String> getDart2jsSnapshotGenerationFile(var args, var rootPath) {
   var dart2js = rootPath.resolve(args["dart2js_main"]);
   return getVersion(rootPath).then((version) {
@@ -53,13 +36,6 @@
   });
 }
 
-void writeSnapshotFile(var path, var content) {
-  File file = new File(path);
-  var writer = file.openSync(mode: FileMode.WRITE);
-  writer.writeStringSync(content);
-  writer.close();
-}
-
 /**
  * Takes the following arguments:
  * --output_dir=val     The full path to the output_dir.
@@ -82,13 +58,9 @@
   var scriptFile = Uri.base.resolveUri(Platform.script);
   var path = scriptFile.resolve(".");
   var rootPath = path.resolve("../..");
-  getSnapshotGenerationFile(args, rootPath).then((result) {
-    var wrapper = "${args['output_dir']}/utils_wrapper.dart";
-    writeSnapshotFile(wrapper, result);
-  });
 
   getDart2jsSnapshotGenerationFile(args, rootPath).then((result) {
     var wrapper = "${args['output_dir']}/dart2js.dart";
-    writeSnapshotFile(wrapper, result);
+    new File(wrapper).writeAsStringSync(result);
   });
 }
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index dbd42c6..e31406d 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -5,6 +5,8 @@
 import("../../build/dart_host_sdk_toolchain.gni")
 import("../application_snapshot.gni")
 
+# TODO: Switch this to use kernel based app-jit snapshot
+# when we are ready to switch to the kernel based core snapshots.
 application_snapshot("kernel-service") {
   main_dart = "../../pkg/vm/bin/kernel_service.dart"
   deps = [
@@ -15,3 +17,47 @@
     "file://" + rebase_path("../../pkg/compiler/lib/src/dart2js.dart"),
   ]
 }
+
+copy("copy_kernel_service_snapshot") {
+  deps = [
+    ":kernel-service",
+  ]
+  sources = [
+    rebase_path("$root_gen_dir/kernel-service.dart.snapshot"),
+  ]
+  outputs = [
+    "$root_out_dir/kernel-service.dart.snapshot",
+  ]
+}
+
+compiled_action("kernel_service_dill") {
+  deps = [
+    "../../runtime/vm:vm_legacy_platform",
+  ]
+  tool = "../../runtime/bin:dart_bootstrap"
+  kernel_service_script = "../../pkg/vm/bin/kernel_service.dart"
+  gen_kernel_script = "../../pkg/vm/bin/gen_kernel.dart"
+
+  inputs = [
+    gen_kernel_script,
+    kernel_service_script,
+    "$root_out_dir/vm_platform.dill",
+  ]
+  outputs = [
+    "$root_gen_dir/kernel_service.dill",
+  ]
+
+  # TODO: Switch over to vm_platform_strong.dill and remove the
+  # flags --no-strong-mode once https://github.com/dart-lang/sdk/issues/31623
+  # is fixed.
+  args = [
+    rebase_path(gen_kernel_script),
+    "--packages=file:///" + rebase_path("../../.packages"),
+    "--platform=file:///" + rebase_path("$root_out_dir/vm_platform.dill"),
+    "--no-aot",
+    "--no-strong-mode",
+    "--no-embed-sources",
+    "--output=" + rebase_path("$root_gen_dir/kernel_service.dill"),
+    "file:///" + rebase_path(kernel_service_script),
+  ]
+}