Version 2.0.0-dev.69.0

Merge commit 'b571e9391ca7959e1d0dbbad8ab93a6ae01ede8e' into dev
diff --git a/.github/move.yml b/.github/move.yml
new file mode 100644
index 0000000..bf0cceb
--- /dev/null
+++ b/.github/move.yml
@@ -0,0 +1,21 @@
+# Configuration for move-issues - https://github.com/dessant/move-issues
+
+# Delete the command comment when it contains no other content
+deleteCommand: true
+
+# Close the source issue after moving
+closeSourceIssue: true
+
+# Lock the source issue after moving
+lockSourceIssue: false
+
+# Mention issue and comment authors
+mentionAuthors: true
+
+# Preserve mentions in the issue content
+keepContentMentions: true
+
+# Set custom aliases for targets
+aliases:
+  flutter: flutter/flutter
+  flutter-intellij: flutter/flutter-intellij
diff --git a/BUILD.gn b/BUILD.gn
index b00fb39..5dbba45 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -63,6 +63,10 @@
 }
 
 group("runtime_kernel") {
+  if (targetting_fuchsia) {
+    # Fuchsia has run_vm_tests marked testonly.
+    testonly = true
+  }
   deps = [
     ":runtime",
   ]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1160e93..832c29d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,26 +1,17 @@
-## 2.0.0-dev.XX.0
-(Add new changes here, and they will be copied to the
- change section for the next dev version)
-
-### Language
-
-#### Strong Mode
-
-### Dart VM
-
-### Tool Changes
-
-#### dartfmt
-
-#### Pub
-
-#### Dart2js
-
-#### Analyzer
-
-#### Other Tools
+## 2.0.0-dev.69.0
 
 ### Core library changes
+* `dart:collection`, `dart:core`:
+  * Re-enable `Iterable.whereType`. The method was disabled because code
+    was still being compiled in Dart 1 mode, and the function was
+    error-prone when used in that code.
+* `dart:async`
+  * Changed an internal lazily-allocated reusable "null future" to always belong
+    to the root zone. This avoids race conditions where the first access to the
+    future determined which zone it would belong to. The zone is only used
+    for *scheduling* the callback of listeners, the listeners themselves will
+    run in the correct zone in any case.
+    Issue [#32556](http://dartbug.com/32556).
 
 ## 2.0.0-dev.68.0
 
diff --git a/DEPS b/DEPS
index 544f975..21df396 100644
--- a/DEPS
+++ b/DEPS
@@ -53,13 +53,13 @@
   # Revisions of /third_party/* dependencies.
   "args_tag": "1.4.1",
   "async_tag": "2.0.7",
-  "bazel_worker_tag": "v0.1.9",
+  "bazel_worker_tag": "0.1.11",
   "boolean_selector_tag" : "1.0.3",
   "boringssl_gen_rev": "fc47eaa1a245d858bae462cd64d4155605b850ea",
   "boringssl_rev" : "189270cd190267f5bd60cfe8f8ce7a61d07ba6f4",
   "charcode_tag": "v1.1.1",
   "chrome_rev" : "19997",
-  "cli_util_tag" : "0.1.2+1",
+  "cli_util_rev" : "fb5ee65ab72f6b4dd99a53efd992979ebdaf10df",
   "collection_tag": "1.14.10",
   "convert_tag": "2.0.1",
   "crypto_tag" : "2.0.5",
@@ -78,70 +78,71 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.1.2",  # Please see the note above before updating.
+  "dart_style_tag": "1.1.3",  # Please see the note above before updating.
 
   "dartdoc_tag" : "v0.20.1",
   "fixnum_tag": "0.10.5",
   "func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "1.1.5",
   "html_tag" : "0.13.3",
-  "http_io_tag": "265e90afbffacb7b2988385d4a6aa2f14e970d44",
-  "http_multi_server_tag" : "2.0.4",
+  "http_io_rev": "265e90afbffacb7b2988385d4a6aa2f14e970d44",
+  "http_multi_server_tag" : "2.0.5",
   "http_parser_tag" : "3.1.1",
   "http_retry_tag": "0.1.1",
   "http_tag" : "0.11.3+17",
   "http_throttle_tag" : "1.0.2",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
-  "intl_tag": "0.15.2",
+  "intl_tag": "0.15.6",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
-  "json_rpc_2_tag": "2.0.6",
+  "json_rpc_2_tag": "2.0.8",
   "linter_tag": "0.1.56",
   "logging_tag": "0.11.3+1",
-  "markdown_tag": "2.0.0",
+  "markdown_tag": "2.0.1",
   "matcher_tag": "0.12.3",
-  "mime_tag": "0.9.6",
+  "mime_tag": "0.9.6+1",
   "mockito_tag": "d39ac507483b9891165e422ec98d9fb480037c8b",
   "mustache4dart_tag" : "v2.1.2",
-  "oauth2_tag": "1.1.0",
+  "oauth2_tag": "1.2.1",
   "observatory_pub_packages_rev": "caf0aecfb15077fc7a34d48e9df13606c793fddf",
   "package_config_tag": "1.0.3",
-  "package_resolver_tag": "1.0.2+1",
+  "package_resolver_tag": "1.0.3",
   "path_tag": "1.5.1",
   "plugin_tag": "0.2.0+2",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.4",
-  "protobuf_tag": "0.7.1",
+  "protobuf_tag": "0.9.0",
   "pub_rev": "58fe996eab8d54f28f5109c407ff0ab62fbd835d",
   "pub_semver_tag": "1.4.1",
   "quiver_tag": "0.29.0",
-  "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
+  "resource_rev": "b786afa7567fc6b95c185edb01cc4e9d3dadbe30",
   "root_certificates_rev": "16ef64be64c7dfdff2b9f4b910726e635ccc519e",
-  "shelf_static_rev": "v0.2.7",
+  "shelf_static_rev": "v0.2.8",
   "shelf_packages_handler_tag": "1.0.3",
-  "shelf_tag": "0.7.2",
-  "shelf_web_socket_tag": "0.2.2",
+  "shelf_tag": "0.7.3+2",
+  "shelf_web_socket_tag": "0.2.2+2",
   "source_map_stack_trace_tag": "1.1.4",
   "source_maps-0.9.4_rev": "38524",
-  "source_maps_tag": "0.10.4",
+  "source_maps_tag": "0.10.6",
   "source_span_tag": "1.4.0",
   "stack_trace_tag": "1.9.2",
   "stream_channel_tag": "1.6.4",
   "string_scanner_tag": "1.0.2",
   "sunflower_rev": "879b704933413414679396b129f5dfa96f7a0b1e",
-  "test_descriptor_tag": "1.0.3",
-  "test_process_tag": "1.0.1",
+  "test_descriptor_tag": "1.1.1",
+  "test_process_tag": "1.0.3",
   "term_glyph_tag": "1.0.0",
   "test_reflective_loader_tag": "0.1.4",
   "test_tag": "1.0.0",
   "tuple_tag": "v1.0.1",
   "typed_data_tag": "1.1.3",
+  "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
   "usage_tag": "3.4.0",
   "utf_tag": "0.9.0+4",
-  "watcher_tag": "0.9.7+8",
+  "watcher_rev": "908d74c6ed0889fa9bd7939c72bcc287e4f581fd",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
-  "web_socket_channel_tag": "1.0.7",
+  "web_socket_channel_tag": "1.0.8",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
-  "yaml_tag": "2.1.13",
+  "yaml_tag": "2.1.14",
   "zlib_rev": "c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
 }
 
@@ -157,7 +158,7 @@
       "packages": [
           {
               "package": "dart/dart-sdk/${{platform}}",
-              "version": "version:2.0.0-dev.65.0",
+              "version": "version:2.0.0-dev.68.0",
           },
       ],
       "dep_type": "cipd",
@@ -215,7 +216,7 @@
   Var("dart_root") + "/third_party/pkg/charcode":
       Var("dart_git") + "charcode.git" + "@" + Var("charcode_tag"),
   Var("dart_root") + "/third_party/pkg/cli_util":
-      Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_tag"),
+      Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_rev"),
   Var("dart_root") + "/third_party/pkg/collection":
       Var("dart_git") + "collection.git" + "@" + Var("collection_tag"),
   Var("dart_root") + "/third_party/pkg/convert":
@@ -241,7 +242,7 @@
   Var("dart_root") + "/third_party/pkg/http":
       Var("dart_git") + "http.git" + "@" + Var("http_tag"),
   Var("dart_root") + "/third_party/pkg_tested/http_io":
-    Var("dart_git") + "http_io.git" + "@" + Var("http_io_tag"),
+    Var("dart_git") + "http_io.git" + "@" + Var("http_io_rev"),
   Var("dart_root") + "/third_party/pkg/http_multi_server":
       Var("dart_git") + "http_multi_server.git" +
       "@" + Var("http_multi_server_tag"),
@@ -346,12 +347,18 @@
       Var("dart_git") + "tuple.git" + "@" + Var("tuple_tag"),
   Var("dart_root") + "/third_party/pkg/typed_data":
       Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
+  # Unittest is an early version, 0.11.x, of the package "test"
+  # Do not use it in any new tests. Fetched from chromium_git to avoid
+  # race condition in cache with pkg/test.
+  Var("dart_root") + "/third_party/pkg/unittest":
+      Var("chromium_git") + "/external/github.com/dart-lang/test.git" +
+      "@" + Var("unittest_rev"),
   Var("dart_root") + "/third_party/pkg/usage":
       Var("dart_git") + "usage.git" + "@" + Var("usage_tag"),
   Var("dart_root") + "/third_party/pkg/utf":
       Var("dart_git") + "utf.git" + "@" + Var("utf_tag"),
   Var("dart_root") + "/third_party/pkg/watcher":
-      Var("dart_git") + "watcher.git" + "@" + Var("watcher_tag"),
+      Var("dart_git") + "watcher.git" + "@" + Var("watcher_rev"),
   Var("dart_root") + "/third_party/pkg/web_components":
       Var("dart_git") + "web-components.git" +
       "@" + Var("web_components_rev"),
@@ -415,22 +422,6 @@
     ],
   },
   {
-    "name": "unittest",
-    # Unittest is an early version, 0.11.6, of the package "test"
-    # Do not use it in any new tests.
-    "pattern": ".",
-    "action": [
-      "download_from_google_storage",
-      "--no_auth",
-      "--no_resume",
-      "--bucket",
-      "dart-dependencies",
-      "--extract",
-      "-s",
-      Var('dart_root') + "/third_party/pkg/unittest.tar.gz.sha1",
-    ],
-  },
-  {
     "name": "7zip",
     "pattern": ".",
     "action": [
diff --git a/sdk/copy_tree.gni b/build/dart/copy_tree.gni
similarity index 98%
rename from sdk/copy_tree.gni
rename to build/dart/copy_tree.gni
index a368a29..580d711 100644
--- a/sdk/copy_tree.gni
+++ b/build/dart/copy_tree.gni
@@ -2,7 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-_dart_root = rebase_path("..")
+_dart_root = rebase_path("../..")
 
 # copy_tree() copies a directory tree rooted at `source` to `dest`, which should
 # be somewhere under $root_out_dir.
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index 6c8a3e5..3146317 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -80,6 +80,10 @@
 % alternative, that is, when starting a "continuation line".
 \newcommand{\gnewline}{\\\mbox{}\qquad{}}
 
+% Metavariables for argument lists.
+\newcommand{\argumentList}[1]{\metavar{{#1}s}}
+\newcommand{\parameterList}[1]{\metavar{{#1}s}}
+
 \newenvironment{Q}[1]{{\bf #1}}{}
 \newenvironment{rationale}[1]{{\it #1}}{}
 \newenvironment{commentary}[1]{{\sf #1}}{}
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 79178c0..80b7482 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -67,6 +67,8 @@
 % - Clarify that it is an error to use FutureOr<T> as a superinterface etc.
 % - Eliminate the notion of static warnings, all program faults are now errors.
 % - It is no longer an error for a getter to have return type `void`.
+% - Specify that each redirection of a constructor is checked, statically and
+%   dynamically.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -1028,7 +1030,7 @@
   .
 \end{grammar}
 
-Formal parameter lists allow an optional trailing comma after the last parameter ($`,\!'?$).
+Formal parameter lists allow an optional trailing comma after the last parameter (\gcomma{}?).
 A parameter list with such a trailing comma is equivalent in all ways to the same parameter list without the trailing comma.
 All parameter lists in this specification are shown without a trailing comma, but the rules and semantics apply equally to the corresponding parameter list with a trailing comma.
 
@@ -1720,18 +1722,80 @@
 If a generative constructor $c$ is not a redirecting constructor and no body is provided, then $c$ implicitly has an empty body \code{\{\}}.
 
 
-\paragraph{Redirecting Constructors}
-\LMLabel{redirectingConstructors}
+\paragraph{Redirecting Generative Constructors}
+\LMLabel{redirectingGenerativeConstructors}
 
 \LMHash{}
 A generative constructor may be {\em redirecting}, in which case its only action is to invoke another generative constructor.
-A redirecting constructor has no body; instead, it has a redirect clause that specifies which constructor the invocation is redirected to, and with what arguments.
+A redirecting constructor has no body;
+instead, it has a redirect clause that specifies which constructor the invocation is redirected to, and with which arguments.
 
 \begin{grammar}
 {\bf redirection:}`{\escapegrammar :}' \THIS{} (`{\escapegrammar .}' identifier)? arguments
   .
 \end{grammar}
 
+\def\ConstMetavar{\mbox{\CONST{}?}}
+
+\LMHash{}
+Assume that
+\code{$C$<$X_1\ \EXTENDS\ B_1 \ldots,\ X_m\ \EXTENDS\ B_m$>}
+is the name and formal type parameters of the enclosing class,
+$\ConstMetavar$ stands for either \CONST{} or nothing,
+$N$ is $C$ or $C.\id_0$ for some identifier $\id_0$,
+and \id{} is an identifier.
+Consider a declaration of a redirecting generative constructor $k$ of one of the forms
+
+\code{$\ConstMetavar$ $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $[$T_{n+1}\ x_{n+1} = d_1 \ldots,\ T_{n+k}\ x_{n+k} = d_k$]): $R$;}
+
+\code{$\ConstMetavar$ $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $\{$T_{n+1}\ x_{n+1} = d_1 \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}): $R$;}
+
+\noindent
+where $R$ is of one of the forms
+
+\code{$\THIS{}$($e_1 \ldots,\ e_p,\ x_1$: $e_{p+1}, \ldots,\ x_q$: $e_{p+q}$)}
+
+\code{$\THIS{}.\id$($e_1 \ldots,\ e_p,\ x_1$: $e_{p+1}, \ldots,\ x_q$: $e_{p+q}$)}
+
+\LMHash{}
+The {\em redirectee constructor} for this declaration is then the constructor denoted by
+\code{$C$<$X_1 \ldots,\ X_m$>} respectively \code{$C$<$X_1 \ldots,\ X_m$>.\id}.
+It is a compile-time error if the static argument list type (\ref{actualArgumentLists}) of
+\code{($e_1 \ldots,\ e_p,\ x_1$: $e_{p+1}, \ldots,\ x_q$: $e_{p+q}$)}
+is not an assignable match for the formal parameter list of the redirectee.
+
+\commentary{
+Note that the case where no named parameters are passed is covered by letting $q$ be zero,
+and the case where $C$ is a non-generic class is covered by letting $m$ be zero,
+in which case the formal type parameter list and actual type argument lists are omitted (\ref{generics}).
+}
+
+\rationale{
+We require an assignable match rather than the stricter subtype match
+because a generative redirecting constructor $k$ invokes its redirectee $k'$
+in a manner which resembles function invocation in general.
+For instance, $k$ could accept an argument \code{x}
+and pass on an expression $e_j$ using \code{x} such as \code{x.f(42)} to $k'$,
+and it would be surprising
+if $e_j$ were subject to more strict constraints than the ones applied to
+actual arguments to function invocations in general.
+}
+
+\LMHash{}
+When $\ConstMetavar$ is \CONST{},
+it is a compile-time error if the redirectee is not a constant constructor.
+Moreover, when $\ConstMetavar$ is \CONST{}, each
+$e_i,\ i \in 1 .. p+q$,
+must be a potentially constant expression (\ref{constantConstructors}).
+
+\LMHash{}
+It is a dynamic error if an actual argument passed in an invocation of a redirecting generative constructor $k$
+is not a subtype of the actual type 
+\ref{actualTypeOfADeclaration}) of the corresponding formal parameter in the declaration of $k$.
+It is a dynamic error if an actual argument passed to the redirectee $k'$ of a redirecting generative constructor
+is not a subtype of the actual type
+(\ref{actualTypeOfADeclaration}) of the corresponding formal parameter in the declaration of the redirectee.
+
 
 \paragraph{Initializer Lists}
 \LMLabel{initializerLists}
@@ -1953,13 +2017,56 @@
   .
 \end{grammar}
 
+Assume that
+\code{$C$<$X_1\ \EXTENDS\ B_1 \ldots,\ X_m\ \EXTENDS\ B_m$>}
+is the name and formal type parameters of the enclosing class,
+$\ConstMetavar$ is \CONST{} or empty,
+$N$ is $C$ or $C.\id_0$ for some identifier $\id_0$,
+$T$ is a type name, and \id{} is an identifier,
+then consider a declaration of a redirecting factory constructor $k$ of one of the forms
+
+\begin{dartCode}
+$\ConstMetavar$ \FACTORY{}
+    $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $[$T_{n+1}\ x_{n+1} = d_1 \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) = $R$;
+
+$\ConstMetavar$ \FACTORY{}
+    $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $\{$T_{n+1}\ x_{n+1} = d_1 \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) = $R$;
+\end{dartCode}
+
+\noindent
+where $R$ is of one of the forms
+\code{$T$<$S_1 \ldots,\ S_p$>} or
+\code{$T$<$S_1 \ldots,\ S_p$>.\id}.
+The {\em redirectee constructor} for this declaration is then the constructor denoted by $R$.
+
 \LMHash{}
-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}).
+Let $\argumentList{T}$ be the static argument list type (\ref{actualArgumentLists})
+\code{($T_1 \ldots,\ T_{n+k}$)}
+when $k$ takes no named arguments, and
+\code{($T_1 \ldots,\ T_n,\ T_{n+1}\ x_{n+1},\ \ldots,\ T_{n+k}\ x_{n+k}$)}
+when $k$ takes some named arguments.
+It is a compile-time error if $\argumentList{T}$
+is not a subtype match for the formal parameter list of the redirectee.
+
+\rationale{
+We require a subtype match
+(rather than the more forgiving assignable match which is used with a generative redirecting constructor),
+because a factory redirecting constructor $k$ always invokes its redirectee $k'$
+with exactly the same actual arguments that $k$ received.
+This means that a downcast on an actual argument
+``between'' $k$ and $k'$
+would either be unused because the actual argument has the type required by $k'$,
+or it would amount to a dynamic error which is simply delayed a single step.
+}
+
+\LMHash{}
+Moreover, when $\ConstMetavar$ is \CONST{}
+the redirectee must be a constant constructor.
 
 \commentary{
-It follows that if \metavar{type} or \code{\metavar{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'$ expects, or if $k$ is called with a named parameter that is not declared by $k'$.
+Note that the non-generic case is covered by letting $m$ or $p$ or both be zero,
+in which case the formal type parameter list of the class $C$
+and/or the actual type argument list of the redirectee constructor is omitted (\ref{generics}).
 }
 
 \LMHash{}
@@ -1970,14 +2077,7 @@
 }
 
 \LMHash{}
-It is a run-time error if a redirecting factory constructor redirects to itself, either directly or indirectly via a sequence of redirections. %does not redirect to a non-redirecting factory constructor or to a generative constructor in a finite number of steps.
-
-% Make this a run-time error so deferred loading works
-
-\rationale{
-If a redirecting factory $F_1$ redirects to another redirecting factory $F_2$ and $F_2$ then redirects to $F_1$, then both $F_1$ and $F_2$ are ill-defined.
-Such cycles are therefore illegal.
-}
+It is a compile-time error if a redirecting factory constructor redirects to itself, either directly or indirectly via a sequence of redirections.
 
 \LMHash{}
 It is a compile-time error if $type$ does not denote a class accessible in the current scope;
@@ -1992,7 +2092,7 @@
 However, redirecting factories have several advantages:
 \begin{itemize}
 \item An abstract class may provide a constant constructor that utilizes the constant constructor of another class.
-\item A redirecting factory constructors avoids the need for forwarders to repeat the default values for formal parameters in their signatures.
+\item A redirecting factory constructor avoids the need for forwarders to repeat the default values for formal parameters in their signatures.
 %\item A generic factory class that aggregates factory constructors for types it does not implement can still have its type arguments passed correctly.
 \end{itemize}
 
@@ -2034,6 +2134,25 @@
 \LMHash{}
 It is a compile-time error if any of the type arguments to $k'$ are not subtypes of the bounds of the corresponding formal type parameters of $type$.
 
+\LMHash{}
+For the dynamic semantics,
+assume that $k$ is a redirecting factory constructor
+and $k'$ is the redirectee of $k$.
+
+\LMHash{}
+When the redirectee $k'$ is a factory constructor,
+execution of $k$ amounts to execution of $k'$ with the actual arguments passed to $k$.
+The result of the execution of $k'$ is the result of $k$.
+
+\LMHash{}
+When the redirectee $k'$ is a generative constructor,
+let $o$ be a fresh instance (\ref{generativeConstructors})
+of the class that contains $k'$.
+Execution of $k$ then amounts to execution of $k'$ to initialize $o$,
+governed by the same rules as an instance creation expression (\ref{instanceCreation}).
+If $k$ completed normally then the execution of $k'$ completes normally returning $o$,
+otherwise $k'$ completes by throwing the exception and stack trace thrown by $k$.
+
 
 \subsubsection{Constant Constructors}
 \LMLabel{constantConstructors}
@@ -2350,7 +2469,7 @@
   When we speak of members here, we mean accessible instance or static variables, getters, setters, and methods (\ref{classes}).
 \item You cannot have two members with the same name in the same class - be they declared or inherited (\ref{scoping}, \ref{classes}).
 \item Static members are never inherited.
-\item It is an error if you have an static member named $m$ in your class and an instance member of the same name (\ref{instanceMethods}, \ref{getters}, \ref{setters}).
+\item It is an error if you have an static member named $m$ in your class and an instance member of the same name (\ref{classMemborConflicts}).
 \item It is an error if you have a static setter $v=$, and an instance member $v$ (\ref{setters}).
 \item It is an error if you have a static getter $v$ and an instance setter $v=$ (\ref{getters}).
 \item If you define an instance member named $m$, and your superclass has an instance member of the same name, they override each other.
@@ -2767,7 +2886,7 @@
 
 \LMHash{}
 The declaration of an enum of the form
-\code{$m$ \ENUM{} E \{$m_0\,\,id_0, \ldots,\ m_{n-1}\,\,id_{n-1}$\}}
+\code{$m$ \ENUM{} E \{$m_0\,\,\id_0, \ldots,\ m_{n-1}\,\,\id_{n-1}$\}}
 has the same effect as a class declaration
 
 \begin{dartCode}
@@ -2777,8 +2896,8 @@
   $m_0$ \STATIC{} \CONST{} E id$_0$ = \CONST{} E(0);
   $\ldots$
   $m_{n-1}$ \STATIC{} \CONST{} E id$_{n-1}$ = const E(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]
+  \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}
 
@@ -3977,7 +4096,7 @@
 \end{itemize}
 
 \LMHash{}
-The form \code{\$id} is equivalent to the form \code{\$\{id\}}.
+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)
 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}
@@ -4002,20 +4121,20 @@
 \end{grammar}
 
 \LMHash{}
-A symbol literal \code{\#$id$} where $id$ is an identifier
+A symbol literal \code{\#\id} where \id{} is an identifier
 that does not begin with an underscore ('\code{\_}'),
-evaluates to an instance of \code{Symbol} representing the identifier $id$.
-All occurences of \code{\#$id$} evaluate to the same instance
+evaluates to an instance of \code{Symbol} representing the identifier \id.
+All occurences of \code{\#\id} evaluate to the same instance
 \commentary{(symbol instances are canonicalized)},
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is equal
 (according to the \code{==} operator \ref{equality}) to that instance.
 
 \LMHash{}
-A symbol literal \code{\#$id$.$id_2$\ldots$id_n$}
-where $id$ \ldots $id_n$ are identifiers,
+A symbol literal \code{\#$\id.\id_2\ldots\id_n$}
+where $\id{} \ldots \id_n$ are identifiers,
 evaluates to an instance of \code{Symbol} representing that particular sequence of identifiers.
-All occurences of \code{\#$id$.$id_2$\ldots$id_n$} with the same sequence of identifiers
+All occurences of \code{\#$\id.\id_2\ldots\id_n$} with the same sequence of identifiers
 evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
@@ -4030,9 +4149,9 @@
 or to a \code{Symbol} instance that is \code{==} to that instance.
 
 \LMHash{}
-A symbol literal \code{\#\_$id$}, evaluates to an instance of \code{Symbol}
+A symbol literal \code{\#\_\id}, evaluates to an instance of \code{Symbol}
 representing the private identifier \code{\_\id} of the containing library.
-All occurences of \code{\#\_$id$} {\em in the same library} evaluate to the same instance,
+All occurences of \code{\#\_\id} {\em in the same library} evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
 
@@ -4854,7 +4973,7 @@
 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).
+(either via instance creation (\ref{instanceCreation}), constructor redirection (\ref{redirectingGenerativeConstructors}), 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,
 formal type parameters of $f$ are bound to the corresponding actual type arguments,
@@ -4989,11 +5108,11 @@
 %When a stream is canceled, the implementation must wait for the cancelation future returned by \code{cancell()} to complete before proceeding.
 
 
-\subsubsection{Actual Argument List Evaluation}
-\LMLabel{actualArguments}
+\subsubsection{Actual Argument Lists}
+\LMLabel{actualArgumentLists}
 
 \LMHash{}
-Function invocation involves evaluation of the list of actual arguments to the function and binding of the results to the function's formal parameters.
+Actual argument lists have the following syntax:
 
 \begin{grammar}
 {\bf arguments:}`(' (argumentList \gcomma{}?)? `)'
@@ -5008,9 +5127,78 @@
 \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 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.
+Argument lists allow an optional trailing comma after the last argument (\gcomma{}?).
+An argument list with such a trailing comma is equivalent in all ways to the same parameter 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{}
+Let $L$ be an argument list of the form
+\code{($e_1 \ldots,\ e_m,\ y_{m+1}$: $e_{m+1} \ldots,\ y_{m+p}$: $e_{m+p}$)}
+and assume that the static type of $e_i$ is $S_i$, $i \in 1 .. m+p$.
+The {\em static argument list type} of $L$ is then
+\code{($S_1 \ldots,\ S_m,\ S_{m+1}\ y_{m+1} \ldots,\ S_{m+p}\ y_{m+p}$)}.
+
+\LMHash{}
+Let $\argumentList{S}$ be the static argument list type
+
+\code{($S_1 \ldots,\ S_m,\ S_{m+1}\ y_{m+1} \ldots,\ S_{m+p}\ y_{m+p}$)}
+
+\noindent
+and let $\parameterList{P}$ be the formal parameter list
+
+\code{($T_1\ x_1 \ldots,\ T_n\ x_n,\ $[$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$])}
+
+\noindent
+where each parameter may be marked \COVARIANT{} (\commentary{not shown, but allowed}).
+
+\LMHash{}
+We say that $\argumentList{S}$ {\em is a subtype match} for $\parameterList{P}$
+if{}f $p = 0$, $n \leq m \leq n+k$, and $S_i$ is a subtype of $T_i$ for all $i \in 1 .. m$.
+We say that $\argumentList{S}$ {\em is an assignable match} for $\parameterList{P}$
+if{}f $p = 0$, $n \leq m \leq n+k$, and $S_i$ is assignable to $T_i$ for all $i \in 1 .. m$.
+
+\LMHash{}
+Let $\argumentList{S}$ be the static argument list type
+
+\code{($S_1 \ldots,\ S_m,\ S_{m+1}\ y_{m+1} \ldots,\ S_{m+p}\ y_{m+p}$)}
+
+\noindent
+and let $\parameterList{P}$ be the formal parameter list
+
+\code{($T_1\ x_1 \ldots,\ T_n\ x_n,\ $\{$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$\})}
+
+\noindent
+where each parameter may be marked \COVARIANT{} (\commentary{not shown, but allowed}).
+
+\LMHash{}
+We say that $\argumentList{S}$ {\em is a subtype match} for $\parameterList{P}$
+if{}f $m = n$,
+$\{y_{m+1}\ldots,\ y_{m+p}\} \subseteq \{x_{n+1}\ldots,\ x_{n+k}\}$,
+$S_i$ is a subtype of $T_i$ for all $i \in 1 .. m$,
+and $S_i$ is a subtype of $T_j$ whenever $y_i = x_j$ and
+$j \in n + 1 .. n + k$, for all
+$i \in m + 1 .. m + p$.
+We say that $\argumentList{S}$ {\em is an assignable match} for $\parameterList{P}$
+if{}f $m = n$,
+$\{y_{m+1}\ldots,\ y_{m+p}\} \subseteq \{x_{n+1}\ldots,\ x_{n+k}\}$,
+$S_i$ is assignable to $T_i$ for all $i \in 1 .. m$,
+and $S_i$ is assignable to $T_j$ whenever $y_i = x_j$ and
+$j \in n + 1 .. n + k$, for all
+$i \in m + 1 .. m + p$.
+
+\commentary{
+In short, an actual argument list is a match for a formal parameter list
+whenever the former can safely be passed to the latter.
+}
+
+
+\subsubsection{Actual Argument List Evaluation}
+\LMLabel{actualArguments}
+
+\LMHash{}
+Function invocation involves evaluation of the list of actual arguments to the function,
+and binding of the results to the function's formal parameters.
 
 \LMHash{}
 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.
@@ -8179,8 +8367,8 @@
 It is a compile-time error if all of the following conditions hold:
 \begin{itemize}
 \item The switch statement does not have a default clause.
-\item The static type of $e$ is an enumerated typed with elements $id_1, \ldots, id_n$.
-\item The sets $\{e_1, \ldots, e_k\} $ and $\{id_1, \ldots, id_n\}$ are not the same.
+\item The static type of $e$ is an enumerated type with elements $\id_1, \ldots, \id_n$.
+\item The sets $\{e_1, \ldots, e_k\} $ and $\{\id_1, \ldots, \id_n\}$ are not the same.
 \end{itemize}
 
 \commentary{
@@ -9007,9 +9195,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.
@@ -9017,9 +9205,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}
@@ -9178,12 +9366,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{}
diff --git a/docs/language/informal/generic-function-instantiation.md b/docs/language/informal/generic-function-instantiation.md
new file mode 100644
index 0000000..d9ee68b
--- /dev/null
+++ b/docs/language/informal/generic-function-instantiation.md
@@ -0,0 +1,387 @@
+# Generic Function Instantiation
+
+Author: eernst@.
+
+Version: 0.3 (2018-04-05)
+
+Status: Under discussion.
+
+**This document** is a Dart 2 feature specification of _generic function
+instantiation_, which is the feature that implicitly coerces a reference to
+a generic function into a non-generic function obtained from said generic
+function by passing inferred type arguments.
+
+Intuitively, this is the feature that provides inference for function
+values, corresponding to the more well-known inference that we may get for
+each invocation of a generic function:
+
+```dart
+List<T> f<T>(T t) => [t];
+
+void g(Iterable<int> f(int i)) => print(f(42));
+
+main() {
+  // Invocation inference.
+  print(f(42)); // Inferred as `f<int>(42)`.
+
+  // Function value inference.
+  g(f); // Inferred approximately as `g((int n) => f<int>(n))`.
+}
+```
+
+This document draws on many of the comments on the SDK issue
+[#31665](https://github.com/dart-lang/sdk/issues/31665).
+
+
+## Motivation
+
+The
+[language specification](https://github.com/dart-lang/sdk/blob/master/docs/language/dartLangSpec.tex)
+uses the phrase _function object_ to denote the first-class semantic
+entity which corresponds to a function declaration. In the following
+example, each of the expressions `fg`, `A.fs`, `new A().fi`, and `fl` in
+`main` evaluate to a function object, and so does the function literal at
+the end of the list:
+
+```dart
+int fg(int i) => i;
+
+class A {
+  static int fs(int i) => i;
+  int fi(int i) => i;
+}
+
+main() {
+  int fl(int i) => i;
+  var functions =
+      [fg, A.fs, new A().fi, fl, (int i) => i];
+}
+```
+
+Once a function object has been obtained, it can be passed around by
+assigning it to a variable, passing it as an actual argument, etc. Hence,
+it is the notion of a function object that makes functions first-class
+entities. The computational step that produces a function object from a
+denotation of a function declaration is known as _closurization_.
+
+The situation where closurization occurs is exactly the situation where the
+generic function instantiation feature specified in this document may kick
+in.
+
+First note that generic function declarations provide support for working
+with generic functions as first class values, i.e., generic functions
+support regular closurization, just like non-generic functions.
+
+The essence of generic function instantiation is to allow for "curried"
+invocations, in the sense that a generic function can receive its actual
+type arguments separately during closurization (it must then receive _all_
+its type arguments, not just some of them), and that yields a non-generic
+function whose type is obtained by substituting type variables in the
+generic type for the actual type arguments:
+
+```dart
+X fg<X extends num>(X x) => x;
+
+class A {
+  static X fs<X extends num>(X x) => x;
+  X fi<X extends num>(X x) => x;
+}
+
+main() {
+  X fl<X extends num>(X x) => x;
+  var genericFunctions =
+      <Function>[fg, A.fs, new A().fi, fl, <X>(X x) => x];
+  var instantiatedFunctions =
+      <int Function(int)>[fg, A.fs, new A().fi, fl];
+}
+```
+
+The functions stored in `instantiatedFunctions` are all of type
+`int Function(int)`, and they are obtained by passing the actual
+type argument `int` to the denoted generic function, thus obtaining
+a non-generic function of the specified type. Hence, the reason why
+`instantiatedFunctions` can be created as shown is that it relies on
+generic function instantiation, for each element in the list.
+
+Note that generic function instantiation is not supported with all kinds of
+generic functions; this is discussed in the discussion section.
+
+It may seem natural to allow explicit instantiations, e.g., `fg<int>` and
+`new A().fi<int>` (where type arguments are passed explicitly, but there is
+no value argument list). This kind of construct would yield non-generic
+functions, just like the cases shown above where the type arguments are
+inferred. This is a language extension which is not included in this
+document. It may or may not be added to the language separately.
+
+
+## Syntax
+
+This feature does not affect the grammar.
+
+*If this feature is generalized to include explicit generic
+function instantiation, the grammar would need to be extended
+to allow a construct like `f<int>` as an expression.*
+
+
+## Static Analysis and Program Transformation
+
+We say that a reference of the form `identifier`,
+`identifier '.' identifier`, or
+`identifier '.' identifier '.' identifier`
+is a _statically resolved reference to a function_ if it denotes a
+declaration of a library function or a static function.
+
+*Such a reference is first-order in the sense that it is bound directly to
+the function declaration and there need not be a heap object which
+represents said function declaration in order to support invocations of the
+function. In that sense we may consider statically resolved references
+"extra simple", compared to general references to functions. In particular,
+a statically resolved reference to a function will have a static type which
+is obtained directly from its declaration, it will never be a supertype
+thereof such as `Function` or `dynamic`.*
+
+When an expression _e_ whose static type is a generic function type _G_ is
+used in a context where the expected type is a non-generic function type
+_F_, it is a compile-time error except in the three situations specified
+below.
+
+*The point is that generic function instantiation will only take place in
+situations where we would have a compile-time error without that feature,
+and in those situations the compile-time error will still exist unless the
+situation matches one of those three exceptions.*
+
+**1st exception**: If _e_ is a statically resolved reference to a function,
+and type inference yields an actual type argument list
+_T<sub>1</sub> .. T<sub>k</sub>_ such that
+_G<T<sub>1</sub> .. T<sub>k</sub>>_ is assignable to _F_, then the program
+is modified such that _e_ is replaced by a reference to a non-generic
+function whose signature is obtained by substituting
+_T<sub>1</sub> .. T<sub>k</sub>_ for the formal type parameters in the
+function signature of the function denoted by _e_, and whose semantics for
+each invocation is the same as invoking _e_ with
+_T<sub>1</sub> .. T<sub>k</sub>_ as the actual type argument list.
+
+*Here is an example:*
+
+```dart
+List<T> foo<T>(T t) => [t];
+List<int> fooOfInt(int i) => [i];
+
+String bar(List<int> f(int)) => "${f(42)}";
+
+main() {
+  print(bar(foo));
+}
+```
+
+*In this example, `foo` as an actual argument to `bar` will be modified as
+if the call had been `bar(fooOfInt)`, except for equality&mdash;which is
+specified next.*
+
+Consider two distinct evaluations of a statically resolved reference to the
+same generic function, which are subject to the above-mentioned
+transformation with the same actual type argument list, and let `f1` and
+`f2` denote the two functions obtained after the transformation. It is then
+guaranteed that `f1 == f2` evaluates to true, but `identical(f1, f2)` can
+be false or true, depending on the implementation.
+
+**2nd exception**: Generic function instantiation is supported for instance
+methods as well as statically resolved functions: If
+
+- _e_ is a property extraction which denotes a closurization,
+- the static type of _e_ is a generic function type _G_,
+- _e_ occurs in a context where the expected type is a non-generic
+  function type _F_, and
+- type inference yields an actual type argument list
+  _T<sub>1</sub> .. T<sub>k</sub>_ such that
+  _G<T<sub>1</sub> .. T<sub>k</sub>>_ is assignable to _F_
+
+then the program is modified such that _e_ is replaced by a reference to a
+non-generic function whose signature is obtained by substituting
+_T<sub>1</sub> .. T<sub>k</sub>_ for
+the formal type parameters in the signature of the method denoted by
+_e_, and whose semantics for each invocation is the same as
+invoking that method on that receiver with
+_T<sub>1</sub> .. T<sub>k</sub>_ as the actual type argument list.
+
+*Note that the statically known declaration of the method which is
+closurized may not be the same one as the declaration of the method which
+is actually closurized at run time, but it is guaranteed that the actual
+signature will have a formal type parameter list with the same length,
+where each formal type parameter will have the same bound as the statically
+known one, and the value parameters will have types which are in a correct
+override relationship to the statically known ones. In other words, the
+function obtained by generic function instantiation on an instance method
+may accept a different number of parameters, with type annotations that are
+different than the statically known ones, but the corresponding function
+type will be a subtype of the statically known one, i.e., it can be called
+safely. (It is possible that the method which is actually closurized has
+one or more formal parameters which are covariant, and this may cause an
+otherwise statically safe invocation to fail at run-time, but this is
+exactly the same situation as we would have had with a direct invocation of
+the method.)*
+
+Consider two distinct evaluations of a property extraction for the same method
+of receivers `o1` and `o2`, which are subject to the above-mentioned
+transformation with the same actual type argument list, and let `f1` and
+`f2` denote the two functions obtained after the transformation. It is then
+guaranteed that `f1 == f2` evaluates to the same value as `identical(o1, o2)`,
+but `identical(f1, f2)` can be false or true, depending on the implementation.
+
+*Here is an example:*
+
+```dart
+class A {
+  List<T> foo<T>(T t) => [t];
+}
+
+String bar(List<int> f(int)) => "${f(42)}";
+
+main() {
+  print(bar(new A().foo));
+}
+```
+
+*In this example, `new A().foo` as an actual argument to `bar` will be
+modified as if the call had been `bar((int i) => o.foo<int>(i))` where `o`
+is a fresh variable bound to the result of evaluating `new A()`, except for
+equality.*
+
+**3rd exception**: Generic function instantiation is supported also for
+local functions: If
+
+- _e_ is an `identifier` denoting a local function,
+- the static type of _e_ is a generic function type _G_,
+- _e_ occurs in a context where the expected type is a non-generic
+  function type _F_, and
+- type inference yields an actual type argument list
+  _T<sub>1</sub> .. T<sub>k</sub>_ such that
+  _G<T<sub>1</sub> .. T<sub>k</sub>>_ is assignable to _F_
+
+then the program is modified such that _e_ is replaced by a reference to a
+non-generic function whose signature is obtained by substituting
+_T<sub>1</sub> .. T<sub>k</sub>_ for
+the formal type parameters in the signature of the function denoted by _e_,
+and whose semantics for each invocation is the same as invoking that
+function on that receiver with _T<sub>1</sub> .. T<sub>k</sub>_ as the
+actual type argument list.
+
+*No special guarantees are provided regarding the equality and identity
+properties of the non-generic functions obtained from a local function.*
+
+If _e_ is an expression which is subject to generic function instantiation
+as specified above, and the function denoted by _e_ is a top-level function
+or a static method that is not qualified by a deferred prefix, and the
+inferred type arguments are all compile-time constant type expressions
+(*cf. [this CL](https://dart-review.googlesource.com/c/sdk/+/36220)*), then
+_e_ is a constant expression. Other than that, an expression subject to
+generic function instantiation is not constant.
+
+
+## Dynamic Semantics
+
+The dynamic semantics of this feature follows directly from the fact that
+the section on static analysis specifies which expressions are subject to
+generic function instantiation, and how to obtain the non-generic function
+which is the value of such an expression.
+
+There is one exception: It is possible for inference to provide a type
+argument which is not statically guaranteed to satisfy the declared upper
+bound. In that case, a dynamic error occurs when the generic function
+instantiation takes place.
+
+*Here is an example to illustrate how this may occur:*
+
+```dart
+class C<X> {
+  X x;
+  void foo<Y extends X>(Y y) => x = y;
+}
+
+C<num> complexComputation() => new C<int>();
+
+main() {
+  C<num> c = complexComputation();
+  void Function(num) f = c.foo; // Inferred type argument: `num`.
+}
+```
+
+*In this situation, the inferred type argument `num` is not guaranteed to
+satisfy the declared upper bound of `Y`, because the actual type argument
+of `c`, let us call it `T`, is only known to be some subtype of `num`.
+There is no way to denote the type `T` or any other type (except `Null`)
+which is guaranteed to be a subtype of `T`. Hence, the chosen type argument
+may turn out to violate the bound at run time, and that violation must be
+detected when the tear-off takes place, rather than letting the tear-off
+succeed and incurring a dynamic error at each invocation of the resulting
+function object.*
+
+
+## Discussion
+
+There is no support for generic function instantiation with function
+literals. That is hardly a serious omission, however, because a function
+literal is only referred from one single location (the place where it
+occurs), and hence there is never a need to use such a function both as a
+generic and as a non-generic function, so it is extremely likely to be
+simpler and more convenient to write the function literal as a non-generic
+function in the first place, if that is how it will be used.
+
+```dart
+class A<X> {
+  X x;
+
+  A(this.x);
+
+  void f(List<X> Function(X) g) => print(g(x));
+
+  void bar() {
+    // Error: Needs generic function instantiation,
+    // which would implicitly pass `<X>`.
+    f(<Y>(Y y) => [y]);
+
+    // Work-around: Just use a non-generic function---it can get
+    // the required different types for different values of `X` by
+    // using `X` directly.
+    f((X x) => [x]);
+  }
+}
+
+main() {
+  new A<int>(42).bar();
+}
+```
+
+Finally, there is no support for generic function instantiation with first
+class functions (e.g., the value of a variable or an actual argument). This
+choice was made in order to avoid the complexity and performance
+implications of having such a feature.  Note that, apart from the `==`
+property, it is always possible to write a function literal in order to
+pass actual type arguments explicitly, thus getting the same effect:
+
+```dart
+List<T> foo<T>(T t) => [t];
+
+void g(List<int> Function(int) h) => print(h(42)[0].isEven);
+
+void bar(List<T> Function<T>(T) f) {
+  g(f); // Error: Generic function instantiation not supported here.
+  // Work-around.
+  g((int i) => f(i));
+}
+
+main() {
+  bar(foo); // No generic function instantiation needed here.
+}
+```
+
+
+## Revisions
+
+- 0.3 (2018-04-05) Clarified constancy of expressions subject to generic
+  function instantiation.
+
+- 0.2 (2018-03-21) Adjusted to include support for generic function
+  instantiation also for local functions.
+
+- 0.1 (2018-03-19) Initial version.
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index d1c7d6d..3bcfb11 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -216,8 +216,10 @@
     CompoundBenchMarkResult o = other as CompoundBenchMarkResult;
 
     CompoundBenchMarkResult combined = new CompoundBenchMarkResult(name);
-    List<String> keys =
-        (new Set()..addAll(results.keys)..addAll(o.results.keys)).toList();
+    List<String> keys = (new Set<String>()
+          ..addAll(results.keys)
+          ..addAll(o.results.keys))
+        .toList();
 
     for (String key in keys) {
       combined.add(key, _combine(results[key], o.results[key]));
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 13e4b5f..65d00d4 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -987,7 +987,8 @@
   /**
    * Handle the fact that an unhandled error has occurred in the plugin.
    */
-  void handleOnError(List<String> errorPair) {
+  void handleOnError(dynamic error) {
+    List<String> errorPair = (error as List).cast<String>();
     StackTrace stackTrace = new StackTrace.fromString(errorPair[1]);
     info.exception =
         new CaughtException(new PluginException(errorPair[0]), stackTrace);
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 a2ceffb..8079bf0 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
@@ -232,9 +232,23 @@
       if (entity is ConstructorInitializer) {
         _addSuggestion(Keyword.ASSERT);
       }
-      if (node.initializers.last == entity) {
-        _addSuggestion(Keyword.SUPER);
-        _addSuggestion(Keyword.THIS);
+      var last = node.initializers.last;
+      if (last == entity) {
+        Token previous = node.findPrevious(last.beginToken);
+        if (previous != null && previous.end <= request.offset) {
+          _addSuggestion(Keyword.SUPER);
+          _addSuggestion(Keyword.THIS);
+        }
+      }
+    } else {
+      Token separator = node.separator;
+      if (separator != null) {
+        var offset = request.offset;
+        if (separator.end <= offset && offset <= separator.next.offset) {
+          _addSuggestion(Keyword.ASSERT);
+          _addSuggestion(Keyword.SUPER);
+          _addSuggestion(Keyword.THIS);
+        }
       }
     }
   }
@@ -363,9 +377,18 @@
   @override
   visitIfStatement(IfStatement node) {
     if (_isPreviousTokenSynthetic(entity, TokenType.CLOSE_PAREN)) {
+      // analyzer parser
       // Actual: if (x i^)
       // Parsed: if (x) i^
       _addSuggestion(Keyword.IS, DART_RELEVANCE_HIGH);
+    } else if (entity == node.rightParenthesis) {
+      if (node.condition.endToken.next == droppedToken) {
+        // fasta parser
+        // Actual: if (x i^)
+        // Parsed: if (x)
+        //    where "i" is in the token stream but not part of the AST
+        _addSuggestion(Keyword.IS, DART_RELEVANCE_HIGH);
+      }
     } else if (entity == node.thenStatement || entity == node.elseStatement) {
       _addStatementKeywords(node);
     } else if (entity == node.condition) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index d435a04..f7289e4 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -151,24 +151,33 @@
     if (node is ClassDeclaration) {
       Object entity = target.entity;
       if (entity is FieldDeclaration) {
-        NodeList<VariableDeclaration> variables = entity.fields.variables;
-        if (variables.length == 1) {
-          SimpleIdentifier targetId = variables[0].name;
-          if (targetId.name.isEmpty) {
-            return targetId;
-          }
-        }
+        return _getTargetIdFromVarList(entity.fields);
       }
     } else if (node is FieldDeclaration) {
       Object entity = target.entity;
       if (entity is VariableDeclarationList) {
-        NodeList<VariableDeclaration> variables = entity.variables;
-        if (variables.length == 1) {
-          SimpleIdentifier targetId = variables[0].name;
-          if (targetId.name.isEmpty) {
-            return targetId;
-          }
-        }
+        return _getTargetIdFromVarList(entity);
+      }
+    }
+    return null;
+  }
+
+  SimpleIdentifier _getTargetIdFromVarList(VariableDeclarationList fields) {
+    NodeList<VariableDeclaration> variables = fields.variables;
+    if (variables.length == 1) {
+      VariableDeclaration variable = variables[0];
+      SimpleIdentifier targetId = variable.name;
+      if (targetId.name.isEmpty) {
+        // analyzer parser
+        // Actual: class C { foo^ }
+        // Parsed: class C { foo^ _s_ }
+        //   where _s_ is a synthetic id inserted by the analyzer parser
+        return targetId;
+      } else if (fields.keyword == null &&
+          fields.type == null &&
+          variable.initializer == null) {
+        // fasta parser does not insert a synthetic identifier
+        return targetId;
       }
     }
     return null;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 7a97f72..c5c99cb 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -1206,8 +1206,8 @@
     String filePath;
     if (prefixElement == null) {
       targetUnit = unitElement;
-      CompilationUnitMember enclosingMember =
-          node.getAncestor((node) => node.parent is CompilationUnit);
+      CompilationUnitMember enclosingMember = node.getAncestor((node) =>
+          node is CompilationUnitMember && node.parent is CompilationUnit);
       if (enclosingMember == null) {
         return;
       }
@@ -1909,8 +1909,7 @@
     ClassDeclaration targetClass = node.parent as ClassDeclaration;
     ClassElement targetClassElement = targetClass.element;
     utils.targetClassElement = targetClassElement;
-    List<ExecutableElement> elements = ErrorVerifier
-        .computeMissingOverrides(
+    List<ExecutableElement> elements = ErrorVerifier.computeMissingOverrides(
             driver.analysisOptions.strongMode,
             typeProvider,
             typeSystem,
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 58adda3..7b871e0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -25,6 +26,7 @@
   final pathos.Context pathContext;
   final RefactoringWorkspace workspace;
   final Source source;
+  AnalysisDriver driver;
 
   String oldFile;
   String newFile;
@@ -42,39 +44,33 @@
   String get refactoringName => 'Move File';
 
   @override
-  Future<RefactoringStatus> checkFinalConditions() {
-    RefactoringStatus result = new RefactoringStatus();
-    return new Future.value(result);
+  Future<RefactoringStatus> checkFinalConditions() async {
+    final drivers = workspace.driversContaining(newFile);
+    if (drivers.length != 1) {
+      return new RefactoringStatus.fatal(
+          'Unable to find a single driver for $newFile.');
+    }
+    driver = drivers.first;
+    return new RefactoringStatus();
   }
 
   @override
-  Future<RefactoringStatus> checkInitialConditions() {
-    RefactoringStatus result = new RefactoringStatus();
-    return new Future.value(result);
+  Future<RefactoringStatus> checkInitialConditions() async {
+    return new RefactoringStatus();
   }
 
   @override
   Future<SourceChange> createChange() async {
-    var changeBuilder =
-        new DartChangeBuilder(workspace.drivers.first.currentSession);
-
-    final drivers =
-        workspace.drivers.where((d) => d.contextRoot.containsFile(newFile));
-    if (drivers.length != 1) {
-      // TODO(dantup): What to do in this case? Should we throw?
-      return changeBuilder.sourceChange;
-    }
-
-    final driver = drivers.first; // The above guarantees there's exactly one.
-    final result = await driver.getResult(oldFile);
-    final element = result?.unit?.element;
+    var changeBuilder = new DartChangeBuilder(driver.currentSession);
+    final result = await driver.getUnitElement(oldFile);
+    final element = result?.element;
     if (element == null) {
       return changeBuilder.sourceChange;
     }
     final library = element.library;
 
     // If this element is a library, update outgoing references inside the file.
-    if (library != null && element == library.definingCompilationUnit) {
+    if (element == library.definingCompilationUnit) {
       await changeBuilder.addFileEdit(library.source.fullName, (builder) {
         final oldDir = pathContext.dirname(oldFile);
         final newDir = pathContext.dirname(newFile);
@@ -86,7 +82,7 @@
 
     // Update incoming references to this file
     List<SearchMatch> matches =
-        await workspace.searchEngine.searchReferences(result.unit.element);
+        await workspace.searchEngine.searchReferences(element);
     List<SourceReference> references = getSourceReferences(matches);
     for (SourceReference reference in references) {
       await changeBuilder.addFileEdit(reference.file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 6b5c4904..5c14cf7 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -427,6 +427,15 @@
       return driver.contextRoot.containsFile(path);
     });
   }
+
+  /**
+   * Returns the drivers that have [path] in a context root.
+   */
+  Iterable<AnalysisDriver> driversContaining(String path) {
+    return drivers.where((driver) {
+      return driver.contextRoot.containsFile(path);
+    });
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index a21b681..d5e2bbd 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -384,6 +384,11 @@
   String describe(AnalysisOptionsImpl options) {
     StringBuffer b = new StringBuffer();
 
+    b.write(writeOption('Strong mode', options.strongMode));
+    b.write(writeOption('Implicit dynamic', options.implicitDynamic));
+    b.write(writeOption('Implicit casts', options.implicitCasts));
+    b.write(writeOption('Declaration casts', options.declarationCasts));
+
     b.write(
         writeOption('Analyze function bodies', options.analyzeFunctionBodies));
     b.write(writeOption('Enable super mixins', options.enableSuperMixins));
@@ -394,7 +399,6 @@
         writeOption('Generate errors in SDK files', options.generateSdkErrors));
     b.write(writeOption('Generate hints', options.hint));
     b.write(writeOption('Preserve comments', options.preserveComments));
-    b.write(writeOption('Strong mode', options.strongMode));
     b.write(writeOption('Strong mode hints', options.strongModeHints));
 
     return b.toString();
@@ -1312,6 +1316,8 @@
     h3('Status');
     buf.writeln(writeOption('Preview-dart-2',
         diagnosticsSite.socketServer.analysisServerOptions.previewDart2));
+    buf.writeln(writeOption('Use fasta parser',
+        diagnosticsSite.socketServer.analysisServerOptions.useFastaParser));
     buf.writeln(writeOption('Use common front end',
         diagnosticsSite.socketServer.analysisServerOptions.useCFE));
     buf.writeln(writeOption('Instrumentation enabled',
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 43c8630..5d4eae1 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -1,10 +1,6 @@
 name: analysis_server
-version: 0.1.1-dev
-author: Dart Team <misc@dartlang.org>
+publish_to: none
 description: A server that performs analysis of Dart code over character streams using JSON-RPC encoded information.
-homepage: http://www.dartlang.org
-environment:
-  sdk: '>=1.12.0 <2.0.0'
 dependencies:
   analyzer: ^0.30.0
   args: '>=0.13.0 <2.0.0'
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index f764bfc..3a84651 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -21,6 +21,7 @@
 
 @reflectiveTest
 class SetAnalysisRootsTest extends AbstractAnalysisServerIntegrationTest {
+  @TestTimeout(const Timeout.factor(2))
   test_package_root() async {
     String projPath = sourcePath('project');
     String mainPath = path.join(projPath, 'main.dart');
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index d4757ed..2448c48 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -906,7 +906,7 @@
   @override
   void listen(void onResponse(Response response),
       void onNotification(Notification notification),
-      {Function onError, void onDone()}) {
+      {void onError(dynamic error), void onDone()}) {
     fail('Unexpected invocation of listen');
   }
 
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index ac71287..56213b8 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -520,6 +520,11 @@
   E accept<E>(AstVisitor<E> visitor);
 
   /**
+   * Return the token before [target] or `null` if it cannot be found.
+   */
+  Token findPrevious(Token target);
+
+  /**
    * Return the most immediate ancestor of this node for which the [predicate]
    * returns `true`, or `null` if there is no such ancestor. Note that this node
    * will never be returned.
@@ -533,11 +538,6 @@
   E getProperty<E>(String name);
 
   /**
-   * Return the token before [target] or `null` if it cannot be found.
-   */
-  Token findPrevious(Token target);
-
-  /**
    * Set the value of the property with the given [name] to the given [value].
    * If the value is `null`, the property will effectively be removed.
    */
@@ -4469,9 +4469,9 @@
    * information, or `null` if the AST structure has not been resolved, or if
    * the invoke could not be resolved.
    *
-   * This will usually be a [FunctionType], but it can also be an
-   * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
-   * interface type that implements `Function`.
+   * This will usually be a [FunctionType], but it can also be `dynamic` or
+   * `Function`. In the case of interface types that have a `call` method, we
+   * store the type of that `call` method here as parameterized.
    */
   DartType get staticInvokeType;
 
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 68083db..c93b47de 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -82,6 +82,9 @@
   CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
+  CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR,
+  CompileTimeErrorCode.CONFLICTS_WITH_INHERITED_MEMBER,
+  CompileTimeErrorCode.CONFLICTS_WITH_MEMBER,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
@@ -108,6 +111,7 @@
   CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+  CompileTimeErrorCode.DECLARED_MEMBER_CONFLICTS_WITH_INHERITED,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
@@ -172,6 +176,7 @@
   CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
   CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
   CompileTimeErrorCode.LABEL_UNDEFINED,
+  CompileTimeErrorCode.LOAD_LIBRARY_TAKES_NO_ARGUMENTS,
   CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME,
   CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME,
   CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL,
@@ -207,7 +212,9 @@
   CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
   CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
   CompileTimeErrorCode.NON_SYNC_ABSTRACT_METHOD,
-  CompileTimeErrorCode.NON_SYNC_FACTORY_METHOD,
+  CompileTimeErrorCode.NON_SYNC_CONSTRUCTOR,
+  CompileTimeErrorCode.NON_SYNC_FACTORY,
+  CompileTimeErrorCode.NOT_CONSTANT_EXPRESSION,
   CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
   CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS,
   CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
@@ -237,8 +244,10 @@
   CompileTimeErrorCode.RETURN_IN_GENERATOR,
   CompileTimeErrorCode.SHARED_DEFERRED_PREFIX,
   CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT,
+  CompileTimeErrorCode.SUPER_AS_EXPRESSION,
   CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
   CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
+  CompileTimeErrorCode.THIS_ACCESS_FROM_INITIALIZER,
   CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
   CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
   CompileTimeErrorCode.TYPE_PARAMETER_ON_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 535e3a6..716008f 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -169,7 +169,8 @@
       negatable: true);
   parser.addFlag(declarationCastsFlag,
       negatable: true,
-      help: 'Disable declaration casts in strong mode (https://goo.gl/cTLz40).',
+      help: 'Disable declaration casts in strong mode (https://goo.gl/cTLz40)\n'
+          'This option is deprecated and will be removed in a future release.',
       hide: ddc && hide);
   parser.addFlag(implicitCastsFlag,
       negatable: true,
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index bf4d9ba..3ede35d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -83,6 +83,12 @@
         contextRoot.root.path, contextRoot.excludedPaths.toList(),
         pathContext: resourceProvider.pathContext);
     AnalysisDriver driver = builder.buildDriver(oldContextRoot);
+
+    // AnalysisDriver reports results into streams.
+    // We need to drain these streams to avoid memory leak.
+    driver.results.drain();
+    driver.exceptions.drain();
+
     DriverBasedAnalysisContext context =
         new DriverBasedAnalysisContext(resourceProvider, contextRoot, driver);
     return context;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 530e205..39ce165 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -766,15 +766,16 @@
   FileSystemStateTestView _testView;
 
   FileSystemState(
-      this._logger,
-      this._byteStore,
-      this._contentOverlay,
-      this._resourceProvider,
-      this._sourceFactory,
-      this._analysisOptions,
-      this._salt,
-      {this.externalSummaries,
-      this.parseExceptionHandler}) {
+    this._logger,
+    this._byteStore,
+    this._contentOverlay,
+    this._resourceProvider,
+    this._sourceFactory,
+    this._analysisOptions,
+    this._salt, {
+    this.externalSummaries,
+    this.parseExceptionHandler,
+  }) {
     _fileContentCache =
         _FileContentCache.getInstance(_resourceProvider, _contentOverlay);
     _testView = new FileSystemStateTestView(this);
@@ -815,9 +816,9 @@
         return file;
       }
       // Create a new file.
-      Uri fileUri = _resourceProvider.pathContext.toUri(path);
       FileSource uriSource = new FileSource(resource, uri);
-      file = new FileState._(this, path, uri, fileUri, uriSource);
+      file = new FileState._(
+          this, path, uri, _absolutePathToFileUri(path), uriSource);
       _uriToFile[uri] = file;
       _addFileWithPath(path, file);
       _pathToCanonicalFile[path] = file;
@@ -856,9 +857,9 @@
 
       String path = uriSource.fullName;
       File resource = _resourceProvider.getFile(path);
-      Uri fileUri = _resourceProvider.pathContext.toUri(path);
       FileSource source = new FileSource(resource, uri);
-      file = new FileState._(this, path, uri, fileUri, source);
+      file = new FileState._(
+          this, path, uri, _absolutePathToFileUri(path), source);
       _uriToFile[uri] = file;
       _addFileWithPath(path, file);
       file.refresh(allowCached: true);
@@ -933,6 +934,18 @@
     }
     files.add(file);
   }
+
+  /**
+   * A specialized version of package:path context.toUri(). This assumes the
+   * path is absolute as does a performant conversion to a file: uri.
+   */
+  Uri _absolutePathToFileUri(String path) {
+    if (path.contains(r'\')) {
+      return new Uri(scheme: 'file', path: path.replaceAll(r'\', '/'));
+    } else {
+      return new Uri(scheme: 'file', path: path);
+    }
+  }
 }
 
 @visibleForTesting
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index cdf82ad..179242f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -42,6 +42,9 @@
 /// Resolution information in a single function body.
 class CollectedResolution {
   final Map<int, ResolutionData<DartType, int, Node, int>> kernelData = {};
+
+  final Map<TypeParameter, int> typeVariableDeclarations =
+      new Map<TypeParameter, int>.identity();
 }
 
 /// The compilation result for a single file.
@@ -74,7 +77,7 @@
       'A compile() invocation is still executing.';
 
   /// Options used by the kernel compiler.
-  final ProcessedOptions _options;
+  final CompilerOptions _compilerOptions;
 
   /// The logger to report compilation progress.
   final PerformanceLog _logger;
@@ -92,10 +95,17 @@
   /// Each value is the compilation result of the key library.
   final Map<Uri, LibraryCompilationResult> _results = {};
 
+  /// Index of metadata in [_component].
+  final AnalyzerMetadataIndex _metadataIndex = new AnalyzerMetadataIndex();
+
   /// The [Component] with currently valid libraries. When a file is invalidated,
   /// we remove the file, its library, and everything affected from [_component].
   Component _component = new Component();
 
+  /// The [DillTarget] that is filled with [_component] libraries before
+  /// compilation of a new library.
+  DillTarget _dillTarget;
+
   /// Each key is the file system URI of a library.
   /// Each value is the libraries that directly depend on the key library.
   final Map<Uri, Set<Uri>> _directLibraryDependencies = {};
@@ -161,7 +171,7 @@
     var uriTranslator = new UriTranslatorImpl(
         new TargetLibrariesSpecification('none', dartLibraries), packages);
     var errorListener = new _ErrorListener();
-    var options = new CompilerOptions()
+    var compilerOptions = new CompilerOptions()
       ..target = new _AnalyzerTarget(
           new TargetFlags(strongMode: analysisOptions.strongMode))
       ..reportMessages = false
@@ -169,15 +179,15 @@
       ..fileSystem = new _FileSystemAdaptor(fsState, pathContext)
       ..byteStore = byteStore
       ..onError = errorListener.onError;
-    var processedOptions = new ProcessedOptions(options);
 
     return new FrontEndCompiler._(
-        processedOptions, uriTranslator, errorListener);
+        compilerOptions, uriTranslator, errorListener);
   }
 
-  FrontEndCompiler._(this._options, this.uriTranslator, this._errorListener)
-      : _logger = _options.logger,
-        _fileSystem = _options.fileSystem;
+  FrontEndCompiler._(
+      this._compilerOptions, this.uriTranslator, this._errorListener)
+      : _logger = _compilerOptions.logger,
+        _fileSystem = _compilerOptions.fileSystem;
 
   /// Compile the library with the given absolute [uri], and everything it
   /// depends on. Return the result of the requested library compilation.
@@ -200,23 +210,26 @@
       }
     }
 
-    return _runWithFrontEndContext('Compile', () async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
+    return _runWithFrontEndContext('Compile', uri, (processedOptions) async {
       try {
-        var dillTarget =
-            new DillTarget(_options.ticker, uriTranslator, _options.target);
+        // Initialize the dill target once.
+        if (_dillTarget == null) {
+          _dillTarget = new DillTarget(
+            processedOptions.ticker,
+            uriTranslator,
+            processedOptions.target,
+          );
+        }
 
-        // Append all libraries what we still have in the current component.
+        // Append new libraries from the current component.
         await _logger.runAsync('Load dill libraries', () async {
-          // TODO(brianwilkerson) Determine whether this await is necessary.
-          await null;
-          dillTarget.loader.appendLibraries(_component);
-          await dillTarget.buildOutlines();
+          _dillTarget.loader.appendLibraries(_component,
+              filter: (uri) => !_dillTarget.loader.builders.containsKey(uri));
+          await _dillTarget.buildOutlines();
         });
 
         // Create the target to compile the library.
-        var kernelTarget = new _AnalyzerKernelTarget(_fileSystem, dillTarget,
+        var kernelTarget = new _AnalyzerKernelTarget(_fileSystem, _dillTarget,
             uriTranslator, new AnalyzerMetadataCollector());
         kernelTarget.read(uri);
 
@@ -225,7 +238,7 @@
           await kernelTarget.buildOutlines(nameRoot: _component.root);
           Component newComponent = await kernelTarget.buildComponent();
           if (newComponent != null) {
-            AnalyzerMetadataRepository.merge(newComponent, _component);
+            _metadataIndex.replaceComponent(newComponent);
             return newComponent;
           } else {
             return _component;
@@ -237,9 +250,9 @@
 
         _logger.run('Compute dependencies', _computeDependencies);
 
-        // TODO(scheglov) Can we keep the same instance?
+        // Reuse CoreTypes and ClassHierarchy.
         var types = new TypeEnvironment(
-            new CoreTypes(_component), new ClassHierarchy(_component));
+            kernelTarget.loader.coreTypes, kernelTarget.loader.hierarchy);
 
         // Add results for new libraries.
         for (var library in _component.libraries) {
@@ -287,9 +300,13 @@
       if (library == null) return;
 
       // Invalidate the library.
+      _metadataIndex.invalidate(library);
       _component.libraries.remove(library);
       _component.root.removeChild('${library.importUri}');
       _component.uriToSource.remove(libraryUri);
+      _dillTarget.loader.builders.remove(library.importUri);
+      _dillTarget.loader.libraries.remove(library);
+      _dillTarget.loader.uriToSource.remove(libraryUri);
       _results.remove(library.importUri);
 
       // Recursively invalidate dependencies.
@@ -333,12 +350,12 @@
     _component.libraries.forEach(processLibrary);
   }
 
-  Future<T> _runWithFrontEndContext<T>(String msg, Future<T> f()) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    return await CompilerContext.runWithOptions(_options, (context) {
+  Future<T> _runWithFrontEndContext<T>(
+      String msg, Uri input, Future<T> Function(ProcessedOptions) f) async {
+    var processedOptions = new ProcessedOptions(_compilerOptions, [input]);
+    return await CompilerContext.runWithOptions(processedOptions, (context) {
       context.disableColors();
-      return _logger.runAsync(msg, f);
+      return _logger.runAsync(msg, () => f(processedOptions));
     });
   }
 }
@@ -391,7 +408,8 @@
     }
     var resolution = new CollectedResolution();
     fileResolutions.add(resolution);
-    storer = new ResolutionStorer(resolution.kernelData);
+    storer = new ResolutionStorer(
+        resolution.kernelData, resolution.typeVariableDeclarations);
     return super.createListener(
         builder, memberScope, isInstanceMember, formalParameterScope, storer);
   }
@@ -410,6 +428,11 @@
   _AnalyzerSourceLoader<Library> createLoader() {
     return new _AnalyzerSourceLoader<Library>(fileSystem, this, resolutions);
   }
+
+  @override
+  Declaration getDuplicatedFieldInitializerError(loader) {
+    return loader.coreLibrary.getConstructor('Exception');
+  }
 }
 
 /// The [SourceLoader] that record resolution information.
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
index 7312359..a5bc6ef 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
@@ -66,6 +66,58 @@
   }
 }
 
+/// Index of metadata.
+class AnalyzerMetadataIndex {
+  final Map<kernel.Library, List<kernel.TreeNode>> libraryNodes = {};
+  AnalyzerMetadataRepository repository;
+
+  /// The [library] was invalidated, flush its metadata.
+  void invalidate(kernel.Library library) {
+    var nodes = libraryNodes.remove(library);
+    nodes?.forEach(repository.mapping.remove);
+  }
+
+  /// A [newComponent] has been compiled, with new, and only new, metadata.
+  /// Merge the existing [repository] into the new one, and replace it.
+  void replaceComponent(kernel.Component newComponent) {
+    AnalyzerMetadataRepository newRepository =
+        newComponent.metadata[AnalyzerMetadataRepository.TAG];
+    if (newRepository != null) {
+      _indexNewMetadata(newRepository);
+      if (repository != null) {
+        newRepository.mapping.addAll(repository.mapping);
+      }
+      repository = newRepository;
+    } else {
+      newComponent.metadata[AnalyzerMetadataRepository.TAG] = repository;
+    }
+  }
+
+  void _indexNewMetadata(AnalyzerMetadataRepository newRepository) {
+    for (var node in newRepository.mapping.keys) {
+      var library = _enclosingLibrary(node);
+      assert(library != null);
+
+      var nodes = libraryNodes[library];
+      if (nodes == null) {
+        nodes = <kernel.TreeNode>[];
+        libraryNodes[library] = nodes;
+      }
+
+      nodes.add(node);
+    }
+  }
+
+  static kernel.Library _enclosingLibrary(kernel.TreeNode node) {
+    for (; node != null; node = node.parent) {
+      if (node is kernel.Library) {
+        return node;
+      }
+    }
+    return null;
+  }
+}
+
 /// Analyzer specific implementation of [kernel.MetadataRepository].
 class AnalyzerMetadataRepository
     implements kernel.MetadataRepository<AnalyzerMetadata> {
@@ -127,17 +179,4 @@
       sink.writeByte(0);
     }
   }
-
-  /// Merge metadata from the [source] into the [destination].
-  static void merge(kernel.Component destination, kernel.Component source) {
-    kernel.MetadataRepository destinationRepo = destination.metadata[TAG];
-    kernel.MetadataRepository sourceRepo = source.metadata[TAG];
-    if (sourceRepo != null) {
-      if (destinationRepo != null) {
-        destinationRepo.mapping.addAll(sourceRepo.mapping);
-      } else {
-        destination.metadata[TAG] = sourceRepo;
-      }
-    }
-  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index d463793..5f21305c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -774,7 +774,7 @@
               var redirectedConstructor = context.redirectedConstructor;
               redirectName.staticElement = redirectedConstructor;
               // TODO(scheglov) Support for import prefix?
-              ResolutionApplier.applyConstructorElement(
+              DeclarationResolver.applyConstructorElement(
                   _libraryElement,
                   null,
                   redirectedConstructor,
@@ -1089,11 +1089,16 @@
           invokeType: translateType(data.invokeType),
           isExplicitCall: data.isExplicitCall,
           isImplicitCall: data.isImplicitCall,
+          isPrefixReference: data.isPrefixReference,
+          isTypeReference: data.isTypeReference,
           isWriteReference: data.isWriteReference,
           literalType: translateType(data.literalType),
+          loadLibrary: _translateReference(data.loadLibrary),
           prefixInfo: _translatePrefixInfo(data.prefixInfo),
           reference: _translateReference(data.reference,
-              isWriteReference: data.isWriteReference),
+              isWriteReference: data.isWriteReference,
+              isTypeReference: data.isTypeReference,
+              inferredType: data.inferredType),
           writeContext: translateType(data.writeContext));
     }
 
@@ -1139,7 +1144,19 @@
       }
       return new TypeArgumentsDartType(types);
     } else {
-      return resynthesizer.getType(context, kernelType);
+      return resynthesizer.getType(context, kernelType,
+          getLocalTypeParameter: _getLocalTypeParameter);
+    }
+  }
+
+  TypeParameterElement _getLocalTypeParameter(
+      kernel.TypeParameter typeParameter) {
+    var declarationOffset = resolution.typeVariableDeclarations[typeParameter];
+    if (declarationOffset != null) {
+      TypeParameter typeParameter = localDeclarations[declarationOffset];
+      return typeParameter.element;
+    } else {
+      return null;
     }
   }
 
@@ -1155,6 +1172,8 @@
       element = declaration.staticElement;
     } else if (declaration is FunctionDeclaration) {
       element = declaration.element;
+    } else if (declaration is TypeParameter) {
+      element = declaration.element;
     } else {
       throw new UnimplementedError('${declaration.runtimeType}');
     }
@@ -1168,8 +1187,15 @@
   }
 
   Element _translateReference(kernel.Node referencedNode,
-      {bool isWriteReference = false}) {
-    if (referencedNode == null) return null;
+      {bool isWriteReference = false,
+      bool isTypeReference = false,
+      kernel.DartType inferredType}) {
+    if (referencedNode == null) {
+      if (isTypeReference && inferredType is kernel.DynamicType) {
+        return typeProvider.dynamicType.element;
+      }
+      return null;
+    }
     Element element;
     if (referencedNode is kernel.NamedNode) {
       element = resynthesizer
@@ -1183,11 +1209,15 @@
           .getElementFromCanonicalName(referencedNode.classNode.canonicalName);
       assert(element != null);
     } else if (referencedNode is kernel.TypeParameterType) {
-      element =
-          resynthesizer.getTypeParameter(context, referencedNode.parameter);
+      element = resynthesizer.getTypeParameter(
+          context, referencedNode.parameter,
+          getLocalTypeParameter: _getLocalTypeParameter);
       assert(element != null);
     } else if (referencedNode is kernel.DynamicType) {
       element = DynamicElementImpl.instance;
+    } else if (referencedNode is kernel.TypeParameter) {
+      element = resynthesizer.getTypeParameter(context, referencedNode,
+          getLocalTypeParameter: _getLocalTypeParameter);
     } else if (referencedNode is kernel.InvalidType) {
       element = DynamicElementImpl.instance;
     } else {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index f643697..ae52a0e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6721,60 +6721,15 @@
    * by a unary negation operator.
    */
   static bool isValidLiteral(String lexeme, bool isNegative) {
-    if (lexeme.startsWith('0x') || lexeme.startsWith('0X')) {
-      return _isValidHexadecimalLiteral(lexeme, isNegative);
-    }
-    return _isValidDecimalLiteral(lexeme, isNegative);
-  }
-
-  /**
-   * Return `true` if the given [lexeme] is a valid lexeme for a decimal integer
-   * literal. The flag [isNegative] should be `true` if the lexeme is preceded
-   * by a minus operator.
-   */
-  static bool _isValidDecimalLiteral(String lexeme, bool isNegative) {
-    int length = lexeme.length;
-    int index = 0;
-    while (length > 0 && lexeme.substring(index, index + 1) == '0') {
-      length--;
-      index++;
-    }
-    if (length < 19) {
-      return true;
-    } else if (length > 19) {
-      return false;
-    }
-    if (int.parse(lexeme.substring(index, index + 1)) < 9) {
-      return true;
-    }
-    int bound = 223372036854775808;
-    if (isNegative) {
-      return int.parse(lexeme.substring(index + 1)) <= bound;
-    } else {
-      return int.parse(lexeme.substring(index + 1)) < bound;
-    }
-  }
-
-  /**
-   * Return `true` if the given [lexeme] is a valid lexeme for a hexadecimal
-   * integer literal. The lexeme is expected to start with either `0x` or `0X`.
-   */
-  static bool _isValidHexadecimalLiteral(String lexeme, bool isNegative) {
-    int length = lexeme.length - 2;
-    int index = 2;
-    while (length > 0 && lexeme.substring(index, index + 1) == '0') {
-      length--;
-      index++;
-    }
-    if (length < 16) {
-      return true;
-    } else if (length > 16) {
-      return false;
-    }
-    if (!isNegative) {
-      return true;
-    }
-    return int.parse(lexeme.substring(index, index + 1), radix: 16) <= 7;
+    // TODO(jmesserly): this depends on the platform int implementation, and
+    // may not be accurate if run on dart4web.
+    //
+    // (Prior to https://dart-review.googlesource.com/c/sdk/+/63023 there was
+    // a partial implementation here which may be a good starting point.
+    // _isValidDecimalLiteral relied on int.parse so that would need some fixes.
+    // _isValidHexadecimalLiteral worked except for negative int64 max.)
+    if (isNegative) lexeme = '-$lexeme';
+    return int.tryParse(lexeme) != null;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index e4a1f8f..767e12d 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -900,7 +900,7 @@
     if (_kernel != null) {
       _methods ??= _kernel.procedures
           .where((k) =>
-              !k.isForwardingStub &&
+              !k.isSyntheticForwarder &&
               (k.kind == kernel.ProcedureKind.Method ||
                   k.kind == kernel.ProcedureKind.Operator))
           .map((k) => new MethodElementImpl.forKernel(this, k))
@@ -1716,6 +1716,7 @@
     if (_kernelContext != null) {
       _functions ??= _kernelContext.kernelUnit.procedures
           .where((k) => k.kind == kernel.ProcedureKind.Method)
+          .where((k) => !k.name.name.startsWith('__loadLibrary_'))
           .map((k) => new FunctionElementImpl.forKernel(this, k))
           .toList(growable: false);
     }
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 8514e4f..bc6ebcc 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1274,7 +1274,7 @@
   }
 
   @override
-  ClassElement get element => super.element as ClassElement;
+  ClassElement get element => super.element;
 
   @override
   int get hashCode {
diff --git a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index cb19d0f..024ff7b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
@@ -240,8 +240,7 @@
       InterfaceType definingType) {
     // if the baseFunctionType is null, or does not have any parameters,
     // return it.
-    if (baseFunctionType == null ||
-        baseFunctionType.typeArguments.length == 0) {
+    if (baseFunctionType == null || baseFunctionType.typeArguments.isEmpty) {
       return baseFunctionType;
     }
     // First, generate the path from the defining type to the overridden member
@@ -691,7 +690,7 @@
         }
       }
     }
-    if (lookupMaps.length == 0) {
+    if (lookupMaps.isEmpty) {
       return null;
     }
     return lookupMaps;
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index fcd9346..1dc4e0a 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -47,10 +47,8 @@
    */
   factory Scanner(Source source, CharacterReader reader,
           AnalysisErrorListener errorListener) =>
-      fe.Scanner.useFasta
-          ? new Scanner.fasta(source, errorListener,
-              contents: reader.getContents(), offset: reader.offset)
-          : new Scanner._(source, reader, errorListener);
+      new Scanner.fasta(source, errorListener,
+          contents: reader.getContents(), offset: reader.offset);
 
   factory Scanner.fasta(Source source, AnalysisErrorListener errorListener,
       {String contents, int offset: -1}) {
@@ -58,7 +56,8 @@
         source, contents ?? source.contents.data, offset, errorListener);
   }
 
-  Scanner._(this.source, CharacterReader reader, this._errorListener)
+  // Deprecated
+  Scanner.old(this.source, CharacterReader reader, this._errorListener)
       : super.create(reader);
 
   @override
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 49a4b15..8f9692a 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -449,6 +449,15 @@
           "this class.",
           correction: "Try renaming either the type variable or the member.");
 
+  static const CompileTimeErrorCode CONFLICTS_WITH_CONSTRUCTOR =
+      const CompileTimeErrorCode.fromFasta('CONFLICTS_WITH_CONSTRUCTOR');
+
+  static const CompileTimeErrorCode CONFLICTS_WITH_INHERITED_MEMBER =
+      const CompileTimeErrorCode.fromFasta('CONFLICTS_WITH_INHERITED_MEMBER');
+
+  static const CompileTimeErrorCode CONFLICTS_WITH_MEMBER =
+      const CompileTimeErrorCode.fromFasta('CONFLICTS_WITH_MEMBER');
+
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
    * object results in an uncaught exception being thrown.
@@ -771,6 +780,10 @@
           "The class '{0}' doesn't have a default constant constructor.",
           correction: "Try calling a different contructor.");
 
+  static const CompileTimeErrorCode DECLARED_MEMBER_CONFLICTS_WITH_INHERITED =
+      const CompileTimeErrorCode.fromFasta(
+          'DECLARED_MEMBER_CONFLICTS_WITH_INHERITED');
+
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are
    * specified in the signature of a function type alias.
@@ -1588,6 +1601,9 @@
           correction: "Try defining the label, or "
               "correcting the name to match an existing label.");
 
+  static const CompileTimeErrorCode LOAD_LIBRARY_TAKES_NO_ARGUMENTS =
+      const CompileTimeErrorCode.fromFasta('LOAD_LIBRARY_TAKES_NO_ARGUMENTS');
+
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member
    * with the same name as <i>C</i>.
@@ -2038,8 +2054,11 @@
   static const CompileTimeErrorCode NON_SYNC_ABSTRACT_METHOD =
       const CompileTimeErrorCode.fromFasta('NON_SYNC_ABSTRACT_METHOD');
 
-  static const CompileTimeErrorCode NON_SYNC_FACTORY_METHOD =
-      const CompileTimeErrorCode.fromFasta('NON_SYNC_FACTORY_METHOD');
+  static const CompileTimeErrorCode NON_SYNC_CONSTRUCTOR =
+      const CompileTimeErrorCode.fromFasta('NON_SYNC_CONSTRUCTOR');
+
+  static const CompileTimeErrorCode NON_SYNC_FACTORY =
+      const CompileTimeErrorCode.fromFasta('NON_SYNC_FACTORY');
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i>
@@ -2071,6 +2090,9 @@
               "Try calling a different constructor in the superclass, or "
               "making the called constructor not be a factory constructor.");
 
+  static const CompileTimeErrorCode NOT_CONSTANT_EXPRESSION =
+      const CompileTimeErrorCode.fromFasta('NOT_CONSTANT_EXPRESSION');
+
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause
    * for class Object.
@@ -2360,6 +2382,9 @@
           "directives.",
           correction: "Try renaming one of the prefixes.");
 
+  static const CompileTimeErrorCode SUPER_AS_EXPRESSION =
+      const CompileTimeErrorCode.fromFasta('SUPER_AS_EXPRESSION');
+
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
    * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
@@ -2436,6 +2461,9 @@
           correction: "Try removing the type parameters '<{0}>', or using"
               " 'dynamic' as the type argument here instead of a function.");
 
+  static const CompileTimeErrorCode THIS_ACCESS_FROM_INITIALIZER =
+      const CompileTimeErrorCode.fromFasta('THIS_ACCESS_FROM_INITIALIZER');
+
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via
    * another typedef, is a compile time error.
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 6545302..d326fcd 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1220,7 +1220,7 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter() {
+  void endFunctionTypedFormalParameter(Token nameToken) {
     debugEvent("FunctionTypedFormalParameter");
 
     FormalParameterList formalParameters = pop();
@@ -2172,7 +2172,9 @@
     List<Annotation> metadata = pop();
 
     Comment comment = _findComment(metadata, name.beginToken);
-    push(ast.typeParameter(comment, metadata, name, null, null));
+    var typeParameter = ast.typeParameter(comment, metadata, name, null, null);
+    localDeclarations[name.offset] = typeParameter;
+    push(typeParameter);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 6bd72ac..a3903958 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/fasta/resolution_storer.dart';
-import 'package:analyzer/src/generated/declaration_resolver.dart';
 import 'package:front_end/src/base/syntactic_entity.dart';
 import 'package:front_end/src/scanner/token.dart';
 import 'package:kernel/kernel.dart' as kernel;
@@ -105,9 +104,8 @@
   @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
+    node.type.accept(this);
     var data = _get(node.asOperator);
-    applyToTypeAnnotation(
-        _enclosingLibraryElement, data.literalType, node.type);
     node.staticType = data.inferredType;
   }
 
@@ -164,12 +162,7 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    DartType guardType = _get(node.onKeyword ?? node.catchKeyword).literalType;
-    if (node.exceptionType != null) {
-      applyToTypeAnnotation(
-          _enclosingLibraryElement, guardType, node.exceptionType);
-    }
-
+    node.exceptionType?.accept(this);
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
       LocalVariableElementImpl element = exception.staticElement;
@@ -229,16 +222,12 @@
   void visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable != null) {
+      loopVariable.type?.accept(this);
       SimpleIdentifier identifier = loopVariable.identifier;
 
       DartType type = _get(identifier).inferredType;
       identifier.staticType = type;
 
-      if (loopVariable.type != null) {
-        applyToTypeAnnotation(
-            _enclosingLibraryElement, type, loopVariable.type);
-      }
-
       VariableElementImpl element = identifier.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
@@ -256,14 +245,39 @@
   void visitFormalParameterList(FormalParameterList parameterList) {
     for (var parameter in parameterList.parameters) {
       parameter.metadata?.accept(this);
+      NormalFormalParameter normalParameter;
       if (parameter is DefaultFormalParameter) {
         parameter.defaultValue?.accept(this);
+        normalParameter = parameter.parameter;
+      } else if (parameter is NormalFormalParameter) {
+        normalParameter = parameter;
+      } else {
+        // All parameters should either be DefaultFormalParameter or
+        // NormalFormalParameter.
+        throw new UnimplementedError('${parameter.runtimeType}');
+      }
+      if (normalParameter is SimpleFormalParameter) {
+        normalParameter.type?.accept(this);
+      } else if (normalParameter is FieldFormalParameter) {
+        normalParameter.type?.accept(this);
+      } else if (normalParameter is FunctionTypedFormalParameter) {
+        normalParameter.returnType?.accept(this);
+        normalParameter.typeParameters?.accept(this);
+        normalParameter.parameters?.accept(this);
+        var data = _get(normalParameter.identifier);
+        normalParameter.identifier.staticType = data.inferredType;
+      } else {
+        // Now that DefaultFormalParameter has been handled, all parameters
+        // should be SimpleFormalParameter, FieldFormalParameter, or
+        // FunctionTypedFormalParameter.
+        throw new UnimplementedError('${normalParameter.runtimeType}');
       }
     }
   }
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
+    node.returnType?.accept(this);
     FunctionExpression functionExpression = node.functionExpression;
     FormalParameterList parameterList = functionExpression.parameters;
 
@@ -292,11 +306,6 @@
           typeParameter.name.staticType = _typeContext.typeType;
         }
       }
-
-      applyToTypeAnnotation(
-          _enclosingLibraryElement, element.returnType, node.returnType);
-      applyParameters(
-          _enclosingLibraryElement, element.parameters, parameterList);
     }
 
     _typeContext.exitLocalFunction(element);
@@ -319,8 +328,6 @@
     if (element != null) {
       node.element = element;
       node.staticType = element.type;
-      applyParameters(
-          _enclosingLibraryElement, element.parameters, parameterList);
     }
 
     _typeContext.exitLocalFunction(element);
@@ -329,19 +336,12 @@
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function.accept(this);
+    node.typeArguments?.accept(this);
 
     var data = _get(node.argumentList);
     DartType invokeType = data.invokeType;
     node.staticInvokeType = invokeType;
 
-    List<DartType> typeArguments = data.argumentTypes;
-    if (node.typeArguments != null && typeArguments != null) {
-      _applyTypeArgumentsToList(
-          _enclosingLibraryElement,
-          new TypeArgumentsDartType(typeArguments),
-          node.typeArguments.arguments);
-    }
-
     DartType resultType = data.inferredType;
     node.staticType = resultType;
 
@@ -349,6 +349,13 @@
   }
 
   @override
+  void visitGenericFunctionType(GenericFunctionType node) {
+    super.visitGenericFunctionType(node);
+    var data = _get(node.functionKeyword);
+    (node as GenericFunctionTypeImpl).type = data.inferredType;
+  }
+
+  @override
   void visitIndexExpression(IndexExpression node) {
     node.target?.accept(this);
 
@@ -374,13 +381,14 @@
     SimpleIdentifier classIdentifier;
     SimpleIdentifier constructorIdentifier;
 
+    constructorName.type.typeArguments?.accept(this);
     var data = _get(typeIdentifier);
     TypeName newTypeName;
     if (typeIdentifier is SimpleIdentifier) {
       classIdentifier = typeIdentifier;
       constructorIdentifier = constructorName.name;
     } else if (typeIdentifier is PrefixedIdentifier) {
-      if (data.prefixInfo != null) {
+      if (data.isPrefixReference) {
         typeIdentifier.prefix.staticElement = data.prefixInfo;
 
         classIdentifier = typeIdentifier.identifier;
@@ -405,12 +413,6 @@
     ConstructorElement constructor = data.reference;
     DartType type = data.inferredType;
 
-    TypeArgumentList typeArguments = constructorName.type.typeArguments;
-    if (typeArguments != null) {
-      _applyTypeArgumentsToList(
-          _enclosingLibraryElement, type, typeArguments.arguments);
-    }
-
     node.staticElement = constructor;
     node.staticType = type;
 
@@ -429,9 +431,8 @@
   @override
   void visitIsExpression(IsExpression node) {
     node.expression.accept(this);
+    node.type.accept(this);
     var data = _get(node.isOperator);
-    applyToTypeAnnotation(
-        _enclosingLibraryElement, data.literalType, node.type);
     node.staticType = data.inferredType;
   }
 
@@ -446,35 +447,33 @@
 
   @override
   void visitListLiteral(ListLiteral node) {
+    node.typeArguments?.accept(this);
     node.elements.accept(this);
     DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
-    if (node.typeArguments != null) {
-      _applyTypeArgumentsToList(
-          _enclosingLibraryElement, type, node.typeArguments.arguments);
-    }
   }
 
   @override
   void visitMapLiteral(MapLiteral node) {
+    node.typeArguments?.accept(this);
     node.entries.accept(this);
     DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
-    if (node.typeArguments != null) {
-      _applyTypeArgumentsToList(
-          _enclosingLibraryElement, type, node.typeArguments.arguments);
-    }
   }
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
     node.target?.accept(this);
+    node.typeArguments?.accept(this);
 
     ArgumentList argumentList = node.argumentList;
 
     var data = _get(argumentList);
     Element invokeElement;
-    if (data.isImplicitCall) {
+    if (data.loadLibrary != null) {
+      LibraryElement libraryElement = data.loadLibrary;
+      invokeElement = libraryElement.loadLibraryFunction;
+    } else if (data.isImplicitCall) {
       if (node.methodName != null) {
         node.methodName.accept(this);
         invokeElement = node.methodName.staticElement;
@@ -483,7 +482,6 @@
       invokeElement = data.reference;
     }
     DartType invokeType = data.invokeType;
-    List<DartType> typeArguments = data.argumentTypes;
     DartType resultType = data.inferredType;
 
     if (invokeElement is PropertyInducingElement) {
@@ -503,13 +501,6 @@
       node.methodName.staticType = invokeType;
     }
 
-    if (node.typeArguments != null && typeArguments != null) {
-      _applyTypeArgumentsToList(
-          _enclosingLibraryElement,
-          new TypeArgumentsDartType(typeArguments),
-          node.typeArguments.arguments);
-    }
-
     _applyResolutionToArguments(argumentList);
 
     {
@@ -604,6 +595,9 @@
       node.staticElement = data.prefixInfo;
     } else if (data.declaration != null) {
       node.staticElement = data.declaration;
+    } else if (data.loadLibrary != null) {
+      LibraryElement library = data.loadLibrary;
+      node.staticElement = library.loadLibraryFunction;
     } else if (data.reference != null) {
       node.staticElement = data.reference;
     } else {
@@ -653,6 +647,12 @@
   }
 
   @override
+  void visitTypeName(TypeName node) {
+    super.visitTypeName(node);
+    node.type = node.name.staticType;
+  }
+
+  @override
   void visitVariableDeclaration(VariableDeclaration node) {
     AstNode parent = node.parent;
     if (parent is VariableDeclarationList &&
@@ -678,15 +678,9 @@
     if (node.parent is TopLevelVariableDeclaration) {
       node.variables.accept(this);
     } else {
+      node.type?.accept(this);
       node.metadata.accept(this);
       node.variables.accept(this);
-      if (node.type != null) {
-        DartType type = node.variables[0].name.staticType;
-        // TODO(brianwilkerson) Understand why the type is sometimes `null`.
-        if (type != null) {
-          applyToTypeAnnotation(_enclosingLibraryElement, type, node.type);
-        }
-      }
     }
   }
 
@@ -695,6 +689,7 @@
     for (var argument in argumentList.arguments) {
       if (argument is NamedExpression) {
         argument.expression.accept(this);
+        argument.staticType = argument.expression.staticType;
       } else {
         argument.accept(this);
       }
@@ -784,192 +779,6 @@
       }
     }
   }
-
-  /// Apply the [type] that is created by the [constructorName] and the
-  /// [constructorElement] it references.
-  static void applyConstructorElement(
-      LibraryElement enclosingLibraryElement,
-      PrefixElement prefixElement,
-      ConstructorElement constructorElement,
-      DartType type,
-      ConstructorName constructorName) {
-    constructorName.staticElement = constructorElement;
-
-    ClassElement classElement = constructorElement?.enclosingElement;
-
-    Identifier typeIdentifier = constructorName.type.name;
-    if (prefixElement != null) {
-      PrefixedIdentifier prefixedTypeIdentifier = typeIdentifier;
-      prefixedTypeIdentifier.staticType = type;
-
-      prefixedTypeIdentifier.prefix.staticElement = prefixElement;
-
-      SimpleIdentifier classNode = prefixedTypeIdentifier.identifier;
-      classNode.staticElement = classElement;
-      classNode.staticType = type;
-    } else {
-      if (typeIdentifier is SimpleIdentifier) {
-        typeIdentifier.staticElement = classElement;
-        typeIdentifier.staticType = type;
-      } else if (typeIdentifier is PrefixedIdentifier) {
-        constructorName.type = astFactory.typeName(typeIdentifier.prefix, null);
-        constructorName.period = typeIdentifier.period;
-        constructorName.name = typeIdentifier.identifier;
-      }
-    }
-
-    constructorName.name?.staticElement = constructorElement;
-
-    applyToTypeAnnotation(enclosingLibraryElement, type, constructorName.type);
-  }
-
-  /// Apply the types of the [parameterElements] to the [parameterList] that
-  /// have an explicit type annotation.
-  static void applyParameters(
-      LibraryElement enclosingLibraryElement,
-      List<ParameterElement> parameterElements,
-      FormalParameterList parameterList) {
-    List<FormalParameter> parameters = parameterList.parameters;
-
-    int length = parameterElements.length;
-    if (parameters.length != length) {
-      throw new StateError('Parameter counts do not match');
-    }
-    for (int i = 0; i < length; i++) {
-      ParameterElementImpl element = parameterElements[i];
-      FormalParameter parameter = parameters[i];
-
-      DeclarationResolver.resolveMetadata(
-          parameter, parameter.metadata, element);
-
-      NormalFormalParameter normalParameter;
-      if (parameter is NormalFormalParameter) {
-        normalParameter = parameter;
-      } else if (parameter is DefaultFormalParameter) {
-        normalParameter = parameter.parameter;
-      }
-      assert(normalParameter != null);
-
-      if (normalParameter is SimpleFormalParameterImpl) {
-        normalParameter.element = element;
-      }
-
-      if (normalParameter.identifier != null) {
-        element.nameOffset = normalParameter.identifier.offset;
-        normalParameter.identifier.staticElement = element;
-        normalParameter.identifier.staticType = element.type;
-      }
-
-      // Apply the type or the return type, if a function typed parameter.
-      TypeAnnotation functionReturnType;
-      FormalParameterList functionParameterList;
-      if (normalParameter is SimpleFormalParameter) {
-        applyToTypeAnnotation(
-            enclosingLibraryElement, element.type, normalParameter.type);
-      } else if (normalParameter is FunctionTypedFormalParameter) {
-        functionReturnType = normalParameter.returnType;
-        functionParameterList = normalParameter.parameters;
-      } else if (normalParameter is FieldFormalParameter) {
-        if (normalParameter.parameters == null) {
-          applyToTypeAnnotation(
-              enclosingLibraryElement, element.type, normalParameter.type);
-        } else {
-          functionReturnType = normalParameter.type;
-          functionParameterList = normalParameter.parameters;
-        }
-      }
-
-      if (functionParameterList != null) {
-        FunctionType elementType = element.type;
-        if (functionReturnType != null) {
-          applyToTypeAnnotation(enclosingLibraryElement, elementType.returnType,
-              functionReturnType);
-        }
-        applyParameters(enclosingLibraryElement, elementType.parameters,
-            functionParameterList);
-      }
-    }
-  }
-
-  /// Apply the [type] to the [typeAnnotation] by setting the type of the
-  /// [typeAnnotation] to the [type] and recursively applying each of the type
-  /// arguments of the [type] to the corresponding type arguments of the
-  /// [typeAnnotation].
-  static void applyToTypeAnnotation(LibraryElement enclosingLibraryElement,
-      DartType type, TypeAnnotation typeAnnotation) {
-    if (typeAnnotation is GenericFunctionTypeImpl) {
-      if (type is! FunctionType) {
-        throw new StateError('Non-function type ($type) '
-            'for generic function annotation ($typeAnnotation)');
-      }
-      FunctionType functionType = type;
-      typeAnnotation.type = type;
-      applyToTypeAnnotation(enclosingLibraryElement, functionType.returnType,
-          typeAnnotation.returnType);
-      applyParameters(enclosingLibraryElement, functionType.parameters,
-          typeAnnotation.parameters);
-    } else if (typeAnnotation is TypeNameImpl) {
-      typeAnnotation.type = type;
-
-      Identifier typeIdentifier = typeAnnotation.name;
-      SimpleIdentifier typeName;
-      if (typeIdentifier is PrefixedIdentifier) {
-        if (enclosingLibraryElement != null) {
-          String prefixName = typeIdentifier.prefix.name;
-          for (var import in enclosingLibraryElement.imports) {
-            if (import.prefix?.name == prefixName) {
-              typeIdentifier.prefix.staticElement = import.prefix;
-              break;
-            }
-          }
-        }
-        typeName = typeIdentifier.identifier;
-      } else {
-        typeName = typeIdentifier;
-      }
-
-      Element typeElement = type.element;
-      if (typeElement is GenericFunctionTypeElement &&
-          typeElement.enclosingElement is GenericTypeAliasElement) {
-        typeElement = typeElement.enclosingElement;
-      }
-
-      typeName.staticElement = typeElement;
-      typeName.staticType = type;
-    }
-    if (typeAnnotation is NamedType) {
-      TypeArgumentList typeArguments = typeAnnotation.typeArguments;
-      if (typeArguments != null) {
-        _applyTypeArgumentsToList(
-            enclosingLibraryElement, type, typeArguments.arguments);
-      }
-    }
-  }
-
-  /// Recursively apply each of the type arguments of the [type] to the
-  /// corresponding type arguments of the [typeArguments].
-  static void _applyTypeArgumentsToList(LibraryElement enclosingLibraryElement,
-      DartType type, List<TypeAnnotation> typeArguments) {
-    if (type != null && type.isUndefined) {
-      for (TypeAnnotation argument in typeArguments) {
-        applyToTypeAnnotation(enclosingLibraryElement, type, argument);
-      }
-    } else if (type is ParameterizedType) {
-      List<DartType> argumentTypes = type.typeArguments;
-      int argumentCount = argumentTypes.length;
-      if (argumentCount != typeArguments.length) {
-        throw new StateError('Found $argumentCount argument types '
-            'for ${typeArguments.length} type arguments');
-      }
-      for (int i = 0; i < argumentCount; i++) {
-        applyToTypeAnnotation(
-            enclosingLibraryElement, argumentTypes[i], typeArguments[i]);
-      }
-    } else {
-      throw new StateError('Attempting to apply a non-parameterized type '
-          '(${type.runtimeType}) to type arguments');
-    }
-  }
 }
 
 /// A container with [typeArguments].
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 01d758e..9924ebb 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/src/fasta/resolution_applier.dart';
 import 'package:front_end/src/fasta/kernel/factory.dart';
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
+import 'package:front_end/src/fasta/kernel/kernel_type_variable_builder.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:front_end/src/scanner/token.dart';
 import 'package:kernel/ast.dart';
@@ -18,8 +19,11 @@
   final Type invokeType;
   final bool isExplicitCall;
   final bool isImplicitCall;
+  final bool isPrefixReference;
+  final bool isTypeReference;
   final bool isWriteReference;
   final Type literalType;
+  final Reference loadLibrary;
   final PrefixInfo prefixInfo;
   final Reference reference;
   final Type writeContext;
@@ -32,8 +36,11 @@
       this.invokeType,
       this.isExplicitCall = false,
       this.isImplicitCall = false,
+      this.isPrefixReference = false,
+      this.isTypeReference = false,
       this.isWriteReference = false,
       this.literalType,
+      this.loadLibrary,
       this.prefixInfo,
       this.reference,
       this.writeContext});
@@ -41,83 +48,27 @@
 
 /// Type inference listener that records inferred types for later use by
 /// [ResolutionApplier].
-class ResolutionStorer extends _ResolutionStorer<int, Node, int>
+class ResolutionStorer
     implements
         TypeInferenceListener<int, Node, int>,
         Factory<void, void, void, void> {
-  ResolutionStorer(Map<int, ResolutionData<DartType, int, Node, int>> data)
-      : super(data);
+  final Map<int, ResolutionData<DartType, int, Node, int>> _data;
 
-  @override
-  void _validateLocation(int location) {
-    if (location < 0) {
-      throw new StateError('Invalid location: $location');
-    }
-  }
-}
+  final Map<TypeParameter, int> _typeVariableDeclarations;
 
-/// Implementation of [ResolutionStorer], with types parameterized to avoid
-/// accidentally peeking into kernel internals.
-///
-/// TODO(paulberry): when the time is right, fuse this with [ResolutionStorer].
-class _ResolutionStorer<Location, Reference, PrefixInfo> {
-  final Map<Location, ResolutionData<DartType, int, Reference, PrefixInfo>>
-      _data;
+  ResolutionStorer(Map<int, ResolutionData<DartType, int, Node, int>> data,
+      Map<TypeParameter, int> typeVariableDeclarations)
+      : _data = data,
+        _typeVariableDeclarations = typeVariableDeclarations;
 
-  _ResolutionStorer(this._data);
-
-  void _store(Location location,
-      {List<DartType> argumentTypes,
-      Reference combiner,
-      int declaration,
-      DartType inferredType,
-      DartType invokeType,
-      bool isExplicitCall = false,
-      bool isImplicitCall = false,
-      bool isWriteReference = false,
-      DartType literalType,
-      PrefixInfo prefixInfo,
-      Reference reference,
-      bool replace = false,
-      DartType writeContext}) {
-    _validateLocation(location);
-    if (!replace && _data.containsKey(location)) {
-      throw new StateError('Data already stored for offset $location');
-    }
-    _data[location] = new ResolutionData(
-        argumentTypes: argumentTypes,
-        combiner: combiner,
-        declaration: declaration,
-        inferredType: inferredType,
-        invokeType: invokeType,
-        isExplicitCall: isExplicitCall,
-        isImplicitCall: isImplicitCall,
-        isWriteReference: isWriteReference,
-        literalType: literalType,
-        prefixInfo: prefixInfo,
-        reference: reference,
-        writeContext: writeContext);
-  }
-
-  void _unstore(Location location) {
-    _data.remove(location) == null;
-  }
-
-  void _validateLocation(Location location) {}
-
-  void asExpression(
-      ExpressionJudgment judgment,
-      Location location,
-      void expression,
-      Token asOperator,
-      void literalType,
-      DartType inferredType) {
+  void asExpression(ExpressionJudgment judgment, int location, void expression,
+      Token asOperator, void literalType, DartType inferredType) {
     _store(location, literalType: inferredType, inferredType: inferredType);
   }
 
   void assertInitializer(
       InitializerJudgment judgment,
-      Location location,
+      int location,
       Token assertKeyword,
       Token leftParenthesis,
       void condition,
@@ -127,7 +78,7 @@
 
   void assertStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token assertKeyword,
       Token leftParenthesis,
       void condition,
@@ -136,27 +87,48 @@
       Token rightParenthesis,
       Token semicolon) {}
 
-  void awaitExpression(ExpressionJudgment judgment, Location location,
+  void awaitExpression(ExpressionJudgment judgment, int location,
           Token awaitKeyword, void expression, DartType inferredType) =>
       genericExpression("awaitExpression", location, inferredType);
 
-  void block(StatementJudgment judgment, Location location, Token leftBracket,
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return new VariableDeclarationBinder(fileOffset);
+  }
+
+  void binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  void binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+  TypeVariableBinder binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name) {
+    return new TypeVariableBinder(fileOffset);
+  }
+
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return new VariableDeclarationBinder(fileOffset);
+  }
+
+  void block(StatementJudgment judgment, int location, Token leftBracket,
       List<void> statements, Token rightBracket) {}
 
-  void boolLiteral(ExpressionJudgment judgment, Location location,
-          Token literal, bool value, DartType inferredType) =>
+  void boolLiteral(ExpressionJudgment judgment, int location, Token literal,
+          bool value, DartType inferredType) =>
       genericExpression("boolLiteral", location, inferredType);
 
   void breakStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token breakKeyword,
       void label,
       Token semicolon,
       covariant Object labelBinder) {}
 
   void cascadeExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType) {
+      ExpressionJudgment judgment, int location, DartType inferredType) {
     // Overridden so that the type of the expression will not be recorded. We
     // don't need to record the type because the type is always the same as the
     // type of the target, and we don't have the appropriate offset so we can't
@@ -165,7 +137,7 @@
 
   void catchStatement(
       Catch judgment,
-      Location location,
+      int location,
       Token onKeyword,
       void type,
       Token catchKeyword,
@@ -183,19 +155,17 @@
     _store(location, literalType: guardType);
 
     if (exceptionBinder != null) {
-      _store(exceptionBinder.fileOffset as Location,
-          literalType: exceptionType);
+      _store(exceptionBinder.fileOffset, literalType: exceptionType);
     }
 
     if (stackTraceBinder != null) {
-      _store(stackTraceBinder.fileOffset as Location,
-          literalType: stackTraceType);
+      _store(stackTraceBinder.fileOffset, literalType: stackTraceType);
     }
   }
 
   void conditionalExpression(
           ExpressionJudgment judgment,
-          Location location,
+          int location,
           void condition,
           Token question,
           void thenExpression,
@@ -204,8 +174,8 @@
           DartType inferredType) =>
       genericExpression("conditionalExpression", location, inferredType);
 
-  void constructorInvocation(ExpressionJudgment judgment, Location location,
-      Reference expressionTarget, DartType inferredType) {
+  void constructorInvocation(ExpressionJudgment judgment, int location,
+      Node expressionTarget, DartType inferredType) {
     // A class reference may have already been stored at this location by
     // storeClassReference.  We want to replace it with a constructor
     // reference.
@@ -215,7 +185,7 @@
 
   void continueStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token continueKeyword,
       void label,
       Token semicolon,
@@ -223,20 +193,20 @@
 
   void continueSwitchStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token continueKeyword,
       void label,
       Token semicolon,
       covariant Object labelBinder) {}
 
   void deferredCheck(
-      ExpressionJudgment judgment, Location location, DartType inferredType) {
+      ExpressionJudgment judgment, int location, DartType inferredType) {
     // This judgment has no semantic value for Analyzer.
   }
 
   void doStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token doKeyword,
       void body,
       Token whileKeyword,
@@ -245,30 +215,30 @@
       Token rightParenthesis,
       Token semicolon) {}
 
-  void doubleLiteral(ExpressionJudgment judgment, Location location,
-          Token literal, double value, DartType inferredType) =>
+  void doubleLiteral(ExpressionJudgment judgment, int location, Token literal,
+          double value, DartType inferredType) =>
       genericExpression("doubleLiteral", location, inferredType);
 
   void emptyStatement(Token semicolon) {}
 
-  void expressionStatement(StatementJudgment judgment, Location location,
+  void expressionStatement(StatementJudgment judgment, int location,
       void expression, Token semicolon) {}
 
   void fieldInitializer(
       InitializerJudgment judgment,
-      Location location,
+      int location,
       Token thisKeyword,
       Token period,
       Token fieldName,
       Token equals,
       void expression,
-      Reference initializerField) {
+      Node initializerField) {
     _store(location, reference: initializerField);
   }
 
   void forInStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token awaitKeyword,
       Token forKeyword,
       Token leftParenthesis,
@@ -280,13 +250,12 @@
       void body,
       covariant VariableDeclarationBinder loopVariableBinder,
       DartType loopVariableType,
-      Location writeLocation,
+      int writeLocation,
       DartType writeType,
       covariant VariableDeclarationBinder writeVariableBinder,
-      Reference writeTarget) {
+      Node writeTarget) {
     if (loopVariableBinder != null) {
-      _store(loopVariableBinder.fileOffset as Location,
-          inferredType: loopVariableType);
+      _store(loopVariableBinder.fileOffset, inferredType: loopVariableType);
     } else {
       if (writeVariableBinder != null) {
         _store(writeLocation,
@@ -303,7 +272,7 @@
 
   void forStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token forKeyword,
       Token leftParenthesis,
       void variableDeclarationList,
@@ -317,30 +286,35 @@
 
   void functionDeclaration(
       covariant VariableDeclarationBinder binder, FunctionType inferredType) {
-    _store(binder.fileOffset as Location, inferredType: inferredType);
+    _store(binder.fileOffset, inferredType: inferredType);
   }
 
-  Object binderForFunctionDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {
-    return new VariableDeclarationBinder(fileOffset);
-  }
-
-  void functionExpression(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+  void functionExpression(
+          ExpressionJudgment judgment, int location, DartType inferredType) =>
       genericExpression("functionExpression", location, inferredType);
 
+  @override
+  void functionType(int location, DartType type) {
+    _store(location, inferredType: type);
+  }
+
+  @override
+  void functionTypedFormalParameter(int location, DartType type) {
+    _store(location, inferredType: type);
+  }
+
   void genericExpression(
-      String expressionType, Location location, DartType inferredType) {
+      String expressionType, int location, DartType inferredType) {
     _store(location, inferredType: inferredType);
   }
 
-  void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
+  void ifNull(ExpressionJudgment judgment, int location, void leftOperand,
           Token operator, void rightOperand, DartType inferredType) =>
       genericExpression('ifNull', location, inferredType);
 
   void ifStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token ifKeyword,
       Token leftParenthesis,
       void condition,
@@ -349,22 +323,46 @@
       Token elseKeyword,
       void elseStatement) {}
 
-  void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
+  void indexAssign(ExpressionJudgment judgment, int location, Node writeMember,
+      Node combiner, DartType inferredType) {
+    _store(location,
+        reference: writeMember, inferredType: inferredType, combiner: combiner);
+  }
+
+  void intLiteral(ExpressionJudgment judgment, int location, Token literal,
           num value, DartType inferredType) =>
       genericExpression("intLiteral", location, inferredType);
 
-  void invalidInitializer(InitializerJudgment judgment, Location location) {}
+  void invalidInitializer(InitializerJudgment judgment, int location) {}
+
+  void isExpression(
+      ExpressionJudgment judgment,
+      int location,
+      void expression,
+      Token isOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType) {
+    _store(location, literalType: testedType, inferredType: inferredType);
+  }
+
+  void isNotExpression(
+      ExpressionJudgment judgment,
+      int location,
+      void expression,
+      Token isOperator,
+      Token notOperator,
+      void literalType,
+      DartType type,
+      DartType inferredType) {
+    _store(location, literalType: type, inferredType: inferredType);
+  }
 
   void labeledStatement(List<Object> labels, void statement) {}
 
-  void statementLabel(covariant void binder, Token label, Token colon) {}
-
-  void binderForStatementLabel(
-      StatementJudgment judgment, int fileOffset, String name) {}
-
   void listLiteral(
           ExpressionJudgment judgment,
-          Location location,
+          int location,
           Token constKeyword,
           Object typeArguments,
           Token leftBracket,
@@ -373,9 +371,24 @@
           DartType inferredType) =>
       genericExpression("listLiteral", location, inferredType);
 
+  @override
+  void loadLibrary(LoadLibraryJudgment judgment, int location, Node library,
+      FunctionType calleeType, DartType inferredType) {
+    _store(location,
+        loadLibrary: library,
+        invokeType: calleeType,
+        inferredType: inferredType);
+  }
+
+  @override
+  void loadLibraryTearOff(LoadLibraryTearOffJudgment judgment, int location,
+      Node library, DartType inferredType) {
+    _store(location, loadLibrary: library, inferredType: inferredType);
+  }
+
   void logicalExpression(
           ExpressionJudgment judgment,
-          Location location,
+          int location,
           void leftOperand,
           Token operator,
           void rightOperand,
@@ -384,7 +397,7 @@
 
   void mapLiteral(
           ExpressionJudgment judgment,
-          Location location,
+          int location,
           Token constKeyword,
           Object typeArguments,
           Token leftBracket,
@@ -398,56 +411,12 @@
     // TODO(brianwilkerson) Implement this.
   }
 
-  void namedFunctionExpression(ExpressionJudgment judgment,
-          covariant VariableDeclarationBinder binder, DartType inferredType) =>
-      genericExpression("namedFunctionExpression",
-          binder.fileOffset as Location, inferredType);
-
-  void not(ExpressionJudgment judgment, Location location, Token operator,
-          void operand, DartType inferredType) =>
-      genericExpression("not", location, inferredType);
-
-  void nullLiteral(ExpressionJudgment judgment, Location location,
-      Token literal, bool isSynthetic, DartType inferredType) {
-    if (isSynthetic) return null;
-    genericExpression("nullLiteral", location, inferredType);
-  }
-
-  void indexAssign(ExpressionJudgment judgment, Location location,
-      Reference writeMember, Reference combiner, DartType inferredType) {
-    _store(location,
-        reference: writeMember, inferredType: inferredType, combiner: combiner);
-  }
-
-  void isExpression(
-      ExpressionJudgment judgment,
-      Location location,
-      void expression,
-      Token isOperator,
-      void literalType,
-      DartType testedType,
-      DartType inferredType) {
-    _store(location, literalType: testedType, inferredType: inferredType);
-  }
-
-  void isNotExpression(
-      ExpressionJudgment judgment,
-      Location location,
-      void expression,
-      Token isOperator,
-      Token notOperator,
-      void literalType,
-      DartType type,
-      DartType inferredType) {
-    _store(location, literalType: type, inferredType: inferredType);
-  }
-
   void methodInvocation(
       ExpressionJudgment judgment,
-      Location resultOffset,
+      int resultOffset,
       List<DartType> argumentsTypes,
       bool isImplicitCall,
-      Reference interfaceMember,
+      Node interfaceMember,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
@@ -465,7 +434,7 @@
 
   void methodInvocationCall(
       ExpressionJudgment judgment,
-      Location resultOffset,
+      int resultOffset,
       List<DartType> argumentsTypes,
       bool isImplicitCall,
       FunctionType calleeType,
@@ -482,12 +451,27 @@
         isImplicitCall: isImplicitCall);
   }
 
+  void namedFunctionExpression(ExpressionJudgment judgment,
+          covariant VariableDeclarationBinder binder, DartType inferredType) =>
+      genericExpression(
+          "namedFunctionExpression", binder.fileOffset, inferredType);
+
+  void not(ExpressionJudgment judgment, int location, Token operator,
+          void operand, DartType inferredType) =>
+      genericExpression("not", location, inferredType);
+
+  void nullLiteral(ExpressionJudgment judgment, int location, Token literal,
+      bool isSynthetic, DartType inferredType) {
+    if (isSynthetic) return null;
+    genericExpression("nullLiteral", location, inferredType);
+  }
+
   void propertyAssign(
       ExpressionJudgment judgment,
-      Location location,
-      Reference writeMember,
+      int location,
+      Node writeMember,
       DartType writeContext,
-      Reference combiner,
+      Node combiner,
       DartType inferredType) {
     _store(location,
         isWriteReference: true,
@@ -497,45 +481,42 @@
         inferredType: inferredType);
   }
 
-  void propertySet(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
-      genericExpression("propertySet", location, inferredType);
-
-  void propertyGet(ExpressionJudgment judgment, Location location,
-      Reference member, DartType inferredType) {
+  void propertyGet(ExpressionJudgment judgment, int location, Node member,
+      DartType inferredType) {
     _store(location, reference: member, inferredType: inferredType);
   }
 
   void propertyGetCall(
-      ExpressionJudgment judgment, Location location, DartType inferredType) {
+      ExpressionJudgment judgment, int location, DartType inferredType) {
     _store(location, isExplicitCall: true);
   }
 
+  void propertySet(
+          ExpressionJudgment judgment, int location, DartType inferredType) =>
+      genericExpression("propertySet", location, inferredType);
+
   void redirectingInitializer(
       InitializerJudgment judgment,
-      Location location,
+      int location,
       Token thisKeyword,
       Token period,
       Token constructorName,
       covariant Object argumentList,
-      Reference initializerTarget) {
+      Node initializerTarget) {
     _store(location, reference: initializerTarget);
   }
 
-  void rethrow_(ExpressionJudgment judgment, Location location,
-          Token rethrowKeyword, DartType inferredType) =>
+  void rethrow_(ExpressionJudgment judgment, int location, Token rethrowKeyword,
+          DartType inferredType) =>
       genericExpression('rethrow', location, inferredType);
 
-  void returnStatement(StatementJudgment judgment, Location location,
+  void returnStatement(StatementJudgment judgment, int location,
       Token returnKeyword, void expression, Token semicolon) {}
 
-  void staticAssign(
-      ExpressionJudgment judgment,
-      Location location,
-      Reference writeMember,
-      DartType writeContext,
-      Reference combiner,
-      DartType inferredType) {
+  void statementLabel(covariant void binder, Token label, Token colon) {}
+
+  void staticAssign(ExpressionJudgment judgment, int location, Node writeMember,
+      DartType writeContext, Node combiner, DartType inferredType) {
     _store(location,
         reference: writeMember,
         isWriteReference: true,
@@ -544,15 +525,15 @@
         inferredType: inferredType);
   }
 
-  void staticGet(ExpressionJudgment judgment, Location location,
-      Reference expressionTarget, DartType inferredType) {
+  void staticGet(ExpressionJudgment judgment, int location,
+      Node expressionTarget, DartType inferredType) {
     _store(location, reference: expressionTarget, inferredType: inferredType);
   }
 
   void staticInvocation(
       ExpressionJudgment judgment,
-      Location location,
-      Reference expressionTarget,
+      int location,
+      Node expressionTarget,
       List<DartType> expressionArgumentsTypes,
       FunctionType calleeType,
       Substitution substitution,
@@ -567,19 +548,28 @@
         inferredType: inferredType);
   }
 
+  void storeClassReference(int location, Node reference, DartType rawType) {
+    // TODO(paulberry): would it be better to use literalType?
+    _store(location, reference: reference, inferredType: rawType);
+  }
+
+  void storePrefixInfo(int location, int prefixInfo) {
+    _store(location, isPrefixReference: true, prefixInfo: prefixInfo);
+  }
+
   void stringConcatenation(
-      ExpressionJudgment judgment, Location location, DartType inferredType) {
+      ExpressionJudgment judgment, int location, DartType inferredType) {
     // We don't need the type - we already know that it is String.
     // Moreover, the file offset for StringConcatenation is `-1`.
   }
 
-  void stringLiteral(ExpressionJudgment judgment, Location location,
-          Token literal, String value, DartType inferredType) =>
+  void stringLiteral(ExpressionJudgment judgment, int location, Token literal,
+          String value, DartType inferredType) =>
       genericExpression("StringLiteral", location, inferredType);
 
   void superInitializer(
       InitializerJudgment judgment,
-      Location location,
+      int location,
       Token superKeyword,
       Token period,
       Token constructorName,
@@ -590,12 +580,9 @@
 
   void switchLabel(covariant void binder, Token label, Token colon) {}
 
-  void binderForSwitchLabel(
-      SwitchCaseJudgment judgment, int fileOffset, String name) {}
-
   void switchStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token switchKeyword,
       Token leftParenthesis,
       void expression,
@@ -604,44 +591,54 @@
       void members,
       Token rightBracket) {}
 
-  void symbolLiteral(
-          ExpressionJudgment judgment,
-          Location location,
-          Token poundSign,
-          List<Token> components,
-          String value,
-          DartType inferredType) =>
+  void symbolLiteral(ExpressionJudgment judgment, int location, Token poundSign,
+          List<Token> components, String value, DartType inferredType) =>
       genericExpression("symbolLiteral", location, inferredType);
 
-  void thisExpression(ExpressionJudgment judgment, Location location,
+  void thisExpression(ExpressionJudgment judgment, int location,
       Token thisKeyword, DartType inferredType) {}
 
-  void throw_(ExpressionJudgment judgment, Location location,
-          Token throwKeyword, void expression, DartType inferredType) =>
+  void throw_(ExpressionJudgment judgment, int location, Token throwKeyword,
+          void expression, DartType inferredType) =>
       genericExpression('throw', location, inferredType);
 
-  void tryCatch(StatementJudgment judgment, Location location) {}
+  void tryCatch(StatementJudgment judgment, int location) {}
 
-  void tryFinally(
-      StatementJudgment judgment,
-      Location location,
-      Token tryKeyword,
-      void body,
-      void catchClauses,
-      Token finallyKeyword,
-      void finallyBlock) {}
+  void tryFinally(StatementJudgment judgment, int location, Token tryKeyword,
+      void body, void catchClauses, Token finallyKeyword, void finallyBlock) {}
 
-  void typeLiteral(ExpressionJudgment judgment, Location location,
-      Reference expressionType, DartType inferredType) {
+  void typeLiteral(ExpressionJudgment judgment, int location,
+      Node expressionType, DartType inferredType) {
     _store(location, reference: expressionType, inferredType: inferredType);
   }
 
+  void typeReference(
+      int location,
+      Token leftBracket,
+      List<void> typeArguments,
+      Token rightBracket,
+      Node reference,
+      covariant TypeVariableBinder binder,
+      DartType type) {
+    _store(location,
+        reference: reference,
+        declaration: binder?.fileOffset,
+        inferredType: type,
+        isTypeReference: true);
+  }
+
+  void typeVariableDeclaration(int location,
+      covariant TypeVariableBinder binder, TypeParameter typeParameter) {
+    _storeTypeVariableDeclaration(binder.fileOffset, typeParameter);
+    _store(location, declaration: binder.fileOffset);
+  }
+
   void variableAssign(
       ExpressionJudgment judgment,
-      Location location,
+      int location,
       DartType writeContext,
       covariant VariableDeclarationBinder writeVariableBinder,
-      Reference combiner,
+      Node combiner,
       DartType inferredType) {
     _store(location,
         declaration: writeVariableBinder?.fileOffset,
@@ -653,18 +650,13 @@
 
   void variableDeclaration(covariant VariableDeclarationBinder binder,
       DartType statementType, DartType inferredType) {
-    _store(binder.fileOffset as Location,
+    _store(binder.fileOffset,
         literalType: statementType, inferredType: inferredType);
   }
 
-  Object binderForVariableDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {
-    return new VariableDeclarationBinder(fileOffset);
-  }
-
   void variableGet(
       ExpressionJudgment judgment,
-      Location location,
+      int location,
       bool isInCascade,
       covariant VariableDeclarationBinder variableBinder,
       DartType inferredType) {
@@ -675,34 +667,79 @@
         declaration: variableBinder?.fileOffset, inferredType: inferredType);
   }
 
+  void voidType(int location, Token token, DartType type) {
+    _store(location, inferredType: type);
+  }
+
   void whileStatement(
       StatementJudgment judgment,
-      Location location,
+      int location,
       Token whileKeyword,
       Token leftParenthesis,
       void condition,
       Token rightParenthesis,
       void body) {}
 
-  void yieldStatement(StatementJudgment judgment, Location location,
+  void yieldStatement(StatementJudgment judgment, int location,
       Token yieldKeyword, Token star, void expression, Token semicolon) {}
 
-  void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
-    _store(location, prefixInfo: prefixInfo);
+  void _store(int location,
+      {List<DartType> argumentTypes,
+      Node combiner,
+      int declaration,
+      DartType inferredType,
+      DartType invokeType,
+      bool isExplicitCall = false,
+      bool isImplicitCall = false,
+      bool isPrefixReference = false,
+      bool isTypeReference = false,
+      bool isWriteReference = false,
+      DartType literalType,
+      Node loadLibrary,
+      int prefixInfo,
+      Node reference,
+      bool replace = false,
+      DartType writeContext}) {
+    _validateLocation(location);
+    if (!replace && _data.containsKey(location)) {
+      throw new StateError('Data already stored for offset $location');
+    }
+    _data[location] = new ResolutionData(
+        argumentTypes: argumentTypes,
+        combiner: combiner,
+        declaration: declaration,
+        inferredType: inferredType,
+        invokeType: invokeType,
+        isExplicitCall: isExplicitCall,
+        isImplicitCall: isImplicitCall,
+        isPrefixReference: isPrefixReference,
+        isTypeReference: isTypeReference,
+        isWriteReference: isWriteReference,
+        literalType: literalType,
+        loadLibrary: loadLibrary,
+        prefixInfo: prefixInfo,
+        reference: reference,
+        writeContext: writeContext);
   }
 
-  void storeClassReference(
-      Location location, Reference reference, DartType rawType) {
-    // TODO(paulberry): would it be better to use literalType?
-    _store(location, reference: reference, inferredType: rawType);
+  void _storeTypeVariableDeclaration(
+      int fileOffset, TypeParameter typeParameter) {
+    if (_typeVariableDeclarations.containsKey(fileOffset)) {
+      throw new StateError(
+          'Type declaration already stored for offset $fileOffset');
+    }
+    _typeVariableDeclarations[typeParameter] = fileOffset;
   }
-}
 
-/// TODO(paulberry): eventually just use the element directly.
-class VariableDeclarationBinder {
-  final int fileOffset;
+  void _unstore(int location) {
+    _data.remove(location) == null;
+  }
 
-  VariableDeclarationBinder(this.fileOffset);
+  void _validateLocation(int location) {
+    if (location < 0) {
+      throw new StateError('Invalid location: $location');
+    }
+  }
 }
 
 /// A [DartType] wrapper around invocation type arguments.
@@ -718,3 +755,17 @@
     return '<${types.join(', ')}>';
   }
 }
+
+/// TODO(paulberry): eventually just use the element directly.
+class TypeVariableBinder {
+  final int fileOffset;
+
+  TypeVariableBinder(this.fileOffset);
+}
+
+/// TODO(paulberry): eventually just use the element directly.
+class VariableDeclarationBinder {
+  final int fileOffset;
+
+  VariableDeclarationBinder(this.fileOffset);
+}
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index f25218f..5afac37 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -5,6 +5,7 @@
 library analyzer.src.generated.declaration_resolver;
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -14,7 +15,6 @@
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/fasta/resolution_applier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
 /**
@@ -294,8 +294,7 @@
   @override
   Object visitFormalParameterList(FormalParameterList node) {
     if (_applyKernelTypes) {
-      ResolutionApplier.applyParameters(
-          _enclosingLibrary, _walker._parameters, node);
+      applyParameters(_enclosingLibrary, _walker._parameters, node);
       _walker.consumeParameters();
       return null;
     } else {
@@ -633,8 +632,7 @@
 
   /// Apply [type] to the [typeAnnotation].
   void _applyType(DartType type, TypeAnnotation typeAnnotation) {
-    ResolutionApplier.applyToTypeAnnotation(
-        _enclosingLibrary, type, typeAnnotation);
+    applyToTypeAnnotation(_enclosingLibrary, type, typeAnnotation);
   }
 
   /**
@@ -734,6 +732,168 @@
     _walker = outerWalker;
   }
 
+  /// Apply the [type] that is created by the [constructorName] and the
+  /// [constructorElement] it references.
+  static void applyConstructorElement(
+      LibraryElement enclosingLibraryElement,
+      PrefixElement prefixElement,
+      ConstructorElement constructorElement,
+      DartType type,
+      ConstructorName constructorName) {
+    constructorName.staticElement = constructorElement;
+
+    ClassElement classElement = constructorElement?.enclosingElement;
+
+    Identifier typeIdentifier = constructorName.type.name;
+    if (prefixElement != null) {
+      PrefixedIdentifier prefixedTypeIdentifier = typeIdentifier;
+      prefixedTypeIdentifier.staticType = type;
+
+      prefixedTypeIdentifier.prefix.staticElement = prefixElement;
+
+      SimpleIdentifier classNode = prefixedTypeIdentifier.identifier;
+      classNode.staticElement = classElement;
+      classNode.staticType = type;
+    } else {
+      if (typeIdentifier is SimpleIdentifier) {
+        typeIdentifier.staticElement = classElement;
+        typeIdentifier.staticType = type;
+      } else if (typeIdentifier is PrefixedIdentifier) {
+        constructorName.type = astFactory.typeName(typeIdentifier.prefix, null);
+        constructorName.period = typeIdentifier.period;
+        constructorName.name = typeIdentifier.identifier;
+      }
+    }
+
+    constructorName.name?.staticElement = constructorElement;
+
+    DeclarationResolver.applyToTypeAnnotation(
+        enclosingLibraryElement, type, constructorName.type);
+  }
+
+  /// Apply the types of the [parameterElements] to the [parameterList] that
+  /// have an explicit type annotation.
+  static void applyParameters(
+      LibraryElement enclosingLibraryElement,
+      List<ParameterElement> parameterElements,
+      FormalParameterList parameterList) {
+    List<FormalParameter> parameters = parameterList.parameters;
+
+    int length = parameterElements.length;
+    if (parameters.length != length) {
+      throw new StateError('Parameter counts do not match');
+    }
+    for (int i = 0; i < length; i++) {
+      ParameterElementImpl element = parameterElements[i];
+      FormalParameter parameter = parameters[i];
+
+      DeclarationResolver.resolveMetadata(
+          parameter, parameter.metadata, element);
+
+      NormalFormalParameter normalParameter;
+      if (parameter is NormalFormalParameter) {
+        normalParameter = parameter;
+      } else if (parameter is DefaultFormalParameter) {
+        normalParameter = parameter.parameter;
+      }
+      assert(normalParameter != null);
+
+      if (normalParameter is SimpleFormalParameterImpl) {
+        normalParameter.element = element;
+      }
+
+      if (normalParameter.identifier != null) {
+        element.nameOffset = normalParameter.identifier.offset;
+        normalParameter.identifier.staticElement = element;
+        normalParameter.identifier.staticType = element.type;
+      }
+
+      // Apply the type or the return type, if a function typed parameter.
+      TypeAnnotation functionReturnType;
+      FormalParameterList functionParameterList;
+      if (normalParameter is SimpleFormalParameter) {
+        applyToTypeAnnotation(
+            enclosingLibraryElement, element.type, normalParameter.type);
+      } else if (normalParameter is FunctionTypedFormalParameter) {
+        functionReturnType = normalParameter.returnType;
+        functionParameterList = normalParameter.parameters;
+      } else if (normalParameter is FieldFormalParameter) {
+        if (normalParameter.parameters == null) {
+          applyToTypeAnnotation(
+              enclosingLibraryElement, element.type, normalParameter.type);
+        } else {
+          functionReturnType = normalParameter.type;
+          functionParameterList = normalParameter.parameters;
+        }
+      }
+
+      if (functionParameterList != null) {
+        FunctionType elementType = element.type;
+        if (functionReturnType != null) {
+          applyToTypeAnnotation(enclosingLibraryElement, elementType.returnType,
+              functionReturnType);
+        }
+        applyParameters(enclosingLibraryElement, elementType.parameters,
+            functionParameterList);
+      }
+    }
+  }
+
+  /// Apply the [type] to the [typeAnnotation] by setting the type of the
+  /// [typeAnnotation] to the [type] and recursively applying each of the type
+  /// arguments of the [type] to the corresponding type arguments of the
+  /// [typeAnnotation].
+  static void applyToTypeAnnotation(LibraryElement enclosingLibraryElement,
+      DartType type, TypeAnnotation typeAnnotation) {
+    if (typeAnnotation is GenericFunctionTypeImpl) {
+      if (type is! FunctionType) {
+        throw new StateError('Non-function type ($type) '
+            'for generic function annotation ($typeAnnotation)');
+      }
+      FunctionType functionType = type;
+      typeAnnotation.type = type;
+      applyToTypeAnnotation(enclosingLibraryElement, functionType.returnType,
+          typeAnnotation.returnType);
+      applyParameters(enclosingLibraryElement, functionType.parameters,
+          typeAnnotation.parameters);
+    } else if (typeAnnotation is TypeNameImpl) {
+      typeAnnotation.type = type;
+
+      Identifier typeIdentifier = typeAnnotation.name;
+      SimpleIdentifier typeName;
+      if (typeIdentifier is PrefixedIdentifier) {
+        if (enclosingLibraryElement != null) {
+          String prefixName = typeIdentifier.prefix.name;
+          for (var import in enclosingLibraryElement.imports) {
+            if (import.prefix?.name == prefixName) {
+              typeIdentifier.prefix.staticElement = import.prefix;
+              break;
+            }
+          }
+        }
+        typeName = typeIdentifier.identifier;
+      } else {
+        typeName = typeIdentifier;
+      }
+
+      Element typeElement = type.element;
+      if (typeElement is GenericFunctionTypeElement &&
+          typeElement.enclosingElement is GenericTypeAliasElement) {
+        typeElement = typeElement.enclosingElement;
+      }
+
+      typeName.staticElement = typeElement;
+      typeName.staticType = type;
+    }
+    if (typeAnnotation is NamedType) {
+      TypeArgumentList typeArguments = typeAnnotation.typeArguments;
+      if (typeArguments != null) {
+        _applyTypeArgumentsToList(
+            enclosingLibraryElement, type, typeArguments.arguments);
+      }
+    }
+  }
+
   /**
    * Associate each of the annotation [nodes] with the corresponding
    * [ElementAnnotation] in [annotations]. If there is a problem, report it
@@ -767,6 +927,31 @@
     }
   }
 
+  /// Recursively apply each of the type arguments of the [type] to the
+  /// corresponding type arguments of the [typeArguments].
+  static void _applyTypeArgumentsToList(LibraryElement enclosingLibraryElement,
+      DartType type, List<TypeAnnotation> typeArguments) {
+    if (type != null && type.isUndefined) {
+      for (TypeAnnotation argument in typeArguments) {
+        applyToTypeAnnotation(enclosingLibraryElement, type, argument);
+      }
+    } else if (type is ParameterizedType) {
+      List<DartType> argumentTypes = type.typeArguments;
+      int argumentCount = argumentTypes.length;
+      if (argumentCount != typeArguments.length) {
+        throw new StateError('Found $argumentCount argument types '
+            'for ${typeArguments.length} type arguments');
+      }
+      for (int i = 0; i < argumentCount; i++) {
+        applyToTypeAnnotation(
+            enclosingLibraryElement, argumentTypes[i], typeArguments[i]);
+      }
+    } else {
+      throw new StateError('Attempting to apply a non-parameterized type '
+          '(${type.runtimeType}) to type arguments');
+    }
+  }
+
   static bool _isBodyToCreateElementsFor(FunctionBody node) {
     AstNode parent = node.parent;
     return parent is ConstructorDeclaration ||
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 94c6855..a782664 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1622,33 +1622,45 @@
    */
   DartType _instantiateGenericMethod(
       DartType invokeType, TypeArgumentList typeArguments, AstNode node) {
-    // TODO(jmesserly): support generic "call" methods on InterfaceType.
+    DartType parameterizableType;
+    List<TypeParameterElement> parameters;
     if (invokeType is FunctionType) {
-      List<TypeParameterElement> parameters = invokeType.typeFormals;
+      parameterizableType = invokeType;
+      parameters = invokeType.typeFormals;
+    } else if (invokeType is InterfaceType) {
+      MethodElement callMethod = invokeType.lookUpMethod(
+          FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
+      parameterizableType = callMethod?.type;
+      parameters = (parameterizableType as FunctionType)?.typeFormals;
+    }
 
+    if (parameterizableType is ParameterizedType) {
       NodeList<TypeAnnotation> arguments = typeArguments?.arguments;
       if (arguments != null && arguments.length != parameters.length) {
         if (_resolver.strongMode) {
           _resolver.errorReporter.reportErrorForNode(
               StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
               node,
-              [invokeType, parameters.length, arguments?.length ?? 0]);
+              [parameterizableType, parameters.length, arguments?.length ?? 0]);
         } else {
           _resolver.errorReporter.reportErrorForNode(
               HintCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
               node,
-              [invokeType, parameters.length, arguments?.length ?? 0]);
+              [parameterizableType, parameters.length, arguments?.length ?? 0]);
         }
         // Wrong number of type arguments. Ignore them.
         arguments = null;
       }
       if (parameters.isNotEmpty) {
         if (arguments == null) {
-          return _resolver.typeSystem.instantiateToBounds(invokeType);
+          return _resolver.typeSystem.instantiateToBounds(parameterizableType);
         } else {
-          return invokeType.instantiate(arguments.map((n) => n.type).toList());
+          return parameterizableType
+              .instantiate(arguments.map((n) => n.type).toList());
         }
       }
+
+      return parameterizableType;
     }
     return invokeType;
   }
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 64e7011..3d48bbb 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1387,7 +1387,7 @@
    * A flag indicating whether declaration casts are allowed in [strongMode]
    * (they are always allowed in Dart 1.0 mode).
    *
-   * This option is experimental and subject to change.
+   * This option is deprecated and will be removed in a future release.
    */
   bool declarationCasts = true;
 
@@ -2567,8 +2567,9 @@
    * Initialize a newly created exception to represent the removal of the given
    * [source].
    */
-  ObsoleteSourceAnalysisException(Source source) : super("The source '${source
-            .fullName}' was removed while it was being analyzed") {
+  ObsoleteSourceAnalysisException(Source source)
+      : super(
+            "The source '${source.fullName}' was removed while it was being analyzed") {
     this._source = source;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 1371020..25343f2 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -467,10 +467,10 @@
     _checkForAbstractSuperMemberReference(realTarget, node.methodName);
     _checkForNullAwareHints(node, node.operator);
     DartType staticInvokeType = node.staticInvokeType;
-    if (staticInvokeType is InterfaceType) {
-      MethodElement methodElement = staticInvokeType.lookUpMethod(
-          FunctionElement.CALL_METHOD_NAME, _currentLibrary);
-      _checkForDeprecatedMemberUse(methodElement, node);
+    Element callElement = staticInvokeType?.element;
+    if (callElement is MethodElement &&
+        callElement.name == FunctionElement.CALL_METHOD_NAME) {
+      _checkForDeprecatedMemberUse(callElement, node);
     }
     return super.visitMethodInvocation(node);
   }
@@ -793,9 +793,8 @@
       } else if (displayName == FunctionElement.CALL_METHOD_NAME &&
           node is MethodInvocation &&
           node.staticInvokeType is InterfaceType) {
-        displayName = "${resolutionMap
-            .staticInvokeTypeForInvocationExpression(node)
-            .displayName}.${element.displayName}";
+        displayName =
+            "${resolutionMap.staticInvokeTypeForInvocationExpression(node).displayName}.${element.displayName}";
       }
       _errorReporter.reportErrorForNode(
           HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
@@ -4706,8 +4705,7 @@
       typeAnalyzer.thisType = enclosingClass?.type;
       if (enclosingClass == null) {
         AnalysisEngine.instance.logger.logInformation(
-            "Missing element for class declaration ${node.name
-                .name} in ${definingLibrary.source.fullName}",
+            "Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}",
             new CaughtException(new AnalysisException(), null));
         // Don't try to re-resolve the initializers if we cannot set up the
         // right name scope for resolution.
@@ -7443,8 +7441,7 @@
     try {
       if (classElement == null) {
         AnalysisEngine.instance.logger.logInformation(
-            "Missing element for class declaration ${node.name
-                .name} in ${definingLibrary.source.fullName}",
+            "Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}",
             new CaughtException(new AnalysisException(), null));
         super.visitClassDeclaration(node);
       } else {
@@ -7572,8 +7569,7 @@
     try {
       if (classElement == null) {
         AnalysisEngine.instance.logger.logInformation(
-            "Missing element for enum declaration ${node.name
-                .name} in ${definingLibrary.source.fullName}",
+            "Missing element for enum declaration ${node.name.name} in ${definingLibrary.source.fullName}",
             new CaughtException(new AnalysisException(), null));
         super.visitEnumDeclaration(node);
       } else {
@@ -7689,8 +7685,7 @@
     try {
       if (functionElement == null) {
         AnalysisEngine.instance.logger.logInformation(
-            "Missing element for top-level function ${node.name
-                .name} in ${definingLibrary.source.fullName}",
+            "Missing element for top-level function ${node.name.name} in ${definingLibrary.source.fullName}",
             new CaughtException(new AnalysisException(), null));
       } else {
         nameScope = new FunctionScope(nameScope, functionElement);
@@ -7766,8 +7761,7 @@
       ParameterElement parameterElement = node.element;
       if (parameterElement == null) {
         AnalysisEngine.instance.logger.logInformation(
-            "Missing element for function typed formal parameter ${node
-                .identifier.name} in ${definingLibrary.source.fullName}",
+            "Missing element for function typed formal parameter ${node.identifier.name} in ${definingLibrary.source.fullName}",
             new CaughtException(new AnalysisException(), null));
       } else {
         nameScope = new EnclosedScope(nameScope);
@@ -7868,8 +7862,7 @@
       ExecutableElement methodElement = node.element;
       if (methodElement == null) {
         AnalysisEngine.instance.logger.logInformation(
-            "Missing element for method ${node.name.name} in ${definingLibrary
-                .source.fullName}",
+            "Missing element for method ${node.name.name} in ${definingLibrary.source.fullName}",
             new CaughtException(new AnalysisException(), null));
       } else {
         nameScope = new FunctionScope(nameScope, methodElement);
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 3158176..f0c4a9cd 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -215,6 +215,22 @@
         // more errors (e.g. because `dynamic` is the most common bound).
       }
 
+      if (inferred is FunctionType && inferred.typeFormals.isNotEmpty) {
+        errorReporter
+            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
+          typeParam,
+          ' Inferred candidate type $inferred has type parameters'
+              ' ${(inferred as FunctionType).typeFormals}, but a function with'
+              ' type parameters cannot be used as a type argument.'
+        ]);
+
+        // Heuristic: Using a generic function type as a bound makes subtyping
+        // undecidable. Therefore, we cannot keep [inferred] unless we wish to
+        // generate bogus subtyping errors. Instead generate plain [Function],
+        // which is the most general function type.
+        inferred = typeProvider.functionType;
+      }
+
       if (UnknownInferredType.isKnown(inferred)) {
         knownTypes[typeParam] = inferred;
       }
@@ -828,10 +844,10 @@
    */
   DartType getLeastNullableSupertype(InterfaceType type) {
     // compute set of supertypes
-    List<InterfaceType> s = InterfaceTypeImpl
-        .computeSuperinterfaceSet(type, strong: true)
-        .where(isNullableType)
-        .toList();
+    List<InterfaceType> s =
+        InterfaceTypeImpl.computeSuperinterfaceSet(type, strong: true)
+            .where(isNullableType)
+            .toList();
     return InterfaceTypeImpl.computeTypeAtMaxUniqueDepth(s);
   }
 
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index d3bf1e4..bdbb2c8 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -111,11 +111,15 @@
     }
 
     String libraryUri = components[--componentPtr];
-    String topKindOrClassName = components[--componentPtr];
-
     LibraryElementImpl library = getLibrary(libraryUri);
     if (library == null) return null;
 
+    if (componentPtr == 0) {
+      return library;
+    }
+
+    String topKindOrClassName = components[--componentPtr];
+
     String takeElementName() {
       String publicNameOrLibraryUri = components[--componentPtr];
       if (publicNameOrLibraryUri == libraryUri) {
@@ -217,7 +221,9 @@
     });
   }
 
-  DartType getType(ElementImpl context, kernel.DartType kernelType) {
+  DartType getType(ElementImpl context, kernel.DartType kernelType,
+      {TypeParameterElement Function(kernel.TypeParameter)
+          getLocalTypeParameter}) {
     if (kernelType is kernel.DynamicType) return DynamicTypeImpl.instance;
     if (kernelType is kernel.InvalidType) return UndefinedTypeImpl.instance;
     if (kernelType is kernel.BottomType) return BottomTypeImpl.instance;
@@ -230,16 +236,20 @@
           name.parent.name == 'dart:async') {
         return DynamicTypeImpl.instance;
       }
-      return _getInterfaceType(context, name, kernelType.typeArguments);
+      return _getInterfaceType(context, name, kernelType.typeArguments,
+          getLocalTypeParameter: getLocalTypeParameter);
     }
 
     if (kernelType is kernel.TypeParameterType) {
       kernel.TypeParameter kTypeParameter = kernelType.parameter;
-      return getTypeParameter(context, kTypeParameter).type;
+      return getTypeParameter(context, kTypeParameter,
+              getLocalTypeParameter: getLocalTypeParameter)
+          .type;
     }
 
     if (kernelType is kernel.FunctionType) {
-      return _getFunctionType(context, kernelType);
+      return _getFunctionType(context, kernelType,
+          getLocalTypeParameter: getLocalTypeParameter);
     }
 
     // TODO(scheglov) Support other kernel types.
@@ -248,7 +258,13 @@
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
   TypeParameterElement getTypeParameter(
-      ElementImpl context, kernel.TypeParameter kernelTypeParameter) {
+      ElementImpl context, kernel.TypeParameter kernelTypeParameter,
+      {TypeParameterElement Function(kernel.TypeParameter)
+          getLocalTypeParameter}) {
+    if (getLocalTypeParameter != null) {
+      var translatedElement = getLocalTypeParameter(kernelTypeParameter);
+      if (translatedElement != null) return translatedElement;
+    }
     String name = kernelTypeParameter.name;
     for (var ctx = context; ctx != null; ctx = ctx.enclosingElement) {
       if (ctx is TypeParameterizedElementMixin) {
@@ -275,9 +291,12 @@
 
   /// Return the [FunctionType] that corresponds to the given [kernelType].
   FunctionType _getFunctionType(
-      ElementImpl context, kernel.FunctionType kernelType) {
+      ElementImpl context, kernel.FunctionType kernelType,
+      {TypeParameterElement Function(kernel.TypeParameter)
+          getLocalTypeParameter}) {
     if (kernelType.typedef != null) {
-      var translatedType = _getTypedefType(context, kernelType);
+      var translatedType = _getTypedefType(context, kernelType,
+          getLocalTypeParameter: getLocalTypeParameter);
       if (translatedType != null) return translatedType;
     }
 
@@ -307,13 +326,16 @@
         namedParameters);
     element.parameters = astParameters;
 
-    element.returnType = getType(element, kernelType.returnType);
+    element.returnType = getType(element, kernelType.returnType,
+        getLocalTypeParameter: getLocalTypeParameter);
 
     return new FunctionTypeImpl(element);
   }
 
   InterfaceType _getInterfaceType(ElementImpl context,
-      kernel.CanonicalName className, List<kernel.DartType> kernelArguments) {
+      kernel.CanonicalName className, List<kernel.DartType> kernelArguments,
+      {TypeParameterElement Function(kernel.TypeParameter)
+          getLocalTypeParameter}) {
     var libraryName = className.parent;
     var libraryElement = getLibrary(libraryName.name);
     ClassElement classElement = libraryElement.getType(className.name);
@@ -326,7 +348,8 @@
     return new InterfaceTypeImpl.elementWithNameAndArgs(
         classElement, classElement.name, () {
       List<DartType> arguments = kernelArguments
-          .map((kernel.DartType k) => getType(context, k))
+          .map((kernel.DartType k) =>
+              getType(context, k, getLocalTypeParameter: getLocalTypeParameter))
           .toList(growable: false);
       return arguments;
     });
@@ -342,7 +365,9 @@
 
   /// Return the [FunctionType] for the given typedef based [kernelType].
   FunctionType _getTypedefType(
-      ElementImpl context, kernel.FunctionType kernelType) {
+      ElementImpl context, kernel.FunctionType kernelType,
+      {TypeParameterElement Function(kernel.TypeParameter)
+          getLocalTypeParameter}) {
     kernel.Typedef typedef = kernelType.typedef;
 
     GenericTypeAliasElementImpl typedefElement =
@@ -372,7 +397,8 @@
     // Convert kernel type arguments into Analyzer types.
     var typeArguments = typedef.typeParameters
         .map((t) => substitution.containsKey(t)
-            ? getType(context, substitution[t])
+            ? getType(context, substitution[t],
+                getLocalTypeParameter: getLocalTypeParameter)
             : _typeProvider.nullType)
         .toList();
     return typedefElement.instantiate(typeArguments);
@@ -420,14 +446,6 @@
 }
 
 /**
- * This exception is thrown when we detect that the Kernel has a compilation
- * error, so we cannot resynthesize the constant expression.
- */
-class _CompilationErrorFound {
-  const _CompilationErrorFound();
-}
-
-/**
  * Builder of [Expression]s from [kernel.Expression]s.
  */
 class _ExprBuilder {
@@ -437,11 +455,10 @@
   _ExprBuilder(this._context, this._contextElement);
 
   Expression build(kernel.Expression expr) {
-    try {
-      return _build(expr);
-    } on _CompilationErrorFound {
+    if (_hasInvalidExpression(expr)) {
       return AstTestFactory.identifier3('#invalidConst');
     }
+    return _build(expr);
   }
 
   ConstructorInitializer buildInitializer(kernel.Initializer k) {
@@ -556,22 +573,6 @@
       return AstTestFactory.mapLiteral(keyword, typeArguments, entries);
     }
 
-    // Invalid initializers and  annotations are represented as Let.
-    if (expr is kernel.Let) {
-      var body = expr.body;
-      if (body is kernel.Let) {
-        var initializer = body.variable.initializer;
-        if (initializer is kernel.Let && _isStaticError(initializer.body)) {
-          throw const _CompilationErrorFound();
-        }
-      }
-    }
-
-    // Stop if there is an error.
-    if (_isStaticError(expr)) {
-      throw const _CompilationErrorFound();
-    }
-
     if (expr is kernel.StaticGet) {
       return _buildIdentifier(expr.targetReference, isGet: true);
     }
@@ -730,9 +731,6 @@
   }
 
   SimpleIdentifier _buildSimpleIdentifier(kernel.Reference reference) {
-    if (reference == null) {
-      throw const _CompilationErrorFound();
-    }
     String name = reference.canonicalName.name;
     SimpleIdentifier identifier = AstTestFactory.identifier3(name);
     Element element = _getElement(reference);
@@ -823,12 +821,19 @@
     throw new ArgumentError(name);
   }
 
-  /**
-   * Return `true` if the given [expr] throws an instance of
-   * `_ConstantExpressionError` defined in `dart:core`.
-   */
-  static bool _isStaticError(kernel.Expression expr) {
-    return expr is kernel.InvalidExpression;
+  static bool _hasInvalidExpression(kernel.Expression expr) {
+    var visitor = new _HasInvalidExpressionVisitor();
+    expr.accept(visitor);
+    return visitor.result;
+  }
+}
+
+class _HasInvalidExpressionVisitor extends kernel.RecursiveVisitor<void> {
+  bool result = false;
+
+  @override
+  void visitInvalidExpression(kernel.InvalidExpression node) {
+    result = true;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 6cfa78a..a1ee440 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -1425,7 +1425,7 @@
   /// [covariantInterfaces] that may allow those members to be called in an
   /// unsound way.
   ///
-  /// See [_findCovariantChecksForMember] for more information and an exmaple.
+  /// See [_findCovariantChecksForMember] for more information and an example.
   Set<Element> _findCovariantChecks(Iterable<ExecutableElement> members,
       Iterable<ClassElement> covariantInterfaces,
       [Set<Element> covariantChecks]) {
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 7ffb604..28e878d 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -112,6 +112,13 @@
     await super.test_fieldFormalParameterNotAssignableToField_typedef();
   }
 
+  @override
+  @failingTest
+  test_fieldFormalParameterAssignableToField_typeSubstitution() {
+    // Bad state: Not found #lib1::A::T in null
+    return super.test_fieldFormalParameterAssignableToField_typeSubstitution();
+  }
+
   @failingTest
   @override
   test_fieldInitializerNotAssignable() async {
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index e3f152c..814034c 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -115,21 +115,24 @@
   @override
   @failingTest
   test_conflictingConstructorNameAndMember_field() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, found 0
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONFLICTS_WITH_MEMBER, found 0
     await super.test_conflictingConstructorNameAndMember_field();
   }
 
   @override
   @failingTest
   test_conflictingConstructorNameAndMember_getter() async {
-    // Bad state: No type information for 42 at 25
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONFLICTS_WITH_MEMBER, found 0
     await super.test_conflictingConstructorNameAndMember_getter();
   }
 
   @override
   @failingTest
   test_conflictingConstructorNameAndMember_method() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, found 0
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONFLICTS_WITH_MEMBER, found 0
     await super.test_conflictingConstructorNameAndMember_method();
   }
 
@@ -150,69 +153,7 @@
 
   @override
   @failingTest
-  test_conflictingGetterAndMethod_field_method() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, found 0
-    await super.test_conflictingGetterAndMethod_field_method();
-  }
-
-  @override
-  @failingTest
-  test_conflictingGetterAndMethod_getter_method() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, found 0
-    await super.test_conflictingGetterAndMethod_getter_method();
-  }
-
-  @override
-  @failingTest
-  test_conflictingGetterAndMethod_method_field() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, found 0
-    await super.test_conflictingGetterAndMethod_method_field();
-  }
-
-  @override
-  @failingTest
-  test_conflictingGetterAndMethod_method_getter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, found 0
-    await super.test_conflictingGetterAndMethod_method_getter();
-  }
-
-  @override
-  @failingTest
-  test_conflictingTypeVariableAndClass() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, found 0
-    await super.test_conflictingTypeVariableAndClass();
-  }
-
-  @override
-  @failingTest
-  test_conflictingTypeVariableAndMember_field() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
-    await super.test_conflictingTypeVariableAndMember_field();
-  }
-
-  @override
-  @failingTest
-  test_conflictingTypeVariableAndMember_getter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
-    await super.test_conflictingTypeVariableAndMember_getter();
-  }
-
-  @override
-  @failingTest
-  test_conflictingTypeVariableAndMember_method() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
-    await super.test_conflictingTypeVariableAndMember_method();
-  }
-
-  @override
-  @failingTest
-  test_conflictingTypeVariableAndMember_method_static() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
-    await super.test_conflictingTypeVariableAndMember_method_static();
-  }
-
-  @override
-  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33827')
   test_conflictingTypeVariableAndMember_setter() async {
     // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
     await super.test_conflictingTypeVariableAndMember_setter();
@@ -226,6 +167,13 @@
 
   @override
   @failingTest
+  test_constConstructor_redirect_generic() {
+    // Bad state: Not found #lib4::A::T in null
+    return super.test_constConstructor_redirect_generic();
+  }
+
+  @override
+  @failingTest
   test_constConstructorWithFieldInitializedByNonConst() async {
     // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST, found 0;
     //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
@@ -643,13 +591,6 @@
 
   @override
   @failingTest
-  test_duplicateDefinition_catch() async {
-    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
-    await super.test_duplicateDefinition_catch();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
   test_duplicateDefinition_classMembers_fields() async {
     return super.test_duplicateDefinition_classMembers_fields();
@@ -678,13 +619,6 @@
 
   @override
   @failingTest
-  test_duplicateDefinition_parameters_inLocalFunction() async {
-    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
-    await super.test_duplicateDefinition_parameters_inLocalFunction();
-  }
-
-  @override
-  @failingTest
   test_duplicateDefinitionInheritance_instanceGetter_staticGetter() async {
     // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
     await super
@@ -804,13 +738,6 @@
 
   @override
   @failingTest
-  test_extraPositionalArguments_const() async {
-    // Bad state: No type information for A at 42
-    await super.test_extraPositionalArguments_const();
-  }
-
-  @override
-  @failingTest
   test_extraPositionalArguments_const_super() async {
     // Bad state: No type information for 0 at 65
     await super.test_extraPositionalArguments_const_super();
@@ -839,34 +766,6 @@
 
   @override
   @failingTest
-  test_fieldInitializedByMultipleInitializers() async {
-    // Bad state: No reference information for = at 36
-    await super.test_fieldInitializedByMultipleInitializers();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializedByMultipleInitializers_multipleInits() async {
-    // Bad state: No reference information for = at 36
-    await super.test_fieldInitializedByMultipleInitializers_multipleInits();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializedByMultipleInitializers_multipleNames() async {
-    // Bad state: Expected element reference for analyzer offset 45; got one for kernel offset 52
-    await super.test_fieldInitializedByMultipleInitializers_multipleNames();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializedInParameterAndInitializer() async {
-    // Bad state: No reference information for = at 35
-    await super.test_fieldInitializedInParameterAndInitializer();
-  }
-
-  @override
-  @failingTest
   test_fieldInitializerFactoryConstructor() async {
     // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, found 0
     await super.test_fieldInitializerFactoryConstructor();
@@ -904,36 +803,6 @@
 
   @override
   @failingTest
-  test_finalInitializedMultipleTimes_initializers() async {
-    // Bad state: No reference information for = at 38
-    await super.test_finalInitializedMultipleTimes_initializers();
-  }
-
-  @override
-  @failingTest
-  test_finalInitializedMultipleTimes_initializingFormal_initializer() async {
-    // Bad state: No reference information for = at 37
-    await super
-        .test_finalInitializedMultipleTimes_initializingFormal_initializer();
-  }
-
-  @override
-  @failingTest
-  test_finalInitializedMultipleTimes_initializingFormals() async {
-    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0;
-    //          1 errors of type CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, found 0
-    await super.test_finalInitializedMultipleTimes_initializingFormals();
-  }
-
-  @override
-  @failingTest
-  test_finalNotInitialized_local_const() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_NOT_INITIALIZED, found 0
-    await super.test_finalNotInitialized_local_const();
-  }
-
-  @override
-  @failingTest
   test_fromEnvironment_bool_badArgs() async {
     // Expected 2 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0;
     //          2 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
@@ -972,6 +841,27 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_inference_function() async {
+    await super.test_genericFunctionTypeArgument_inference_function();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_inference_functionType() async {
+    await super.test_genericFunctionTypeArgument_inference_functionType();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_inference_method() async {
+    await super.test_genericFunctionTypeArgument_inference_method();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
   test_genericFunctionTypeArgument_method() async {
     await super.test_genericFunctionTypeArgument_method();
   }
@@ -2193,13 +2083,6 @@
 
   @override
   @failingTest
-  test_notEnoughRequiredArguments_const() async {
-    // Bad state: No type information for A at 47
-    await super.test_notEnoughRequiredArguments_const();
-  }
-
-  @override
-  @failingTest
   test_optionalParameterInOperator_named() async {
     // Expected 1 errors of type CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, found 0
     await super.test_optionalParameterInOperator_named();
@@ -2815,13 +2698,6 @@
 
   @override
   @failingTest
-  test_undefinedNamedParameter() async {
-    // Bad state: No type information for A at 42
-    await super.test_undefinedNamedParameter();
-  }
-
-  @override
-  @failingTest
   test_uriDoesNotExist_export() async {
     // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
     await super.test_uriDoesNotExist_export();
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 18567fb..fb0d657 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -585,16 +585,6 @@
     verify([source]);
   }
 
-  test_builtInIdentifierAsType_dynamicMissingPrefix() async {
-    Source source = addSource(r"""
-import 'dart:core' as core;
-
-dynamic x;
-""");
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
-  }
-
   test_builtInIdentifierAsMixinName_classTypeAlias() async {
     Source source = addSource(r'''
 class A {}
@@ -621,6 +611,16 @@
     verify([source]);
   }
 
+  test_builtInIdentifierAsType_dynamicMissingPrefix() async {
+    Source source = addSource(r"""
+import 'dart:core' as core;
+
+dynamic x;
+""");
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+  }
+
   test_builtInIdentifierAsType_formalParameter_field() async {
     Source source = addSource(r'''
 class A {
@@ -731,7 +731,13 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR,
+                CompileTimeErrorCode.CONFLICTS_WITH_MEMBER
+              ]
+            : [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
     verify([source]);
   }
 
@@ -743,7 +749,13 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR,
+                CompileTimeErrorCode.CONFLICTS_WITH_MEMBER
+              ]
+            : [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
     verify([source]);
   }
 
@@ -755,7 +767,13 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.CONFLICTS_WITH_CONSTRUCTOR,
+                CompileTimeErrorCode.CONFLICTS_WITH_MEMBER
+              ]
+            : [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
     verify([source]);
   }
 
@@ -818,7 +836,11 @@
   m() {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.DECLARED_MEMBER_CONFLICTS_WITH_INHERITED]
+            : [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
     verify([source]);
   }
 
@@ -831,7 +853,11 @@
   m() {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.DECLARED_MEMBER_CONFLICTS_WITH_INHERITED]
+            : [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
     verify([source]);
   }
 
@@ -844,7 +870,11 @@
   int m;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.DECLARED_MEMBER_CONFLICTS_WITH_INHERITED]
+            : [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
 
@@ -857,7 +887,11 @@
   get m => 0;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.DECLARED_MEMBER_CONFLICTS_WITH_INHERITED]
+            : [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
 
@@ -2515,8 +2549,13 @@
   A() : x = 0, x = 1 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]
+            : [
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
+              ]);
     verify([source]);
   }
 
@@ -2527,10 +2566,17 @@
   A() : x = 0, x = 1, x = 2 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
+                CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES
+              ]
+            : [
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
+              ]);
     verify([source]);
   }
 
@@ -2542,10 +2588,17 @@
   A() : x = 0, x = 1, y = 0, y = 1 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
+                CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES
+              ]
+            : [
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
+              ]);
     verify([source]);
   }
 
@@ -2556,8 +2609,14 @@
   A(this.x) : x = 1 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]
+            : [
+                CompileTimeErrorCode
+                    .FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER
+              ]);
     verify([source]);
   }
 
@@ -2658,8 +2717,13 @@
   A() : x = 0, x = 0 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]
+            : [
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
+              ]);
     verify([source]);
   }
 
@@ -2678,8 +2742,14 @@
   A(this.x) : x = 0 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]
+            : [
+                CompileTimeErrorCode
+                    .FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER
+              ]);
     verify([source]);
   }
 
@@ -2788,41 +2858,32 @@
     verify([source]);
   }
 
-  @failingTest
   test_genericFunctionTypeArgument_inference_function() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
     Source source = addSource(r'''
-T f<T>(T) => null;
+T f<T>(T t) => null;
 main() { f(<S>(S s) => s); }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    assertErrors(source, [StrongModeCode.COULD_NOT_INFER]);
     verify([source]);
   }
 
-  @failingTest
   test_genericFunctionTypeArgument_inference_functionType() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
     Source source = addSource(r'''
 T Function<T>(T) f;
 main() { f(<S>(S s) => s); }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    assertErrors(source, [StrongModeCode.COULD_NOT_INFER]);
     verify([source]);
   }
 
-  @failingTest
   test_genericFunctionTypeArgument_inference_method() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
     Source source = addSource(r'''
 class C {
-  T f<T>(T) => null;
+  T f<T>(T t) => null;
 }
 main() { new C().f(<S>(S s) => s); }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    assertErrors(source, [StrongModeCode.COULD_NOT_INFER]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 119bbd9..af92fd6 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/declaration_resolver.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/dart.dart';
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index e668382..05e55e1 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -55,6 +55,21 @@
 
   @override
   @failingTest
+  test_argumentTypeNotAssignable_fieldFormalParameterElement_member() {
+    // Bad state: Not found #lib1::TimestampedObject::E in null
+    return super
+        .test_argumentTypeNotAssignable_fieldFormalParameterElement_member();
+  }
+
+  @override
+  @failingTest
+  test_argumentTypeNotAssignable_optionalNew() {
+    // NoSuchMethodError: The method 'encloseElement' was called on null.
+    return super.test_argumentTypeNotAssignable_optionalNew();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
@@ -192,16 +207,16 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
-  test_invocationOfNonFunction_Object() async {
-    return super.test_invocationOfNonFunction_Object();
+  test_invocationOfNonFunction_functionTypeTypeParameter() {
+    // Bad state: Not found #lib2::C::T in null
+    return super.test_invocationOfNonFunction_functionTypeTypeParameter();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_loadLibraryDefined() async {
-    return super.test_loadLibraryDefined();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_invocationOfNonFunction_Object() async {
+    return super.test_invocationOfNonFunction_Object();
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 19d4b8e..c47e992 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -2085,7 +2085,7 @@
   test_forEach_genericFunctionType() async {
     Source source = addSource(r'''
 main() {
-  for (Null Function<T>(T, Null) e in []) {
+  for (Null Function<T>(T, Null) e in <dynamic>[]) {
     e;
   }
 }''');
@@ -3570,6 +3570,32 @@
     verify([source]);
   }
 
+  Future test_issue32114() async {
+    addNamedSource('/a.dart', '''
+class O {}
+
+typedef T Func<T extends O>(T e);
+''');
+    addNamedSource('/b.dart', '''
+import 'a.dart';
+export 'a.dart' show Func;
+
+abstract class A<T extends O> {
+  Func<T> get func;
+}
+''');
+    final Source source = addSource('''
+import 'b.dart';
+
+class B extends A {
+  Func get func => (x) => x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_issue_24191() async {
     Source source = addSource('''
 import 'dart:async';
@@ -4940,6 +4966,21 @@
     verify([source]);
   }
 
+  test_parametricCallFunction() async {
+    Source source = addSource(r'''
+f() {
+  var c = new C();
+  c<String>().codeUnits;
+}
+
+class C {
+  T call<T>() => null;
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_prefixCollidesWithTopLevelMembers() async {
     addNamedSource("/lib.dart", r'''
 library lib;
@@ -6065,6 +6106,17 @@
     assertNoErrors(source);
   }
 
+  Future test_useDynamicWithPrefix() async {
+    final Source source = addSource('''
+import 'dart:core' as core;
+
+core.dynamic dynamicVariable;
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_wrongNumberOfParametersForOperator1() async {
     await _check_wrongNumberOfParametersForOperator1("<");
     await _check_wrongNumberOfParametersForOperator1(">");
@@ -6367,43 +6419,6 @@
     verify([source]);
   }
 
-  Future test_issue32114() async {
-    addNamedSource('/a.dart', '''
-class O {}
-
-typedef T Func<T extends O>(T e);
-''');
-    addNamedSource('/b.dart', '''
-import 'a.dart';
-export 'a.dart' show Func;
-
-abstract class A<T extends O> {
-  Func<T> get func;
-}
-''');
-    final Source source = addSource('''
-import 'b.dart';
-
-class B extends A {
-  Func get func => (x) => x;
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  Future test_useDynamicWithPrefix() async {
-    final Source source = addSource('''
-import 'dart:core' as core;
-
-core.dynamic dynamicVariable;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   Future<Null> _check_wrongNumberOfParametersForOperator(
       String name, String parameters) async {
     Source source = addSource("""
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index ede068d..82823cb 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -37,18 +37,12 @@
   bool get useCFE => true;
 
   @override
-  @failingTest
   test_overrideOnNonOverridingField_inInterface() {
-    // Expected 1 errors of type
-    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
     return super.test_overrideOnNonOverridingField_inInterface();
   }
 
   @override
-  @failingTest
   test_overrideOnNonOverridingField_inSuperclass() {
-    // Expected 1 errors of type
-    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
     return super.test_overrideOnNonOverridingField_inSuperclass();
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 9697a3c..daa3ac4 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -795,9 +795,9 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter() {
+  void endFunctionTypedFormalParameter(Token nameToken) {
     end('FunctionTypedFormalParameter');
-    super.endFunctionTypedFormalParameter();
+    super.endFunctionTypedFormalParameter(nameToken);
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 4ce0687..21c4f38 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:front_end/src/fasta/scanner/abstract_scanner.dart';
-import 'package:front_end/src/scanner/scanner.dart' as fe;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -89,11 +88,6 @@
   bool get usingFastaParser;
 
   /**
-   * Flag indicating whether the fasta scanner is being used.
-   */
-  bool get usingFastaScanner;
-
-  /**
    * Assert that the number and codes of errors occurred during parsing is the
    * same as the [expectedErrorCodes].
    */
@@ -2593,7 +2587,7 @@
             expectedError(
                 CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, 10, 8),
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 19, 1),
-            expectedError(ParserErrorCode.EXPECTED_TOKEN, 21, 4)
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 19, 1)
           ]
         : [
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 0),
@@ -3075,11 +3069,11 @@
             ? [
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 9, 5),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 5),
                 expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 15, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 17, 5),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 23, 1)
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 5)
               ]
             : [
                 expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 15, 1),
@@ -3097,7 +3091,7 @@
                 expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 10, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 12, 5),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 1)
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 5)
               ]
             : [
                 expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 10, 1),
@@ -3137,11 +3131,11 @@
             ? [
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 5),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 5),
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 8, 5),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 13, 0),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 5),
               ]
             : [
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
@@ -3178,7 +3172,7 @@
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 2, 5),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 0),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 2, 5),
               ]
             : [
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 1),
@@ -3193,19 +3187,16 @@
             ? [
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 1),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 1, 0)
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 1)
               ]
             : [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 1)]);
   }
 
   void test_expectedInterpolationIdentifier() {
     StringLiteral literal = parseExpression("'\$x\$'", errors: [
-      fe.Scanner.useFasta
-          ? (usingFastaParser
-              ? expectedError(
-                  ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 4, 1)
-              : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 4, 1))
-          : expectedError(ParserErrorCode.MISSING_IDENTIFIER, 3, 1)
+      usingFastaParser
+          ? expectedError(ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 4, 1)
+          : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 4, 1)
     ]);
     expectNotNullIfNoErrors(literal);
   }
@@ -3214,15 +3205,11 @@
     // The scanner inserts an empty string token between the two $'s; we need to
     // make sure that the MISSING_IDENTIFIER error that is generated has a
     // nonzero width so that it will show up in the editor UI.
-    StringLiteral literal = parseExpression("'\$\$foo'",
-        errors: fe.Scanner.useFasta
-            ? [
-                (usingFastaParser
-                    ? expectedError(
-                        ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 2, 1)
-                    : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1))
-              ]
-            : [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 2, 1)]);
+    StringLiteral literal = parseExpression("'\$\$foo'", errors: [
+      usingFastaParser
+          ? expectedError(ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 2, 1)
+          : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)
+    ]);
     expectNotNullIfNoErrors(literal);
   }
 
@@ -3827,7 +3814,7 @@
       // TODO(danrubel): Investigate better recovery.
       ExpressionStatement statement = result;
       listener
-          .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 4, 1)]);
+          .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 3)]);
       expect(statement.expression.toSource(), 'get');
     } else {
       FunctionDeclarationStatement statement = result;
@@ -3842,7 +3829,7 @@
     // Fasta considers `get` to be an identifier in this situation.
     parseStatement("int get x { return _x; }", expectedEndOffset: 8);
     listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1)]
+        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 4, 3)]
         : [expectedError(ParserErrorCode.GETTER_IN_FUNCTION, 4, 3)]);
   }
 
@@ -3850,7 +3837,7 @@
     // Fasta considers `get` to be an identifier in this situation.
     parseStatement("get x => _x;", expectedEndOffset: 4);
     listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 4, 1)]
+        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 3)]
         : [expectedError(ParserErrorCode.GETTER_IN_FUNCTION, 0, 3)]);
   }
 
@@ -3858,7 +3845,7 @@
     // Fasta considers `get` to be an identifier in this situation.
     parseStatement("int get x => _x;", expectedEndOffset: 8);
     listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1)]
+        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 4, 3)]
         : [expectedError(ParserErrorCode.GETTER_IN_FUNCTION, 4, 3)]);
   }
 
@@ -3963,7 +3950,7 @@
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(usingFastaParser
         ? [
-            expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1),
             expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1),
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1)
           ]
@@ -3979,9 +3966,9 @@
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(usingFastaParser
         ? [
-            expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1),
             expectedError(ParserErrorCode.MISSING_IDENTIFIER, 9, 1),
-            expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 1)
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 1)
           ]
         : [
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 5, 1),
@@ -4085,12 +4072,9 @@
 
   void test_invalidInterpolationIdentifier_startWithDigit() {
     StringLiteral literal = parseExpression("'\$1'", errors: [
-      fe.Scanner.useFasta
-          ? (usingFastaParser
-              ? expectedError(
-                  ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 2, 1)
-              : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1))
-          : expectedError(ParserErrorCode.MISSING_IDENTIFIER, 2, 1)
+      usingFastaParser
+          ? expectedError(ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 2, 1)
+          : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)
     ]);
     expectNotNullIfNoErrors(literal);
   }
@@ -4343,7 +4327,7 @@
   void test_localFunctionDeclarationModifier_factory() {
     parseCompilationUnit("class C { m() { factory f() {} } }",
         errors: usingFastaParser
-            ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 24, 1)]
+            ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 16, 7)]
             : [
                 expectedError(
                     ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, 16, 7)
@@ -4537,12 +4521,9 @@
     if (usingFastaParser) {
       // Fasta scanner reports missing `)` error
       listener.assertNoErrors();
-    } else if (fe.Scanner.useFasta) {
+    } else {
       listener.errors
           .contains(expectedError(ParserErrorCode.EXPECTED_TOKEN, 14, 1));
-    } else {
-      listener
-          .assertErrorsWithCodes([ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
     }
   }
 
@@ -4606,7 +4587,7 @@
     // error message is in this case.
     parseStatement("int f { return x;}", expectedEndOffset: 6);
     listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 1)]);
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 4, 1)]);
   }
 
   void test_missingFunctionParameters_local_nonVoid_expression() {
@@ -4622,7 +4603,7 @@
   void test_missingFunctionParameters_local_void_block() {
     parseStatement("void f { return x;}", expectedEndOffset: 7);
     listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]
+        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 5, 1)]
         : [expectedError(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 5, 1)]);
   }
 
@@ -4676,7 +4657,7 @@
         ? [
             expectedError(
                 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 3),
-            expectedError(ParserErrorCode.EXPECTED_TOKEN, 3, 1)
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 3)
           ]
         : [
             expectedError(ParserErrorCode.MISSING_IDENTIFIER, 3, 1),
@@ -4902,26 +4883,16 @@
     createParser('(a, {b: 0)');
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
-    if (fe.Scanner.useFasta) {
-      listener
-          .assertErrors([expectedError(ScannerErrorCode.EXPECTED_TOKEN, 9, 1)]);
-    } else {
-      listener.assertErrorsWithCodes(
-          [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
-    }
+    listener
+        .assertErrors([expectedError(ScannerErrorCode.EXPECTED_TOKEN, 9, 1)]);
   }
 
   void test_missingTerminatorForParameterGroup_optional() {
     createParser('(a, [b = 0)');
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
-    if (fe.Scanner.useFasta) {
-      listener.assertErrors(
-          [expectedError(ScannerErrorCode.EXPECTED_TOKEN, 10, 1)]);
-    } else {
-      listener.assertErrorsWithCodes(
-          [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
-    }
+    listener
+        .assertErrors([expectedError(ScannerErrorCode.EXPECTED_TOKEN, 10, 1)]);
   }
 
   void test_missingTypedefParameters_nonVoid() {
@@ -5388,28 +5359,18 @@
                 ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.EXPECTED_TOKEN
               ]
-            : fe.Scanner.useFasta
-                ? [
-                    ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-                    ScannerErrorCode.EXPECTED_TOKEN,
-                    ScannerErrorCode.EXPECTED_TOKEN,
-                    ScannerErrorCode.EXPECTED_TOKEN,
-                    ScannerErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.UNEXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_EXECUTABLE,
-                  ]
-                : [
-                    ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                    ParserErrorCode.EXPECTED_TOKEN,
-                  ]);
+            : [
+                ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+                ScannerErrorCode.EXPECTED_TOKEN,
+                ScannerErrorCode.EXPECTED_TOKEN,
+                ScannerErrorCode.EXPECTED_TOKEN,
+                ScannerErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_EXECUTABLE,
+              ]);
   }
 
   void test_switchCase_missingColon() {
@@ -5556,7 +5517,7 @@
 ''',
         errors: usingFastaParser
             ? [
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 51, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 49, 1),
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 51, 1),
               ]
             : [
@@ -5617,7 +5578,7 @@
   void test_unexpectedToken_endOfFieldDeclarationStatement() {
     parseStatement("String s = (null));", expectedEndOffset: 17);
     listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)]
+        ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 16, 1)]
         : [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 17, 1)]);
   }
 
@@ -5665,10 +5626,8 @@
 void main() {
   var x = "''', errors: [
       expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 24, 1),
-      fe.Scanner.useFasta
-          ? expectedError(ScannerErrorCode.EXPECTED_TOKEN, 25, 1)
-          : expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 1),
-      expectedError(ParserErrorCode.EXPECTED_TOKEN, 25, 0)
+      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 25, 1),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 24, 1)
     ]);
   }
 
@@ -5695,15 +5654,11 @@
 void main() {
   var x = """''', codes: [
       ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-      fe.Scanner.useFasta
-          ? ScannerErrorCode.EXPECTED_TOKEN
-          : ParserErrorCode.EXPECTED_TOKEN,
+      ScannerErrorCode.EXPECTED_TOKEN,
       ParserErrorCode.EXPECTED_TOKEN
     ], errors: [
       expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 24, 1),
-      fe.Scanner.useFasta
-          ? expectedError(ScannerErrorCode.EXPECTED_TOKEN, 30, 0)
-          : expectedError(ParserErrorCode.EXPECTED_TOKEN, 30, 0),
+      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 30, 0),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 30, 0)
     ]);
   }
@@ -5717,15 +5672,11 @@
 void main() {
   var x = """"''', codes: [
       ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-      fe.Scanner.useFasta
-          ? ScannerErrorCode.EXPECTED_TOKEN
-          : ParserErrorCode.EXPECTED_TOKEN,
+      ScannerErrorCode.EXPECTED_TOKEN,
       ParserErrorCode.EXPECTED_TOKEN
     ], errors: [
       expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 24, 1),
-      fe.Scanner.useFasta
-          ? expectedError(ScannerErrorCode.EXPECTED_TOKEN, 31, 0)
-          : expectedError(ParserErrorCode.EXPECTED_TOKEN, 31, 0),
+      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 31, 0),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 31, 0)
     ]);
   }
@@ -5739,15 +5690,11 @@
 void main() {
   var x = """""''', codes: [
       ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-      fe.Scanner.useFasta
-          ? ScannerErrorCode.EXPECTED_TOKEN
-          : ParserErrorCode.EXPECTED_TOKEN,
+      ScannerErrorCode.EXPECTED_TOKEN,
       ParserErrorCode.EXPECTED_TOKEN
     ], errors: [
       expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 28, 1),
-      fe.Scanner.useFasta
-          ? expectedError(ScannerErrorCode.EXPECTED_TOKEN, 32, 0)
-          : expectedError(ParserErrorCode.EXPECTED_TOKEN, 32, 0),
+      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 32, 0),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 32, 0)
     ]);
   }
@@ -10550,8 +10497,6 @@
  * Intended to be mixed in to parser test case classes.
  */
 class ParserTestHelpers {
-  bool get usingFastaScanner => fe.Scanner.useFasta;
-
   void expectCommentText(Comment comment, String expectedText) {
     expect(comment.beginToken, same(comment.endToken));
     expect(comment.beginToken.lexeme, expectedText);
@@ -11283,7 +11228,7 @@
             ? [
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 6),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 0)
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 6)
               ]
             : [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 6)]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
@@ -11529,9 +11474,8 @@
   void test_incompleteForEach() {
     ForStatement statement = parseStatement('for (String item i) {}');
     listener.assertErrors([
-      expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1),
-      expectedError(
-          ParserErrorCode.EXPECTED_TOKEN, usingFastaParser ? 18 : 17, 1)
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 4),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)
     ]);
     expect(statement, new TypeMatcher<ForStatement>());
     expect(statement.toSource(), 'for (String item; i;) {}');
@@ -11544,7 +11488,7 @@
   void test_incompleteLocalVariable_atTheEndOfBlock() {
     Statement statement = parseStatement('String v }', expectedEndOffset: 9);
     listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 1)]);
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
     expect(statement, new TypeMatcher<VariableDeclarationStatement>());
     expect(statement.toSource(), 'String v;');
   }
@@ -11563,7 +11507,7 @@
     Statement statement =
         parseStatement('String v String v2;', expectedEndOffset: 9);
     listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 6)]);
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
     expect(statement, new TypeMatcher<VariableDeclarationStatement>());
     expect(statement.toSource(), 'String v;');
   }
@@ -11572,7 +11516,7 @@
     Statement statement =
         parseStatement('String v if (true) {}', expectedEndOffset: 9);
     listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 2)]);
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
     expect(statement, new TypeMatcher<VariableDeclarationStatement>());
     expect(statement.toSource(), 'String v;');
   }
@@ -11580,7 +11524,7 @@
   void test_incompleteLocalVariable_beforeNextBlock() {
     Statement statement = parseStatement('String v {}', expectedEndOffset: 9);
     listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 1)]);
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
     expect(statement, new TypeMatcher<VariableDeclarationStatement>());
     expect(statement.toSource(), 'String v;');
   }
@@ -11589,7 +11533,7 @@
     Statement statement =
         parseStatement('List<String> v {}', expectedEndOffset: 15);
     listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 15, 1)]);
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 13, 1)]);
     expect(statement, new TypeMatcher<VariableDeclarationStatement>());
     expect(statement.toSource(), 'List<String> v;');
   }
@@ -12045,7 +11989,7 @@
                 expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 4),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 7, 4),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 4),
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 11, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 12, 2)
@@ -13159,11 +13103,7 @@
     createParser('{');
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
-    listener.assertErrorsWithCodes([
-      fe.Scanner.useFasta
-          ? ScannerErrorCode.EXPECTED_TOKEN
-          : ParserErrorCode.EXPECTED_TOKEN
-    ]);
+    listener.assertErrorsWithCodes([ScannerErrorCode.EXPECTED_TOKEN]);
     expect(functionBody, new TypeMatcher<EmptyFunctionBody>());
   }
 
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 0454057..7dfebb2 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:front_end/src/scanner/scanner.dart' as fe;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -131,8 +130,7 @@
     var token = scanner.tokenize();
     expect(token.lexeme, 'var');
     var lineStarts = scanner.lineStarts;
-    expect(
-        lineStarts, orderedEquals([0, 5, 7, 9, fe.Scanner.useFasta ? 12 : 11]));
+    expect(lineStarts, orderedEquals([0, 5, 7, 9, 12]));
   }
 
   void test_translate_missing_closing_gt_error() {
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index fd5c686..408d787 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -43,76 +43,6 @@
 
   @override
   @failingTest
-  test_awaitForIn_declaredVariableWrongType() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
-    await super.test_awaitForIn_declaredVariableWrongType();
-  }
-
-  @override
-  @failingTest
-  test_awaitForIn_existingVariableWrongType() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
-    await super.test_awaitForIn_existingVariableWrongType();
-  }
-
-  @override
-  @failingTest
-  test_awaitForIn_notStream() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, found 0
-    await super.test_awaitForIn_notStream();
-  }
-
-  @override
-  @failingTest
-  test_expectedOneListTypeArgument() async {
-    // Bad state: Found 1 argument types for 2 type arguments
-    await super.test_expectedOneListTypeArgument();
-  }
-
-  @override
-  @failingTest
-  test_expectedTwoMapTypeArguments_one() async {
-    // Bad state: Found 2 argument types for 1 type arguments
-    await super.test_expectedTwoMapTypeArguments_one();
-  }
-
-  @override
-  @failingTest
-  test_expectedTwoMapTypeArguments_three() async {
-    // Bad state: Found 2 argument types for 3 type arguments
-    await super.test_expectedTwoMapTypeArguments_three();
-  }
-
-  @override
-  @failingTest
-  test_forIn_declaredVariableWrongType() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
-    await super.test_forIn_declaredVariableWrongType();
-  }
-
-  @override
-  @failingTest
-  test_forIn_existingVariableWrongType() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
-    await super.test_forIn_existingVariableWrongType();
-  }
-
-  @override
-  @failingTest
-  test_forIn_notIterable() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, found 0
-    await super.test_forIn_notIterable();
-  }
-
-  @override
-  @failingTest
-  test_forIn_typeBoundBad() async {
-    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
-    await super.test_forIn_typeBoundBad();
-  }
-
-  @override
-  @failingTest
   test_illegalAsyncGeneratorReturnType_function_nonStream() async {
     // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
     await super.test_illegalAsyncGeneratorReturnType_function_nonStream();
@@ -890,20 +820,6 @@
 
   @override
   @failingTest
-  test_wrongNumberOfTypeArguments_typeTest_tooFew() async {
-    // Bad state: Found 2 argument types for 1 type arguments
-    await super.test_wrongNumberOfTypeArguments_typeTest_tooFew();
-  }
-
-  @override
-  @failingTest
-  test_wrongNumberOfTypeArguments_typeTest_tooMany() async {
-    // Bad state: Found 1 argument types for 2 type arguments
-    await super.test_wrongNumberOfTypeArguments_typeTest_tooMany();
-  }
-
-  @override
-  @failingTest
   test_yield_async_to_basic_type() async {
     // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0;
     //          1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index 9d1f172..92bc27e 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -513,13 +513,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_fieldInitializedInInitializerAndDeclaration_final() async {
-    return super.test_fieldInitializedInInitializerAndDeclaration_final();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_fieldInitializerNotAssignable() async {
     return super.test_fieldInitializerNotAssignable();
   }
@@ -541,14 +534,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_finalInitializedInDeclarationAndConstructor_initializingFormal() async {
-    return super
-        .test_finalInitializedInDeclarationAndConstructor_initializingFormal();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
   test_finalNotInitialized_inConstructor_1() async {
     return super.test_finalNotInitialized_inConstructor_1();
@@ -584,13 +569,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_finalNotInitialized_local_final() async {
-    return super.test_finalNotInitialized_local_final();
-  }
-
-  @override
-  @failingTest
   test_generalizedVoid_invocationOfVoidFieldError() async {
     return super.test_generalizedVoid_invocationOfVoidFieldError();
   }
@@ -1264,6 +1242,13 @@
 
   @override
   @failingTest
+  test_notAType() {
+    // Bad state: No data for f at 18 in /test.dart
+    return super.test_notAType();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_notEnoughRequiredArguments() async {
     return super.test_notEnoughRequiredArguments();
@@ -1411,6 +1396,27 @@
 
   @override
   @failingTest
+  test_typeAnnotationDeferredClass_asExpression() {
+    // Bad state: No data for A at 68 in /lib2.dart
+    return super.test_typeAnnotationDeferredClass_asExpression();
+  }
+
+  @override
+  @failingTest
+  test_typeAnnotationDeferredClass_catchClause() {
+    // Bad state: No data for A at 76 in /lib2.dart
+    return super.test_typeAnnotationDeferredClass_catchClause();
+  }
+
+  @override
+  @failingTest
+  test_typeAnnotationDeferredClass_fieldFormalParameter() {
+    // Bad state: No data for A at 73 in /lib2.dart
+    return super.test_typeAnnotationDeferredClass_fieldFormalParameter();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_typeAnnotationDeferredClass_functionDeclaration_returnType() async {
     return super
@@ -1419,6 +1425,21 @@
 
   @override
   @failingTest
+  test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
+    // Bad state: No data for A at 52 in /lib2.dart
+    return super
+        .test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType();
+  }
+
+  @override
+  @failingTest
+  test_typeAnnotationDeferredClass_isExpression() {
+    // Bad state: No data for A at 77 in /lib2.dart
+    return super.test_typeAnnotationDeferredClass_isExpression();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_typeAnnotationDeferredClass_methodDeclaration_returnType() async {
     return super
@@ -1427,6 +1448,13 @@
 
   @override
   @failingTest
+  test_typeAnnotationDeferredClass_simpleFormalParameter() {
+    // Bad state: No data for A at 52 in /lib2.dart
+    return super.test_typeAnnotationDeferredClass_simpleFormalParameter();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_typeAnnotationDeferredClass_typeParameter_bound() async {
     return super.test_typeAnnotationDeferredClass_typeParameter_bound();
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index b216684..222f88e 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -1339,8 +1339,14 @@
   A() : x = 1 {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]
+            : [
+                StaticWarningCode
+                    .FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION
+              ]);
     verify([source]);
   }
 
@@ -1402,8 +1408,14 @@
   A(this.x) {}
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source,
-        [StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
+    assertErrors(
+        source,
+        useCFE
+            ? [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]
+            : [
+                StaticWarningCode
+                    .FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
+              ]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 174f423..982bea1 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -266,12 +266,6 @@
   bool get useCFE => true;
 
   @override
-  test_futureOr_promotion3() async {
-    // Test passes even though the overridden method fails.
-    await super.test_futureOr_promotion3();
-  }
-
-  @override
   @failingTest
   test_genericFunction_parameter() async {
     // Failed to resolve 1 nodes:
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
index ed684ec..54d7673 100644
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ b/pkg/analyzer/test/src/context/mock_sdk.dart
@@ -157,6 +157,7 @@
   bool get isEmpty => false;
   bool get isNotEmpty => false;
   int get length => 0;
+  int codeUnitAt(int index);
   String substring(int len) => null;
   String toLowerCase();
   String toUpperCase();
@@ -310,6 +311,10 @@
 
 class Duration implements Comparable<Duration> {}
 
+class Exception {
+  factory Exception([var message]);
+}
+
 external bool identical(Object a, Object b);
 
 void print(Object object) {}
@@ -330,10 +335,6 @@
   external _throw(error);
 }
 
-class _DuplicatedFieldInitializerError {
-  _DuplicatedFieldInitializerError(String name);
-}
-
 class AbstractClassInstantiationError {
   AbstractClassInstantiationError(String className);
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index e62131b..026a055 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -156,6 +156,13 @@
     await super.test_getResult_doesNotExist();
   }
 
+  @override
+  @assertFailingTest
+  test_getResult_functionTypeFormalParameter_withTypeParameter() {
+    // Failed assertion: 'element != null': is not true.
+    return super.test_getResult_functionTypeFormalParameter_withTypeParameter();
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   @override
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index c7b5634..ed008ef 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -35,27 +35,42 @@
     await super.test_annotation_onFormalParameter_redirectingFactory();
   }
 
-  @failingTest
-  @override
-  test_annotation_onVariableList_topLevelVariable() =>
-      super.test_annotation_onVariableList_topLevelVariable();
-
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_closure_generic() async {
-    // Bad state: Not found T in main() → dynamic
-    // https://github.com/dart-lang/sdk/issues/33722
-    await super.test_closure_generic();
+  test_closure_generic() {
+    // Assertion error: 'element != null': is not true.
+    return super.test_closure_generic();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_local_function_generic() async {
-    // Bad state: Not found T in main() → void
-    // https://github.com/dart-lang/sdk/issues/33722
-    await super.test_local_function_generic();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33858')
+  test_invalid_fieldInitializer_this() async {
+    await super.test_invalid_fieldInitializer_this();
+  }
+
+  @override
+  @failingTest
+  test_local_type_parameter_reference_function_named_parameter_type() {
+    // Stack overflow
+    return super
+        .test_local_type_parameter_reference_function_named_parameter_type();
+  }
+
+  @override
+  @failingTest
+  test_local_type_parameter_reference_function_normal_parameter_type() {
+    // Stack overflow
+    return super
+        .test_local_type_parameter_reference_function_normal_parameter_type();
+  }
+
+  @override
+  @failingTest
+  test_local_type_parameter_reference_function_optional_parameter_type() {
+    // Stack overflow
+    return super
+        .test_local_type_parameter_reference_function_optional_parameter_type();
   }
 
   @override
@@ -89,48 +104,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_unresolved_instanceCreation_name_11() async {
-    await super.test_unresolved_instanceCreation_name_11();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_instanceCreation_name_21() async {
-    await super.test_unresolved_instanceCreation_name_21();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_instanceCreation_name_22() async {
-    await super.test_unresolved_instanceCreation_name_22();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_instanceCreation_name_31() async {
-    await super.test_unresolved_instanceCreation_name_31();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_instanceCreation_name_32() async {
-    await super.test_unresolved_instanceCreation_name_32();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_instanceCreation_name_33() async {
-    await super.test_unresolved_instanceCreation_name_33();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_unresolved_methodInvocation_noTarget() async {
     await super.test_unresolved_methodInvocation_noTarget();
   }
@@ -138,42 +111,9 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_unresolved_methodInvocation_target_resolved() async {
-    await super.test_unresolved_methodInvocation_target_resolved();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_unresolved_methodInvocation_target_unresolved() async {
     await super.test_unresolved_methodInvocation_target_unresolved();
   }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_postfix_operand() async {
-    // Bad state: No data for a at 11
-    await super.test_unresolved_postfix_operand();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_postfix_operator() async {
-//    Actual: 'dynamic'
-//    Which: is different.
-//    Expected: A
-    await super.test_unresolved_postfix_operator();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_unresolved_prefix_operand() async {
-    // Bad state: No data for a at 13
-    await super.test_unresolved_prefix_operand();
-  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 18d8fb2..4ff2e26 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -27,10 +27,14 @@
   });
 }
 
+final isBottomType = new TypeMatcher<BottomTypeImpl>();
+
 final isDynamicType = new TypeMatcher<DynamicTypeImpl>();
 
 final isUndefinedType = new TypeMatcher<UndefinedTypeImpl>();
 
+final isVoidType = new TypeMatcher<VoidTypeImpl>();
+
 /**
  * Integration tests for resolution.
  */
@@ -40,14 +44,24 @@
   FindNode findNode;
   FindElement findElement;
 
+  ClassElement get boolElement => typeProvider.boolType.element;
+
+  ClassElement get doubleElement => typeProvider.doubleType.element;
+
   InterfaceType get doubleType => typeProvider.doubleType;
 
+  DynamicTypeImpl get dynamicType => DynamicTypeImpl.instance;
+
+  ClassElement get intElement => typeProvider.intType.element;
+
   InterfaceType get intType => typeProvider.intType;
 
   ClassElement get mapElement => typeProvider.mapType.element;
 
   InterfaceType get mapType => typeProvider.mapType;
 
+  ClassElement get stringElement => typeProvider.stringType.element;
+
   TypeProvider get typeProvider => result.unit.element.context.typeProvider;
 
   void assertElement(Expression node, Element expected) {
@@ -60,6 +74,11 @@
     expect(actual, isNull);
   }
 
+  void assertInvokeType(InvocationExpression expression, String expected) {
+    DartType actual = expression.staticInvokeType;
+    expect(actual?.toString(), expected);
+  }
+
   void assertMember(
       Expression node, String expectedDefiningType, Element expectedBase) {
     Member actual = getNodeElement(node);
@@ -108,13 +127,11 @@
 
       SimpleIdentifier nameIdentifier = named.name.label;
       expect(nameIdentifier.staticElement, isNull);
-      if (useCFE) {
-        expect(nameIdentifier.staticType, isDynamicType);
-      }
+      expect(nameIdentifier.staticType, isNull);
 
-      SimpleIdentifier arg2Node = named.expression;
-      expect(arg2Node.staticElement, same(variable.getter));
-      expect(arg2Node.staticType, variable.type);
+      SimpleIdentifier expression = named.expression;
+      expect(expression.staticElement, same(variable.getter));
+      expect(expression.staticType, variable.type);
     };
   }
 
@@ -2243,6 +2260,135 @@
     }
   }
 
+  test_deferredImport_loadLibrary_invocation() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, '');
+    addTestFile(r'''
+import 'a.dart' deferred as a;
+main() {
+  a.loadLibrary();
+}
+
+''');
+    await resolveTestFile();
+    var import = findElement.import('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('loadLibrary');
+    assertType(invocation, 'Future<dynamic>');
+    assertInvokeType(invocation, '() → Future<dynamic>');
+
+    SimpleIdentifier target = invocation.target;
+    assertElement(target, import.prefix);
+    assertType(target, null);
+
+    var name = invocation.methodName;
+    assertElement(name, import.importedLibrary.loadLibraryFunction);
+    assertType(name, useCFE ? '() → Future<dynamic>' : null);
+  }
+
+  test_deferredImport_loadLibrary_invocation_argument() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, '');
+    addTestFile(r'''
+import 'a.dart' deferred as a;
+var b = 1;
+var c = 2;
+main() {
+  a.loadLibrary(b, c);
+}
+
+''');
+    await resolveTestFile();
+    var import = findElement.import('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('loadLibrary');
+    assertType(invocation, 'Future<dynamic>');
+    assertInvokeType(invocation, '() → Future<dynamic>');
+
+    SimpleIdentifier target = invocation.target;
+    assertElement(target, import.prefix);
+    assertType(target, null);
+
+    var name = invocation.methodName;
+    assertElement(name, import.importedLibrary.loadLibraryFunction);
+    assertType(name, useCFE ? '() → Future<dynamic>' : null);
+
+    var bRef = invocation.argumentList.arguments[0];
+    assertElement(bRef, findElement.topGet('b'));
+    assertType(bRef, 'int');
+
+    var cRef = invocation.argumentList.arguments[1];
+    assertElement(cRef, findElement.topGet('c'));
+    assertType(cRef, 'int');
+  }
+
+  test_deferredImport_loadLibrary_tearOff() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, '');
+    addTestFile(r'''
+import 'a.dart' deferred as a;
+main() {
+  a.loadLibrary;
+}
+
+''');
+    await resolveTestFile();
+    var import = findElement.import('package:test/a.dart');
+
+    var prefixed = findNode.prefixed('a.loadLibrary');
+    assertType(prefixed, '() → Future<dynamic>');
+
+    var prefix = prefixed.prefix;
+    assertElement(prefix, import.prefix);
+    assertType(prefix, null);
+
+    var identifier = prefixed.identifier;
+    assertElement(identifier, import.importedLibrary.loadLibraryFunction);
+    assertType(identifier, '() → Future<dynamic>');
+  }
+
+  test_deferredImport_variable() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, 'var v = 0;');
+    addTestFile(r'''
+import 'a.dart' deferred as a;
+main() async {
+  a.v;
+  a.v = 1;
+}
+
+''');
+    await resolveTestFile();
+    var import = findElement.import('package:test/a.dart');
+    TopLevelVariableElement v = (import.importedLibrary.publicNamespace.get('v')
+            as PropertyAccessorElement)
+        .variable;
+
+    {
+      var prefixed = findNode.prefixed('a.v;');
+      assertElement(prefixed, v.getter);
+      assertType(prefixed, 'int');
+
+      assertElement(prefixed.prefix, import.prefix);
+      assertType(prefixed.prefix, null);
+
+      assertElement(prefixed.identifier, v.getter);
+      assertType(prefixed.identifier, 'int');
+    }
+
+    {
+      var prefixed = findNode.prefixed('a.v = 1;');
+      assertElement(prefixed, v.setter);
+      assertType(prefixed, 'int');
+
+      assertElement(prefixed.prefix, import.prefix);
+      assertType(prefixed.prefix, null);
+
+      assertElement(prefixed.identifier, v.setter);
+      assertType(prefixed.identifier, 'int');
+    }
+  }
+
   test_enum_toString() async {
     addTestFile(r'''
 enum MyEnum { A, B, C }
@@ -2281,11 +2427,7 @@
 
     TypeName typeName = statement.variables.type;
     expect(typeName.type, isUndefinedType);
-    if (useCFE) {
-      expect(typeName.typeArguments.arguments[0].type, isUndefinedType);
-    } else {
-      expect(typeName.typeArguments.arguments[0].type, typeProvider.intType);
-    }
+    expect(typeName.typeArguments.arguments[0].type, typeProvider.intType);
 
     VariableDeclaration vNode = statement.variables.variables[0];
     expect(vNode.name.staticType, isUndefinedType);
@@ -3101,6 +3243,153 @@
     assertType(aRef, 'int');
   }
 
+  test_invalid_const_methodInvocation() async {
+    addTestFile(r'''
+const a = 'foo';
+const b = 0;
+const c = a.codeUnitAt(b);
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var invocation = findNode.methodInvocation('codeUnitAt');
+    assertType(invocation, 'int');
+    assertInvokeType(invocation, '(int) → int');
+    assertElement(invocation.methodName, stringElement.getMethod('codeUnitAt'));
+
+    var aRef = invocation.target;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'String');
+
+    var bRef = invocation.argumentList.arguments[0];
+    assertElement(bRef, findElement.topGet('b'));
+    assertType(bRef, 'int');
+  }
+
+  test_invalid_const_methodInvocation_static() async {
+    addTestFile(r'''
+const c = A.m();
+class A {
+  static int m() => 0;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var invocation = findNode.methodInvocation('m();');
+    assertType(invocation, 'int');
+    assertInvokeType(invocation, '() → int');
+    assertElement(invocation.methodName, findElement.method('m'));
+  }
+
+  test_invalid_const_methodInvocation_topLevelFunction() async {
+    addTestFile(r'''
+const id = identical;
+const a = 0;
+const b = 0;
+const c = id(a, b);
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var invocation = findNode.methodInvocation('id(');
+    assertType(invocation, 'bool');
+    assertInvokeType(invocation, '(Object, Object) → bool');
+    assertElement(invocation.methodName, findElement.topGet('id'));
+
+    var aRef = invocation.argumentList.arguments[0];
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+
+    var bRef = invocation.argumentList.arguments[1];
+    assertElement(bRef, findElement.topGet('b'));
+    assertType(bRef, 'int');
+  }
+
+  test_invalid_const_throw_local() async {
+    addTestFile(r'''
+main() {
+  const c = throw 42;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var throwExpression = findNode.throw_('throw 42;');
+    expect(throwExpression.staticType, isBottomType);
+    assertType(throwExpression.expression, 'int');
+  }
+
+  test_invalid_const_throw_topLevel() async {
+    addTestFile(r'''
+const c = throw 42;
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var throwExpression = findNode.throw_('throw 42;');
+    expect(throwExpression.staticType, isBottomType);
+    assertType(throwExpression.expression, 'int');
+  }
+
+  test_invalid_fieldInitializer_field() async {
+    addTestFile(r'''
+class C {
+  final int a = 0;
+  final int b = a + 1;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var aRef = findNode.simple('a + 1');
+    assertElement(aRef, findElement.getter('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_invalid_fieldInitializer_getter() async {
+    addTestFile(r'''
+class C {
+  int get a => 0;
+  final int b = a + 1;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var aRef = findNode.simple('a + 1');
+    assertElement(aRef, findElement.getter('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_invalid_fieldInitializer_method() async {
+    addTestFile(r'''
+class C {
+  int a() => 0;
+  final int b = a + 1;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var aRef = findNode.simple('a + 1');
+    assertElement(aRef, findElement.method('a'));
+    assertType(aRef, '() → int');
+  }
+
+  test_invalid_fieldInitializer_this() async {
+    addTestFile(r'''
+class C {
+  final b = this;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var thisRef = findNode.this_('this');
+    assertType(thisRef, 'C');
+  }
+
   test_invalid_instanceCreation_abstract() async {
     addTestFile(r'''
 abstract class C<T> {
@@ -3169,6 +3458,74 @@
     }
   }
 
+  test_invalid_instanceCreation_arguments_named() async {
+    addTestFile(r'''
+class C {
+  C();
+}
+var a = 0;
+main() {
+  new C(x: a);
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+    var classElement = findElement.class_('C');
+
+    var creation = findNode.instanceCreation('new C(x: a)');
+    _assertConstructorInvocation(creation, classElement);
+
+    NamedExpression argument = creation.argumentList.arguments[0];
+    assertElementNull(argument.name.label);
+    var aRef = argument.expression;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_invalid_instanceCreation_arguments_required_01() async {
+    addTestFile(r'''
+class C {
+  C();
+}
+var a = 0;
+main() {
+  new C(a);
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+    var classElement = findElement.class_('C');
+
+    var creation = findNode.instanceCreation('new C(a)');
+    _assertConstructorInvocation(creation, classElement);
+
+    var aRef = creation.argumentList.arguments[0];
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_invalid_instanceCreation_arguments_required_21() async {
+    addTestFile(r'''
+class C {
+  C(a, b);
+}
+var a = 0;
+main() {
+  new C(a);
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+    var classElement = findElement.class_('C');
+
+    var creation = findNode.instanceCreation('new C(a)');
+    _assertConstructorInvocation(creation, classElement);
+
+    var aRef = creation.argumentList.arguments[0];
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
   test_invalid_methodInvocation_simpleIdentifier() async {
     addTestFile(r'''
 int foo = 0;
@@ -3306,6 +3663,55 @@
     expect(breakStatement.label.staticType, isNull);
   }
 
+  test_listLiteral_01() async {
+    addTestFile(r'''
+main() {
+  var v = [];
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var literal = findNode.listLiteral('[];');
+    expect(literal.typeArguments, isNull);
+    assertType(literal, 'List<dynamic>');
+  }
+
+  test_listLiteral_02() async {
+    addTestFile(r'''
+main() {
+  var v = <>[];
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var literal = findNode.listLiteral('[];');
+    expect(literal.typeArguments, isNotNull);
+    assertType(literal, 'List<dynamic>');
+  }
+
+  test_listLiteral_2() async {
+    addTestFile(r'''
+main() {
+  var v = <int, double>[];
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var literal = findNode.listLiteral('<int, double>[]');
+    assertType(literal, 'List<dynamic>');
+
+    var intRef = findNode.simple('int, double');
+    assertElement(intRef, intElement);
+    assertType(intRef, 'int');
+
+    var doubleRef = findNode.simple('double>[]');
+    assertElement(doubleRef, doubleElement);
+    assertType(doubleRef, 'double');
+  }
+
   test_local_function() async {
     addTestFile(r'''
 void main() {
@@ -3687,6 +4093,32 @@
     }
   }
 
+  test_local_function_with_function_typed_parameter() async {
+    addTestFile('''
+class C {}
+class D {}
+class E {}
+void f() {
+  void g(C callback<T extends E>(D d)) {}
+}
+''');
+    await resolveTestFile();
+    var callback = findNode.simple('callback');
+    assertType(callback, '<T extends E>(D) → C');
+    var cReference = findNode.simple('C callback');
+    var cElement = findElement.class_('C');
+    assertType(cReference, 'C');
+    assertElement(cReference, cElement);
+    var dReference = findNode.simple('D d');
+    var dElement = findElement.class_('D');
+    assertType(dReference, 'D');
+    assertElement(dReference, dElement);
+    var eReference = findNode.simple('E>');
+    var eElement = findElement.class_('E');
+    assertType(eReference, 'E');
+    assertElement(eReference, eElement);
+  }
+
   test_local_parameter() async {
     String content = r'''
 void main(int p) {
@@ -3775,6 +4207,341 @@
     expect(bNode.staticType, typeProvider.doubleType);
   }
 
+  test_local_type_parameter_reference_as_expression() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    T;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var bodyStatement = body.block.statements[0] as ExpressionStatement;
+    var tReference = bodyStatement.expression as SimpleIdentifier;
+    assertElement(tReference, tElement);
+    assertType(tReference, 'Type');
+  }
+
+  test_local_type_parameter_reference_function_named_parameter_type() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    void Function({T t}) g = null;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as GenericFunctionType;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeParameterType =
+        gTypeType.namedParameterTypes['t'] as TypeParameterType;
+    expect(gTypeParameterType.element, same(tElement));
+    var gParameterType =
+        ((gType.parameters.parameters[0] as DefaultFormalParameter).parameter
+                as SimpleFormalParameter)
+            .type as TypeName;
+    var tReference = gParameterType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_function_normal_parameter_type() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    void Function(T) g = null;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as GenericFunctionType;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeParameterType =
+        gTypeType.normalParameterTypes[0] as TypeParameterType;
+    expect(gTypeParameterType.element, same(tElement));
+    var gParameterType =
+        (gType.parameters.parameters[0] as SimpleFormalParameter).type
+            as TypeName;
+    var tReference = gParameterType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_function_optional_parameter_type() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    void Function([T]) g = null;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as GenericFunctionType;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeParameterType =
+        gTypeType.optionalParameterTypes[0] as TypeParameterType;
+    expect(gTypeParameterType.element, same(tElement));
+    var gParameterType =
+        ((gType.parameters.parameters[0] as DefaultFormalParameter).parameter
+                as SimpleFormalParameter)
+            .type as TypeName;
+    var tReference = gParameterType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_function_return_type() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    T Function() g = () => x;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as GenericFunctionType;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeReturnType = gTypeType.returnType as TypeParameterType;
+    expect(gTypeReturnType.element, same(tElement));
+    var gReturnType = gType.returnType as TypeName;
+    var tReference = gReturnType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_interface_type_parameter() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    List<T> y = [x];
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var yDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var yType = yDeclaration.variables.type as TypeName;
+    var yTypeType = yType.type as InterfaceType;
+    var yTypeTypeArgument = yTypeType.typeArguments[0] as TypeParameterType;
+    expect(yTypeTypeArgument.element, same(tElement));
+    var yElementType = yType.typeArguments.arguments[0] as TypeName;
+    var tReference = yElementType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_simple() async {
+    addTestFile('''
+void main() {
+  void f<T>(T x) {
+    T y = x;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var yDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var yType = yDeclaration.variables.type as TypeName;
+    var tReference = yType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_typedef_named_parameter_type() async {
+    addTestFile('''
+typedef void Consumer<U>({U u});
+void main() {
+  void f<T>(T x) {
+    Consumer<T> g = null;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as TypeName;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeTypeArgument = gTypeType.typeArguments[0] as TypeParameterType;
+    expect(gTypeTypeArgument.element, same(tElement));
+    var gTypeParameterType =
+        gTypeType.namedParameterTypes['u'] as TypeParameterType;
+    expect(gTypeParameterType.element, same(tElement));
+    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var tReference = gArgumentType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_typedef_normal_parameter_type() async {
+    addTestFile('''
+typedef void Consumer<U>(U u);
+void main() {
+  void f<T>(T x) {
+    Consumer<T> g = null;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as TypeName;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeTypeArgument = gTypeType.typeArguments[0] as TypeParameterType;
+    expect(gTypeTypeArgument.element, same(tElement));
+    var gTypeParameterType =
+        gTypeType.normalParameterTypes[0] as TypeParameterType;
+    expect(gTypeParameterType.element, same(tElement));
+    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var tReference = gArgumentType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_typedef_optional_parameter_type() async {
+    addTestFile('''
+typedef void Consumer<U>([U u]);
+void main() {
+  void f<T>(T x) {
+    Consumer<T> g = null;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as TypeName;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeTypeArgument = gTypeType.typeArguments[0] as TypeParameterType;
+    expect(gTypeTypeArgument.element, same(tElement));
+    var gTypeParameterType =
+        gTypeType.optionalParameterTypes[0] as TypeParameterType;
+    expect(gTypeParameterType.element, same(tElement));
+    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var tReference = gArgumentType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
+  test_local_type_parameter_reference_typedef_return_type() async {
+    addTestFile('''
+typedef U Producer<U>();
+void main() {
+  void f<T>(T x) {
+    Producer<T> g = () => x;
+  }
+  f(1);
+}
+''');
+    await resolveTestFile();
+
+    var mainStatements = _getMainStatements(result);
+    var fDeclaration = mainStatements[0] as FunctionDeclarationStatement;
+    var fElement = fDeclaration.functionDeclaration.element;
+    var tElement = fElement.typeParameters[0];
+    var body = fDeclaration.functionDeclaration.functionExpression.body
+        as BlockFunctionBody;
+    var gDeclaration = body.block.statements[0] as VariableDeclarationStatement;
+    var gType = gDeclaration.variables.type as TypeName;
+    var gTypeType = gType.type as FunctionType;
+    var gTypeTypeArgument = gTypeType.typeArguments[0] as TypeParameterType;
+    expect(gTypeTypeArgument.element, same(tElement));
+    var gTypeReturnType = gTypeType.returnType as TypeParameterType;
+    expect(gTypeReturnType.element, same(tElement));
+    var gArgumentType = gType.typeArguments.arguments[0] as TypeName;
+    var tReference = gArgumentType.name;
+    assertElement(tReference, tElement);
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+  }
+
   test_local_variable() async {
     addTestFile(r'''
 void main() {
@@ -4111,6 +4878,48 @@
     }
   }
 
+  test_mapLiteral_1() async {
+    addTestFile(r'''
+main() {
+  var v = <int>{};
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var literal = findNode.mapLiteral('<int>{}');
+    assertType(literal, 'Map<dynamic, dynamic>');
+
+    var intRef = findNode.simple('int>{}');
+    assertElement(intRef, intElement);
+    assertType(intRef, 'int');
+  }
+
+  test_mapLiteral_3() async {
+    addTestFile(r'''
+main() {
+  var v = <bool, int, double>{};
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var literal = findNode.mapLiteral('<bool, int, double>{}');
+    assertType(literal, 'Map<dynamic, dynamic>');
+
+    var boolRef = findNode.simple('bool, ');
+    assertElement(boolRef, boolElement);
+    assertType(boolRef, 'bool');
+
+    var intRef = findNode.simple('int, ');
+    assertElement(intRef, intElement);
+    assertType(intRef, 'int');
+
+    var doubleRef = findNode.simple('double>');
+    assertElement(doubleRef, doubleElement);
+    assertType(doubleRef, 'double');
+  }
+
   test_method_namedParameters() async {
     addTestFile(r'''
 class C {
@@ -5233,6 +6042,22 @@
     }
   }
 
+  test_reference_to_class_type_parameter() async {
+    addTestFile('''
+class C<T> {
+  void f() {
+    T x;
+  }
+}
+''');
+    await resolveTestFile();
+    var tElement = findElement.class_('C').typeParameters[0];
+    var tReference = findNode.simple('T x');
+    var tReferenceType = tReference.staticType as TypeParameterType;
+    expect(tReferenceType.element, same(tElement));
+    assertElement(tReference, tElement);
+  }
+
   test_stringInterpolation() async {
     String content = r'''
 void main() {
@@ -6422,6 +7247,23 @@
     }
   }
 
+  test_type_dynamic() async {
+    addTestFile('''
+main() {
+  dynamic d;
+}
+''');
+    await resolveTestFile();
+    var statements = _getMainStatements(result);
+    var variableDeclarationStatement =
+        statements[0] as VariableDeclarationStatement;
+    var type = variableDeclarationStatement.variables.type as TypeName;
+    expect(type.type, isDynamicType);
+    var typeName = type.name;
+    assertTypeDynamic(typeName);
+    expect(typeName.staticElement, same(typeProvider.dynamicType.element));
+  }
+
   test_type_functionTypeAlias() async {
     addTestFile(r'''
 typedef T F<T>(bool a);
@@ -6457,6 +7299,23 @@
     _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
   }
 
+  test_type_void() async {
+    addTestFile('''
+main() {
+  void v;
+}
+''');
+    await resolveTestFile();
+    var statements = _getMainStatements(result);
+    var variableDeclarationStatement =
+        statements[0] as VariableDeclarationStatement;
+    var type = variableDeclarationStatement.variables.type as TypeName;
+    expect(type.type, isVoidType);
+    var typeName = type.name;
+    expect(typeName.staticType, isVoidType);
+    expect(typeName.staticElement, isNull);
+  }
+
   test_typeAnnotation_prefixed() async {
     var a = _p('/test/lib/a.dart');
     var b = _p('/test/lib/b.dart');
@@ -6970,14 +7829,12 @@
 
     SimpleIdentifier typePrefix = typePrefixed.prefix;
     expect(typePrefix.staticElement, isNull);
-    if (useCFE) {
-      expect(typePrefix.staticType, isDynamicType);
-    }
+    expect(typePrefix.staticType, isNull);
 
     SimpleIdentifier typeIdentifier = typePrefixed.identifier;
     expect(typeIdentifier.staticElement, isNull);
     if (useCFE) {
-      expect(typePrefix.staticType, isDynamicType);
+      expect(typeIdentifier.staticType, isDynamicType);
     }
 
     assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
@@ -7028,7 +7885,7 @@
     SimpleIdentifier typeIdentifier = typePrefixed.identifier;
     expect(typeIdentifier.staticElement, isNull);
     if (useCFE) {
-      expect(typePrefix.staticType, isDynamicType);
+      expect(typeIdentifier.staticType, isDynamicType);
     }
 
     assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
@@ -7069,20 +7926,16 @@
 
     SimpleIdentifier typePrefix = typePrefixed.prefix;
     expect(typePrefix.staticElement, isNull);
-    if (useCFE) {
-      expect(typePrefix.staticType, isDynamicType);
-    }
+    expect(typePrefix.staticType, isNull);
 
     SimpleIdentifier typeIdentifier = typePrefixed.identifier;
     expect(typeIdentifier.staticElement, isNull);
     if (useCFE) {
-      expect(typePrefix.staticType, isDynamicType);
+      expect(typeIdentifier.staticType, isDynamicType);
     }
 
     expect(constructorName.name.staticElement, isNull);
-    if (useCFE) {
-      expect(constructorName.name.staticType, isDynamicType);
-    }
+    expect(constructorName.name.staticType, isNull);
 
     assertTypeArguments(typeName.typeArguments, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
@@ -7132,7 +7985,7 @@
     SimpleIdentifier typeIdentifier = typePrefixed.identifier;
     expect(typeIdentifier.staticElement, isNull);
     if (useCFE) {
-      expect(typePrefix.staticType, isNull);
+      expect(typeIdentifier.staticType, isDynamicType);
     }
 
     expect(constructorName.name.staticElement, isNull);
@@ -7176,7 +8029,7 @@
 
     PrefixedIdentifier typePrefixed = typeName.name;
     expect(typePrefixed.staticElement, same(randomElement));
-    expect(typePrefixed.staticType, randomElement.type);
+    expect(typePrefixed.staticType, useCFE ? dynamicType : randomElement.type);
 
     SimpleIdentifier typePrefix = typePrefixed.prefix;
     expect(typePrefix.staticElement, same(foo));
@@ -7184,7 +8037,7 @@
 
     SimpleIdentifier typeIdentifier = typePrefixed.identifier;
     expect(typeIdentifier.staticElement, same(randomElement));
-    expect(typePrefix.staticType, isNull);
+    expect(typeIdentifier.staticType, useCFE ? dynamicType : null);
 
     expect(constructorName.name.staticElement, isNull);
     expect(constructorName.name.staticType, isNull);
@@ -7645,10 +8498,32 @@
       if (argument is NamedExpression) {
         SimpleIdentifier name = argument.name.label;
         expect(name.staticElement, same(actualParameter));
+        expect(name.staticType, isNull);
       }
     }
   }
 
+  /// Assert that the given [creation] creates instance of the [classElement].
+  /// Limitations: no import prefix, no type arguments, unnamed constructor.
+  void _assertConstructorInvocation(
+      InstanceCreationExpression creation, ClassElement classElement) {
+    assertType(creation, classElement.name);
+
+    var constructorName = creation.constructorName;
+    var constructorElement = classElement.unnamedConstructor;
+    expect(constructorName.staticElement, constructorElement);
+
+    var typeName = constructorName.type;
+    expect(typeName.typeArguments, isNull);
+
+    SimpleIdentifier typeIdentifier = typeName.name;
+    assertElement(typeIdentifier, classElement);
+    assertType(typeIdentifier, classElement.name);
+
+    // Only unnamed constructors are supported now.
+    expect(constructorName.name, isNull);
+  }
+
   void _assertDefaultParameter(
       DefaultFormalParameter node, ParameterElement element,
       {String name, int offset, ParameterKind kind, DartType type}) {
@@ -7790,6 +8665,23 @@
     fail('Not found class accessor: $name');
   }
 
+  ImportElement import(String targetUri) {
+    ImportElement importElement;
+    for (var import in unitElement.library.imports) {
+      var importedUri = import.importedLibrary.source.uri.toString();
+      if (importedUri == targetUri) {
+        if (importElement != null) {
+          throw new StateError('Not unique $targetUri import.');
+        }
+        importElement = import;
+      }
+    }
+    if (importElement != null) {
+      return importElement;
+    }
+    fail('Not found import: $targetUri');
+  }
+
   MethodElement method(String name) {
     for (var type in unitElement.types) {
       for (var method in type.methods) {
@@ -7873,6 +8765,14 @@
     return _node(search).getAncestor((n) => n is InstanceCreationExpression);
   }
 
+  ListLiteral listLiteral(String search) {
+    return _node(search).getAncestor((n) => n is ListLiteral);
+  }
+
+  MapLiteral mapLiteral(String search) {
+    return _node(search).getAncestor((n) => n is MapLiteral);
+  }
+
   MethodInvocation methodInvocation(String search) {
     return _node(search).getAncestor((n) => n is MethodInvocation);
   }
@@ -7893,6 +8793,10 @@
     return _node(search).getAncestor((n) => n is PrefixExpression);
   }
 
+  PrefixedIdentifier prefixed(String search) {
+    return _node(search).getAncestor((n) => n is PrefixedIdentifier);
+  }
+
   SimpleIdentifier simple(String search) {
     return _node(search);
   }
@@ -7901,6 +8805,18 @@
     return _node(search).getAncestor((n) => n is SimpleFormalParameter);
   }
 
+  SuperExpression super_(String search) {
+    return _node(search).getAncestor((n) => n is SuperExpression);
+  }
+
+  ThisExpression this_(String search) {
+    return _node(search).getAncestor((n) => n is ThisExpression);
+  }
+
+  ThrowExpression throw_(String search) {
+    return _node(search).getAncestor((n) => n is ThrowExpression);
+  }
+
   VariableDeclaration variableDeclaration(String search) {
     return _node(search).getAncestor((n) => n is VariableDeclaration);
   }
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index d3d9642..d79a662 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -822,11 +822,11 @@
   }
 
   test_isValidLiteral_hex_negative_equalMax() {
-    expect(IntegerLiteralImpl.isValidLiteral('0x7FFFFFFFFFFFFFFF', true), true);
+    expect(IntegerLiteralImpl.isValidLiteral('0x8000000000000000', true), true);
   }
 
   test_isValidLiteral_heX_negative_equalMax() {
-    expect(IntegerLiteralImpl.isValidLiteral('0X7FFFFFFFFFFFFFFF', true), true);
+    expect(IntegerLiteralImpl.isValidLiteral('0X8000000000000000', true), true);
   }
 
   test_isValidLiteral_hex_negative_fewDigits() {
@@ -857,14 +857,22 @@
         IntegerLiteralImpl.isValidLiteral('0X007FFFFFFFFFFFFFFF', true), true);
   }
 
+  test_isValidLiteral_hex_negative_oneBelowMax() {
+    expect(IntegerLiteralImpl.isValidLiteral('0x7FFFFFFFFFFFFFFF', true), true);
+  }
+
+  test_isValidLiteral_heX_negative_oneBelowMax() {
+    expect(IntegerLiteralImpl.isValidLiteral('0X7FFFFFFFFFFFFFFF', true), true);
+  }
+
   test_isValidLiteral_hex_negative_oneOverMax() {
     expect(
-        IntegerLiteralImpl.isValidLiteral('0x8000000000000000', true), false);
+        IntegerLiteralImpl.isValidLiteral('0x8000000000000001', true), false);
   }
 
   test_isValidLiteral_heX_negative_oneOverMax() {
     expect(
-        IntegerLiteralImpl.isValidLiteral('0X8000000000000000', true), false);
+        IntegerLiteralImpl.isValidLiteral('0X8000000000000001', true), false);
   }
 
   test_isValidLiteral_hex_negative_tooManyDigits() {
diff --git a/pkg/analyzer/test/src/summary/expr_builder_test.dart b/pkg/analyzer/test/src/summary/expr_builder_test.dart
index 4c755b9..c13b903 100644
--- a/pkg/analyzer/test/src/summary/expr_builder_test.dart
+++ b/pkg/analyzer/test/src/summary/expr_builder_test.dart
@@ -446,8 +446,7 @@
     checkSimpleExpression('({x}) => 0');
   }
 
-  @failingTest
-  void test_pushLocalFunctionReference_nested() {
+  void xtest_pushLocalFunctionReference_nested() {
     // TODO(devoncarew): This test fails when run in strong mode.
     // Failed assertion: line 5116 pos 16:
     //   'Linker._initializerTypeInferenceCycle == null': is not true.
@@ -472,8 +471,7 @@
     expect(yRef.staticElement, same(yElement));
   }
 
-  @failingTest
-  void test_pushLocalFunctionReference_paramReference() {
+  void xtest_pushLocalFunctionReference_paramReference() {
     // TODO(devoncarew): This test fails when run in strong mode.
     prepareAnalysisContext(new AnalysisOptionsImpl()..previewDart2 = false);
     var expr = checkSimpleExpression('(x, y) => x + y') as FunctionExpression;
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index d8994bb..50489a7 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -2537,11 +2537,9 @@
 int foo() => 42;
 ''', allowErrors: true);
     if (isSharedFrontEnd) {
-      // It is OK to keep non-constant initializers.
       checkElementText(library, r'''
 class C {
-  static const int f = 1 +
-        foo/*location: test.dart;foo*/();
+  static const int f = #invalidConst;
 }
 int foo() {}
 ''');
@@ -2605,10 +2603,8 @@
 int foo() => 42;
 ''', allowErrors: true);
     if (isSharedFrontEnd) {
-      // It is OK to keep non-constant initializers.
       checkElementText(library, r'''
-const int v = 1 +
-        foo/*location: test.dart;foo*/();
+const int v = #invalidConst;
 int foo() {}
 ''');
     } else if (isStrongMode) {
@@ -4247,6 +4243,23 @@
 ''');
   }
 
+  test_const_topLevel_throw() async {
+    shouldCompareLibraryElements = false;
+    var library = await checkLibrary(r'''
+const c = throw 42;
+''');
+    if (isSharedFrontEnd) {
+      checkElementText(library, r'''
+const dynamic c = #invalidConst;
+''');
+    } else {
+      // This is a bug.
+      checkElementText(library, r'''
+const dynamic c;
+''');
+    }
+  }
+
   test_const_topLevel_typedList() async {
     var library = await checkLibrary(r'''
 const vNull = const <Null>[];
@@ -4629,8 +4642,18 @@
 }
 int foo() => 42;
 ''', allowErrors: true);
-    // It is OK to keep non-constant initializers.
-    checkElementText(library, r'''
+    if (isSharedFrontEnd) {
+      checkElementText(library, r'''
+class C {
+  final dynamic x;
+  const C() :
+        x/*location: test.dart;C;x*/ = #invalidConst;
+}
+int foo() {}
+''');
+    } else {
+      // It is OK to keep non-constant initializers.
+      checkElementText(library, r'''
 class C {
   final dynamic x;
   const C() :
@@ -4639,6 +4662,7 @@
 }
 int foo() {}
 ''');
+    }
   }
 
   test_constructor_initializers_field_withParameter() async {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 2625f04..7954cdb 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -242,12 +242,6 @@
   }
 
   @failingTest
-  @potentialAnalyzerProblem
-  test_type_inference_based_on_loadLibrary() async {
-    await super.test_type_inference_based_on_loadLibrary();
-  }
-
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
   test_unresolved_annotation_instanceCreation_argument_super() async {
     await super.test_unresolved_annotation_instanceCreation_argument_super();
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index 3b90871..1ae7385 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -25,7 +25,6 @@
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/html.dart';
 import 'package:analyzer/src/task/strong/ast_properties.dart' as strong_ast;
-import 'package:front_end/src/scanner/scanner.dart' as fe;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -2988,12 +2987,8 @@
     _assertHasCore(outputs[IMPORTED_LIBRARIES], 2);
     expect(outputs[INCLUDED_PARTS], hasLength(1));
     expect(outputs[LIBRARY_SPECIFIC_UNITS], hasLength(2));
-    if (fe.Scanner.useFasta) {
-      // Missing closing brace error is reported by the Fasta scanner.
-      expect(outputs[PARSE_ERRORS], hasLength(0));
-    } else {
-      expect(outputs[PARSE_ERRORS], hasLength(1));
-    }
+    // Missing closing brace error is reported by the Fasta scanner.
+    expect(outputs[PARSE_ERRORS], hasLength(0));
     expect(outputs[PARSED_UNIT], isNotNull);
     expect(outputs[REFERENCED_SOURCES], hasLength(5));
     expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
@@ -4076,7 +4071,7 @@
     expect(outputs, hasLength(4));
     expect(outputs[LINE_INFO], isNotNull);
     // Missing closing brace error is reported by the Fasta scanner.
-    expect(outputs[SCAN_ERRORS], hasLength(fe.Scanner.useFasta ? 1 : 0));
+    expect(outputs[SCAN_ERRORS], hasLength(1));
     expect(outputs[TOKEN_STREAM], isNotNull);
     IgnoreInfo ignoreInfo = outputs[IGNORE_INFO];
     expect(ignoreInfo, isNotNull);
@@ -4114,12 +4109,8 @@
 
     computeResult(script, TOKEN_STREAM, matcher: isScanDartTask);
     expect(outputs[LINE_INFO], isNotNull);
-    if (fe.Scanner.useFasta) {
-      // Missing closing brace error is reported by Fasta scanner.
-      expect(outputs[SCAN_ERRORS], hasLength(1));
-    } else {
-      expect(outputs[SCAN_ERRORS], isEmpty);
-    }
+    // Missing closing brace error is reported by Fasta scanner.
+    expect(outputs[SCAN_ERRORS], hasLength(1));
     Token tokenStream = outputs[TOKEN_STREAM];
     expect(tokenStream, isNotNull);
     expect(tokenStream.lexeme, 'void');
diff --git a/pkg/analyzer_cli/analysis_options.yaml b/pkg/analyzer_cli/analysis_options.yaml
index 301f0e6..b8b8389 100644
--- a/pkg/analyzer_cli/analysis_options.yaml
+++ b/pkg/analyzer_cli/analysis_options.yaml
@@ -1,6 +1,6 @@
 analyzer:
   exclude:
-    - 'test/data'
+    - test/data/**
 linter:
   rules:
     #- annotate_overrides
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 74425a8..4607f06 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -347,8 +347,11 @@
                   file.createSource(), content, analysisDriver.sourceFactory);
           formatter.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
           for (AnalysisError error in errors) {
-            allResult = allResult.max(determineProcessedSeverity(
-                error, options, analysisDriver.analysisOptions));
+            ErrorSeverity severity = determineProcessedSeverity(
+                error, options, analysisDriver.analysisOptions);
+            if (severity != null) {
+              allResult = allResult.max(severity);
+            }
           }
         } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
           try {
@@ -363,8 +366,9 @@
               formatter
                   .formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
               for (AnalysisError error in errors) {
-                allResult = allResult.max(determineProcessedSeverity(
-                    error, options, analysisDriver.analysisOptions));
+                ErrorSeverity severity = determineProcessedSeverity(
+                    error, options, analysisDriver.analysisOptions);
+                allResult = allResult.max(severity);
               }
             }
           } catch (exception) {
@@ -542,6 +546,7 @@
             in directory.listSync(recursive: true, followLinks: false)) {
           String relative = path.relative(entry.path, from: directory.path);
           if (AnalysisEngine.isDartFileName(entry.path) &&
+              entry is io.File &&
               !pathFilter.ignored(entry.path) &&
               !_isInHiddenDir(relative)) {
             files.add(entry);
@@ -701,8 +706,8 @@
             'Unable to read package config data from $packageConfigPath: $e');
       }
     } else if (options.packageRootPath != null) {
-      packageMap = _PackageRootPackageMapBuilder
-          .buildPackageMap(options.packageRootPath);
+      packageMap = _PackageRootPackageMapBuilder.buildPackageMap(
+          options.packageRootPath);
     } else {
       file_system.Resource cwd = resourceProvider.getResource('.');
       // Look for .packages.
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 4943ea9..12abf44 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -1,10 +1,6 @@
 name: analyzer_cli
-version: 1.1.2
-author: Dart Team <misc@dartlang.org>
 description: Command line interface for the Dart Analyzer.
-homepage: https://github.com/dart-lang/analyzer_cli
-environment:
-  sdk: '>=1.12.0 <2.0.0'
+publish_to: none
 dependencies:
   analyzer: ^0.27.0
   args: '>=0.13.0 <2.0.0'
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
index 0756f1f..90655ef 100644
--- a/pkg/analyzer_cli/test/build_mode_test.dart
+++ b/pkg/analyzer_cli/test/build_mode_test.dart
@@ -134,11 +134,12 @@
 
   List<int> _serializeProto(GeneratedMessage message) {
     var buffer = message.writeToBuffer();
-
     var writer = new CodedBufferWriter();
     writer.writeInt32NoTag(buffer.length);
-    writer.writeRawBytes(buffer);
 
-    return writer.toBuffer();
+    List<int> result = [];
+    result.addAll(writer.toBuffer());
+    result.addAll(buffer);
+    return result;
   }
 }
diff --git a/pkg/analyzer_cli/test/data/analysis_options.yaml b/pkg/analyzer_cli/test/data/analysis_options.yaml
new file mode 100644
index 0000000..2cfcfa6
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/analysis_options.yaml
@@ -0,0 +1,2 @@
+# This empty analysis options file creates a new analysis context in order to
+# isolate the tests from the settings in //pkg/analyzer_cli/analysis_options.yaml.
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index e832287..ac524f9 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -692,14 +692,6 @@
 class ExitCodesTest_UseCFE extends ExitCodesTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_fatalWarnings() => callFailingTest(super.test_fatalWarnings);
-
-  @override
-  @failingTest
-  test_notFatalWarnings() => callFailingTest(super.test_notFatalWarnings);
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer_plugin/lib/channel/channel.dart b/pkg/analyzer_plugin/lib/channel/channel.dart
index a524811..92283b6 100644
--- a/pkg/analyzer_plugin/lib/channel/channel.dart
+++ b/pkg/analyzer_plugin/lib/channel/channel.dart
@@ -67,7 +67,7 @@
    */
   void listen(void onResponse(Response response),
       void onNotification(Notification notification),
-      {Function onError, void onDone()});
+      {void onError(dynamic error), void onDone()});
 
   /**
    * Send the given [request] to the plugin.
diff --git a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
index 2c4e8c7..0014a4c 100644
--- a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
+++ b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
@@ -228,7 +228,7 @@
   @override
   Future<Null> listen(void onResponse(Response response),
       void onNotification(Notification notification),
-      {Function onError, void onDone()}) async {
+      {void onError(dynamic error), void onDone()}) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (_isolate != null) {
diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
index 7d0fd23..a85fe85 100644
--- a/pkg/compiler/lib/compiler_new.dart
+++ b/pkg/compiler/lib/compiler_new.dart
@@ -13,7 +13,6 @@
 
 import 'compiler.dart' show Diagnostic;
 import 'src/apiimpl.dart';
-import 'src/library_loader.dart';
 import 'src/options.dart' show CompilerOptions;
 
 export 'compiler.dart' show Diagnostic, PackagesDiscoveryProvider;
@@ -134,6 +133,9 @@
   /// Use only for debugging and testing.
   final compiler;
 
+  /// Shared state between compilations.
+  ///
+  /// This is used to speed up batch mode.
   final fe.InitializedCompilerState kernelInitializedCompilerState;
 
   CompilationResult(this.compiler,
@@ -170,12 +172,9 @@
   CompilerImpl compiler = new CompilerImpl(
       compilerInput, compilerOutput, compilerDiagnostics, compilerOptions);
   return compiler.run(compilerOptions.entryPoint).then((bool success) {
-    if (compiler.libraryLoader is KernelLibraryLoaderTask) {
-      KernelLibraryLoaderTask loader = compiler.libraryLoader;
-      return new CompilationResult(compiler,
-          isSuccess: success,
-          kernelInitializedCompilerState: loader.initializedCompilerState);
-    }
-    return new CompilationResult(compiler, isSuccess: success);
+    return new CompilationResult(compiler,
+        isSuccess: success,
+        kernelInitializedCompilerState:
+            compiler.libraryLoader.initializedCompilerState);
   });
 }
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index f0ebe13..3d5e817 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -76,7 +76,7 @@
 
   api.CompilerOutput get outputProvider => _outputProvider;
 
-  Uri mainLibraryUri;
+  Uri _mainLibraryUri;
 
   JClosedWorld backendClosedWorldForTesting;
 
@@ -151,8 +151,8 @@
       _reporter = new CompilerDiagnosticReporter(this, options);
     }
     kernelFrontEndTask = new GenericTask('Front end', measurer);
-    frontendStrategy = new KernelFrontEndStrategy(kernelFrontEndTask, options,
-        reporter, environment, options.kernelInitializedCompilerState);
+    frontendStrategy = new KernelFrontEndStrategy(
+        kernelFrontEndTask, options, reporter, environment);
     backendStrategy = new KernelBackendStrategy(this);
     _impactCache = <Entity, WorldImpact>{};
     _impactCacheDeleter = new _MapImpactCacheDeleter(_impactCache);
@@ -166,7 +166,7 @@
 
     tasks = [
       libraryLoader =
-          frontendStrategy.createLibraryLoader(provider, reporter, measurer),
+          new LibraryLoaderTask(options, provider, reporter, measurer),
       kernelFrontEndTask,
       globalInference = new GlobalTypeInferenceTask(this),
       constants = backend.constantCompilerTask,
@@ -231,7 +231,10 @@
   /// The method returns a [Future] allowing for the loading of additional
   /// libraries.
   LoadedLibraries processLoadedLibraries(LoadedLibraries loadedLibraries) {
-    loadedLibraries.forEachLibrary((LibraryEntity library) {
+    frontendStrategy.registerLoadedLibraries(loadedLibraries);
+    loadedLibraries.forEachLibrary((Uri uri) {
+      LibraryEntity library =
+          frontendStrategy.elementEnvironment.lookupLibrary(uri);
       backend.setAnnotations(library);
     });
 
@@ -248,7 +251,6 @@
   }
 
   Future runInternal(Uri uri) async {
-    mainLibraryUri = uri;
     // TODO(ahe): This prevents memory leaks when invoking the compiler
     // multiple times. Implement a better mechanism where we can store
     // such caches in the compiler and get access to them through a
@@ -265,17 +267,14 @@
 
     assert(uri != null);
     // As far as I can tell, this branch is only used by test code.
-    LibraryEntity mainApp;
-    if (uri != null) {
-      reporter.log('Compiling $uri (${options.buildId})');
-      LoadedLibraries libraries = await libraryLoader.loadLibrary(uri);
-      // Note: libraries may be null because of errors trying to find files or
-      // parse-time errors (when using `package:front_end` as a loader).
-      if (libraries == null) return;
-      processLoadedLibraries(libraries);
-      mainApp = libraries.rootLibrary;
-    }
-    compileLoadedLibraries(mainApp);
+    reporter.log('Compiling $uri (${options.buildId})');
+    LoadedLibraries loadedLibraries = await libraryLoader.loadLibraries(uri);
+    // Note: libraries may be null because of errors trying to find files or
+    // parse-time errors (when using `package:front_end` as a loader).
+    if (loadedLibraries == null) return;
+    _mainLibraryUri = loadedLibraries.rootLibraryUri;
+    processLoadedLibraries(loadedLibraries);
+    compileLoadedLibraries(loadedLibraries);
   }
 
   /// Starts the resolution phase, creating the [ResolutionEnqueuer] if not
@@ -294,17 +293,16 @@
     return resolutionEnqueuer;
   }
 
-  JClosedWorld computeClosedWorld(LibraryEntity rootLibrary) {
+  JClosedWorld computeClosedWorld(LoadedLibraries loadedLibraries) {
     ResolutionEnqueuer resolutionEnqueuer = startResolution();
     WorldImpactBuilderImpl mainImpact = new WorldImpactBuilderImpl();
-    FunctionEntity mainFunction =
-        frontendStrategy.computeMain(rootLibrary, mainImpact);
+    FunctionEntity mainFunction = frontendStrategy.computeMain(mainImpact);
 
     // In order to see if a library is deferred, we must compute the
     // compile-time constants that are metadata.  This means adding
     // something to the resolution queue.  So we cannot wait with
     // this until after the resolution queue is processed.
-    deferredLoadTask.beforeResolution(rootLibrary);
+    deferredLoadTask.beforeResolution(loadedLibraries);
     impactStrategy = backend.createImpactStrategy(
         supportDeferredLoad: deferredLoadTask.isProgramSplit,
         supportDumpInfo: options.dumpInfo);
@@ -314,7 +312,7 @@
     reporter.log('Resolving...');
 
     processQueue(frontendStrategy.elementEnvironment, resolutionEnqueuer,
-        mainFunction, libraryLoader.libraries,
+        mainFunction, loadedLibraries.libraries,
         onProgress: showResolutionProgress);
     backend.onResolutionEnd();
     resolutionEnqueuer.logSummary(reporter.log);
@@ -348,7 +346,9 @@
         mainFunction, closedWorld, inferredDataBuilder);
   }
 
-  Enqueuer generateJavaScriptCode(JClosedWorld closedWorld,
+  Enqueuer generateJavaScriptCode(
+      LoadedLibraries loadedLibraries,
+      JClosedWorld closedWorld,
       GlobalTypeInferenceResults globalInferenceResults) {
     FunctionEntity mainFunction = closedWorld.elementEnvironment.mainFunction;
     reporter.log('Compiling...');
@@ -357,7 +357,7 @@
     Enqueuer codegenEnqueuer =
         startCodegen(closedWorld, globalInferenceResults);
     processQueue(closedWorld.elementEnvironment, codegenEnqueuer, mainFunction,
-        libraryLoader.libraries,
+        loadedLibraries.libraries,
         onProgress: showCodegenProgress);
     codegenEnqueuer.logSummary(reporter.log);
 
@@ -375,15 +375,15 @@
   }
 
   /// Performs the compilation when all libraries have been loaded.
-  void compileLoadedLibraries(LibraryEntity rootLibrary) =>
+  void compileLoadedLibraries(LoadedLibraries loadedLibraries) =>
       selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
-        JClosedWorld closedWorld = computeClosedWorld(rootLibrary);
+        JClosedWorld closedWorld = computeClosedWorld(loadedLibraries);
         if (closedWorld != null) {
           GlobalTypeInferenceResults globalInferenceResults =
               performGlobalTypeInference(closedWorld);
           if (stopAfterTypeInference) return;
-          Enqueuer codegenEnqueuer =
-              generateJavaScriptCode(closedWorld, globalInferenceResults);
+          Enqueuer codegenEnqueuer = generateJavaScriptCode(
+              loadedLibraries, closedWorld, globalInferenceResults);
           checkQueues(enqueuer.resolution, codegenEnqueuer);
         }
       });
@@ -433,7 +433,7 @@
   }
 
   void processQueue(ElementEnvironment elementEnvironment, Enqueuer enqueuer,
-      FunctionEntity mainMethod, Iterable<LibraryEntity> libraries,
+      FunctionEntity mainMethod, Iterable<Uri> libraries,
       {void onProgress(Enqueuer enqueuer)}) {
     selfTask.measureSubtask("Compiler.processQueue", () {
       enqueuer.open(impactStrategy, mainMethod, libraries);
@@ -543,8 +543,8 @@
   Iterable<CodeLocation> computeUserCodeLocations(
       {bool assumeInUserCode: false}) {
     List<CodeLocation> userCodeLocations = <CodeLocation>[];
-    if (mainLibraryUri != null) {
-      userCodeLocations.add(new CodeLocation(mainLibraryUri));
+    if (_mainLibraryUri != null) {
+      userCodeLocations.add(new CodeLocation(_mainLibraryUri));
     }
     if (userCodeLocations.isEmpty && assumeInUserCode) {
       // Assume in user code since [mainApp] has not been set yet.
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index fa9b677..8b87744 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -19,6 +19,7 @@
         InstantiationConstantValue;
 import 'elements/types.dart';
 import 'elements/entities.dart';
+import 'library_loader.dart';
 import 'universe/use.dart';
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
@@ -362,6 +363,7 @@
               }
               break;
             case TypeUseKind.RTI_VALUE:
+            case TypeUseKind.TYPE_ARGUMENT:
               failedAt(element, "Unexpected type use: $typeUse.");
               break;
           }
@@ -791,16 +793,15 @@
   /// Frees up strategy-specific temporary data.
   void cleanup() {}
 
-  void beforeResolution(LibraryEntity mainLibrary) {
-    if (mainLibrary == null) return;
-    for (LibraryEntity library in compiler.libraryLoader.libraries) {
+  void beforeResolution(LoadedLibraries loadedLibraries) {
+    for (Uri uri in loadedLibraries.libraries) {
+      LibraryEntity library = elementEnvironment.lookupLibrary(uri);
       reporter.withCurrentElement(library, () {
         checkForDeferredErrorCases(library);
         for (ImportEntity import in elementEnvironment.getImports(library)) {
           if (import.isDeferred) {
-            Uri mainLibraryUri = compiler.mainLibraryUri;
-            _deferredImportDescriptions[import] =
-                new ImportDescription(import, library, mainLibraryUri);
+            _deferredImportDescriptions[import] = new ImportDescription(
+                import, library, loadedLibraries.rootLibraryUri);
             isProgramSplit = true;
           }
         }
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 7e1492e..3ab906a 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -73,7 +73,7 @@
   WorldBuilder get worldBuilder;
 
   void open(ImpactStrategy impactStrategy, FunctionEntity mainMethod,
-      Iterable<LibraryEntity> libraries);
+      Iterable<Uri> libraries);
   void close();
 
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
@@ -133,8 +133,8 @@
   /// backend specific [WorldImpact] of this is returned.
   WorldImpact registerUsedConstant(ConstantValue value);
 
-  void onQueueOpen(Enqueuer enqueuer, FunctionEntity mainMethod,
-      Iterable<LibraryEntity> libraries);
+  void onQueueOpen(
+      Enqueuer enqueuer, FunctionEntity mainMethod, Iterable<Uri> libraries);
 
   /// Called when [enqueuer]'s queue is empty, but before it is closed.
   ///
@@ -177,7 +177,7 @@
   ImpactStrategy get impactStrategy => _impactStrategy;
 
   void open(ImpactStrategy impactStrategy, FunctionEntity mainMethod,
-      Iterable<LibraryEntity> libraries) {
+      Iterable<Uri> libraries) {
     _impactStrategy = impactStrategy;
     listener.onQueueOpen(this, mainMethod, libraries);
   }
@@ -381,6 +381,7 @@
         }
         break;
       case TypeUseKind.RTI_VALUE:
+      case TypeUseKind.TYPE_ARGUMENT:
         failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
         break;
     }
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 45f1261..f136390 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -4,9 +4,7 @@
 
 library dart2js.frontend_strategy;
 
-import '../compiler_new.dart' as api;
 import 'common/backend_api.dart';
-import 'common/tasks.dart';
 import 'common.dart';
 import 'common_elements.dart';
 import 'compiler.dart' show Compiler;
@@ -30,9 +28,8 @@
 /// Strategy pattern that defines the connection between the input format and
 /// the resolved element model.
 abstract class FrontendStrategy {
-  /// Creates library loader task for this strategy.
-  LibraryLoaderTask createLibraryLoader(api.CompilerInput compilerInput,
-      DiagnosticReporter reporter, Measurer measurer);
+  /// Registers a set of loaded libraries with this strategy.
+  void registerLoadedLibraries(LoadedLibraries loadedLibraries);
 
   /// Returns the [ElementEnvironment] for the element model used in this
   /// strategy.
@@ -88,8 +85,7 @@
 
   /// Computes the main function from [mainLibrary] adding additional world
   /// impact to [impactBuilder].
-  FunctionEntity computeMain(
-      LibraryEntity mainLibrary, WorldImpactBuilder impactBuilder);
+  FunctionEntity computeMain(WorldImpactBuilder impactBuilder);
 
   /// Creates the [RuntimeTypesNeedBuilder] for this strategy.
   RuntimeTypesNeedBuilder createRuntimeTypesNeedBuilder();
diff --git a/pkg/compiler/lib/src/js_backend/codegen_listener.dart b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
index bb430e2..8332542 100644
--- a/pkg/compiler/lib/src/js_backend/codegen_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
@@ -88,8 +88,8 @@
   }
 
   @override
-  void onQueueOpen(Enqueuer enqueuer, FunctionEntity mainMethod,
-      Iterable<LibraryEntity> libraries) {
+  void onQueueOpen(
+      Enqueuer enqueuer, FunctionEntity mainMethod, Iterable<Uri> libraries) {
     enqueuer.applyImpact(_nativeEnqueuer.processNativeClasses(libraries));
     if (mainMethod != null) {
       enqueuer.applyImpact(_computeMainImpact(mainMethod));
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 7d9d0b3..3b78c2f 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -211,6 +211,9 @@
         }
         break;
       case TypeUseKind.RTI_VALUE:
+        _worldBuilder.registerConstTypeLiteral(type);
+        break;
+      case TypeUseKind.TYPE_ARGUMENT:
         _worldBuilder.registerTypeArgument(type);
         break;
     }
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index a4fb279..46e3e2d4 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -203,6 +203,7 @@
           hasTypeLiteral = true;
           break;
         case TypeUseKind.RTI_VALUE:
+        case TypeUseKind.TYPE_ARGUMENT:
           failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
           break;
       }
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index c1b2cac..9e79876 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -134,8 +134,8 @@
   }
 
   @override
-  void onQueueOpen(Enqueuer enqueuer, FunctionEntity mainMethod,
-      Iterable<LibraryEntity> libraries) {
+  void onQueueOpen(
+      Enqueuer enqueuer, FunctionEntity mainMethod, Iterable<Uri> libraries) {
     if (_deferredLoadTask.isProgramSplit) {
       enqueuer.applyImpact(_computeDeferredLoadingImpact(),
           impactSource: 'deferred load');
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 00dd8de..95682d0 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -511,13 +511,10 @@
     ArgumentCollector collector = new ArgumentCollector();
     for (ClassEntity target in checks.classes) {
       ClassChecks classChecks = checks[target];
-      if (classChecks.isNotEmpty) {
-        instantiated.add(target);
-        for (TypeCheck check in classChecks.checks) {
-          Substitution substitution = check.substitution;
-          if (substitution != null) {
-            collector.collectAll(substitution.arguments);
-          }
+      for (TypeCheck check in classChecks.checks) {
+        Substitution substitution = check.substitution;
+        if (substitution != null) {
+          collector.collectAll(substitution.arguments);
         }
       }
     }
@@ -1862,12 +1859,20 @@
 class _RuntimeTypesChecks implements RuntimeTypesChecks {
   final RuntimeTypesSubstitutions _substitutions;
   final TypeChecks requiredChecks;
+  final Iterable<ClassEntity> _typeLiterals;
+  final Iterable<ClassEntity> _typeArguments;
 
-  _RuntimeTypesChecks(this._substitutions, this.requiredChecks);
+  _RuntimeTypesChecks(this._substitutions, this.requiredChecks,
+      this._typeLiterals, this._typeArguments);
 
   @override
   Iterable<ClassEntity> get requiredClasses {
-    return _substitutions.getClassesUsedInSubstitutions(requiredChecks);
+    Set<ClassEntity> required = new Set<ClassEntity>();
+    required.addAll(_typeArguments);
+    required.addAll(_typeLiterals);
+    required
+        .addAll(_substitutions.getClassesUsedInSubstitutions(requiredChecks));
+    return required;
   }
 
   @override
@@ -1936,6 +1941,8 @@
     }
 
     Set<FunctionType> checkedFunctionTypes = new Set<FunctionType>();
+    Set<ClassEntity> typeLiterals = new Set<ClassEntity>();
+    Set<ClassEntity> typeArguments = new Set<ClassEntity>();
 
     TypeVisitor liveTypeVisitor =
         new TypeVisitor(onClass: (ClassEntity cls, {TypeVisitorState state}) {
@@ -1943,9 +1950,11 @@
       switch (state) {
         case TypeVisitorState.typeArgument:
           classUse.typeArgument = true;
+          typeArguments.add(cls);
           break;
         case TypeVisitorState.typeLiteral:
           classUse.typeLiteral = true;
+          typeLiterals.add(cls);
           break;
         case TypeVisitorState.direct:
           break;
@@ -1959,6 +1968,7 @@
         case TypeVisitorState.typeArgument:
           classUse.typeArgument = true;
           classUse.checkedTypeArgument = true;
+          typeArguments.add(cls);
           break;
         case TypeVisitorState.typeLiteral:
           break;
@@ -1998,6 +2008,9 @@
 
     codegenWorldBuilder.forEachStaticTypeArgument(processMethodTypeArguments);
     codegenWorldBuilder.forEachDynamicTypeArgument(processMethodTypeArguments);
+    codegenWorldBuilder.liveTypeArguments.forEach((DartType type) {
+      liveTypeVisitor.visitType(type, TypeVisitorState.typeArgument);
+    });
     codegenWorldBuilder.constTypeLiterals.forEach((DartType type) {
       liveTypeVisitor.visitType(type, TypeVisitorState.typeLiteral);
     });
@@ -2083,7 +2096,8 @@
 
     cachedRequiredChecks = _computeChecks(classUseMap);
     rtiChecksBuilderClosed = true;
-    return new _RuntimeTypesChecks(this, cachedRequiredChecks);
+    return new _RuntimeTypesChecks(
+        this, cachedRequiredChecks, typeArguments, typeLiterals);
   }
 }
 
@@ -2880,8 +2894,6 @@
 
   Iterable<TypeCheck> get checks => _map.values;
 
-  bool get isNotEmpty => _map.isNotEmpty;
-
   String toString() {
     return 'ClassChecks($checks)';
   }
@@ -2944,12 +2956,10 @@
 
   /// Whether the class is used in a constant type literal.
   ///
-  /// For instance `A`, `B` and `C` in:
+  /// For instance `A`:
   ///
   ///     class A {}
-  ///     class B<T> {}
-  ///     class C {}
-  ///     main() => A == B<C>;
+  ///     main() => A;
   ///
   bool typeLiteral = false;
 
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 9e91d03..ee4738f 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -4,9 +4,6 @@
 
 library dart2js.kernel.frontend_strategy;
 
-import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
-
-import '../../compiler_new.dart' as api;
 import '../common.dart';
 import '../common/backend_api.dart';
 import '../common/resolution.dart';
@@ -51,32 +48,16 @@
   final Map<MemberEntity, ScopeModel> closureModels =
       <MemberEntity, ScopeModel>{};
 
-  fe.InitializedCompilerState initializedCompilerState;
-
-  KernelFrontEndStrategy(
-      this._compilerTask,
-      this._options,
-      DiagnosticReporter reporter,
-      env.Environment environment,
-      this.initializedCompilerState) {
+  KernelFrontEndStrategy(this._compilerTask, this._options,
+      DiagnosticReporter reporter, env.Environment environment) {
     assert(_compilerTask != null);
     _elementMap = new KernelToElementMapForImpactImpl(
         reporter, environment, this, _options);
   }
 
   @override
-  LibraryLoaderTask createLibraryLoader(api.CompilerInput compilerInput,
-      DiagnosticReporter reporter, Measurer measurer) {
-    return new KernelLibraryLoaderTask(
-        _options.librariesSpecificationUri,
-        _options.platformBinaries,
-        _options.packageConfig,
-        _elementMap,
-        compilerInput,
-        reporter,
-        measurer,
-        verbose: _options.verbose,
-        initializedCompilerState: initializedCompilerState);
+  void registerLoadedLibraries(LoadedLibraries loadedLibraries) {
+    _elementMap.addComponent(loadedLibraries.component);
   }
 
   @override
@@ -109,8 +90,7 @@
 
   /// Computes the main function from [mainLibrary] adding additional world
   /// impact to [impactBuilder].
-  FunctionEntity computeMain(
-      LibraryEntity mainLibrary, WorldImpactBuilder impactBuilder) {
+  FunctionEntity computeMain(WorldImpactBuilder impactBuilder) {
     return elementEnvironment.mainFunction;
   }
 
diff --git a/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
index 096c9b2..1edab46 100644
--- a/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
+++ b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
@@ -305,6 +305,6 @@
 
   DartType receiverType = elementMap.getStaticType(receiver);
   DartType argumentType =
-      argument == null ? argument : elementMap.getStaticType(argument);
+      argument == null ? null : elementMap.getStaticType(argument);
   return new RuntimeTypeUse(kind, receiverType, argumentType);
 }
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index 25e576b..5a86659 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
-import 'package:front_end/src/fasta/util/link.dart' show Link;
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
 import 'package:kernel/kernel.dart' hide LibraryDependency, Combinator;
@@ -19,125 +18,7 @@
 
 import 'common/tasks.dart' show CompilerTask, Measurer;
 import 'common.dart';
-import 'elements/entities.dart' show LibraryEntity;
-import 'kernel/element_map_impl.dart' show KernelToElementMapForImpactImpl;
-import 'resolved_uri_translator.dart';
-
-/**
- * [CompilerTask] for loading libraries and setting up the import/export scopes.
- *
- * The library loader uses four different kinds of URIs in different parts of
- * the loading process.
- *
- * ## User URI ##
- *
- * A 'user URI' is a URI provided by the user in code and as the main entry URI
- * at the command line. These generally come in 3 versions:
- *
- *   * A relative URI such as 'foo.dart', '../bar.dart', and 'baz/boz.dart'.
- *
- *   * A dart URI such as 'dart:core' and 'dart:_js_helper'.
- *
- *   * A package URI such as 'package:foo.dart' and 'package:bar/baz.dart'.
- *
- * A user URI can also be absolute, like 'file:///foo.dart' or
- * 'http://example.com/bar.dart', but such URIs cannot necessarily be used for
- * locating source files, since the scheme must be supported by the input
- * provider. The standard input provider for dart2js only supports the 'file'
- * and 'http' scheme.
- *
- * ## Resolved URI ##
- *
- * A 'resolved URI' is a (user) URI that has been resolved to an absolute URI
- * based on the readable URI (see below) from which it was loaded. A URI with an
- * explicit scheme (such as 'dart:', 'package:' or 'file:') is already resolved.
- * A relative URI like for instance '../foo/bar.dart' is translated into an
- * resolved URI in one of three ways:
- *
- *  * If provided as the main entry URI at the command line, the URI is resolved
- *    relative to the current working directory, say
- *    'file:///current/working/dir/', and the resolved URI is therefore
- *    'file:///current/working/foo/bar.dart'.
- *
- *  * If the relative URI is provided in an import, export or part tag, and the
- *    readable URI of the enclosing compilation unit is a file URI,
- *    'file://some/path/baz.dart', then the resolved URI is
- *    'file://some/foo/bar.dart'.
- *
- *  * If the relative URI is provided in an import, export or part tag, and the
- *    readable URI of the enclosing compilation unit is a package URI,
- *    'package:some/path/baz.dart', then the resolved URI is
- *    'package:some/foo/bar.dart'.
- *
- * The resolved URI thus preserves the scheme through resolution: A readable
- * file URI results in an resolved file URI and a readable package URI results
- * in an resolved package URI. Note that since a dart URI is not a readable URI,
- * import, export or part tags within platform libraries are not interpreted as
- * dart URIs but instead relative to the library source file location.
- *
- * The resolved URI of a library is also used as the canonical URI
- * ([LibraryElement.canonicalUri]) by which we identify which libraries are
- * identical. This means that libraries loaded through the 'package' scheme will
- * resolve to the same library when loaded from within using relative URIs (see
- * for instance the test 'standalone/package/package1_test.dart'). But loading a
- * platform library using a relative URI will _not_ result in the same library
- * as when loaded through the dart URI.
- *
- * ## Readable URI ##
- *
- * A 'readable URI' is an absolute URI whose scheme is either 'package' or
- * something supported by the input provider, normally 'file'. Dart URIs such as
- * 'dart:core' and 'dart:_js_helper' are not readable themselves but are instead
- * resolved into a readable URI using the library root URI provided from the
- * command line and the list of platform libraries found in
- * 'sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'. This is done
- * through a [ResolvedUriTranslator] provided from the compiler. The translator
- * checks whether a library by that name exists and in case of internal
- * libraries whether access is granted.
- *
- * ## Resource URI ##
- *
- * A 'resource URI' is an absolute URI with a scheme supported by the input
- * provider. For the standard implementation this means a URI with the 'file'
- * scheme. Readable URIs are converted into resource URIs as part of the
- * [ScriptLoader.readScript] method. In the standard implementation the package
- * URIs are converted to file URIs using the package root URI provided on the
- * command line as base. If the package root URI is
- * 'file:///current/working/dir/' then the package URI 'package:foo/bar.dart'
- * will be resolved to the resource URI
- * 'file:///current/working/dir/foo/bar.dart'.
- *
- * The distinction between readable URI and resource URI is necessary to ensure
- * that these imports
- *
- *     import 'package:foo.dart' as a;
- *     import 'packages/foo.dart' as b;
- *
- * do _not_ resolve to the same library when the package root URI happens to
- * point to the 'packages' folder.
- *
- */
-abstract class LibraryLoaderTask implements LibraryProvider, CompilerTask {
-  /// Returns all libraries that have been loaded.
-  Iterable<LibraryEntity> get libraries;
-
-  /// Loads the library specified by the [resolvedUri] and returns the
-  /// [LoadedLibraries] that were loaded to load the specified uri. The
-  /// [LibraryElement] itself can be found by calling
-  /// `loadedLibraries.rootLibrary`.
-  ///
-  /// If the library is not already loaded, the method creates the
-  /// [LibraryElement] for the library and computes the import/export scope,
-  /// loading and computing the import/export scopes of all required libraries
-  /// in the process. The method handles cyclic dependency between libraries.
-  Future<LoadedLibraries> loadLibrary(Uri resolvedUri);
-}
-
-/// Interface for an entity that provide libraries.
-abstract class LibraryProvider {
-  /// Looks up the library with the [canonicalUri].
-  LibraryEntity lookupLibrary(Uri canonicalUri);
-}
+import 'options.dart';
 
 /// A loader that builds a kernel IR representation of the component.
 ///
@@ -145,56 +26,35 @@
 /// When given .dart source files, it invokes the shared frontend
 /// (`package:front_end`) to produce the corresponding kernel IR representation.
 // TODO(sigmund): move this class to a new file under src/kernel/.
-class KernelLibraryLoaderTask extends CompilerTask
-    implements LibraryLoaderTask {
-  final Uri librariesSpecification;
-  final Uri platformBinaries;
-  final Uri _packageConfig;
+class LibraryLoaderTask extends CompilerTask {
+  final DiagnosticReporter _reporter;
 
-  final DiagnosticReporter reporter;
+  final api.CompilerInput _compilerInput;
 
-  final api.CompilerInput compilerInput;
+  final CompilerOptions _options;
 
-  /// Holds the mapping of Kernel IR to KElements that is constructed as a
-  /// result of loading a component.
-  final KernelToElementMapForImpactImpl _elementMap;
-
-  final bool verbose;
-
-  List<LibraryEntity> _allLoadedLibraries;
-
+  /// Shared state between compilations.
   fe.InitializedCompilerState initializedCompilerState;
 
-  KernelLibraryLoaderTask(
-      this.librariesSpecification,
-      this.platformBinaries,
-      this._packageConfig,
-      this._elementMap,
-      this.compilerInput,
-      this.reporter,
-      Measurer measurer,
-      {this.verbose: false,
-      this.initializedCompilerState})
-      : _allLoadedLibraries = new List<LibraryEntity>(),
+  LibraryLoaderTask(
+      this._options, this._compilerInput, this._reporter, Measurer measurer)
+      : initializedCompilerState = _options.kernelInitializedCompilerState,
         super(measurer);
 
-  /// Loads an entire Kernel [Component] from a file on disk (note, not just a
-  /// library, so this name is actually a bit of a misnomer).
-  // TODO(efortuna): Rename this once the Element library loader class goes
-  // away.
-  Future<LoadedLibraries> loadLibrary(Uri resolvedUri) {
+  /// Loads an entire Kernel [Component] from a file on disk.
+  Future<LoadedLibraries> loadLibraries(Uri resolvedUri) {
     return measure(() async {
       var isDill = resolvedUri.path.endsWith('.dill');
       ir.Component component;
       if (isDill) {
-        api.Input input = await compilerInput.readFromUri(resolvedUri,
+        api.Input input = await _compilerInput.readFromUri(resolvedUri,
             inputKind: api.InputKind.binary);
         component = new ir.Component();
         new BinaryBuilder(input.data).readComponent(component);
       } else {
-        bool strongMode = _elementMap.options.strongMode;
+        bool strongMode = _options.strongMode;
         String targetName =
-            _elementMap.options.compileForServer ? "dart2js_server" : "dart2js";
+            _options.compileForServer ? "dart2js_server" : "dart2js";
         String platform = strongMode
             ? '${targetName}_platform_strong.dill'
             : '${targetName}_platform.dill';
@@ -202,29 +62,28 @@
             initializedCompilerState,
             new Dart2jsTarget(
                 targetName, new TargetFlags(strongMode: strongMode)),
-            librariesSpecification,
-            platformBinaries.resolve(platform),
-            _packageConfig);
+            _options.librariesSpecificationUri,
+            _options.platformBinaries.resolve(platform),
+            _options.packageConfig);
         component = await fe.compile(
             initializedCompilerState,
-            verbose,
-            new CompilerFileSystem(compilerInput),
-            (e) => reportFrontEndMessage(reporter, e),
+            _options.verbose,
+            new CompilerFileSystem(_compilerInput),
+            (e) => reportFrontEndMessage(_reporter, e),
             resolvedUri);
       }
       if (component == null) return null;
-      return createLoadedLibraries(component);
+      return _createLoadedLibraries(component);
     });
   }
 
   // Only visible for unit testing.
-  LoadedLibraries createLoadedLibraries(ir.Component component) {
-    _elementMap.addComponent(component);
-    LibraryEntity rootLibrary = null;
+  LoadedLibraries _createLoadedLibraries(ir.Component component) {
+    Uri rootLibraryUri = null;
     Iterable<ir.Library> libraries = component.libraries;
     if (component.mainMethod != null) {
       var root = component.mainMethod.enclosingLibrary;
-      rootLibrary = _elementMap.lookupLibrary(root.importUri);
+      rootLibraryUri = root.importUri;
 
       // Filter unreachable libraries: [Component] was built by linking in the
       // entire SDK libraries, not all of them are used. We include anything
@@ -248,74 +107,38 @@
 
       libraries = libraries.where(seen.contains);
     }
-    _allLoadedLibraries.addAll(
-        libraries.map((lib) => _elementMap.lookupLibrary(lib.importUri)));
-    return new _LoadedLibrariesAdapter(
-        rootLibrary, _allLoadedLibraries, _elementMap);
-  }
-
-  KernelToElementMapForImpactImpl get elementMap => _elementMap;
-
-  Iterable<LibraryEntity> get libraries => _allLoadedLibraries;
-
-  LibraryEntity lookupLibrary(Uri canonicalUri) {
-    return _elementMap?.lookupLibrary(canonicalUri);
+    return new LoadedLibraries(component, rootLibraryUri,
+        libraries.map((lib) => lib.importUri).toList());
   }
 }
 
 /// Information on the set libraries loaded as a result of a call to
 /// [LibraryLoader.loadLibrary].
-abstract class LoadedLibraries {
-  /// The access the library object created corresponding to the library
-  /// passed to [LibraryLoader.loadLibrary].
-  LibraryEntity get rootLibrary;
+class LoadedLibraries {
+  final ir.Component _component;
+  final Uri _rootLibraryUri;
+  final List<Uri> _libraries;
+
+  LoadedLibraries(this._component, this._rootLibraryUri, this._libraries) {
+    assert(rootLibraryUri != null);
+  }
+
+  /// Returns the root component for the loaded libraries.
+  ir.Component get component => _component;
+
+  /// The [Uri] of the root library.
+  Uri get rootLibraryUri => _rootLibraryUri;
+
+  /// Returns the [Uri]s of all libraries that have been loaded.
+  Iterable<Uri> get libraries => _libraries;
 
   /// Returns `true` if a library with canonical [uri] was loaded in this bulk.
-  bool containsLibrary(Uri uri);
-
-  /// Returns the library with canonical [uri] that was loaded in this bulk.
-  LibraryEntity getLibrary(Uri uri);
-
-  /// Applies all libraries in this bulk to [f].
-  void forEachLibrary(f(LibraryEntity library));
-
-  /// Applies all imports chains of [uri] in this bulk to [callback].
-  ///
-  /// The argument [importChainReversed] to [callback] contains the chain of
-  /// imports uris that lead to importing [uri] starting in [uri] and ending in
-  /// the uri that was passed in with [loadLibrary].
-  ///
-  /// [callback] is called once for each chain of imports leading to [uri] until
-  /// [callback] returns `false`.
-  void forEachImportChain(Uri uri,
-      {bool callback(Link<Uri> importChainReversed)});
-}
-
-/// Adapter class to mimic the behavior of LoadedLibraries for Kernel element
-/// behavior. Ultimately we'll just access worldBuilder instead.
-class _LoadedLibrariesAdapter implements LoadedLibraries {
-  final LibraryEntity rootLibrary;
-  final List<LibraryEntity> _newLibraries;
-  final KernelToElementMapForImpactImpl worldBuilder;
-
-  _LoadedLibrariesAdapter(
-      this.rootLibrary, this._newLibraries, this.worldBuilder) {
-    assert(rootLibrary != null);
-  }
-
   bool containsLibrary(Uri uri) {
-    var lib = getLibrary(uri);
-    return lib != null && _newLibraries.contains(lib);
+    return _libraries.contains(uri);
   }
 
-  LibraryEntity getLibrary(Uri uri) => worldBuilder.lookupLibrary(uri);
+  /// Applies all library [Uri]s in this bulk to [f].
+  void forEachLibrary(f(Uri Uri)) => _libraries.forEach(f);
 
-  void forEachLibrary(f(LibraryEntity library)) => _newLibraries.forEach(f);
-
-  void forEachImportChain(Uri uri,
-      {bool callback(Link<Uri> importChainReversed)}) {
-    // Currently a no-op. This seems wrong.
-  }
-
-  String toString() => 'root=$rootLibrary,libraries=${_newLibraries}';
+  String toString() => 'root=$_rootLibraryUri,libraries=${_libraries}';
 }
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 543d330..968b7cf 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -22,7 +22,7 @@
   void onInstantiatedType(InterfaceType type) {}
 
   /// Initial entry point to native enqueuer.
-  WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) =>
+  WorldImpact processNativeClasses(Iterable<Uri> libraries) =>
       const WorldImpact();
 
   /// Registers the [nativeBehavior]. Adds the liveness of its instantiated
@@ -191,7 +191,7 @@
 
   Iterable<ClassEntity> get liveNativeClasses => _registeredClasses;
 
-  WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) {
+  WorldImpact processNativeClasses(Iterable<Uri> libraries) {
     WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     Iterable<ClassEntity> nativeClasses =
         _nativeClassFinder.computeNativeClasses(libraries);
@@ -227,7 +227,7 @@
       this._nativeData)
       : super(options, elementEnvironment, commonElements, dartTypes);
 
-  WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) {
+  WorldImpact processNativeClasses(Iterable<Uri> libraries) {
     WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     _unusedClasses.addAll(_nativeClasses);
 
diff --git a/pkg/compiler/lib/src/native/resolver.dart b/pkg/compiler/lib/src/native/resolver.dart
index 5da0d2e..a404474 100644
--- a/pkg/compiler/lib/src/native/resolver.dart
+++ b/pkg/compiler/lib/src/native/resolver.dart
@@ -146,7 +146,7 @@
 /// Determines all native classes in a set of libraries.
 abstract class NativeClassFinder {
   /// Returns the set of all native classes declared in [libraries].
-  Iterable<ClassEntity> computeNativeClasses(Iterable<LibraryEntity> libraries);
+  Iterable<ClassEntity> computeNativeClasses(Iterable<Uri> libraries);
 }
 
 class BaseNativeClassFinder implements NativeClassFinder {
@@ -157,10 +157,10 @@
 
   BaseNativeClassFinder(this._elementEnvironment, this._nativeBasicData);
 
-  Iterable<ClassEntity> computeNativeClasses(
-      Iterable<LibraryEntity> libraries) {
+  Iterable<ClassEntity> computeNativeClasses(Iterable<Uri> libraries) {
     Set<ClassEntity> nativeClasses = new Set<ClassEntity>();
-    libraries.forEach((l) => _processNativeClassesInLibrary(l, nativeClasses));
+    libraries.forEach((uri) => _processNativeClassesInLibrary(
+        _elementEnvironment.lookupLibrary(uri), nativeClasses));
     _processSubclassesOfNativeClasses(libraries, nativeClasses);
     return nativeClasses;
   }
@@ -207,7 +207,7 @@
   /// Adds all subclasses of [nativeClasses] found in [libraries] to
   /// [nativeClasses].
   void _processSubclassesOfNativeClasses(
-      Iterable<LibraryEntity> libraries, Set<ClassEntity> nativeClasses) {
+      Iterable<Uri> libraries, Set<ClassEntity> nativeClasses) {
     Set<ClassEntity> nativeClassesAndSubclasses = new Set<ClassEntity>();
     // Collect potential subclasses, e.g.
     //
@@ -218,7 +218,8 @@
     Map<String, Set<ClassEntity>> potentialExtends =
         <String, Set<ClassEntity>>{};
 
-    libraries.forEach((LibraryEntity library) {
+    libraries.forEach((Uri uri) {
+      LibraryEntity library = _elementEnvironment.lookupLibrary(uri);
       _elementEnvironment.forEachClass(library, (ClassEntity cls) {
         String extendsName = _findExtendsNameOfClass(cls);
         if (extendsName != null) {
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 78867a0..188caba 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -2040,7 +2040,7 @@
       void visitElse(),
       SourceInformation sourceInformation}) {
     SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this,
-        node == null ? node : _elementMap.getSpannable(targetElement, node));
+        node == null ? null : _elementMap.getSpannable(targetElement, node));
     branchBuilder.handleIf(visitCondition, visitThen, visitElse,
         sourceInformation: sourceInformation);
   }
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 947432d..2b1adbc 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -3098,6 +3098,10 @@
 
   void visitTypeInfoExpression(HTypeInfoExpression node) {
     DartType type = node.dartType;
+    if (node.isTypeVariableReplacement) {
+      _registry.registerTypeUse(new TypeUse.typeArgument(type));
+    }
+
     List<js.Expression> arguments = <js.Expression>[];
     for (HInstruction input in node.inputs) {
       use(input);
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 4451c74..9488821 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -3699,8 +3699,13 @@
 class HTypeInfoExpression extends HInstruction {
   final TypeInfoExpressionKind kind;
   final DartType dartType;
+
+  /// `true` if this
+  final bool isTypeVariableReplacement;
+
   HTypeInfoExpression(this.kind, this.dartType, List<HInstruction> inputs,
-      AbstractValue instructionType)
+      AbstractValue instructionType,
+      {this.isTypeVariableReplacement: false})
       : super(inputs, instructionType) {
     setUseGvn();
   }
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 17d701f..145497d 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -1404,7 +1404,8 @@
             TypeInfoExpressionKind.COMPLETE,
             typeArgument,
             const <HInstruction>[],
-            _abstractValueDomain.dynamicType);
+            _abstractValueDomain.dynamicType,
+            isTypeVariableReplacement: true);
         return replacement;
       }
       return node;
@@ -1436,7 +1437,8 @@
           TypeInfoExpressionKind.COMPLETE,
           type,
           arguments,
-          _abstractValueDomain.dynamicType);
+          _abstractValueDomain.dynamicType,
+          isTypeVariableReplacement: true);
       return replacement;
     }
 
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index cc99a9d..0e371ba 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -80,6 +80,9 @@
 
   /// Returns the types that are live as constant type literals.
   Iterable<DartType> get constTypeLiterals;
+
+  /// Returns the types that are live as constant type literals.
+  Iterable<DartType> get liveTypeArguments;
 }
 
 class CodegenWorldBuilderImpl extends WorldBuilderBase
@@ -165,6 +168,7 @@
   final KernelToWorldBuilder _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
 
+  final Set<DartType> _constTypeLiterals = new Set<DartType>();
   final Set<DartType> _liveTypeArguments = new Set<DartType>();
 
   CodegenWorldBuilderImpl(
@@ -692,9 +696,15 @@
     });
   }
 
+  void registerConstTypeLiteral(DartType type) {
+    _constTypeLiterals.add(type);
+  }
+
+  Iterable<DartType> get constTypeLiterals => _constTypeLiterals;
+
   void registerTypeArgument(DartType type) {
     _liveTypeArguments.add(type);
   }
 
-  Iterable<DartType> get constTypeLiterals => _liveTypeArguments;
+  Iterable<DartType> get liveTypeArguments => _liveTypeArguments;
 }
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 9972e88..f6d00aa 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -577,6 +577,7 @@
   IMPLICIT_CAST,
   PARAMETER_CHECK,
   RTI_VALUE,
+  TYPE_ARGUMENT,
 }
 
 /// Use of a [DartType].
@@ -625,6 +626,9 @@
         sb.write('param:');
         break;
       case TypeUseKind.RTI_VALUE:
+        sb.write('rti:');
+        break;
+      case TypeUseKind.TYPE_ARGUMENT:
         sb.write('typeArg:');
         break;
     }
@@ -695,6 +699,14 @@
     return new TypeUse.internal(type, TypeUseKind.RTI_VALUE);
   }
 
+  /// [type] used directly as a type argument.
+  ///
+  /// The happens during optimization where a type variable can be replaced by
+  /// an invariable type argument derived from a constant receiver.
+  factory TypeUse.typeArgument(DartType type) {
+    return new TypeUse.internal(type, TypeUseKind.TYPE_ARGUMENT);
+  }
+
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! TypeUse) return false;
diff --git a/pkg/dev_compiler/karma.conf.js b/pkg/dev_compiler/karma.conf.js
deleted file mode 100644
index f43a6ca..0000000
--- a/pkg/dev_compiler/karma.conf.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// Karma configuration
-// Generated on Mon Apr 20 2015 06:33:20 GMT-0700 (PDT)
-
-module.exports = function(config) {
-  var configuration = {
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['mocha', 'requirejs', 'chai'],
-
-    // list of files / patterns to load in the browser
-    files: [
-      {pattern: 'lib/js/amd/dart_sdk.js', included: false},
-      {pattern: 'gen/codegen_output/*.js', included: false},
-      {pattern: 'gen/codegen_output/pkg/*.js', included: false},
-      {pattern: 'gen/codegen_output/language/**/*.js', included: false},
-      {pattern: 'gen/codegen_output/corelib/**/*.js', included: false},
-      {pattern: 'gen/codegen_output/lib/**/*.js', included: false},
-      {pattern: 'gen/codegen_tests/lib/**/*.txt', included: false},
-      {pattern: 'test/browser/*.js', included: false},
-      {pattern: 'node_modules/is_js/*.js', included: false},
-      'test-main.js',
-    ],
-
-    // list of files to exclude
-    exclude: [],
-
-    // preprocess matching files before serving them to the browser
-    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
-    preprocessors: {
-    },
-
-    client: {
-      captureConsole: false,
-      mocha: {
-        ui: 'tdd',
-        timeout : 6000
-      },
-    },
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-    // web server port
-    port: 9876,
-
-    // Proxy required to serve resources needed by tests.
-    proxies: {
-      '/root_dart/tests/lib/': '/base/gen/codegen_tests/lib/'
-    },
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-    // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: true,
-
-    browserNoActivityTimeout: 60000,
-    browserDisconnectTolerance: 5,
-
-    // start these browsers
-    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-    customLaunchers: {
-      ChromeTravis: {
-        base: 'Chrome',
-        flags: [ '--no-sandbox' ]
-      },
-
-      ChromeCanaryTravis: {
-        base: 'ChromeCanary',
-        flags: [ '--no-sandbox' ]
-      },
-    },
-
-    browsers: ['Chrome'],
-
-    // Continuous Integration mode
-    // if true, Karma captures browsers, runs the tests and exits
-    singleRun: false,
-  };
-
-  if (process.env.TRAVIS) {
-    configuration.browsers = ['ChromeTravis'];
-    configuration.autoWatch = false;
-    // Enable this for more logging on Travis.  It is too much for Travis to
-    // automatically display, but still results in a downloadable raw log.
-    // configuration.logLevel = config.LOG_DEBUG;
-    configuration.client.captureConsole = true;
-  }
-
-  if (process.env.DDC_BROWSERS) {
-    configuration.browsers = process.env.DDC_BROWSERS.split(':');
-  }
-
-  config.set(configuration);
-};
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index fdda18f..c39397d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -35,7 +35,6 @@
 import 'package:path/path.dart' as path;
 import 'package:source_span/source_span.dart' show SourceLocation;
 
-import '../closure/closure_annotator.dart' show ClosureAnnotator;
 import '../compiler/js_metalet.dart' as JS;
 import '../compiler/js_names.dart' as JS;
 import '../compiler/js_utils.dart' as JS;
@@ -46,9 +45,9 @@
 import '../js_ast/source_map_printer.dart' show NodeEnd, NodeSpan, HoverComment;
 import 'ast_builder.dart';
 import 'element_helpers.dart';
+import 'error_helpers.dart';
 import 'extension_types.dart' show ExtensionTypeSet;
 import 'js_interop.dart';
-import 'js_typeref_codegen.dart' show JSTypeRefCodegen;
 import 'js_typerep.dart';
 import 'module_compiler.dart' show BuildUnit, CompilerOptions, JSModuleFile;
 import 'nullable_type_inference.dart' show NullableTypeInference;
@@ -73,17 +72,17 @@
 // expressions (which result in JS.Expression) and statements
 // (which result in (JS.Statement).
 class CodeGenerator extends Object
-    with
-        ClosureAnnotator,
-        JSTypeRefCodegen,
-        NullableTypeInference,
-        SharedCompiler<LibraryElement>
+    with NullableTypeInference, SharedCompiler<LibraryElement>
     implements AstVisitor<JS.Node> {
   final AnalysisContext context;
   final SummaryDataStore summaryData;
 
   final CompilerOptions options;
   final StrongTypeSystemImpl rules;
+
+  /// Errors that were produced during compilation, if any.
+  final List<AnalysisError> errors;
+
   JSTypeRep jsTypeRep;
 
   /// The set of libraries we are currently compiling, and the temporaries used
@@ -204,8 +203,8 @@
 
   final _usedCovariantPrivateMembers = HashSet<ExecutableElement>();
 
-  CodeGenerator(
-      AnalysisContext c, this.summaryData, this.options, this._extensionTypes)
+  CodeGenerator(AnalysisContext c, this.summaryData, this.options,
+      this._extensionTypes, this.errors)
       : context = c,
         rules = StrongTypeSystemImpl(c.typeProvider),
         types = c.typeProvider,
@@ -252,18 +251,53 @@
   ///
   /// Takes the metadata for the build unit, as well as resolved trees and
   /// errors, and computes the output module code and optionally the source map.
-  JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits,
-      List<String> errors) {
+  JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits) {
     _buildUnit = unit;
     _libraryRoot = _buildUnit.libraryRoot;
     if (!_libraryRoot.endsWith(path.separator)) {
       _libraryRoot += path.separator;
     }
 
-    var module = _emitModule(compilationUnits, unit.name);
-    var dartApiSummary = _summarizeModule(compilationUnits);
+    invalidModule() =>
+        JSModuleFile.invalid(unit.name, formatErrors(context, errors), options);
 
-    return JSModuleFile(unit.name, errors, options, module, dartApiSummary);
+    if (!options.unsafeForceCompile && errors.any(_isFatalError)) {
+      return invalidModule();
+    }
+
+    try {
+      var module = _emitModule(compilationUnits, unit.name);
+      if (!options.unsafeForceCompile && errors.any(_isFatalError)) {
+        return invalidModule();
+      }
+
+      var dartApiSummary = _summarizeModule(compilationUnits);
+      return JSModuleFile(unit.name, formatErrors(context, errors), options,
+          module, dartApiSummary);
+    } catch (e) {
+      if (errors.any(_isFatalError)) {
+        // Force compilation failed.  Suppress the exception and report
+        // the static errors instead.
+        assert(options.unsafeForceCompile);
+        return invalidModule();
+      }
+      rethrow;
+    }
+  }
+
+  bool _isFatalError(AnalysisError e) {
+    if (errorSeverity(context, e) != ErrorSeverity.ERROR) return false;
+
+    // These errors are not fatal in the REPL compile mode as we
+    // allow access to private members across library boundaries
+    // and those accesses will show up as undefined members unless
+    // additional analyzer changes are made to support them.
+    // TODO(jacobr): consider checking that the identifier name
+    // referenced by the error is private.
+    return !options.replCompile ||
+        (e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
+            e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
+            e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD);
   }
 
   List<int> _summarizeModule(List<CompilationUnit> units) {
@@ -831,13 +865,10 @@
       }
     }
 
-    JS.Expression body = closureAnnotate(
-        runtimeCall('typedef(#, () => #)', [
-          js.string(element.name, "'"),
-          _emitFunctionType(type, nameType: false)
-        ]),
-        element,
-        node);
+    JS.Expression body = runtimeCall('typedef(#, () => #)', [
+      js.string(element.name, "'"),
+      _emitFunctionType(type, nameType: false)
+    ]);
 
     if (typeFormals.isNotEmpty) {
       return _defineClassTypeArguments(element, typeFormals,
@@ -1191,19 +1222,6 @@
         .toList(growable: false);
   }
 
-  /// Emits a field declaration for TypeScript & Closure's ES6_TYPED
-  /// (e.g. `class Foo { i: string; }`)
-  JS.VariableDeclarationList _emitTypeScriptField(FieldElement field) {
-    return JS.VariableDeclarationList(field.isStatic ? 'static' : null, [
-      JS.VariableInitialization(
-          JS.Identifier(
-              // TODO(ochafik): use a refactored _emitMemberName instead.
-              field.name,
-              type: emitTypeRef(field.type)),
-          null)
-    ]);
-  }
-
   @override
   JS.Statement visitEnumDeclaration(EnumDeclaration node) {
     return _emitClassDeclaration(node, node.element, []);
@@ -1239,19 +1257,12 @@
       JS.Expression className,
       JS.Expression heritage,
       List<JS.Method> methods) {
-    var typeParams = _emitTypeFormals(classElem.typeParameters);
-
-    var jsFields = options.closure
-        ? classElem.fields.map(_emitTypeScriptField).toList()
-        : null;
     if (classElem.typeParameters.isNotEmpty) {
-      return JS.ClassExpression(className as JS.Identifier, heritage, methods,
-              typeParams: typeParams, fields: jsFields)
+      return JS.ClassExpression(className as JS.Identifier, heritage, methods)
           .toStatement();
     }
-    var classExpr = JS.ClassExpression(
-        JS.TemporaryId(classElem.name), heritage, methods,
-        typeParams: typeParams, fields: jsFields);
+    var classExpr =
+        JS.ClassExpression(JS.TemporaryId(classElem.name), heritage, methods);
     return js.statement('# = #;', [className, classExpr]);
   }
 
@@ -1608,8 +1619,7 @@
           body.add(js.statement(
               'return super.#(#)(#);', [name, typeFormals, jsParams]));
         }
-        var fn = JS.Fun(jsParams, JS.Block(body),
-            typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
+        var fn = JS.Fun(jsParams, JS.Block(body));
         methods.add(JS.Method(name, fn));
       } else {
         throw StateError(
@@ -1624,7 +1634,6 @@
     if (isUnsupportedFactoryConstructor(node)) return null;
 
     var element = node.element;
-    var returnType = emitTypeRef(element.returnType);
     var name = _constructorName(element.name);
     JS.Fun fun;
 
@@ -1647,8 +1656,7 @@
             js.statement('return $newKeyword #(#)',
                 [visitConstructorName(redirect), params])
               ..sourceInformation = _nodeStart(redirect)
-          ]),
-          returnType: returnType);
+          ]));
     } else {
       // Normal factory constructor
       var body = <JS.Statement>[];
@@ -1657,16 +1665,13 @@
       body.add(_visitStatement(node.body));
 
       var params = _emitParameters(node.parameters?.parameters);
-      fun = JS.Fun(params, JS.Block(body), returnType: returnType);
+      fun = JS.Fun(params, JS.Block(body));
     }
 
     _currentFunction = savedFunction;
 
-    return closureAnnotate(
-        JS.Method(name, fun, isStatic: true)
-          ..sourceInformation = _functionEnd(node),
-        element,
-        node);
+    return JS.Method(name, fun, isStatic: true)
+      ..sourceInformation = _functionEnd(node);
   }
 
   /// Given a class C that implements method M from interface I, but does not
@@ -1744,7 +1749,7 @@
     return JS.Method(
         _declareMemberName(method,
             useExtension: _extensionTypes.isNativeClass(type.element)),
-        JS.Fun(fnArgs, fnBlock, typeParams: typeParams),
+        JS.Fun(fnArgs, fnBlock),
         isGetter: method is PropertyAccessorElement && method.isGetter,
         isSetter: method is PropertyAccessorElement && method.isSetter,
         isStatic: false);
@@ -2590,14 +2595,11 @@
       fn = _emitFunction(node.element, node.parameters, node.body);
     }
 
-    return closureAnnotate(
-        JS.Method(_declareMemberName(node.element), fn,
-            isGetter: node.isGetter,
-            isSetter: node.isSetter,
-            isStatic: node.isStatic)
-          ..sourceInformation = _functionEnd(node),
-        node.element,
-        node);
+    return JS.Method(_declareMemberName(node.element), fn,
+        isGetter: node.isGetter,
+        isSetter: node.isSetter,
+        isStatic: node.isStatic)
+      ..sourceInformation = _functionEnd(node);
   }
 
   @override
@@ -2643,8 +2645,7 @@
 
     var element = resolutionMap.elementDeclaredByFunctionDeclaration(node);
     var nameExpr = _emitTopLevelName(element);
-    body.add(
-        closureAnnotate(js.statement('# = #', [nameExpr, fn]), element, node));
+    body.add(js.statement('# = #', [nameExpr, fn]));
     // Function types of top-level/static functions are only needed when
     // dart:mirrors is enabled.
     // TODO(jmesserly): do we even need this for mirrors, since statics are not
@@ -2678,13 +2679,10 @@
 
   JS.Method _emitTopLevelProperty(FunctionDeclaration node) {
     var name = node.name.name;
-    return closureAnnotate(
-        JS.Method(_propertyName(name),
-            _emitFunctionExpression(node.functionExpression),
-            isGetter: node.isGetter, isSetter: node.isSetter)
-          ..sourceInformation = _functionEnd(node),
-        node.element,
-        node);
+    return JS.Method(
+        _propertyName(name), _emitFunctionExpression(node.functionExpression),
+        isGetter: node.isGetter, isSetter: node.isSetter)
+      ..sourceInformation = _functionEnd(node);
   }
 
   bool _executesAtTopLevel(AstNode node) {
@@ -2748,8 +2746,7 @@
 
     // Convert `function(...) { ... }` to `(...) => ...`
     // This is for readability, but it also ensures correct `this` binding.
-    return JS.ArrowFun(f.params, body,
-        typeParams: f.typeParams, returnType: f.returnType);
+    return JS.ArrowFun(f.params, body);
   }
 
   /// Emits a non-arrow FunctionExpression node.
@@ -2784,8 +2781,7 @@
           ]);
 
     code = super.exitFunction(element.name, formals, code);
-    return JS.Fun(formals, code,
-        typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
+    return JS.Fun(formals, code);
   }
 
   JS.Block _emitFunctionBody(ExecutableElement element,
@@ -2857,8 +2853,7 @@
       // TODO(jmesserly): this will emit argument initializers (for default
       // values) inside the generator function body. Is that the best place?
       var jsBody = _emitFunctionBody(element, parameters, body);
-      var genFn = JS.Fun(jsParams, jsBody,
-          isGenerator: true, returnType: emitTypeRef(returnType));
+      var genFn = JS.Fun(jsParams, jsBody, isGenerator: true);
 
       // Name the function if possible, to get better stack traces.
       var name = element.name;
@@ -3092,9 +3087,8 @@
     return JS.PropertyAccess(target, member);
   }
 
-  JS.Identifier _emitVariableDef(SimpleIdentifier id, {JS.TypeRef type}) {
-    return JS.Identifier(id.name, type: type)
-      ..sourceInformation = _nodeStart(id);
+  JS.Identifier _emitVariableDef(SimpleIdentifier id) {
+    return JS.Identifier(id.name)..sourceInformation = _nodeStart(id);
   }
 
   /// Returns `true` if the type name referred to by [node] is used in a
@@ -3135,8 +3129,7 @@
           element, () => JS.TemporaryId(element.name.substring(1)));
     }
 
-    var type = declaration ? emitTypeRef(element.type) : null;
-    return JS.Identifier(element.name, type: type);
+    return JS.Identifier(element.name);
   }
 
   List<Annotation> _parameterMetadata(FormalParameter p) =>
@@ -4232,8 +4225,7 @@
       return null;
     }
 
-    var name =
-        _emitVariableDef(node.name, type: emitTypeRef(node.element.type));
+    var name = _emitVariableDef(node.name);
     return JS.VariableInitialization(
         name, _visitInitializer(node.initializer, node.element));
   }
@@ -4260,13 +4252,10 @@
           _isJSInvocation(init) ||
           init is InstanceCreationExpression &&
               isSdkInternalRuntime(init.staticElement.library)) {
-        moduleItems.add(closureAnnotate(
-            js.statement('# = #;', [
-              _emitTopLevelName(field.element),
-              _visitInitializer(field.initializer, field.element)
-            ]),
-            field.element,
-            field));
+        moduleItems.add(js.statement('# = #;', [
+          _emitTopLevelName(field.element),
+          _visitInitializer(field.initializer, field.element)
+        ]));
       } else {
         lazyFields.add(field);
       }
@@ -4292,41 +4281,24 @@
     for (var node in fields) {
       var element = node.element;
       var access = emitFieldName(element);
-      accessors.add(closureAnnotate(
-          JS.Method(
-              access,
-              js.call('function() { return #; }',
-                  _visitInitializer(node.initializer, element)) as JS.Fun,
-              isGetter: true)
-            ..sourceInformation =
-                _hoverComment(JS.PropertyAccess(objExpr, access), node.name),
-          _findAccessor(element, getter: true),
-          node));
+      accessors.add(JS.Method(
+          access,
+          js.call('function() { return #; }',
+              _visitInitializer(node.initializer, element)) as JS.Fun,
+          isGetter: true)
+        ..sourceInformation =
+            _hoverComment(JS.PropertyAccess(objExpr, access), node.name));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
       if (!node.isFinal && !node.isConst) {
-        accessors.add(closureAnnotate(
-            JS.Method(access, js.call('function(_) {}') as JS.Fun,
-                isSetter: true),
-            _findAccessor(element, getter: false),
-            node));
+        accessors.add(JS.Method(access, js.call('function(_) {}') as JS.Fun,
+            isSetter: true));
       }
     }
 
     return runtimeStatement('defineLazy(#, { # })', [objExpr, accessors]);
   }
 
-  PropertyAccessorElement _findAccessor(VariableElement element,
-      {bool getter}) {
-    var parent = element.enclosingElement;
-    if (parent is ClassElement) {
-      return getter
-          ? parent.getGetter(element.name)
-          : parent.getSetter(element.name);
-    }
-    return null;
-  }
-
   JS.Expression _emitConstructorName(DartType type, String name) {
     return _emitJSInterop(type.element) ??
         JS.PropertyAccess(_emitConstructorAccess(type), _constructorName(name));
@@ -4778,8 +4750,10 @@
   int _asIntInRange(Expression expr, int low, int high) {
     expr = expr.unParenthesized;
     if (expr is IntegerLiteral) {
-      var value = expr.value;
-      if (value != null && value >= low && value <= high) {
+      var value = _intValueForJS(expr);
+      if (value != null &&
+          value >= BigInt.from(low) &&
+          value <= BigInt.from(high)) {
         return expr.value;
       }
       return null;
@@ -4804,8 +4778,9 @@
 
   bool _isDefinitelyNonNegative(Expression expr) {
     expr = expr.unParenthesized;
-    if (expr is IntegerLiteral && expr.value != null) {
-      return expr.value >= 0;
+    if (expr is IntegerLiteral) {
+      var value = _intValueForJS(expr);
+      return value != null && value >= BigInt.from(0);
     }
     if (_nodeIsBitwiseOperation(expr)) return true;
     // TODO(sra): Lengths of known list types etc.
@@ -5637,16 +5612,48 @@
 
   @override
   visitIntegerLiteral(IntegerLiteral node) {
-    // The analyzer is using int.parse and, in the the VM's new
-    // 64-bit mode, it's silently failing if the Literal is out of bounds.
-    // If the value is null, fall back on the string representation.  This
-    // is also fudging the number, but consistent with the old behavior.
-    // Ideally, this is a static error.
-    // TODO(vsm): Remove this hack.
-    if (node.value != null) {
-      return js.number(node.value);
+    // TODO(jmesserly): this behaves differently if Analyzer/DDC are run on
+    // dart4web. In that case we may report an error from the analyzer side
+    // (because `int.tryParse` fails). We could harden this by always parsing
+    // from `node.literal.lexeme`, as done below.
+    var value = _intValueForJS(node);
+    if (value == null) {
+      assert(options.unsafeForceCompile);
+      value = BigInt.parse(node.literal.lexeme).toUnsigned(64);
     }
-    return JS.LiteralNumber('${node.literal}');
+    // Report an error if the integer cannot be represented in a JS double.
+    var valueInJS = BigInt.from(value.toDouble());
+    if (value != valueInJS) {
+      var lexeme = node.literal.lexeme;
+      var nearest = (lexeme.startsWith("0x") || lexeme.startsWith("0X"))
+          ? '0x${valueInJS.toRadixString(16)}'
+          : '$valueInJS';
+      errors.add(AnalysisError(_currentCompilationUnit.source, node.offset,
+          node.length, invalidJSInteger, [lexeme, nearest]));
+    }
+    return JS.LiteralNumber('$valueInJS');
+  }
+
+  /// Returns the integer value for [node].
+  BigInt _intValueForJS(IntegerLiteral node) {
+    // The Dart VM uses signed 64-bit integers, but dart4web supports unsigned
+    // 64-bit integer hex literals if they can be represented in JavaScript.
+    // So we need to reinterpret the value as an unsigned 64-bit integer.
+    //
+    // The current Dart 2.0 rules are:
+    //
+    // - A decimal literal (maybe including a leading minus) is allowed if its
+    //   numerical value is in the signed 64-bit range (-2^63..2^63-1).
+    // - A signed hexadecimal literal is allowed if its numerical value is in
+    //   the signed 64-bit ranged.
+    // - An unsigned hexadecimal literal is allowed if its numerical value is in
+    //   the *unsigned* 64-bit range (0..2^64-1).
+    //
+    // The decimal-vs-hex distinction has already been taken care of by
+    // Analyzer, so we're only concerned with ensuring those unsigned values are
+    // correctly interpreted.
+    var value = node.value;
+    return value != null ? BigInt.from(value).toUnsigned(64) : null;
   }
 
   @override
@@ -6144,15 +6151,6 @@
             () => JS.TemporaryId(jsLibraryName(_libraryRoot, library)));
   }
 
-  T closureAnnotate<T extends JS.Node>(
-      T node, Element element, AnnotatedNode original) {
-    if (options.closure) {
-      node.closureAnnotation =
-          closureAnnotationFor(node, original, element, namedArgumentTemp.name);
-    }
-    return node;
-  }
-
   /// 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/analyzer/error_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
index 95a1a26..b2a2cfe 100644
--- a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
@@ -2,11 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart' show AnalysisError, ErrorSeverity;
+import 'package:analyzer/analyzer.dart'
+    show AnalysisError, ErrorSeverity, ErrorType, StrongModeCode;
 import 'package:analyzer/source/error_processor.dart' show ErrorProcessor;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:path/path.dart' as path;
 
+/// Sorts and formats errors, returning the error messages.
+List<String> formatErrors(AnalysisContext context, List<AnalysisError> errors) {
+  sortErrors(context, errors);
+  var result = <String>[];
+  for (var e in errors) {
+    var m = formatError(context, e);
+    if (m != null) result.add(m);
+  }
+  return result;
+}
+
 // TODO(jmesserly): this code was taken from analyzer_cli.
 // It really should be in some common place so we can share it.
 // TODO(jmesserly): this shouldn't depend on `context` but we need it to compute
@@ -64,3 +76,14 @@
           ?.severity ??
       error.errorCode.errorSeverity;
 }
+
+const invalidImportDartMirrors = StrongModeCode(
+    ErrorType.COMPILE_TIME_ERROR,
+    'IMPORT_DART_MIRRORS',
+    'Cannot import "dart:mirrors" in web applications (https://goo.gl/R1anEs).');
+
+const invalidJSInteger = StrongModeCode(
+    ErrorType.COMPILE_TIME_ERROR,
+    'INVALID_JS_INTEGER',
+    "The integer literal '{0}' can't be represented exactly in JavaScript. "
+    "The nearest value that can be represented exactly is '{1}'.");
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart b/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
deleted file mode 100644
index fd61c5a..0000000
--- a/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
+++ /dev/null
@@ -1,127 +0,0 @@
-// 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.
-
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-
-import '../js_ast/js_ast.dart' as JS;
-import 'module_compiler.dart' show CompilerOptions;
-import 'js_interop.dart';
-
-/// Mixin with logic to generate [TypeRef]s out of [DartType]s.
-abstract class JSTypeRefCodegen {
-  final _resolved = <DartType, JS.TypeRef>{};
-
-  // Mixin dependencies:
-  CompilerOptions get options;
-  TypeProvider get types;
-  LibraryElement get dartJSLibrary;
-  JS.Identifier get namedArgumentTemp;
-  JS.Identifier emitLibraryName(LibraryElement e);
-
-  /// Finds the qualified path to the type.
-  JS.TypeRef _emitTopLevelTypeRef(DartType type) {
-    var e = type.element;
-    return JS.TypeRef.qualified([
-      emitLibraryName(e.library),
-      JS.Identifier(getJSExportName(e) ?? e.name)
-    ]);
-  }
-
-  JS.TypeRef emitTypeRef(DartType type) {
-    if (!options.closure) return null;
-
-    return _resolved.putIfAbsent(type, () {
-      if (type == null) JS.TypeRef.unknown();
-      // TODO(ochafik): Consider calling _loader.declareBeforeUse(type.element).
-      if (type.isBottom || type.isDynamic) JS.TypeRef.any();
-      if (type.isVoid) return JS.TypeRef.void_();
-
-      if (type == types.intType) return JS.TypeRef.number().orNull();
-      if (type == types.numType) return JS.TypeRef.number().orNull();
-      if (type == types.doubleType) return JS.TypeRef.number().orNull();
-      if (type == types.boolType) return JS.TypeRef.boolean().orNull();
-      if (type == types.stringType) return JS.TypeRef.string();
-
-      if (type is TypeParameterType) return JS.TypeRef.named(type.name);
-      if (type is ParameterizedType) {
-        JS.TypeRef rawType;
-        if (type is FunctionType && type.name == null) {
-          var args = <JS.Identifier, JS.TypeRef>{};
-          for (var param in type.parameters) {
-            if (param.isNamed) break;
-            var type = emitTypeRef(param.type);
-            args[JS.Identifier(param.name)] =
-                param.isPositional ? type.toOptional() : type;
-          }
-          var namedParamType = emitNamedParamsArgType(type.parameters);
-          if (namedParamType != null) {
-            args[namedArgumentTemp] = namedParamType.toOptional();
-          }
-
-          rawType = JS.TypeRef.function(emitTypeRef(type.returnType), args);
-        } else {
-          var jsTypeRef = _getDartJsTypeRef(type);
-          if (jsTypeRef != null) return jsTypeRef;
-
-          rawType = _emitTopLevelTypeRef(type);
-        }
-        var typeArgs = _getOwnTypeArguments(type).map(emitTypeRef);
-        return typeArgs.isEmpty
-            ? rawType
-            : JS.TypeRef.generic(rawType, typeArgs);
-      }
-      return JS.TypeRef.unknown();
-    });
-  }
-
-  JS.TypeRef emitNamedParamsArgType(Iterable<ParameterElement> params) {
-    if (!options.closure) return null;
-
-    var namedArgs = <JS.Identifier, JS.TypeRef>{};
-    for (ParameterElement param in params) {
-      if (param.isPositional) continue;
-      namedArgs[JS.Identifier(param.name)] =
-          emitTypeRef(param.type).toOptional();
-    }
-    if (namedArgs.isEmpty) return null;
-    return JS.TypeRef.record(namedArgs);
-  }
-
-  /// Gets the "own" type arguments of [type].
-  ///
-  /// Method argument with adhoc unnamed [FunctionType] inherit any type params
-  /// from their enclosing class:
-  ///
-  ///      class Foo<T> {
-  ///        void method(f()); // f has [T] as type arguments,
-  ///      }                   // but [] as its "own" type arguments.
-  Iterable<DartType> _getOwnTypeArguments(ParameterizedType type) sync* {
-    for (int i = 0, n = type.typeParameters.length; i < n; i++) {
-      if (type.typeParameters[i].enclosingElement == type.element) {
-        yield type.typeArguments[i];
-      }
-    }
-  }
-
-  /// Special treatment of types from dart:js
-  /// TODO(ochafik): Is this the right thing to do? And what about package:js?
-  JS.TypeRef _getDartJsTypeRef(DartType type) {
-    if (type.element.library == dartJSLibrary) {
-      switch (type.name) {
-        case 'JsArray':
-          return JS.TypeRef.array(
-              type is InterfaceType && type.typeArguments.length == 1
-                  ? emitTypeRef(type.typeArguments.single)
-                  : null);
-        case 'JsObject':
-          return JS.TypeRef.object();
-        case 'JsFunction':
-          return JS.TypeRef.function();
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index f5a7a53..74fea79 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -6,8 +6,7 @@
 import 'dart:convert' show json;
 import 'dart:io' show File;
 
-import 'package:analyzer/analyzer.dart'
-    show AnalysisError, CompilationUnit, ErrorSeverity, ErrorType;
+import 'package:analyzer/analyzer.dart' show AnalysisError, CompilationUnit;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/element/element.dart'
     show LibraryElement, UriReferencedElement;
@@ -16,8 +15,6 @@
     show PhysicalResourceProvider;
 import 'package:analyzer/src/context/builder.dart' show ContextBuilder;
 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
-import 'package:analyzer/src/error/codes.dart'
-    show StaticTypeWarningCode, StrongModeCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
@@ -42,7 +39,7 @@
 import '../js_ast/source_map_printer.dart' show SourceMapPrintingContext;
 import 'code_generator.dart' show CodeGenerator;
 import 'context.dart' show AnalyzerOptions, createSourceFactory;
-import 'error_helpers.dart' show errorSeverity, formatError, sortErrors;
+import 'error_helpers.dart';
 import 'extension_types.dart' show ExtensionTypeSet;
 
 /// Compiles a set of Dart files into a single JavaScript module.
@@ -130,21 +127,6 @@
     return ModuleCompiler._(context, summaryData);
   }
 
-  bool _isFatalError(AnalysisError e, CompilerOptions options) {
-    if (errorSeverity(context, e) != ErrorSeverity.ERROR) return false;
-
-    // These errors are not fatal in the REPL compile mode as we
-    // allow access to private members across library boundaries
-    // and those accesses will show up as undefined members unless
-    // additional analyzer changes are made to support them.
-    // TODO(jacobr): consider checking that the identifier name
-    // referenced by the error is private.
-    return !options.replCompile ||
-        (e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
-            e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
-            e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD);
-  }
-
   /// Compiles a single Dart build unit into a JavaScript module.
   ///
   /// *Warning* - this may require resolving the entire world.
@@ -214,32 +196,9 @@
       }
     }
 
-    sortErrors(context, errors);
-
-    var messages = <String>[];
-    for (var e in errors) {
-      var m = formatError(context, e);
-      if (m != null) messages.add(m);
-    }
-
-    if (!options.unsafeForceCompile &&
-        errors.any((e) => _isFatalError(e, options))) {
-      return JSModuleFile.invalid(unit.name, messages, options);
-    }
-
-    try {
-      var codeGenerator =
-          CodeGenerator(context, summaryData, options, _extensionTypes);
-      return codeGenerator.compile(unit, trees, messages);
-    } catch (e) {
-      if (errors.any((e) => _isFatalError(e, options))) {
-        // Force compilation failed.  Suppress the exception and report
-        // the static errors instead.
-        assert(options.unsafeForceCompile);
-        return JSModuleFile.invalid(unit.name, messages, options);
-      }
-      rethrow;
-    }
+    var codeGenerator =
+        CodeGenerator(context, summaryData, options, _extensionTypes, errors);
+    return codeGenerator.compile(unit, trees);
   }
 }
 
@@ -287,9 +246,6 @@
   /// to private members across library boundaries.
   final bool replCompile;
 
-  /// Whether to emit Closure Compiler-friendly code.
-  final bool closure;
-
   /// Mapping from absolute file paths to bazel short path to substitute in
   /// source maps.
   final Map<String, String> bazelMapping;
@@ -308,7 +264,6 @@
       this.replCompile = false,
       this.emitMetadata = false,
       this.enableAsserts = true,
-      this.closure = false,
       this.bazelMapping = const {},
       this.summaryOutPath});
 
@@ -322,7 +277,6 @@
         replCompile = args['repl-compile'] as bool,
         emitMetadata = args['emit-metadata'] as bool,
         enableAsserts = args['enable-asserts'] as bool,
-        closure = args['closure-experimental'] as bool,
         bazelMapping =
             _parseBazelMappings(args['bazel-mapping'] as List<String>),
         summaryOutPath = args['summary-out'] as String;
@@ -456,9 +410,7 @@
   JSModuleCode getCode(ModuleFormat format, String jsUrl, String mapUrl,
       {bool singleOutFile = false}) {
     var opts = JS.JavaScriptPrintingOptions(
-        emitTypes: options.closure,
-        allowKeywordsInProperties: true,
-        allowSingleLineIfStatements: true);
+        allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
     JS.SimpleJavaScriptPrintingContext printer;
     SourceMapBuilder sourceMap;
     if (options.sourceMap) {
@@ -608,8 +560,3 @@
       return Uri.file(path.absolute(source));
   }
 }
-
-const invalidImportDartMirrors = StrongModeCode(
-    ErrorType.COMPILE_TIME_ERROR,
-    'IMPORT_DART_MIRRORS',
-    'Cannot import "dart:mirrors" in web applications (https://goo.gl/R1anEs).');
diff --git a/pkg/dev_compiler/lib/src/closure/closure_annotation.dart b/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
deleted file mode 100644
index 7274d65..0000000
--- a/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
+++ /dev/null
@@ -1,133 +0,0 @@
-// 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.
-
-import '../js_ast/js_ast.dart' as JS show TypeRef, ClosureTypePrinter;
-
-/// Set of closure annotations that can be [toString]ed to a single JsDoc comment.
-/// See https://developers.google.com/closure/compiler/docs/js-for-compiler
-///
-/// TODO(ochafik): Support inclusion of 'normal' comments (including @param comments).
-class ClosureAnnotation {
-  final String comment;
-  final bool isConst;
-  final bool isConstructor;
-  final bool isFinal;
-  final bool isNoCollapse;
-  final bool isNoSideEffects;
-  final bool isOverride;
-  final bool isPrivate;
-  final bool isProtected;
-  final bool isStruct;
-  final bool isTypedef;
-  final JS.TypeRef lendsToType;
-  final JS.TypeRef returnType;
-  final JS.TypeRef superType;
-  final JS.TypeRef thisType;
-  final JS.TypeRef throwsType;
-  final JS.TypeRef type;
-  final List<JS.TypeRef> interfaces;
-  final List<String> templates;
-  final Map<String, JS.TypeRef> paramTypes;
-
-  ClosureAnnotation(
-      {this.comment,
-      this.interfaces = const [],
-      this.isConst = false,
-      this.isConstructor = false,
-      this.isFinal = false,
-      this.isNoCollapse = false,
-      this.isNoSideEffects = false,
-      this.isOverride = false,
-      this.isPrivate = false,
-      this.isProtected = false,
-      this.isStruct = false,
-      this.isTypedef = false,
-      this.lendsToType,
-      this.paramTypes = const {},
-      this.returnType,
-      this.superType,
-      this.templates = const [],
-      this.thisType,
-      this.throwsType,
-      this.type});
-
-  @override
-  int get hashCode => _cachedString.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ClosureAnnotation && _cachedString == other._cachedString;
-
-  @override
-  String toString([String indent = '']) =>
-      _cachedString.replaceAll('\n', '\n$indent');
-
-  String _print(JS.TypeRef t) => (JS.ClosureTypePrinter()..visit(t)).toString();
-
-  String __cachedString;
-  String get _cachedString {
-    if (__cachedString == null) {
-      bool isNonWildcard(JS.TypeRef t) => t != null && !t.isAny && !t.isUnknown;
-
-      var lines = <String>[];
-      if (comment != null) lines.addAll(comment.split('\n'));
-      if (templates != null && templates.isNotEmpty) {
-        lines.add('@template ${templates.join(', ')}');
-      }
-      if (thisType != null) lines.add('@this {${_print(thisType)}}');
-      if (isOverride) lines.add('@override');
-      if (isNoSideEffects) lines.add('@nosideeffects');
-      if (isNoCollapse) lines.add('@nocollapse');
-      if (lendsToType != null) lines.add('@lends {${_print(lendsToType)}}');
-
-      {
-        var typeHolders = <String>[];
-        if (isPrivate) typeHolders.add('@private');
-        if (isProtected) typeHolders.add('@protected');
-        if (isFinal) typeHolders.add('@final');
-        if (isConst) typeHolders.add('@const');
-        if (isTypedef) typeHolders.add('@typedef');
-        if (isNonWildcard(type)) {
-          if (typeHolders.isEmpty) typeHolders.add('@type');
-          typeHolders.add('{${_print(type)}}');
-        }
-        if (!typeHolders.isEmpty) lines.add(typeHolders.join(' '));
-      }
-
-      {
-        List constructorLine = [];
-        if (isConstructor) constructorLine.add('@constructor');
-        if (isStruct) constructorLine.add('@struct');
-        if (isNonWildcard(superType)) {
-          constructorLine.add('@extends {${_print(superType)}}');
-        }
-
-        if (constructorLine.isNotEmpty) lines.add(constructorLine.join(' '));
-      }
-
-      if (interfaces != null) {
-        for (var interface in interfaces) {
-          if (isNonWildcard(interface))
-            lines.add('@implements {${_print(interface)}}');
-        }
-      }
-
-      if (paramTypes != null) {
-        paramTypes.forEach((String paramName, JS.TypeRef paramType) {
-          // Must output params even with wildcard type.
-          lines.add('@param {${_print(paramType)}} $paramName');
-        });
-      }
-      if (isNonWildcard(returnType))
-        lines.add('@return {${_print(returnType)}}');
-      if (isNonWildcard(throwsType))
-        lines.add('@throws {${_print(throwsType)}}');
-
-      if (lines.length == 0) return '';
-      if (lines.length == 1) return '/** ${lines.single} */';
-      __cachedString = '/**\n' + lines.map((l) => ' * $l').join('\n') + '\n */';
-    }
-    return __cachedString;
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/closure/closure_annotator.dart b/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
deleted file mode 100644
index 133aae2..0000000
--- a/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-
-import '../js_ast/js_ast.dart' as JS show Node, TypeRef;
-
-import 'closure_annotation.dart';
-
-/// Mixin that can generate [ClosureAnnotation]s for Dart elements and types.
-abstract class ClosureAnnotator {
-  TypeProvider get types;
-
-  JS.TypeRef emitTypeRef(DartType type);
-
-  // TODO(ochafik): Handle destructured params when Closure supports it.
-  ClosureAnnotation closureAnnotationFor(JS.Node node, AnnotatedNode original,
-      Element e, String namedArgsMapName) {
-    // Note: Dart and Closure privacy are not compatible: don't set `isPrivate: e.isPrivate`.
-    return ClosureAnnotation(
-        comment: original?.documentationComment?.toSource(),
-        // Note: we don't set isConst here because Closure's constness and
-        // Dart's are not really compatible.
-        isFinal: e is VariableElement && (e.isFinal || e.isConst),
-        type: e is VariableElement
-            ? emitTypeRef(e.type /*, forceTypeDefExpansion: true*/)
-            : null,
-        superType: e is ClassElement ? emitTypeRef(e.supertype) : null,
-        interfaces:
-            e is ClassElement ? e.interfaces.map(emitTypeRef).toList() : null,
-        isOverride: e.isOverride,
-        isTypedef: e is FunctionTypeAliasElement);
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/closure/closure_type.dart b/pkg/dev_compiler/lib/src/closure/closure_type.dart
deleted file mode 100644
index bc29be0..0000000
--- a/pkg/dev_compiler/lib/src/closure/closure_type.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// 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.
-
-/// Poor-man's representation of a Closure type.
-/// See https://developers.google.com/closure/compiler/docs/js-for-compiler
-///
-/// The goal here is not to completely support Closure's type system, but to
-/// be able to generate just the types needed for DDC's JS output.
-///
-/// TODO(ochafik): Consider convergence with TypeScript, which has no nullability-awareness
-/// (see http://www.typescriptlang.org/Handbook).
-class ClosureType {
-  static const ClosureType _ALL = ClosureType._("*");
-  static const ClosureType _UNKNOWN = ClosureType._("?");
-
-  final String _representation;
-  final bool isNullable;
-
-  const ClosureType._(this._representation, {this.isNullable = true});
-
-  bool get isAll => _representation == "*";
-  bool get isUnknown => _representation == "?";
-
-  @override
-  toString() => _representation;
-
-  factory ClosureType.all() => _ALL;
-  factory ClosureType.unknown() => _UNKNOWN;
-
-  factory ClosureType.record(Map<String, ClosureType> fieldTypes) {
-    var entries = <String>[];
-    fieldTypes.forEach((n, t) => entries.add('$n: $t'));
-    return ClosureType._('{${entries.join(', ')}}');
-  }
-  factory ClosureType.function(
-      [List<ClosureType> paramTypes, ClosureType returnType]) {
-    if (paramTypes == null && returnType == null) {
-      return ClosureType.type("Function");
-    }
-    var suffix = returnType == null ? '' : ':$returnType';
-    return ClosureType._(
-        'function(${paramTypes == null ? '...*' : paramTypes.join(', ')})$suffix');
-  }
-
-  factory ClosureType.map([ClosureType keyType, ClosureType valueType]) =>
-      ClosureType._("Object<${keyType ?? _ALL}, ${valueType ?? _ALL}>");
-
-  factory ClosureType.type([String className = "Object"]) =>
-      ClosureType._(className);
-
-  factory ClosureType.array([ClosureType componentType]) =>
-      ClosureType._("Array<${componentType ?? _ALL}>");
-
-  factory ClosureType.undefined() =>
-      ClosureType._("undefined", isNullable: false);
-  factory ClosureType.number() => ClosureType._("number", isNullable: false);
-  factory ClosureType.boolean() => ClosureType._("boolean", isNullable: false);
-  factory ClosureType.string() => ClosureType._("string");
-
-  ClosureType toOptional() => ClosureType._("$this=");
-
-  ClosureType toNullable() => isNullable
-      ? this
-      : ClosureType._(
-          _representation.startsWith('!')
-              ? _representation.substring(1)
-              : "?$this",
-          isNullable: true);
-
-  ClosureType toNonNullable() => !isNullable
-      ? this
-      : ClosureType._(
-          _representation.startsWith('?')
-              ? _representation.substring(1)
-              : "!$this",
-          isNullable: false);
-
-  /// TODO(ochafik): See which optimizations make sense here (it could be that `(*|undefined)`
-  /// cannot be optimized to `*` when used to model optional record fields).
-  ClosureType or(ClosureType other) => ClosureType._("($this|$other)",
-      isNullable: isNullable || other.isNullable);
-
-  ClosureType orUndefined() => or(ClosureType.undefined());
-}
diff --git a/pkg/dev_compiler/lib/src/compiler/js_utils.dart b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
index 76686c0..a0275c6 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_utils.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
@@ -17,8 +17,7 @@
           innerFun.params.isEmpty) {
         var body = innerFun.body;
         if (body is Block) {
-          return Fun(fn.params, body,
-              typeParams: fn.typeParams, returnType: fn.returnType);
+          return Fun(fn.params, body);
         }
       }
     }
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_ast.dart b/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
index 21eadd3..ee8289e 100644
--- a/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
@@ -6,11 +6,8 @@
 
 import 'precedence.dart';
 import 'characters.dart' as charCodes;
-import '../closure/closure_annotation.dart';
 
 part 'nodes.dart';
 part 'builder.dart';
-part 'js_types.dart';
 part 'printer.dart';
 part 'template.dart';
-part 'type_printer.dart';
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_types.dart b/pkg/dev_compiler/lib/src/js_ast/js_types.dart
deleted file mode 100644
index e45c96c..0000000
--- a/pkg/dev_compiler/lib/src/js_ast/js_types.dart
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of js_ast;
-
-final _any = AnyTypeRef._();
-final _unknown = UnknownTypeRef._();
-final _null = NullTypeRef();
-
-/// JavaScript type reference, designed to support a subset of the type systems
-/// of the Closure Compiler and TypeScript:
-/// - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
-/// - https://github.com/Microsoft/TypeScript/blob/v1.8.0-beta/doc/spec.md#3
-///
-/// Note that some subtleties like "nullability" or "optionality" are handled
-/// using unions (with a [NullTypeRef] or with an "undefined" named typeref).
-/// Also, primitives aren't modeled differently than named / qualified types,
-/// as it brings little value for now. Primitive-specific type formatting is
-/// handled by the type printers (for instance, the knowledge that
-/// `number|null` is just `number` in TypeScript, and is `number?` in Closure).
-abstract class TypeRef extends Expression {
-  int get precedenceLevel => PRIMARY;
-
-  TypeRef();
-
-  factory TypeRef.any() => _any;
-
-  factory TypeRef.void_() => TypeRef.named('void');
-
-  factory TypeRef.unknown() => _unknown;
-
-  factory TypeRef.generic(TypeRef rawType, Iterable<TypeRef> typeArgs) {
-    if (typeArgs.isEmpty) {
-      throw ArgumentError.value(typeArgs, "typeArgs", "is empty");
-    }
-    return GenericTypeRef(rawType, typeArgs.toList());
-  }
-
-  factory TypeRef.array([TypeRef elementType]) => ArrayTypeRef(elementType);
-
-  factory TypeRef.object([TypeRef keyType, TypeRef valueType]) {
-    // TODO(ochafik): Roll out a dedicated ObjectTypeRef?
-    var rawType = TypeRef.named('Object');
-    return keyType == null && valueType == null
-        ? rawType
-        : GenericTypeRef(rawType, [keyType ?? _any, valueType ?? _any]);
-  }
-
-  factory TypeRef.function(
-          [TypeRef returnType, Map<Identifier, TypeRef> paramTypes]) =>
-      FunctionTypeRef(returnType, paramTypes);
-
-  factory TypeRef.record(Map<Identifier, TypeRef> types) =>
-      RecordTypeRef(types);
-
-  factory TypeRef.string() => TypeRef.named('string');
-
-  factory TypeRef.number() => TypeRef.named('number');
-
-  factory TypeRef.undefined() => TypeRef.named('undefined');
-
-  factory TypeRef.boolean() => TypeRef.named('boolean');
-
-  factory TypeRef.qualified(List<Identifier> path) => QualifiedTypeRef(path);
-
-  factory TypeRef.named(String name) =>
-      TypeRef.qualified(<Identifier>[Identifier(name)]);
-
-  bool get isAny => this is AnyTypeRef;
-  bool get isUnknown => this is UnknownTypeRef;
-  bool get isNull => this is NullTypeRef;
-
-  TypeRef or(TypeRef other) => UnionTypeRef([this, other]);
-
-  TypeRef orUndefined() => or(TypeRef.undefined());
-  TypeRef orNull() => or(_null);
-
-  TypeRef toOptional() => OptionalTypeRef(this);
-}
-
-class AnyTypeRef extends TypeRef {
-  AnyTypeRef._() : super();
-
-  factory AnyTypeRef() => _any;
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitAnyTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {}
-  _clone() => AnyTypeRef();
-}
-
-class NullTypeRef extends QualifiedTypeRef {
-  NullTypeRef() : super([Identifier("null")]);
-  _clone() => NullTypeRef();
-}
-
-class UnknownTypeRef extends TypeRef {
-  UnknownTypeRef._() : super();
-
-  factory UnknownTypeRef() => _unknown;
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitUnknownTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {}
-  _clone() => UnknownTypeRef();
-}
-
-class QualifiedTypeRef extends TypeRef {
-  final List<Identifier> path;
-  QualifiedTypeRef(this.path);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitQualifiedTypeRef(this);
-  void visitChildren(NodeVisitor visitor) =>
-      path.forEach((p) => p.accept(visitor));
-  _clone() => QualifiedTypeRef(path);
-}
-
-class ArrayTypeRef extends TypeRef {
-  final TypeRef elementType;
-  ArrayTypeRef(this.elementType);
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    elementType.accept(visitor);
-  }
-
-  _clone() => ArrayTypeRef(elementType);
-}
-
-class GenericTypeRef extends TypeRef {
-  final TypeRef rawType;
-  final List<TypeRef> typeArgs;
-  GenericTypeRef(this.rawType, this.typeArgs);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitGenericTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    rawType.accept(visitor);
-    typeArgs.forEach((p) => p.accept(visitor));
-  }
-
-  _clone() => GenericTypeRef(rawType, typeArgs);
-}
-
-class UnionTypeRef extends TypeRef {
-  final List<TypeRef> types;
-  UnionTypeRef(this.types);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitUnionTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    types.forEach((p) => p.accept(visitor));
-  }
-
-  _clone() => UnionTypeRef(types);
-
-  @override
-  TypeRef or(TypeRef other) {
-    if (types.contains(other)) return this;
-    return UnionTypeRef([]
-      ..addAll(types)
-      ..add(other));
-  }
-}
-
-class OptionalTypeRef extends TypeRef {
-  final TypeRef type;
-  OptionalTypeRef(this.type);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitOptionalTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    type.accept(visitor);
-  }
-
-  _clone() => OptionalTypeRef(type);
-
-  @override
-  TypeRef orUndefined() => this;
-}
-
-class RecordTypeRef extends TypeRef {
-  final Map<Identifier, TypeRef> types;
-  RecordTypeRef(this.types);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitRecordTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    types.values.forEach((p) => p.accept(visitor));
-  }
-
-  _clone() => RecordTypeRef(types);
-}
-
-class FunctionTypeRef extends TypeRef {
-  final TypeRef returnType;
-  final Map<Identifier, TypeRef> paramTypes;
-  FunctionTypeRef(this.returnType, this.paramTypes);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitFunctionTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    returnType.accept(visitor);
-    paramTypes.forEach((n, t) {
-      n.accept(visitor);
-      t.accept(visitor);
-    });
-  }
-
-  _clone() => FunctionTypeRef(returnType, paramTypes);
-}
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 2af42b1..810bedf 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -4,7 +4,7 @@
 
 part of js_ast;
 
-abstract class NodeVisitor<T> implements TypeRefVisitor<T> {
+abstract class NodeVisitor<T> {
   T visitProgram(Program node);
 
   T visitBlock(Block node);
@@ -95,18 +95,6 @@
   T visitSimpleBindingPattern(SimpleBindingPattern node);
 }
 
-abstract class TypeRefVisitor<T> {
-  T visitQualifiedTypeRef(QualifiedTypeRef node);
-  T visitGenericTypeRef(GenericTypeRef node);
-  T visitUnionTypeRef(UnionTypeRef node);
-  T visitRecordTypeRef(RecordTypeRef node);
-  T visitOptionalTypeRef(OptionalTypeRef node);
-  T visitFunctionTypeRef(FunctionTypeRef node);
-  T visitAnyTypeRef(AnyTypeRef node);
-  T visitUnknownTypeRef(UnknownTypeRef node);
-  T visitArrayTypeRef(ArrayTypeRef node);
-}
-
 class BaseVisitor<T> implements NodeVisitor<T> {
   T visitNode(Node node) {
     node.visitChildren(this);
@@ -229,17 +217,6 @@
       visitBindingPattern(node);
   T visitDestructuredVariable(DestructuredVariable node) => visitNode(node);
   T visitSimpleBindingPattern(SimpleBindingPattern node) => visitNode(node);
-
-  T visitTypeRef(TypeRef node) => visitNode(node);
-  T visitQualifiedTypeRef(QualifiedTypeRef node) => visitTypeRef(node);
-  T visitGenericTypeRef(GenericTypeRef node) => visitTypeRef(node);
-  T visitOptionalTypeRef(OptionalTypeRef node) => visitTypeRef(node);
-  T visitRecordTypeRef(RecordTypeRef node) => visitTypeRef(node);
-  T visitUnionTypeRef(UnionTypeRef node) => visitTypeRef(node);
-  T visitFunctionTypeRef(FunctionTypeRef node) => visitTypeRef(node);
-  T visitAnyTypeRef(AnyTypeRef node) => visitTypeRef(node);
-  T visitUnknownTypeRef(UnknownTypeRef node) => visitTypeRef(node);
-  T visitArrayTypeRef(ArrayTypeRef node) => visitTypeRef(node);
 }
 
 abstract class Node {
@@ -247,9 +224,6 @@
   /// setting this after construction.
   Object sourceInformation;
 
-  /// Closure annotation of this node.
-  ClosureAnnotation closureAnnotation;
-
   T accept<T>(NodeVisitor<T> visitor);
   void visitChildren(NodeVisitor visitor);
 
@@ -892,13 +866,9 @@
 
   final BindingPattern structure;
   final Expression defaultValue;
-  final TypeRef type;
+
   DestructuredVariable(
-      {this.name,
-      this.property,
-      this.structure,
-      this.defaultValue,
-      this.type}) {
+      {this.name, this.property, this.structure, this.defaultValue}) {
     assert(name != null || structure != null);
   }
 
@@ -1177,16 +1147,13 @@
   int get precedenceLevel => UNARY;
 }
 
-abstract class Parameter implements Expression, VariableBinding {
-  TypeRef get type;
-}
+abstract class Parameter implements Expression, VariableBinding {}
 
 class Identifier extends Expression implements Parameter {
   final String name;
   final bool allowRename;
-  final TypeRef type;
 
-  Identifier(this.name, {this.allowRename = true, this.type}) {
+  Identifier(this.name, {this.allowRename = true}) {
     if (!_identifierRE.hasMatch(name)) {
       throw ArgumentError.value(name, "name", "not a valid identifier");
     }
@@ -1204,7 +1171,6 @@
 // This is an expression for convenience in the AST.
 class RestParameter extends Expression implements Parameter {
   final Identifier parameter;
-  TypeRef get type => null;
 
   RestParameter(this.parameter);
 
@@ -1278,24 +1244,13 @@
 }
 
 abstract class FunctionExpression extends Expression {
+  Node get body; // Expression or block
   List<Parameter> get params;
-
-  get body; // Expression or block
-  /// Type parameters passed to this generic function, if any. `null` otherwise.
-  // TODO(ochafik): Support type bounds.
-  List<Identifier> get typeParams;
-
-  /// Return type of this function, if any. `null` otherwise.
-  TypeRef get returnType;
 }
 
 class Fun extends FunctionExpression {
   final List<Parameter> params;
   final Block body;
-  @override
-  final List<Identifier> typeParams;
-  @override
-  final TypeRef returnType;
 
   /** Whether this is a JS generator (`function*`) that may contain `yield`. */
   final bool isGenerator;
@@ -1304,9 +1259,7 @@
 
   Fun(this.params, this.body,
       {this.isGenerator = false,
-      this.asyncModifier = const AsyncModifier.sync(),
-      this.typeParams,
-      this.returnType});
+      this.asyncModifier = const AsyncModifier.sync()});
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitFun(this);
 
@@ -1324,12 +1277,8 @@
 class ArrowFun extends FunctionExpression {
   final List<Parameter> params;
   final body; // Expression or Block
-  @override
-  final List<Identifier> typeParams;
-  @override
-  final TypeRef returnType;
 
-  ArrowFun(this.params, this.body, {this.typeParams, this.returnType});
+  ArrowFun(this.params, this.body);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrowFun(this);
 
@@ -1627,15 +1576,7 @@
   final Expression heritage; // Can be null.
   final List<Method> methods;
 
-  /// Type parameters of this class, if any. `null` otherwise.
-  // TODO(ochafik): Support type bounds.
-  final List<Identifier> typeParams;
-
-  /// Field declarations of this class (TypeScript / ES6_TYPED).
-  final List<VariableDeclarationList> fields;
-
-  ClassExpression(this.name, this.heritage, this.methods,
-      {this.typeParams, this.fields});
+  ClassExpression(this.name, this.heritage, this.methods);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitClassExpression(this);
 
@@ -1643,23 +1584,12 @@
     name.accept(visitor);
     if (heritage != null) heritage.accept(visitor);
     for (Method element in methods) element.accept(visitor);
-    if (fields != null) {
-      for (var field in fields) {
-        field.accept(visitor);
-      }
-    }
-    if (typeParams != null) {
-      for (var typeParam in typeParams) {
-        typeParam.accept(visitor);
-      }
-    }
   }
 
   @override
   ClassDeclaration toStatement() => ClassDeclaration(this);
 
-  ClassExpression _clone() => ClassExpression(name, heritage, methods,
-      typeParams: typeParams, fields: fields);
+  ClassExpression _clone() => ClassExpression(name, heritage, methods);
 
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 }
@@ -1726,7 +1656,6 @@
     with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
-  TypeRef get type => null;
 
   String get name {
     throw "InterpolatedParameter.name must not be invoked";
@@ -1797,7 +1726,6 @@
     with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
-  TypeRef get type => null;
 
   InterpolatedIdentifier(this.nameOrPosition);
 
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index da72745..a85c386 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -8,7 +8,6 @@
   final bool shouldCompressOutput;
   final bool minifyLocalVariables;
   final bool preferSemicolonToNewlineInMinifiedOutput;
-  final bool emitTypes;
   final bool allowSingleLineIfStatements;
 
   /// True to allow keywords in properties, such as `obj.var` or `obj.function`
@@ -19,7 +18,6 @@
       {this.shouldCompressOutput = false,
       this.minifyLocalVariables = false,
       this.preferSemicolonToNewlineInMinifiedOutput = false,
-      this.emitTypes = false,
       this.allowKeywordsInProperties = false,
       this.allowSingleLineIfStatements = false});
 }
@@ -58,7 +56,7 @@
 
 // TODO(ochafik): Inline the body of [TypeScriptTypePrinter] here if/when it no
 // longer needs to share utils with [ClosureTypePrinter].
-class Printer extends TypeScriptTypePrinter implements NodeVisitor {
+class Printer implements NodeVisitor {
   final JavaScriptPrintingOptions options;
   final JavaScriptPrintingContext context;
   final bool shouldCompressOutput;
@@ -296,7 +294,6 @@
 
   visitExpressionStatement(ExpressionStatement expressionStatement) {
     indent();
-    outClosureAnnotation(expressionStatement);
     visitNestedExpression(expressionStatement.expression, EXPRESSION,
         newInForInit: false, newAtStatementBegin: true);
     outSemicolonLn();
@@ -558,14 +555,12 @@
           newInForInit: false, newAtStatementBegin: false);
     }
     localNamer.enterScope(fun);
-    outTypeParams(fun.typeParams);
     out("(");
     if (fun.params != null) {
       visitCommaSeparated(fun.params, PRIMARY,
           newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
-    outTypeAnnotation(fun.returnType);
     switch (fun.asyncModifier) {
       case const AsyncModifier.sync():
         break;
@@ -585,7 +580,6 @@
 
   visitFunctionDeclaration(FunctionDeclaration declaration) {
     indent();
-    outClosureAnnotation(declaration);
     var f = declaration.function;
     context.enterNode(f);
     functionOut(f, declaration.name);
@@ -623,7 +617,6 @@
   }
 
   visitVariableDeclarationList(VariableDeclarationList list) {
-    outClosureAnnotation(list);
     // Note: keyword can be null for non-static field declarations.
     if (list.keyword != null) {
       out(list.keyword);
@@ -665,7 +658,6 @@
       }
       visit(structure);
     }
-    outTypeAnnotation(node.type);
     var defaultValue = node.defaultValue;
     if (defaultValue != null) {
       spaceOut();
@@ -695,7 +687,6 @@
   }
 
   visitVariableInitialization(VariableInitialization init) {
-    outClosureAnnotation(init);
     visitNestedExpression(init.declaration, LEFT_HAND_SIDE,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     if (init.value != null) {
@@ -898,7 +889,6 @@
 
   visitIdentifier(Identifier node) {
     out(localNamer.getName(node));
-    outTypeAnnotation(node.type);
   }
 
   visitRestParameter(RestParameter node) {
@@ -966,9 +956,7 @@
 
   visitArrowFun(ArrowFun fun) {
     localNamer.enterScope(fun);
-    if (fun.params.length == 1 &&
-        fun.params[0] is Identifier &&
-        (!options.emitTypes || fun.params[0].type == null)) {
+    if (fun.params.length == 1 && fun.params[0] is Identifier) {
       visitNestedExpression(fun.params.single, SPREAD,
           newInForInit: false, newAtStatementBegin: false);
     } else {
@@ -977,7 +965,6 @@
           newInForInit: false, newAtStatementBegin: false);
       out(")");
     }
-    outTypeAnnotation(fun.returnType);
     spaceOut();
     out("=>");
     var body = fun.body;
@@ -1116,24 +1103,10 @@
     lineOut();
   }
 
-  void outTypeParams(Iterable<Identifier> typeParams) {
-    if (typeParams != null && options.emitTypes && typeParams.isNotEmpty) {
-      out("<");
-      var first = true;
-      for (var typeParam in typeParams) {
-        if (!first) out(", ");
-        first = false;
-        visit(typeParam);
-      }
-      out(">");
-    }
-  }
-
   visitClassExpression(ClassExpression node) {
     localNamer.enterScope(node);
     out('class ');
     visit(node.name);
-    outTypeParams(node.typeParams);
     if (node.heritage != null) {
       out(' extends ');
       visit(node.heritage);
@@ -1143,14 +1116,6 @@
       out('{');
       lineOut();
       indentMore();
-      if (options.emitTypes && node.fields != null) {
-        for (var field in node.fields) {
-          indent();
-          visit(field);
-          out(";");
-          lineOut();
-        }
-      }
       for (var method in node.methods) {
         indent();
         visit(method);
@@ -1166,7 +1131,6 @@
   }
 
   visitMethod(Method node) {
-    outClosureAnnotation(node);
     if (node.isStatic) {
       out('static ');
     }
@@ -1198,17 +1162,6 @@
     localNamer.leaveScope();
   }
 
-  void outClosureAnnotation(Node node) {
-    if (node != null && node.closureAnnotation != null) {
-      String comment = node.closureAnnotation.toString(indentation);
-      if (comment.isNotEmpty) {
-        out(comment);
-        lineOut();
-        indent();
-      }
-    }
-  }
-
   void propertyNameOut(Expression node,
       {bool inMethod = false, bool inAccess = false}) {
     if (node is LiteralNumber) {
@@ -1404,18 +1357,6 @@
     out("await ");
     visit(node.expression);
   }
-
-  void outTypeAnnotation(TypeRef node) {
-    if (node == null || !options.emitTypes || node.isUnknown) return;
-
-    if (node is OptionalTypeRef) {
-      out("?: ");
-      visit(node.type);
-    } else {
-      out(": ");
-      visit(node);
-    }
-  }
 }
 
 // Collects all the var declarations in the function.  We need to do this in a
diff --git a/pkg/dev_compiler/lib/src/js_ast/template.dart b/pkg/dev_compiler/lib/src/js_ast/template.dart
index 6475446..178b15c 100644
--- a/pkg/dev_compiler/lib/src/js_ast/template.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/template.dart
@@ -598,7 +598,7 @@
 
   Instantiator<ArrowFun> visitArrowFun(ArrowFun node) {
     var paramMakers = node.params.map(visitSplayable).toList();
-    Instantiator makeBody = visit(node.body as Node);
+    Instantiator makeBody = visit(node.body);
     return (a) => ArrowFun(splayNodes(paramMakers, a), makeBody(a));
   }
 
@@ -700,32 +700,6 @@
   Instantiator visitExportClause(ExportClause node) =>
       throw UnimplementedError();
 
-  Instantiator visitAnyTypeRef(AnyTypeRef node) => throw UnimplementedError();
-
-  Instantiator visitUnknownTypeRef(UnknownTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitArrayTypeRef(ArrayTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitFunctionTypeRef(FunctionTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitGenericTypeRef(GenericTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitQualifiedTypeRef(QualifiedTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitOptionalTypeRef(OptionalTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitRecordTypeRef(RecordTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitUnionTypeRef(UnionTypeRef node) =>
-      throw UnimplementedError();
-
   @override
   Instantiator<DestructuredVariable> visitDestructuredVariable(
       DestructuredVariable node) {
diff --git a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart b/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
deleted file mode 100644
index 5123482..0000000
--- a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of js_ast;
-
-abstract class _TypePrinterBase implements TypeRefVisitor {
-  void out(String s);
-  void visit(Node node);
-
-  void outSeparated<T extends Node>(String separator, Iterable<T> items,
-      [action(T item)]) {
-    action ??= visit;
-    var first = true;
-    for (var item in items) {
-      if (first) {
-        first = false;
-      } else {
-        out(separator);
-      }
-      action(item);
-    }
-  }
-
-  void outTypeArg(Iterable<TypeRef> typeArgs) {
-    if (typeArgs.isNotEmpty) {
-      // TODO(ochafik): Double-check precedence issues when we start emitting
-      // type arguments outside type literals (generic method call, etc).
-      out('<');
-      outSeparated(", ", typeArgs);
-      out('>');
-    }
-  }
-
-  @override
-  visitQualifiedTypeRef(QualifiedTypeRef node) {
-    outSeparated(".", node.path);
-  }
-}
-
-abstract class TypeScriptTypePrinter extends _TypePrinterBase {
-  void _outTypeAnnotation(TypeRef type) {
-    if (type is OptionalTypeRef) {
-      out("?: ");
-      visit(type.type);
-    } else {
-      out(": ");
-      visit(type);
-    }
-  }
-
-  @override
-  visitGenericTypeRef(GenericTypeRef node) {
-    if (node.rawType is FunctionTypeRef) {
-      outTypeArg(node.typeArgs);
-      visit(node.rawType);
-    } else {
-      visit(node.rawType);
-      outTypeArg(node.typeArgs);
-    }
-  }
-
-  @override
-  visitArrayTypeRef(ArrayTypeRef node) {
-    if (node.elementType == null) {
-      out("Array");
-    } else {
-      visit(node.elementType);
-      out("[]");
-    }
-  }
-
-  @override
-  visitOptionalTypeRef(OptionalTypeRef node) {
-    visit(node.type);
-  }
-
-  @override
-  visitRecordTypeRef(RecordTypeRef node) {
-    out('{');
-    outSeparated(", ", node.types.keys, (Identifier name) {
-      var type = node.types[name];
-      visit(name);
-      _outTypeAnnotation(type);
-    });
-    out('}');
-  }
-
-  @override
-  visitUnionTypeRef(UnionTypeRef node) {
-    outSeparated("|", node.types.where((t) => !t.isNull));
-  }
-
-  @override
-  visitFunctionTypeRef(FunctionTypeRef node) {
-    if (node.returnType == null) {
-      out('Function');
-    } else {
-      out('(');
-      if (node.paramTypes == null) {
-        out('...any');
-      } else {
-        outSeparated(", ", node.paramTypes.keys, (Identifier name) {
-          var paramType = node.paramTypes[name];
-          visit(name);
-          _outTypeAnnotation(paramType);
-        });
-      }
-      out(') => ');
-      visit(node.returnType);
-    }
-  }
-
-  @override
-  visitAnyTypeRef(AnyTypeRef node) {
-    out("any");
-  }
-
-  @override
-  visitUnknownTypeRef(UnknownTypeRef node) {
-    out("any");
-  }
-}
-
-class ClosureTypePrinter extends _TypePrinterBase implements NodeVisitor {
-  final _buffer = StringBuffer();
-
-  @override
-  void out(String s) => _buffer.write(s);
-
-  @override
-  void visit(Node node) => node.accept(this);
-
-  noSuchMethod(Invocation i) => super.noSuchMethod(i);
-
-  @override
-  visitGenericTypeRef(GenericTypeRef node) {
-    visit(node.rawType);
-    outTypeArg(node.typeArgs);
-  }
-
-  @override
-  visitIdentifier(Identifier node) {
-    //out(localNamer.getName(node));
-    out(node.name);
-  }
-
-  @override
-  visitAccess(PropertyAccess node) {
-    var selector = node.selector;
-    if (selector is LiteralString) {
-      visit(node.receiver);
-      out(".");
-      out(selector.valueWithoutQuotes);
-    } else {
-      assert(false);
-      out("?");
-    }
-  }
-
-  @override
-  toString() => _buffer.toString();
-
-  @override
-  visitArrayTypeRef(ArrayTypeRef node) {
-    out("Array");
-    if (node.elementType != null) {
-      out("<");
-      visit(node.elementType);
-      out(">");
-    }
-  }
-
-  @override
-  visitOptionalTypeRef(OptionalTypeRef node) {
-    visit(node.type);
-    out("=");
-  }
-
-  @override
-  visitRecordTypeRef(RecordTypeRef node) {
-    out('{');
-    outSeparated(", ", node.types.keys, (Identifier name) {
-      var type = node.types[name];
-      visit(name);
-      out(": ");
-      visit(type is OptionalTypeRef ? type.orUndefined() : type);
-    });
-    out('}');
-  }
-
-  @override
-  visitAnyTypeRef(AnyTypeRef node) {
-    out("*");
-  }
-
-  @override
-  visitUnknownTypeRef(UnknownTypeRef node) {
-    out("?");
-  }
-
-  @override
-  visitUnionTypeRef(UnionTypeRef node) {
-    out("(");
-    outSeparated("|", node.types);
-    out(")");
-  }
-
-  @override
-  visitFunctionTypeRef(FunctionTypeRef node) {
-    if (node.returnType == null) {
-      out('Function');
-    } else {
-      out('function(');
-      if (node.paramTypes == null) {
-        out("...*");
-      } else {
-        outSeparated(", ", node.paramTypes.values);
-      }
-      out(')');
-      if (node.returnType != null) {
-        out(":");
-        visit(node.returnType);
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 3d6f202..d7d658e 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4839,8 +4839,7 @@
 
     // Convert `function(...) { ... }` to `(...) => ...`
     // This is for readability, but it also ensures correct `this` binding.
-    return JS.ArrowFun(f.params, body,
-        typeParams: f.typeParams, returnType: f.returnType);
+    return JS.ArrowFun(f.params, body);
   }
 
   @override
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 79448fc..60a79c7 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -252,7 +252,7 @@
         if (value != null) return canonicalize(StringConstant(value));
         return defaultArg ?? nullConstant;
       } else if (targetClass == coreTypes.intClass) {
-        var intValue = int.parse(value ?? '', onError: (_) => null);
+        var intValue = int.tryParse(value ?? '');
         if (intValue != null) return canonicalize(IntConstant(intValue));
         return defaultArg ?? nullConstant;
       } else if (targetClass == coreTypes.boolClass) {
diff --git a/pkg/dev_compiler/package.json b/pkg/dev_compiler/package.json
deleted file mode 100644
index 0abdbd3..0000000
--- a/pkg/dev_compiler/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "dev_compiler",
-  "version": "0.1.24",
-  "description": "Dart Development Compiler",
-  "homepage": "https://github.com/dart-lang/dev_compiler",
-  "bugs": "https://github.com/dart-lang/dev_compiler/issues",
-  "contributors": {
-    "Dart Team": "dev-compiler@dartlang.org"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/dart-lang/dev_compiler.git"
-  },
-  "scripts": {
-    "postinstall": "./node_modules/.bin/webdriver-manager update",
-    "test": "./node_modules/.bin/karma start --single-run"
-  },
-  "devDependencies": {
-    "chai": "^2.2.0",
-    "electron-prebuilt": "^0.36.0",
-    "is_js": "^0.9.0",
-    "karma": "^1.5.0",
-    "karma-chai": "^0.1.0",
-    "karma-chrome-launcher": "^0.1.8",
-    "karma-electron-launcher": "^0.0.5",
-    "karma-firefox-launcher": "~0.1",
-    "karma-mocha": "^0.1.10",
-    "karma-requirejs": "^0.2.2",
-    "karma-safari-launcher": "^1.0.0",
-    "mocha": "^2.2.4",
-    "requirejs": "^2.3.3",
-    "webdriver-manager": "8.0.0"
-  }
-}
diff --git a/pkg/dev_compiler/test-main.js b/pkg/dev_compiler/test-main.js
deleted file mode 100644
index 68b3ad1..0000000
--- a/pkg/dev_compiler/test-main.js
+++ /dev/null
@@ -1,65 +0,0 @@
-var allTestFiles = [];
-var TEST_REGEXP = /(_test|_multi)\.js$/i;
-
-var pathToModule = function(path) {
-  return path.replace(/^\/base\//, '').replace(/\.js$/, '');
-};
-
-var testsToSkip = [
-  // syntax error in DDC's generated code (related to break/continue labels):
-  '/base/gen/codegen_output/language/execute_finally6_test.js',
-  '/base/gen/codegen_output/language/switch_label2_test.js',
-  '/base/gen/codegen_output/language/infinite_switch_label_test.js',
-  '/base/gen/codegen_output/language/switch_label_test.js',
-  '/base/gen/codegen_output/language/nested_switch_label_test.js',
-  '/base/gen/codegen_output/language/switch_try_catch_test.js',
-
-  // module code execution error in DDC's generated code
-  // (types are initialized incorrectly):
-  '/base/gen/codegen_output/language/f_bounded_quantification3_test.js',
-  '/base/gen/codegen_output/language/regress_16640_test.js',
-  '/base/gen/codegen_output/language/cyclic_type_test_02_multi.js',
-  '/base/gen/codegen_output/language/cyclic_type_test_03_multi.js',
-  '/base/gen/codegen_output/language/cyclic_type_test_04_multi.js',
-  '/base/gen/codegen_output/language/cyclic_type2_test.js',
-  '/base/gen/codegen_output/language/least_upper_bound_expansive_test_none_multi.js'
-];
-
-Object.keys(window.__karma__.files).forEach(function(file) {
-  if (TEST_REGEXP.test(file) && testsToSkip.indexOf(file) == -1) {
-    // Normalize paths to RequireJS module names.
-    allTestFiles.push(pathToModule(file));
-  }
-});
-
-allTestFiles.push('test/browser/language_tests');
-allTestFiles.push('test/browser/runtime_tests');
-
-require.config({
-  // Karma serves files under /base.
-  baseUrl: '/base',
-
-  // Travis bots take a bit longer to load all ~2k test files.
-  waitSeconds: 30,
-
-  paths: {
-    dart_sdk: 'lib/js/amd/dart_sdk',
-    async_helper: 'gen/codegen_output/pkg/async_helper',
-    expect: 'gen/codegen_output/pkg/expect',
-    js: 'gen/codegen_output/pkg/js',
-    matcher: 'gen/codegen_output/pkg/matcher',
-    meta: 'gen/codegen_output/pkg/meta',
-    minitest: 'gen/codegen_output/pkg/minitest',
-    path: 'gen/codegen_output/pkg/path',
-    stack_trace: 'gen/codegen_output/pkg/stack_trace',
-    unittest: 'gen/codegen_output/pkg/unittest',
-    is: 'node_modules/is_js/is',
-    test_status: 'gen/codegen_output/test_status'
-  },
-
-  // Require all test files before starting tests.
-  deps: allTestFiles,
-
-  // We have to kickoff jasmine, as it is asynchronous
-  callback: window.__karma__.start
-});
diff --git a/pkg/dev_compiler/test/all_tests.dart b/pkg/dev_compiler/test/all_tests.dart
deleted file mode 100644
index 963e55c..0000000
--- a/pkg/dev_compiler/test/all_tests.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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.
-
-/// Meta-test that runs all tests we have written.
-library dev_compiler.test.all_tests;
-
-import 'package:test/test.dart';
-
-import 'closure/closure_annotation_test.dart' as closure_annotation_test;
-import 'closure/closure_type_test.dart' as closure_type_test;
-import 'codegen_test.dart' as codegen_test;
-import 'js/builder_test.dart' as builder_test;
-import 'options/options_test.dart' as options_test;
-import 'worker/worker_test.dart' as worker_test;
-
-void main() {
-  group('options', options_test.main);
-  group('codegen', () => codegen_test.main([]));
-  group('closure', () {
-    closure_annotation_test.main();
-    closure_type_test.main();
-  });
-  group('js', builder_test.main);
-  group('worker', worker_test.main);
-}
diff --git a/pkg/dev_compiler/test/child_server_process.dart b/pkg/dev_compiler/test/child_server_process.dart
deleted file mode 100644
index f274290..0000000
--- a/pkg/dev_compiler/test/child_server_process.dart
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-import 'dart:async';
-
-class ChildServerProcess {
-  /// [IOSink]s like [stdout] don't like to be piped more than one [Stream], but
-  /// we want to pipe many of them (basically, every standard output and error
-  /// of every child process we open), so we pipe to an accommodating consumer.
-  static final _consoleOut = _MultipleStreamConsumer(stdout);
-
-  final Process process;
-  final String host;
-  final int port;
-  ChildServerProcess._(this.process, this.host, this.port);
-
-  get httpUri => Uri.parse('http://$host:$port');
-
-  static build(Future<Process> builder(String host, int port),
-      {int defaultPort = 1024,
-      int maxPort = 65535,
-      String host = '0.0.0.0'}) async {
-    var port = await _findUnusedPort(defaultPort, maxPort);
-    var p = (await builder(host, port))
-      ..stdout.pipe(_consoleOut)
-      ..stderr.pipe(_consoleOut);
-    await _waitForServer(host, port);
-    return ChildServerProcess._(p, host, port);
-  }
-
-  static _waitForServer(String host, int port,
-      {int attempts = 10,
-      Duration retryDelay = const Duration(seconds: 1)}) async {
-    var lastError;
-    for (int i = 0; i < attempts; i++) {
-      try {
-        await (await Socket.connect(host, port)).close();
-        return;
-      } catch (e) {
-        lastError = e;
-        await Future.delayed(retryDelay);
-      }
-    }
-    throw StateError(
-        'Failed to connect to $host:$port after $attempts attempts; '
-        'Last error:\n$lastError');
-  }
-
-  static Future<int> _findUnusedPort(int fromPort, int toPort) async {
-    var lastError;
-    for (int port = fromPort; port <= toPort; port++) {
-      try {
-        await (await ServerSocket.bind(InternetAddress.ANY_IP_V4, port))
-            .close();
-        return port;
-      } catch (e) {
-        lastError = e;
-      }
-    }
-    throw StateError(
-        'Failed to find an unused port between $fromPort and $toPort; '
-        'Last error:\n$lastError');
-  }
-}
-
-/// A consumer into which we can pipe as many streams as we want, that forwards
-/// everything to an [IOSink] (such as [stdout]).
-class _MultipleStreamConsumer extends StreamConsumer<List<int>> {
-  final IOSink _sink;
-  _MultipleStreamConsumer(this._sink);
-
-  @override
-  Future addStream(Stream<List<int>> stream) async {
-    await for (var data in stream) {
-      _sink.add(data);
-    }
-  }
-
-  @override
-  close() {}
-}
diff --git a/pkg/dev_compiler/test/closure/closure_annotation_test.dart b/pkg/dev_compiler/test/closure/closure_annotation_test.dart
deleted file mode 100644
index e3347c6..0000000
--- a/pkg/dev_compiler/test/closure/closure_annotation_test.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.
-
-library dev_compiler.test.closure_annotation_test;
-
-import 'package:test/test.dart';
-
-import 'package:dev_compiler/src/closure/closure_annotation.dart';
-import 'package:dev_compiler/src/js_ast/js_ast.dart' show TypeRef, Identifier;
-
-void main() {
-  group('ClosureAnnotation', () {
-    var anyType = TypeRef.any();
-    var unknownType = TypeRef.unknown();
-    var numberType = TypeRef.number();
-    var stringType = TypeRef.string();
-    var booleanType = TypeRef.boolean();
-    var fooType = TypeRef.qualified([Identifier("foo"), Identifier("Foo")]);
-    var barType = TypeRef.named("Bar");
-    var bazType = TypeRef.named("Baz");
-    var bamType = TypeRef.named("Bam");
-    var batType = TypeRef.named("Bat");
-
-    test('gives empty comment when no has no meaningful info', () {
-      expect(ClosureAnnotation().toString(), "");
-      expect(ClosureAnnotation(type: anyType).toString(), "");
-      expect(ClosureAnnotation(type: unknownType).toString(), "");
-    });
-
-    test('gives single line comment when it fits', () {
-      expect(ClosureAnnotation(type: numberType).toString(),
-          "/** @type {number} */");
-      expect(ClosureAnnotation(paramTypes: {'foo': anyType}).toString(),
-          "/** @param {*} foo */");
-      expect(ClosureAnnotation(paramTypes: {'foo': unknownType}).toString(),
-          "/** @param {?} foo */");
-    });
-
-    test('gives multiple line comment when it it does not fit on one line', () {
-      expect(
-          ClosureAnnotation(
-              returnType: stringType,
-              paramTypes: {'foo': numberType}).toString(),
-          "/**\n"
-          " * @param {number} foo\n"
-          " * @return {string}\n"
-          " */");
-    });
-
-    test('inserts indentation', () {
-      expect(
-          ClosureAnnotation(
-              returnType: stringType,
-              paramTypes: {'foo': numberType}).toString("  "),
-          "/**\n" // No indent on first line.
-          "   * @param {number} foo\n"
-          "   * @return {string}\n"
-          "   */");
-    });
-
-    test('compresses @type, @final, @const, @private, @protected, @typedef',
-        () {
-      expect(ClosureAnnotation(type: stringType).toString(),
-          "/** @type {string} */");
-      expect(ClosureAnnotation(type: stringType, isConst: true).toString(),
-          "/** @const {string} */");
-      expect(ClosureAnnotation(type: stringType, isFinal: true).toString(),
-          "/** @final {string} */");
-      expect(ClosureAnnotation(type: stringType, isPrivate: true).toString(),
-          "/** @private {string} */");
-      expect(ClosureAnnotation(type: stringType, isTypedef: true).toString(),
-          "/** @typedef {string} */");
-      expect(ClosureAnnotation(type: stringType, isProtected: true).toString(),
-          "/** @protected {string} */");
-      expect(
-          ClosureAnnotation(
-                  type: stringType,
-                  isPrivate: true,
-                  isConst: true,
-                  isFinal: true,
-                  isProtected: true,
-                  isTypedef: true)
-              .toString(),
-          "/** @private @protected @final @const @typedef {string} */");
-    });
-
-    test('supports a full constructor annotation', () {
-      expect(
-          ClosureAnnotation(
-              returnType: booleanType,
-              throwsType: bamType,
-              thisType: fooType,
-              superType: barType,
-              lendsToType: batType,
-              interfaces: [bazType],
-              isStruct: true,
-              isPrivate: true,
-              isProtected: true,
-              isOverride: true,
-              isFinal: true,
-              isConst: true,
-              isConstructor: true,
-              isNoSideEffects: true,
-              isNoCollapse: true,
-              paramTypes: {'x': stringType, 'y': numberType},
-              templates: ['A', 'B']).toString(),
-          '/**\n'
-          ' * @template A, B\n'
-          ' * @this {foo.Foo}\n'
-          ' * @override\n'
-          ' * @nosideeffects\n'
-          ' * @nocollapse\n'
-          ' * @lends {Bat}\n'
-          ' * @private @protected @final @const\n'
-          ' * @constructor @struct @extends {Bar}\n'
-          ' * @implements {Baz}\n'
-          ' * @param {string} x\n'
-          ' * @param {number} y\n'
-          ' * @return {boolean}\n'
-          ' * @throws {Bam}\n'
-          ' */');
-    });
-  });
-}
diff --git a/pkg/dev_compiler/test/closure/closure_type_test.dart b/pkg/dev_compiler/test/closure/closure_type_test.dart
deleted file mode 100644
index c8b7c62..0000000
--- a/pkg/dev_compiler/test/closure/closure_type_test.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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.
-
-library dev_compiler.test.closure_type_test;
-
-import 'package:test/test.dart';
-
-import 'package:dev_compiler/src/closure/closure_type.dart';
-
-void main() {
-  expectToString(ClosureType t, String s,
-      {String nullable, String nonNullable}) {
-    expect(t.toString(), s);
-    if (nullable != null) {
-      expect(t.toNullable().toString(), nullable);
-    }
-    if (nonNullable != null) {
-      expect(t.toNonNullable().toString(), nonNullable);
-    }
-  }
-
-  group('ClosureType', () {
-    test('supports simple types', () {
-      expectToString(ClosureType.number(), "number",
-          nullable: "?number", nonNullable: "number");
-      expectToString(ClosureType.boolean(), "boolean",
-          nullable: "?boolean", nonNullable: "boolean");
-      expectToString(ClosureType.string(), "string",
-          nullable: "string", nonNullable: "!string");
-      expectToString(ClosureType.type("foo.Bar"), "foo.Bar",
-          nullable: "foo.Bar", nonNullable: "!foo.Bar");
-    });
-
-    test('supports array types', () {
-      expectToString(ClosureType.array(), "Array<*>",
-          nullable: "Array<*>", nonNullable: "!Array<*>");
-      expectToString(ClosureType.array(ClosureType.type("Foo")), "Array<Foo>",
-          nullable: "Array<Foo>", nonNullable: "!Array<Foo>");
-    });
-
-    test('supports map types', () {
-      expectToString(
-          ClosureType.map(ClosureType.type("Foo"), ClosureType.type("Bar")),
-          "Object<Foo, Bar>",
-          nullable: "Object<Foo, Bar>",
-          nonNullable: "!Object<Foo, Bar>");
-      expectToString(ClosureType.map(), "Object<*, *>",
-          nullable: "Object<*, *>", nonNullable: "!Object<*, *>");
-    });
-
-    test('supports function types', () {
-      expectToString(ClosureType.function(), "Function",
-          nullable: "Function", nonNullable: "!Function");
-      expectToString(
-          ClosureType.function([ClosureType.number()]), "function(number)");
-      expectToString(ClosureType.function(null, ClosureType.number()),
-          "function(...*):number");
-      expectToString(
-          ClosureType.function([ClosureType.number(), ClosureType.string()],
-              ClosureType.boolean()),
-          "function(number, string):boolean");
-    });
-
-    test('supports union types', () {
-      expectToString(
-          ClosureType.number().or(ClosureType.boolean()), "(number|boolean)");
-      expectToString(ClosureType.number().orUndefined(), "(number|undefined)");
-    });
-
-    test('supports record types', () {
-      expectToString(
-          ClosureType.record(
-              {'x': ClosureType.number(), 'y': ClosureType.boolean()}),
-          "{x: number, y: boolean}");
-    });
-
-    test('supports optional pseudo-types', () {
-      expectToString(ClosureType.number().toOptional(), "number=");
-    });
-  });
-}
diff --git a/pkg/dev_compiler/test/codegen/BenchmarkBase.dart b/pkg/dev_compiler/test/codegen/BenchmarkBase.dart
deleted file mode 100644
index 05dde11..0000000
--- a/pkg/dev_compiler/test/codegen/BenchmarkBase.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-
-library BenchmarkBase;
-
-class Expect {
-  static void equals(var expected, var actual) {
-    if (expected != actual) {
-      throw "Values not equal: $expected vs $actual";
-    }
-  }
-
-  static void listEquals(List expected, List actual) {
-    if (expected.length != actual.length) {
-      throw "Lists have different lengths: ${expected.length} vs ${actual.length}";
-    }
-    for (int i = 0; i < actual.length; i++) {
-      equals(expected[i], actual[i]);
-    }
-  }
-
-  fail(message) {
-    throw message;
-  }
-}
-
-class BenchmarkBase {
-  final String name;
-
-  // Empty constructor.
-  const BenchmarkBase(String name) : this.name = name;
-
-  // The benchmark code.
-  // This function is not used, if both [warmup] and [exercise] are overwritten.
-  void run() {}
-
-  // Runs a short version of the benchmark. By default invokes [run] once.
-  void warmup() {
-    run();
-  }
-
-  // Exercises the benchmark. By default invokes [run] 10 times.
-  void exercise() {
-    for (int i = 0; i < 10; i++) {
-      run();
-    }
-  }
-
-  // Not measured setup code executed prior to the benchmark runs.
-  void setup() {}
-
-  // Not measures teardown code executed after the benchmark runs.
-  void teardown() {}
-
-  // Measures the score for this benchmark by executing it repeately until
-  // time minimum has been reached.
-  static double measureFor(Function f, int timeMinimum) {
-    int time = 0;
-    int iter = 0;
-    Stopwatch watch = Stopwatch();
-    watch.start();
-    int elapsed = 0;
-    while (elapsed < timeMinimum) {
-      f();
-      elapsed = watch.elapsedMilliseconds;
-      iter++;
-    }
-    return 1000.0 * elapsed / iter;
-  }
-
-  // Measures the score for the benchmark and returns it.
-  double measure() {
-    setup();
-    // Warmup for at least 100ms. Discard result.
-    measureFor(() {
-      this.warmup();
-    }, 100);
-    // Run the benchmark for at least 2000ms.
-    double result = measureFor(() {
-      this.exercise();
-    }, 2000);
-    teardown();
-    return result;
-  }
-
-  void report() {
-    double score = measure();
-    print("$name(RunTime): $score us.");
-  }
-}
diff --git a/pkg/dev_compiler/test/codegen/closure.dart b/pkg/dev_compiler/test/codegen/closure.dart
deleted file mode 100644
index 9d3294b..0000000
--- a/pkg/dev_compiler/test/codegen/closure.dart
+++ /dev/null
@@ -1,70 +0,0 @@
-// compile options: --closure-experimental --destructure-named-params --modules=es6
-library test;
-
-import 'dart:js';
-
-List<T> generic_function<T>(List<T> items, T seed) {
-  var strings = items.map((i) => "$i").toList();
-  return items;
-}
-
-typedef void Callback({int i});
-
-class Foo<T> {
-  final int i;
-  bool b;
-  String s;
-  T v;
-
-  Foo(this.i, this.v);
-
-  factory Foo.build() => Foo(1, null);
-
-  untyped_method(a, b) {}
-
-  T pass(T t) => t;
-
-  String typed_method(Foo foo, List list, int i, num n, double d, bool b,
-      String s, JsArray a, JsObject o, JsFunction f) {
-    return '';
-  }
-
-  optional_params(a, [b, int c]) {}
-
-  static named_params(a, {b, int c}) {}
-
-  nullary_method() {}
-
-  function_params(int f(x, [y]), g(x, {String y, z}), Callback cb) {
-    cb(i: i);
-  }
-
-  run(List a, String b, List c(String d), List<int> e(f(g)),
-      {Map<Map, Map> h}) {}
-
-  String get prop => null;
-  set prop(String value) {}
-
-  static String get staticProp => null;
-  static set staticProp(String value) {}
-
-  static const String some_static_constant = "abc";
-  static final String some_static_final = "abc";
-  static String some_static_var = "abc";
-}
-
-class Bar {}
-
-class Baz extends Foo<int> with Bar {
-  Baz(int i) : super(i, 123);
-}
-
-void main(args) {}
-
-var closure = () {
-  return;
-};
-
-const String some_top_level_constant = "abc";
-final String some_top_level_final = "abc";
-String some_top_level_var = "abc";
diff --git a/pkg/dev_compiler/test/codegen/destructuring.dart b/pkg/dev_compiler/test/codegen/destructuring.dart
deleted file mode 100644
index dd8745e..0000000
--- a/pkg/dev_compiler/test/codegen/destructuring.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// compile options: --destructure-named-params
-import 'dart-ext:foo';
-import 'package:js/src/varargs.dart';
-
-f(int a, b, [c = 1]) {
-  f(a, b, c);
-}
-
-external f_ext(int a, b, [c = 1]);
-f_nat(int a, b, [c = 1]) native "f_nat";
-f_sync(int a, b, [c = 1]) sync* {}
-f_async(int a, b, [c = 1]) async* {}
-
-g(int a, b, {c = 1}) {
-  f(a, b, c);
-}
-
-external g_ext(int a, b, {c = 1});
-g_nat(int a, b, {c = 1}) native "g_nat";
-g_sync(int a, b, {c = 1}) sync* {}
-g_async(int a, b, {c = 1}) async* {}
-
-r(int a, @rest others) {
-  r(a, spread(others));
-}
-
-external r_ext(int a, @rest others);
-r_nat(int a, @rest others) native "r_nat";
-r_sync(int a, @rest others) sync* {}
-r_async(int a, @rest others) async* {}
-
-invalid_names1(int let, function, arguments) {
-  f(let, function, arguments);
-}
-
-invalid_names2([int let, function = 1, arguments]) {
-  f(let, function, arguments);
-}
-
-invalid_names3({int let, function, arguments = 2}) {
-  f(let, function, arguments);
-}
-
-names_clashing_with_object_props(
-    {int constructor, valueOf, hasOwnProperty = 2}) {
-  f(constructor, valueOf, hasOwnProperty);
-}
diff --git a/pkg/dev_compiler/test/codegen/equality_test.dart b/pkg/dev_compiler/test/codegen/equality_test.dart
deleted file mode 100644
index cd1d90d7..0000000
--- a/pkg/dev_compiler/test/codegen/equality_test.dart
+++ /dev/null
@@ -1,1279 +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:expect/minitest.dart';
-
-/// Both kinds.
-enum Music { country, western }
-
-class BluesBrother {}
-
-// This class does not override object equality
-class _Jake extends BluesBrother {}
-
-/// This class overrides object equality
-class _Elwood extends BluesBrother {
-  bool operator ==(Object other) {
-    return (other is _Elwood);
-  }
-}
-
-/// Mock BluesBrother
-class _Norman extends BluesBrother {}
-
-/// Hide nullability from the simple minded null analysis
-T hideNull<T>(T x) => x;
-
-/// Generate undefined at a type
-T getUndefined<T>() => (List(1))[0];
-
-main() {
-  group('Enum equality', () {
-    // Test equality of two enums, various types, nullable
-    test('Equal enum/enum (nullable)', () {
-      Music e1 = hideNull(Music.country);
-      Music e2 = hideNull(Music.western);
-      dynamic d1 = hideNull(Music.country);
-      dynamic d2 = hideNull(Music.western);
-      Object o1 = hideNull(Music.country);
-      Object o2 = hideNull(Music.western);
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of two enums, various types, non-nullable
-    test('Equal enum/enum (non-null)', () {
-      Music e1 = Music.country;
-      Music e2 = Music.western;
-      dynamic d1 = Music.country;
-      dynamic d2 = Music.western;
-      Object o1 = Music.country;
-      Object o2 = Music.western;
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of enum and other types (static, nullable)
-    test('Equal enum/other (static, nullable)', () {
-      Music e1 = hideNull(Music.country);
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of enum and other types (static, non-null)
-    test('Equal enum/other (static, non-null)', () {
-      Music e1 = Music.country;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of enum and other types (dynamic, nullable)
-    test('Equal enum/other (dynamic, nullable)', () {
-      Music e1 = hideNull(Music.country);
-      dynamic d1 = hideNull(Music.country);
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-
-    // Test equality of enum and other types (dynamic, non-null)
-    test('Equal enum/other (dynamic, non-null)', () {
-      Music e1 = Music.country;
-      dynamic d1 = Music.country;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-  });
-
-  group('String equality', () {
-    // Test equality of two strings, various types, nullable
-    test('Equal string/string (nullable)', () {
-      String e1 = hideNull("The");
-      String e2 = hideNull("Band");
-      dynamic d1 = hideNull("The");
-      dynamic d2 = hideNull("Band");
-      Object o1 = hideNull("The");
-      Object o2 = hideNull("Band");
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of two strings, various types, non-nullable
-    test('Equal string/string (non-null)', () {
-      String e1 = "The";
-      String e2 = "Band";
-      dynamic d1 = "The";
-      dynamic d2 = "Band";
-      Object o1 = "The";
-      Object o2 = "Band";
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of string and other types (static, nullable)
-    test('Equal string/other (static, nullable)', () {
-      String e1 = hideNull("The");
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of string and other types (static, non-null)
-    test('Equal string/other (static, non-null)', () {
-      String e1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of string and other types (dynamic, nullable)
-    test('Equal string/other (dynamic, nullable)', () {
-      String e1 = hideNull("The");
-      dynamic d1 = hideNull("The");
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-
-    // Test equality of string and other types (dynamic, non-null)
-    test('Equal string/other (dynamic, non-null)', () {
-      String e1 = "The";
-      dynamic d1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-  });
-
-  group('Boolean equality', () {
-    // Test equality of two bools, various types, nullable
-    test('Equal bool/bool (nullable)', () {
-      bool e1 = hideNull(true);
-      bool e2 = hideNull(false);
-      dynamic d1 = hideNull(true);
-      dynamic d2 = hideNull(false);
-      Object o1 = hideNull(true);
-      Object o2 = hideNull(false);
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of two bools, various types, non-nullable
-    test('Equal bool/bool (non-null)', () {
-      bool e1 = true;
-      bool e2 = false;
-      dynamic d1 = true;
-      dynamic d2 = false;
-      Object o1 = true;
-      Object o2 = false;
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of bool and other types (static, nullable)
-    test('Equal bool/other (static, nullable)', () {
-      bool e1 = hideNull(true);
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of bool and other types (static, non-null)
-    test('Equal bool/other (static, non-null)', () {
-      bool e1 = true;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of bool and other types (dynamic, nullable)
-    test('Equal bool/other (dynamic, nullable)', () {
-      bool e1 = hideNull(true);
-      dynamic d1 = hideNull(true);
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-
-    // Test equality of bool and other types (dynamic, non-null)
-    test('Equal bool/other (dynamic, non-null)', () {
-      bool e1 = true;
-      dynamic d1 = true;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-  });
-
-  group('String equality', () {
-    // Test equality of two strings, various types, nullable
-    test('Equal string/string (nullable)', () {
-      String e1 = hideNull("The");
-      String e2 = hideNull("Band");
-      dynamic d1 = hideNull("The");
-      dynamic d2 = hideNull("Band");
-      Object o1 = hideNull("The");
-      Object o2 = hideNull("Band");
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of two strings, various types, non-nullable
-    test('Equal string/string (non-null)', () {
-      String e1 = "The";
-      String e2 = "Band";
-      dynamic d1 = "The";
-      dynamic d2 = "Band";
-      Object o1 = "The";
-      Object o2 = "Band";
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of string and other types (static, nullable)
-    test('Equal string/other (static, nullable)', () {
-      String e1 = hideNull("The");
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of string and other types (static, non-null)
-    test('Equal string/other (static, non-null)', () {
-      String e1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of string and other types (dynamic, nullable)
-    test('Equal string/other (dynamic, nullable)', () {
-      String e1 = hideNull("The");
-      dynamic d1 = hideNull("The");
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-
-    // Test equality of string and other types (dynamic, non-null)
-    test('Equal string/other (dynamic, non-null)', () {
-      String e1 = "The";
-      dynamic d1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-  });
-
-  group('Number equality', () {
-    // Test equality of two ints, various types, nullable
-    test('Equal int/int (nullable)', () {
-      int e1 = hideNull(11);
-      int e2 = hideNull(12);
-      dynamic d1 = hideNull(11);
-      dynamic d2 = hideNull(12);
-      Object o1 = hideNull(11);
-      Object o2 = hideNull(12);
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of two ints, various types, non-nullable
-    test('Equal int/int (non-null)', () {
-      int e1 = 11;
-      int e2 = 12;
-      dynamic d1 = 11;
-      dynamic d2 = 12;
-      Object o1 = 11;
-      Object o2 = 12;
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of int and other types (static, nullable)
-    test('Equal int/other (static, nullable)', () {
-      int e1 = hideNull(11);
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of int and other types (static, non-null)
-    test('Equal int/other (static, non-null)', () {
-      int e1 = 11;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of int and other types (dynamic, nullable)
-    test('Equal int/other (dynamic, nullable)', () {
-      int e1 = hideNull(11);
-      dynamic d1 = hideNull(11);
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-
-    // Test equality of int and other types (dynamic, non-null)
-    test('Equal int/other (dynamic, non-null)', () {
-      int e1 = 11;
-      dynamic d1 = 11;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-  });
-
-  group('Object equality', () {
-    // Test equality of two objects, various types, nullable
-    test('Equal object/object (nullable)', () {
-      _Jake e1 = hideNull(_Jake());
-      _Elwood e2 = hideNull(_Elwood());
-      dynamic d1 = hideNull(e1);
-      dynamic d2 = hideNull(_Elwood());
-      Object o1 = hideNull(e1);
-      Object o2 = hideNull(_Elwood());
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of two objects, various types, non-nullable
-    test('Equal object/object (non-null)', () {
-      _Jake e1 = _Jake();
-      _Elwood e2 = _Elwood();
-      dynamic d1 = e1;
-      dynamic d2 = _Elwood();
-      Object o1 = e1;
-      Object o2 = _Elwood();
-      expect(e1 == e1, true);
-      expect(e1 == d1, true);
-      expect(e1 == o1, true);
-      expect(e1 == e2, false);
-      expect(e1 == o2, false);
-      expect(e1 == d2, false);
-      expect(e1 == e2, false);
-      expect(d1 == e1, true);
-      expect(d1 == d1, true);
-      expect(d1 == o1, true);
-      expect(d1 == e2, false);
-      expect(d1 == d2, false);
-      expect(d1 == o2, false);
-      expect(o1 == e1, true);
-      expect(o1 == d1, true);
-      expect(o1 == o1, true);
-      expect(o1 == e2, false);
-      expect(o1 == d2, false);
-      expect(o1 == o2, false);
-    });
-
-    // Test equality of object and other types (static, nullable)
-    test('Equal object/other (static, nullable)', () {
-      _Jake e1 = hideNull(_Jake());
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of object and other types (static, non-null)
-    test('Equal object/other (static, non-null)', () {
-      _Jake e1 = _Jake();
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-    });
-
-    // Test equality of object and other types (dynamic, nullable)
-    test('Equal object/other (dynamic, nullable)', () {
-      _Jake e1 = hideNull(_Jake());
-      dynamic d1 = hideNull(_Jake());
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-
-    // Test equality of object and other types (dynamic, non-null)
-    test('Equal object/other (dynamic, non-null)', () {
-      _Jake e1 = _Jake();
-      dynamic d1 = _Jake();
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(e1 == s1, false);
-      expect(e1 == s2, false);
-      expect(e1 == i1, false);
-      expect(e1 == i2, false);
-      expect(e1 == l1, false);
-      expect(e1 == b1, false);
-
-      expect(s1 == e1, false);
-      expect(s2 == e1, false);
-      expect(i1 == e1, false);
-      expect(i2 == e1, false);
-      expect(l1 == e1, false);
-      expect(b1 == e1, false);
-
-      expect(d1 == s1, false);
-      expect(d1 == s2, false);
-      expect(d1 == i1, false);
-      expect(d1 == i2, false);
-      expect(d1 == l1, false);
-      expect(d1 == b1, false);
-
-      expect(s1 == d1, false);
-      expect(s2 == d1, false);
-      expect(i1 == d1, false);
-      expect(i2 == d1, false);
-      expect(l1 == d1, false);
-      expect(b1 == d1, false);
-    });
-  });
-
-  // Test that null receiver with undefined argument is handled correctly
-  group('Null/undefined equality', () {
-    // Test equality of null object and other types
-    test('Equal object/other (static, null)', () {
-      BluesBrother n = hideNull(null);
-      String u1 = getUndefined();
-      int u2 = getUndefined();
-      bool u3 = getUndefined();
-      List u4 = getUndefined();
-
-      expect(n == n, true);
-
-      expect(n == u1, true);
-      expect(n == u2, true);
-      expect(n == u3, true);
-      expect(n == u4, true);
-
-      expect(u1 == n, true);
-      expect(u2 == n, true);
-      expect(u3 == n, true);
-      expect(u4 == n, true);
-    });
-
-    // Test equality of null string and other types
-    test('Equal String/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String n = hideNull(null);
-      int u2 = getUndefined();
-      bool u3 = getUndefined();
-      List u4 = getUndefined();
-
-      expect(n == n, true);
-
-      expect(n == u1, true);
-      expect(n == u2, true);
-      expect(n == u3, true);
-      expect(n == u4, true);
-
-      expect(u1 == n, true);
-      expect(u2 == n, true);
-      expect(u3 == n, true);
-      expect(u4 == n, true);
-    });
-
-    // Test equality of null int and other types
-    test('Equal int/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String u2 = getUndefined();
-      int n = hideNull(null);
-      bool u3 = getUndefined();
-      List u4 = getUndefined();
-
-      expect(n == n, true);
-
-      expect(n == u1, true);
-      expect(n == u2, true);
-      expect(n == u3, true);
-      expect(n == u4, true);
-
-      expect(u1 == n, true);
-      expect(u2 == n, true);
-      expect(u3 == n, true);
-      expect(u4 == n, true);
-    });
-
-    // Test equality of null bool and other types
-    test('Equal bool/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String u2 = getUndefined();
-      int u3 = getUndefined();
-      bool n = hideNull(null);
-      List u4 = getUndefined();
-
-      expect(n == n, true);
-
-      expect(n == u1, true);
-      expect(n == u2, true);
-      expect(n == u3, true);
-      expect(n == u4, true);
-
-      expect(u1 == n, true);
-      expect(u2 == n, true);
-      expect(u3 == n, true);
-      expect(u4 == n, true);
-    });
-
-    // Test equality of null List and other types
-    test('Equal List/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String u2 = getUndefined();
-      int u3 = getUndefined();
-      bool u4 = getUndefined();
-      List n = hideNull(null);
-
-      expect(n == n, true);
-
-      expect(n == u1, true);
-      expect(n == u2, true);
-      expect(n == u3, true);
-      expect(n == u4, true);
-
-      expect(u1 == n, true);
-      expect(u2 == n, true);
-      expect(u3 == n, true);
-      expect(u4 == n, true);
-    });
-  });
-}
diff --git a/pkg/dev_compiler/test/codegen/es6_modules.dart b/pkg/dev_compiler/test/codegen/es6_modules.dart
deleted file mode 100644
index 10472b7..0000000
--- a/pkg/dev_compiler/test/codegen/es6_modules.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// compile options: --modules=es6
-library test;
-
-typedef void Callback({int i});
-
-class A {}
-
-class _A {}
-
-class B<T> {}
-
-class _B<T> {}
-
-f() {}
-_f() {}
-
-const String constant = "abc";
-final String finalConstant = "abc";
-final String lazy = (() {
-  print('lazy');
-  return "abc";
-})();
-String mutable = "abc";
-String lazyMutable = (() {
-  print('lazyMutable');
-  return "abc";
-})();
diff --git a/pkg/dev_compiler/test/codegen/identity_test.dart b/pkg/dev_compiler/test/codegen/identity_test.dart
deleted file mode 100644
index 3ca0dad..0000000
--- a/pkg/dev_compiler/test/codegen/identity_test.dart
+++ /dev/null
@@ -1,1279 +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:expect/minitest.dart';
-
-/// Both kinds.
-enum Music { country, western }
-
-class BluesBrother {}
-
-// This class does not override object equality
-class _Jake extends BluesBrother {}
-
-/// This class overrides object equality
-class _Elwood extends BluesBrother {
-  bool operator ==(Object other) {
-    return (other is _Elwood);
-  }
-}
-
-/// Mock BluesBrother
-class _Norman extends BluesBrother {}
-
-/// Hide nullability from the simple minded null analysis
-T hideNull<T>(T x) => x;
-
-/// Generate undefined at a type
-T getUndefined<T>() => (List(1))[0];
-
-main() {
-  group('Enum identity', () {
-    // Test identity of two enums, various types, nullable
-    test('Identical enum/enum (nullable)', () {
-      Music e1 = hideNull(Music.country);
-      Music e2 = hideNull(Music.western);
-      dynamic d1 = hideNull(Music.country);
-      dynamic d2 = hideNull(Music.western);
-      Object o1 = hideNull(Music.country);
-      Object o2 = hideNull(Music.western);
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of two enums, various types, non-nullable
-    test('Identical enum/enum (non-null)', () {
-      Music e1 = Music.country;
-      Music e2 = Music.western;
-      dynamic d1 = Music.country;
-      dynamic d2 = Music.western;
-      Object o1 = Music.country;
-      Object o2 = Music.western;
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of enum and other types (static, nullable)
-    test('Identical enum/other (static, nullable)', () {
-      Music e1 = hideNull(Music.country);
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of enum and other types (static, non-null)
-    test('Identical enum/other (static, non-null)', () {
-      Music e1 = Music.country;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of enum and other types (dynamic, nullable)
-    test('Identical enum/other (dynamic, nullable)', () {
-      Music e1 = hideNull(Music.country);
-      dynamic d1 = hideNull(Music.country);
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-
-    // Test identity of enum and other types (dynamic, non-null)
-    test('Identical enum/other (dynamic, non-null)', () {
-      Music e1 = Music.country;
-      dynamic d1 = Music.country;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-  });
-
-  group('String identity', () {
-    // Test identity of two strings, various types, nullable
-    test('Identical string/string (nullable)', () {
-      String e1 = hideNull("The");
-      String e2 = hideNull("Band");
-      dynamic d1 = hideNull("The");
-      dynamic d2 = hideNull("Band");
-      Object o1 = hideNull("The");
-      Object o2 = hideNull("Band");
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of two strings, various types, non-nullable
-    test('Identical string/string (non-null)', () {
-      String e1 = "The";
-      String e2 = "Band";
-      dynamic d1 = "The";
-      dynamic d2 = "Band";
-      Object o1 = "The";
-      Object o2 = "Band";
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of string and other types (static, nullable)
-    test('Identical string/other (static, nullable)', () {
-      String e1 = hideNull("The");
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of string and other types (static, non-null)
-    test('Identical string/other (static, non-null)', () {
-      String e1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of string and other types (dynamic, nullable)
-    test('Identical string/other (dynamic, nullable)', () {
-      String e1 = hideNull("The");
-      dynamic d1 = hideNull("The");
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-
-    // Test identity of string and other types (dynamic, non-null)
-    test('Identical string/other (dynamic, non-null)', () {
-      String e1 = "The";
-      dynamic d1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-  });
-
-  group('Boolean identity', () {
-    // Test identity of two bools, various types, nullable
-    test('Identical bool/bool (nullable)', () {
-      bool e1 = hideNull(true);
-      bool e2 = hideNull(false);
-      dynamic d1 = hideNull(true);
-      dynamic d2 = hideNull(false);
-      Object o1 = hideNull(true);
-      Object o2 = hideNull(false);
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of two bools, various types, non-nullable
-    test('Identical bool/bool (non-null)', () {
-      bool e1 = true;
-      bool e2 = false;
-      dynamic d1 = true;
-      dynamic d2 = false;
-      Object o1 = true;
-      Object o2 = false;
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of bool and other types (static, nullable)
-    test('Identical bool/other (static, nullable)', () {
-      bool e1 = hideNull(true);
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of bool and other types (static, non-null)
-    test('Identical bool/other (static, non-null)', () {
-      bool e1 = true;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of bool and other types (dynamic, nullable)
-    test('Identical bool/other (dynamic, nullable)', () {
-      bool e1 = hideNull(true);
-      dynamic d1 = hideNull(true);
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-
-    // Test identity of bool and other types (dynamic, non-null)
-    test('Identical bool/other (dynamic, non-null)', () {
-      bool e1 = true;
-      dynamic d1 = true;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-  });
-
-  group('String identity', () {
-    // Test identity of two strings, various types, nullable
-    test('Identical string/string (nullable)', () {
-      String e1 = hideNull("The");
-      String e2 = hideNull("Band");
-      dynamic d1 = hideNull("The");
-      dynamic d2 = hideNull("Band");
-      Object o1 = hideNull("The");
-      Object o2 = hideNull("Band");
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of two strings, various types, non-nullable
-    test('Identical string/string (non-null)', () {
-      String e1 = "The";
-      String e2 = "Band";
-      dynamic d1 = "The";
-      dynamic d2 = "Band";
-      Object o1 = "The";
-      Object o2 = "Band";
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of string and other types (static, nullable)
-    test('Identical string/other (static, nullable)', () {
-      String e1 = hideNull("The");
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of string and other types (static, non-null)
-    test('Identical string/other (static, non-null)', () {
-      String e1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of string and other types (dynamic, nullable)
-    test('Identical string/other (dynamic, nullable)', () {
-      String e1 = hideNull("The");
-      dynamic d1 = hideNull("The");
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-
-    // Test identity of string and other types (dynamic, non-null)
-    test('Identical string/other (dynamic, non-null)', () {
-      String e1 = "The";
-      dynamic d1 = "The";
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-  });
-
-  group('Number identity', () {
-    // Test identity of two ints, various types, nullable
-    test('Identical int/int (nullable)', () {
-      int e1 = hideNull(11);
-      int e2 = hideNull(12);
-      dynamic d1 = hideNull(11);
-      dynamic d2 = hideNull(12);
-      Object o1 = hideNull(11);
-      Object o2 = hideNull(12);
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of two ints, various types, non-nullable
-    test('Identical int/int (non-null)', () {
-      int e1 = 11;
-      int e2 = 12;
-      dynamic d1 = 11;
-      dynamic d2 = 12;
-      Object o1 = 11;
-      Object o2 = 12;
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of int and other types (static, nullable)
-    test('Identical int/other (static, nullable)', () {
-      int e1 = hideNull(11);
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of int and other types (static, non-null)
-    test('Identical int/other (static, non-null)', () {
-      int e1 = 11;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of int and other types (dynamic, nullable)
-    test('Identical int/other (dynamic, nullable)', () {
-      int e1 = hideNull(11);
-      dynamic d1 = hideNull(11);
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-
-    // Test identity of int and other types (dynamic, non-null)
-    test('Identical int/other (dynamic, non-null)', () {
-      int e1 = 11;
-      dynamic d1 = 11;
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-  });
-
-  group('Object identity', () {
-    // Test identity of two objects, various types, nullable
-    test('Identical object/object (nullable)', () {
-      _Jake e1 = hideNull(_Jake());
-      _Elwood e2 = hideNull(_Elwood());
-      dynamic d1 = hideNull(e1);
-      dynamic d2 = hideNull(_Elwood());
-      Object o1 = hideNull(e1);
-      Object o2 = hideNull(_Elwood());
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of two objects, various types, non-nullable
-    test('Identical object/object (non-null)', () {
-      _Jake e1 = _Jake();
-      _Elwood e2 = _Elwood();
-      dynamic d1 = e1;
-      dynamic d2 = _Elwood();
-      Object o1 = e1;
-      Object o2 = _Elwood();
-      expect(identical(e1, e1), true);
-      expect(identical(e1, d1), true);
-      expect(identical(e1, o1), true);
-      expect(identical(e1, e2), false);
-      expect(identical(e1, o2), false);
-      expect(identical(e1, d2), false);
-      expect(identical(e1, e2), false);
-      expect(identical(d1, e1), true);
-      expect(identical(d1, d1), true);
-      expect(identical(d1, o1), true);
-      expect(identical(d1, e2), false);
-      expect(identical(d1, d2), false);
-      expect(identical(d1, o2), false);
-      expect(identical(o1, e1), true);
-      expect(identical(o1, d1), true);
-      expect(identical(o1, o1), true);
-      expect(identical(o1, e2), false);
-      expect(identical(o1, d2), false);
-      expect(identical(o1, o2), false);
-    });
-
-    // Test identity of object and other types (static, nullable)
-    test('Identical object/other (static, nullable)', () {
-      _Jake e1 = hideNull(_Jake());
-      String s1 = hideNull("hello");
-      String s2 = hideNull("");
-      int i1 = hideNull(3);
-      int i2 = hideNull(0);
-      List l1 = hideNull(List(3));
-      BluesBrother b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of object and other types (static, non-null)
-    test('Identical object/other (static, non-null)', () {
-      _Jake e1 = _Jake();
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-    });
-
-    // Test identity of object and other types (dynamic, nullable)
-    test('Identical object/other (dynamic, nullable)', () {
-      _Jake e1 = hideNull(_Jake());
-      dynamic d1 = hideNull(_Jake());
-      dynamic s1 = hideNull("hello");
-      dynamic s2 = hideNull("");
-      dynamic i1 = hideNull(3);
-      dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(List(3));
-      dynamic b1 = hideNull(_Norman());
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-
-    // Test identity of object and other types (dynamic, non-null)
-    test('Identical object/other (dynamic, non-null)', () {
-      _Jake e1 = _Jake();
-      dynamic d1 = _Jake();
-      String s1 = "hello";
-      String s2 = "";
-      int i1 = 3;
-      int i2 = 0;
-      List l1 = List(3);
-      BluesBrother b1 = _Norman();
-
-      expect(identical(e1, s1), false);
-      expect(identical(e1, s2), false);
-      expect(identical(e1, i1), false);
-      expect(identical(e1, i2), false);
-      expect(identical(e1, l1), false);
-      expect(identical(e1, b1), false);
-
-      expect(identical(s1, e1), false);
-      expect(identical(s2, e1), false);
-      expect(identical(i1, e1), false);
-      expect(identical(i2, e1), false);
-      expect(identical(l1, e1), false);
-      expect(identical(b1, e1), false);
-
-      expect(identical(d1, s1), false);
-      expect(identical(d1, s2), false);
-      expect(identical(d1, i1), false);
-      expect(identical(d1, i2), false);
-      expect(identical(d1, l1), false);
-      expect(identical(d1, b1), false);
-
-      expect(identical(s1, d1), false);
-      expect(identical(s2, d1), false);
-      expect(identical(i1, d1), false);
-      expect(identical(i2, d1), false);
-      expect(identical(l1, d1), false);
-      expect(identical(b1, d1), false);
-    });
-  });
-
-  // Test that null receiver with undefined argument is handled correctly
-  group('Null/undefined identity', () {
-    // Test identity of null object and other types
-    test('Identical object/other (static, null)', () {
-      BluesBrother n = hideNull(null);
-      String u1 = getUndefined();
-      int u2 = getUndefined();
-      bool u3 = getUndefined();
-      List u4 = getUndefined();
-
-      expect(identical(n, n), true);
-
-      expect(identical(n, u1), true);
-      expect(identical(n, u2), true);
-      expect(identical(n, u3), true);
-      expect(identical(n, u4), true);
-
-      expect(identical(u1, n), true);
-      expect(identical(u2, n), true);
-      expect(identical(u3, n), true);
-      expect(identical(u4, n), true);
-    });
-
-    // Test identity of null string and other types
-    test('Identical String/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String n = hideNull(null);
-      int u2 = getUndefined();
-      bool u3 = getUndefined();
-      List u4 = getUndefined();
-
-      expect(identical(n, n), true);
-
-      expect(identical(n, u1), true);
-      expect(identical(n, u2), true);
-      expect(identical(n, u3), true);
-      expect(identical(n, u4), true);
-
-      expect(identical(u1, n), true);
-      expect(identical(u2, n), true);
-      expect(identical(u3, n), true);
-      expect(identical(u4, n), true);
-    });
-
-    // Test identity of null int and other types
-    test('Identical int/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String u2 = getUndefined();
-      int n = hideNull(null);
-      bool u3 = getUndefined();
-      List u4 = getUndefined();
-
-      expect(identical(n, n), true);
-
-      expect(identical(n, u1), true);
-      expect(identical(n, u2), true);
-      expect(identical(n, u3), true);
-      expect(identical(n, u4), true);
-
-      expect(identical(u1, n), true);
-      expect(identical(u2, n), true);
-      expect(identical(u3, n), true);
-      expect(identical(u4, n), true);
-    });
-
-    // Test identity of null bool and other types
-    test('Identical bool/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String u2 = getUndefined();
-      int u3 = getUndefined();
-      bool n = hideNull(null);
-      List u4 = getUndefined();
-
-      expect(identical(n, n), true);
-
-      expect(identical(n, u1), true);
-      expect(identical(n, u2), true);
-      expect(identical(n, u3), true);
-      expect(identical(n, u4), true);
-
-      expect(identical(u1, n), true);
-      expect(identical(u2, n), true);
-      expect(identical(u3, n), true);
-      expect(identical(u4, n), true);
-    });
-
-    // Test identity of null List and other types
-    test('Identical List/other (static, null)', () {
-      BluesBrother u1 = getUndefined();
-      String u2 = getUndefined();
-      int u3 = getUndefined();
-      bool u4 = getUndefined();
-      List n = hideNull(null);
-
-      expect(identical(n, n), true);
-
-      expect(identical(n, u1), true);
-      expect(identical(n, u2), true);
-      expect(identical(n, u3), true);
-      expect(identical(n, u4), true);
-
-      expect(identical(u1, n), true);
-      expect(identical(u2, n), true);
-      expect(identical(u3, n), true);
-      expect(identical(u4, n), true);
-    });
-  });
-}
diff --git a/pkg/dev_compiler/test/codegen/map_keys.dart b/pkg/dev_compiler/test/codegen/map_keys.dart
deleted file mode 100644
index 0bb6e00..0000000
--- a/pkg/dev_compiler/test/codegen/map_keys.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// compile options: --source-map
-// TODO(jmesserly): more comprehensive strategy for testing the source map.
-// (this is used so we're covering it in at least one test)
-
-import 'dart:math' show Random;
-
-main() {
-  // Uses a JS object literal
-  print({'1': 2, '3': 4, '5': 6});
-  // Uses array literal
-  print({1: 2, 3: 4, 5: 6});
-  // Uses ES6 enhanced object literal
-  print({'1': 2, '${new Random().nextInt(2) + 2}': 4, '5': 6});
-  String x = '3';
-  // Could use enhanced object literal if we knew `x` was not null
-  print({'1': 2, x: 4, '5': 6});
-  // Array literal
-  print({'1': 2, null: 4, '5': 6});
-}
diff --git a/pkg/dev_compiler/test/codegen/node_modules.dart b/pkg/dev_compiler/test/codegen/node_modules.dart
deleted file mode 100644
index dad8613..0000000
--- a/pkg/dev_compiler/test/codegen/node_modules.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// compile options: --modules=node
-library test;
-
-import 'dart:js';
-
-typedef void Callback({int i});
-
-class A {}
-
-class _A {}
-
-class B<T> {}
-
-class _B<T> {}
-
-f() {}
-_f() {}
-
-const String constant = "abc";
-final String finalConstant = "abc";
-final String lazy = (() {
-  print('lazy');
-  return "abc";
-})();
-String mutable = "abc";
-String lazyMutable = (() {
-  print('lazyMutable');
-  return "abc";
-})();
diff --git a/pkg/dev_compiler/test/codegen/script.dart b/pkg/dev_compiler/test/codegen/script.dart
deleted file mode 100755
index c84e012..0000000
--- a/pkg/dev_compiler/test/codegen/script.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env dart
-
-void main(List<String> args) {
-  String name = args.join(' ');
-  if (name == '') name = 'world';
-  print('hello $name');
-}
diff --git a/pkg/dev_compiler/test/codegen/single_test.html b/pkg/dev_compiler/test/codegen/single_test.html
deleted file mode 100644
index e69de29..0000000
--- a/pkg/dev_compiler/test/codegen/single_test.html
+++ /dev/null
diff --git a/pkg/dev_compiler/test/codegen/sunflower/README.md b/pkg/dev_compiler/test/codegen/sunflower/README.md
deleted file mode 100644
index f4fc604..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-This is a copy of https://github.com/dart-lang/sample-sunflower, with minor
-changes to make it compile against "raw DOM" APIs.
-
-The main sunflower.dart file is used as a regression test. You can find it at
-../codegen/sunflower.dart with expected code under ../codegen/expect/sunflower/,
-and the output is at ../codegen/expect/sunflower/sunflower.dart.js.
diff --git a/pkg/dev_compiler/test/codegen/sunflower/circle.dart b/pkg/dev_compiler/test/codegen/sunflower/circle.dart
deleted file mode 100644
index adf4799..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/circle.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// 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.
-
-library circle;
-
-class Circle {
-  final num x, y, radius;
-
-  Circle(this.x, this.y, this.radius);
-}
diff --git a/pkg/dev_compiler/test/codegen/sunflower/math.png b/pkg/dev_compiler/test/codegen/sunflower/math.png
deleted file mode 100644
index 86d881a..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/math.png
+++ /dev/null
Binary files differ
diff --git a/pkg/dev_compiler/test/codegen/sunflower/painter.dart b/pkg/dev_compiler/test/codegen/sunflower/painter.dart
deleted file mode 100644
index 3488c16..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/painter.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-library painter;
-
-import 'dart:html';
-import 'dart:math';
-
-import 'circle.dart';
-
-const ORANGE = "orange";
-const RED = "red";
-const BLUE = "blue";
-const TAU = PI * 2;
-
-Element querySelector(String selector) => document.querySelector(selector);
-
-final canvas = querySelector("#canvas") as CanvasElement;
-final context = canvas.getContext('2d') as CanvasRenderingContext2D;
-
-abstract class CirclePainter implements Circle {
-  // This demonstrates a field in a mixin.
-  String color = ORANGE;
-
-  /// Draw a small circle representing a seed centered at (x,y).
-  void draw(CanvasRenderingContext2D context) {
-    context
-      ..beginPath()
-      ..lineWidth = 2
-      ..fillStyle = color
-      ..strokeStyle = color
-      ..arc(x, y, radius, 0, TAU, false)
-      ..fill()
-      ..closePath()
-      ..stroke();
-  }
-}
diff --git a/pkg/dev_compiler/test/codegen/sunflower/sunflower.css b/pkg/dev_compiler/test/codegen/sunflower/sunflower.css
deleted file mode 100644
index b46afb7..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/sunflower.css
+++ /dev/null
@@ -1,50 +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. */
-
-body {
-  background-color: #F8F8F8;
-  font-family: 'Open Sans', sans-serif;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 1.2em;
-  margin: 15px;
-}
-
-p {
-  color: #333;
-}
-
-#container {
-  width: 100%;
-  height: 400px;
-  position: relative;
-  border: 1px solid #ccc;
-  background-color: #fff;
-}
-
-#summary {
-  float: left;
-}
-
-#notes {
-  float: right;
-  width: 120px;
-  text-align: right;
-}
-
-.error {
-  font-style: italic;
-  color: red;
-}
-
-img {
-  border: 1px solid #ccc;
-  margin: auto;
-}
-
-.center {
-  display: block;
-  margin: 0px auto;
-  text-align: center;
-}
diff --git a/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart b/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
deleted file mode 100644
index 42b2417..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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.
-
-library sunflower;
-
-import 'dart:html';
-import 'dart:math';
-
-import 'circle.dart';
-import 'painter.dart';
-
-const SEED_RADIUS = 2;
-const SCALE_FACTOR = 4;
-const MAX_D = 300;
-const centerX = MAX_D / 2;
-const centerY = centerX;
-
-Element querySelector(String selector) => document.querySelector(selector);
-final canvas = querySelector("#canvas") as CanvasElement;
-final context = canvas.getContext('2d') as CanvasRenderingContext2D;
-final slider = querySelector("#slider") as InputElement;
-final notes = querySelector("#notes");
-
-final PHI = (sqrt(5) + 1) / 2;
-int seeds = 0;
-
-void main() {
-  slider.addEventListener('change', (e) => draw());
-  draw();
-}
-
-/// Draw the complete figure for the current number of seeds.
-void draw() {
-  seeds = int.parse(slider.value);
-  context.clearRect(0, 0, MAX_D, MAX_D);
-  for (var i = 0; i < seeds; i++) {
-    final theta = i * TAU / PHI;
-    final r = sqrt(i) * SCALE_FACTOR;
-    final x = centerX + r * cos(theta);
-    final y = centerY - r * sin(theta);
-    SunflowerSeed(x, y, SEED_RADIUS).draw(context);
-  }
-  notes.text = "$seeds seeds";
-}
-
-// This example was modified to use classes and mixins.
-class SunflowerSeed extends Circle with CirclePainter {
-  SunflowerSeed(num x, num y, num radius, [String color])
-      : super(x, y, radius) {
-    if (color != null) this.color = color;
-  }
-}
diff --git a/pkg/dev_compiler/test/codegen/sunflower/sunflower.html b/pkg/dev_compiler/test/codegen/sunflower/sunflower.html
deleted file mode 100644
index 921d999..0000000
--- a/pkg/dev_compiler/test/codegen/sunflower/sunflower.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-
-<!-- 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. -->
-
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>Sunflower Demo</title>
-    <link type="text/css" rel="stylesheet" href="sunflower.css">
-  </head>
-  <body>
-    <h1>drfibonacci's Sunflower Spectacular</h1>
-    <p>A canvas 2D demo.</p>
-
-    <div id="container">
-      <canvas id="canvas" width="300" height="300" class="center"></canvas>
-      <form class="center">
-        <input id="slider" type="range" max="1000" value="500"/>
-      </form>
-      <br/>
-      <img src="math.png" width="350px" height="42px" class="center">
-    </div>
-
-    <footer>
-      <p id="summary"> </p>
-      <p id="notes"> </p>
-    </footer>
-
-<!--
-    <script type="application/dart" src="sunflower.dart"></script>
--->
-    <script src="../../../node_modules/requirejs/require.js"></script>
-    <script>
-      require.config({
-        paths: {
-          dart_sdk: "../../../lib/js/amd/dart_sdk",
-          js: "../../../gen/codegen_output/pkg/js",
-        }
-      });
-      require(["../../../gen/codegen_output/sunflower/sunflower"],
-          (sunflower) => {
-        sunflower.sunflower.main();
-      });
-    </script>
-  </body>
-</html>
diff --git a/pkg/dev_compiler/test/codegen/unresolved_names.dart b/pkg/dev_compiler/test/codegen/unresolved_names.dart
deleted file mode 100644
index 2a14b21..0000000
--- a/pkg/dev_compiler/test/codegen/unresolved_names.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// compile options: --unsafe-force-compile
-
-class C {}
-
-main() {
-  Foo();
-  C.bar();
-  print(baz);
-  print(C.quux);
-}
diff --git a/pkg/dev_compiler/test/codegen/varargs.dart b/pkg/dev_compiler/test/codegen/varargs.dart
deleted file mode 100644
index f97ac58..0000000
--- a/pkg/dev_compiler/test/codegen/varargs.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-import 'package:js/src/varargs.dart' as js;
-import 'package:js/src/varargs.dart' show rest, spread;
-
-varargsTest(x, @js.rest others) {
-  var args = [1, others];
-  x.call(js.spread(args));
-}
-
-varargsTest2(x, @rest others) {
-  var args = [1, others];
-  x.call(spread(args));
-}
diff --git a/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js b/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
deleted file mode 100644
index 99f2eda..0000000
--- a/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
+++ /dev/null
@@ -1,114 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const BenchmarkBase$ = Object.create(_root);
-  const $length = dartx.length;
-  const $_get = dartx._get;
-  let VoidToNull = () => (VoidToNull = dart.constFn(dart.fnType(core.Null, [])))();
-  BenchmarkBase$.Expect = class Expect extends core.Object {
-    static equals(expected, actual) {
-      if (!dart.equals(expected, actual)) {
-        dart.throw(dart.str`Values not equal: ${expected} vs ${actual}`);
-      }
-    }
-    static listEquals(expected, actual) {
-      if (expected[$length] != actual[$length]) {
-        dart.throw(dart.str`Lists have different lengths: ${expected[$length]} vs ${actual[$length]}`);
-      }
-      for (let i = 0; i < dart.notNull(actual[$length]); i++) {
-        BenchmarkBase$.Expect.equals(expected[$_get](i), actual[$_get](i));
-      }
-    }
-    fail(message) {
-      dart.throw(message);
-    }
-  };
-  (BenchmarkBase$.Expect.new = function() {
-  }).prototype = BenchmarkBase$.Expect.prototype;
-  dart.addTypeTests(BenchmarkBase$.Expect);
-  dart.setMethodSignature(BenchmarkBase$.Expect, () => ({
-    __proto__: dart.getMethods(BenchmarkBase$.Expect.__proto__),
-    fail: dart.fnType(dart.dynamic, [dart.dynamic])
-  }));
-  dart.setStaticMethodSignature(BenchmarkBase$.Expect, () => ({
-    equals: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
-    listEquals: dart.fnType(dart.void, [core.List, core.List])
-  }));
-  BenchmarkBase$.BenchmarkBase = class BenchmarkBase extends core.Object {
-    get name() {
-      return this[name$];
-    }
-    set name(value) {
-      super.name = value;
-    }
-    run() {}
-    warmup() {
-      this.run();
-    }
-    exercise() {
-      for (let i = 0; i < 10; i++) {
-        this.run();
-      }
-    }
-    setup() {}
-    teardown() {}
-    static measureFor(f, timeMinimum) {
-      let time = 0;
-      let iter = 0;
-      let watch = new core.Stopwatch.new();
-      watch.start();
-      let elapsed = 0;
-      while (dart.notNull(elapsed) < dart.notNull(timeMinimum)) {
-        dart.dcall(f);
-        elapsed = watch.elapsedMilliseconds;
-        iter++;
-      }
-      return 1000.0 * dart.notNull(elapsed) / iter;
-    }
-    measure() {
-      this.setup();
-      BenchmarkBase$.BenchmarkBase.measureFor(dart.fn(() => {
-        this.warmup();
-      }, VoidToNull()), 100);
-      let result = BenchmarkBase$.BenchmarkBase.measureFor(dart.fn(() => {
-        this.exercise();
-      }, VoidToNull()), 2000);
-      this.teardown();
-      return result;
-    }
-    report() {
-      let score = this.measure();
-      core.print(dart.str`${this.name}(RunTime): ${score} us.`);
-    }
-  };
-  (BenchmarkBase$.BenchmarkBase.new = function(name) {
-    this[name$] = name;
-  }).prototype = BenchmarkBase$.BenchmarkBase.prototype;
-  dart.addTypeTests(BenchmarkBase$.BenchmarkBase);
-  const name$ = Symbol("BenchmarkBase.name");
-  dart.setMethodSignature(BenchmarkBase$.BenchmarkBase, () => ({
-    __proto__: dart.getMethods(BenchmarkBase$.BenchmarkBase.__proto__),
-    run: dart.fnType(dart.void, []),
-    warmup: dart.fnType(dart.void, []),
-    exercise: dart.fnType(dart.void, []),
-    setup: dart.fnType(dart.void, []),
-    teardown: dart.fnType(dart.void, []),
-    measure: dart.fnType(core.double, []),
-    report: dart.fnType(dart.void, [])
-  }));
-  dart.setStaticMethodSignature(BenchmarkBase$.BenchmarkBase, () => ({measureFor: dart.fnType(core.double, [core.Function, core.int])}));
-  dart.setFieldSignature(BenchmarkBase$.BenchmarkBase, () => ({
-    __proto__: dart.getFields(BenchmarkBase$.BenchmarkBase.__proto__),
-    name: dart.finalFieldType(core.String)
-  }));
-  dart.trackLibraries("BenchmarkBase", {
-    "BenchmarkBase.dart": BenchmarkBase$
-  }, null);
-  // Exports:
-  return {
-    BenchmarkBase: BenchmarkBase$
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/closure.js b/pkg/dev_compiler/test/codegen_expected/closure.js
deleted file mode 100644
index 0745261..0000000
--- a/pkg/dev_compiler/test/codegen_expected/closure.js
+++ /dev/null
@@ -1,174 +0,0 @@
-const _root = Object.create(null);
-export const closure = Object.create(_root);
-import { core, js, dart, dartx } from 'dart_sdk';
-const $toList = dartx.toList;
-const $map = dartx.map;
-let dynamic__Toint = () => (dynamic__Toint = dart.constFn(dart.fnTypeFuzzy(core.int, [dart.dynamic], [dart.dynamic])))();
-let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.fnTypeFuzzy(dart.dynamic, [dart.dynamic], {y: core.String, z: dart.dynamic})))();
-let __Tovoid = () => (__Tovoid = dart.constFn(dart.fnTypeFuzzy(dart.void, [], {i: core.int})))();
-let StringToList = () => (StringToList = dart.constFn(dart.fnTypeFuzzy(core.List, [core.String])))();
-let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
-let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.fnTypeFuzzy(dart.dynamic, [dart.dynamic])))();
-let FnToListOfint = () => (FnToListOfint = dart.constFn(dart.fnTypeFuzzy(ListOfint(), [dynamicTodynamic()])))();
-let MapOfMap$Map = () => (MapOfMap$Map = dart.constFn(core.Map$(core.Map, core.Map)))();
-let Foo = () => (Foo = dart.constFn(closure.Foo$()))();
-let ListOfTAndTToListOfT = () => (ListOfTAndTToListOfT = dart.constFn(dart.gFnType(T => [core.List$(T), [core.List$(T), T]])))();
-let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.fnType(dart.void, [dart.dynamic])))();
-let VoidToNull = () => (VoidToNull = dart.constFn(dart.fnType(core.Null, [])))();
-closure.generic_function = function<T>(T, items: core.List<T> = null, seed: T = null): core.List<T> {
-  let strings = items[$map](core.String, dart.fn((i: T = null): string => dart.str`${i}`, dart.fnType(core.String, [T])))[$toList]();
-  return items;
-};
-dart.fn(closure.generic_function, ListOfTAndTToListOfT());
-closure.Callback = dart.typedef('Callback', () => dart.fnTypeFuzzy(dart.void, [], {i: core.int}));
-const _is_Foo_default = Symbol('_is_Foo_default');
-closure.Foo$ = dart.generic(T => {
-  let FooOfT = () => (FooOfT = dart.constFn(closure.Foo$(T)))();
-  class Foo<T> extends core.Object {
-    i: number;
-    b: boolean;
-    s: string;
-    v: T;
-    static some_static_constant: string;
-    static some_static_final: string;
-    static some_static_var: string;
-    prop: string;
-    static staticProp: string;
-    get i() {
-      return this[i$];
-    }
-    set i(value) {
-      super.i = value;
-    }
-    get b() {
-      return this[b];
-    }
-    set b(value) {
-      this[b] = value;
-    }
-    get s() {
-      return this[s];
-    }
-    set s(value) {
-      this[s] = value;
-    }
-    get v() {
-      return this[v$];
-    }
-    set v(value) {
-      this[v$] = T._check(value);
-    }
-    static build() {
-      return new (FooOfT()).new(1, null);
-    }
-    untyped_method(a = null, b = null) {}
-    pass(t: T = null) {
-      T._check(t);
-      return t;
-    }
-    typed_method(foo: closure.Foo<any> = null, list: core.List<any> = null, i: number = null, n: number = null, d: number = null, b: boolean = null, s: string = null, a: any[] = null, o: Object = null, f: Function = null) {
-      return '';
-    }
-    optional_params(a = null, b = null, c: number = null) {}
-    static named_params(a = null, {b = null, c = null}: {b?: any, c?: number} = {}) {}
-    nullary_method() {}
-    function_params(f: (x: any, y?: any) => number = null, g: (x: any, opts?: {y?: string, z?: any}) => any = null, cb: (opts?: {i?: number}) => void = null) {
-      cb({i: this.i});
-    }
-    run(a: core.List<any> = null, b: string = null, c: (d: string) => core.List<any> = null, e: (f: (g: any) => any) => core.List<number> = null, {h = null}: {h?: core.Map<core.Map<any, any>, core.Map<any, any>>} = {}) {}
-    get prop() {
-      return null;
-    }
-    set prop(value: string = null) {}
-    static get staticProp() {
-      return null;
-    }
-    static set staticProp(value: string = null) {}
-  }
-  (Foo.new = function(i: number = null, v: T = null) {
-    this[i$] = i;
-    this[v$] = v;
-    this[b] = null;
-    this[s] = null;
-  }).prototype = Foo.prototype;
-  dart.addTypeTests(Foo);
-  Foo.prototype[_is_Foo_default] = true;
-  const i$ = Symbol("Foo.i");
-  const b = Symbol("Foo.b");
-  const s = Symbol("Foo.s");
-  const v$ = Symbol("Foo.v");
-  dart.setMethodSignature(Foo, () => ({
-    __proto__: dart.getMethods(Foo.__proto__),
-    untyped_method: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-    pass: dart.fnType(T, [core.Object]),
-    typed_method: dart.fnType(core.String, [closure.Foo, core.List, core.int, core.num, core.double, core.bool, core.String, js.JsArray, js.JsObject, js.JsFunction]),
-    optional_params: dart.fnType(dart.dynamic, [dart.dynamic], [dart.dynamic, core.int]),
-    nullary_method: dart.fnType(dart.dynamic, []),
-    function_params: dart.fnType(dart.dynamic, [dynamic__Toint(), dynamic__Todynamic(), __Tovoid()]),
-    run: dart.fnType(dart.dynamic, [core.List, core.String, StringToList(), FnToListOfint()], {h: MapOfMap$Map()})
-  }));
-  dart.setStaticMethodSignature(Foo, () => ({named_params: dart.fnType(dart.dynamic, [dart.dynamic], {b: dart.dynamic, c: core.int})}));
-  dart.setGetterSignature(Foo, () => ({
-    __proto__: dart.getGetters(Foo.__proto__),
-    prop: dart.fnType(core.String, [])
-  }));
-  dart.setSetterSignature(Foo, () => ({
-    __proto__: dart.getSetters(Foo.__proto__),
-    prop: dart.fnType(dart.void, [core.String])
-  }));
-  dart.setFieldSignature(Foo, () => ({
-    __proto__: dart.getFields(Foo.__proto__),
-    i: dart.finalFieldType(core.int),
-    b: dart.fieldType(core.bool),
-    s: dart.fieldType(core.String),
-    v: dart.fieldType(T)
-  }));
-  return Foo;
-});
-closure.Foo = Foo();
-dart.defineLazy(closure.Foo, {
-  get some_static_constant() {
-    return "abc";
-  },
-  get some_static_final() {
-    return "abc";
-  },
-  get some_static_var() {
-    return "abc";
-  },
-  set some_static_var(_) {}
-});
-dart.addTypeTests(closure.Foo, _is_Foo_default);
-closure.Bar = class Bar extends core.Object {};
-(closure.Bar.new = function() {
-}).prototype = closure.Bar.prototype;
-dart.addTypeTests(closure.Bar);
-closure.Baz = class Baz extends dart.mixin(closure.Foo$(core.int), closure.Bar) {};
-(closure.Baz.new = function(i: number = null) {
-  closure.Baz.__proto__.new.call(this, i, 123);
-}).prototype = closure.Baz.prototype;
-dart.addTypeTests(closure.Baz);
-closure.main = function(args = null): void {
-};
-dart.fn(closure.main, dynamicTovoid());
-dart.defineLazy(closure, {
-  get closure() {
-    return dart.fn((): core.Null => {
-      return;
-    }, VoidToNull());
-  },
-  set closure(_) {},
-  get some_top_level_constant() {
-    return "abc";
-  },
-  get some_top_level_final() {
-    return "abc";
-  },
-  get some_top_level_var() {
-    return "abc";
-  },
-  set some_top_level_var(_) {}
-});
-dart.trackLibraries("closure", {
-  "closure.dart": closure
-}, null);
diff --git a/pkg/dev_compiler/test/codegen_expected/destructuring.js b/pkg/dev_compiler/test/codegen_expected/destructuring.js
deleted file mode 100644
index c8525ad..0000000
--- a/pkg/dev_compiler/test/codegen_expected/destructuring.js
+++ /dev/null
@@ -1,97 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const destructuring = Object.create(_root);
-  const src__varargs = Object.create(_root);
-  let intAnddynamic__Todynamic = () => (intAnddynamic__Todynamic = dart.constFn(dart.fnType(dart.dynamic, [core.int, dart.dynamic], [dart.dynamic])))();
-  let intAnddynamic__Todynamic$ = () => (intAnddynamic__Todynamic$ = dart.constFn(dart.fnType(dart.dynamic, [core.int, dart.dynamic], {c: dart.dynamic})))();
-  let intAnddynamicTodynamic = () => (intAnddynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [core.int, dart.dynamic])))();
-  let intAnddynamicAnddynamicTodynamic = () => (intAnddynamicAnddynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [core.int, dart.dynamic, dart.dynamic])))();
-  let __Todynamic = () => (__Todynamic = dart.constFn(dart.fnType(dart.dynamic, [], [core.int, dart.dynamic, dart.dynamic])))();
-  let __Todynamic$ = () => (__Todynamic$ = dart.constFn(dart.fnType(dart.dynamic, [], {let: core.int, function: dart.dynamic, arguments: dart.dynamic})))();
-  let __Todynamic$0 = () => (__Todynamic$0 = dart.constFn(dart.fnType(dart.dynamic, [], {constructor: core.int, valueOf: dart.dynamic, hasOwnProperty: dart.dynamic})))();
-  let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [dart.dynamic])))();
-  destructuring.f = function(a = null, b = null, c = 1) {
-    destructuring.f(a, b, c);
-  };
-  dart.fn(destructuring.f, intAnddynamic__Todynamic());
-  destructuring.f_sync = function(a, b, c) {
-    return dart.syncStar(function* f_sync(a = null, b = null, c = 1) {
-    }, dart.dynamic, a, b, c);
-  };
-  dart.fn(destructuring.f_sync, intAnddynamic__Todynamic());
-  destructuring.f_async = function(a, b, c) {
-    return dart.asyncStar(function* f_async(stream, a = null, b = null, c = 1) {
-    }, dart.dynamic, a, b, c);
-  };
-  dart.fn(destructuring.f_async, intAnddynamic__Todynamic());
-  destructuring.g = function(a = null, b = null, {c = 1} = {}) {
-    destructuring.f(a, b, c);
-  };
-  dart.fn(destructuring.g, intAnddynamic__Todynamic$());
-  destructuring.g_sync = function(a, b, opts) {
-    return dart.syncStar(function* g_sync(a = null, b = null, {c = 1} = {}) {
-    }, dart.dynamic, a, b, opts);
-  };
-  dart.fn(destructuring.g_sync, intAnddynamic__Todynamic$());
-  destructuring.g_async = function(a, b, opts) {
-    return dart.asyncStar(function* g_async(stream, a = null, b = null, {c = 1} = {}) {
-    }, dart.dynamic, a, b, opts);
-  };
-  dart.fn(destructuring.g_async, intAnddynamic__Todynamic$());
-  destructuring.r = function(a = null, ...others = null) {
-    destructuring.r(a, ...others);
-  };
-  dart.fn(destructuring.r, intAnddynamicTodynamic());
-  destructuring.r_sync = function(a, ...others) {
-    return dart.syncStar(function* r_sync(a = null, ...others = null) {
-    }, dart.dynamic, a, ...others);
-  };
-  dart.fn(destructuring.r_sync, intAnddynamicTodynamic());
-  destructuring.r_async = function(a, ...others) {
-    return dart.asyncStar(function* r_async(stream, a = null, ...others = null) {
-    }, dart.dynamic, a, ...others);
-  };
-  dart.fn(destructuring.r_async, intAnddynamicTodynamic());
-  destructuring.invalid_names1 = function(let$ = null, func = null, arguments$ = null) {
-    destructuring.f(let$, func, arguments$);
-  };
-  dart.fn(destructuring.invalid_names1, intAnddynamicAnddynamicTodynamic());
-  destructuring.invalid_names2 = function(let$ = null, func = 1, arguments$ = null) {
-    destructuring.f(let$, func, arguments$);
-  };
-  dart.fn(destructuring.invalid_names2, __Todynamic());
-  destructuring.invalid_names3 = function({["let"]: let$ = null, ["function"]: func = null, ["arguments"]: arguments$ = 2} = {}) {
-    destructuring.f(let$, func, arguments$);
-  };
-  dart.fn(destructuring.invalid_names3, __Todynamic$());
-  destructuring.names_clashing_with_object_props = function({constructor = null, valueOf = null, hasOwnProperty = 2} = Object.create(null)) {
-    destructuring.f(constructor, valueOf, hasOwnProperty);
-  };
-  dart.fn(destructuring.names_clashing_with_object_props, __Todynamic$0());
-  src__varargs._Rest = class _Rest extends core.Object {};
-  (src__varargs._Rest.new = function() {
-  }).prototype = src__varargs._Rest.prototype;
-  dart.addTypeTests(src__varargs._Rest);
-  dart.defineLazy(src__varargs, {
-    get rest() {
-      return dart.const(new src__varargs._Rest.new());
-    }
-  });
-  src__varargs.spread = function(args = null) {
-    dart.throw(new core.StateError.new('The spread function cannot be called, ' + 'it should be compiled away.'));
-  };
-  dart.fn(src__varargs.spread, dynamicTodynamic());
-  dart.trackLibraries("destructuring", {
-    "destructuring.dart": destructuring,
-    "package:js/src/varargs.dart": src__varargs
-  }, null);
-  // Exports:
-  return {
-    destructuring: destructuring,
-    src__varargs: src__varargs
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/equality_test.js b/pkg/dev_compiler/test/codegen_expected/equality_test.js
deleted file mode 100644
index 076c039..0000000
--- a/pkg/dev_compiler/test/codegen_expected/equality_test.js
+++ /dev/null
@@ -1,1158 +0,0 @@
-define(['dart_sdk', 'expect'], function(dart_sdk, expect) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const minitest = expect.minitest;
-  const _root = Object.create(null);
-  const equality_test = Object.create(_root);
-  const $_equals = dartx._equals;
-  const $_get = dartx._get;
-  let TToT = () => (TToT = dart.constFn(dart.gFnType(T => [T, [T]])))();
-  let VoidToT = () => (VoidToT = dart.constFn(dart.gFnType(T => [T, []])))();
-  let VoidToNull = () => (VoidToNull = dart.constFn(dart.fnType(core.Null, [])))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
-  equality_test.Music = class Music extends core.Object {
-    toString() {
-      return {
-        0: "Music.country",
-        1: "Music.western"
-      }[this.index];
-    }
-  };
-  (equality_test.Music.new = function(x) {
-    this.index = x;
-  }).prototype = equality_test.Music.prototype;
-  dart.addTypeTests(equality_test.Music);
-  dart.setFieldSignature(equality_test.Music, () => ({
-    __proto__: dart.getFields(equality_test.Music.__proto__),
-    index: dart.finalFieldType(core.int)
-  }));
-  dart.defineExtensionMethods(equality_test.Music, ['toString']);
-  equality_test.Music.country = dart.const(new equality_test.Music.new(0));
-  equality_test.Music.western = dart.const(new equality_test.Music.new(1));
-  equality_test.Music.values = dart.constList([equality_test.Music.country, equality_test.Music.western], equality_test.Music);
-  equality_test.BluesBrother = class BluesBrother extends core.Object {};
-  (equality_test.BluesBrother.new = function() {
-  }).prototype = equality_test.BluesBrother.prototype;
-  dart.addTypeTests(equality_test.BluesBrother);
-  equality_test._Jake = class _Jake extends equality_test.BluesBrother {};
-  (equality_test._Jake.new = function() {
-  }).prototype = equality_test._Jake.prototype;
-  dart.addTypeTests(equality_test._Jake);
-  equality_test._Elwood = class _Elwood extends equality_test.BluesBrother {
-    _equals(other) {
-      if (other == null) return false;
-      return equality_test._Elwood.is(other);
-    }
-  };
-  (equality_test._Elwood.new = function() {
-  }).prototype = equality_test._Elwood.prototype;
-  dart.addTypeTests(equality_test._Elwood);
-  dart.setMethodSignature(equality_test._Elwood, () => ({
-    __proto__: dart.getMethods(equality_test._Elwood.__proto__),
-    _equals: dart.fnType(core.bool, [core.Object]),
-    [$_equals]: dart.fnType(core.bool, [core.Object])
-  }));
-  dart.defineExtensionMethods(equality_test._Elwood, ['_equals']);
-  equality_test._Norman = class _Norman extends equality_test.BluesBrother {};
-  (equality_test._Norman.new = function() {
-  }).prototype = equality_test._Norman.prototype;
-  dart.addTypeTests(equality_test._Norman);
-  equality_test.hideNull = function(T, x) {
-    return x;
-  };
-  dart.fn(equality_test.hideNull, TToT());
-  equality_test.getUndefined = function(T) {
-    return T._check(core.List.new(1)[$_get](0));
-  };
-  dart.fn(equality_test.getUndefined, VoidToT());
-  equality_test.main = function() {
-    minitest.group('Enum equality', dart.fn(() => {
-      minitest.test('Equal enum/enum (nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(equality_test.Music, equality_test.Music.country);
-        let e2 = equality_test.hideNull(equality_test.Music, equality_test.Music.western);
-        let d1 = equality_test.hideNull(equality_test.Music, equality_test.Music.country);
-        let d2 = equality_test.hideNull(equality_test.Music, equality_test.Music.western);
-        let o1 = equality_test.hideNull(core.Object, equality_test.Music.country);
-        let o2 = equality_test.hideNull(core.Object, equality_test.Music.western);
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(dart.equals(d1, e1), true);
-        minitest.expect(dart.equals(d1, d1), true);
-        minitest.expect(dart.equals(d1, o1), true);
-        minitest.expect(dart.equals(d1, e2), false);
-        minitest.expect(dart.equals(d1, d2), false);
-        minitest.expect(dart.equals(d1, o2), false);
-        minitest.expect(dart.equals(o1, e1), true);
-        minitest.expect(dart.equals(o1, d1), true);
-        minitest.expect(dart.equals(o1, o1), true);
-        minitest.expect(dart.equals(o1, e2), false);
-        minitest.expect(dart.equals(o1, d2), false);
-        minitest.expect(dart.equals(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal enum/enum (non-null)', dart.fn(() => {
-        let e1 = equality_test.Music.country;
-        let e2 = equality_test.Music.western;
-        let d1 = equality_test.Music.country;
-        let d2 = equality_test.Music.western;
-        let o1 = equality_test.Music.country;
-        let o2 = equality_test.Music.western;
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1[$_equals](e1), true);
-        minitest.expect(d1[$_equals](d1), true);
-        minitest.expect(d1[$_equals](o1), true);
-        minitest.expect(d1[$_equals](e2), false);
-        minitest.expect(d1[$_equals](d2), false);
-        minitest.expect(d1[$_equals](o2), false);
-        minitest.expect(o1[$_equals](e1), true);
-        minitest.expect(o1[$_equals](d1), true);
-        minitest.expect(o1[$_equals](o1), true);
-        minitest.expect(o1[$_equals](e2), false);
-        minitest.expect(o1[$_equals](d2), false);
-        minitest.expect(o1[$_equals](o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal enum/other (static, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(equality_test.Music, equality_test.Music.country);
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test.BluesBrother, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(e1 == l1, false);
-        minitest.expect(e1 == b1, false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal enum/other (static, non-null)', dart.fn(() => {
-        let e1 = equality_test.Music.country;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal enum/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(equality_test.Music, equality_test.Music.country);
-        let d1 = equality_test.hideNull(equality_test.Music, equality_test.Music.country);
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test._Norman, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(dart.equals(s1, e1), false);
-        minitest.expect(dart.equals(s2, e1), false);
-        minitest.expect(dart.equals(i1, e1), false);
-        minitest.expect(dart.equals(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-        minitest.expect(dart.equals(d1, s1), false);
-        minitest.expect(dart.equals(d1, s2), false);
-        minitest.expect(dart.equals(d1, i1), false);
-        minitest.expect(dart.equals(d1, i2), false);
-        minitest.expect(dart.equals(d1, l1), false);
-        minitest.expect(dart.equals(d1, b1), false);
-        minitest.expect(dart.equals(s1, d1), false);
-        minitest.expect(dart.equals(s2, d1), false);
-        minitest.expect(dart.equals(i1, d1), false);
-        minitest.expect(dart.equals(i2, d1), false);
-        minitest.expect(dart.equals(l1, d1), false);
-        minitest.expect(dart.equals(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Equal enum/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = equality_test.Music.country;
-        let d1 = equality_test.Music.country;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-        minitest.expect(d1[$_equals](s1), false);
-        minitest.expect(d1[$_equals](s2), false);
-        minitest.expect(d1[$_equals](i1), false);
-        minitest.expect(d1[$_equals](i2), false);
-        minitest.expect(d1[$_equals](l1), false);
-        minitest.expect(d1[$_equals](b1), false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1[$_equals](d1), false);
-        minitest.expect(b1._equals(d1), false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('String equality', dart.fn(() => {
-      minitest.test('Equal string/string (nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.String, "The");
-        let e2 = equality_test.hideNull(core.String, "Band");
-        let d1 = equality_test.hideNull(core.String, "The");
-        let d2 = equality_test.hideNull(core.String, "Band");
-        let o1 = equality_test.hideNull(core.Object, "The");
-        let o2 = equality_test.hideNull(core.Object, "Band");
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(dart.equals(d1, e1), true);
-        minitest.expect(dart.equals(d1, d1), true);
-        minitest.expect(dart.equals(d1, o1), true);
-        minitest.expect(dart.equals(d1, e2), false);
-        minitest.expect(dart.equals(d1, d2), false);
-        minitest.expect(dart.equals(d1, o2), false);
-        minitest.expect(dart.equals(o1, e1), true);
-        minitest.expect(dart.equals(o1, d1), true);
-        minitest.expect(dart.equals(o1, o1), true);
-        minitest.expect(dart.equals(o1, e2), false);
-        minitest.expect(dart.equals(o1, d2), false);
-        minitest.expect(dart.equals(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/string (non-null)', dart.fn(() => {
-        let e1 = "The";
-        let e2 = "Band";
-        let d1 = "The";
-        let d2 = "Band";
-        let o1 = "The";
-        let o2 = "Band";
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1[$_equals](e1), true);
-        minitest.expect(d1[$_equals](d1), true);
-        minitest.expect(d1[$_equals](o1), true);
-        minitest.expect(d1[$_equals](e2), false);
-        minitest.expect(d1[$_equals](d2), false);
-        minitest.expect(d1[$_equals](o2), false);
-        minitest.expect(o1[$_equals](e1), true);
-        minitest.expect(o1[$_equals](d1), true);
-        minitest.expect(o1[$_equals](o1), true);
-        minitest.expect(o1[$_equals](e2), false);
-        minitest.expect(o1[$_equals](d2), false);
-        minitest.expect(o1[$_equals](o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (static, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.String, "The");
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test.BluesBrother, new equality_test._Norman.new());
-        minitest.expect(e1 == s1, false);
-        minitest.expect(e1 == s2, false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(s1 == e1, false);
-        minitest.expect(s2 == e1, false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (static, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.String, "The");
-        let d1 = equality_test.hideNull(core.String, "The");
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test._Norman, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(dart.equals(s1, e1), false);
-        minitest.expect(dart.equals(s2, e1), false);
-        minitest.expect(dart.equals(i1, e1), false);
-        minitest.expect(dart.equals(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-        minitest.expect(dart.equals(d1, s1), false);
-        minitest.expect(dart.equals(d1, s2), false);
-        minitest.expect(dart.equals(d1, i1), false);
-        minitest.expect(dart.equals(d1, i2), false);
-        minitest.expect(dart.equals(d1, l1), false);
-        minitest.expect(dart.equals(d1, b1), false);
-        minitest.expect(dart.equals(s1, d1), false);
-        minitest.expect(dart.equals(s2, d1), false);
-        minitest.expect(dart.equals(i1, d1), false);
-        minitest.expect(dart.equals(i2, d1), false);
-        minitest.expect(dart.equals(l1, d1), false);
-        minitest.expect(dart.equals(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let d1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-        minitest.expect(d1[$_equals](s1), false);
-        minitest.expect(d1[$_equals](s2), false);
-        minitest.expect(d1[$_equals](i1), false);
-        minitest.expect(d1[$_equals](i2), false);
-        minitest.expect(d1[$_equals](l1), false);
-        minitest.expect(d1[$_equals](b1), false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1[$_equals](d1), false);
-        minitest.expect(b1._equals(d1), false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Boolean equality', dart.fn(() => {
-      minitest.test('Equal bool/bool (nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.bool, true);
-        let e2 = equality_test.hideNull(core.bool, false);
-        let d1 = equality_test.hideNull(core.bool, true);
-        let d2 = equality_test.hideNull(core.bool, false);
-        let o1 = equality_test.hideNull(core.Object, true);
-        let o2 = equality_test.hideNull(core.Object, false);
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(dart.equals(d1, e1), true);
-        minitest.expect(dart.equals(d1, d1), true);
-        minitest.expect(dart.equals(d1, o1), true);
-        minitest.expect(dart.equals(d1, e2), false);
-        minitest.expect(dart.equals(d1, d2), false);
-        minitest.expect(dart.equals(d1, o2), false);
-        minitest.expect(dart.equals(o1, e1), true);
-        minitest.expect(dart.equals(o1, d1), true);
-        minitest.expect(dart.equals(o1, o1), true);
-        minitest.expect(dart.equals(o1, e2), false);
-        minitest.expect(dart.equals(o1, d2), false);
-        minitest.expect(dart.equals(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal bool/bool (non-null)', dart.fn(() => {
-        let e1 = true;
-        let e2 = false;
-        let d1 = true;
-        let d2 = false;
-        let o1 = true;
-        let o2 = false;
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1[$_equals](e1), true);
-        minitest.expect(d1[$_equals](d1), true);
-        minitest.expect(d1[$_equals](o1), true);
-        minitest.expect(d1[$_equals](e2), false);
-        minitest.expect(d1[$_equals](d2), false);
-        minitest.expect(d1[$_equals](o2), false);
-        minitest.expect(o1[$_equals](e1), true);
-        minitest.expect(o1[$_equals](d1), true);
-        minitest.expect(o1[$_equals](o1), true);
-        minitest.expect(o1[$_equals](e2), false);
-        minitest.expect(o1[$_equals](d2), false);
-        minitest.expect(o1[$_equals](o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal bool/other (static, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.bool, true);
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test.BluesBrother, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal bool/other (static, non-null)', dart.fn(() => {
-        let e1 = true;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal bool/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.bool, true);
-        let d1 = equality_test.hideNull(core.bool, true);
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test._Norman, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(dart.equals(s1, e1), false);
-        minitest.expect(dart.equals(s2, e1), false);
-        minitest.expect(dart.equals(i1, e1), false);
-        minitest.expect(dart.equals(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-        minitest.expect(dart.equals(d1, s1), false);
-        minitest.expect(dart.equals(d1, s2), false);
-        minitest.expect(dart.equals(d1, i1), false);
-        minitest.expect(dart.equals(d1, i2), false);
-        minitest.expect(dart.equals(d1, l1), false);
-        minitest.expect(dart.equals(d1, b1), false);
-        minitest.expect(dart.equals(s1, d1), false);
-        minitest.expect(dart.equals(s2, d1), false);
-        minitest.expect(dart.equals(i1, d1), false);
-        minitest.expect(dart.equals(i2, d1), false);
-        minitest.expect(dart.equals(l1, d1), false);
-        minitest.expect(dart.equals(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Equal bool/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = true;
-        let d1 = true;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-        minitest.expect(d1[$_equals](s1), false);
-        minitest.expect(d1[$_equals](s2), false);
-        minitest.expect(d1[$_equals](i1), false);
-        minitest.expect(d1[$_equals](i2), false);
-        minitest.expect(d1[$_equals](l1), false);
-        minitest.expect(d1[$_equals](b1), false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1[$_equals](d1), false);
-        minitest.expect(b1._equals(d1), false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('String equality', dart.fn(() => {
-      minitest.test('Equal string/string (nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.String, "The");
-        let e2 = equality_test.hideNull(core.String, "Band");
-        let d1 = equality_test.hideNull(core.String, "The");
-        let d2 = equality_test.hideNull(core.String, "Band");
-        let o1 = equality_test.hideNull(core.Object, "The");
-        let o2 = equality_test.hideNull(core.Object, "Band");
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(dart.equals(d1, e1), true);
-        minitest.expect(dart.equals(d1, d1), true);
-        minitest.expect(dart.equals(d1, o1), true);
-        minitest.expect(dart.equals(d1, e2), false);
-        minitest.expect(dart.equals(d1, d2), false);
-        minitest.expect(dart.equals(d1, o2), false);
-        minitest.expect(dart.equals(o1, e1), true);
-        minitest.expect(dart.equals(o1, d1), true);
-        minitest.expect(dart.equals(o1, o1), true);
-        minitest.expect(dart.equals(o1, e2), false);
-        minitest.expect(dart.equals(o1, d2), false);
-        minitest.expect(dart.equals(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/string (non-null)', dart.fn(() => {
-        let e1 = "The";
-        let e2 = "Band";
-        let d1 = "The";
-        let d2 = "Band";
-        let o1 = "The";
-        let o2 = "Band";
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1[$_equals](e1), true);
-        minitest.expect(d1[$_equals](d1), true);
-        minitest.expect(d1[$_equals](o1), true);
-        minitest.expect(d1[$_equals](e2), false);
-        minitest.expect(d1[$_equals](d2), false);
-        minitest.expect(d1[$_equals](o2), false);
-        minitest.expect(o1[$_equals](e1), true);
-        minitest.expect(o1[$_equals](d1), true);
-        minitest.expect(o1[$_equals](o1), true);
-        minitest.expect(o1[$_equals](e2), false);
-        minitest.expect(o1[$_equals](d2), false);
-        minitest.expect(o1[$_equals](o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (static, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.String, "The");
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test.BluesBrother, new equality_test._Norman.new());
-        minitest.expect(e1 == s1, false);
-        minitest.expect(e1 == s2, false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(s1 == e1, false);
-        minitest.expect(s2 == e1, false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (static, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.String, "The");
-        let d1 = equality_test.hideNull(core.String, "The");
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test._Norman, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(dart.equals(s1, e1), false);
-        minitest.expect(dart.equals(s2, e1), false);
-        minitest.expect(dart.equals(i1, e1), false);
-        minitest.expect(dart.equals(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-        minitest.expect(dart.equals(d1, s1), false);
-        minitest.expect(dart.equals(d1, s2), false);
-        minitest.expect(dart.equals(d1, i1), false);
-        minitest.expect(dart.equals(d1, i2), false);
-        minitest.expect(dart.equals(d1, l1), false);
-        minitest.expect(dart.equals(d1, b1), false);
-        minitest.expect(dart.equals(s1, d1), false);
-        minitest.expect(dart.equals(s2, d1), false);
-        minitest.expect(dart.equals(i1, d1), false);
-        minitest.expect(dart.equals(i2, d1), false);
-        minitest.expect(dart.equals(l1, d1), false);
-        minitest.expect(dart.equals(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Equal string/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let d1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-        minitest.expect(d1[$_equals](s1), false);
-        minitest.expect(d1[$_equals](s2), false);
-        minitest.expect(d1[$_equals](i1), false);
-        minitest.expect(d1[$_equals](i2), false);
-        minitest.expect(d1[$_equals](l1), false);
-        minitest.expect(d1[$_equals](b1), false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1[$_equals](d1), false);
-        minitest.expect(b1._equals(d1), false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Number equality', dart.fn(() => {
-      minitest.test('Equal int/int (nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.int, 11);
-        let e2 = equality_test.hideNull(core.int, 12);
-        let d1 = equality_test.hideNull(core.int, 11);
-        let d2 = equality_test.hideNull(core.int, 12);
-        let o1 = equality_test.hideNull(core.Object, 11);
-        let o2 = equality_test.hideNull(core.Object, 12);
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(dart.equals(d1, e1), true);
-        minitest.expect(dart.equals(d1, d1), true);
-        minitest.expect(dart.equals(d1, o1), true);
-        minitest.expect(dart.equals(d1, e2), false);
-        minitest.expect(dart.equals(d1, d2), false);
-        minitest.expect(dart.equals(d1, o2), false);
-        minitest.expect(dart.equals(o1, e1), true);
-        minitest.expect(dart.equals(o1, d1), true);
-        minitest.expect(dart.equals(o1, o1), true);
-        minitest.expect(dart.equals(o1, e2), false);
-        minitest.expect(dart.equals(o1, d2), false);
-        minitest.expect(dart.equals(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal int/int (non-null)', dart.fn(() => {
-        let e1 = 11;
-        let e2 = 12;
-        let d1 = 11;
-        let d2 = 12;
-        let o1 = 11;
-        let o2 = 12;
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1[$_equals](e1), true);
-        minitest.expect(d1[$_equals](d1), true);
-        minitest.expect(d1[$_equals](o1), true);
-        minitest.expect(d1[$_equals](e2), false);
-        minitest.expect(d1[$_equals](d2), false);
-        minitest.expect(d1[$_equals](o2), false);
-        minitest.expect(o1[$_equals](e1), true);
-        minitest.expect(o1[$_equals](d1), true);
-        minitest.expect(o1[$_equals](o1), true);
-        minitest.expect(o1[$_equals](e2), false);
-        minitest.expect(o1[$_equals](d2), false);
-        minitest.expect(o1[$_equals](o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal int/other (static, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.int, 11);
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test.BluesBrother, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(e1 == i1, false);
-        minitest.expect(e1 == i2, false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(i1 == e1, false);
-        minitest.expect(i2 == e1, false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal int/other (static, non-null)', dart.fn(() => {
-        let e1 = 11;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal int/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(core.int, 11);
-        let d1 = equality_test.hideNull(core.int, 11);
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test._Norman, new equality_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(dart.equals(s1, e1), false);
-        minitest.expect(dart.equals(s2, e1), false);
-        minitest.expect(dart.equals(i1, e1), false);
-        minitest.expect(dart.equals(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-        minitest.expect(dart.equals(d1, s1), false);
-        minitest.expect(dart.equals(d1, s2), false);
-        minitest.expect(dart.equals(d1, i1), false);
-        minitest.expect(dart.equals(d1, i2), false);
-        minitest.expect(dart.equals(d1, l1), false);
-        minitest.expect(dart.equals(d1, b1), false);
-        minitest.expect(dart.equals(s1, d1), false);
-        minitest.expect(dart.equals(s2, d1), false);
-        minitest.expect(dart.equals(i1, d1), false);
-        minitest.expect(dart.equals(i2, d1), false);
-        minitest.expect(dart.equals(l1, d1), false);
-        minitest.expect(dart.equals(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Equal int/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = 11;
-        let d1 = 11;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-        minitest.expect(d1[$_equals](s1), false);
-        minitest.expect(d1[$_equals](s2), false);
-        minitest.expect(d1[$_equals](i1), false);
-        minitest.expect(d1[$_equals](i2), false);
-        minitest.expect(d1[$_equals](l1), false);
-        minitest.expect(d1[$_equals](b1), false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1[$_equals](d1), false);
-        minitest.expect(b1._equals(d1), false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Object equality', dart.fn(() => {
-      minitest.test('Equal object/object (nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(equality_test._Jake, new equality_test._Jake.new());
-        let e2 = equality_test.hideNull(equality_test._Elwood, new equality_test._Elwood.new());
-        let d1 = equality_test.hideNull(equality_test._Jake, e1);
-        let d2 = equality_test.hideNull(equality_test._Elwood, new equality_test._Elwood.new());
-        let o1 = equality_test.hideNull(core.Object, e1);
-        let o2 = equality_test.hideNull(core.Object, new equality_test._Elwood.new());
-        minitest.expect(dart.equals(e1, e1), true);
-        minitest.expect(dart.equals(e1, d1), true);
-        minitest.expect(dart.equals(e1, o1), true);
-        minitest.expect(dart.equals(e1, e2), false);
-        minitest.expect(dart.equals(e1, o2), false);
-        minitest.expect(dart.equals(e1, d2), false);
-        minitest.expect(dart.equals(e1, e2), false);
-        minitest.expect(dart.equals(d1, e1), true);
-        minitest.expect(dart.equals(d1, d1), true);
-        minitest.expect(dart.equals(d1, o1), true);
-        minitest.expect(dart.equals(d1, e2), false);
-        minitest.expect(dart.equals(d1, d2), false);
-        minitest.expect(dart.equals(d1, o2), false);
-        minitest.expect(dart.equals(o1, e1), true);
-        minitest.expect(dart.equals(o1, d1), true);
-        minitest.expect(dart.equals(o1, o1), true);
-        minitest.expect(dart.equals(o1, e2), false);
-        minitest.expect(dart.equals(o1, d2), false);
-        minitest.expect(dart.equals(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal object/object (non-null)', dart.fn(() => {
-        let e1 = new equality_test._Jake.new();
-        let e2 = new equality_test._Elwood.new();
-        let d1 = e1;
-        let d2 = new equality_test._Elwood.new();
-        let o1 = e1;
-        let o2 = new equality_test._Elwood.new();
-        minitest.expect(e1._equals(e1), true);
-        minitest.expect(e1._equals(d1), true);
-        minitest.expect(e1._equals(o1), true);
-        minitest.expect(e1._equals(e2), false);
-        minitest.expect(e1._equals(o2), false);
-        minitest.expect(e1._equals(d2), false);
-        minitest.expect(e1._equals(e2), false);
-        minitest.expect(d1[$_equals](e1), true);
-        minitest.expect(d1[$_equals](d1), true);
-        minitest.expect(d1[$_equals](o1), true);
-        minitest.expect(d1[$_equals](e2), false);
-        minitest.expect(d1[$_equals](d2), false);
-        minitest.expect(d1[$_equals](o2), false);
-        minitest.expect(o1[$_equals](e1), true);
-        minitest.expect(o1[$_equals](d1), true);
-        minitest.expect(o1[$_equals](o1), true);
-        minitest.expect(o1[$_equals](e2), false);
-        minitest.expect(o1[$_equals](d2), false);
-        minitest.expect(o1[$_equals](o2), false);
-      }, VoidToNull()));
-      minitest.test('Equal object/other (static, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(equality_test._Jake, new equality_test._Jake.new());
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test.BluesBrother, new equality_test._Norman.new());
-        minitest.expect(dart.equals(e1, s1), false);
-        minitest.expect(dart.equals(e1, s2), false);
-        minitest.expect(dart.equals(e1, i1), false);
-        minitest.expect(dart.equals(e1, i2), false);
-        minitest.expect(dart.equals(e1, l1), false);
-        minitest.expect(dart.equals(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal object/other (static, non-null)', dart.fn(() => {
-        let e1 = new equality_test._Jake.new();
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1._equals(s1), false);
-        minitest.expect(e1._equals(s2), false);
-        minitest.expect(e1._equals(i1), false);
-        minitest.expect(e1._equals(i2), false);
-        minitest.expect(e1._equals(l1), false);
-        minitest.expect(e1._equals(b1), false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-      }, VoidToNull()));
-      minitest.test('Equal object/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = equality_test.hideNull(equality_test._Jake, new equality_test._Jake.new());
-        let d1 = equality_test.hideNull(equality_test._Jake, new equality_test._Jake.new());
-        let s1 = equality_test.hideNull(core.String, "hello");
-        let s2 = equality_test.hideNull(core.String, "");
-        let i1 = equality_test.hideNull(core.int, 3);
-        let i2 = equality_test.hideNull(core.int, 0);
-        let l1 = equality_test.hideNull(core.List, core.List.new(3));
-        let b1 = equality_test.hideNull(equality_test._Norman, new equality_test._Norman.new());
-        minitest.expect(dart.equals(e1, s1), false);
-        minitest.expect(dart.equals(e1, s2), false);
-        minitest.expect(dart.equals(e1, i1), false);
-        minitest.expect(dart.equals(e1, i2), false);
-        minitest.expect(dart.equals(e1, l1), false);
-        minitest.expect(dart.equals(e1, b1), false);
-        minitest.expect(dart.equals(s1, e1), false);
-        minitest.expect(dart.equals(s2, e1), false);
-        minitest.expect(dart.equals(i1, e1), false);
-        minitest.expect(dart.equals(i2, e1), false);
-        minitest.expect(dart.equals(l1, e1), false);
-        minitest.expect(dart.equals(b1, e1), false);
-        minitest.expect(dart.equals(d1, s1), false);
-        minitest.expect(dart.equals(d1, s2), false);
-        minitest.expect(dart.equals(d1, i1), false);
-        minitest.expect(dart.equals(d1, i2), false);
-        minitest.expect(dart.equals(d1, l1), false);
-        minitest.expect(dart.equals(d1, b1), false);
-        minitest.expect(dart.equals(s1, d1), false);
-        minitest.expect(dart.equals(s2, d1), false);
-        minitest.expect(dart.equals(i1, d1), false);
-        minitest.expect(dart.equals(i2, d1), false);
-        minitest.expect(dart.equals(l1, d1), false);
-        minitest.expect(dart.equals(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Equal object/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = new equality_test._Jake.new();
-        let d1 = new equality_test._Jake.new();
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new equality_test._Norman.new();
-        minitest.expect(e1._equals(s1), false);
-        minitest.expect(e1._equals(s2), false);
-        minitest.expect(e1._equals(i1), false);
-        minitest.expect(e1._equals(i2), false);
-        minitest.expect(e1._equals(l1), false);
-        minitest.expect(e1._equals(b1), false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1[$_equals](e1), false);
-        minitest.expect(b1._equals(e1), false);
-        minitest.expect(d1[$_equals](s1), false);
-        minitest.expect(d1[$_equals](s2), false);
-        minitest.expect(d1[$_equals](i1), false);
-        minitest.expect(d1[$_equals](i2), false);
-        minitest.expect(d1[$_equals](l1), false);
-        minitest.expect(d1[$_equals](b1), false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1[$_equals](d1), false);
-        minitest.expect(b1._equals(d1), false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Null/undefined equality', dart.fn(() => {
-      minitest.test('Equal object/other (static, null)', dart.fn(() => {
-        let n = equality_test.hideNull(equality_test.BluesBrother, null);
-        let u1 = equality_test.getUndefined(core.String);
-        let u2 = equality_test.getUndefined(core.int);
-        let u3 = equality_test.getUndefined(core.bool);
-        let u4 = equality_test.getUndefined(core.List);
-        minitest.expect(dart.equals(n, n), true);
-        minitest.expect(dart.equals(n, u1), true);
-        minitest.expect(dart.equals(n, u2), true);
-        minitest.expect(dart.equals(n, u3), true);
-        minitest.expect(dart.equals(n, u4), true);
-        minitest.expect(core.identical(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(dart.equals(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Equal String/other (static, null)', dart.fn(() => {
-        let u1 = equality_test.getUndefined(equality_test.BluesBrother);
-        let n = equality_test.hideNull(core.String, null);
-        let u2 = equality_test.getUndefined(core.int);
-        let u3 = equality_test.getUndefined(core.bool);
-        let u4 = equality_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(dart.equals(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(dart.equals(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Equal int/other (static, null)', dart.fn(() => {
-        let u1 = equality_test.getUndefined(equality_test.BluesBrother);
-        let u2 = equality_test.getUndefined(core.String);
-        let n = equality_test.hideNull(core.int, null);
-        let u3 = equality_test.getUndefined(core.bool);
-        let u4 = equality_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(dart.equals(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(dart.equals(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Equal bool/other (static, null)', dart.fn(() => {
-        let u1 = equality_test.getUndefined(equality_test.BluesBrother);
-        let u2 = equality_test.getUndefined(core.String);
-        let u3 = equality_test.getUndefined(core.int);
-        let n = equality_test.hideNull(core.bool, null);
-        let u4 = equality_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(dart.equals(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(dart.equals(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Equal List/other (static, null)', dart.fn(() => {
-        let u1 = equality_test.getUndefined(equality_test.BluesBrother);
-        let u2 = equality_test.getUndefined(core.String);
-        let u3 = equality_test.getUndefined(core.int);
-        let u4 = equality_test.getUndefined(core.bool);
-        let n = equality_test.hideNull(core.List, null);
-        minitest.expect(dart.equals(n, n), true);
-        minitest.expect(dart.equals(n, u1), true);
-        minitest.expect(dart.equals(n, u2), true);
-        minitest.expect(dart.equals(n, u3), true);
-        minitest.expect(dart.equals(n, u4), true);
-        minitest.expect(dart.equals(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(core.identical(u4, n), true);
-      }, VoidToNull()));
-    }, VoidToNull()));
-  };
-  dart.fn(equality_test.main, VoidTodynamic());
-  dart.trackLibraries("equality_test", {
-    "equality_test.dart": equality_test
-  }, null);
-  // Exports:
-  return {
-    equality_test: equality_test
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/es6_modules.js b/pkg/dev_compiler/test/codegen_expected/es6_modules.js
deleted file mode 100644
index f2cb5f2..0000000
--- a/pkg/dev_compiler/test/codegen_expected/es6_modules.js
+++ /dev/null
@@ -1,72 +0,0 @@
-const _root = Object.create(null);
-export const es6_modules = Object.create(_root);
-import { core, dart, dartx } from 'dart_sdk';
-let B = () => (B = dart.constFn(es6_modules.B$()))();
-let _B = () => (_B = dart.constFn(es6_modules._B$()))();
-let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
-let VoidToString = () => (VoidToString = dart.constFn(dart.fnType(core.String, [])))();
-es6_modules.Callback = dart.typedef('Callback', () => dart.fnTypeFuzzy(dart.void, [], {i: core.int}));
-es6_modules.A = class A extends core.Object {};
-(es6_modules.A.new = function() {
-}).prototype = es6_modules.A.prototype;
-dart.addTypeTests(es6_modules.A);
-es6_modules._A = class _A extends core.Object {};
-(es6_modules._A.new = function() {
-}).prototype = es6_modules._A.prototype;
-dart.addTypeTests(es6_modules._A);
-const _is_B_default = Symbol('_is_B_default');
-es6_modules.B$ = dart.generic(T => {
-  class B extends core.Object {}
-  (B.new = function() {
-  }).prototype = B.prototype;
-  dart.addTypeTests(B);
-  B.prototype[_is_B_default] = true;
-  return B;
-});
-es6_modules.B = B();
-dart.addTypeTests(es6_modules.B, _is_B_default);
-const _is__B_default = Symbol('_is__B_default');
-es6_modules._B$ = dart.generic(T => {
-  class _B extends core.Object {}
-  (_B.new = function() {
-  }).prototype = _B.prototype;
-  dart.addTypeTests(_B);
-  _B.prototype[_is__B_default] = true;
-  return _B;
-});
-es6_modules._B = _B();
-dart.addTypeTests(es6_modules._B, _is__B_default);
-es6_modules.f = function() {
-};
-dart.fn(es6_modules.f, VoidTodynamic());
-es6_modules._f = function() {
-};
-dart.fn(es6_modules._f, VoidTodynamic());
-dart.defineLazy(es6_modules, {
-  get constant() {
-    return "abc";
-  },
-  get finalConstant() {
-    return "abc";
-  },
-  get lazy() {
-    return dart.fn(() => {
-      core.print('lazy');
-      return "abc";
-    }, VoidToString())();
-  },
-  get mutable() {
-    return "abc";
-  },
-  set mutable(_) {},
-  get lazyMutable() {
-    return dart.fn(() => {
-      core.print('lazyMutable');
-      return "abc";
-    }, VoidToString())();
-  },
-  set lazyMutable(_) {}
-});
-dart.trackLibraries("es6_modules", {
-  "es6_modules.dart": es6_modules
-}, null);
diff --git a/pkg/dev_compiler/test/codegen_expected/expect.js b/pkg/dev_compiler/test/codegen_expected/expect.js
deleted file mode 100644
index 793ac41..0000000
--- a/pkg/dev_compiler/test/codegen_expected/expect.js
+++ /dev/null
@@ -1,338 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const expect = Object.create(null);
-  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.functionType(dart.void, [])))();
-  let dynamicAnddynamicTobool = () => (dynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic])))();
-  expect.Expect = class Expect extends core.Object {
-    static _truncateString(string, start, end, length) {
-      if (dart.notNull(end) - dart.notNull(start) > dart.notNull(length)) {
-        end = dart.notNull(start) + dart.notNull(length);
-      } else if (dart.notNull(end) - dart.notNull(start) < dart.notNull(length)) {
-        let overflow = dart.notNull(length) - (dart.notNull(end) - dart.notNull(start));
-        if (overflow > 10) overflow = 10;
-        start = dart.notNull(start) - ((overflow + 1) / 2)[dartx.truncate]();
-        end = dart.notNull(end) + (overflow / 2)[dartx.truncate]();
-        if (dart.notNull(start) < 0) start = 0;
-        if (dart.notNull(end) > dart.notNull(string[dartx.length])) end = string[dartx.length];
-      }
-      if (start == 0 && end == string[dartx.length]) return string;
-      let buf = new core.StringBuffer();
-      if (dart.notNull(start) > 0) buf.write("...");
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let code = string[dartx.codeUnitAt](i);
-        if (dart.notNull(code) < 32) {
-          buf.write("\\x");
-          buf.write("0123456789abcdef"[dartx.get]((dart.notNull(code) / 16)[dartx.truncate]()));
-          buf.write("0123456789abcdef"[dartx.get](code[dartx['%']](16)));
-        } else {
-          buf.writeCharCode(string[dartx.codeUnitAt](i));
-        }
-      }
-      if (dart.notNull(end) < dart.notNull(string[dartx.length])) buf.write("...");
-      return buf.toString();
-    }
-    static _stringDifference(expected, actual) {
-      if (dart.notNull(expected[dartx.length]) < 20 && dart.notNull(actual[dartx.length]) < 20) return null;
-      for (let i = 0; i < dart.notNull(expected[dartx.length]) && i < dart.notNull(actual[dartx.length]); i++) {
-        if (expected[dartx.codeUnitAt](i) != actual[dartx.codeUnitAt](i)) {
-          let start = i;
-          i++;
-          while (i < dart.notNull(expected[dartx.length]) && i < dart.notNull(actual[dartx.length])) {
-            if (expected[dartx.codeUnitAt](i) == actual[dartx.codeUnitAt](i)) break;
-            i++;
-          }
-          let end = i;
-          let truncExpected = expect.Expect._truncateString(expected, start, end, 20);
-          let truncActual = expect.Expect._truncateString(actual, start, end, 20);
-          return dart.str`at index ${start}: Expected <${truncExpected}>, ` + dart.str`Found: <${truncActual}>`;
-        }
-      }
-      return null;
-    }
-    static equals(expected, actual, reason) {
-      if (reason === void 0) reason = null;
-      if (dart.equals(expected, actual)) return;
-      let msg = expect.Expect._getMessage(reason);
-      if (typeof expected == 'string' && typeof actual == 'string') {
-        let stringDifference = expect.Expect._stringDifference(expected, actual);
-        if (stringDifference != null) {
-          expect.Expect._fail(dart.str`Expect.equals(${stringDifference}${msg}) fails.`);
-        }
-      }
-      expect.Expect._fail(dart.str`Expect.equals(expected: <${expected}>, actual: <${actual}>${msg}) fails.`);
-    }
-    static isTrue(actual, reason) {
-      if (reason === void 0) reason = null;
-      if (dart.test(expect._identical(actual, true))) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.isTrue(${actual}${msg}) fails.`);
-    }
-    static isFalse(actual, reason) {
-      if (reason === void 0) reason = null;
-      if (dart.test(expect._identical(actual, false))) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.isFalse(${actual}${msg}) fails.`);
-    }
-    static isNull(actual, reason) {
-      if (reason === void 0) reason = null;
-      if (null == actual) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.isNull(actual: <${actual}>${msg}) fails.`);
-    }
-    static isNotNull(actual, reason) {
-      if (reason === void 0) reason = null;
-      if (null != actual) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.isNotNull(actual: <${actual}>${msg}) fails.`);
-    }
-    static identical(expected, actual, reason) {
-      if (reason === void 0) reason = null;
-      if (dart.test(expect._identical(expected, actual))) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.identical(expected: <${expected}>, actual: <${actual}>${msg}) ` + "fails.");
-    }
-    static fail(msg) {
-      expect.Expect._fail(dart.str`Expect.fail('${msg}')`);
-    }
-    static approxEquals(expected, actual, tolerance, reason) {
-      if (tolerance === void 0) tolerance = null;
-      if (reason === void 0) reason = null;
-      if (tolerance == null) {
-        tolerance = (dart.notNull(expected) / 10000.0)[dartx.abs]();
-      }
-      if (dart.notNull((dart.notNull(expected) - dart.notNull(actual))[dartx.abs]()) <= dart.notNull(tolerance)) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.approxEquals(expected:<${expected}>, actual:<${actual}>, ` + dart.str`tolerance:<${tolerance}>${msg}) fails`);
-    }
-    static notEquals(unexpected, actual, reason) {
-      if (reason === void 0) reason = null;
-      if (!dart.equals(unexpected, actual)) return;
-      let msg = expect.Expect._getMessage(reason);
-      expect.Expect._fail(dart.str`Expect.notEquals(unexpected: <${unexpected}>, actual:<${actual}>${msg}) ` + "fails.");
-    }
-    static listEquals(expected, actual, reason) {
-      if (reason === void 0) reason = null;
-      let msg = expect.Expect._getMessage(reason);
-      let n = dart.notNull(expected[dartx.length]) < dart.notNull(actual[dartx.length]) ? expected[dartx.length] : actual[dartx.length];
-      for (let i = 0; i < dart.notNull(n); i++) {
-        if (!dart.equals(expected[dartx.get](i), actual[dartx.get](i))) {
-          expect.Expect._fail(dart.str`Expect.listEquals(at index ${i}, ` + dart.str`expected: <${expected[dartx.get](i)}>, actual: <${actual[dartx.get](i)}>${msg}) fails`);
-        }
-      }
-      if (expected[dartx.length] != actual[dartx.length]) {
-        expect.Expect._fail('Expect.listEquals(list length, ' + dart.str`expected: <${expected[dartx.length]}>, actual: <${actual[dartx.length]}>${msg}) ` + 'fails: Next element <' + dart.str`${dart.notNull(expected[dartx.length]) > dart.notNull(n) ? expected[dartx.get](n) : actual[dartx.get](n)}>`);
-      }
-    }
-    static mapEquals(expected, actual, reason) {
-      if (reason === void 0) reason = null;
-      let msg = expect.Expect._getMessage(reason);
-      for (let key of expected[dartx.keys]) {
-        if (!dart.test(actual[dartx.containsKey](key))) {
-          expect.Expect._fail(dart.str`Expect.mapEquals(missing expected key: <${key}>${msg}) fails`);
-        }
-        expect.Expect.equals(expected[dartx.get](key), actual[dartx.get](key));
-      }
-      for (let key of actual[dartx.keys]) {
-        if (!dart.test(expected[dartx.containsKey](key))) {
-          expect.Expect._fail(dart.str`Expect.mapEquals(unexpected key: <${key}>${msg}) fails`);
-        }
-      }
-    }
-    static stringEquals(expected, actual, reason) {
-      if (reason === void 0) reason = null;
-      if (expected == actual) return;
-      let msg = expect.Expect._getMessage(reason);
-      let defaultMessage = dart.str`Expect.stringEquals(expected: <${expected}>", <${actual}>${msg}) fails`;
-      if (expected == null || actual == null) {
-        expect.Expect._fail(dart.str`${defaultMessage}`);
-      }
-      let left = 0;
-      let right = 0;
-      let eLen = expected[dartx.length];
-      let aLen = actual[dartx.length];
-      while (true) {
-        if (left == eLen || left == aLen || expected[dartx.get](left) != actual[dartx.get](left)) {
-          break;
-        }
-        left++;
-      }
-      let eRem = dart.notNull(eLen) - left;
-      let aRem = dart.notNull(aLen) - left;
-      while (true) {
-        if (right == eRem || right == aRem || expected[dartx.get](dart.notNull(eLen) - right - 1) != actual[dartx.get](dart.notNull(aLen) - right - 1)) {
-          break;
-        }
-        right++;
-      }
-      let leftSnippet = expected[dartx.substring](left < 10 ? 0 : left - 10, left);
-      let rightSnippetLength = right < 10 ? right : 10;
-      let rightSnippet = expected[dartx.substring](dart.notNull(eLen) - right, dart.notNull(eLen) - right + rightSnippetLength);
-      let eSnippet = expected[dartx.substring](left, dart.notNull(eLen) - right);
-      let aSnippet = actual[dartx.substring](left, dart.notNull(aLen) - right);
-      if (dart.notNull(eSnippet[dartx.length]) > 43) {
-        eSnippet = dart.notNull(eSnippet[dartx.substring](0, 20)) + "..." + dart.notNull(eSnippet[dartx.substring](dart.notNull(eSnippet[dartx.length]) - 20));
-      }
-      if (dart.notNull(aSnippet[dartx.length]) > 43) {
-        aSnippet = dart.notNull(aSnippet[dartx.substring](0, 20)) + "..." + dart.notNull(aSnippet[dartx.substring](dart.notNull(aSnippet[dartx.length]) - 20));
-      }
-      let leftLead = "...";
-      let rightTail = "...";
-      if (left <= 10) leftLead = "";
-      if (right <= 10) rightTail = "";
-      let diff = dart.str`\nDiff (${left}..${dart.notNull(eLen) - right}/${dart.notNull(aLen) - right}):\n` + dart.str`${leftLead}${leftSnippet}[ ${eSnippet} ]${rightSnippet}${rightTail}\n` + dart.str`${leftLead}${leftSnippet}[ ${aSnippet} ]${rightSnippet}${rightTail}`;
-      expect.Expect._fail(dart.str`${defaultMessage}${diff}`);
-    }
-    static setEquals(expected, actual, reason) {
-      if (reason === void 0) reason = null;
-      let missingSet = core.Set.from(expected);
-      missingSet.removeAll(actual);
-      let extraSet = core.Set.from(actual);
-      extraSet.removeAll(expected);
-      if (dart.test(extraSet.isEmpty) && dart.test(missingSet.isEmpty)) return;
-      let msg = expect.Expect._getMessage(reason);
-      let sb = new core.StringBuffer(dart.str`Expect.setEquals(${msg}) fails`);
-      if (!dart.test(missingSet.isEmpty)) {
-        sb.write('\nExpected collection does not contain: ');
-      }
-      for (let val of missingSet) {
-        sb.write(dart.str`${val} `);
-      }
-      if (!dart.test(extraSet.isEmpty)) {
-        sb.write('\nExpected collection should not contain: ');
-      }
-      for (let val of extraSet) {
-        sb.write(dart.str`${val} `);
-      }
-      expect.Expect._fail(sb.toString());
-    }
-    static deepEquals(expected, actual) {
-      if (dart.equals(expected, actual)) return;
-      if (typeof expected == 'string' && typeof actual == 'string') {
-        expect.Expect.stringEquals(expected, actual);
-      } else if (core.Iterable.is(expected) && core.Iterable.is(actual)) {
-        let expectedLength = expected[dartx.length];
-        let actualLength = actual[dartx.length];
-        let length = dart.notNull(expectedLength) < dart.notNull(actualLength) ? expectedLength : actualLength;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          expect.Expect.deepEquals(expected[dartx.elementAt](i), actual[dartx.elementAt](i));
-        }
-        if (expectedLength != actualLength) {
-          let nextElement = (dart.notNull(expectedLength) > dart.notNull(length) ? expected : actual)[dartx.elementAt](length);
-          expect.Expect._fail('Expect.deepEquals(list length, ' + dart.str`expected: <${expectedLength}>, actual: <${actualLength}>) ` + dart.str`fails: Next element <${nextElement}>`);
-        }
-      } else if (core.Map.is(expected) && core.Map.is(actual)) {
-        for (let key of expected[dartx.keys]) {
-          if (!dart.test(actual[dartx.containsKey](key))) {
-            expect.Expect._fail(dart.str`Expect.deepEquals(missing expected key: <${key}>) fails`);
-          }
-          expect.Expect.deepEquals(expected[dartx.get](key), actual[dartx.get](key));
-        }
-        for (let key of actual[dartx.keys]) {
-          if (!dart.test(expected[dartx.containsKey](key))) {
-            expect.Expect._fail(dart.str`Expect.deepEquals(unexpected key: <${key}>) fails`);
-          }
-        }
-      } else {
-        expect.Expect._fail(dart.str`Expect.deepEquals(expected: <${expected}>, actual: <${actual}>) ` + "fails.");
-      }
-    }
-    static throws(f, check, reason) {
-      if (check === void 0) check = null;
-      if (reason === void 0) reason = null;
-      let msg = reason == null ? "" : dart.str`(${reason})`;
-      if (!expect._Nullary.is(f)) {
-        expect.Expect._fail(dart.str`Expect.throws${msg}: Function f not callable with zero arguments`);
-      }
-      try {
-        f();
-      } catch (e) {
-        let s = dart.stackTrace(e);
-        if (check != null) {
-          if (!dart.test(dart.dcall(check, e))) {
-            expect.Expect._fail(dart.str`Expect.throws${msg}: Unexpected '${e}'\n${s}`);
-          }
-        }
-        return;
-      }
-
-      expect.Expect._fail(dart.str`Expect.throws${msg} fails: Did not throw`);
-    }
-    static _getMessage(reason) {
-      return reason == null ? "" : dart.str`, '${reason}'`;
-    }
-    static _fail(message) {
-      dart.throw(new expect.ExpectException(message));
-    }
-  };
-  dart.setSignature(expect.Expect, {
-    statics: () => ({
-      _truncateString: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.int]),
-      _stringDifference: dart.definiteFunctionType(core.String, [core.String, core.String]),
-      equals: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic], [core.String]),
-      isTrue: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
-      isFalse: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
-      isNull: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
-      isNotNull: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
-      identical: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic], [core.String]),
-      fail: dart.definiteFunctionType(dart.void, [core.String]),
-      approxEquals: dart.definiteFunctionType(dart.void, [core.num, core.num], [core.num, core.String]),
-      notEquals: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic], [core.String]),
-      listEquals: dart.definiteFunctionType(dart.void, [core.List, core.List], [core.String]),
-      mapEquals: dart.definiteFunctionType(dart.void, [core.Map, core.Map], [core.String]),
-      stringEquals: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
-      setEquals: dart.definiteFunctionType(dart.void, [core.Iterable, core.Iterable], [core.String]),
-      deepEquals: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
-      throws: dart.definiteFunctionType(dart.void, [VoidTovoid()], [expect._CheckExceptionFn, core.String]),
-      _getMessage: dart.definiteFunctionType(core.String, [core.String]),
-      _fail: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    names: ['_truncateString', '_stringDifference', 'equals', 'isTrue', 'isFalse', 'isNull', 'isNotNull', 'identical', 'fail', 'approxEquals', 'notEquals', 'listEquals', 'mapEquals', 'stringEquals', 'setEquals', 'deepEquals', 'throws', '_getMessage', '_fail']
-  });
-  expect._identical = function(a, b) {
-    return core.identical(a, b);
-  };
-  dart.fn(expect._identical, dynamicAnddynamicTobool());
-  expect._CheckExceptionFn = dart.typedef('_CheckExceptionFn', () => dart.functionType(core.bool, [dart.dynamic]));
-  expect._Nullary = dart.typedef('_Nullary', () => dart.functionType(dart.dynamic, []));
-  expect.ExpectException = class ExpectException extends core.Object {
-    new(message) {
-      this.message = message;
-    }
-    toString() {
-      return this.message;
-    }
-  };
-  expect.ExpectException[dart.implements] = () => [core.Exception];
-  dart.setSignature(expect.ExpectException, {
-    constructors: () => ({new: dart.definiteFunctionType(expect.ExpectException, [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  expect.NoInline = class NoInline extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(expect.NoInline, {
-    constructors: () => ({new: dart.definiteFunctionType(expect.NoInline, [])})
-  });
-  expect.TrustTypeAnnotations = class TrustTypeAnnotations extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(expect.TrustTypeAnnotations, {
-    constructors: () => ({new: dart.definiteFunctionType(expect.TrustTypeAnnotations, [])})
-  });
-  expect.AssumeDynamic = class AssumeDynamic extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(expect.AssumeDynamic, {
-    constructors: () => ({new: dart.definiteFunctionType(expect.AssumeDynamic, [])})
-  });
-  // Exports:
-  return {
-    expect: expect
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/identity_test.js b/pkg/dev_compiler/test/codegen_expected/identity_test.js
deleted file mode 100644
index bc77a8b..0000000
--- a/pkg/dev_compiler/test/codegen_expected/identity_test.js
+++ /dev/null
@@ -1,1158 +0,0 @@
-define(['dart_sdk', 'expect'], function(dart_sdk, expect) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const minitest = expect.minitest;
-  const _root = Object.create(null);
-  const identity_test = Object.create(_root);
-  const $_equals = dartx._equals;
-  const $_get = dartx._get;
-  let TToT = () => (TToT = dart.constFn(dart.gFnType(T => [T, [T]])))();
-  let VoidToT = () => (VoidToT = dart.constFn(dart.gFnType(T => [T, []])))();
-  let VoidToNull = () => (VoidToNull = dart.constFn(dart.fnType(core.Null, [])))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
-  identity_test.Music = class Music extends core.Object {
-    toString() {
-      return {
-        0: "Music.country",
-        1: "Music.western"
-      }[this.index];
-    }
-  };
-  (identity_test.Music.new = function(x) {
-    this.index = x;
-  }).prototype = identity_test.Music.prototype;
-  dart.addTypeTests(identity_test.Music);
-  dart.setFieldSignature(identity_test.Music, () => ({
-    __proto__: dart.getFields(identity_test.Music.__proto__),
-    index: dart.finalFieldType(core.int)
-  }));
-  dart.defineExtensionMethods(identity_test.Music, ['toString']);
-  identity_test.Music.country = dart.const(new identity_test.Music.new(0));
-  identity_test.Music.western = dart.const(new identity_test.Music.new(1));
-  identity_test.Music.values = dart.constList([identity_test.Music.country, identity_test.Music.western], identity_test.Music);
-  identity_test.BluesBrother = class BluesBrother extends core.Object {};
-  (identity_test.BluesBrother.new = function() {
-  }).prototype = identity_test.BluesBrother.prototype;
-  dart.addTypeTests(identity_test.BluesBrother);
-  identity_test._Jake = class _Jake extends identity_test.BluesBrother {};
-  (identity_test._Jake.new = function() {
-  }).prototype = identity_test._Jake.prototype;
-  dart.addTypeTests(identity_test._Jake);
-  identity_test._Elwood = class _Elwood extends identity_test.BluesBrother {
-    _equals(other) {
-      if (other == null) return false;
-      return identity_test._Elwood.is(other);
-    }
-  };
-  (identity_test._Elwood.new = function() {
-  }).prototype = identity_test._Elwood.prototype;
-  dart.addTypeTests(identity_test._Elwood);
-  dart.setMethodSignature(identity_test._Elwood, () => ({
-    __proto__: dart.getMethods(identity_test._Elwood.__proto__),
-    _equals: dart.fnType(core.bool, [core.Object]),
-    [$_equals]: dart.fnType(core.bool, [core.Object])
-  }));
-  dart.defineExtensionMethods(identity_test._Elwood, ['_equals']);
-  identity_test._Norman = class _Norman extends identity_test.BluesBrother {};
-  (identity_test._Norman.new = function() {
-  }).prototype = identity_test._Norman.prototype;
-  dart.addTypeTests(identity_test._Norman);
-  identity_test.hideNull = function(T, x) {
-    return x;
-  };
-  dart.fn(identity_test.hideNull, TToT());
-  identity_test.getUndefined = function(T) {
-    return T._check(core.List.new(1)[$_get](0));
-  };
-  dart.fn(identity_test.getUndefined, VoidToT());
-  identity_test.main = function() {
-    minitest.group('Enum identity', dart.fn(() => {
-      minitest.test('Identical enum/enum (nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(identity_test.Music, identity_test.Music.country);
-        let e2 = identity_test.hideNull(identity_test.Music, identity_test.Music.western);
-        let d1 = identity_test.hideNull(identity_test.Music, identity_test.Music.country);
-        let d2 = identity_test.hideNull(identity_test.Music, identity_test.Music.western);
-        let o1 = identity_test.hideNull(core.Object, identity_test.Music.country);
-        let o2 = identity_test.hideNull(core.Object, identity_test.Music.western);
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(d1, e1), true);
-        minitest.expect(core.identical(d1, d1), true);
-        minitest.expect(core.identical(d1, o1), true);
-        minitest.expect(core.identical(d1, e2), false);
-        minitest.expect(core.identical(d1, d2), false);
-        minitest.expect(core.identical(d1, o2), false);
-        minitest.expect(core.identical(o1, e1), true);
-        minitest.expect(core.identical(o1, d1), true);
-        minitest.expect(core.identical(o1, o1), true);
-        minitest.expect(core.identical(o1, e2), false);
-        minitest.expect(core.identical(o1, d2), false);
-        minitest.expect(core.identical(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Identical enum/enum (non-null)', dart.fn(() => {
-        let e1 = identity_test.Music.country;
-        let e2 = identity_test.Music.western;
-        let d1 = identity_test.Music.country;
-        let d2 = identity_test.Music.western;
-        let o1 = identity_test.Music.country;
-        let o2 = identity_test.Music.western;
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1 === e1, true);
-        minitest.expect(d1 === d1, true);
-        minitest.expect(d1 === o1, true);
-        minitest.expect(d1 === e2, false);
-        minitest.expect(d1 === d2, false);
-        minitest.expect(d1 === o2, false);
-        minitest.expect(o1 === e1, true);
-        minitest.expect(o1 === d1, true);
-        minitest.expect(o1 === o1, true);
-        minitest.expect(o1 === e2, false);
-        minitest.expect(o1 === d2, false);
-        minitest.expect(o1 === o2, false);
-      }, VoidToNull()));
-      minitest.test('Identical enum/other (static, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(identity_test.Music, identity_test.Music.country);
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test.BluesBrother, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(e1 == l1, false);
-        minitest.expect(e1 == b1, false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(l1 == e1, false);
-        minitest.expect(b1 == e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical enum/other (static, non-null)', dart.fn(() => {
-        let e1 = identity_test.Music.country;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical enum/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(identity_test.Music, identity_test.Music.country);
-        let d1 = identity_test.hideNull(identity_test.Music, identity_test.Music.country);
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test._Norman, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-        minitest.expect(core.identical(d1, s1), false);
-        minitest.expect(core.identical(d1, s2), false);
-        minitest.expect(core.identical(d1, i1), false);
-        minitest.expect(core.identical(d1, i2), false);
-        minitest.expect(core.identical(d1, l1), false);
-        minitest.expect(core.identical(d1, b1), false);
-        minitest.expect(core.identical(s1, d1), false);
-        minitest.expect(core.identical(s2, d1), false);
-        minitest.expect(core.identical(i1, d1), false);
-        minitest.expect(core.identical(i2, d1), false);
-        minitest.expect(core.identical(l1, d1), false);
-        minitest.expect(core.identical(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Identical enum/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = identity_test.Music.country;
-        let d1 = identity_test.Music.country;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-        minitest.expect(d1 === s1, false);
-        minitest.expect(d1 === s2, false);
-        minitest.expect(d1 === i1, false);
-        minitest.expect(d1 === i2, false);
-        minitest.expect(d1 === l1, false);
-        minitest.expect(d1 === b1, false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1 === d1, false);
-        minitest.expect(b1 === d1, false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('String identity', dart.fn(() => {
-      minitest.test('Identical string/string (nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.String, "The");
-        let e2 = identity_test.hideNull(core.String, "Band");
-        let d1 = identity_test.hideNull(core.String, "The");
-        let d2 = identity_test.hideNull(core.String, "Band");
-        let o1 = identity_test.hideNull(core.Object, "The");
-        let o2 = identity_test.hideNull(core.Object, "Band");
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(d1, e1), true);
-        minitest.expect(core.identical(d1, d1), true);
-        minitest.expect(core.identical(d1, o1), true);
-        minitest.expect(core.identical(d1, e2), false);
-        minitest.expect(core.identical(d1, d2), false);
-        minitest.expect(core.identical(d1, o2), false);
-        minitest.expect(core.identical(o1, e1), true);
-        minitest.expect(core.identical(o1, d1), true);
-        minitest.expect(core.identical(o1, o1), true);
-        minitest.expect(core.identical(o1, e2), false);
-        minitest.expect(core.identical(o1, d2), false);
-        minitest.expect(core.identical(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Identical string/string (non-null)', dart.fn(() => {
-        let e1 = "The";
-        let e2 = "Band";
-        let d1 = "The";
-        let d2 = "Band";
-        let o1 = "The";
-        let o2 = "Band";
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1 === e1, true);
-        minitest.expect(d1 === d1, true);
-        minitest.expect(d1 === o1, true);
-        minitest.expect(d1 === e2, false);
-        minitest.expect(d1 === d2, false);
-        minitest.expect(d1 === o2, false);
-        minitest.expect(o1 === e1, true);
-        minitest.expect(o1 === d1, true);
-        minitest.expect(o1 === o1, true);
-        minitest.expect(o1 === e2, false);
-        minitest.expect(o1 === d2, false);
-        minitest.expect(o1 === o2, false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (static, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.String, "The");
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test.BluesBrother, new identity_test._Norman.new());
-        minitest.expect(e1 == s1, false);
-        minitest.expect(e1 == s2, false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(s1 == e1, false);
-        minitest.expect(s2 == e1, false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (static, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.String, "The");
-        let d1 = identity_test.hideNull(core.String, "The");
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test._Norman, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-        minitest.expect(core.identical(d1, s1), false);
-        minitest.expect(core.identical(d1, s2), false);
-        minitest.expect(core.identical(d1, i1), false);
-        minitest.expect(core.identical(d1, i2), false);
-        minitest.expect(core.identical(d1, l1), false);
-        minitest.expect(core.identical(d1, b1), false);
-        minitest.expect(core.identical(s1, d1), false);
-        minitest.expect(core.identical(s2, d1), false);
-        minitest.expect(core.identical(i1, d1), false);
-        minitest.expect(core.identical(i2, d1), false);
-        minitest.expect(core.identical(l1, d1), false);
-        minitest.expect(core.identical(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let d1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-        minitest.expect(d1 === s1, false);
-        minitest.expect(d1 === s2, false);
-        minitest.expect(d1 === i1, false);
-        minitest.expect(d1 === i2, false);
-        minitest.expect(d1 === l1, false);
-        minitest.expect(d1 === b1, false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1 === d1, false);
-        minitest.expect(b1 === d1, false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Boolean identity', dart.fn(() => {
-      minitest.test('Identical bool/bool (nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.bool, true);
-        let e2 = identity_test.hideNull(core.bool, false);
-        let d1 = identity_test.hideNull(core.bool, true);
-        let d2 = identity_test.hideNull(core.bool, false);
-        let o1 = identity_test.hideNull(core.Object, true);
-        let o2 = identity_test.hideNull(core.Object, false);
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(d1, e1), true);
-        minitest.expect(core.identical(d1, d1), true);
-        minitest.expect(core.identical(d1, o1), true);
-        minitest.expect(core.identical(d1, e2), false);
-        minitest.expect(core.identical(d1, d2), false);
-        minitest.expect(core.identical(d1, o2), false);
-        minitest.expect(core.identical(o1, e1), true);
-        minitest.expect(core.identical(o1, d1), true);
-        minitest.expect(core.identical(o1, o1), true);
-        minitest.expect(core.identical(o1, e2), false);
-        minitest.expect(core.identical(o1, d2), false);
-        minitest.expect(core.identical(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Identical bool/bool (non-null)', dart.fn(() => {
-        let e1 = true;
-        let e2 = false;
-        let d1 = true;
-        let d2 = false;
-        let o1 = true;
-        let o2 = false;
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1 === e1, true);
-        minitest.expect(d1 === d1, true);
-        minitest.expect(d1 === o1, true);
-        minitest.expect(d1 === e2, false);
-        minitest.expect(d1 === d2, false);
-        minitest.expect(d1 === o2, false);
-        minitest.expect(o1 === e1, true);
-        minitest.expect(o1 === d1, true);
-        minitest.expect(o1 === o1, true);
-        minitest.expect(o1 === e2, false);
-        minitest.expect(o1 === d2, false);
-        minitest.expect(o1 === o2, false);
-      }, VoidToNull()));
-      minitest.test('Identical bool/other (static, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.bool, true);
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test.BluesBrother, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Identical bool/other (static, non-null)', dart.fn(() => {
-        let e1 = true;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical bool/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.bool, true);
-        let d1 = identity_test.hideNull(core.bool, true);
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test._Norman, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-        minitest.expect(core.identical(d1, s1), false);
-        minitest.expect(core.identical(d1, s2), false);
-        minitest.expect(core.identical(d1, i1), false);
-        minitest.expect(core.identical(d1, i2), false);
-        minitest.expect(core.identical(d1, l1), false);
-        minitest.expect(core.identical(d1, b1), false);
-        minitest.expect(core.identical(s1, d1), false);
-        minitest.expect(core.identical(s2, d1), false);
-        minitest.expect(core.identical(i1, d1), false);
-        minitest.expect(core.identical(i2, d1), false);
-        minitest.expect(core.identical(l1, d1), false);
-        minitest.expect(core.identical(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Identical bool/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = true;
-        let d1 = true;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-        minitest.expect(d1 === s1, false);
-        minitest.expect(d1 === s2, false);
-        minitest.expect(d1 === i1, false);
-        minitest.expect(d1 === i2, false);
-        minitest.expect(d1 === l1, false);
-        minitest.expect(d1 === b1, false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1 === d1, false);
-        minitest.expect(b1 === d1, false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('String identity', dart.fn(() => {
-      minitest.test('Identical string/string (nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.String, "The");
-        let e2 = identity_test.hideNull(core.String, "Band");
-        let d1 = identity_test.hideNull(core.String, "The");
-        let d2 = identity_test.hideNull(core.String, "Band");
-        let o1 = identity_test.hideNull(core.Object, "The");
-        let o2 = identity_test.hideNull(core.Object, "Band");
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(d1, e1), true);
-        minitest.expect(core.identical(d1, d1), true);
-        minitest.expect(core.identical(d1, o1), true);
-        minitest.expect(core.identical(d1, e2), false);
-        minitest.expect(core.identical(d1, d2), false);
-        minitest.expect(core.identical(d1, o2), false);
-        minitest.expect(core.identical(o1, e1), true);
-        minitest.expect(core.identical(o1, d1), true);
-        minitest.expect(core.identical(o1, o1), true);
-        minitest.expect(core.identical(o1, e2), false);
-        minitest.expect(core.identical(o1, d2), false);
-        minitest.expect(core.identical(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Identical string/string (non-null)', dart.fn(() => {
-        let e1 = "The";
-        let e2 = "Band";
-        let d1 = "The";
-        let d2 = "Band";
-        let o1 = "The";
-        let o2 = "Band";
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1 === e1, true);
-        minitest.expect(d1 === d1, true);
-        minitest.expect(d1 === o1, true);
-        minitest.expect(d1 === e2, false);
-        minitest.expect(d1 === d2, false);
-        minitest.expect(d1 === o2, false);
-        minitest.expect(o1 === e1, true);
-        minitest.expect(o1 === d1, true);
-        minitest.expect(o1 === o1, true);
-        minitest.expect(o1 === e2, false);
-        minitest.expect(o1 === d2, false);
-        minitest.expect(o1 === o2, false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (static, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.String, "The");
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test.BluesBrother, new identity_test._Norman.new());
-        minitest.expect(e1 == s1, false);
-        minitest.expect(e1 == s2, false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(s1 == e1, false);
-        minitest.expect(s2 == e1, false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (static, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.String, "The");
-        let d1 = identity_test.hideNull(core.String, "The");
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test._Norman, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-        minitest.expect(core.identical(d1, s1), false);
-        minitest.expect(core.identical(d1, s2), false);
-        minitest.expect(core.identical(d1, i1), false);
-        minitest.expect(core.identical(d1, i2), false);
-        minitest.expect(core.identical(d1, l1), false);
-        minitest.expect(core.identical(d1, b1), false);
-        minitest.expect(core.identical(s1, d1), false);
-        minitest.expect(core.identical(s2, d1), false);
-        minitest.expect(core.identical(i1, d1), false);
-        minitest.expect(core.identical(i2, d1), false);
-        minitest.expect(core.identical(l1, d1), false);
-        minitest.expect(core.identical(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Identical string/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = "The";
-        let d1 = "The";
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-        minitest.expect(d1 === s1, false);
-        minitest.expect(d1 === s2, false);
-        minitest.expect(d1 === i1, false);
-        minitest.expect(d1 === i2, false);
-        minitest.expect(d1 === l1, false);
-        minitest.expect(d1 === b1, false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1 === d1, false);
-        minitest.expect(b1 === d1, false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Number identity', dart.fn(() => {
-      minitest.test('Identical int/int (nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.int, 11);
-        let e2 = identity_test.hideNull(core.int, 12);
-        let d1 = identity_test.hideNull(core.int, 11);
-        let d2 = identity_test.hideNull(core.int, 12);
-        let o1 = identity_test.hideNull(core.Object, 11);
-        let o2 = identity_test.hideNull(core.Object, 12);
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(d1, e1), true);
-        minitest.expect(core.identical(d1, d1), true);
-        minitest.expect(core.identical(d1, o1), true);
-        minitest.expect(core.identical(d1, e2), false);
-        minitest.expect(core.identical(d1, d2), false);
-        minitest.expect(core.identical(d1, o2), false);
-        minitest.expect(core.identical(o1, e1), true);
-        minitest.expect(core.identical(o1, d1), true);
-        minitest.expect(core.identical(o1, o1), true);
-        minitest.expect(core.identical(o1, e2), false);
-        minitest.expect(core.identical(o1, d2), false);
-        minitest.expect(core.identical(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Identical int/int (non-null)', dart.fn(() => {
-        let e1 = 11;
-        let e2 = 12;
-        let d1 = 11;
-        let d2 = 12;
-        let o1 = 11;
-        let o2 = 12;
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1 === e1, true);
-        minitest.expect(d1 === d1, true);
-        minitest.expect(d1 === o1, true);
-        minitest.expect(d1 === e2, false);
-        minitest.expect(d1 === d2, false);
-        minitest.expect(d1 === o2, false);
-        minitest.expect(o1 === e1, true);
-        minitest.expect(o1 === d1, true);
-        minitest.expect(o1 === o1, true);
-        minitest.expect(o1 === e2, false);
-        minitest.expect(o1 === d2, false);
-        minitest.expect(o1 === o2, false);
-      }, VoidToNull()));
-      minitest.test('Identical int/other (static, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.int, 11);
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test.BluesBrother, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(e1 == i1, false);
-        minitest.expect(e1 == i2, false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(i1 == e1, false);
-        minitest.expect(i2 == e1, false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-      }, VoidToNull()));
-      minitest.test('Identical int/other (static, non-null)', dart.fn(() => {
-        let e1 = 11;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical int/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(core.int, 11);
-        let d1 = identity_test.hideNull(core.int, 11);
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test._Norman, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-        minitest.expect(core.identical(d1, s1), false);
-        minitest.expect(core.identical(d1, s2), false);
-        minitest.expect(core.identical(d1, i1), false);
-        minitest.expect(core.identical(d1, i2), false);
-        minitest.expect(core.identical(d1, l1), false);
-        minitest.expect(core.identical(d1, b1), false);
-        minitest.expect(core.identical(s1, d1), false);
-        minitest.expect(core.identical(s2, d1), false);
-        minitest.expect(core.identical(i1, d1), false);
-        minitest.expect(core.identical(i2, d1), false);
-        minitest.expect(core.identical(l1, d1), false);
-        minitest.expect(core.identical(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Identical int/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = 11;
-        let d1 = 11;
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-        minitest.expect(d1 === s1, false);
-        minitest.expect(d1 === s2, false);
-        minitest.expect(d1 === i1, false);
-        minitest.expect(d1 === i2, false);
-        minitest.expect(d1 === l1, false);
-        minitest.expect(d1 === b1, false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1 === d1, false);
-        minitest.expect(b1 === d1, false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Object identity', dart.fn(() => {
-      minitest.test('Identical object/object (nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(identity_test._Jake, new identity_test._Jake.new());
-        let e2 = identity_test.hideNull(identity_test._Elwood, new identity_test._Elwood.new());
-        let d1 = identity_test.hideNull(identity_test._Jake, e1);
-        let d2 = identity_test.hideNull(identity_test._Elwood, new identity_test._Elwood.new());
-        let o1 = identity_test.hideNull(core.Object, e1);
-        let o2 = identity_test.hideNull(core.Object, new identity_test._Elwood.new());
-        minitest.expect(e1 == e1, true);
-        minitest.expect(core.identical(e1, d1), true);
-        minitest.expect(core.identical(e1, o1), true);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(e1, o2), false);
-        minitest.expect(core.identical(e1, d2), false);
-        minitest.expect(e1 == e2, false);
-        minitest.expect(core.identical(d1, e1), true);
-        minitest.expect(core.identical(d1, d1), true);
-        minitest.expect(core.identical(d1, o1), true);
-        minitest.expect(core.identical(d1, e2), false);
-        minitest.expect(core.identical(d1, d2), false);
-        minitest.expect(core.identical(d1, o2), false);
-        minitest.expect(core.identical(o1, e1), true);
-        minitest.expect(core.identical(o1, d1), true);
-        minitest.expect(core.identical(o1, o1), true);
-        minitest.expect(core.identical(o1, e2), false);
-        minitest.expect(core.identical(o1, d2), false);
-        minitest.expect(core.identical(o1, o2), false);
-      }, VoidToNull()));
-      minitest.test('Identical object/object (non-null)', dart.fn(() => {
-        let e1 = new identity_test._Jake.new();
-        let e2 = new identity_test._Elwood.new();
-        let d1 = e1;
-        let d2 = new identity_test._Elwood.new();
-        let o1 = e1;
-        let o2 = new identity_test._Elwood.new();
-        minitest.expect(e1 === e1, true);
-        minitest.expect(e1 === d1, true);
-        minitest.expect(e1 === o1, true);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(e1 === o2, false);
-        minitest.expect(e1 === d2, false);
-        minitest.expect(e1 === e2, false);
-        minitest.expect(d1 === e1, true);
-        minitest.expect(d1 === d1, true);
-        minitest.expect(d1 === o1, true);
-        minitest.expect(d1 === e2, false);
-        minitest.expect(d1 === d2, false);
-        minitest.expect(d1 === o2, false);
-        minitest.expect(o1 === e1, true);
-        minitest.expect(o1 === d1, true);
-        minitest.expect(o1 === o1, true);
-        minitest.expect(o1 === e2, false);
-        minitest.expect(o1 === d2, false);
-        minitest.expect(o1 === o2, false);
-      }, VoidToNull()));
-      minitest.test('Identical object/other (static, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(identity_test._Jake, new identity_test._Jake.new());
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test.BluesBrother, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(e1 == l1, false);
-        minitest.expect(e1 == b1, false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(l1 == e1, false);
-        minitest.expect(b1 == e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical object/other (static, non-null)', dart.fn(() => {
-        let e1 = new identity_test._Jake.new();
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-      }, VoidToNull()));
-      minitest.test('Identical object/other (dynamic, nullable)', dart.fn(() => {
-        let e1 = identity_test.hideNull(identity_test._Jake, new identity_test._Jake.new());
-        let d1 = identity_test.hideNull(identity_test._Jake, new identity_test._Jake.new());
-        let s1 = identity_test.hideNull(core.String, "hello");
-        let s2 = identity_test.hideNull(core.String, "");
-        let i1 = identity_test.hideNull(core.int, 3);
-        let i2 = identity_test.hideNull(core.int, 0);
-        let l1 = identity_test.hideNull(core.List, core.List.new(3));
-        let b1 = identity_test.hideNull(identity_test._Norman, new identity_test._Norman.new());
-        minitest.expect(core.identical(e1, s1), false);
-        minitest.expect(core.identical(e1, s2), false);
-        minitest.expect(core.identical(e1, i1), false);
-        minitest.expect(core.identical(e1, i2), false);
-        minitest.expect(core.identical(e1, l1), false);
-        minitest.expect(core.identical(e1, b1), false);
-        minitest.expect(core.identical(s1, e1), false);
-        minitest.expect(core.identical(s2, e1), false);
-        minitest.expect(core.identical(i1, e1), false);
-        minitest.expect(core.identical(i2, e1), false);
-        minitest.expect(core.identical(l1, e1), false);
-        minitest.expect(core.identical(b1, e1), false);
-        minitest.expect(core.identical(d1, s1), false);
-        minitest.expect(core.identical(d1, s2), false);
-        minitest.expect(core.identical(d1, i1), false);
-        minitest.expect(core.identical(d1, i2), false);
-        minitest.expect(core.identical(d1, l1), false);
-        minitest.expect(core.identical(d1, b1), false);
-        minitest.expect(core.identical(s1, d1), false);
-        minitest.expect(core.identical(s2, d1), false);
-        minitest.expect(core.identical(i1, d1), false);
-        minitest.expect(core.identical(i2, d1), false);
-        minitest.expect(core.identical(l1, d1), false);
-        minitest.expect(core.identical(b1, d1), false);
-      }, VoidToNull()));
-      minitest.test('Identical object/other (dynamic, non-null)', dart.fn(() => {
-        let e1 = new identity_test._Jake.new();
-        let d1 = new identity_test._Jake.new();
-        let s1 = "hello";
-        let s2 = "";
-        let i1 = 3;
-        let i2 = 0;
-        let l1 = core.List.new(3);
-        let b1 = new identity_test._Norman.new();
-        minitest.expect(e1 === s1, false);
-        minitest.expect(e1 === s2, false);
-        minitest.expect(e1 === i1, false);
-        minitest.expect(e1 === i2, false);
-        minitest.expect(e1 === l1, false);
-        minitest.expect(e1 === b1, false);
-        minitest.expect(s1 === e1, false);
-        minitest.expect(s2 === e1, false);
-        minitest.expect(i1 === e1, false);
-        minitest.expect(i2 === e1, false);
-        minitest.expect(l1 === e1, false);
-        minitest.expect(b1 === e1, false);
-        minitest.expect(d1 === s1, false);
-        minitest.expect(d1 === s2, false);
-        minitest.expect(d1 === i1, false);
-        minitest.expect(d1 === i2, false);
-        minitest.expect(d1 === l1, false);
-        minitest.expect(d1 === b1, false);
-        minitest.expect(s1 === d1, false);
-        minitest.expect(s2 === d1, false);
-        minitest.expect(i1 === d1, false);
-        minitest.expect(i2 === d1, false);
-        minitest.expect(l1 === d1, false);
-        minitest.expect(b1 === d1, false);
-      }, VoidToNull()));
-    }, VoidToNull()));
-    minitest.group('Null/undefined identity', dart.fn(() => {
-      minitest.test('Identical object/other (static, null)', dart.fn(() => {
-        let n = identity_test.hideNull(identity_test.BluesBrother, null);
-        let u1 = identity_test.getUndefined(core.String);
-        let u2 = identity_test.getUndefined(core.int);
-        let u3 = identity_test.getUndefined(core.bool);
-        let u4 = identity_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(n == u4, true);
-        minitest.expect(core.identical(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(u4 == n, true);
-      }, VoidToNull()));
-      minitest.test('Identical String/other (static, null)', dart.fn(() => {
-        let u1 = identity_test.getUndefined(identity_test.BluesBrother);
-        let n = identity_test.hideNull(core.String, null);
-        let u2 = identity_test.getUndefined(core.int);
-        let u3 = identity_test.getUndefined(core.bool);
-        let u4 = identity_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(core.identical(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(core.identical(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Identical int/other (static, null)', dart.fn(() => {
-        let u1 = identity_test.getUndefined(identity_test.BluesBrother);
-        let u2 = identity_test.getUndefined(core.String);
-        let n = identity_test.hideNull(core.int, null);
-        let u3 = identity_test.getUndefined(core.bool);
-        let u4 = identity_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(core.identical(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(core.identical(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Identical bool/other (static, null)', dart.fn(() => {
-        let u1 = identity_test.getUndefined(identity_test.BluesBrother);
-        let u2 = identity_test.getUndefined(core.String);
-        let u3 = identity_test.getUndefined(core.int);
-        let n = identity_test.hideNull(core.bool, null);
-        let u4 = identity_test.getUndefined(core.List);
-        minitest.expect(n == n, true);
-        minitest.expect(core.identical(n, u1), true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(core.identical(u1, n), true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(core.identical(u4, n), true);
-      }, VoidToNull()));
-      minitest.test('Identical List/other (static, null)', dart.fn(() => {
-        let u1 = identity_test.getUndefined(identity_test.BluesBrother);
-        let u2 = identity_test.getUndefined(core.String);
-        let u3 = identity_test.getUndefined(core.int);
-        let u4 = identity_test.getUndefined(core.bool);
-        let n = identity_test.hideNull(core.List, null);
-        minitest.expect(n == n, true);
-        minitest.expect(n == u1, true);
-        minitest.expect(core.identical(n, u2), true);
-        minitest.expect(core.identical(n, u3), true);
-        minitest.expect(core.identical(n, u4), true);
-        minitest.expect(u1 == n, true);
-        minitest.expect(core.identical(u2, n), true);
-        minitest.expect(core.identical(u3, n), true);
-        minitest.expect(core.identical(u4, n), true);
-      }, VoidToNull()));
-    }, VoidToNull()));
-  };
-  dart.fn(identity_test.main, VoidTodynamic());
-  dart.trackLibraries("identity_test", {
-    "identity_test.dart": identity_test
-  }, null);
-  // Exports:
-  return {
-    identity_test: identity_test
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/map_keys.js b/pkg/dev_compiler/test/codegen_expected/map_keys.js
deleted file mode 100644
index 1e4b655..0000000
--- a/pkg/dev_compiler/test/codegen_expected/map_keys.js
+++ /dev/null
@@ -1,31 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const _js_helper = dart_sdk._js_helper;
-  const math = dart_sdk.math;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const map_keys = Object.create(_root);
-  let IdentityMapOfString$int = () => (IdentityMapOfString$int = dart.constFn(_js_helper.IdentityMap$(core.String, core.int)))();
-  let IdentityMapOfint$int = () => (IdentityMapOfint$int = dart.constFn(_js_helper.IdentityMap$(core.int, core.int)))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
-  map_keys.main = function() {
-    core.print(new (IdentityMapOfString$int()).from(['1', 2, '3', 4, '5', 6]));
-    core.print(new (IdentityMapOfint$int()).from([1, 2, 3, 4, 5, 6]));
-    core.print(new (IdentityMapOfString$int()).from(['1', 2, dart.str`${dart.notNull(math.Random.new().nextInt(2)) + 2}`, 4, '5', 6]));
-    let x = '3';
-    core.print(new (IdentityMapOfString$int()).from(['1', 2, x, 4, '5', 6]));
-    core.print(new (IdentityMapOfString$int()).from(['1', 2, null, 4, '5', 6]));
-  };
-  dart.fn(map_keys.main, VoidTodynamic());
-  dart.trackLibraries("map_keys", {
-    "map_keys.dart": map_keys
-  }, null);
-  // Exports:
-  return {
-    map_keys: map_keys
-  };
-});
-
-//# sourceMappingURL=map_keys.js.map
diff --git a/pkg/dev_compiler/test/codegen_expected/map_keys.js.map b/pkg/dev_compiler/test/codegen_expected/map_keys.js.map
deleted file mode 100644
index 149356b..0000000
--- a/pkg/dev_compiler/test/codegen_expected/map_keys.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sourceRoot":"","sources":["../../gen/codegen_tests/map_keys.dart"],"names":["print","x"],"mappings":";;;;;;;;;;;;kBAMI,WAAG;AAEL,IAAA,AAAAA,UAAK,CAAC,sCAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;AACjC,AACE,IAAA,AAAAA,UAAK,CAAC,mCAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC;AAC3B,AACE,IAAA,AAAAA,UAAK,CAAC,sCAAC,GAAG,EAAE,CAAC,EAAE,WAAC,aAAE,AAAA,iBAAY,SAAS,CAAC,CAAC,IAAG,CAAC,AAAC,EAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;AAC9D,AAAE,YAAW,GAAG;AAChB,AACE,IAAAA,AAAA,UAAK,CAAC,sCAAC,GAAG,EAAE,CAAC,EAAEC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;AAC/B,AACE,IAAA,AAAAD,UAAK,CAAC,sCAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;AAClC,GACA,AAAA","file":"map_keys.js"}
\ No newline at end of file
diff --git a/pkg/dev_compiler/test/codegen_expected/minitest.js b/pkg/dev_compiler/test/codegen_expected/minitest.js
deleted file mode 100644
index f251c5e..0000000
--- a/pkg/dev_compiler/test/codegen_expected/minitest.js
+++ /dev/null
@@ -1,229 +0,0 @@
-define(['dart_sdk', 'expect'], function(dart_sdk, expect) {
-  'use strict';
-  const core = dart_sdk.core;
-  const _interceptors = dart_sdk._interceptors;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const expect$ = expect.expect;
-  const minitest = Object.create(null);
-  let JSArrayOf_Group = () => (JSArrayOf_Group = dart.constFn(_interceptors.JSArray$(minitest._Group)))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.functionType(dart.dynamic, [])))();
-  let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.functionType(core.bool, [core.Object])))();
-  let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
-  let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
-  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
-  let StringAndFnTovoid = () => (StringAndFnTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, VoidTodynamic()])))();
-  let FnTovoid = () => (FnTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [VoidTodynamic()])))();
-  let ObjectAndObject__Tovoid = () => (ObjectAndObject__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.Object], {reason: core.String})))();
-  let StringTovoid = () => (StringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
-  let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
-  let Fn__ToObject = () => (Fn__ToObject = dart.constFn(dart.definiteFunctionType(core.Object, [ObjectTobool()], [core.String])))();
-  let numAndnumToObject = () => (numAndnumToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.num, core.num])))();
-  let numToObject = () => (numToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.num])))();
-  minitest._Action = dart.typedef('_Action', () => dart.functionType(dart.void, []));
-  minitest._ExpectationFunction = dart.typedef('_ExpectationFunction', () => dart.functionType(dart.void, [core.Object]));
-  dart.defineLazy(minitest, {
-    get _groups() {
-      return JSArrayOf_Group().of([new minitest._Group()]);
-    }
-  });
-  dart.defineLazy(minitest, {
-    get isFalse() {
-      return new minitest._Expectation(expect$.Expect.isFalse);
-    }
-  });
-  dart.defineLazy(minitest, {
-    get isNotNull() {
-      return new minitest._Expectation(expect$.Expect.isNotNull);
-    }
-  });
-  dart.defineLazy(minitest, {
-    get isNull() {
-      return new minitest._Expectation(expect$.Expect.isNull);
-    }
-  });
-  dart.defineLazy(minitest, {
-    get isTrue() {
-      return new minitest._Expectation(expect$.Expect.isTrue);
-    }
-  });
-  dart.defineLazy(minitest, {
-    get returnsNormally() {
-      return new minitest._Expectation(dart.fn(actual => {
-        try {
-          minitest._Action.as(actual)();
-        } catch (error) {
-          expect$.Expect.fail(dart.str`Expected function to return normally, but threw:\n${error}`);
-        }
-
-      }, ObjectTovoid()));
-    }
-  });
-  dart.defineLazy(minitest, {
-    get throws() {
-      return new minitest._Expectation(dart.fn(actual => {
-        expect$.Expect.throws(minitest._Action.as(actual));
-      }, ObjectTovoid()));
-    }
-  });
-  dart.defineLazy(minitest, {
-    get throwsArgumentError() {
-      return new minitest._Expectation(dart.fn(actual => {
-        expect$.Expect.throws(minitest._Action.as(actual), dart.fn(error => core.ArgumentError.is(error), dynamicTobool()));
-      }, ObjectTovoid()));
-    }
-  });
-  dart.defineLazy(minitest, {
-    get throwsNoSuchMethodError() {
-      return new minitest._Expectation(dart.fn(actual => {
-        expect$.Expect.throws(minitest._Action.as(actual), dart.fn(error => core.NoSuchMethodError.is(error), dynamicTobool()));
-      }, ObjectTovoid()));
-    }
-  });
-  dart.defineLazy(minitest, {
-    get throwsRangeError() {
-      return new minitest._Expectation(dart.fn(actual => {
-        expect$.Expect.throws(minitest._Action.as(actual), dart.fn(error => core.RangeError.is(error), dynamicTobool()));
-      }, ObjectTovoid()));
-    }
-  });
-  dart.defineLazy(minitest, {
-    get throwsStateError() {
-      return new minitest._Expectation(dart.fn(actual => {
-        expect$.Expect.throws(minitest._Action.as(actual), dart.fn(error => core.StateError.is(error), dynamicTobool()));
-      }, ObjectTovoid()));
-    }
-  });
-  dart.defineLazy(minitest, {
-    get throwsUnsupportedError() {
-      return new minitest._Expectation(dart.fn(actual => {
-        expect$.Expect.throws(minitest._Action.as(actual), dart.fn(error => core.UnsupportedError.is(error), dynamicTobool()));
-      }, ObjectTovoid()));
-    }
-  });
-  minitest.finishTests = function() {
-    minitest._groups[dartx.clear]();
-    minitest._groups[dartx.add](new minitest._Group());
-  };
-  dart.fn(minitest.finishTests, VoidTovoid());
-  minitest.group = function(description, body) {
-    minitest._groups[dartx.add](new minitest._Group());
-    try {
-      body();
-    } finally {
-      minitest._groups[dartx.removeLast]();
-    }
-  };
-  dart.fn(minitest.group, StringAndFnTovoid());
-  minitest.test = function(description, body) {
-    for (let group of minitest._groups) {
-      if (group.setUpFunction != null) group.setUpFunction();
-    }
-    try {
-      body();
-    } finally {
-      for (let i = dart.notNull(minitest._groups[dartx.length]) - 1; i >= 0; i--) {
-        let group = minitest._groups[dartx.get](i);
-        if (group.tearDownFunction != null) group.tearDownFunction();
-      }
-    }
-  };
-  dart.fn(minitest.test, StringAndFnTovoid());
-  minitest.setUp = function(body) {
-    dart.assert(minitest._groups[dartx.last].setUpFunction == null);
-    minitest._groups[dartx.last].setUpFunction = body;
-  };
-  dart.fn(minitest.setUp, FnTovoid());
-  minitest.tearDown = function(body) {
-    dart.assert(minitest._groups[dartx.last].tearDownFunction == null);
-    minitest._groups[dartx.last].tearDownFunction = body;
-  };
-  dart.fn(minitest.tearDown, FnTovoid());
-  minitest.expect = function(actual, expected, opts) {
-    let reason = opts && 'reason' in opts ? opts.reason : null;
-    if (!minitest._Expectation.is(expected)) {
-      expected = minitest.equals(expected);
-    }
-    let expectation = minitest._Expectation.as(expected);
-    expectation.function(actual);
-  };
-  dart.fn(minitest.expect, ObjectAndObject__Tovoid());
-  minitest.fail = function(message) {
-    expect$.Expect.fail(message);
-  };
-  dart.fn(minitest.fail, StringTovoid());
-  minitest.equals = function(value) {
-    return new minitest._Expectation(dart.fn(actual => {
-      expect$.Expect.deepEquals(value, actual);
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.equals, ObjectToObject());
-  minitest.notEquals = function(value) {
-    return new minitest._Expectation(dart.fn(actual => {
-      expect$.Expect.notEquals(value, actual);
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.notEquals, ObjectToObject());
-  minitest.unorderedEquals = function(value) {
-    return new minitest._Expectation(dart.fn(actual => {
-      expect$.Expect.setEquals(core.Iterable._check(value), core.Iterable._check(actual));
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.unorderedEquals, ObjectToObject());
-  minitest.predicate = function(fn, description) {
-    if (description === void 0) description = null;
-    return new minitest._Expectation(dart.fn(actual => {
-      expect$.Expect.isTrue(fn(actual));
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.predicate, Fn__ToObject());
-  minitest.inInclusiveRange = function(min, max) {
-    return new minitest._Expectation(dart.fn(actual => {
-      let actualNum = core.num.as(actual);
-      if (dart.notNull(actualNum) < dart.notNull(min) || dart.notNull(actualNum) > dart.notNull(max)) {
-        minitest.fail(dart.str`Expected ${actualNum} to be in the inclusive range [${min}, ${max}].`);
-      }
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.inInclusiveRange, numAndnumToObject());
-  minitest.greaterThan = function(value) {
-    return new minitest._Expectation(dart.fn(actual => {
-      let actualNum = core.num.as(actual);
-      if (dart.notNull(actualNum) <= dart.notNull(value)) {
-        minitest.fail(dart.str`Expected ${actualNum} to be greater than ${value}.`);
-      }
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.greaterThan, numToObject());
-  minitest.same = function(value) {
-    return new minitest._Expectation(dart.fn(actual => {
-      expect$.Expect.identical(value, actual);
-    }, ObjectTovoid()));
-  };
-  dart.fn(minitest.same, ObjectToObject());
-  minitest._Group = class _Group extends core.Object {
-    new() {
-      this.setUpFunction = null;
-      this.tearDownFunction = null;
-    }
-  };
-  dart.setSignature(minitest._Group, {
-    fields: () => ({
-      setUpFunction: minitest._Action,
-      tearDownFunction: minitest._Action
-    })
-  });
-  minitest._Expectation = class _Expectation extends core.Object {
-    new(func) {
-      this.function = func;
-    }
-  };
-  dart.setSignature(minitest._Expectation, {
-    constructors: () => ({new: dart.definiteFunctionType(minitest._Expectation, [minitest._ExpectationFunction])}),
-    fields: () => ({function: minitest._ExpectationFunction})
-  });
-  // Exports:
-  return {
-    minitest: minitest
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/node_modules.js b/pkg/dev_compiler/test/codegen_expected/node_modules.js
deleted file mode 100644
index 9b4c57e..0000000
--- a/pkg/dev_compiler/test/codegen_expected/node_modules.js
+++ /dev/null
@@ -1,78 +0,0 @@
-'use strict';
-const dart_sdk = require('dart_sdk');
-const core = dart_sdk.core;
-const dart = dart_sdk.dart;
-const dartx = dart_sdk.dartx;
-const _root = Object.create(null);
-const node_modules = Object.create(_root);
-let B = () => (B = dart.constFn(node_modules.B$()))();
-let _B = () => (_B = dart.constFn(node_modules._B$()))();
-let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
-let VoidToString = () => (VoidToString = dart.constFn(dart.fnType(core.String, [])))();
-node_modules.Callback = dart.typedef('Callback', () => dart.fnTypeFuzzy(dart.void, [], {i: core.int}));
-node_modules.A = class A extends core.Object {};
-(node_modules.A.new = function() {
-}).prototype = node_modules.A.prototype;
-dart.addTypeTests(node_modules.A);
-node_modules._A = class _A extends core.Object {};
-(node_modules._A.new = function() {
-}).prototype = node_modules._A.prototype;
-dart.addTypeTests(node_modules._A);
-const _is_B_default = Symbol('_is_B_default');
-node_modules.B$ = dart.generic(T => {
-  class B extends core.Object {}
-  (B.new = function() {
-  }).prototype = B.prototype;
-  dart.addTypeTests(B);
-  B.prototype[_is_B_default] = true;
-  return B;
-});
-node_modules.B = B();
-dart.addTypeTests(node_modules.B, _is_B_default);
-const _is__B_default = Symbol('_is__B_default');
-node_modules._B$ = dart.generic(T => {
-  class _B extends core.Object {}
-  (_B.new = function() {
-  }).prototype = _B.prototype;
-  dart.addTypeTests(_B);
-  _B.prototype[_is__B_default] = true;
-  return _B;
-});
-node_modules._B = _B();
-dart.addTypeTests(node_modules._B, _is__B_default);
-node_modules.f = function() {
-};
-dart.fn(node_modules.f, VoidTodynamic());
-node_modules._f = function() {
-};
-dart.fn(node_modules._f, VoidTodynamic());
-dart.defineLazy(node_modules, {
-  get constant() {
-    return "abc";
-  },
-  get finalConstant() {
-    return "abc";
-  },
-  get lazy() {
-    return dart.fn(() => {
-      core.print('lazy');
-      return "abc";
-    }, VoidToString())();
-  },
-  get mutable() {
-    return "abc";
-  },
-  set mutable(_) {},
-  get lazyMutable() {
-    return dart.fn(() => {
-      core.print('lazyMutable');
-      return "abc";
-    }, VoidToString())();
-  },
-  set lazyMutable(_) {}
-});
-dart.trackLibraries("node_modules", {
-  "node_modules.dart": node_modules
-}, null);
-// Exports:
-exports.node_modules = node_modules;
diff --git a/pkg/dev_compiler/test/codegen_expected/script.js b/pkg/dev_compiler/test/codegen_expected/script.js
deleted file mode 100644
index f8541f7..0000000
--- a/pkg/dev_compiler/test/codegen_expected/script.js
+++ /dev/null
@@ -1,24 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const script = Object.create(_root);
-  const $join = dartx.join;
-  let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
-  let ListOfStringTovoid = () => (ListOfStringTovoid = dart.constFn(dart.fnType(dart.void, [ListOfString()])))();
-  script.main = function(args) {
-    let name = args[$join](' ');
-    if (name === '') name = 'world';
-    core.print(dart.str`hello ${name}`);
-  };
-  dart.fn(script.main, ListOfStringTovoid());
-  dart.trackLibraries("script", {
-    "script.dart": script
-  }, null);
-  // Exports:
-  return {
-    script: script
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js b/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js
deleted file mode 100644
index ed69422..0000000
--- a/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js
+++ /dev/null
@@ -1,193 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const html = dart_sdk.html;
-  const math = dart_sdk.math;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const sunflower = Object.create(_root);
-  const circle = Object.create(_root);
-  const painter = Object.create(_root);
-  const $getContext = dartx.getContext;
-  const $addEventListener = dartx.addEventListener;
-  const $text = dartx.text;
-  const $arc = dartx.arc;
-  const $fill = dartx.fill;
-  let StringToElement = () => (StringToElement = dart.constFn(dart.fnType(html.Element, [core.String])))();
-  let EventTovoid = () => (EventTovoid = dart.constFn(dart.fnType(dart.void, [html.Event])))();
-  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.fnType(dart.void, [])))();
-  dart.defineLazy(sunflower, {
-    get SEED_RADIUS() {
-      return 2;
-    },
-    get SCALE_FACTOR() {
-      return 4;
-    },
-    get MAX_D() {
-      return 300;
-    },
-    get centerX() {
-      return 300 / 2;
-    },
-    get centerY() {
-      return sunflower.centerX;
-    }
-  });
-  sunflower.querySelector = function(selector) {
-    return html.document.querySelector(selector);
-  };
-  dart.fn(sunflower.querySelector, StringToElement());
-  dart.defineLazy(sunflower, {
-    get canvas() {
-      return html.CanvasElement.as(sunflower.querySelector("#canvas"));
-    },
-    get context() {
-      return html.CanvasRenderingContext2D.as(sunflower.canvas[$getContext]('2d'));
-    },
-    get slider() {
-      return html.InputElement.as(sunflower.querySelector("#slider"));
-    },
-    get notes() {
-      return sunflower.querySelector("#notes");
-    },
-    get PHI() {
-      return (math.sqrt(5) + 1) / 2;
-    },
-    get seeds() {
-      return 0;
-    },
-    set seeds(_) {}
-  });
-  sunflower.main = function() {
-    sunflower.slider[$addEventListener]('change', dart.fn(e => sunflower.draw(), EventTovoid()));
-    sunflower.draw();
-  };
-  dart.fn(sunflower.main, VoidTovoid());
-  sunflower.draw = function() {
-    sunflower.seeds = core.int.parse(sunflower.slider.value);
-    sunflower.context.clearRect(0, 0, 300, 300);
-    for (let i = 0; i < dart.notNull(sunflower.seeds); i++) {
-      let theta = i * painter.TAU / dart.notNull(sunflower.PHI);
-      let r = math.sqrt(i) * 4;
-      let x = sunflower.centerX + r * math.cos(theta);
-      let y = sunflower.centerY - r * math.sin(theta);
-      new sunflower.SunflowerSeed.new(x, y, 2).draw(sunflower.context);
-    }
-    sunflower.notes[$text] = dart.str`${sunflower.seeds} seeds`;
-  };
-  dart.fn(sunflower.draw, VoidTovoid());
-  circle.Circle = class Circle extends core.Object {
-    get x() {
-      return this[x$];
-    }
-    set x(value) {
-      super.x = value;
-    }
-    get y() {
-      return this[y$];
-    }
-    set y(value) {
-      super.y = value;
-    }
-    get radius() {
-      return this[radius$];
-    }
-    set radius(value) {
-      super.radius = value;
-    }
-  };
-  (circle.Circle.new = function(x, y, radius) {
-    this[x$] = x;
-    this[y$] = y;
-    this[radius$] = radius;
-  }).prototype = circle.Circle.prototype;
-  dart.addTypeTests(circle.Circle);
-  const x$ = Symbol("Circle.x");
-  const y$ = Symbol("Circle.y");
-  const radius$ = Symbol("Circle.radius");
-  dart.setFieldSignature(circle.Circle, () => ({
-    __proto__: dart.getFields(circle.Circle.__proto__),
-    x: dart.finalFieldType(core.num),
-    y: dart.finalFieldType(core.num),
-    radius: dart.finalFieldType(core.num)
-  }));
-  painter.CirclePainter = class CirclePainter extends core.Object {
-    get color() {
-      return this[color];
-    }
-    set color(value) {
-      this[color] = value;
-    }
-    draw(context) {
-      context.beginPath();
-      context.lineWidth = 2;
-      context.fillStyle = this.color;
-      context.strokeStyle = this.color;
-      context[$arc](this.x, this.y, this.radius, 0, painter.TAU, false);
-      context[$fill]();
-      context.closePath();
-      context.stroke();
-    }
-  };
-  (painter.CirclePainter.new = function() {
-    this[color] = "orange";
-  }).prototype = painter.CirclePainter.prototype;
-  dart.addTypeTests(painter.CirclePainter);
-  const color = Symbol("CirclePainter.color");
-  painter.CirclePainter[dart.implements] = () => [circle.Circle];
-  dart.setMethodSignature(painter.CirclePainter, () => ({
-    __proto__: dart.getMethods(painter.CirclePainter.__proto__),
-    draw: dart.fnType(dart.void, [html.CanvasRenderingContext2D])
-  }));
-  dart.setFieldSignature(painter.CirclePainter, () => ({
-    __proto__: dart.getFields(painter.CirclePainter.__proto__),
-    color: dart.fieldType(core.String)
-  }));
-  sunflower.SunflowerSeed = class SunflowerSeed extends dart.mixin(circle.Circle, painter.CirclePainter) {};
-  (sunflower.SunflowerSeed.new = function(x, y, radius, color) {
-    if (color === void 0) color = null;
-    sunflower.SunflowerSeed.__proto__.new.call(this, x, y, radius);
-    if (color != null) this.color = color;
-  }).prototype = sunflower.SunflowerSeed.prototype;
-  dart.addTypeTests(sunflower.SunflowerSeed);
-  dart.defineLazy(painter, {
-    get ORANGE() {
-      return "orange";
-    },
-    get RED() {
-      return "red";
-    },
-    get BLUE() {
-      return "blue";
-    },
-    get TAU() {
-      return math.PI * 2;
-    }
-  });
-  painter.querySelector = function(selector) {
-    return html.document.querySelector(selector);
-  };
-  dart.fn(painter.querySelector, StringToElement());
-  dart.defineLazy(painter, {
-    get canvas() {
-      return html.CanvasElement.as(painter.querySelector("#canvas"));
-    },
-    get context() {
-      return html.CanvasRenderingContext2D.as(painter.canvas[$getContext]('2d'));
-    }
-  });
-  dart.trackLibraries("sunflower", {
-    "sunflower.dart": sunflower,
-    "circle.dart": circle,
-    "painter.dart": painter
-  }, null);
-  // Exports:
-  return {
-    sunflower: sunflower,
-    circle: circle,
-    painter: painter
-  };
-});
-
-//# sourceMappingURL=sunflower.js.map
diff --git a/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js.map b/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js.map
deleted file mode 100644
index 2bcc814..0000000
--- a/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sourceRoot":"","sources":["../../codegen/sunflower/sunflower.dart","../../codegen/sunflower/circle.dart","../../codegen/sunflower/painter.dart"],"names":["MAX_D","centerX","document","selector","querySelector","canvas","sqrt","slider","draw","seeds","context","i","TAU","PHI","SCALE_FACTOR","r","cos","theta","centerY","sin","x","y","SEED_RADIUS","notes","color","radius","ORANGE","PI"],"mappings":";;;;;;;;;;;;;;;;;;;;IAYM;YAAc,EAAC;KAAA;IACf;YAAe,EAAC;KAAA;IAChB;YAAQ,IAAG;KAAA;IACX;YAAU,AAAAA,IAAK,GAAG,CAAC,AAAA;KAAA;IACnB;YAAUC,kBAAO;KAAA;;4BAEF,SAAC,QAAe,EAAE;AAAG,UAAA,AAAAC,cAAQ,eAAeC,QAAQ,CAAC;AAAA,GAC1E,AAAA;;;IAAM;YAAS,uBAAA,AAAAC,uBAAa,CAAC,SAAS,CAAC,CAAiB;KAAA;IAClD;YAAU,kCAAA,AAAAC,gBAAM,cAAY,IAAI,CAAC,CAA4B;KAAA;IAC7D;YAAS,sBAAA,AAAAD,uBAAa,CAAC,SAAS,CAAC,CAAgB;KAAA;IACjD;YAAQ,AAAAA,wBAAa,CAAC,QAAQ,CAAC;KAAA;IAE/B;YAAM,EAAA,AAAC,AAAAE,SAAI,CAAC,CAAC,CAAC,GAAG,CAAC,AAAC,IAAG,CAAC,AAAA;KAAA;IACzB;YAAQ,EAAC;KAAA;IAAT,eAAS;;mBAEJ,WAAG;AACV,IAAA,AAAAC,gBAAM,oBAAkB,QAAQ,EAAE,QAAA,AAAC,CAAC,IAAK,AAAAC,cAAI,EAAE,AAAA,gBAAA,CAAC;AAClD,AAAE,IAAA,AAAAA,cAAI,EAAE;AACR,GACA,AAAA;;mBAES,WAAG;AACV,IAAA,AAAAC,eAAK,GAAG,eAAU,AAAAF,gBAAM,MAAM,CAAC,AAAA;AACjC,AAAE,IAAA,AAAAG,iBAAO,WAAW,CAAC,EAAE,CAAC,EAAEV,GAAK,EAAEA,GAAK,CAAC;AACvC,AAAE,SAAK,IAAI,IAAI,CAAC,AAAA,AAAA,EAAE,AAAAW,CAAC,gBAAGF,eAAK,CAAA,EAAE,AAAAE,CAAC,EAAE,EAAE;AAC9B,kBAAc,AAAA,AAAAA,CAAC,GAAGC,WAAG,AAAA,gBAAGC,aAAG,CAAA;AAC/B,AAAI,cAAU,AAAA,AAAAP,SAAI,CAACK,CAAC,CAAC,GAAGG,CAAY,AAAA;AACpC,AAAI,cAAU,AAAAb,iBAAO,GAAG,AAAAc,CAAC,GAAGC,AAAA,QAAG,CAACC,KAAK,CAAC,AAAA,AAAA;AACtC,AAAI,cAAU,AAAAC,iBAAO,GAAG,AAAAH,CAAC,GAAG,AAAAI,QAAG,CAACF,KAAK,CAAC,AAAA,AAAA;AACtC,AAAI,MAAA,AAAA,gCAAkBG,CAAC,EAAEC,CAAC,EAAEC,CAAW,CAAC,MAAMZ,iBAAO,CAAC;AACtD,KACA;AAAA,AAAE,IAAA,AAAA,AAAAa,eAAK,OAAK,GAAG,WAAC,eAAM,QAAO,AAAA;AAC7B,GACA,AAAA;;;;;;;;;;;;;;;;;;;;;;gCCpCS,CAAM,EAAE,CAAM,EAAE,MAAW,EAAlC;;;;AAAmC,AACrC,GAAA;;;;;;;;;;;;;;;;;;SCgBY,OAAgC,EAAE;AAC1C,MAAAb,AACE,OAAN,YACA;MAFIA,AAEE,AAAA,OADN,UACiB,GAAG,CACpB,AAAA;MAHIA,AAGE,AAAA,OAFN,UAEiB,GAAGc,UACpB,AAAA;MAJId,AAIE,AAAA,OAHN,YAGmB,GAAGc,UACtB,AAAA;MALId,AAKE,OAJN,OAIYU,MAAC,EAAEC,MAAC,EAAEI,WAAM,EAAE,CAAC,EAAEb,WAAG,EAAE,KAAK,CACvC;MANIF,AAME,OALN,SAMA;MAPIA,AAOE,OANN,YAOA;MARIA,AAQE,OAPN,SAOgB;AAChB,KACA;;;kBAdiBgB,QAAM;;;;;;;;;;;;;;0CFyBP,CAAK,EAAE,CAAK,EAAE,MAAU,EAAG,KAAY,EAArD;;AACM,qDAAMN,CAAC,EAAEC,CAAC,EAAEI,MAAM;AAAC,AAAC,AACxB,QAAI,AAAAD,KAAK,IAAI,IAAI,AAAA,EAAE,AAAA,AAAA,AAAA,IAAI,MAAM,GAAGA,KAAK,AAAA;AACzC,AAAA,AACA,GAAA;;;IEzCM;YAAS,SAAQ;KAAA;IACjB;YAAM,MAAK;KAAA;IACX;YAAO,OAAM;KAAA;IACb;YAAM,AAAAG,QAAE,GAAG,CAAC,AAAA;KAAA;;0BAEG,SAAC,QAAe,EAAE;AAAG,UAAA,AAAAzB,cAAQ,eAAeC,QAAQ,CAAC;AAAA,GAC1E,AAAA;;;IACM;YAAS,uBAAA,AAAAC,qBAAa,CAAC,SAAS,CAAC,CAAiB;KAAA;IAClD;YAAU,kCAAA,AAAAC,cAAM,cAAY,IAAI,CAAC,CAA4B;KAAA","file":"sunflower.js"}
\ No newline at end of file
diff --git a/pkg/dev_compiler/test/codegen_expected/unresolved_names.js b/pkg/dev_compiler/test/codegen_expected/unresolved_names.js
deleted file mode 100644
index 6c09a04..0000000
--- a/pkg/dev_compiler/test/codegen_expected/unresolved_names.js
+++ /dev/null
@@ -1,27 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const unresolved_names = Object.create(_root);
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
-  unresolved_names.C = class C extends core.Object {};
-  (unresolved_names.C.new = function() {
-  }).prototype = unresolved_names.C.prototype;
-  dart.addTypeTests(unresolved_names.C);
-  unresolved_names.main = function() {
-    dart.throw(Error("compile error: unresolved constructor: dynamic.<unnamed>"));
-    dart.throw(Error("compile error: unresolved constructor: C.bar"));
-    core.print(dart.throw(Error("compile error: unresolved identifier: baz")));
-    core.print(dart.dload(unresolved_names.C, 'quux'));
-  };
-  dart.fn(unresolved_names.main, VoidTodynamic());
-  dart.trackLibraries("unresolved_names", {
-    "unresolved_names.dart": unresolved_names
-  }, null);
-  // Exports:
-  return {
-    unresolved_names: unresolved_names
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_expected/varargs.js b/pkg/dev_compiler/test/codegen_expected/varargs.js
deleted file mode 100644
index 6e615fa..0000000
--- a/pkg/dev_compiler/test/codegen_expected/varargs.js
+++ /dev/null
@@ -1,43 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const varargs = Object.create(_root);
-  const src__varargs = Object.create(_root);
-  let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-  let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [dart.dynamic])))();
-  varargs.varargsTest = function(x, ...others) {
-    let args = [1, others];
-    dart.dcall(x, ...args);
-  };
-  dart.fn(varargs.varargsTest, dynamicAnddynamicTodynamic());
-  varargs.varargsTest2 = function(x, ...others) {
-    let args = [1, others];
-    dart.dcall(x, ...args);
-  };
-  dart.fn(varargs.varargsTest2, dynamicAnddynamicTodynamic());
-  src__varargs._Rest = class _Rest extends core.Object {};
-  (src__varargs._Rest.new = function() {
-  }).prototype = src__varargs._Rest.prototype;
-  dart.addTypeTests(src__varargs._Rest);
-  dart.defineLazy(src__varargs, {
-    get rest() {
-      return dart.const(new src__varargs._Rest.new());
-    }
-  });
-  src__varargs.spread = function(args) {
-    dart.throw(new core.StateError.new('The spread function cannot be called, ' + 'it should be compiled away.'));
-  };
-  dart.fn(src__varargs.spread, dynamicTodynamic());
-  dart.trackLibraries("varargs", {
-    "varargs.dart": varargs,
-    "package:js/src/varargs.dart": src__varargs
-  }, null);
-  // Exports:
-  return {
-    varargs: varargs,
-    src__varargs: src__varargs
-  };
-});
diff --git a/pkg/dev_compiler/test/codegen_test.dart b/pkg/dev_compiler/test/codegen_test.dart
deleted file mode 100644
index 0d5df3f..0000000
--- a/pkg/dev_compiler/test/codegen_test.dart
+++ /dev/null
@@ -1,454 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests code generation.
-///
-/// Runs Dart Dev Compiler on all input in the `codegen` directory and checks
-/// that the output is what we expected.
-library dev_compiler.test.codegen_test;
-
-// TODO(rnystrom): This doesn't actually run any tests any more. It just
-// compiles stuff. This should be changed to not use unittest and just be a
-// regular program that outputs files.
-
-import 'dart:convert';
-import 'dart:io' show Directory, File, Platform;
-import 'package:analyzer/analyzer.dart' show StringLiteral, parseDirectives;
-import 'package:analyzer/src/command_line/arguments.dart'
-    show defineAnalysisArguments;
-import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/generated/source.dart' show Source;
-import 'package:args/args.dart' show ArgParser, ArgResults;
-import 'package:dev_compiler/src/analyzer/context.dart';
-import 'package:dev_compiler/src/analyzer/module_compiler.dart'
-    show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler;
-import 'package:dev_compiler/src/compiler/module_builder.dart'
-    show ModuleFormat, addModuleFormatOptions, parseModuleFormatOption;
-import 'package:path/path.dart' as path;
-import 'package:test/test.dart' show expect, isFalse, isTrue, test;
-import 'package:status_file/expectation.dart';
-import 'package:test_dart/path.dart' as test_dart;
-import 'package:test_dart/test_suite.dart' show StandardTestSuite;
-import 'package:test_dart/options.dart';
-
-import '../tool/build_sdk.dart' as build_sdk;
-import 'multitest.dart' show extractTestsFromMultitest, isMultiTest;
-import 'testing.dart' show repoDirectory, testDirectory;
-
-final ArgParser argParser = ArgParser()
-  ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null);
-
-/// The `test/codegen` directory.
-final codegenDir = path.join(testDirectory, 'codegen');
-
-/// The `test/codegen/expect` directory.
-final codegenExpectDir = path.join(testDirectory, 'codegen_expected');
-
-/// The generated directory where tests, expanded multitests, and other test
-/// support libraries are copied to.
-///
-/// The tests sometimes import utility libraries using a relative path.
-/// Likewise, the multitests do too, and one multitest even imports its own
-/// non-expanded form (!). To make that simpler, we copy the entire test tree
-/// to a generated directory and expand that multitests in there too.
-final codegenTestDir = path.join(repoDirectory, 'gen', 'codegen_tests');
-
-/// The generated directory where tests and packages compiled to JS are
-/// output.
-final codegenOutputDir = path.join(repoDirectory, 'gen', 'codegen_output');
-
-final codeCoverage = Platform.environment.containsKey('COVERALLS_TOKEN');
-
-RegExp filePattern;
-
-main(List<String> arguments) {
-  if (arguments == null) arguments = [];
-  ArgResults args = argParser.parse(arguments);
-  filePattern = RegExp(args.rest.length > 0 ? args.rest[0] : '.');
-
-  var sdkDir = path.join(repoDirectory, 'gen', 'patched_sdk');
-  var sdkSummaryFile =
-      path.join(testDirectory, '..', 'gen', 'sdk', 'ddc_sdk.sum');
-
-  var summaryPaths = Directory(path.join(codegenOutputDir, 'pkg'))
-      .listSync()
-      .map((e) => e.path)
-      .where((p) => p.endsWith('.sum'))
-      .toList();
-
-  var sharedCompiler = ModuleCompiler(AnalyzerOptions.basic(
-      dartSdkSummaryPath: sdkSummaryFile, summaryPaths: summaryPaths));
-
-  var testDirs = ['language', 'corelib_2', 'lib'];
-
-  // Copy all of the test files and expanded multitest files to
-  // gen/codegen_tests. We'll compile from there.
-  var testFiles = _setUpTests(testDirs);
-  _writeRuntimeStatus(testFiles);
-
-  // Our default compiler options. Individual tests can override these.
-  var defaultOptions = ['--no-source-map', '--no-summarize'];
-  var compileArgParser = ArgParser();
-  defineAnalysisArguments(compileArgParser, ddc: true);
-  AnalyzerOptions.addArguments(compileArgParser);
-  CompilerOptions.addArguments(compileArgParser);
-  addModuleFormatOptions(compileArgParser);
-
-  var testFileOptionsMatcher =
-      RegExp(r'// (compile options: |SharedOptions=)(.*)', multiLine: true);
-
-  // Ignore dart2js options that we don't support in DDC.
-  var ignoreOptions = [
-    '--enable-enum',
-    '--experimental-trust-js-interop-type-annotations',
-    '--trust-type-annotations',
-    '--supermixin'
-  ];
-
-  // Compile each test file to JS and put the result in gen/codegen_output.
-  testFiles.forEach((testFile, status) {
-    var relativePath = path.relative(testFile, from: codegenTestDir);
-
-    // Only compile the top-level files for generating coverage.
-    bool isTopLevelTest = path.dirname(relativePath) == ".";
-    if (codeCoverage && !isTopLevelTest) return;
-
-    if (status.contains(Expectation.skip) ||
-        status.contains(Expectation.skipByDesign)) {
-      return;
-    }
-
-    var name = path.withoutExtension(relativePath);
-    test('dartdevc $name', () {
-      // Check if we need to use special compile options.
-      var contents = File(testFile).readAsStringSync();
-      var match = testFileOptionsMatcher.firstMatch(contents);
-
-      var args = defaultOptions.toList();
-      if (match != null) {
-        var matchedArgs = match.group(2).split(' ');
-        args.addAll(matchedArgs.where((s) => !ignoreOptions.contains(s)));
-      }
-
-      ArgResults argResults = compileArgParser.parse(args);
-      var analyzerOptions = AnalyzerOptions.fromArguments(argResults,
-          dartSdkSummaryPath: sdkSummaryFile, summaryPaths: summaryPaths);
-
-      var options = CompilerOptions.fromArguments(argResults);
-
-      var moduleFormat = parseModuleFormatOption(argResults).first;
-
-      // Collect any other files we've imported.
-      var files = Set<String>();
-      _collectTransitiveImports(contents, files, from: testFile);
-      var unit = BuildUnit(
-          name, path.dirname(testFile), files.toList(), _moduleForLibrary);
-
-      var compiler = sharedCompiler;
-      if (analyzerOptions.declaredVariables.isNotEmpty) {
-        compiler = ModuleCompiler(analyzerOptions);
-      }
-      JSModuleFile module = null;
-      var exception, stackTrace;
-      try {
-        module = compiler.compile(unit, options);
-      } catch (e, st) {
-        exception = e;
-        stackTrace = st;
-      }
-
-      // This covers tests where the intent of the test is to validate that
-      // some static error is produced.
-      var intentionalCompileError =
-          (contents.contains(': compile-time error') ||
-                  // Use adjacent strings so test.dart doesn't match this line
-                  // as an expected compile error.
-                  contents.contains('/*@' 'compile-error=')) &&
-              !status.contains(Expectation.missingCompileTimeError);
-
-      var crashing = status.contains(Expectation.crash);
-      if (module == null) {
-        expect(crashing, isTrue,
-            reason: "test $name crashes during compilation.\n"
-                "$exception\n$stackTrace");
-        return;
-      }
-
-      // Write out JavaScript and/or compilation errors/warnings.
-      _writeModule(
-          path.join(codegenOutputDir, name),
-          isTopLevelTest ? path.join(codegenExpectDir, name) : null,
-          moduleFormat,
-          module);
-
-      expect(crashing, isFalse, reason: "test $name no longer crashes.");
-
-      var knownCompileError = status.contains(Expectation.compileTimeError) ||
-          status.contains(Expectation.fail);
-      // TODO(jmesserly): we could also invert negative_test, however analyzer
-      // in test.dart does not do this.
-      //   name.endsWith('negative_test') && !status.contains(Expectation.fail)
-      if (module.isValid) {
-        expect(knownCompileError, isFalse,
-            reason: "test $name expected static errors, but compiled.");
-      } else {
-        var reason = intentionalCompileError ? "intended" : "unexpected";
-        expect(intentionalCompileError || knownCompileError, isTrue,
-            reason: "test $name failed to compile due to $reason errors:"
-                "\n\n${module.errors.join('\n')}.");
-      }
-    });
-  });
-
-  if (filePattern.hasMatch('sunflower')) {
-    test('sunflower', () {
-      _buildSunflower(sharedCompiler, codegenOutputDir, codegenExpectDir);
-    });
-  }
-
-  if (codeCoverage) {
-    test('build_sdk code coverage', () {
-      return build_sdk.main(['--dart-sdk', sdkDir, '-o', codegenOutputDir]);
-    });
-  }
-}
-
-void _writeModule(String outPath, String expectPath, ModuleFormat format,
-    JSModuleFile result) {
-  _ensureDirectory(path.dirname(outPath));
-
-  String errors = result.errors.join('\n');
-  if (errors.isNotEmpty && !errors.endsWith('\n')) errors += '\n';
-  File(outPath + '.txt').writeAsStringSync(errors);
-
-  if (result.isValid) {
-    result.writeCodeSync(format, outPath + '.js');
-  }
-
-  if (result.summaryBytes != null) {
-    File(outPath + '.sum').writeAsBytesSync(result.summaryBytes);
-  }
-
-  // Write the expectation file if needed.
-  // Generally speaking we try to avoid these tests, but they are occasionally
-  // useful.
-  if (expectPath != null) {
-    _ensureDirectory(path.dirname(expectPath));
-
-    var expectFile = File(expectPath + '.js');
-    if (result.isValid) {
-      result.writeCodeSync(format, expectFile.path);
-    } else {
-      expectFile.writeAsStringSync("//FAILED TO COMPILE");
-    }
-  }
-}
-
-void _buildSunflower(
-    ModuleCompiler compiler, String outputDir, String expectDir) {
-  var baseDir = path.join(codegenDir, 'sunflower');
-  var files = ['sunflower', 'circle', 'painter']
-      .map((f) => path.join(baseDir, '$f.dart'))
-      .toList();
-  var input = BuildUnit('sunflower', baseDir, files, _moduleForLibrary);
-  var options = CompilerOptions(summarizeApi: false);
-
-  var built = compiler.compile(input, options);
-  _writeModule(path.join(outputDir, 'sunflower', 'sunflower'),
-      path.join(expectDir, 'sunflower', 'sunflower'), ModuleFormat.amd, built);
-}
-
-String _moduleForLibrary(Source source) {
-  var scheme = source.uri.scheme;
-  if (scheme == 'package') {
-    return source.uri.pathSegments.first;
-  }
-  throw Exception('Module not found for library "${source.fullName}"');
-}
-
-void _writeRuntimeStatus(Map<String, Set<Expectation>> testFiles) {
-  var runtimeStatus = <String, String>{};
-  testFiles.forEach((name, status) {
-    name = path.withoutExtension(path.relative(name, from: codegenTestDir));
-    // Skip tests that we don't expect to compile.
-    if (status.contains(Expectation.compileTimeError) ||
-        status.contains(Expectation.crash) ||
-        status.contains(Expectation.skip) ||
-        status.contains(Expectation.fail) ||
-        status.contains(Expectation.skipByDesign)) {
-      return;
-    }
-    // Normalize the expectations for the Karma language_test.js runner.
-    if (status.remove(Expectation.ok)) assert(status.isNotEmpty);
-    if (status.remove(Expectation.missingCompileTimeError) ||
-        status.remove(Expectation.missingRuntimeError)) {
-      status.add(Expectation.pass);
-    }
-
-    // Don't include status for passing tests, as that is the default.
-    // TODO(jmesserly): we could record these for extra sanity checks.
-    if (status.length == 1 && status.contains(Expectation.pass)) {
-      return;
-    }
-
-    runtimeStatus[name] = status.map((s) => '$s').join(',');
-  });
-  File(path.join(codegenOutputDir, 'test_status.js')).writeAsStringSync('''
-define([], function() {
-  'use strict';
-  return ${new JsonEncoder.withIndent(' ').convert(runtimeStatus)};
-});
-''');
-}
-
-Map<String, Set<Expectation>> _setUpTests(List<String> testDirs) {
-  var testFiles = <String, Set<Expectation>>{};
-  for (var testDir in testDirs) {
-    // TODO(rnystrom): Simplify this when the Dart 2.0 test migration is
-    // complete (#30183).
-    // Look for the tests in the "_strong" and "_2" directories in the SDK's
-    // main "tests" directory.
-    var dirParts = path.split(testDir);
-
-    for (var suffix in const ["_2", "_strong"]) {
-      var sdkTestDir = path.join(
-          'tests', dirParts[0] + suffix, path.joinAll(dirParts.skip(1)));
-      var inputPath = path.join(testDirectory, '..', '..', '..', sdkTestDir);
-
-      if (!Directory(inputPath).existsSync()) continue;
-
-      var browsers = Platform.environment['DDC_BROWSERS'];
-      var runtime = browsers == 'Firefox' ? 'firefox' : 'chrome';
-      var config = OptionsParser()
-          .parse('-m release -c dartdevc --use-sdk --strong'.split(' ')
-            ..addAll(['-r', runtime, '--suite_dir', sdkTestDir]))
-          .single;
-
-      var testSuite =
-          StandardTestSuite.forDirectory(config, test_dart.Path(sdkTestDir));
-      var expectations = testSuite.readExpectations();
-
-      for (var file in _listFiles(inputPath, recursive: true)) {
-        var relativePath = path.relative(file, from: inputPath);
-        var outputPath = path.join(codegenTestDir, testDir, relativePath);
-
-        _ensureDirectory(path.dirname(outputPath));
-
-        if (file.endsWith("_test.dart")) {
-          var statusPath = path.withoutExtension(relativePath);
-
-          void _writeTest(String outputPath, String contents) {
-            if (contents.contains('package:unittest/')) {
-              // TODO(jmesserly): we could use directive parsing, but that
-              // feels like overkill.
-              // Alternatively, we could detect "unittest" use at runtime.
-              // We really need a better solution for Karma+mocha+unittest
-              // integration.
-              contents += '\nfinal _usesUnittestPackage = true;\n';
-            }
-            File(outputPath).writeAsStringSync(contents);
-          }
-
-          var contents = File(file).readAsStringSync();
-          if (isMultiTest(contents)) {
-            // It's a multitest, so expand it and add all of the variants.
-            var tests = <String, String>{};
-            extractTestsFromMultitest(file, contents, tests);
-
-            var fileName = path.basenameWithoutExtension(file);
-            var outputDir = path.dirname(outputPath);
-            tests.forEach((name, contents) {
-              var multiFile =
-                  path.join(outputDir, '${fileName}_${name}_multi.dart');
-              testFiles[multiFile] =
-                  expectations.expectations("$statusPath/$name");
-
-              _writeTest(multiFile, contents);
-            });
-          } else {
-            // It's a single test suite.
-            testFiles[outputPath] = expectations.expectations(statusPath);
-          }
-
-          // Write the test file.
-          //
-          // We do this even for multitests because import_self_test
-          // is a multitest, yet imports its own unexpanded form (!).
-          _writeTest(outputPath, contents);
-        } else {
-          // Copy the non-test file over, in case it is used as an import.
-          File(file).copySync(outputPath);
-        }
-      }
-    }
-  }
-
-  // Also include the other special files that live at the top level directory.
-  for (var file in _listFiles(codegenDir)) {
-    var relativePath = path.relative(file, from: codegenDir);
-    var outputPath = path.join(codegenTestDir, relativePath);
-
-    File(file).copySync(outputPath);
-    if (file.endsWith(".dart")) {
-      testFiles[outputPath] = Set()..add(Expectation.pass);
-    }
-  }
-
-  return testFiles;
-}
-
-/// Recursively creates [dir] if it doesn't exist.
-void _ensureDirectory(String dir) {
-  Directory(dir).createSync(recursive: true);
-}
-
-/// Lists all of the files within [dir] that match [filePattern].
-Iterable<String> _listFiles(String dir, {bool recursive = false}) {
-  return Directory(dir)
-      .listSync(recursive: recursive, followLinks: false)
-      .where((e) => e is File && filePattern.hasMatch(e.path))
-      .map((f) => f.path);
-}
-
-/// Parse directives from [contents] and find the complete set of transitive
-/// imports, reading files as needed.
-///
-/// This will not include dart:* libraries, as those are implicitly available.
-void _collectTransitiveImports(String contents, Set<String> libraries,
-    {String packageRoot, String from}) {
-  var uri = from;
-  if (packageRoot != null && path.isWithin(packageRoot, from)) {
-    uri = 'package:${path.relative(from, from: packageRoot)}';
-  }
-  if (!libraries.add(uri)) return;
-
-  var unit = parseDirectives(contents, name: from, suppressErrors: true);
-  for (var d in unit.directives) {
-    if (d is NamespaceDirectiveImpl) {
-      String uri = _resolveDirective(d);
-      if (uri == null ||
-          uri.startsWith('dart:') ||
-          uri.startsWith('package:')) {
-        continue;
-      }
-
-      var f = File(path.join(path.dirname(from), uri));
-      if (f.existsSync()) {
-        _collectTransitiveImports(f.readAsStringSync(), libraries,
-            packageRoot: packageRoot, from: f.path);
-      }
-    }
-  }
-}
-
-/// Simplified from ParseDartTask.resolveDirective.
-String _resolveDirective(NamespaceDirectiveImpl directive) {
-  StringLiteral uriLiteral = directive.uri;
-  String uriContent = uriLiteral.stringValue;
-  if (uriContent != null) {
-    uriContent = uriContent.trim();
-    directive.uriContent = uriContent;
-  }
-  return directive.validate() == null ? uriContent : null;
-}
diff --git a/pkg/dev_compiler/test/multitest.dart b/pkg/dev_compiler/test/multitest.dart
deleted file mode 100644
index f498744..0000000
--- a/pkg/dev_compiler/test/multitest.dart
+++ /dev/null
@@ -1,188 +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(jmesserly): this was factored out of
-// dart-lang/sdk/tools/testing/dart/multitest.dart
-library dev_compiler.test.tools.multitest;
-
-final validMultitestOutcomes = Set<String>.from([
-  'ok',
-  'compile-time error',
-  'runtime error',
-  'static type warning',
-  'dynamic type error',
-  'checked mode compile-time error'
-]);
-
-final runtimeErrorOutcomes = [
-  'runtime error',
-  'dynamic type error',
-];
-
-// Require at least one non-space character before '//#'
-// Handle both //# and the legacy /// multitest regexp patterns.
-final _multiTestRegExp = RegExp(r"\S *//[#/] \w+:(.*)");
-
-final _multiTestRegExpSeperator = RegExp(r"//[#/]");
-
-bool isMultiTest(String contents) => _multiTestRegExp.hasMatch(contents);
-
-// Multitests are Dart test scripts containing lines of the form
-// " [some dart code] /// [key]: [error type]"
-//
-// For each key in the file, a new test file is made containing all
-// the normal lines of the file, and all of the multitest lines containing
-// that key, in the same order as in the source file.  The new test is expected
-// to pass if the error type listed is 'ok', or to fail if there is an error
-// type of type 'compile-time error', 'runtime error', 'static type warning', or
-// 'dynamic type error'.  The type error tests fail only in checked mode.
-// There is also a test created from only the untagged lines of the file,
-// with key "none", which is expected to pass.  This library extracts these
-// tests, writes them into a temporary directory, and passes them to the test
-// runner.  These tests may be referred to in the status files with the
-// pattern [test name]/[key].
-//
-// For example: file I_am_a_multitest.dart
-//   aaa
-//   bbb //# 02: runtime error
-//   ccc //# 02: continued
-//   ddd //# 07: static type warning
-//   eee //# 10: ok
-//   fff
-//
-// should create four tests:
-// I_am_a_multitest_none.dart
-//   aaa
-//   fff
-//
-// I_am_a_multitest_02.dart
-//   aaa
-//   bbb //# 02: runtime error
-//   ccc //# 02: continued
-//   fff
-//
-// I_am_a_multitest_07.dart
-//   aaa
-//   ddd //# 07: static type warning
-//   fff
-//
-// and I_am_a_multitest_10.dart
-//   aaa
-//   eee //# 10: ok
-//   fff
-//
-// Note that it is possible to indicate more than one acceptable outcome
-// in the case of dynamic and static type warnings
-//   aaa
-//   ddd //# 07: static type warning, dynamic type error
-//   fff
-
-void extractTestsFromMultitest(
-    String filePath, String contents, Map<String, String> tests) {
-  int first_newline = contents.indexOf('\n');
-  final String line_separator =
-      (first_newline == 0 || contents[first_newline - 1] != '\r')
-          ? '\n'
-          : '\r\n';
-  List<String> lines = contents.split(line_separator);
-  if (lines.last == '') lines.removeLast();
-  contents = null;
-
-  // Create the set of multitests, which will have a new test added each
-  // time we see a multitest line with a new key.
-  var testsAsLines = Map<String, List<String>>();
-  var outcomes = Map<String, Set<String>>();
-
-  // Add the default case with key "none".
-  testsAsLines['none'] = List<String>();
-  outcomes['none'] = Set<String>();
-
-  int lineCount = 0;
-  for (String line in lines) {
-    lineCount++;
-    var annotation = _Annotation.from(line);
-    if (annotation != null) {
-      testsAsLines.putIfAbsent(
-          annotation.key, () => List<String>.from(testsAsLines["none"]));
-      // Add line to test with annotation.key as key, empty line to the rest.
-      for (var key in testsAsLines.keys) {
-        testsAsLines[key].add(annotation.key == key ? line : "");
-      }
-      outcomes.putIfAbsent(annotation.key, () => Set<String>());
-      if (annotation.rest != 'continued') {
-        for (String nextOutcome in annotation.outcomesList) {
-          if (validMultitestOutcomes.contains(nextOutcome)) {
-            outcomes[annotation.key].add(nextOutcome);
-          } else {
-            print("Warning: Invalid test directive '$nextOutcome' on line "
-                "${lineCount}:\n${annotation.rest} ");
-          }
-        }
-      }
-    } else {
-      for (var test in testsAsLines.values) test.add(line);
-    }
-  }
-  // End marker, has a final line separator so we don't need to add it after
-  // joining the lines.
-  var marker = '// Test created from multitest named $filePath.'
-      '$line_separator';
-  testsAsLines.forEach((key, test) {
-    if (runtimeErrorOutcomes.any(outcomes[key].contains)) {
-      test.add('final _expectRuntimeError = true;');
-    }
-    test.add(marker);
-  });
-
-  var keysToDelete = [];
-  // Check that every key (other than the none case) has at least one outcome
-  for (var outcomeKey in outcomes.keys) {
-    if (outcomeKey != 'none' && outcomes[outcomeKey].isEmpty) {
-      print("Warning: Test ${outcomeKey} has no valid annotated outcomes.\n"
-          "Expected one of: ${validMultitestOutcomes.toString()}");
-      // If this multitest doesn't have an outcome, mark the multitest for
-      // deletion.
-      keysToDelete.add(outcomeKey);
-    }
-  }
-  // If a key/multitest was marked for deletion, do the necessary cleanup.
-  keysToDelete.forEach(outcomes.remove);
-  keysToDelete.forEach(testsAsLines.remove);
-
-  // Copy all the tests into the output map tests, as multiline strings.
-  for (String key in testsAsLines.keys) {
-    tests[key] = testsAsLines[key].join(line_separator);
-  }
-}
-
-// Represents a mutlitest annotation in the special //# comment.
-class _Annotation {
-  String key;
-  String rest;
-  List<String> outcomesList;
-  _Annotation() {}
-  factory _Annotation.from(String line) {
-    // Do an early return with "null" if this is not a valid multitest
-    // annotation.
-    if (!line.contains(_multiTestRegExpSeperator)) {
-      return null;
-    }
-    var parts = line
-        .split(_multiTestRegExpSeperator)[1]
-        .split(':')
-        .map((s) => s.trim())
-        .where((s) => s.length > 0)
-        .toList();
-    if (parts.length <= 1) {
-      return null;
-    }
-
-    var annotation = _Annotation();
-    annotation.key = parts[0];
-    annotation.rest = parts[1];
-    annotation.outcomesList =
-        annotation.rest.split(',').map((s) => s.trim()).toList();
-    return annotation;
-  }
-}
diff --git a/pkg/dev_compiler/test/options/options_test.dart b/pkg/dev_compiler/test/options/options_test.dart
index c553d95..06a2f6f 100644
--- a/pkg/dev_compiler/test/options/options_test.dart
+++ b/pkg/dev_compiler/test/options/options_test.dart
@@ -37,7 +37,7 @@
     var compiler = ModuleCompiler(options, analysisRoot: optionsDir);
     var context = compiler.context;
     var sdk = context.sourceFactory.dartSdk;
-    expect(sdk, isInstanceOf<SummaryBasedDartSdk>());
+    expect(sdk, const TypeMatcher<SummaryBasedDartSdk>());
     var processors = context.analysisOptions.errorProcessors;
     expect(processors, hasLength(1));
     expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
diff --git a/pkg/dev_compiler/tool/README.md b/pkg/dev_compiler/tool/README.md
deleted file mode 100644
index 0aade89..0000000
--- a/pkg/dev_compiler/tool/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-## Tools for processing the Dart SDK
-
-# patch_sdk.dart
-
-This script combines:
-
-    tool/input_sdk/lib/...
-    tool/input_sdk/patch/...
-    tool/input_sdk/private/...
-
-and produces the merged SDK sources in:
-
-    gen/patched_sdk/...
-
-The result has all "external" keywords replaced with the @patch implementations.
-
-Generally local edits should be to `input_sdk/patch` and `input_sdk/private`,
-as those two directories are specific to DDC. `input_sdk/lib` should represent
-unmodified SDK sources to the maximum extent possible. Currently there are
-slight edits to the type annotations in some cases.
-
-See patch_sdk.dart for more information.
-
-# sdk_version_check.dart
-
-Asserts that the Dart VM is at least a particular semantic version.
-It returns an exit code to make it easy to integrate with shell scripts.
diff --git a/pkg/dev_compiler/tool/analyze.sh b/pkg/dev_compiler/tool/analyze.sh
deleted file mode 100755
index 7786289..0000000
--- a/pkg/dev_compiler/tool/analyze.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-set -e
-
-# Switch to the root directory of dev_compiler
-cd $( dirname "${BASH_SOURCE[0]}" )/..
-
-function fail {
-  echo -e "Analyzer found problems"
-  return 1
-}
-
-# Run analyzer on bin/dartdevc.dart, as it includes most of the code we care
-# about via transitive dependencies. This seems to be the only fast way to avoid
-# repeated analysis of the same code.
-# TODO(jmesserly): ideally we could do test/all_tests.dart, but
-# dart_runtime_test.dart creates invalid generic type instantiation AA.
-echo "Running dartanalyzer to check for errors/warnings..."
-dart ../analyzer_cli/bin/analyzer.dart --strong --package-warnings \
-    bin/dartdevc.dart web/main.dart \
-    | grep -v "\[info\]" | grep -v "\[hint\]" | (! grep $PWD) || fail
diff --git a/pkg/dev_compiler/tool/browser_test.sh b/pkg/dev_compiler/tool/browser_test.sh
deleted file mode 100755
index ffef3712..0000000
--- a/pkg/dev_compiler/tool/browser_test.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-
-# Check that node exists and refers to nodejs
-checknodejs=$(hash node 2> /dev/null  && node --help | grep js)
-if [[ $? -ne 0 ]]; then
-  echo 'NodeJS (node) is not properly installed'
-  echo 'Note, on Ubuntu / Debian, you may need to also install:'
-  echo '$ sudo apt-get install nodejs-legacy'
-  exit 1
-fi
-
-# Check that npm is installed
-checknpm=$(hash npm 2> /dev/null)
-if [[ $? -ne 0 ]]; then
-  echo 'Node Package Manager (npm) is not properly installed'
-  exit 1
-fi
-
-# Check for Chrome Canary on Ubuntu
-# The default install path is sometimes google-chrome-unstable
-# instead of google-chrome-canary as karma expects.
-if [[ "$OSTYPE" == "linux-gnu" ]] && [[ -z "$CHROME_CANARY_BIN" ]]; then
-  checkcanary=$(hash google-chrome-canary 2> /dev/null)
-  if [[ $? -ne 0 ]]; then
-    checkunstable=$(hash google-chrome-unstable 2> /dev/null)
-    if [[ $? -ne 0 ]]; then
-      echo 'Chrome Canary is not found'
-      echo 'Please install and/or set CHROME_CANARY_BIN to its path'
-      exit 1
-    else
-      export CHROME_CANARY_BIN=google-chrome-unstable
-    fi
-  fi
-fi
-
-npm install
-npm test
diff --git a/pkg/dev_compiler/tool/build_sdk.sh b/pkg/dev_compiler/tool/build_sdk.sh
deleted file mode 100755
index 62c012d..0000000
--- a/pkg/dev_compiler/tool/build_sdk.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-set -e
-# switch to the root directory of dev_compiler
-cd $( dirname "${BASH_SOURCE[0]}" )/..
-
-echo "*** Patching SDK"
-{ # Try
-  dart -c tool/patch_sdk.dart ../.. tool/input_sdk gen/patched_sdk \
-      > gen/sdk_analyzer_errors.txt
-} || { # Catch
-  # Show errors if the sdk didn't compile.
-  cat gen/sdk_analyzer_errors.txt
-  exit 1
-}
-
-echo "*** Compiling SDK to JavaScript"
-{ # Try
-  # TODO(jmesserly): break out dart:html & friends into a module.
-  dart -c tool/build_sdk.dart \
-      --dart-sdk gen/patched_sdk \
-      --dart-sdk-summary=build \
-      --summary-out gen/sdk/ddc_sdk.sum \
-      --source-map \
-      --source-map-comment \
-      --inline-source-map \
-      --modules=amd \
-      -o gen/sdk/amd/dart_sdk.js \
-      --modules=es6 \
-      -o gen/sdk/es6/dart_sdk.js \
-      --modules=common \
-      -o gen/sdk/common/dart_sdk.js \
-      --modules=legacy \
-      -o gen/sdk/legacy/dart_sdk.js \
-      "$@" > gen/sdk_analyzer_errors.txt
-} || { # Catch
-  # Show errors if the sdk didn't compile.
-  cat gen/sdk_analyzer_errors.txt
-  exit 1
-}
diff --git a/pkg/dev_compiler/tool/coverage.sh b/pkg/dev_compiler/tool/coverage.sh
deleted file mode 100755
index 70d7a01..0000000
--- a/pkg/dev_compiler/tool/coverage.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-set -e # bail on error
-
-# Prerequisite: ./tool/build_sdk.sh has been run.
-
-# Install dart_coveralls; gather and send coverage data.
-if [ "$COVERALLS_TOKEN" ] && [ "$TRAVIS_DART_VERSION" = "dev" ]; then
-  echo "*** Running dart_coveralls"
-  pub global run dart_coveralls report \
-    --token $COVERALLS_TOKEN \
-    --retry 2 \
-    --throw-on-connectivity-error \
-    --exclude-test-files \
-    test/all_tests.dart
-  echo "*** Done running dart_coveralls"
-fi
diff --git a/pkg/dev_compiler/tool/dd8 b/pkg/dev_compiler/tool/dd8
deleted file mode 100755
index 6f3154c..0000000
--- a/pkg/dev_compiler/tool/dd8
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-#
-# Compiles code with DDC and runs the resulting code in d8 (the v8 command
-# line tool).  Only recent versions of v8/d8 that include es6 modules are
-# supported.
-#
-# The first script supplied should be the one with `main()`.
-#
-# Saves the output in the same directory as the sources for convenient
-# inspection, modification or rerunning the code.
-#
-# TODO(vsm): Investigate what polyfills from dart2js would be useful here:
-# sdk/lib/_internal/js_runtime/lib/preambles/d8.js
-#
-D8=$(type -P d8)
-if [ ! $D8 ]; then
-  echo "Please add d8 to your PATH."
-  exit 1
-fi
-set -e
-DDC_PATH=$( cd $( dirname "${BASH_SOURCE[0]}" )/.. && pwd )
-BASENAME=$( basename "${1%.*}")
-LIBROOT=$(cd $( dirname "${1%.*}") && pwd)
-
-# Build the SDK in a place where we can find it if it's not already there.
-if [ ! -e gen/sdk/ddc_sdk.sum ]; then
-  ./tool/build_sdk.sh
-fi
-
-# D8 uses relative paths.  That won't work for the sdk right now as the
-# summary is in a slightly different location.
-# D8/ES6 imports also do not add a ".js" extension, so this is "dart_sdk"
-# instead of "dart_sdk.js".
-if [ ! -f dart_sdk ]; then
-    ln -s $DDC_PATH/gen/sdk/es6/dart_sdk.js dart_sdk
-fi
-
-dart -c $DDC_PATH/bin/dartdevc.dart --modules=es6 --library-root=$LIBROOT \
-    --dart-sdk-summary=$DDC_PATH/gen/sdk/ddc_sdk.sum \
-    -o $LIBROOT/$BASENAME.js $*
-pushd $LIBROOT > /dev/null
-echo "
-    import { dart, _isolate_helper } from 'dart_sdk';
-    import { $BASENAME } from '$BASENAME.js';
-    let main = $BASENAME.main;
-    dart.ignoreWhitelistedErrors(false);
-    try {
-      _isolate_helper.startRootIsolate(() => {}, []);
-      main();
-    } catch(e) {
-      console.error(e.toString(), dart.stackTrace(e).toString());
-    }" \
-    > $LIBROOT/$BASENAME.d8.js
-$D8 --module $BASENAME.d8.js || exit 1
-popd > /dev/null
diff --git a/pkg/dev_compiler/tool/dependency_overrides.sh b/pkg/dev_compiler/tool/dependency_overrides.sh
deleted file mode 100644
index 2b0c159..0000000
--- a/pkg/dev_compiler/tool/dependency_overrides.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/bash
-
-function add_dependency_override() {
-  local name=$1
-  local path=$2
-  if ! cat pubspec.yaml | grep "dependency_overrides:" ; then
-    echo "dependency_overrides:" >> pubspec.yaml
-  fi
-  local pubspec=`cat pubspec.yaml | grep -v "$name: .path: "`
-  echo "$pubspec" > pubspec.yaml
-  if [[ -n "$path" ]]; then
-    echo "  $name: {path: $path}" >> pubspec.yaml
-  fi
-}
-
-function checkout_dependency_override_from_github() {
-  local dependency_name=$1
-  local org_project=$2
-  local branch=$3
-  local path=${4:-/}
-
-  local url=https://github.com/$org_project
-
-  echo "** Checking out $dependency_name override from $url$path#$branch"
-
-  : ${TMPDIR:="/tmp"}
-  local dep_dir=$TMPDIR/dependency_overrides/$dependency_name
-
-  [[ -d `dirname $dep_dir` ]] || mkdir `dirname $dep_dir`
-
-  if [[ -d $dep_dir ]]; then
-    # Check there's no local modifications before removing existing directory.
-    (
-      cd $dep_dir
-      if git status -s | grep . ; then
-        echo "Found local modifications in $dep_dir: aborting"
-        exit 1
-      fi
-    )
-    rm -fR $dep_dir
-  fi
-
-  if [[ "$path" == "/" ]]; then
-    # Checkout only the branch, with no history:
-    git clone --depth 1 --branch $branch $url $dep_dir
-  else
-    (
-      mkdir $dep_dir
-      cd $dep_dir
-
-      # Sparse-checkout only the path + branch, with no history:
-      git init
-      git remote add origin $url
-      git config core.sparsecheckout true
-      echo $path >> .git/info/sparse-checkout
-      git pull --depth=1 origin $branch
-    )
-  fi
-  add_dependency_override $dependency_name $dep_dir$path
-}
diff --git a/pkg/dev_compiler/tool/format.sh b/pkg/dev_compiler/tool/format.sh
deleted file mode 100755
index 01f7e3b..0000000
--- a/pkg/dev_compiler/tool/format.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-set -e
-
-# Switch to the root directory of dev_compiler
-cd $( dirname "${BASH_SOURCE[0]}" )/..
-
-# Run formatter in rewrite mode on all files that are part of the project.
-# This checks that all files are commited first to git, so no state is lost.
-# The formatter ignores:
-#   * local files that have never been added to git,
-#   * subdirectories of test/ and tool/, unless explicitly added. Those dirs
-#     contain a lot of generated or external source we should not reformat.
-(files=`git ls-files 'bin/*.dart' 'lib/*.dart' test/*.dart test/checker/*.dart \
-  tool/*.dart | grep -v lib/src/js_ast/`; git status -s $files | grep -q . \
-  && echo "Did not run the formatter, please commit edited files first." \
-  || (echo "Running dart formatter" ; \
-  dart ../../third_party/pkg_tested/dart_style/bin/format.dart -w $files))
diff --git a/pkg/dev_compiler/tool/get_chrome_canary.sh b/pkg/dev_compiler/tool/get_chrome_canary.sh
deleted file mode 100755
index 8f02313..0000000
--- a/pkg/dev_compiler/tool/get_chrome_canary.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-#
-# Ensures the latest Chrome Canary is available, downloading it
-# if necessary.
-#
-# Directory ~/.chrome/canary can safely be cached as the existing
-# version will be checked before reusing a previously downloaded
-# canary.
-#
-
-set -eu
-
-readonly CHROME_SNAPSHOTS=https://storage.googleapis.com/chromium-browser-snapshots
-declare CHROME_URL
-declare CHROME_NAME
-declare CHROME_RELATIVE_BIN
-
-if [[ "$OSTYPE" == "linux"* ]]; then
-  CHROME_URL=$CHROME_SNAPSHOTS/Linux_x64
-  CHROME_NAME=chrome-linux
-  CHROME_RELATIVE_BIN=chrome
-elif [[ "$OSTYPE" == "darwin"* ]]; then
-  CHROME_URL=$CHROME_SNAPSHOTS/Mac
-  CHROME_NAME=chrome-mac
-  CHROME_RELATIVE_BIN=Chromium.app/Contents/MacOS/Chromium
-elif [[ "$OSTYPE" == "cygwin" ]]; then
-  CHROME_URL=$CHROME_SNAPSHOTS/Win
-  CHROME_NAME=chrome-win32
-  CHROME_RELATIVE_BIN=chrome.exe
-else
-  echo "Unknown platform: $OSTYPE" >&2
-  exit 1
-fi
-
-readonly CHROME_CANARY_DIR=$HOME/.chrome/canary
-readonly CHROME_CANARY_BIN=$CHROME_CANARY_DIR/$CHROME_NAME/$CHROME_RELATIVE_BIN
-readonly CHROME_CANARY_REV_FILE=$CHROME_CANARY_DIR/VERSION
-readonly CHROME_REV=$(curl -s ${CHROME_URL}/LAST_CHANGE)
-
-function getCanary() {
-  local existing_version=""
-  if [[ -f $CHROME_CANARY_REV_FILE && -x $CHROME_CANARY_BIN ]]; then
-    existing_version=`cat $CHROME_CANARY_REV_FILE`
-    echo "Found cached Chrome Canary version: $existing_version"
-  fi
-
-  if [[ "$existing_version" != "$CHROME_REV" ]]; then
-    echo "Downloading Chrome Canary version: $CHROME_REV"
-    rm -fR $CHROME_CANARY_DIR
-    mkdir -p $CHROME_CANARY_DIR
-
-    local file=$CHROME_NAME.zip
-    curl ${CHROME_URL}/${CHROME_REV}/$file -o $file
-    unzip $file -d $CHROME_CANARY_DIR
-    rm $file
-    echo $CHROME_REV > $CHROME_CANARY_REV_FILE
-  fi
-}
-
-getCanary >&2
-
-echo $CHROME_CANARY_BIN
diff --git a/pkg/dev_compiler/tool/global_compile.dart b/pkg/dev_compiler/tool/global_compile.dart
index ec294b5..d3090ae 100644
--- a/pkg/dev_compiler/tool/global_compile.dart
+++ b/pkg/dev_compiler/tool/global_compile.dart
@@ -85,7 +85,7 @@
   out.writeAsStringSync(dartLibrary);
   var dartSdk = File(path.join(ddcPath, 'lib', 'js', 'legacy', 'dart_sdk.js'))
       .readAsStringSync();
-  out.writeAsStringSync(dartSdk, mode: FileMode.APPEND);
+  out.writeAsStringSync(dartSdk, mode: FileMode.append);
 
   // Linearize module concatenation for deterministic output
   var last = Future.value();
@@ -138,7 +138,7 @@
         linearizerMap[module]
             .then((_) => codefile.readAsString())
             .then((code) =>
-                out.writeAsString(code, mode: FileMode.APPEND, flush: true))
+                out.writeAsString(code, mode: FileMode.append, flush: true))
             .then((_) => completerMap[module].complete());
       });
     });
@@ -152,7 +152,7 @@
     var libraryName =
         path.withoutExtension(entry).replaceAll(path.separator, '__');
     out.writeAsStringSync('dart_library.start("$ENTRY", "$libraryName");\n',
-        mode: FileMode.APPEND);
+        mode: FileMode.append);
   });
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index 9fa9679..492291a 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -379,7 +379,7 @@
     // This is stylistically a bit ugly but it eases distinguishing Dart and
     // JS objects.
     var element = JsonMLElement('span')
-      ..setStyle('background-color: #d9edf7;')
+      ..setStyle('background-color: #d9edf7;color: black')
       ..createTextChild(c);
     return element.toJsonML();
   }
@@ -394,7 +394,7 @@
           'margin-bottom: 0px;'
           'margin-left: 12px;');
     if (object is StackTrace) {
-      body.addStyle('color: rgb(196, 26, 22);');
+      body.addStyle('background-color: thistle;color: rgb(196, 26, 22);');
     }
     var children = _simpleFormatter.children(object, config);
     if (children == null) return body.toJsonML();
@@ -411,7 +411,8 @@
         nameSpan = JsonMLElement('span')
           ..createTextChild(
               child.displayName.isNotEmpty ? '${child.displayName}: ' : '')
-          ..setStyle('color: rgb(136, 19, 145); margin-right: -13px');
+          ..setStyle(
+              'background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px');
         valueStyle = 'margin-left: 13px';
       }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
index 5b4a54b..306b1a2 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
@@ -597,11 +597,7 @@
   Iterable<E> followedBy(Iterable<E> other) =>
       FollowedByIterable<E>.firstEfficient(this, other);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   List<E> operator +(List<E> other) {
     int totalLength = this.length + other.length;
diff --git a/pkg/dev_compiler/tool/override_analyzer_dependency.sh b/pkg/dev_compiler/tool/override_analyzer_dependency.sh
deleted file mode 100755
index a887498..0000000
--- a/pkg/dev_compiler/tool/override_analyzer_dependency.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-set -e
-cd $( dirname "${BASH_SOURCE[0]}" )/..
-
-. ./tool/dependency_overrides.sh
-
-checkout_dependency_override_from_github \
-  analyzer dart-lang/sdk $1 /pkg/analyzer/
diff --git a/pkg/dev_compiler/tool/patch_sdk.sh b/pkg/dev_compiler/tool/patch_sdk.sh
deleted file mode 100755
index 45370d1..0000000
--- a/pkg/dev_compiler/tool/patch_sdk.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-set -e
-
-cd "$(dirname "$BASH_SOURCE[0]")/.."
-dart -c tool/patch_sdk.dart ../.. tool/input_sdk gen/patched_sdk
diff --git a/pkg/dev_compiler/tool/presubmit.sh b/pkg/dev_compiler/tool/presubmit.sh
deleted file mode 100755
index 5ad1726..0000000
--- a/pkg/dev_compiler/tool/presubmit.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-set -e
-DIR=$(dirname "${BASH_SOURCE[0]}")
-$DIR/build_sdk.sh
-$DIR/test.sh
-$DIR/browser_test.sh
-$DIR/analyze.sh
-echo "*** Presubmit finished"
diff --git a/pkg/dev_compiler/tool/sdk_version_check.dart b/pkg/dev_compiler/tool/sdk_version_check.dart
deleted file mode 100755
index 4d64c43..0000000
--- a/pkg/dev_compiler/tool/sdk_version_check.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env dart
-// 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.
-
-// Checks that the Dart VM is at least the requested version
-import 'dart:io' show Platform, exit;
-import 'package:pub_semver/pub_semver.dart' show Version;
-
-void main(List<String> argv) {
-  if (argv.length == 0 || argv[0] == '--help') {
-    print('usage: sdk_version_check.dart <minimum-version>');
-    print('for example: sdk_version_check.dart 1.9.0-dev.4.0');
-    exit(2);
-  }
-  var minVersion = Version.parse(argv[0]);
-
-  var vmStr = Platform.version;
-  vmStr = vmStr.substring(0, vmStr.indexOf(' '));
-  var vmVersion = Version.parse(vmStr);
-  if (vmVersion < minVersion) {
-    print('Requires VM $minVersion but actual version $vmVersion');
-    exit(1);
-  }
-}
diff --git a/pkg/dev_compiler/tool/test.sh b/pkg/dev_compiler/tool/test.sh
deleted file mode 100755
index 4f1db8c..0000000
--- a/pkg/dev_compiler/tool/test.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-set -e # bail on error
-
-function fail {
-  echo -e "Some tests failed"
-  return 1
-}
-
-# Some tests require being run from the package root
-# switch to the root directory of dev_compiler
-cd $( dirname "${BASH_SOURCE[0]}" )/..
-
-# Check minimum SDK version
-./tool/sdk_version_check.dart 1.9.0-dev.4.0 || fail
-
-# Delete codegen expectation files to be sure that if a test fails to compile
-# we don't erroneously pick up the old version.
-if [ -d test/codegen/expect ]; then
-  rm -r test/codegen/expect || fail
-fi
-
-if [ -d gen/codegen_input ]; then
-  rm -r gen/codegen_input || fail
-fi
-
-if [ -d gen/codegen_output ]; then
-  rm -r gen/codegen_output || fail
-fi
-
-# Build the SDK summary in a place where the tests can find it if it's not
-# already there.
-if [ ! -e gen/sdk/ddc_sdk.sum ]; then
-  ./tool/build_sdk.sh
-fi
-
-./tool/build_pkgs.dart \
-    --analyzer-sdk=gen/sdk/ddc_sdk.sum \
-    --output=gen/codegen_output/pkg
-
-# Make sure we don't run tests in code coverage mode.
-# this will cause us to generate files that are not part of the baseline
-# TODO(jmesserly): we should move diff into Dart code, so we don't need to
-# worry about this. Also if we're in code coverage mode, we should avoid running
-# all_tests twice. Finally self_host_test is not currently being tracked by
-# code coverage.
-unset COVERALLS_TOKEN
-dart test/all_tests.dart || fail
-
-{
-  fc=`find test -name "*.dart" |\
-      xargs grep "/\*\S* should be \S*\*/" | wc -l`
-  echo "There are" $fc "tests marked as known failures."
-}
-
-echo -e "All tests built - run tool/browser_test.sh to run tests"
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 4803de0..423242f 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -598,6 +598,20 @@
     _fail("Test error: $message");
   }
 
+  /// Checks that [object] has type [T].
+  static void type<T>(Object object, [String reason]) {
+    if (object is T) return;
+    String msg = _getMessage(reason);
+    _fail("Expect.type($object is $T$msg) fails, was ${object.runtimeType}");
+  }
+
+  /// Checks that [object] does not have type [T].
+  static void notType<T>(Object object, [String reason]) {
+    if (object is! T) return;
+    String msg = _getMessage(reason);
+    _fail("Expect.type($object is! $T$msg) fails, was ${object.runtimeType}");
+  }
+
   static String _getMessage(String reason) =>
       (reason == null) ? "" : ", '$reason'";
 
diff --git a/pkg/front_end/lib/src/byte_store/file_byte_store.dart b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
index 9a9bc29..00d3630 100644
--- a/pkg/front_end/lib/src/byte_store/file_byte_store.dart
+++ b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
@@ -46,9 +46,7 @@
   }
 
   @override
-  List<int> get(String key) {
-    return _fileByteStore.get(key);
-  }
+  List<int> get(String key) => _fileByteStore.get(key);
 
   @override
   void put(String key, List<int> bytes) {
@@ -97,16 +95,16 @@
     SendPort initialReplyTo = message;
     ReceivePort port = new ReceivePort();
     initialReplyTo.send(port.sendPort);
-    port.listen((request) async {
+    port.listen((request) {
       if (request is CacheCleanUpRequest) {
-        await _cleanUpFolder(request.cachePath, request.maxSizeBytes);
+        _cleanUpFolder(request.cachePath, request.maxSizeBytes);
         // Let the client know that we're done.
         request.replyTo.send(true);
       }
     });
   }
 
-  static Future<Null> _cleanUpFolder(String cachePath, int maxSizeBytes) async {
+  static void _cleanUpFolder(String cachePath, int maxSizeBytes) {
     // Prepare the list of files and their statistics.
     List<File> files = <File>[];
     Map<File, FileStat> fileStatMap = {};
@@ -115,10 +113,14 @@
     for (FileSystemEntity resource in resources) {
       if (resource is File) {
         try {
-          FileStat fileStat = await resource.stat();
-          files.add(resource);
-          fileStatMap[resource] = fileStat;
-          currentSizeBytes += fileStat.size;
+          final FileStat fileStat = resource.statSync();
+          // Make sure that the file was not deleted out from under us (a return
+          // value of FileSystemEntityType.notFound).
+          if (fileStat.type == FileSystemEntityType.file) {
+            files.add(resource);
+            fileStatMap[resource] = fileStat;
+            currentSizeBytes += fileStat.size;
+          }
         } catch (_) {}
       }
     }
@@ -133,7 +135,7 @@
         break;
       }
       try {
-        await file.delete();
+        file.deleteSync();
       } catch (_) {}
       currentSizeBytes -= fileStatMap[file].size;
     }
@@ -144,51 +146,71 @@
  * [ByteStore] that stores values as files.
  */
 class FileByteStore implements ByteStore {
+  static final FileByteStoreValidator _validator = new FileByteStoreValidator();
+
   final String _cachePath;
-  final String _tempName;
-  final FileByteStoreValidator _validator = new FileByteStoreValidator();
+  final String _tempSuffix;
+  final Map<String, List<int>> _writeInProgress = {};
+  final FuturePool _pool = new FuturePool(20);
 
   /**
    * If the same cache path is used from more than one isolate of the same
    * process, then a unique [tempNameSuffix] must be provided for each isolate.
    */
   FileByteStore(this._cachePath, {String tempNameSuffix: ''})
-      : _tempName = 'temp_${pid}_${tempNameSuffix}';
+      : _tempSuffix =
+            '-temp-${pid}${tempNameSuffix.isEmpty ? '' : '-$tempNameSuffix'}';
 
   @override
   List<int> get(String key) {
+    List<int> bytes = _writeInProgress[key];
+    if (bytes != null) {
+      return bytes;
+    }
+
     try {
-      File file = _getFileForKey(key);
-      List<int> rawBytes = file.readAsBytesSync();
-      return _validator.getData(rawBytes);
+      final File file = _getFileForKey(key);
+      if (!file.existsSync()) {
+        return null;
+      }
+      return _validator.getData(file.readAsBytesSync());
     } catch (_) {
+      // ignore exceptions
       return null;
     }
   }
 
   @override
   void put(String key, List<int> bytes) {
-    try {
-      bytes = _validator.wrapData(bytes);
-      File tempFile = _getFileForKey(_tempName);
-      tempFile.writeAsBytesSync(bytes);
-      File file = _getFileForKey(key);
-      tempFile.renameSync(file.path);
-    } catch (_) {}
+    _writeInProgress[key] = bytes;
+
+    final List<int> wrappedBytes = _validator.wrapData(bytes);
+
+    // We don't wait for the write and rename to complete.
+    _pool.execute(() {
+      final File tempFile = _getFileForKey('$key$_tempSuffix');
+      return tempFile.writeAsBytes(wrappedBytes).then((_) {
+        return tempFile.rename(join(_cachePath, key));
+      }).catchError((_) {
+        // ignore exceptions
+      }).whenComplete(() {
+        if (_writeInProgress[key] == bytes) {
+          _writeInProgress.remove(key);
+        }
+      });
+    });
   }
 
-  File _getFileForKey(String key) {
-    return new File(join(_cachePath, key));
-  }
+  File _getFileForKey(String key) => new File(join(_cachePath, key));
 }
 
 /**
- * Generally speaking, we cannot guarantee that any data written into a
- * file will stay the same - there is always a chance of a hardware problem,
- * file system problem, truncated data, etc.
+ * Generally speaking, we cannot guarantee that any data written into a file
+ * will stay the same - there is always a chance of a hardware problem, file
+ * system problem, truncated data, etc.
  *
- * So, we need to embed some validation into data itself.
- * This class append the version and the checksum to data.
+ * So, we need to embed some validation into data itself. This class append the
+ * version and the checksum to data.
  */
 class FileByteStoreValidator {
   static const List<int> _VERSION = const [0x01, 0x00, 0x00, 0x00];
@@ -253,3 +275,30 @@
     return bytes;
   }
 }
+
+class FuturePool {
+  int _available;
+  List waiting = [];
+
+  FuturePool(this._available);
+
+  void execute(Future Function() fn) {
+    if (_available > 0) {
+      _run(fn);
+    } else {
+      waiting.add(fn);
+    }
+  }
+
+  void _run(Future Function() fn) {
+    _available--;
+
+    fn().whenComplete(() {
+      _available++;
+
+      if (waiting.isNotEmpty) {
+        _run(waiting.removeAt(0));
+      }
+    });
+  }
+}
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 dcd6413..5b43657 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -126,7 +126,7 @@
 
   int finishDeferredLoadTearoffs() => 0;
 
-  int finishNoSuchMethodForwarders() => 0;
+  int finishForwarders() => 0;
 
   int finishNativeMethods() => 0;
 
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index fc89ebc..fc453d5 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -692,6 +692,8 @@
 const Code<Message Function(String name)> codeConflictsWithConstructor =
     const Code<Message Function(String name)>(
         "ConflictsWithConstructor", templateConflictsWithConstructor,
+        analyzerCode: "CONFLICTS_WITH_CONSTRUCTOR",
+        dart2jsCode: "*fatal*",
         severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -730,6 +732,8 @@
 const Code<Message Function(String name)> codeConflictsWithMember =
     const Code<Message Function(String name)>(
         "ConflictsWithMember", templateConflictsWithMember,
+        analyzerCode: "CONFLICTS_WITH_MEMBER",
+        dart2jsCode: "*fatal*",
         severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -809,6 +813,8 @@
 const Code<Message Function(String name)> codeConflictsWithTypeVariable =
     const Code<Message Function(String name)>(
         "ConflictsWithTypeVariable", templateConflictsWithTypeVariable,
+        analyzerCode: "CONFLICTING_TYPE_VARIABLE_AND_MEMBER",
+        dart2jsCode: "*fatal*",
         severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1329,6 +1335,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstructorNotSync = messageConstructorNotSync;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstructorNotSync = const MessageCode(
+    "ConstructorNotSync",
+    analyzerCode: "NON_SYNC_CONSTRUCTOR",
+    dart2jsCode: "*ignored*",
+    message:
+        r"""Constructor bodies can't use 'async', 'async*', or 'sync*'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstructorWithReturnType =
     messageConstructorWithReturnType;
 
@@ -1552,6 +1569,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDeclaredMemberConflictsWithInheritedMember =
     const MessageCode("DeclaredMemberConflictsWithInheritedMember",
+        analyzerCode: "DECLARED_MEMBER_CONFLICTS_WITH_INHERITED",
+        dart2jsCode: "*fatal*",
         severity: Severity.errorLegacyWarning,
         message:
             r"""Can't declare a member that conflicts with an inherited one.""");
@@ -1998,7 +2017,9 @@
 const Code<Message Function(String name)> codeDuplicatedParameterName =
     const Code<Message Function(String name)>(
         "DuplicatedParameterName", templateDuplicatedParameterName,
-        analyzerCode: "DUPLICATE_DEFINITION", dart2jsCode: "*fatal*");
+        analyzerCode: "DUPLICATE_DEFINITION",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedParameterName(String name) {
@@ -2115,6 +2136,26 @@
     tip: r"""Try re-writing the expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)> templateExpectedAfterButGot =
+    const Template<Message Function(String string)>(
+        messageTemplate: r"""Expected '#string' after this.""",
+        withArguments: _withArgumentsExpectedAfterButGot);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeExpectedAfterButGot =
+    const Code<Message Function(String string)>(
+        "ExpectedAfterButGot", templateExpectedAfterButGot,
+        analyzerCode: "EXPECTED_TOKEN",
+        dart2jsCode: "MISSING_TOKEN_AFTER_THIS");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExpectedAfterButGot(String string) {
+  return new Message(codeExpectedAfterButGot,
+      message: """Expected '${string}' after this.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedAnInitializer = messageExpectedAnInitializer;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2665,9 +2706,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFactoryNotSync = const MessageCode("FactoryNotSync",
-    analyzerCode: "NON_SYNC_FACTORY_METHOD",
+    analyzerCode: "NON_SYNC_FACTORY",
     dart2jsCode: "*ignored*",
-    message: r"""Factories can't use 'async', 'async*', or 'sync*'.""");
+    message: r"""Factory bodies can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFactoryTopLevelDeclaration =
@@ -2841,6 +2882,8 @@
     const Code<Message Function(String name)>(
         "FinalInstanceVariableAlreadyInitialized",
         templateFinalInstanceVariableAlreadyInitialized,
+        analyzerCode: "FINAL_INITIALIZED_MULTIPLE_TIMES",
+        dart2jsCode: "*fatal*",
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2876,6 +2919,46 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        DartType
+            _type2)> templateForInLoopElementTypeNotAssignable = const Template<
+        Message Function(DartType _type, DartType _type2)>(
+    messageTemplate:
+        r"""A value of type '#type' can't be assigned to a variable of type '#type2'.""",
+    tipTemplate: r"""Try changing the type of the variable.""",
+    withArguments: _withArgumentsForInLoopElementTypeNotAssignable);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, DartType _type2)>
+    codeForInLoopElementTypeNotAssignable =
+    const Code<Message Function(DartType _type, DartType _type2)>(
+        "ForInLoopElementTypeNotAssignable",
+        templateForInLoopElementTypeNotAssignable,
+        analyzerCode: "FOR_IN_OF_INVALID_ELEMENT_TYPE",
+        dart2jsCode: "*fatal*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopElementTypeNotAssignable(
+    DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
+  String type = '$buffer';
+
+  buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
+  String type2 = '$buffer';
+
+  return new Message(codeForInLoopElementTypeNotAssignable,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""",
+      tip: """Try changing the type of the variable.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeForInLoopExactlyOneVariable =
     messageForInLoopExactlyOneVariable;
 
@@ -2896,6 +2979,42 @@
         r"""Can't assign to this, so it can't be used in a for-in loop.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        DartType
+            _type2)> templateForInLoopTypeNotIterable = const Template<
+        Message Function(DartType _type, DartType _type2)>(
+    messageTemplate:
+        r"""The type '#type' used in the 'for' loop must implement '#type2'.""",
+    withArguments: _withArgumentsForInLoopTypeNotIterable);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, DartType _type2)>
+    codeForInLoopTypeNotIterable =
+    const Code<Message Function(DartType _type, DartType _type2)>(
+        "ForInLoopTypeNotIterable", templateForInLoopTypeNotIterable,
+        analyzerCode: "FOR_IN_OF_INVALID_TYPE", dart2jsCode: "*fatal*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopTypeNotIterable(
+    DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
+  String type = '$buffer';
+
+  buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
+  String type2 = '$buffer';
+
+  return new Message(codeForInLoopTypeNotIterable,
+      message:
+          """The type '${type}' used in the 'for' loop must implement '${type2}'.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFunctionTypeDefaultValue = messageFunctionTypeDefaultValue;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2929,6 +3048,19 @@
     message: r"""'sync*' and 'async*' can't return a value.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeGenericFunctionTypeInBound =
+    messageGenericFunctionTypeInBound;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageGenericFunctionTypeInBound = const MessageCode(
+    "GenericFunctionTypeInBound",
+    analyzerCode: "GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message:
+        r"""Type variables can't have generic function types in their bounds.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateGetterNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Getter not found: '#name'.""",
@@ -3131,6 +3263,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInheritedMembersConflict = const MessageCode(
     "InheritedMembersConflict",
+    analyzerCode: "CONFLICTS_WITH_INHERITED_MEMBER",
+    dart2jsCode: "*fatal*",
     severity: Severity.errorLegacyWarning,
     message: r"""Can't inherit members that conflict with each other.""");
 
@@ -4190,18 +4324,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageListLiteralTooManyTypeArguments = const MessageCode(
     "ListLiteralTooManyTypeArguments",
+    analyzerCode: "EXPECTED_ONE_LIST_TYPE_ARGUMENTS",
+    dart2jsCode: "*fatal*",
     severity: Severity.errorLegacyWarning,
-    message: r"""Too many type arguments on List literal.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeListLiteralTypeArgumentMismatch =
-    messageListLiteralTypeArgumentMismatch;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageListLiteralTypeArgumentMismatch = const MessageCode(
-    "ListLiteralTypeArgumentMismatch",
-    severity: Severity.errorLegacyWarning,
-    message: r"""Map literal requires two type arguments.""");
+    message: r"""List literal requires exactly one type argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -4235,6 +4361,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLoadLibraryTakesNoArguments = const MessageCode(
     "LoadLibraryTakesNoArguments",
+    analyzerCode: "LOAD_LIBRARY_TAKES_NO_ARGUMENTS",
+    dart2jsCode: "*fatal*",
     severity: Severity.errorLegacyWarning,
     message: r"""'loadLibrary' takes no arguments.""");
 
@@ -4285,6 +4413,18 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMapLiteralTypeArgumentMismatch =
+    messageMapLiteralTypeArgumentMismatch;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMapLiteralTypeArgumentMismatch = const MessageCode(
+    "MapLiteralTypeArgumentMismatch",
+    analyzerCode: "EXPECTED_TWO_MAP_TYPE_ARGUMENTS",
+    dart2jsCode: "*fatal*",
+    severity: Severity.errorLegacyWarning,
+    message: r"""Map literal requires exactly two type arguments.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMemberWithSameNameAsClass =
     messageMemberWithSameNameAsClass;
 
@@ -4781,6 +4921,31 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNonConstConstructor = messageNonConstConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNonConstConstructor = const MessageCode(
+    "NonConstConstructor",
+    analyzerCode: "NOT_CONSTANT_EXPRESSION",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message:
+        r"""Cannot invoke a non-'const' constructor where a const expression is expected.""",
+    tip: r"""Try using a constructor or factory that is 'const'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNonConstFactory = messageNonConstFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNonConstFactory = const MessageCode("NonConstFactory",
+    analyzerCode: "NOT_CONSTANT_EXPRESSION",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message:
+        r"""Cannot invoke a non-'const' factory where a const expression is expected.""",
+    tip: r"""Try using a constructor or factory that is 'const'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonInstanceTypeVariableUse =
     messageNonInstanceTypeVariableUse;
 
@@ -4850,6 +5015,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNotAConstantExpression = messageNotAConstantExpression;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNotAConstantExpression = const MessageCode(
+    "NotAConstantExpression",
+    analyzerCode: "NOT_CONSTANT_EXPRESSION",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message: r"""Not a constant expression.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         Token token,
@@ -4906,6 +5082,25 @@
     const MessageCode("NotAnLvalue", message: r"""Can't assign to this.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)> templateNotConstantExpression =
+    const Template<Message Function(String string)>(
+        messageTemplate: r"""#string is not a constant expression.""",
+        withArguments: _withArgumentsNotConstantExpression);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeNotConstantExpression =
+    const Code<Message Function(String string)>(
+        "NotConstantExpression", templateNotConstantExpression,
+        analyzerCode: "NOT_CONSTANT_EXPRESSION", dart2jsCode: "*fatal*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNotConstantExpression(String string) {
+  return new Message(codeNotConstantExpression,
+      message: """${string} is not a constant expression.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeOnlyTry = messageOnlyTry;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5912,6 +6107,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperAsExpression = const MessageCode(
     "SuperAsExpression",
+    analyzerCode: "SUPER_AS_EXPRESSION",
+    dart2jsCode: "*fatal*",
     message: r"""Can't use 'super' as an expression.""",
     tip:
         r"""To delegate a constructor to a super constructor, put the super call as an initializer.""");
@@ -6143,9 +6340,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeThisAccessInFieldInitializer =
     const Code<Message Function(String name)>(
-  "ThisAccessInFieldInitializer",
-  templateThisAccessInFieldInitializer,
-);
+        "ThisAccessInFieldInitializer", templateThisAccessInFieldInitializer,
+        analyzerCode: "THIS_ACCESS_FROM_INITIALIZER", dart2jsCode: "*fatal*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsThisAccessInFieldInitializer(String name) {
@@ -6356,6 +6552,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableSameNameAsEnclosing = const MessageCode(
     "TypeVariableSameNameAsEnclosing",
+    analyzerCode: "CONFLICTING_TYPE_VARIABLE_AND_CLASS",
+    dart2jsCode: "*fatal*",
     message:
         r"""A type variable can't have the same name as its enclosing declaration.""");
 
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 f9430d9..1f5e6b5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -933,7 +933,7 @@
       int offset = builder.body?.fileOffset ?? builder.charOffset;
       constructor.initializers.add(buildInvalidInitializer(
           deprecated_buildCompileTimeError(
-              "A constructor can't be '${asyncModifier}'.", offset),
+              null, offset, fasta.messageConstructorNotSync),
           offset));
     }
     if (needsImplicitSuperInitializer) {
@@ -1518,7 +1518,7 @@
           classBuilder.origin.findStaticBuilder(name, charOffset, uri, library);
     }
     if (declaration != null && member.isField && declaration.isInstanceMember) {
-      return new IncompleteErrorGenerator(this, token,
+      return new IncompleteErrorGenerator(this, token, declaration.target,
           fasta.templateThisAccessInFieldInitializer.withArguments(name));
     }
     if (declaration == null ||
@@ -1542,16 +1542,16 @@
       if (constantContext != ConstantContext.none &&
           declaration.isTypeVariable &&
           !member.isConstructor) {
-        deprecated_addCompileTimeError(
-            charOffset, "Not a constant expression.");
+        addCompileTimeError(
+            fasta.messageNotAConstantExpression, charOffset, token.length);
       }
       return new TypeUseGenerator(this, token, declaration, name);
     } else if (declaration.isLocal) {
       if (constantContext != ConstantContext.none &&
           !declaration.isConst &&
           !member.isConstructor) {
-        deprecated_addCompileTimeError(
-            charOffset, "Not a constant expression.");
+        addCompileTimeError(
+            fasta.messageNotAConstantExpression, charOffset, token.length);
       }
       // An initializing formal parameter might be final without its
       // VariableDeclaration being final. See
@@ -1578,8 +1578,8 @@
           // semantics, such parameters introduces a new parameter with that
           // name that should be resolved here.
           !member.isConstructor) {
-        deprecated_addCompileTimeError(
-            charOffset, "Not a constant expression.");
+        addCompileTimeError(
+            fasta.messageNotAConstantExpression, charOffset, token.length);
       }
       Name n = new Name(name, library.library);
       Member getter;
@@ -1619,8 +1619,8 @@
         if (!(readTarget is Field && readTarget.isConst ||
             // Static tear-offs are also compile time constants.
             readTarget is Procedure)) {
-          deprecated_addCompileTimeError(
-              charOffset, "Not a constant expression.");
+          addCompileTimeError(
+              fasta.messageNotAConstantExpression, charOffset, token.length);
         }
       }
       return generator;
@@ -1810,10 +1810,16 @@
       // one variable it must be followed by `in`.
       if (isConst) {
         initializer = deprecated_buildCompileTimeError(
-            "A 'const' variable must be initialized.", token.charOffset);
+            null,
+            token.charOffset,
+            fasta.templateConstFieldWithoutInitializer
+                .withArguments(token.lexeme));
       } else if (isFinal) {
         initializer = deprecated_buildCompileTimeError(
-            "A 'final' variable must be initialized.", token.charOffset);
+            null,
+            token.charOffset,
+            fasta.templateFinalFieldWithoutInitializer
+                .withArguments(token.lexeme));
       }
     }
     pushNewLocalVariable(initializer);
@@ -1893,17 +1899,25 @@
       }
       push(variable);
     } else {
-      List<VariableDeclaration> variables = popList(count,
-          new List<VariableDeclaration>.filled(count, null, growable: true));
+      List<VariableDeclarationJudgment> variables = popList(
+          count,
+          new List<VariableDeclarationJudgment>.filled(count, null,
+              growable: true));
       constantContext = pop();
       currentLocalVariableType = pop();
       currentLocalVariableModifiers = pop();
       List<Expression> annotations = pop();
       if (annotations != null) {
-        for (VariableDeclaration variable in variables) {
+        bool isFirstVariable = true;
+        for (VariableDeclarationJudgment variable in variables) {
           for (Expression annotation in annotations) {
             variable.addAnnotation(annotation);
           }
+          if (isFirstVariable) {
+            isFirstVariable = false;
+          } else {
+            variable.infersAnnotations = false;
+          }
         }
       }
       push(forest.variablesDeclaration(variables, uri));
@@ -2114,7 +2128,7 @@
     if (typeArguments != null) {
       if (forest.getTypeCount(typeArguments) != 2) {
         addProblem(
-            fasta.messageListLiteralTypeArgumentMismatch,
+            fasta.messageMapLiteralTypeArgumentMismatch,
             offsetForToken(leftBrace),
             lengthOfSpan(leftBrace, leftBrace.endGroup));
       } else {
@@ -2199,7 +2213,8 @@
       }
     }
     if (name is Generator) {
-      push(name.buildTypeWithBuiltArguments(arguments));
+      push(name.buildTypeWithBuiltArguments(arguments,
+          typeInferrer: _typeInferrer));
     } else if (name is TypeBuilder) {
       push(name.build(library));
     } else {
@@ -2221,6 +2236,8 @@
       ScopeBuilder scopeBuilder = new ScopeBuilder(scope);
       for (KernelTypeVariableBuilder builder in typeVariables) {
         String name = builder.name;
+        builder.binder = _typeInferrer.binderForTypeVariable(
+            builder, builder.charOffset, name);
         KernelTypeVariableBuilder existing = scopeBuilder[name];
         if (existing == null) {
           scopeBuilder.addMember(name, builder);
@@ -2241,6 +2258,7 @@
     DartType returnType = pop();
     List<TypeParameter> typeVariables = typeVariableBuildersToKernel(pop());
     FunctionType type = formals.toFunctionType(returnType, typeVariables);
+    _typeInferrer.functionType(functionToken.offset, type);
     exitLocalScope();
     push(type);
   }
@@ -2248,7 +2266,9 @@
   @override
   void handleVoidKeyword(Token token) {
     debugEvent("VoidKeyword");
-    push(const VoidType());
+    var type = const VoidType();
+    _typeInferrer.voidType(token.offset, token, type);
+    push(type);
   }
 
   @override
@@ -2257,8 +2277,10 @@
     DartType type = pop();
     Expression expression = popForValue();
     if (constantContext != ConstantContext.none) {
-      push(deprecated_buildCompileTimeError(
-          "Not a constant expression.", operator.charOffset));
+      push(buildCompileTimeError(
+          fasta.templateNotConstantExpression.withArguments('As expression'),
+          operator.charOffset,
+          operator.length));
     } else {
       push(forest.asExpression(expression, type, operator));
     }
@@ -2277,8 +2299,10 @@
           type, functionNestingLevel);
     }
     if (constantContext != ConstantContext.none) {
-      push(deprecated_buildCompileTimeError(
-          "Not a constant expression.", isOperator.charOffset));
+      push(buildCompileTimeError(
+          fasta.templateNotConstantExpression.withArguments('Is expression'),
+          isOperator.charOffset,
+          isOperator.length));
     } else {
       push(isExpression);
     }
@@ -2315,14 +2339,17 @@
   void handleThrowExpression(Token throwToken, Token endToken) {
     debugEvent("ThrowExpression");
     Expression expression = popForValue();
+
+    Expression error;
     if (constantContext != ConstantContext.none) {
-      push(deprecated_buildCompileTimeError(
-          "Not a constant expression.", throwToken.charOffset));
-      // TODO(brianwilkerson): For analyzer, we need to produce the error above
-      // but then we need to produce the AST as in the `else` clause below.
-    } else {
-      push(forest.throwExpression(throwToken, expression));
+      error = buildCompileTimeError(
+          fasta.templateNotConstantExpression.withArguments('Throw'),
+          throwToken.offset,
+          throwToken.length);
     }
+
+    push(new ThrowJudgment(throwToken, expression, desugaredError: error)
+      ..fileOffset = offsetForToken(throwToken));
   }
 
   @override
@@ -2411,7 +2438,7 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter() {
+  void endFunctionTypedFormalParameter(Token nameToken) {
     debugEvent("FunctionTypedFormalParameter");
     if (inCatchClause || functionNestingLevel != 0) {
       exitLocalScope();
@@ -2420,6 +2447,7 @@
     DartType returnType = pop();
     List<TypeParameter> typeVariables = typeVariableBuildersToKernel(pop());
     FunctionType type = formals.toFunctionType(returnType, typeVariables);
+    _typeInferrer.functionTypedFormalParameter(nameToken.offset, type);
     exitLocalScope();
     push(type);
     functionNestingLevel--;
@@ -2725,7 +2753,9 @@
 
   @override
   Expression buildStaticInvocation(Member target, Arguments arguments,
-      {Constness constness: Constness.implicit, int charOffset: -1}) {
+      {Constness constness: Constness.implicit,
+      int charOffset: -1,
+      Expression error}) {
     // The argument checks for the initial target of redirecting factories
     // invocations are skipped in Dart 1.
     if (library.loader.target.strongMode || !isRedirectingFactory(target)) {
@@ -2737,13 +2767,20 @@
       LocatedMessage argMessage = checkArgumentsForFunction(
           target.function, arguments, charOffset, typeParameters);
       if (argMessage != null) {
-        return new SyntheticExpressionJudgment(throwNoSuchMethodError(
+        var error = throwNoSuchMethodError(
             forest.literalNull(null)..fileOffset = charOffset,
             target.name.name,
             arguments,
             charOffset,
             candidate: target,
-            argMessage: argMessage));
+            argMessage: argMessage);
+        if (target is Constructor) {
+          return new InvalidConstructorInvocationJudgment(
+              error, target, arguments)
+            ..fileOffset = charOffset;
+        } else {
+          return new SyntheticExpressionJudgment(error);
+        }
       }
     }
 
@@ -2754,7 +2791,7 @@
       if ((isConst || constantContext == ConstantContext.inferred) &&
           !target.isConst) {
         return deprecated_buildCompileTimeError(
-            "Not a const constructor.", charOffset);
+            null, charOffset, fasta.messageNonConstConstructor);
       }
       return new ConstructorInvocationJudgment(
           target, forest.castArguments(arguments),
@@ -2768,7 +2805,7 @@
         if ((isConst || constantContext == ConstantContext.inferred) &&
             !procedure.isConst) {
           return deprecated_buildCompileTimeError(
-              "Not a const factory.", charOffset);
+              null, charOffset, fasta.messageNonConstFactory);
         }
         return new FactoryConstructorInvocationJudgment(
             target, forest.castArguments(arguments),
@@ -2777,7 +2814,7 @@
       } else {
         return new StaticInvocationJudgment(
             target, forest.castArguments(arguments),
-            isConst: isConst)
+            desugaredError: error, isConst: isConst)
           ..fileOffset = charOffset;
       }
     }
@@ -2864,8 +2901,10 @@
     debugEvent("beginNewExpression");
     super.push(constantContext);
     if (constantContext != ConstantContext.none) {
-      deprecated_addCompileTimeError(
-          token.charOffset, "Not a constant expression.");
+      addCompileTimeError(
+          fasta.templateNotConstantExpression.withArguments('New expression'),
+          token.charOffset,
+          token.length);
     }
     constantContext = ConstantContext.none;
   }
@@ -3054,7 +3093,7 @@
       push(new ThisAccessGenerator(this, token, inInitializer));
     } else {
       push(new IncompleteErrorGenerator(
-          this, token, fasta.messageThisAsIdentifier));
+          this, token, null, fasta.messageThisAsIdentifier));
     }
   }
 
@@ -3067,7 +3106,7 @@
       push(new ThisAccessGenerator(this, token, inInitializer, isSuper: true));
     } else {
       push(new IncompleteErrorGenerator(
-          this, token, fasta.messageSuperAsIdentifier));
+          this, token, null, fasta.messageSuperAsIdentifier));
     }
   }
 
@@ -3247,7 +3286,7 @@
       ..fileEndOffset = token.charOffset);
     if (constantContext != ConstantContext.none) {
       push(deprecated_buildCompileTimeError(
-          "Not a constant expression.", formals.charOffset));
+          null, formals.charOffset, fasta.messageNotAConstantExpression));
     } else {
       push(new FunctionExpressionJudgment(function)
         ..fileOffset = offsetForToken(beginToken));
@@ -3776,8 +3815,9 @@
       // Assume an error is reported elsewhere.
       variable = new KernelTypeVariableBuilder(
           name.name, library, offsetForToken(name.token), null);
+      variable.binder = _typeInferrer.binderForTypeVariable(
+          variable, variable.charOffset, variable.name);
     }
-    storeTypeUse(offsetForToken(token), variable.target);
     if (annotations != null) {
       _typeInferrer.inferMetadata(this, factory, annotations);
       for (Expression annotation in annotations) {
@@ -3858,7 +3898,10 @@
         growable: true);
     int i = 0;
     for (KernelTypeVariableBuilder builder in typeVariableBuilders) {
-      typeParameters[i++] = builder.target;
+      var typeParameter = builder.target;
+      _typeInferrer.typeVariableDeclaration(
+          builder.charOffset, builder.binder, typeParameter);
+      typeParameters[i++] = typeParameter;
     }
     return typeParameters;
   }
@@ -3871,9 +3914,10 @@
 
   @override
   Expression deprecated_buildCompileTimeError(String error,
-      [int charOffset = -1]) {
-    return new SyntheticExpressionJudgment(buildCompileTimeError(
-        fasta.templateUnspecified.withArguments(error), charOffset, noLength));
+      [int charOffset = -1, fasta.Message message]) {
+    message ??= fasta.templateUnspecified.withArguments(error);
+    return new SyntheticExpressionJudgment(
+        buildCompileTimeError(message, charOffset, noLength));
   }
 
   @override
@@ -3947,9 +3991,9 @@
   }
 
   Statement deprecated_buildCompileTimeErrorStatement(error,
-      [int charOffset = -1]) {
+      [int charOffset = -1, fasta.Message message]) {
     return new ExpressionStatementJudgment(
-        deprecated_buildCompileTimeError(error, charOffset), null);
+        deprecated_buildCompileTimeError(error, charOffset, message), null);
   }
 
   Statement buildCompileTimeErrorStatement(Message message, int charOffset,
@@ -3977,15 +4021,16 @@
       ..fileOffset = charOffset;
   }
 
-  Initializer buildDuplicatedInitializer(
+  Initializer buildDuplicatedInitializer(Field field, Expression value,
       String name, int offset, int previousInitializerOffset) {
-    Initializer initializer = buildInvalidInitializer(
-        deprecated_buildCompileTimeError(
-            "'$name' has already been initialized.", offset),
-        offset);
-    deprecated_addCompileTimeError(
-        initializedFields[name], "'$name' was initialized here.");
-    return initializer;
+    var error = buildCompileTimeError(
+        fasta.templateFinalInstanceVariableAlreadyInitialized
+            .withArguments(name),
+        offset,
+        noLength);
+    return new ShadowInvalidFieldInitializer(
+        field, value, new VariableDeclaration.forValue(error))
+      ..fileOffset = offset;
   }
 
   /// Parameter [formalType] should only be passed in the special case of
@@ -4007,7 +4052,7 @@
       initializedFields ??= <String, int>{};
       if (initializedFields.containsKey(name)) {
         return buildDuplicatedInitializer(
-            name, offset, initializedFields[name]);
+            builder.field, expression, name, offset, initializedFields[name]);
       }
       initializedFields[name] = offset;
       if (builder.isFinal && builder.hasInitializer) {
@@ -4025,14 +4070,16 @@
             ]);
         Declaration constructor =
             library.loader.getDuplicatedFieldInitializerError();
-        return buildInvalidInitializer(
-            new Throw(buildStaticInvocation(
+        return new ShadowInvalidFieldInitializer(
+            builder.field,
+            expression,
+            new VariableDeclaration.forValue(new Throw(buildStaticInvocation(
                 constructor.target,
                 forest.arguments(<Expression>[
                   forest.literalString(name, null)..fileOffset = offset
                 ], noLocation),
-                charOffset: offset)),
-            offset);
+                charOffset: offset))))
+          ..fileOffset = offset;
       } else {
         if (library.loader.target.strongMode &&
             formalType != null &&
@@ -4117,12 +4164,12 @@
   }
 
   @override
-  void deprecated_addCompileTimeError(int charOffset, String message,
-      {bool wasHandled: false}) {
+  void deprecated_addCompileTimeError(int charOffset, String error,
+      {fasta.Message message, bool wasHandled: false}) {
     // TODO(ahe): Consider setting [constantContext] to `ConstantContext.none`
     // to avoid a long list of errors.
     return library.addCompileTimeError(
-        fasta.templateUnspecified.withArguments(message),
+        message ?? fasta.templateUnspecified.withArguments(error),
         charOffset,
         noLength,
         uri,
@@ -4137,8 +4184,8 @@
       push(forest.block(
           token,
           <Statement>[
-            deprecated_buildCompileTimeErrorStatement(
-                "Expected '{'.", token.charOffset)
+            deprecated_buildCompileTimeErrorStatement(null, token.charOffset,
+                fasta.templateExpectedFunctionBody.withArguments(token))
           ],
           null));
     }
@@ -4188,14 +4235,18 @@
   @override
   Expression buildMethodInvocation(
       Expression receiver, Name name, Arguments arguments, int offset,
-      {bool isConstantExpression: false,
+      {Expression error,
+      bool isConstantExpression: false,
       bool isNullAware: false,
       bool isImplicitCall: false,
       bool isSuper: false,
       Member interfaceTarget}) {
     if (constantContext != ConstantContext.none && !isConstantExpression) {
-      return deprecated_buildCompileTimeError(
-          "Not a constant expression.", offset);
+      error = buildCompileTimeError(
+          fasta.templateNotConstantExpression
+              .withArguments('Method invocation'),
+          offset,
+          name.name.length);
     }
     if (isSuper) {
       // We can ignore [isNullAware] on super sends.
@@ -4214,15 +4265,17 @@
               name.name.length);
         }
         return new SuperMethodInvocationJudgment(
-            name, forest.castArguments(arguments), target)
+            name, forest.castArguments(arguments),
+            interfaceTarget: target, desugaredError: error)
           ..fileOffset = offset;
       }
 
-      receiver = new SuperPropertyGetJudgment(name, target)
+      receiver = new SuperPropertyGetJudgment(name,
+          interfaceTarget: target, desugaredError: error)
         ..fileOffset = offset;
       return new MethodInvocationJudgment(
           receiver, callName, forest.castArguments(arguments),
-          isImplicitCall: true)
+          isImplicitCall: true, desugaredError: error)
         ..fileOffset = forest.readOffset(arguments);
     }
 
@@ -4238,12 +4291,15 @@
               new MethodInvocation(new VariableGet(variable), name,
                   forest.castArguments(arguments), interfaceTarget)
                 ..fileOffset = offset)
-            ..fileOffset = offset)
+            ..fileOffset = offset,
+          desugaredError: error)
         ..fileOffset = offset;
     } else {
       return new MethodInvocationJudgment(
           receiver, name, forest.castArguments(arguments),
-          isImplicitCall: isImplicitCall, interfaceTarget: interfaceTarget)
+          isImplicitCall: isImplicitCall,
+          interfaceTarget: interfaceTarget,
+          desugaredError: error)
         ..fileOffset = offset;
     }
   }
@@ -4327,6 +4383,11 @@
   void storeTypeUse(int offset, Node node) {
     _typeInferrer.storeTypeUse(offset, node);
   }
+
+  @override
+  void storeUnresolvedPrefix(Token token) {
+    _typeInferrer.storePrefix(token, null);
+  }
 }
 
 class Identifier {
@@ -4559,20 +4620,26 @@
     Map<String, Declaration> local = <String, Declaration>{};
 
     for (VariableDeclaration parameter in required) {
-      if (local[parameter.name] != null) {
-        helper.deprecated_addCompileTimeError(
-            parameter.fileOffset, "Duplicated name.");
+      String name = parameter.name;
+      if (local[name] != null) {
+        helper.addProblem(
+            fasta.templateDuplicatedParameterName.withArguments(name),
+            parameter.fileOffset,
+            name.length);
       }
-      local[parameter.name] = new KernelVariableBuilder(
+      local[name] = new KernelVariableBuilder(
           parameter, declaration, declaration.fileUri);
     }
     if (optional != null) {
       for (VariableDeclaration parameter in optional.formals) {
-        if (local[parameter.name] != null) {
-          helper.deprecated_addCompileTimeError(
-              parameter.fileOffset, "Duplicated name.");
+        String name = parameter.name;
+        if (local[name] != null) {
+          helper.addProblem(
+              fasta.templateDuplicatedParameterName.withArguments(name),
+              parameter.fileOffset,
+              name.length);
         }
-        local[parameter.name] = new KernelVariableBuilder(
+        local[name] = new KernelVariableBuilder(
             parameter, declaration, declaration.fileUri);
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 104f94f..48ac12e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -16,6 +16,7 @@
         messageCantUsePrefixAsExpression,
         messageCantUsePrefixWithNullAware,
         messageInvalidInitializer,
+        messageNotAConstantExpression,
         templateCantUseDeferredPrefixAsConstant,
         templateDeferredTypeAnnotation,
         templateIntegerLiteralIsOutOfRange,
@@ -43,6 +44,8 @@
 
 import '../problems.dart' show unhandled, unsupported;
 
+import '../type_inference/type_inferrer.dart' show TypeInferrer;
+
 import 'constness.dart' show Constness;
 
 import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
@@ -64,23 +67,30 @@
         DynamicType,
         Expression,
         Initializer,
+        InvalidConstructorInvocationJudgment,
         InvalidType,
         Member,
         Name,
         Procedure,
         SyntheticExpressionJudgment,
+        TreeNode,
         TypeParameterType,
+        UnresolvedVariableUnaryJudgment,
         VariableDeclaration;
 
 import 'kernel_builder.dart'
     show
         AccessErrorBuilder,
         BuiltinTypeBuilder,
+        ClassBuilder,
         Declaration,
+        DynamicTypeBuilder,
         FunctionTypeAliasBuilder,
+        InvalidTypeBuilder,
         KernelClassBuilder,
         KernelFunctionTypeAliasBuilder,
-        KernelTypeVariableBuilder;
+        KernelTypeVariableBuilder,
+        TypeVariableBuilder;
 
 import 'kernel_expression_generator.dart'
     show IncompleteSendGenerator, SendAccessGenerator;
@@ -202,8 +212,8 @@
     } else {
       if (helper.constantContext != ConstantContext.none &&
           send.name != lengthName) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token), "Not a constant expression.");
+        helper.addCompileTimeError(
+            messageNotAConstantExpression, offsetForToken(token), token.length);
       }
       return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
           send.name, null, null, isNullAware);
@@ -211,7 +221,7 @@
   }
 
   DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
+      {bool nonInstanceAccessIsError: false, TypeInferrer typeInferrer}) {
     helper.addProblem(templateNotAType.withArguments(token.lexeme),
         offsetForToken(token), lengthForToken(token));
     return const InvalidType();
@@ -227,11 +237,14 @@
       assert(forest.argumentsTypeArguments(arguments).isEmpty);
       forest.argumentsSetTypeArguments(arguments, typeArguments);
     }
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
+    helper.storeTypeUse(offsetForToken(token), const InvalidType());
+    var error = helper.throwNoSuchMethodError(
         forest.literalNull(token),
         name == "" ? plainNameForRead : "${plainNameForRead}.$name",
         arguments,
-        nameToken.charOffset));
+        nameToken.charOffset);
+
+    return new InvalidConstructorInvocationJudgment(error, null, arguments);
   }
 
   bool get isThisPropertyAccess => false;
@@ -502,7 +515,7 @@
 
   @override
   DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
+      {bool nonInstanceAccessIsError: false, TypeInferrer typeInferrer}) {
     helper.addProblem(
         templateDeferredTypeAnnotation.withArguments(
             suffixGenerator.buildTypeWithBuiltArguments(arguments,
@@ -554,7 +567,8 @@
 
   @override
   DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
+      {bool nonInstanceAccessIsError: false, TypeInferrer typeInferrer}) {
+    var declaration = this.declaration;
     if (arguments != null) {
       int expected = 0;
       if (declaration is KernelClassBuilder) {
@@ -600,6 +614,28 @@
       type =
           declaration.buildTypesWithBuiltArguments(helper.library, arguments);
     }
+    TreeNode declarationTarget;
+    Object declarationBinder;
+    if (declaration is KernelTypeVariableBuilder &&
+        declaration.binder != null) {
+      declarationBinder = declaration.binder;
+    } else if (declaration is DynamicTypeBuilder ||
+        declaration is InvalidTypeBuilder) {
+      // There's no target associated with these types, so we have to let
+      // the analyzer fill it in.
+    } else if (declaration is ClassBuilder ||
+        declaration is TypeVariableBuilder ||
+        declaration is FunctionTypeAliasBuilder) {
+      declarationTarget = declaration.target;
+    } else {
+      return unhandled(
+          "${declaration.runtimeType}",
+          "TypeUseGenerator.buildTypeWithBuiltArguments",
+          offsetForToken(token),
+          helper.uri);
+    }
+    typeInferrer?.storeTypeReference(
+        token.charOffset, declarationTarget, declarationBinder, type);
     if (type is TypeParameterType) {
       return helper.validatedTypeVariableUse(
           type, offsetForToken(token), nonInstanceAccessIsError);
@@ -713,25 +749,25 @@
   @override
   Expression buildPrefixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
-    // TODO(ahe): For the Analyzer, we probably need to build a prefix
-    // increment node that wraps an error.
-    return new SyntheticExpressionJudgment(buildError(
+    var error = buildError(
         forest.arguments(
             <Expression>[forest.literalInt(1, null)..fileOffset = offset],
             token),
-        isGetter: true));
+        isGetter: true);
+    return new UnresolvedVariableUnaryJudgment(error, token)
+      ..fileOffset = offset;
   }
 
   @override
   Expression buildPostfixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
-    // TODO(ahe): For the Analyzer, we probably need to build a post increment
-    // node that wraps an error.
-    return new SyntheticExpressionJudgment(buildError(
+    var error = buildError(
         forest.arguments(
             <Expression>[forest.literalInt(1, null)..fileOffset = offset],
             token),
-        isGetter: true));
+        isGetter: true);
+    return new UnresolvedVariableUnaryJudgment(error, token)
+      ..fileOffset = offset;
   }
 
   @override
@@ -761,11 +797,13 @@
   @override
   Expression invokeConstructor(List<DartType> typeArguments, String name,
       Arguments arguments, Token nameToken, Constness constness) {
+    helper.storeTypeUse(offsetForToken(token), const InvalidType());
     if (typeArguments != null) {
       assert(forest.argumentsTypeArguments(arguments).isEmpty);
       forest.argumentsSetTypeArguments(arguments, typeArguments);
     }
-    return new SyntheticExpressionJudgment(buildError(arguments));
+    var error = buildError(arguments);
+    return new InvalidConstructorInvocationJudgment(error, null, arguments);
   }
 }
 
@@ -799,6 +837,7 @@
 
   @override
   /* Expression | Generator */ Object prefixedLookup(Token name) {
+    helper.storeUnresolvedPrefix(token);
     return new UnexpectedQualifiedUseGenerator(helper, name, this, true);
   }
 }
@@ -910,7 +949,7 @@
   Expression handleAssignment(bool voidContext) {
     if (helper.constantContext != ConstantContext.none) {
       return helper.deprecated_buildCompileTimeError(
-          "Not a constant expression.", offsetForToken(token));
+          null, offsetForToken(token), messageNotAConstantExpression);
     }
     if (identical("=", assignmentOperator)) {
       return generator.buildAssignment(value, voidContext: voidContext);
@@ -1133,7 +1172,7 @@
 
   @override
   DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
+      {bool nonInstanceAccessIsError: false, TypeInferrer typeInferrer}) {
     Template<Message Function(Token, Token)> template = isUnresolved
         ? templateUnresolvedPrefixInTypeAnnotation
         : templateNotAPrefixInTypeAnnotation;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 2a554c6..e8b0d48 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -77,7 +77,8 @@
 
   Expression wrapInCompileTimeError(Expression expression, Message message);
 
-  Expression deprecated_buildCompileTimeError(String error, [int offset]);
+  Expression deprecated_buildCompileTimeError(String error,
+      [int offset, Message message]);
 
   Initializer buildInvalidInitializer(Expression expression, [int offset]);
 
@@ -94,7 +95,7 @@
       [int charOffset = -1]);
 
   Expression buildStaticInvocation(Procedure target, Arguments arguments,
-      {Constness constness, int charOffset});
+      {Constness constness, int charOffset, Expression error});
 
   Expression buildProblemExpression(
       ProblemBuilder builder, int offset, int length);
@@ -125,7 +126,8 @@
 
   Expression buildMethodInvocation(
       Expression receiver, Name name, Arguments arguments, int offset,
-      {bool isConstantExpression,
+      {Expression error,
+      bool isConstantExpression,
       bool isNullAware,
       bool isImplicitCall,
       bool isSuper,
@@ -143,6 +145,9 @@
   DartType validatedTypeVariableUse(
       TypeParameterType type, int offset, bool nonInstanceAccessIsError);
 
+  void addCompileTimeError(Message message, int charOffset, int length,
+      {List<LocatedMessage> context});
+
   void addProblem(Message message, int charOffset, int length);
 
   void addProblemErrorIfConst(Message message, int charOffset, int length);
@@ -163,4 +168,6 @@
       Arguments arguments, Expression expression);
 
   void storeTypeUse(int offset, Node node);
+
+  void storeUnresolvedPrefix(Token token);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/factory.dart b/pkg/front_end/lib/src/fasta/kernel/factory.dart
index 7018d22..2976ba9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/factory.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.
 
-import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
+import 'package:kernel/ast.dart'
+    show Catch, DartType, FunctionType, Node, TypeParameter;
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
@@ -15,6 +16,8 @@
         StatementJudgment,
         SwitchCaseJudgment;
 
+import 'kernel_type_variable_builder.dart' show KernelTypeVariableBuilder;
+
 /// Abstract base class for factories that can construct trees of expressions,
 /// statements, initializers, and literal types based on tokens, inferred types,
 /// and invocation targets.
@@ -51,6 +54,21 @@
   Expression awaitExpression(ExpressionJudgment judgment, int fileOffset,
       Token awaitKeyword, Expression expression, DartType inferredType);
 
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name);
+
+  Object binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name);
+
+  Object binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name);
+
+  Object binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name);
+
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name);
+
   Statement block(StatementJudgment judgment, int fileOffset, Token leftBracket,
       List<Statement> statements, Token rightBracket);
 
@@ -183,12 +201,13 @@
   Statement functionDeclaration(
       covariant Object binder, FunctionType inferredType);
 
-  Object binderForFunctionDeclaration(
-      StatementJudgment judgment, int fileOffset, String name);
-
   Expression functionExpression(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType);
 
+  Object functionType(int fileOffset, DartType type);
+
+  Object functionTypedFormalParameter(int fileOffset, DartType type);
+
   Expression ifNull(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -237,11 +256,6 @@
 
   Statement labeledStatement(List<Object> labels, Statement statement);
 
-  Object statementLabel(covariant Object binder, Token label, Token colon);
-
-  Object binderForStatementLabel(
-      StatementJudgment judgment, int fileOffset, String name);
-
   Expression listLiteral(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -333,6 +347,8 @@
   Statement returnStatement(StatementJudgment judgment, int fileOffset,
       Token returnKeyword, Expression expression, Token semicolon);
 
+  Object statementLabel(covariant Object binder, Token label, Token colon);
+
   Expression staticAssign(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -353,6 +369,12 @@
       Substitution substitution,
       DartType inferredType);
 
+  /// TODO(paulberry): this isn't really shaped properly for a factory class.
+  void storeClassReference(int fileOffset, Node reference, DartType rawType);
+
+  /// TODO(paulberry): this isn't really shaped properly for a factory class.
+  void storePrefixInfo(int fileOffset, int prefixImportIndex);
+
   Expression stringConcatenation(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType);
 
@@ -377,9 +399,6 @@
 
   Object switchLabel(covariant Object binder, Token label, Token colon);
 
-  Object binderForSwitchLabel(
-      SwitchCaseJudgment judgment, int fileOffset, String name);
-
   Statement switchStatement(
       StatementJudgment judgment,
       int fileOffset,
@@ -419,6 +438,18 @@
   Expression typeLiteral(ExpressionJudgment judgment, int fileOffset,
       Node expressionType, DartType inferredType);
 
+  Type typeReference(
+      int fileOffset,
+      Token leftBracket,
+      List<Type> typeArguments,
+      Token rightBracket,
+      Node reference,
+      covariant Object binder,
+      DartType type);
+
+  Object typeVariableDeclaration(
+      int fileOffset, covariant Object binder, TypeParameter typeParameter);
+
   Expression variableAssign(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -430,9 +461,6 @@
   Statement variableDeclaration(
       covariant Object binder, DartType statementType, DartType inferredType);
 
-  Object binderForVariableDeclaration(
-      StatementJudgment judgment, int fileOffset, String name);
-
   Expression variableGet(ExpressionJudgment judgment, int fileOffset,
       bool isInCascade, covariant Object variableBinder, DartType inferredType);
 
@@ -447,10 +475,4 @@
 
   Statement yieldStatement(StatementJudgment judgment, int fileOffset,
       Token yieldKeyword, Token star, Expression expression, Token semicolon);
-
-  /// TODO(paulberry): this isn't really shaped properly for a factory class.
-  void storePrefixInfo(int fileOffset, int prefixImportIndex);
-
-  /// TODO(paulberry): this isn't really shaped properly for a factory class.
-  void storeClassReference(int fileOffset, Node reference, DartType rawType);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 85c163a..9fcdcb3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -257,8 +257,8 @@
   DartType getTypeAt(List typeArguments, int index) => typeArguments[index];
 
   @override
-  Expression loadLibrary(LibraryDependency dependency) {
-    return new LoadLibraryJudgment(dependency);
+  Expression loadLibrary(LibraryDependency dependency, Arguments arguments) {
+    return new LoadLibraryJudgment(dependency, arguments);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 19f4b7d..b66c371 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -158,7 +158,7 @@
   /// associated with the argument at the given [index].
   DartType getTypeAt(covariant typeArguments, int index);
 
-  Expression loadLibrary(covariant dependency);
+  Expression loadLibrary(covariant dependency, Arguments arguments);
 
   Expression checkLibraryIsLoaded(covariant dependency);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index dd37979..962ceae 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -92,9 +92,12 @@
         IllegalAssignmentJudgment,
         IndexAssignmentJudgment,
         InvalidConstructorInvocationJudgment,
+        InvalidPropertyGetJudgment,
         InvalidVariableWriteJudgment,
+        ShadowInvalidFieldInitializer,
         ShadowInvalidInitializer,
         LabeledStatementJudgment,
+        LoadLibraryTearOffJudgment,
         LogicalJudgment,
         MethodInvocationJudgment,
         NamedFunctionExpressionJudgment,
@@ -113,9 +116,11 @@
         SwitchCaseJudgment,
         SwitchStatementJudgment,
         SyntheticExpressionJudgment,
+        ThrowJudgment,
         UnresolvedTargetInvocationJudgment,
         UnresolvedVariableGetJudgment,
         UnresolvedVariableAssignmentJudgment,
+        UnresolvedVariableUnaryJudgment,
         VariableAssignmentJudgment,
         VariableDeclarationJudgment,
         VariableGetJudgment,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index e30260e..854ac86 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -289,8 +289,26 @@
 
   void checkOverrides(
       ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
-    hierarchy.forEachOverridePair(cls,
-        (Member declaredMember, Member interfaceMember, bool isSetter) {
+    handleSeenCovariant(
+        Member declaredMember,
+        Member interfaceMember,
+        bool isSetter,
+        callback(
+            Member declaredMember, Member interfaceMember, bool isSetter)) {
+      // When a parameter is covariant we have to check that we also
+      // override the same member in all parents.
+      for (Supertype supertype in interfaceMember.enclosingClass.supers) {
+        Member m = hierarchy.getInterfaceMember(
+            supertype.classNode, interfaceMember.name,
+            setter: isSetter);
+        if (m != null) {
+          callback(declaredMember, m, isSetter);
+        }
+      }
+    }
+
+    overridePairCallback(
+        Member declaredMember, Member interfaceMember, bool isSetter) {
       if (declaredMember is Constructor || interfaceMember is Constructor) {
         unimplemented("Constructor in override check.",
             declaredMember.fileOffset, fileUri);
@@ -298,8 +316,12 @@
       if (declaredMember is Procedure && interfaceMember is Procedure) {
         if (declaredMember.kind == ProcedureKind.Method &&
             interfaceMember.kind == ProcedureKind.Method) {
-          checkMethodOverride(
+          bool seenCovariant = checkMethodOverride(
               hierarchy, typeEnvironment, declaredMember, interfaceMember);
+          if (seenCovariant) {
+            handleSeenCovariant(declaredMember, interfaceMember, isSetter,
+                overridePairCallback);
+          }
         }
         if (declaredMember.kind == ProcedureKind.Getter &&
             interfaceMember.kind == ProcedureKind.Getter) {
@@ -308,12 +330,38 @@
         }
         if (declaredMember.kind == ProcedureKind.Setter &&
             interfaceMember.kind == ProcedureKind.Setter) {
-          checkSetterOverride(
+          bool seenCovariant = checkSetterOverride(
               hierarchy, typeEnvironment, declaredMember, interfaceMember);
+          if (seenCovariant) {
+            handleSeenCovariant(declaredMember, interfaceMember, isSetter,
+                overridePairCallback);
+          }
+        }
+      } else {
+        bool declaredMemberHasGetter = declaredMember is Field ||
+            declaredMember is Procedure && declaredMember.isGetter;
+        bool interfaceMemberHasGetter = interfaceMember is Field ||
+            interfaceMember is Procedure && interfaceMember.isGetter;
+        bool declaredMemberHasSetter = declaredMember is Field ||
+            declaredMember is Procedure && declaredMember.isSetter;
+        bool interfaceMemberHasSetter = interfaceMember is Field ||
+            interfaceMember is Procedure && interfaceMember.isSetter;
+        if (declaredMemberHasGetter && interfaceMemberHasGetter) {
+          checkGetterOverride(
+              hierarchy, typeEnvironment, declaredMember, interfaceMember);
+        } else if (declaredMemberHasSetter && interfaceMemberHasSetter) {
+          bool seenCovariant = checkSetterOverride(
+              hierarchy, typeEnvironment, declaredMember, interfaceMember);
+          if (seenCovariant) {
+            handleSeenCovariant(declaredMember, interfaceMember, isSetter,
+                overridePairCallback);
+          }
         }
       }
       // TODO(ahe): Handle other cases: accessors, operators, and fields.
-    });
+    }
+
+    hierarchy.forEachOverridePair(cls, overridePairCallback);
   }
 
   void checkAbstractMembers(CoreTypes coreTypes, ClassHierarchy hierarchy) {
@@ -432,8 +480,8 @@
     cloned.parent = cls;
 
     KernelLibraryBuilder library = this.library;
-    library.noSuchMethodForwardersOrigins.add(cloned);
-    library.noSuchMethodForwardersOrigins.add(procedure);
+    library.forwardersOrigins.add(cloned);
+    library.forwardersOrigins.add(procedure);
   }
 
   void addNoSuchMethodForwarderGetterForField(Member noSuchMethod,
@@ -621,8 +669,32 @@
         declaredFunction?.typeParameters != null) {
       var substitution = <TypeParameter, DartType>{};
       for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
-        var declaredParameter = declaredFunction.typeParameters[i];
-        var interfaceParameter = interfaceFunction.typeParameters[i];
+        TypeParameter declaredParameter = declaredFunction.typeParameters[i];
+        TypeParameter interfaceParameter = interfaceFunction.typeParameters[i];
+        if (!interfaceParameter.isGenericCovariantImpl) {
+          DartType declaredBound = declaredParameter.bound;
+          DartType interfaceBound = interfaceParameter.bound;
+          if (interfaceSubstitution != null) {
+            declaredBound = interfaceSubstitution.substituteType(declaredBound);
+            interfaceBound =
+                interfaceSubstitution.substituteType(interfaceBound);
+          }
+          if (declaredBound != interfaceBound) {
+            addProblem(
+                templateOverrideTypeVariablesMismatch.withArguments(
+                    "$name::${declaredMember.name.name}",
+                    "${interfaceMember.enclosingClass.name}::"
+                    "${interfaceMember.name.name}"),
+                declaredMember.fileOffset,
+                noLength,
+                context: [
+                  templateOverriddenMethodCause
+                      .withArguments(interfaceMember.name.name)
+                      .withLocation(_getMemberUri(interfaceMember),
+                          interfaceMember.fileOffset, noLength)
+                ]);
+          }
+        }
         substitution[interfaceParameter] =
             new TypeParameterType(declaredParameter);
       }
@@ -642,14 +714,15 @@
       DartType declaredType,
       DartType interfaceType,
       bool isCovariant,
-      VariableDeclaration declaredParameter) {
+      VariableDeclaration declaredParameter,
+      {bool asIfDeclaredParameter = false}) {
     if (!library.loader.target.backendTarget.strongMode) return false;
 
     if (interfaceSubstitution != null) {
       interfaceType = interfaceSubstitution.substituteType(interfaceType);
     }
 
-    bool inParameter = declaredParameter != null;
+    bool inParameter = declaredParameter != null || asIfDeclaredParameter;
     DartType subtype = inParameter ? interfaceType : declaredType;
     DartType supertype = inParameter ? declaredType : interfaceType;
 
@@ -687,7 +760,9 @@
     return false;
   }
 
-  void checkMethodOverride(
+  /// Returns whether a covariant parameter was seen and more methods thus have
+  /// to be checked.
+  bool checkMethodOverride(
       ClassHierarchy hierarchy,
       TypeEnvironment typeEnvironment,
       Procedure declaredMember,
@@ -695,10 +770,11 @@
     if (declaredMember.enclosingClass != cls) {
       // TODO(ahe): Include these checks as well, but the message needs to
       // explain that [declaredMember] is inherited.
-      return;
+      return false;
     }
     assert(declaredMember.kind == ProcedureKind.Method);
     assert(interfaceMember.kind == ProcedureKind.Method);
+    bool seenCovariant = false;
     FunctionNode declaredFunction = declaredMember.function;
     FunctionNode interfaceFunction = interfaceMember.function;
 
@@ -766,10 +842,11 @@
           interfaceFunction.positionalParameters[i].type,
           declaredParameter.isCovariant,
           declaredParameter);
+      if (declaredParameter.isCovariant) seenCovariant = true;
     }
     if (declaredFunction.namedParameters.isEmpty &&
         interfaceFunction.namedParameters.isEmpty) {
-      return;
+      return seenCovariant;
     }
     if (declaredFunction.namedParameters.length <
         interfaceFunction.namedParameters.length) {
@@ -834,14 +911,16 @@
           interfaceNamedParameters.current.type,
           declaredParameter.isCovariant,
           declaredParameter);
+      if (declaredParameter.isCovariant) seenCovariant = true;
     }
+    return seenCovariant;
   }
 
   void checkGetterOverride(
       ClassHierarchy hierarchy,
       TypeEnvironment typeEnvironment,
-      Procedure declaredMember,
-      Procedure interfaceMember) {
+      Member declaredMember,
+      Member interfaceMember) {
     if (declaredMember.enclosingClass != cls) {
       // TODO(paulberry): Include these checks as well, but the message needs to
       // explain that [declaredMember] is inherited.
@@ -855,22 +934,26 @@
         interfaceMember, declaredType, interfaceType, false, null);
   }
 
-  void checkSetterOverride(
+  /// Returns whether a covariant parameter was seen and more methods thus have
+  /// to be checked.
+  bool checkSetterOverride(
       ClassHierarchy hierarchy,
       TypeEnvironment typeEnvironment,
-      Procedure declaredMember,
-      Procedure interfaceMember) {
+      Member declaredMember,
+      Member interfaceMember) {
     if (declaredMember.enclosingClass != cls) {
       // TODO(paulberry): Include these checks as well, but the message needs to
       // explain that [declaredMember] is inherited.
-      return;
+      return false;
     }
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
         hierarchy, declaredMember, interfaceMember, null, null);
     var declaredType = declaredMember.setterType;
     var interfaceType = interfaceMember.setterType;
-    var declaredParameter = declaredMember.function.positionalParameters[0];
-    bool isCovariant = declaredParameter.isCovariant;
+    var declaredParameter =
+        declaredMember.function?.positionalParameters?.elementAt(0);
+    bool isCovariant = declaredParameter?.isCovariant ?? false;
+    if (declaredMember is Field) isCovariant = declaredMember.isCovariant;
     _checkTypes(
         typeEnvironment,
         interfaceSubstitution,
@@ -879,7 +962,9 @@
         declaredType,
         interfaceType,
         isCovariant,
-        declaredParameter);
+        declaredParameter,
+        asIfDeclaredParameter: true);
+    return isCovariant;
   }
 
   String get fullNameForErrors {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 4e5426b..0b4dadd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -13,7 +13,9 @@
     show
         LocatedMessage,
         messageLoadLibraryTakesNoArguments,
-        messageSuperAsExpression;
+        messageNotAConstantExpression,
+        messageSuperAsExpression,
+        templateNotConstantExpression;
 
 import '../messages.dart' show Message, noLength;
 
@@ -23,6 +25,8 @@
 
 import '../problems.dart' show unhandled, unsupported;
 
+import '../type_inference/type_inferrer.dart' show TypeInferrer;
+
 import 'body_builder.dart' show noLocation;
 
 import 'constness.dart' show Constness;
@@ -77,7 +81,9 @@
         ComplexAssignmentJudgment,
         IllegalAssignmentJudgment,
         IndexAssignmentJudgment,
+        InvalidPropertyGetJudgment,
         InvalidVariableWriteJudgment,
+        LoadLibraryTearOffJudgment,
         MethodInvocationJudgment,
         NullAwarePropertyGetJudgment,
         PropertyAssignmentJudgment,
@@ -166,9 +172,11 @@
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
       Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
     var complexAssignment = startComplexAssignment(value);
     complexAssignment?.isPreIncDec = isPreIncDec;
+    complexAssignment?.isPostIncDec = isPostIncDec;
     var combiner = makeBinary(_makeRead(complexAssignment), binaryOperator,
         interfaceTarget, value, helper,
         offset: offset);
@@ -196,8 +204,12 @@
       bool voidContext: false,
       Procedure interfaceTarget}) {
     if (voidContext) {
-      return buildPrefixIncrement(binaryOperator,
-          offset: offset, voidContext: true, interfaceTarget: interfaceTarget);
+      return buildCompoundAssignment(
+          binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
+          offset: offset,
+          voidContext: voidContext,
+          interfaceTarget: interfaceTarget,
+          isPostIncDec: true);
     }
     var rhs = forest.literalInt(1, null)..fileOffset = offset;
     var complexAssignment = startComplexAssignment(rhs);
@@ -611,7 +623,7 @@
       helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
     }
     // TODO(ahe): Use [DirectPropertyGet] when possible.
-    var read = new SuperPropertyGetJudgment(name, getter)
+    var read = new SuperPropertyGetJudgment(name, interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -633,8 +645,8 @@
   @override
   Expression doInvocation(int offset, Arguments arguments) {
     if (helper.constantContext != ConstantContext.none) {
-      helper.deprecated_addCompileTimeError(
-          offset, "Not a constant expression.");
+      // TODO(brianwilkerson) Fix the length
+      helper.addCompileTimeError(messageNotAConstantExpression, offset, 1);
     }
     if (getter == null || isFieldOrGetter(getter)) {
       return helper.buildMethodInvocation(
@@ -974,10 +986,9 @@
           isSuper: true);
     }
     // TODO(ahe): Use [DirectMethodInvocation] when possible.
-    return new SuperMethodInvocationJudgment(
-        indexGetName,
+    return new SuperMethodInvocationJudgment(indexGetName,
         forest.castArguments(forest.arguments(<Expression>[index], token)),
-        getter)
+        interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
   }
 
@@ -1106,21 +1117,25 @@
 
   @override
   Expression doInvocation(int offset, Arguments arguments) {
+    Expression error;
     if (helper.constantContext != ConstantContext.none &&
         !helper.isIdentical(readTarget)) {
-      helper.deprecated_addCompileTimeError(
-          offset, "Not a constant expression.");
+      error = helper.buildCompileTimeError(
+          templateNotConstantExpression.withArguments('Method invocation'),
+          offset,
+          readTarget?.name?.name?.length ?? 0);
     }
     if (readTarget == null || isFieldOrGetter(readTarget)) {
       return helper.buildMethodInvocation(buildSimpleRead(), callName,
           arguments, offset + (readTarget?.name?.name?.length ?? 0),
+          error: error,
           // This isn't a constant expression, but we have checked if a
           // constant expression error should be emitted already.
           isConstantExpression: true,
           isImplicitCall: true);
     } else {
       return helper.buildStaticInvocation(readTarget, arguments,
-          charOffset: offset);
+          charOffset: offset, error: error);
     }
   }
 
@@ -1148,8 +1163,10 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read =
-        helper.makeStaticGet(builder.createTearoffMethod(helper.forest), token);
+    builder.importDependency.targetLibrary;
+    var read = new LoadLibraryTearOffJudgment(
+        builder.importDependency, builder.createTearoffMethod(helper.forest))
+      ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
   }
@@ -1161,7 +1178,7 @@
       helper.addProblemErrorIfConst(
           messageLoadLibraryTakesNoArguments, offset, 'loadLibrary'.length);
     }
-    return builder.createLoadLibrary(offset, forest);
+    return builder.createLoadLibrary(offset, forest, arguments);
   }
 
   @override
@@ -1205,6 +1222,10 @@
         prefixGenerator.prefix,
         token.charOffset);
   }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new StaticAssignmentJudgment(rhs);
 }
 
 class KernelTypeUseGenerator extends KernelReadOnlyAccessGenerator
@@ -1417,6 +1438,15 @@
       ..fileOffset = token.charOffset;
   }
 
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false, TypeInferrer typeInferrer}) {
+    var type = super.buildTypeWithBuiltArguments(arguments,
+        nonInstanceAccessIsError: nonInstanceAccessIsError,
+        typeInferrer: typeInferrer);
+    typeInferrer.storeTypeReference(token.offset, null, null, type);
+    return type;
+  }
+
   @override
   void printOn(StringSink sink) {
     sink.write(", name: ");
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index e08ca25..392ac7d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -141,7 +141,8 @@
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
       Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
     return buildAssignmentError();
   }
 
@@ -195,10 +196,11 @@
 
 class IncompleteErrorGenerator extends IncompleteSendGenerator
     with ErroneousExpressionGenerator {
+  final Member member;
   final Message message;
 
   IncompleteErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.message)
+      ExpressionGeneratorHelper helper, Token token, this.member, this.message)
       : super(helper, token, null);
 
   String get debugName => "IncompleteErrorGenerator";
@@ -218,6 +220,13 @@
   doInvocation(int offset, Arguments arguments) => this;
 
   @override
+  Expression buildSimpleRead() {
+    var error = buildError(forest.argumentsEmpty(token), isGetter: true);
+    return new InvalidPropertyGetJudgment(error, member)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
   void printOn(StringSink sink) {
     sink.write(", message: ");
     sink.write(message.code.name);
@@ -266,7 +275,8 @@
       {int offset,
       bool voidContext: false,
       Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
     return unsupported(
         "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
   }
@@ -335,7 +345,8 @@
       {int offset,
       bool voidContext: false,
       Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
     return unsupported(
         "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
index 070f006..7305d14 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:front_end/src/fasta/kernel/kernel_type_variable_builder.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
 
 import 'package:kernel/ast.dart'
@@ -15,6 +16,7 @@
         Node,
         Statement,
         SwitchCase,
+        TypeParameter,
         VariableDeclaration;
 
 import 'package:kernel/type_algebra.dart' show Substitution;
@@ -28,6 +30,8 @@
         StatementJudgment,
         SwitchCaseJudgment;
 
+import 'kernel_type_variable_builder.dart' show KernelTypeVariableBuilder;
+
 /// Implementation of [Factory] that builds source code into a kernel
 /// representation.
 class KernelFactory
@@ -77,6 +81,36 @@
   }
 
   @override
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return judgment;
+  }
+
+  @override
+  Object binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return judgment;
+  }
+
+  @override
+  SwitchCase binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {
+    return judgment;
+  }
+
+  @override
+  KernelTypeVariableBuilder binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name) {
+    return builder;
+  }
+
+  @override
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return judgment;
+  }
+
+  @override
   Statement block(StatementJudgment judgment, int fileOffset, Token leftBracket,
       List<Statement> statements, Token rightBracket) {
     return judgment;
@@ -263,18 +297,18 @@
   }
 
   @override
-  Object binderForFunctionDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {
-    return judgment;
-  }
-
-  @override
   Expression functionExpression(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
     return judgment;
   }
 
   @override
+  void functionType(int fileOffset, DartType type) {}
+
+  @override
+  void functionTypedFormalParameter(int fileOffset, DartType type) {}
+
+  @override
   Expression ifNull(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -346,17 +380,6 @@
     return labels[0];
   }
 
-  Object statementLabel(
-      covariant StatementJudgment binder, Token label, Token colon) {
-    return binder;
-  }
-
-  @override
-  Object binderForStatementLabel(
-      StatementJudgment judgment, int fileOffset, String name) {
-    return judgment;
-  }
-
   @override
   Expression listLiteral(
       ExpressionJudgment judgment,
@@ -496,6 +519,11 @@
     return judgment;
   }
 
+  Object statementLabel(
+      covariant StatementJudgment binder, Token label, Token colon) {
+    return binder;
+  }
+
   @override
   Expression staticAssign(
       ExpressionJudgment judgment,
@@ -569,11 +597,6 @@
     return binder;
   }
 
-  SwitchCase binderForSwitchLabel(
-      SwitchCaseJudgment judgment, int fileOffset, String name) {
-    return judgment;
-  }
-
   @override
   Statement switchStatement(
       StatementJudgment judgment,
@@ -635,6 +658,22 @@
   }
 
   @override
+  void typeReference(
+      int fileOffset,
+      Token leftBracket,
+      List<void> typeArguments,
+      Token rightBracket,
+      Node reference,
+      covariant KernelTypeVariableBuilder binder,
+      DartType type) {}
+
+  @override
+  TypeParameter typeVariableDeclaration(int fileOffset,
+      covariant KernelTypeVariableBuilder binder, TypeParameter typeParameter) {
+    return typeParameter;
+  }
+
+  @override
   Expression variableAssign(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -652,12 +691,6 @@
   }
 
   @override
-  Object binderForVariableDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {
-    return judgment;
-  }
-
-  @override
   Expression variableGet(
       ExpressionJudgment judgment,
       int fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 009fd3a..efbcf07 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -39,6 +39,7 @@
         LocatedMessage,
         Message,
         messageConflictsWithTypeVariableCause,
+        messageGenericFunctionTypeInBound,
         messageTypeVariableDuplicatedName,
         messageTypeVariableSameNameAsEnclosing,
         noLength,
@@ -115,6 +116,7 @@
 import 'type_algorithms.dart'
     show
         calculateBounds,
+        findGenericFunctionTypes,
         getNonSimplicityIssuesForDeclaration,
         getNonSimplicityIssuesForTypeVariables;
 
@@ -129,11 +131,11 @@
   final List<KernelTypeVariableBuilder> boundlessTypeVariables =
       <KernelTypeVariableBuilder>[];
 
-  // A list of alternating noSuchMethod forwarders and the abstract procedures
-  // they were generated for.  Note that it may not include a forwarder-origin
-  // pair in cases when the former does not need to be updated after the body of
-  // the latter was built.
-  final List<Procedure> noSuchMethodForwardersOrigins = <Procedure>[];
+  // A list of alternating forwarders and the procedures they were generated
+  // for.  Note that it may not include a forwarder-origin pair in cases when
+  // the former does not need to be updated after the body of the latter was
+  // built.
+  final List<Procedure> forwardersOrigins = <Procedure>[];
 
   /// Exports that can't be serialized.
   ///
@@ -1012,12 +1014,12 @@
     return total;
   }
 
-  int finishNoSuchMethodForwarders() {
+  int finishForwarders() {
     int count = 0;
     CloneVisitor cloner = new CloneVisitor();
-    for (int i = 0; i < noSuchMethodForwardersOrigins.length; i += 2) {
-      Procedure forwarder = noSuchMethodForwardersOrigins[i];
-      Procedure origin = noSuchMethodForwardersOrigins[i + 1];
+    for (int i = 0; i < forwardersOrigins.length; i += 2) {
+      Procedure forwarder = forwardersOrigins[i];
+      Procedure origin = forwardersOrigins[i + 1];
 
       int positionalCount = origin.function.positionalParameters.length;
       if (forwarder.function.positionalParameters.length != positionalCount) {
@@ -1057,7 +1059,7 @@
 
       ++count;
     }
-    noSuchMethodForwardersOrigins.clear();
+    forwardersOrigins.clear();
     return count;
   }
 
@@ -1107,13 +1109,30 @@
         bool strongMode) {
       if (variables == null) return 0;
 
+      bool haveErroneousBounds = false;
       if (strongMode) {
-        List<KernelTypeBuilder> calculatedBounds =
-            calculateBounds(variables, dynamicType, bottomType, objectClass);
         for (int i = 0; i < variables.length; ++i) {
-          variables[i].defaultType = calculatedBounds[i];
+          TypeVariableBuilder<TypeBuilder, Object> variable = variables[i];
+          List<TypeBuilder> genericFunctionTypes = <TypeBuilder>[];
+          findGenericFunctionTypes(variable.bound,
+              result: genericFunctionTypes);
+          if (genericFunctionTypes.length > 0) {
+            haveErroneousBounds = true;
+            addProblem(messageGenericFunctionTypeInBound, variable.charOffset,
+                variable.name.length, variable.fileUri);
+          }
         }
-      } else {
+
+        if (!haveErroneousBounds) {
+          List<KernelTypeBuilder> calculatedBounds =
+              calculateBounds(variables, dynamicType, bottomType, objectClass);
+          for (int i = 0; i < variables.length; ++i) {
+            variables[i].defaultType = calculatedBounds[i];
+          }
+        }
+      }
+
+      if (!strongMode || haveErroneousBounds) {
         // In Dart 1, put `dynamic` everywhere.
         for (int i = 0; i < variables.length; ++i) {
           variables[i].defaultType = dynamicType;
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 b3c17bb..71d3160 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
@@ -41,7 +41,9 @@
     show
         noLength,
         templateCantInferTypeDueToCircularity,
-        templateCantUseSuperBoundedTypeForInstanceCreation;
+        templateCantUseSuperBoundedTypeForInstanceCreation,
+        templateForInLoopElementTypeNotAssignable,
+        templateForInLoopTypeNotIterable;
 
 import '../problems.dart' show unhandled, unsupported;
 
@@ -469,8 +471,9 @@
   /// annotations, and creates forwarding stubs as needed.
   void finalizeCovariance(InterfaceResolver interfaceResolver) {
     interfaceResolver.finalizeCovariance(
-        this, _inferenceInfo.gettersAndMethods);
-    interfaceResolver.finalizeCovariance(this, _inferenceInfo.setters);
+        this, _inferenceInfo.gettersAndMethods, _inferenceInfo.builder.library);
+    interfaceResolver.finalizeCovariance(
+        this, _inferenceInfo.setters, _inferenceInfo.builder.library);
     interfaceResolver.recordInstrumentation(this);
   }
 
@@ -995,7 +998,8 @@
         fileOffset,
         target.function.functionType,
         computeConstructorReturnType(target),
-        argumentJudgments);
+        argumentJudgments,
+        isConst: isConst);
     var inferredType = inferenceResult.type;
     this.inferredType = inferredType;
     inferrer.listener.constructorInvocation(
@@ -1123,7 +1127,8 @@
         inferrer.wrapType(const DynamicType(), iterableClass),
         inferredExpressionType,
         iterable,
-        iterable.fileOffset);
+        iterable.fileOffset,
+        template: templateForInLoopTypeNotIterable);
 
     DartType inferredType;
     if (typeNeeded || typeChecksNeeded) {
@@ -1157,7 +1162,8 @@
       var variableGet = new VariableGet(tempVar)
         ..fileOffset = this.variable.fileOffset;
       var implicitDowncast = inferrer.ensureAssignable(
-          variable.type, inferredType, variableGet, fileOffset);
+          variable.type, inferredType, variableGet, fileOffset,
+          template: templateForInLoopElementTypeNotAssignable);
       if (implicitDowncast != null) {
         this.variable = tempVar..parent = this;
         variable.initializer = implicitDowncast..parent = variable;
@@ -1169,7 +1175,8 @@
             greatestClosure(inferrer.coreTypes, syntheticWriteType),
             this.variable.type,
             syntheticAssignment.rhs,
-            syntheticAssignment.rhs.fileOffset);
+            syntheticAssignment.rhs.fileOffset,
+            template: templateForInLoopElementTypeNotAssignable);
         if (syntheticAssignment is PropertyAssignmentJudgment) {
           syntheticAssignment._handleWriteContravariance(
               inferrer, inferrer.thisType);
@@ -1697,6 +1704,30 @@
   }
 }
 
+/// Concrete shadow object representing an invalid initializer in kernel form.
+class ShadowInvalidFieldInitializer extends LocalInitializer
+    implements InitializerJudgment {
+  final Field field;
+  final Expression value;
+
+  ShadowInvalidFieldInitializer(
+      this.field, this.value, VariableDeclaration variable)
+      : super(variable) {
+    value?.parent = this;
+  }
+
+  ExpressionJudgment get judgment => value;
+
+  @override
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.inferExpression(factory, value, field.type, false);
+    inferrer.listener.fieldInitializer(
+        this, fileOffset, null, null, null, null, null, field);
+  }
+}
+
 /// Concrete shadow object representing a non-inverted "is" test in kernel form.
 class IsJudgment extends IsExpression implements ExpressionJudgment {
   final Token isOperator;
@@ -2059,6 +2090,7 @@
 /// Shadow object for [MethodInvocation].
 class MethodInvocationJudgment extends MethodInvocation
     implements ExpressionJudgment {
+  final kernel.Expression desugaredError;
   DartType inferredType;
 
   /// Indicates whether this method invocation is a call to a `call` method
@@ -2067,7 +2099,7 @@
 
   MethodInvocationJudgment(
       Expression receiver, Name name, ArgumentsJudgment arguments,
-      {bool isImplicitCall: false, Member interfaceTarget})
+      {this.desugaredError, bool isImplicitCall: false, Member interfaceTarget})
       : _isImplicitCall = isImplicitCall,
         super(receiver, name, arguments, interfaceTarget);
 
@@ -2082,6 +2114,10 @@
         factory, this, receiver, fileOffset, _isImplicitCall, typeContext,
         desugaredInvocation: this);
     inferredType = inferenceResult.type;
+    if (desugaredError != null) {
+      parent.replaceChild(this, desugaredError);
+      parent = null;
+    }
     return null;
   }
 }
@@ -2158,10 +2194,12 @@
 ///     let v = a in v == null ? null : v.b(...)
 class NullAwareMethodInvocationJudgment extends Let
     implements ExpressionJudgment {
+  final kernel.Expression desugaredError;
   DartType inferredType;
 
   NullAwareMethodInvocationJudgment(
-      VariableDeclaration variable, Expression body)
+      VariableDeclaration variable, Expression body,
+      {this.desugaredError})
       : super(variable, body);
 
   @override
@@ -2542,10 +2580,11 @@
 /// Shadow object for [StaticInvocation].
 class StaticInvocationJudgment extends StaticInvocation
     implements ExpressionJudgment {
+  final kernel.Expression desugaredError;
   DartType inferredType;
 
   StaticInvocationJudgment(Procedure target, ArgumentsJudgment arguments,
-      {bool isConst: false})
+      {this.desugaredError, bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
   ArgumentsJudgment get argumentJudgments => arguments;
@@ -2568,6 +2607,10 @@
         inferrer.lastCalleeType,
         inferrer.lastInferredSubstitution,
         inferredType);
+    if (desugaredError != null) {
+      parent.replaceChild(this, desugaredError);
+      parent = null;
+    }
     return null;
   }
 }
@@ -2656,10 +2699,11 @@
 /// Shadow object for [SuperMethodInvocation].
 class SuperMethodInvocationJudgment extends SuperMethodInvocation
     implements ExpressionJudgment {
+  final kernel.Expression desugaredError;
   DartType inferredType;
 
   SuperMethodInvocationJudgment(Name name, ArgumentsJudgment arguments,
-      [Procedure interfaceTarget])
+      {this.desugaredError, Procedure interfaceTarget})
       : super(name, arguments, interfaceTarget);
 
   ArgumentsJudgment get argumentJudgments => arguments;
@@ -2679,6 +2723,10 @@
         methodName: name,
         arguments: arguments);
     inferredType = inferenceResult.type;
+    if (desugaredError != null) {
+      parent.replaceChild(this, desugaredError);
+      parent = null;
+    }
     return null;
   }
 }
@@ -2686,9 +2734,11 @@
 /// Shadow object for [SuperPropertyGet].
 class SuperPropertyGetJudgment extends SuperPropertyGet
     implements ExpressionJudgment {
+  final kernel.Expression desugaredError;
   DartType inferredType;
 
-  SuperPropertyGetJudgment(Name name, [Member interfaceTarget])
+  SuperPropertyGetJudgment(Name name,
+      {this.desugaredError, Member interfaceTarget})
       : super(name, interfaceTarget);
 
   @override
@@ -2702,6 +2752,10 @@
     }
     inferrer.inferPropertyGet(factory, this, null, fileOffset, typeContext,
         interfaceMember: interfaceTarget, propertyName: name);
+    if (desugaredError != null) {
+      parent.replaceChild(this, desugaredError);
+      parent = null;
+    }
     return null;
   }
 }
@@ -2809,8 +2863,9 @@
   }
 }
 
-/// Synthetic judgment class representing an attempt to invoke a constructor
-/// that cannot be invoked.
+/// Synthetic judgment class representing an attempt to invoke an unresolved
+/// constructor, or a constructor that cannot be invoked, or a resolved
+/// constructor with wrong number of arguments.
 class InvalidConstructorInvocationJudgment extends SyntheticExpressionJudgment {
   final Constructor constructor;
   final Arguments arguments;
@@ -2826,13 +2881,21 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var calleeType = constructor.function.functionType;
-    var inferenceResult = inferrer.inferInvocation(
+    FunctionType calleeType;
+    DartType returnType;
+    if (constructor != null) {
+      calleeType = constructor.function.functionType;
+      returnType = computeConstructorReturnType(constructor);
+    } else {
+      calleeType = new FunctionType([], const DynamicType());
+      returnType = const DynamicType();
+    }
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
         factory,
         typeContext,
         fileOffset,
         calleeType,
-        computeConstructorReturnType(constructor),
+        returnType,
         argumentJudgments);
     this.inferredType = inferenceResult.type;
     inferrer.listener.constructorInvocation(
@@ -2861,6 +2924,25 @@
   }
 }
 
+/// Synthetic judgment class representing an attempt reference a member
+/// that is not allowed at this location.
+class InvalidPropertyGetJudgment extends SyntheticExpressionJudgment {
+  final Member member;
+
+  InvalidPropertyGetJudgment(kernel.Expression desugared, this.member)
+      : super(desugared);
+
+  @override
+  Expression infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    var inferredType = member?.getterType ?? const DynamicType();
+    inferrer.listener.propertyGet(this, fileOffset, member, inferredType);
+    return super.infer(inferrer, factory, typeContext);
+  }
+}
+
 /// Shadow object for expressions that are introduced by the front end as part
 /// of desugaring or the handling of error conditions.
 ///
@@ -2951,12 +3033,14 @@
 
 class ThrowJudgment extends Throw implements ExpressionJudgment {
   final Token throwKeyword;
+  final kernel.Expression desugaredError;
 
   DartType inferredType;
 
   ExpressionJudgment get judgment => expression;
 
-  ThrowJudgment(this.throwKeyword, Expression expression) : super(expression);
+  ThrowJudgment(this.throwKeyword, Expression expression, {this.desugaredError})
+      : super(expression);
 
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
@@ -2967,6 +3051,10 @@
     inferredType = const BottomType();
     inferrer.listener
         .throw_(this, fileOffset, throwKeyword, null, inferredType);
+    if (desugaredError != null) {
+      parent.replaceChild(this, desugaredError);
+      parent = null;
+    }
     return null;
   }
 }
@@ -3363,6 +3451,12 @@
 
   Object binder;
 
+  /// The same [annotations] list is used for all [VariableDeclarationJudgment]s
+  /// of a variable declaration statement. But we need to perform inference
+  /// only once. So, we set this flag to `false` for the second and subsequent
+  /// judgments.
+  bool infersAnnotations = true;
+
   VariableDeclarationJudgment(String name, this._functionNestingLevel,
       {Expression initializer,
       DartType type,
@@ -3402,7 +3496,9 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     if (annotationJudgments.isNotEmpty) {
-      inferrer.inferMetadataKeepingHelper(factory, annotationJudgments);
+      if (infersAnnotations) {
+        inferrer.inferMetadataKeepingHelper(factory, annotationJudgments);
+      }
 
       // After the inference was done on the annotations, we may clone them for
       // this instance of VariableDeclaration in order to avoid having the same
@@ -3526,6 +3622,27 @@
   }
 }
 
+/// Synthetic judgment class representing an attempt to apply a prefix or
+/// postfix operator to an unresolved variable.
+class UnresolvedVariableUnaryJudgment extends SyntheticExpressionJudgment {
+  final Token token;
+
+  UnresolvedVariableUnaryJudgment(kernel.Expression desugared, this.token)
+      : super(desugared);
+
+  @override
+  Expression infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener
+        .variableGet(this, token.offset, false, null, const DynamicType());
+    inferrer.listener.variableAssign(
+        this, fileOffset, const DynamicType(), null, null, inferredType);
+    return super.infer(inferrer, factory, typeContext);
+  }
+}
+
 /// Synthetic judgment class representing an attempt to read an unresolved
 /// variable.
 class UnresolvedVariableGetJudgment extends SyntheticExpressionJudgment {
@@ -3663,9 +3780,13 @@
 
 /// Concrete shadow object representing a deferred load library call.
 class LoadLibraryJudgment extends LoadLibrary implements ExpressionJudgment {
+  final Arguments arguments;
+
   DartType inferredType;
 
-  LoadLibraryJudgment(LibraryDependency import) : super(import);
+  LoadLibraryJudgment(LibraryDependency import, this.arguments) : super(import);
+
+  ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
@@ -3674,6 +3795,35 @@
       DartType typeContext) {
     inferredType =
         inferrer.typeSchemaEnvironment.futureType(const DynamicType());
+    if (arguments != null) {
+      var calleeType = new FunctionType([], inferredType);
+      inferrer.inferInvocation(factory, typeContext, fileOffset, calleeType,
+          calleeType.returnType, argumentJudgments);
+      inferrer.listener.loadLibrary(this, arguments.fileOffset,
+          import.targetLibrary, calleeType, inferredType);
+    }
+    return null;
+  }
+}
+
+/// Concrete shadow object representing a tear-off of a `loadLibrary` function.
+class LoadLibraryTearOffJudgment extends StaticGet
+    implements ExpressionJudgment {
+  final LibraryDependency import;
+
+  DartType inferredType;
+
+  LoadLibraryTearOffJudgment(this.import, Procedure target) : super(target);
+
+  @override
+  Expression infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferredType = new FunctionType(
+        [], inferrer.typeSchemaEnvironment.futureType(const DynamicType()));
+    inferrer.listener.loadLibraryTearOff(
+        this, fileOffset, import.targetLibrary, inferredType);
     return null;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index 1290f11..017c9fc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -27,6 +27,8 @@
 
   KernelTypeVariableBuilder actualOrigin;
 
+  Object binder;
+
   KernelTypeVariableBuilder(
       String name, KernelLibraryBuilder compilationUnit, int charOffset,
       [KernelTypeBuilder bound, TypeParameter actual])
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 8524f51..dfa7a81 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -4,6 +4,7 @@
 
 import 'package:kernel/ast.dart'
     show
+        Arguments,
         DartType,
         DynamicType,
         FunctionNode,
@@ -37,13 +38,15 @@
 
   Uri get fileUri => parent.fileUri;
 
-  LoadLibrary createLoadLibrary(int charOffset, Forest forest) {
-    return forest.loadLibrary(importDependency)..fileOffset = charOffset;
+  LoadLibrary createLoadLibrary(
+      int charOffset, Forest forest, Arguments arguments) {
+    return forest.loadLibrary(importDependency, arguments)
+      ..fileOffset = charOffset;
   }
 
   Procedure createTearoffMethod(Forest forest) {
     if (tearoff != null) return tearoff;
-    LoadLibrary expression = createLoadLibrary(charOffset, forest);
+    LoadLibrary expression = createLoadLibrary(charOffset, forest, null);
     String prefix = expression.import.name;
     tearoff = new Procedure(
         new Name('__loadLibrary_$prefix', parent.target),
diff --git a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
index 62f7c16..f0161b3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:front_end/src/fasta/kernel/kernel_type_variable_builder.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
 
-import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
+import 'package:kernel/ast.dart'
+    show Catch, DartType, FunctionType, Node, TypeParameter;
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
@@ -17,6 +19,10 @@
         StatementJudgment,
         SwitchCaseJudgment;
 
+import 'kernel_type_variable_builder.dart' show KernelTypeVariableBuilder;
+
+const toplevelInferenceFactory = const ToplevelInferenceFactory();
+
 /// Implementation of [Factory] for use during top level type inference, when
 /// no representation of the code semantics needs to be created (only the type
 /// needs to be inferred).
@@ -60,6 +66,26 @@
       Token awaitKeyword, void expression, DartType inferredType) {}
 
   @override
+  void binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  @override
+  void binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  @override
+  void binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+  @override
+  void binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name) {}
+
+  @override
+  void binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  @override
   void block(StatementJudgment judgment, int fileOffset, Token leftBracket,
       void statements, Token rightBracket) {}
 
@@ -211,14 +237,16 @@
   void functionDeclaration(covariant void binder, FunctionType inferredType) {}
 
   @override
-  void binderForFunctionDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {}
-
-  @override
   void functionExpression(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
 
   @override
+  void functionType(int fileOffset, DartType type) {}
+
+  @override
+  void functionTypedFormalParameter(int fileOffset, DartType type) {}
+
+  @override
   void ifNull(ExpressionJudgment judgment, int fileOffset, void leftOperand,
       Token operator, void rightOperand, DartType inferredType) {}
 
@@ -270,13 +298,6 @@
   void labeledStatement(List<Object> labels, void statement) {}
 
   @override
-  void statementLabel(covariant void binder, Token label, Token colon) {}
-
-  @override
-  void binderForStatementLabel(
-      StatementJudgment judgment, int fileOffset, String name) {}
-
-  @override
   void listLiteral(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -384,6 +405,9 @@
       Token returnKeyword, void expression, Token semicolon) {}
 
   @override
+  void statementLabel(covariant void binder, Token label, Token colon) {}
+
+  @override
   void staticAssign(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -437,10 +461,6 @@
   void switchLabel(covariant void binder, Token label, Token colon) {}
 
   @override
-  void binderForSwitchLabel(
-      SwitchCaseJudgment judgment, int fileOffset, String name) {}
-
-  @override
   void switchStatement(
       StatementJudgment judgment,
       int fileOffset,
@@ -481,6 +501,20 @@
       Node expressionType, DartType inferredType) {}
 
   @override
+  void typeReference(
+      int fileOffset,
+      Token leftBracket,
+      List<void> typeArguments,
+      Token rightBracket,
+      Node reference,
+      covariant void binder,
+      DartType type) {}
+
+  @override
+  void typeVariableDeclaration(
+      int fileOffset, covariant void binder, TypeParameter typeParameter) {}
+
+  @override
   void variableAssign(
       ExpressionJudgment judgment,
       int fileOffset,
@@ -493,9 +527,6 @@
   void variableDeclaration(
       covariant void binder, DartType statementType, DartType inferredType) {}
 
-  void binderForVariableDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {}
-
   @override
   void variableGet(ExpressionJudgment judgment, int fileOffset,
       bool isInCascade, covariant void variableBinder, DartType inferredType) {}
@@ -514,5 +545,3 @@
   void yieldStatement(StatementJudgment judgment, int fileOffset,
       Token yieldKeyword, Token star, void expression, Token semicolon) {}
 }
-
-const toplevelInferenceFactory = const ToplevelInferenceFactory();
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 81b72d7..a45b739 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -693,3 +693,29 @@
   issues.addAll(convertRawTypeCyclesIntoIssues(declaration, cyclesToReport));
   return issues;
 }
+
+void findGenericFunctionTypes(TypeBuilder type, {List<TypeBuilder> result}) {
+  result ??= <TypeBuilder>[];
+  if (type is FunctionTypeBuilder) {
+    if (type.typeVariables != null && type.typeVariables.length > 0) {
+      result.add(type);
+
+      for (TypeVariableBuilder<TypeBuilder, Object> typeVariable
+          in type.typeVariables) {
+        findGenericFunctionTypes(typeVariable.bound, result: result);
+        findGenericFunctionTypes(typeVariable.defaultType, result: result);
+      }
+    }
+    findGenericFunctionTypes(type.returnType, result: result);
+    if (type.formals != null) {
+      for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+        findGenericFunctionTypes(formal.type, result: result);
+      }
+    }
+  } else if (type is NamedTypeBuilder<TypeBuilder, Object> &&
+      type.arguments != null) {
+    for (TypeBuilder argument in type.arguments) {
+      findGenericFunctionTypes(argument, result: result);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 3af09ee..467e833 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -641,8 +641,8 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter() {
-    listener?.endFunctionTypedFormalParameter();
+  void endFunctionTypedFormalParameter(Token nameToken) {
+    listener?.endFunctionTypedFormalParameter(nameToken);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index c69cf17..1f6dd5c 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -996,7 +996,7 @@
   /// - type variables
   /// - return type
   /// - formal parameters
-  void endFunctionTypedFormalParameter() {
+  void endFunctionTypedFormalParameter(Token nameToken) {
     logEvent("FunctionTypedFormalParameter");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 8aa932d..74b59cd 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -88,7 +88,12 @@
         noType,
         noTypeParamOrArg;
 
-import 'util.dart' show findNonSyntheticToken, isOneOf, optional;
+import 'util.dart'
+    show
+        findPreviousNonZeroLengthToken,
+        findNonZeroLengthToken,
+        isOneOf,
+        optional;
 
 /// An event generating parser of Dart programs. This parser expects all tokens
 /// in a linked list (aka a token stream).
@@ -1083,10 +1088,7 @@
           new SyntheticKeywordToken(Keyword.WITH, withKeyword.charOffset);
       rewriter.insertTokenAfter(token, withKeyword);
       if (!isValidTypeReference(withKeyword.next)) {
-        rewriter.insertTokenAfter(
-            withKeyword,
-            new SyntheticStringToken(
-                TokenType.IDENTIFIER, '', withKeyword.charOffset));
+        rewriter.insertSyntheticIdentifier(withKeyword);
       }
     }
     listener.beginMixinApplication(withKeyword);
@@ -1353,7 +1355,7 @@
       token = typeInfo.parseType(beforeType, this);
       endInlineFunctionType = parseFormalParametersRequiredOpt(
           endInlineFunctionType, MemberKind.FunctionTypedParameter);
-      listener.endFunctionTypedFormalParameter();
+      listener.endFunctionTypedFormalParameter(beforeInlineFunctionType);
 
       // Generalized function types don't allow inline function types.
       // The following isn't allowed:
@@ -1872,10 +1874,7 @@
     Token next = token.next;
     reportRecoverableError(messageOnToken ?? next,
         message ?? context.recoveryTemplate.withArguments(next));
-    Token identifier =
-        new SyntheticStringToken(TokenType.IDENTIFIER, '', next.charOffset, 0);
-    rewriter.insertTokenAfter(token, identifier);
-    return token.next;
+    return rewriter.insertSyntheticIdentifier(token);
   }
 
   /// Parse a simple identifier at the given [token], and return the identifier
@@ -2308,10 +2307,7 @@
             next, fasta.templateExpectedButGot.withArguments('.'));
         rewriter.insertTokenAfter(
             token, new SyntheticToken(TokenType.PERIOD, next.offset));
-        token = token.next;
-        rewriter.insertTokenAfter(token,
-            new SyntheticStringToken(TokenType.IDENTIFIER, '', next.offset));
-        token = token.next;
+        token = rewriter.insertSyntheticIdentifier(token.next);
         next = token.next;
       }
       // Fall through to recovery
@@ -2436,9 +2432,15 @@
     // from the handleError method in element_listener.dart.
     Token next = token.next;
     if (optional(';', next)) return next;
-    Message message = fasta.templateExpectedButGot.withArguments(';');
-    Token newToken = new SyntheticToken(TokenType.SEMICOLON, next.charOffset);
-    return rewriteAndRecover(token, message, newToken).next;
+
+    // Find a token on the same line as where the ';' should be inserted.
+    // Reporting the error on this token makes it easier
+    // for users to understand and fix the error.
+    reportRecoverableError(findPreviousNonZeroLengthToken(token),
+        fasta.templateExpectedAfterButGot.withArguments(';'));
+
+    return rewriter.insertToken(
+        token, new SyntheticToken(TokenType.SEMICOLON, next.charOffset));
   }
 
   /// Report an error at the token after [token] that has the given [message].
@@ -5677,7 +5679,7 @@
       reportErrorToken(token);
     } else {
       // Find a non-synthetic token on which to report the error.
-      token = findNonSyntheticToken(token);
+      token = findNonZeroLengthToken(token);
       listener.handleRecoverableError(message, token, token);
     }
   }
@@ -5688,7 +5690,7 @@
       reportErrorToken(token);
     } else {
       // Find a non-synthetic token on which to report the error.
-      token = findNonSyntheticToken(token);
+      token = findNonZeroLengthToken(token);
       listener.handleRecoverableError(
           template.withArguments(token), token, token);
     }
diff --git a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
index 38b68b6..27af960 100644
--- a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
+++ b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
@@ -55,20 +55,29 @@
     next = next.setNext(new SyntheticToken(TokenType.CLOSE_PAREN, offset));
     leftParen.endGroup = next;
     next.setNext(token.next);
+
+    // A no-op rewriter could skip this step.
     token.setNext(leftParen);
+
     return leftParen;
   }
 
   /// Insert a synthetic identifier after [token] and return the new identifier.
   Token insertSyntheticIdentifier(Token token) {
-    Token identifier = new SyntheticStringToken(
-        TokenType.IDENTIFIER, '', token.next.charOffset, 0)
-      ..setNext(token.next);
+    return insertToken(
+        token,
+        new SyntheticStringToken(
+            TokenType.IDENTIFIER, '', token.next.charOffset, 0));
+  }
 
-    // A no-op rewriter could simply return the synthetic identifier here.
+  /// Insert [newToken] after [token] and return [newToken].
+  Token insertToken(Token token, Token newToken) {
+    newToken.setNext(token.next);
 
-    token.setNext(identifier);
-    return identifier;
+    // A no-op rewriter could skip this step.
+    token.setNext(newToken);
+
+    return newToken;
   }
 
   /// Insert the chain of tokens starting at the [insertedToken] immediately
diff --git a/pkg/front_end/lib/src/fasta/parser/util.dart b/pkg/front_end/lib/src/fasta/parser/util.dart
index 96495e7..ab00611 100644
--- a/pkg/front_end/lib/src/fasta/parser/util.dart
+++ b/pkg/front_end/lib/src/fasta/parser/util.dart
@@ -33,11 +33,24 @@
   return token;
 }
 
-/// Return [token] if it is non-synthetic,
-/// otherwise find the next non-synthetic token.
+/// Return [token] or a token before [token] which is either
+/// not synthetic or synthetic with non-zero length.
+Token findPreviousNonZeroLengthToken(Token token) {
+  while (token.isSynthetic && token.length == 0) {
+    Token previous = token.beforeSynthetic;
+    if (previous == null) {
+      break;
+    }
+    token = previous;
+  }
+  return token;
+}
+
+/// Return [token] or a token after [token] which is either
+/// not synthetic or synthetic with non-zero length.
 /// This may return EOF if there are no more non-synthetic tokens in the stream.
-Token findNonSyntheticToken(Token token) {
-  while (token.isSynthetic && !token.isEof) {
+Token findNonZeroLengthToken(Token token) {
+  while (token.isSynthetic && token.length == 0 && !token.isEof) {
     token = token.next;
   }
   return token;
diff --git a/pkg/front_end/lib/src/fasta/scanner/token.dart b/pkg/front_end/lib/src/fasta/scanner/token.dart
index cea026d..bd837c1 100644
--- a/pkg/front_end/lib/src/fasta/scanner/token.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/token.dart
@@ -235,7 +235,7 @@
   int get length;
 
   /**
-   * If this substring is based on a String, the [boolValue] indicates wheter
+   * If this substring is based on a String, the [boolValue] indicates whether
    * the resulting substring should be canonicalized.
    *
    * For substrings based on a byte array, the [boolValue] is true if the
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 8f8c5c1..597ecd0 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1016,7 +1016,7 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter() {
+  void endFunctionTypedFormalParameter(Token nameToken) {
     debugEvent("FunctionTypedFormalParameter");
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 6e1045b..6135e72 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -158,6 +158,7 @@
     constructors.forEach((String name, Declaration constructor) {
       Declaration member = scopeBuilder[name];
       if (member == null) return;
+      if (!member.isStatic) return;
       // TODO(ahe): Revisit these messages. It seems like the last two should
       // be `context` parameter to this message.
       addCompileTimeError(templateConflictsWithMember.withArguments(name),
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 3304efc..aab29be 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -387,10 +387,10 @@
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
-        count += library.finishNoSuchMethodForwarders();
+        count += library.finishForwarders();
       }
     });
-    ticker.logMs("Finished noSuchMethod forwarders for $count procedures");
+    ticker.logMs("Finished forwarders for $count procedures");
   }
 
   void resolveConstructors() {
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 bf2284c..02395c0 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
@@ -43,6 +43,8 @@
 
 import '../builder/builder.dart' show LibraryBuilder;
 
+import '../kernel/kernel_library_builder.dart' show KernelLibraryBuilder;
+
 import '../kernel/kernel_shadow_ast.dart'
     show
         ShadowClass,
@@ -292,8 +294,7 @@
     IncludesTypeParametersCovariantly needsCheckVisitor =
         enclosingClass.typeParameters.isEmpty
             ? null
-            : ShadowClass
-                    .getClassInferenceInfo(enclosingClass)
+            : ShadowClass.getClassInferenceInfo(enclosingClass)
                     .needsCheckVisitor ??=
                 new IncludesTypeParametersCovariantly(
                     enclosingClass.typeParameters);
@@ -774,8 +775,8 @@
     }
     var positionalParameters = method.function.positionalParameters;
     for (int i = 0; i < positionalParameters.length; ++i) {
-      if (VariableDeclarationJudgment
-          .isImplicitlyTyped(positionalParameters[i])) {
+      if (VariableDeclarationJudgment.isImplicitlyTyped(
+          positionalParameters[i])) {
         // Note that if the parameter is not present in the overridden method,
         // getPositionalParameterType treats it as dynamic.  This is consistent
         // with the behavior called for in the informal top level type inference
@@ -905,6 +906,20 @@
                           conflict.fileUri, conflict.fileOffset, noLength)
                     ]);
               }
+            } else {
+              // If it's a setter conflicting with a method and both are
+              // declared in the same class, it hasn't been signaled as a
+              // duplicated definition so it's reported here.
+              library.addProblem(
+                  messageDeclaredMemberConflictsWithInheritedMember,
+                  member.fileOffset,
+                  noLength,
+                  member.fileUri,
+                  context: [
+                    messageDeclaredMemberConflictsWithInheritedMemberCause
+                        .withLocation(
+                            conflict.fileUri, conflict.fileOffset, noLength)
+                  ]);
             }
             return;
           }
@@ -917,6 +932,11 @@
         var forwardingNode = new ForwardingNode(
             this, null, class_, name, kind, candidates, start, end);
         getters[getterIndex++] = forwardingNode.finalize();
+        if (library is KernelLibraryBuilder &&
+            forwardingNode.finalize() != forwardingNode.resolve()) {
+          library.forwardersOrigins.add(forwardingNode.finalize());
+          library.forwardersOrigins.add(forwardingNode.resolve());
+        }
         return;
       }
 
@@ -1029,12 +1049,18 @@
     setters.length = setterIndex;
   }
 
-  void finalizeCovariance(Class class_, List<Member> apiMembers) {
+  void finalizeCovariance(
+      Class class_, List<Member> apiMembers, LibraryBuilder library) {
     for (int i = 0; i < apiMembers.length; i++) {
       var member = apiMembers[i];
       Member resolution;
       if (member is ForwardingNode) {
         apiMembers[i] = resolution = member.finalize();
+        if (library is KernelLibraryBuilder &&
+            member.finalize() != member.resolve()) {
+          library.forwardersOrigins.add(member.finalize());
+          library.forwardersOrigins.add(member.resolve());
+        }
       } else {
         resolution = member;
       }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index 579af3f..42aa400 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -2,19 +2,26 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
+import 'package:kernel/ast.dart'
+    show Catch, DartType, FunctionType, Node, TypeParameter;
+
 import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
 import '../../scanner/token.dart' show Token;
-
 import '../kernel/kernel_shadow_ast.dart'
     show
         ExpressionJudgment,
         InitializerJudgment,
+        LoadLibraryJudgment,
+        LoadLibraryTearOffJudgment,
         StatementJudgment,
         SwitchCaseJudgment;
 
+import '../kernel/kernel_type_variable_builder.dart'
+    show KernelTypeVariableBuilder;
+
 /// Callback interface used by [TypeInferrer] to report the results of type
 /// inference to a client.
 ///
@@ -60,6 +67,21 @@
   void awaitExpression(ExpressionJudgment judgment, Location location,
       Token awaitKeyword, void expression, DartType inferredType);
 
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, Location location, String name);
+
+  Object binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name);
+
+  Object binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name);
+
+  Object binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name);
+
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name);
+
   void block(StatementJudgment judgment, Location location, Token leftBracket,
       List<void> statements, Token rightBracket);
 
@@ -191,12 +213,13 @@
 
   void functionDeclaration(covariant Object binder, FunctionType inferredType);
 
-  Object binderForFunctionDeclaration(
-      StatementJudgment judgment, Location location, String name);
-
   void functionExpression(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
+  void functionType(Location location, DartType type);
+
+  void functionTypedFormalParameter(Location location, DartType type);
+
   void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
       Token operator, void rightOperand, DartType inferredType);
 
@@ -240,11 +263,6 @@
 
   void labeledStatement(List<Object> labels, void statement);
 
-  Object statementLabel(covariant Object binder, Token label, Token colon);
-
-  Object binderForStatementLabel(
-      StatementJudgment judgment, int fileOffset, String name);
-
   void listLiteral(
       ExpressionJudgment judgment,
       Location location,
@@ -255,6 +273,12 @@
       Token rightBracket,
       DartType inferredType);
 
+  void loadLibrary(LoadLibraryJudgment judgment, Location location,
+      Reference library, FunctionType calleeType, DartType inferredType);
+
+  void loadLibraryTearOff(LoadLibraryTearOffJudgment judgment,
+      Location location, Reference library, DartType inferredType);
+
   void logicalExpression(
       ExpressionJudgment judgment,
       Location location,
@@ -336,6 +360,8 @@
   void returnStatement(StatementJudgment judgment, Location location,
       Token returnKeyword, void expression, Token semicolon);
 
+  Object statementLabel(covariant Object binder, Token label, Token colon);
+
   void staticAssign(
       ExpressionJudgment judgment,
       Location location,
@@ -356,6 +382,11 @@
       Substitution substitution,
       DartType inferredType);
 
+  void storeClassReference(
+      Location location, Reference reference, DartType rawType);
+
+  void storePrefixInfo(Location location, PrefixInfo prefixInfo);
+
   void stringConcatenation(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
@@ -375,9 +406,6 @@
 
   Object switchLabel(covariant Object binder, Token label, Token colon);
 
-  Object binderForSwitchLabel(
-      SwitchCaseJudgment judgment, int fileOffset, String name);
-
   void switchStatement(
       StatementJudgment judgment,
       Location location,
@@ -417,6 +445,18 @@
   void typeLiteral(ExpressionJudgment judgment, Location location,
       Reference expressionType, DartType inferredType);
 
+  void typeReference(
+      Location location,
+      Token leftBracket,
+      List<void> typeArguments,
+      Token rightBracket,
+      Reference reference,
+      covariant Object binder,
+      DartType type);
+
+  void typeVariableDeclaration(
+      Location location, covariant Object binder, TypeParameter typeParameter);
+
   void variableAssign(
       ExpressionJudgment judgment,
       Location location,
@@ -428,12 +468,11 @@
   void variableDeclaration(
       covariant Object binder, DartType statementType, DartType inferredType);
 
-  Object binderForVariableDeclaration(
-      StatementJudgment judgment, int fileOffset, String name);
-
   void variableGet(ExpressionJudgment judgment, Location location,
       bool isInCascade, covariant Object variableBinder, DartType inferredType);
 
+  void voidType(Location location, Token token, DartType type);
+
   void whileStatement(
       StatementJudgment judgment,
       Location location,
@@ -445,11 +484,6 @@
 
   void yieldStatement(StatementJudgment judgment, Location location,
       Token yieldKeyword, Token star, void expression, Token semicolon);
-
-  void storePrefixInfo(Location location, PrefixInfo prefixInfo);
-
-  void storeClassReference(
-      Location location, Reference reference, DartType rawType);
 }
 
 /// Kernel implementation of TypeInferenceListener; does nothing.
@@ -489,6 +523,26 @@
       Token awaitKeyword, void expression, DartType inferredType) {}
 
   @override
+  void binderForFunctionDeclaration(
+      StatementJudgment judgment, location, String name) {}
+
+  @override
+  void binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  @override
+  void binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+  @override
+  void binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name) {}
+
+  @override
+  void binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  @override
   void block(StatementJudgment judgment, location, Token leftBracket,
       List<void> statements, Token rightBracket) {}
 
@@ -633,13 +687,13 @@
   void functionDeclaration(covariant void binder, FunctionType inferredType) {}
 
   @override
-  void binderForFunctionDeclaration(
-      StatementJudgment judgment, location, String name) {}
-
-  @override
   void functionExpression(
       ExpressionJudgment judgment, location, DartType inferredType) {}
 
+  void functionType(int location, DartType type) {}
+
+  void functionTypedFormalParameter(int location, DartType type) {}
+
   @override
   void ifNull(ExpressionJudgment judgment, location, void leftOperand,
       Token operator, void rightOperand, DartType inferredType) {}
@@ -692,13 +746,6 @@
   void labeledStatement(List<Object> labels, void statement) {}
 
   @override
-  void statementLabel(covariant void binder, Token label, Token colon) {}
-
-  @override
-  void binderForStatementLabel(
-      StatementJudgment judgment, int fileOffset, String name) {}
-
-  @override
   void listLiteral(
       ExpressionJudgment judgment,
       location,
@@ -710,6 +757,14 @@
       DartType inferredType) {}
 
   @override
+  void loadLibrary(LoadLibraryJudgment judgment, location, library,
+      FunctionType calleeType, DartType inferredType) {}
+
+  @override
+  void loadLibraryTearOff(LoadLibraryTearOffJudgment judgment, location,
+      library, DartType inferredType) {}
+
+  @override
   void logicalExpression(
       ExpressionJudgment judgment,
       location,
@@ -800,6 +855,9 @@
       Token returnKeyword, void expression, Token semicolon) {}
 
   @override
+  void statementLabel(covariant void binder, Token label, Token colon) {}
+
+  @override
   void staticAssign(ExpressionJudgment judgment, location, writeMember,
       DartType writeContext, combiner, DartType inferredType) {}
 
@@ -848,10 +906,6 @@
   void switchLabel(covariant void binder, Token label, Token colon) {}
 
   @override
-  void binderForSwitchLabel(
-      SwitchCaseJudgment judgment, int fileOffset, String name) {}
-
-  @override
   void switchStatement(
       StatementJudgment judgment,
       location,
@@ -887,6 +941,14 @@
       DartType inferredType) {}
 
   @override
+  void typeReference(location, Token leftBracket, List<void> typeArguments,
+      Token rightBracket, reference, covariant void binder, DartType type) {}
+
+  @override
+  void typeVariableDeclaration(
+      location, covariant void binder, TypeParameter typeParameter) {}
+
+  @override
   void variableAssign(
       ExpressionJudgment judgment,
       location,
@@ -900,14 +962,13 @@
       covariant void binder, DartType statementType, DartType inferredType) {}
 
   @override
-  void binderForVariableDeclaration(
-      StatementJudgment judgment, int fileOffset, String name) {}
-
-  @override
   void variableGet(ExpressionJudgment judgment, location, bool isInCascade,
       expressionVariable, DartType inferredType) {}
 
   @override
+  void voidType(location, Token token, DartType type) {}
+
+  @override
   void whileStatement(
       StatementJudgment judgment,
       location,
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 016092a..5ded6a7b 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
@@ -42,6 +42,7 @@
         SuperPropertySet,
         Supertype,
         ThisExpression,
+        TreeNode,
         TypeParameter,
         TypeParameterType,
         Typedef,
@@ -85,6 +86,9 @@
         VariableDeclarationJudgment,
         getExplicitTypeArguments;
 
+import '../kernel/kernel_type_variable_builder.dart'
+    show KernelTypeVariableBuilder;
+
 import '../names.dart' show callName;
 
 import '../problems.dart' show unexpected, unhandled;
@@ -335,6 +339,13 @@
   /// performed--this is used for testing.
   Uri get uri;
 
+  Object binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name);
+
+  void functionType(int offset, DartType type);
+
+  void functionTypedFormalParameter(int offset, DartType type);
+
   /// Performs full type inference on the given field initializer.
   void inferFieldInitializer<Expression, Statement, Initializer, Type>(
       InferenceHelper helper,
@@ -378,7 +389,15 @@
 
   void storePrefix(Token token, PrefixBuilder prefix);
 
+  void storeTypeReference(
+      int offset, TreeNode reference, Object binder, DartType type);
+
   void storeTypeUse(int offset, Node node);
+
+  void typeVariableDeclaration(
+      int offset, Object binder, TypeParameter typeParameter);
+
+  void voidType(int offset, Token token, DartType type);
 }
 
 /// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -398,6 +417,14 @@
   Uri get uri => null;
 
   @override
+  void binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name) {}
+
+  void functionType(int offset, DartType type) {}
+
+  void functionTypedFormalParameter(int offset, DartType type) {}
+
+  @override
   void inferFieldInitializer<Expression, Statement, Initializer, Type>(
       InferenceHelper helper,
       Factory<Expression, Statement, Initializer, Type> factory,
@@ -440,7 +467,18 @@
   void storePrefix(Token token, PrefixBuilder prefix) {}
 
   @override
+  void storeTypeReference(
+      int offset, TreeNode reference, Object binder, DartType type) {}
+
+  @override
   void storeTypeUse(int offset, Node node) {}
+
+  @override
+  void typeVariableDeclaration(
+      int offset, Object binder, TypeParameter typeParameter) {}
+
+  @override
+  void voidType(int offset, Token token, DartType type) {}
 }
 
 /// Derived class containing generic implementations of [TypeInferrer].
@@ -507,6 +545,20 @@
   /// inference.
   TypePromoter get typePromoter;
 
+  @override
+  Object binderForTypeVariable(
+      KernelTypeVariableBuilder builder, int fileOffset, String name) {
+    return listener.binderForTypeVariable(builder, fileOffset, name);
+  }
+
+  void functionType(int offset, DartType type) {
+    listener.functionType(offset, type);
+  }
+
+  void functionTypedFormalParameter(int offset, DartType type) {
+    listener.functionTypedFormalParameter(offset, type);
+  }
+
   bool isAssignable(DartType expectedType, DartType actualType) {
     return typeSchemaEnvironment.isSubtypeOf(expectedType, actualType) ||
         typeSchemaEnvironment.isSubtypeOf(actualType, expectedType);
@@ -1695,7 +1747,13 @@
 
   @override
   void storePrefix(Token token, PrefixBuilder prefix) {
-    listener.storePrefixInfo(token.offset, prefix.importIndex);
+    listener.storePrefixInfo(token.offset, prefix?.importIndex);
+  }
+
+  @override
+  void storeTypeReference(
+      int offset, TreeNode reference, Object binder, DartType type) {
+    listener.typeReference(offset, null, null, null, reference, binder, type);
   }
 
   @override
@@ -1710,12 +1768,24 @@
       // TODO(paulberry): handle this case.
     } else if (node is InvalidType) {
       // TODO(paulberry): handle this case.
+      listener.storeClassReference(offset, null, const DynamicType());
     } else {
       // TODO(paulberry): handle this case.
       return unhandled("${node.runtimeType}", "storeTypeUse", offset, uri);
     }
   }
 
+  @override
+  void typeVariableDeclaration(
+      int offset, Object binder, TypeParameter typeParameter) {
+    return listener.typeVariableDeclaration(offset, binder, typeParameter);
+  }
+
+  @override
+  void voidType(int offset, Token token, DartType type) {
+    listener.voidType(offset, token, type);
+  }
+
   DartType wrapFutureOrType(DartType type) {
     if (type is InterfaceType &&
         identical(type.classNode, coreTypes.futureOrClass)) {
diff --git a/pkg/front_end/lib/src/scanner/scanner.dart b/pkg/front_end/lib/src/scanner/scanner.dart
index 6091c28..f4b1e96 100644
--- a/pkg/front_end/lib/src/scanner/scanner.dart
+++ b/pkg/front_end/lib/src/scanner/scanner.dart
@@ -126,13 +126,6 @@
  */
 abstract class Scanner {
   /**
-   * A flag indicating whether the analyzer [Scanner] factory method
-   * will return a fasta based scanner or an analyzer based scanner.
-   */
-  static bool useFasta =
-      const bool.fromEnvironment("useFastaScanner", defaultValue: true);
-
-  /**
    * The reader used to access the characters in the source.
    */
   final CharacterReader _reader;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index f458984..77ca5a3 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -39,11 +39,9 @@
 CantUseSuperBoundedTypeForInstanceCreation/analyzerCode: Fail
 CantUseSuperBoundedTypeForInstanceCreation/example: Fail
 ColonInPlaceOfIn/example: Fail
-ConflictsWithConstructor/analyzerCode: Fail
 ConflictsWithConstructor/example: Fail
 ConflictsWithFactory/analyzerCode: Fail
 ConflictsWithFactory/example: Fail
-ConflictsWithMember/analyzerCode: Fail
 ConflictsWithMember/example: Fail
 ConflictsWithMemberWarning/analyzerCode: Fail
 ConflictsWithMemberWarning/example: Fail
@@ -51,7 +49,6 @@
 ConflictsWithSetter/example: Fail
 ConflictsWithSetterWarning/analyzerCode: Fail
 ConflictsWithSetterWarning/example: Fail
-ConflictsWithTypeVariable/analyzerCode: Fail
 ConflictsWithTypeVariable/example: Fail
 ConstAfterFactory/script1: Fail
 ConstAndCovariant/script2: Fail
@@ -86,6 +83,7 @@
 ConstFieldWithoutInitializer/example: Fail
 ConstructorNotFound/analyzerCode: Fail
 ConstructorNotFound/example: Fail
+ConstructorNotSync/example: Fail
 ContinueOutsideOfLoop/script1: Fail
 ContinueWithoutLabelInCase/script1: Fail
 CouldNotParseUri/analyzerCode: Fail
@@ -99,7 +97,6 @@
 CyclicClassHierarchy/analyzerCode: Fail
 CyclicClassHierarchy/example: Fail
 CyclicTypedef/example: Fail
-DeclaredMemberConflictsWithInheritedMember/analyzerCode: Fail
 DeferredAfterPrefix/example: Fail
 DeferredPrefixDuplicated/example: Fail
 DeferredTypeAnnotation/example: Fail
@@ -175,12 +172,13 @@
 FieldInitializerOutsideConstructor/script1: Fail
 FinalAndCovariant/script2: Fail
 FinalFieldWithoutInitializer/example: Fail
-FinalInstanceVariableAlreadyInitialized/analyzerCode: Fail
 FinalInstanceVariableAlreadyInitialized/example: Fail
+ForInLoopElementTypeNotAssignable/example: Fail
 ForInLoopExactlyOneVariable/analyzerCode: Fail # The analyzer doesn't recover well.
 ForInLoopExactlyOneVariable/statement: Fail # Fasta reports too many errors.
 ForInLoopNotAssignable/analyzerCode: Fail # The analyzer reports a different error.
 ForInLoopNotAssignable/statement: Fail
+ForInLoopTypeNotIterable/example: Fail
 FunctionTypeDefaultValue/example: Fail
 FunctionTypedParameterVar/script1: Fail
 GeneratorReturnsValue/example: Fail
@@ -195,7 +193,6 @@
 ImplementsBeforeWith/script: Fail
 ImplicitCallOfNonMethod/example: Fail
 ImportAfterPart/script1: Fail
-InheritedMembersConflict/analyzerCode: Fail
 InputFileNotFound/analyzerCode: Fail
 InputFileNotFound/example: Fail
 IntegerLiteralIsOutOfRange/example: Fail
@@ -217,12 +214,9 @@
 InvalidVoid/script2: Fail
 LibraryDirectiveNotFirst/script2: Fail
 LibraryDirectiveNotFirst/script3: Fail
-ListLiteralTooManyTypeArguments/analyzerCode: Fail
 ListLiteralTooManyTypeArguments/example: Fail
-ListLiteralTypeArgumentMismatch/analyzerCode: Fail
-ListLiteralTypeArgumentMismatch/example: Fail
-LoadLibraryTakesNoArguments/analyzerCode: Fail
 LoadLibraryTakesNoArguments/example: Fail
+MapLiteralTypeArgumentMismatch/example: Fail
 MemberWithSameNameAsClass/analyzerCode: Fail
 MemberWithSameNameAsClass/example: Fail
 MetadataTypeArguments/analyzerCode: Fail
@@ -250,12 +244,16 @@
 NoUnnamedConstructorInObject/analyzerCode: Fail
 NoUnnamedConstructorInObject/example: Fail
 NonAsciiIdentifier/expression: Fail
+NonConstConstructor/example: Fail
+NonConstFactory/example: Fail
 NonInstanceTypeVariableUse/example: Fail
 NonPartOfDirectiveInPart/script1: Fail
+NotAConstantExpression/example: Fail
 NotAPrefixInTypeAnnotation/example: Fail
 NotAType/example: Fail
 NotAnLvalue/analyzerCode: Fail
 NotAnLvalue/example: Fail
+NotConstantExpression/example: Fail
 OperatorMinusParameterMismatch/example: Fail
 OperatorParameterMismatch0/analyzerCode: Fail
 OperatorParameterMismatch0/example: Fail
@@ -319,7 +317,6 @@
 SourceOutlineSummary/example: Fail
 StackOverflow/example: Fail
 StaticAfterConst/script1: Fail
-SuperAsExpression/analyzerCode: Fail
 SuperAsExpression/example: Fail
 SuperAsIdentifier/analyzerCode: Fail
 SuperAsIdentifier/example: Fail
@@ -339,7 +336,6 @@
 SupertypeIsTypeVariable/analyzerCode: Fail
 SupertypeIsTypeVariable/example: Fail
 SwitchCaseFallThrough/example: Fail
-ThisAccessInFieldInitializer/analyzerCode: Fail
 ThisAccessInFieldInitializer/example: Fail
 ThisAsIdentifier/analyzerCode: Fail
 ThisAsIdentifier/example: Fail
@@ -354,7 +350,6 @@
 TypeNotFound/example: Fail
 TypeVariableDuplicatedName/example: Fail
 TypeVariableInStaticContext/example: Fail
-TypeVariableSameNameAsEnclosing/analyzerCode: Fail
 TypeVariableSameNameAsEnclosing/example: Fail
 TypedefNotFunction/example: Fail
 UnexpectedDollarInString/script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index e6e0060..7c48b34 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -135,6 +135,17 @@
   template: "The variable '#string' is not a constant, only constant expressions are allowed."
   analyzerCode: NON_CONSTANT_VALUE_IN_INITIALIZER
 
+NotConstantExpression:
+  template: "#string is not a constant expression."
+  analyzerCode: NOT_CONSTANT_EXPRESSION
+  dart2jsCode: "*fatal*"
+
+NotAConstantExpression:
+  template: "Not a constant expression."
+  severity: ERROR
+  analyzerCode: NOT_CONSTANT_EXPRESSION
+  dart2jsCode: "*fatal*"
+
 NonAsciiIdentifier:
   template: "The non-ASCII character '#character' (#unicode) can't be used in identifiers, only in strings and comments."
   tip: "Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)."
@@ -207,6 +218,7 @@
   statement: "void;"
 
 ExpectedButGot:
+  # Also see ExpectedAfterButGot
   template: "Expected '#string' before this."
   # Consider the second example below: the parser expects a ')' before 'y', but
   # a ',' would also have worked. We don't have enough information to give a
@@ -217,6 +229,32 @@
     - "main() => true ? 1;"
     - "main() => foo(x: 1 y: 2);"
 
+ExpectedAfterButGot:
+  # Also see ExpectedButGot
+  template: "Expected '#string' after this."
+  # This is an alternative to ExpectedButGot when it's better for the error to be
+  # associated with the last consumed token rather than the token being parsed.
+  # Doing so can make it cognitively easier for the user to understand and fix.
+  #
+  # For example, this is ok...
+  #
+  #    x = 7
+  #    class Foo {
+  #    ^^^^^
+  #        Expected ';' before this
+  #
+  # but this is easier for the user...
+  #
+  #    x = 7
+  #        ^
+  #        Expected ';' after this
+  #    class Foo {
+  #
+  analyzerCode: EXPECTED_TOKEN
+  dart2jsCode: MISSING_TOKEN_AFTER_THIS
+  script:
+    - "main() { return true }"
+
 MultipleLibraryDirectives:
   template: "Only one library directive may be declared in a file."
   tip: "Try removing all but one of the library directives."
@@ -463,6 +501,20 @@
   script:
     - "class C { const factory C() {} }"
 
+NonConstFactory:
+  template: "Cannot invoke a non-'const' factory where a const expression is expected."
+  tip: "Try using a constructor or factory that is 'const'."
+  severity: ERROR
+  analyzerCode: NOT_CONSTANT_EXPRESSION
+  dart2jsCode: "*fatal*"
+
+NonConstConstructor:
+  template: "Cannot invoke a non-'const' constructor where a const expression is expected."
+  tip: "Try using a constructor or factory that is 'const'."
+  severity: ERROR
+  analyzerCode: NOT_CONSTANT_EXPRESSION
+  dart2jsCode: "*fatal*"
+
 ConstAfterFactory:
   template: "The modifier 'const' should be before the modifier 'factory'."
   tip: "Try re-ordering the modifiers."
@@ -949,9 +1001,14 @@
       await for (var e in o) {}
     }
 
+ConstructorNotSync:
+  template: "Constructor bodies can't use 'async', 'async*', or 'sync*'."
+  analyzerCode: NON_SYNC_CONSTRUCTOR
+  dart2jsCode: "*ignored*"
+
 FactoryNotSync:
-  template: "Factories can't use 'async', 'async*', or 'sync*'."
-  analyzerCode: NON_SYNC_FACTORY_METHOD
+  template: "Factory bodies can't use 'async', 'async*', or 'sync*'."
+  analyzerCode: NON_SYNC_FACTORY
   dart2jsCode: "*ignored*"
 
 GeneratorReturnsValue:
@@ -1213,16 +1270,22 @@
   severity: CONTEXT
 
 ListLiteralTooManyTypeArguments:
-  template: "Too many type arguments on List literal."
+  template: "List literal requires exactly one type argument."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: EXPECTED_ONE_LIST_TYPE_ARGUMENTS
+  dart2jsCode: "*fatal*"
 
-ListLiteralTypeArgumentMismatch:
-  template: "Map literal requires two type arguments."
+MapLiteralTypeArgumentMismatch:
+  template: "Map literal requires exactly two type arguments."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: EXPECTED_TWO_MAP_TYPE_ARGUMENTS
+  dart2jsCode: "*fatal*"
 
 LoadLibraryTakesNoArguments:
   template: "'loadLibrary' takes no arguments."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: LOAD_LIBRARY_TAKES_NO_ARGUMENTS
+  dart2jsCode: "*fatal*"
 
 LoadLibraryHidesMember:
   template: "The library '#uri' defines a top-level member named 'loadLibrary'. This member is hidden by the special member 'loadLibrary' that the language adds to support deferred loading."
@@ -1523,6 +1586,8 @@
 ConflictsWithConstructor:
   template: "Conflicts with constructor '#name'."
   severity: ERROR
+  analyzerCode: CONFLICTS_WITH_CONSTRUCTOR
+  dart2jsCode: "*fatal*"
 
 ConflictsWithFactory:
   template: "Conflicts with factory '#name'."
@@ -1531,6 +1596,8 @@
 ConflictsWithMember:
   template: "Conflicts with member '#name'."
   severity: ERROR
+  analyzerCode: CONFLICTS_WITH_MEMBER
+  dart2jsCode: "*fatal*"
 
 ConflictsWithMemberWarning:
   template: "Conflicts with member '#name'."
@@ -1547,6 +1614,8 @@
 ConflictsWithTypeVariable:
   template: "Conflicts with type variable '#name'."
   severity: ERROR
+  analyzerCode: CONFLICTING_TYPE_VARIABLE_AND_MEMBER
+  dart2jsCode: "*fatal*"
 
 ConflictsWithTypeVariableCause:
   template: "This is the type variable."
@@ -1555,6 +1624,8 @@
 DeclaredMemberConflictsWithInheritedMember:
   template: "Can't declare a member that conflicts with an inherited one."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: DECLARED_MEMBER_CONFLICTS_WITH_INHERITED
+  dart2jsCode: "*fatal*"
   script:
     - >-
       class A {
@@ -1592,6 +1663,8 @@
 InheritedMembersConflict:
   template: "Can't inherit members that conflict with each other."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: CONFLICTS_WITH_INHERITED_MEMBER
+  dart2jsCode: "*fatal*"
   script:
     - >-
       class A {
@@ -1690,6 +1763,8 @@
 
 TypeVariableSameNameAsEnclosing:
   template: "A type variable can't have the same name as its enclosing declaration."
+  analyzerCode: CONFLICTING_TYPE_VARIABLE_AND_CLASS
+  dart2jsCode: "*fatal*"
 
 ExpectedEnumBody:
   template: "Expected a enum body, but got '#lexeme'."
@@ -1928,6 +2003,7 @@
 
 DuplicatedParameterName:
   template: "Duplicated parameter name '#name'."
+  severity: ERROR
   analyzerCode: DUPLICATE_DEFINITION
   dart2jsCode: "*fatal*"
 
@@ -2024,6 +2100,8 @@
 
 ThisAccessInFieldInitializer:
   template: "Can't access 'this' in a field initializer to read '#name'."
+  analyzerCode: THIS_ACCESS_FROM_INITIALIZER
+  dart2jsCode: "*fatal*"
 
 ThisAsIdentifier:
   template: "Expected identifier, but got 'this'."
@@ -2034,6 +2112,8 @@
 SuperAsExpression:
   template: "Can't use 'super' as an expression."
   tip: "To delegate a constructor to a super constructor, put the super call as an initializer."
+  analyzerCode: SUPER_AS_EXPRESSION
+  dart2jsCode: "*fatal*"
 
 SwitchHasCaseAfterDefault:
   template: "The default case should be the last case in a switch statement."
@@ -2060,6 +2140,8 @@
 FinalInstanceVariableAlreadyInitialized:
   template: "'#name' is a final instance variable that has already been initialized."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: FINAL_INITIALIZED_MULTIPLE_TIMES
+  dart2jsCode: "*fatal*"
 
 FinalInstanceVariableAlreadyInitializedCause:
   template: "'#name' was initialized here."
@@ -2385,6 +2467,17 @@
   severity: ERROR
   statement: "for (var x, y in []) {}"
 
+ForInLoopElementTypeNotAssignable:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
+  tip: "Try changing the type of the variable."
+  analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  dart2jsCode: "*fatal*"
+
+ForInLoopTypeNotIterable:
+  template: "The type '#type' used in the 'for' loop must implement '#type2'."
+  analyzerCode: FOR_IN_OF_INVALID_TYPE
+  dart2jsCode: "*fatal*"
+
 InitializingFormalTypeMismatch:
   template: "The type of parameter '#name' (#type) is not a subtype of the corresponding field's type (#type2)."
   tip: "Try changing the type of parameter '#name' to a subtype of #type2."
@@ -2517,3 +2610,11 @@
       factory Foo.bar() = Foo.foo;
     }
     main() { var foo = new Foo.foo(); }
+
+GenericFunctionTypeInBound:
+  template: "Type variables can't have generic function types in their bounds."
+  analyzerCode: GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND
+  dart2jsCode: "*fatal*"
+  severity: ERROR
+  script: |
+    class Hest<X extends Y Function<Y>(Y)> {}
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 3ba613b..45642d3 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -205,7 +205,7 @@
         "ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
         new ThisAccessGenerator(helper, token, false));
     check("IncompleteErrorGenerator(offset: 4, message: Unspecified)",
-        new IncompleteErrorGenerator(helper, token, message));
+        new IncompleteErrorGenerator(helper, token, getter, message));
     check("SendAccessGenerator(offset: 4, name: bar, arguments: (\"arg\"))",
         new SendAccessGenerator(helper, token, name, arguments));
     check("IncompletePropertyAccessGenerator(offset: 4, name: bar)",
diff --git a/pkg/front_end/test/src/byte_store/crc32_test.dart b/pkg/front_end/test/src/byte_store/crc32_test.dart
index 0119bb8..0d209bb 100644
--- a/pkg/front_end/test/src/byte_store/crc32_test.dart
+++ b/pkg/front_end/test/src/byte_store/crc32_test.dart
@@ -33,6 +33,6 @@
   }
 
   test_string() {
-    expect(getCrc32(UTF8.encode('My very long test string.')), 0x88B8252E);
+    expect(getCrc32(utf8.encode('My very long test string.')), 0x88B8252E);
   }
 }
diff --git a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
index d117bf4..e1fc175 100644
--- a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
+++ b/pkg/front_end/test/src/byte_store/protected_file_byte_store_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.
 
+import 'dart:async';
 import 'dart:io' as io;
 
 import 'package:front_end/src/byte_store/protected_file_byte_store.dart';
@@ -49,7 +50,7 @@
     } on io.FileSystemException {}
   }
 
-  test_flush() {
+  test_flush() async {
     store.put('a', _b(1));
     store.put('b', _b(2));
     store.put('c', _b(3));
@@ -57,6 +58,9 @@
 
     store.updateProtectedKeys(add: ['b', 'd']);
 
+    // Add a delay to give the store time to write to disk.
+    await new Future.delayed(const Duration(milliseconds: 200));
+
     // Flush, only protected 'b' and 'd' survive.
     store.flush();
     store.flush();
@@ -69,7 +73,7 @@
     _assertCacheContent({'d': 4}, ['b']);
   }
 
-  test_put() {
+  test_put() async {
     store.put('a', _b(65));
     store.put('b', _b(63));
     store.put('c', _b(1));
@@ -78,6 +82,10 @@
     expect(store.get('a'), hasLength(65));
     expect(store.get('b'), hasLength(63));
     expect(store.get('c'), hasLength(1));
+
+    // Add a delay to give the store time to write to disk.
+    await new Future.delayed(const Duration(milliseconds: 200));
+
     _assertCacheContent({'a': 65, 'b': 63, 'c': 1}, []);
   }
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
index 0ff5bf9..3748727 100644
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
@@ -1,10 +1,11 @@
 library;
 import self as self;
 import "./deferred_lib.dart" as def;
+import "dart:core" as core;
 
 static method main() → dynamic {}
 static method test() → dynamic {
-  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2();
+  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2() as{TypeError} core::int;
   let final dynamic #t2 = CheckLibraryIsLoaded(lib) in def::m(self::m2());
 }
 static method m2() → dynamic
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
index 74489ed..0cf7c47 100644
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic {
-  let final core::Object #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2();
+  let final core::Object #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2() as{TypeError} core::int;
   let final core::Object #t2 = CheckLibraryIsLoaded(lib) in def::m(self::m2());
 }
 static method m2() → dynamic
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index f34d98f..cd8199e 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -117,6 +117,8 @@
 runtime_checks_new/mixin_forwarding_stub_getter: RuntimeError # Test exercises strong mode semantics
 runtime_checks_new/mixin_forwarding_stub_setter: RuntimeError # Test exercises strong mode semantics
 runtime_checks_new/stub_checked_via_target: RuntimeError # Test exercises strong mode semantics
+constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
+redirecting_factory_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
 
 ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
 rasta/duplicated_mixin: RuntimeError # Expected, this file has no main method.
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart b/pkg/front_end/testcases/constructor_const_inference.dart
new file mode 100644
index 0000000..824e517
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_const_inference.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 test checks that the type inference implementation correctly uses least
+// closure of the inferred type arguments in invocations of 'const' constructors
+// in case there are type variables in them.
+
+class _Y<T> {
+  const _Y();
+}
+
+class A<T> {
+  _Y<T> x;
+  A(this.x);
+}
+
+class B<T> extends A<T> {
+  B() : super(const _Y());
+}
+
+main() {
+  dynamic x = new B().x;
+  if (x is! _Y<Null>) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, "
+        "but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect b/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect
new file mode 100644
index 0000000..00cffbc
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object = dynamic> extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  field self::_Y<self::A::T> x;
+  constructor •(self::_Y<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<dynamic>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().x;
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect
new file mode 100644
index 0000000..00cffbc
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object = dynamic> extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  field self::_Y<self::A::T> x;
+  constructor •(self::_Y<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<dynamic>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().x;
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect b/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
new file mode 100644
index 0000000..0e89f88
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object = dynamic> extends core::Object {
+  const constructor •() → void
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  field self::_Y<self::A::T> x;
+  constructor •(self::_Y<self::A::T> x) → void
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect b/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect
new file mode 100644
index 0000000..0ec23a5
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object = dynamic> extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field self::_Y<self::A::T> x;
+  constructor •(self::_Y<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<core::Null>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().{self::A::x};
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..0ec23a5
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object = dynamic> extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field self::_Y<self::A::T> x;
+  constructor •(self::_Y<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<core::Null>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().{self::A::x};
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
index f6b2dd6..f7f9eda 100644
--- a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
@@ -1,5 +1,6 @@
 Errors: {
   Method not found: 'Directory'. (@4)
+  Too many positional arguments: 0 allowed, 1 given. (@0)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
   return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#Directory, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>["test"]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart b/pkg/front_end/testcases/inference/conflicts_can_happen.dart
index aaebf32..ce73f69 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart
@@ -22,13 +22,13 @@
 }
 
 class C1 implements A, B {
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
       null;
 }
 
 // Still ambiguous
 class C2 implements B, A {
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
       null;
 }
 
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index 9cc64f9..c37d0e9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -1,14 +1,34 @@
 // Errors:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: Can't infer the type of 'a': overridden members must all have the same type.
 // Specify the type explicitly.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
-//                                                                               ^
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: Can't infer the type of 'a': overridden members must all have the same type.
 // Specify the type explicitly.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
-//                                                                               ^
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1::a' is dynamic, which does not match the return type of the overridden method (test::I1).
+// Change to a subtype of test::I1.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1::a' is dynamic, which does not match the return type of the overridden method (test::I2).
+// Change to a subtype of test::I2.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I2).
+// Change to a subtype of test::I2.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I1).
+// Change to a subtype of test::I1.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
 
 library test;
 import self as self;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart
index 85e0bd5..150baa5 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart
@@ -31,7 +31,7 @@
 }
 
 class C2 implements A, B {
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
       null;
 }
 
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 69d9cd1..746541f 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -1,9 +1,19 @@
 // Errors:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: Can't infer the type of 'a': overridden members must all have the same type.
 // Specify the type explicitly.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
-//                                                                               ^
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I1).
+// Change to a subtype of test::I1.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I2).
+// Change to a subtype of test::I2.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
 
 library test;
 import self as self;
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
index fcd76d6..d3420e5 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
+// Change to a subtype of dart.core::int.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
index a7484f4..8b6336a 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
@@ -29,15 +29,15 @@
 // Superclasses don't have a consistent type for `x` so inference fails, even if
 // the types are related.
 class F extends A implements C {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 }
 
 class G extends A implements D {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 }
 
 class H extends C implements D {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index e636683..ec15c8d 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -1,19 +1,49 @@
 // Errors:
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: Can't infer the type of 'x': overridden members must all have the same type.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
-//                                                                               ^
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: Can't infer the type of 'x': overridden members must all have the same type.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
-//                                                                               ^
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: Can't infer the type of 'x': overridden members must all have the same type.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
-//                                                                               ^
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
+// Change to a subtype of dart.core::int.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F::x' is dynamic, which does not match the return type of the overridden method (dart.core::num).
+// Change to a subtype of dart.core::num.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
+// Change to a subtype of dart.core::int.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G::x' is dynamic, which does not match the return type of the overridden method (dart.core::double).
+// Change to a subtype of dart.core::double.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H::x' is dynamic, which does not match the return type of the overridden method (dart.core::num).
+// Change to a subtype of dart.core::num.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H::x' is dynamic, which does not match the return type of the overridden method (dart.core::double).
+// Change to a subtype of dart.core::double.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
 
 library test;
 import self as self;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
index 615fcf8..9b83615 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
+// Change to a subtype of dart.core::int.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
index 4b7c312..f79f8f4 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
@@ -48,7 +48,7 @@
   }
   for (final self::Foo #t7 in list) {
     core::String x = let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+Try changing the type of the variable.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in let final dynamic #t9 = #t7 in null;
     core::String y = x;
@@ -69,8 +69,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
+  for (dynamic x in let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                    ^" in let final dynamic #t14 = map in null) {
     core::String y = x as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index 674ff5c..c3336c2 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -48,7 +48,7 @@
   }
   for (final self::Foo #t7 in list) {
     core::String x = let<BottomType> _ = null in let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+Try changing the type of the variable.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in let final self::Foo #t9 = #t7 in null;
     core::String y = x;
@@ -69,8 +69,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
+  for (dynamic x in let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                    ^" in let final core::Map<core::String, self::Foo> #t14 = map in null) {
     core::String y = x as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 5ebd147..a915514 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -53,7 +53,7 @@
   }
   await for (final self::Foo #t7 in myStream) {
     core::String x = let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+Try changing the type of the variable.
   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                     ^" in let final dynamic #t9 = #t7 in null;
     core::String y = x;
@@ -74,8 +74,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  await for (dynamic x in let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
+  await for (dynamic x in let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                          ^" in let final dynamic #t14 = map in null) {
     core::String y = x as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index f191019..a3426db 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -202,7 +202,7 @@
                 final self::Foo #t16 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   core::String x = let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+Try changing the type of the variable.
   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                     ^" in let final self::Foo #t18 = #t16 in null;
                   core::String y = x;
@@ -288,8 +288,7 @@
         }
         core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
         {
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                          ^" in let final core::Map<core::String, self::Foo> #t30 = map in null);
           try
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart
index 5360fa7..da9ed77 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart
@@ -7,11 +7,11 @@
 
 test() async {
   String s;
-  for (int x in /*@error=InvalidAssignment*/ s) {}
-  await for (int x in /*@error=InvalidAssignment*/ s) {}
+  for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
+  await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
   int y;
-  for (y in /*@error=InvalidAssignment*/ s) {}
-  await for (y in /*@error=InvalidAssignment*/ s) {}
+  for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
+  await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
index cb323c5..9e2999f 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
@@ -4,29 +4,25 @@
 
 static method test() → dynamic async {
   core::String s;
-  for (final dynamic #t1 in let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
-  for (int x in /*@error=InvalidAssignment*/ s) {}
-                                             ^" in let final dynamic #t3 = s in null) {
+  for (final dynamic #t1 in let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                    ^" in let final dynamic #t3 = s in null) {
     core::int x = #t1 as{TypeError} core::int;
   }
-  await for (final dynamic #t4 in let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
-  await for (int x in /*@error=InvalidAssignment*/ s) {}
-                                                   ^" in let final dynamic #t6 = s in null) {
+  await for (final dynamic #t4 in let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                          ^" in let final dynamic #t6 = s in null) {
     core::int x = #t4 as{TypeError} core::int;
   }
   core::int y;
-  for (final dynamic #t7 in let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
-  for (y in /*@error=InvalidAssignment*/ s) {}
-                                         ^" in let final dynamic #t9 = s in null) {
+  for (final dynamic #t7 in let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                ^" in let final dynamic #t9 = s in null) {
     y = #t7 as{TypeError} core::int;
   }
-  await for (final dynamic #t10 in let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
-  await for (y in /*@error=InvalidAssignment*/ s) {}
-                                               ^" in let final dynamic #t12 = s in null) {
+  await for (final dynamic #t10 in let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                      ^" in let final dynamic #t12 = s in null) {
     y = #t10 as{TypeError} core::int;
   }
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index 475b64a..ca1eeb2 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -20,17 +20,15 @@
       #L1:
       {
         core::String s;
-        for (final dynamic #t1 in let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
-  for (int x in /*@error=InvalidAssignment*/ s) {}
-                                             ^" in let final core::String #t3 = s in null) {
+        for (final dynamic #t1 in let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                    ^" in let final core::String #t3 = s in null) {
           core::int x = #t1 as{TypeError} core::int;
         }
         {
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
-  await for (int x in /*@error=InvalidAssignment*/ s) {}
-                                                   ^" in let final core::String #t5 = s in null);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                          ^" in let final core::String #t5 = s in null);
           try
             #L2:
             while (true) {
@@ -51,17 +49,15 @@
             }
         }
         core::int y;
-        for (final dynamic #t9 in let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
-  for (y in /*@error=InvalidAssignment*/ s) {}
-                                         ^" in let final core::String #t11 = s in null) {
+        for (final dynamic #t9 in let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                ^" in let final core::String #t11 = s in null) {
           y = #t9 as{TypeError} core::int;
         }
         {
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
-  await for (y in /*@error=InvalidAssignment*/ s) {}
-                                               ^" in let final core::String #t13 = s in null);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
+                                                      ^" in let final core::String #t13 = s in null);
           try
             #L3:
             while (true) {
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart
index 06ba28b..9ffdfe8 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart
@@ -23,8 +23,8 @@
   await for (a in stream) {}
   for (b in iterable) {}
   await for (b in stream) {}
-  for (i /*@error=InvalidAssignment*/ in iterable) {}
-  await for (i /*@error=InvalidAssignment*/ in stream) {}
+  for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
+  await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
   for (a in /*@typeArgs=Iterable<A>*/ f()) {}
   await for (a in /*@typeArgs=Stream<A>*/ f()) {}
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index 4c88501..9ac5ea0 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -34,16 +34,16 @@
     b = #t4 as{TypeError} self::B;
   }
   for (final self::A #t5 in iterable) {
-    i = let dynamic _ = null in let final dynamic #t6 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
-  for (i /*@error=InvalidAssignment*/ in iterable) {}
-                                      ^" in let final dynamic #t7 = #t5 in null;
+    i = let dynamic _ = null in let final dynamic #t6 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+Try changing the type of the variable.
+  for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
+                                                      ^" in let final dynamic #t7 = #t5 in null;
   }
   await for (final self::A #t8 in stream) {
-    i = let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
-  await for (i /*@error=InvalidAssignment*/ in stream) {}
-                                            ^" in let final dynamic #t10 = #t8 in null;
+    i = let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+Try changing the type of the variable.
+  await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
+                                                            ^" in let final dynamic #t10 = #t8 in null;
   }
   for (final self::A #t11 in self::f<core::Iterable<self::A>>()) {
     a = #t11;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index 399a9d4..e371b6c 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -85,10 +85,10 @@
             }
         }
         for (final self::A #t9 in iterable) {
-          i = let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
-  for (i /*@error=InvalidAssignment*/ in iterable) {}
-                                      ^" in let final self::A #t11 = #t9 in null;
+          i = let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+Try changing the type of the variable.
+  for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
+                                                      ^" in let final self::A #t11 = #t9 in null;
         }
         {
           asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(stream);
@@ -99,10 +99,10 @@
               if(:result) {
                 final self::A #t13 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  i = let<BottomType> _ = null in let final dynamic #t14 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
-  await for (i /*@error=InvalidAssignment*/ in stream) {}
-                                            ^" in let final self::A #t15 = #t13 in null;
+                  i = let<BottomType> _ = null in let final dynamic #t14 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+Try changing the type of the variable.
+  await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
+                                                            ^" in let final self::A #t15 = #t13 in null;
                 }
               }
               else
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index ad2a9c8..dcef35c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:24: Error: The return type of the method 'B::x' is dart.core::int, which does not match the return type of the overridden method (dart.core::double).
+// Change to a subtype of dart.core::double.
+//   var /*@topType=int*/ x;
+//                        ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index 85d23e6..d765039 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:24: Error: The return type of the method 'C::x' is dart.core::int, which does not match the return type of the overridden method (dart.core::num).
+// Change to a subtype of dart.core::num.
+//   var /*@topType=int*/ x;
+//                        ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
index 372b447..c807c38 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart:11:12: Error: Type variables can't have generic function types in their bounds.
+// class Fisk<TypeY extends Function<TypeZ extends Hest<Null>>(TypeZ)> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,7 +13,7 @@
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
index 372b447..c807c38 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart:11:12: Error: Type variables can't have generic function types in their bounds.
+// class Fisk<TypeY extends Function<TypeZ extends Hest<Null>>(TypeZ)> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,7 +13,7 @@
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.expect b/pkg/front_end/testcases/magic_const.dart.direct.expect
index 31bfe5f..0e35d4e 100644
--- a/pkg/front_end/testcases/magic_const.dart.direct.expect
+++ b/pkg/front_end/testcases/magic_const.dart.direct.expect
@@ -14,7 +14,8 @@
 }
 static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Not a const constructor.
+  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
   const NotConstant();
         ^";
   new self::Constant::•();
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect b/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
index 31bfe5f..0e35d4e 100644
--- a/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
@@ -14,7 +14,8 @@
 }
 static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Not a const constructor.
+  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
   const NotConstant();
         ^";
   new self::Constant::•();
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.expect b/pkg/front_end/testcases/magic_const.dart.strong.expect
index d60f57e..990b71e 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.expect
@@ -14,7 +14,8 @@
 }
 static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Not a const constructor.
+  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
   const NotConstant();
         ^";
   new self::Constant::•();
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
index d60f57e..990b71e 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
@@ -14,7 +14,8 @@
 }
 static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Not a const constructor.
+  invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
   const NotConstant();
         ^";
   new self::Constant::•();
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
index 081ba63..26812a7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void foo(int x) {}
+//        ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect
index 081ba63..26812a7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void foo(int x) {}
+//        ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 4d36a7b..d4f9d08 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -1,5 +1,9 @@
 // Errors:
 //
+// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void n() {}
+//        ^
+//
 // pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
 // Try removing '+'.
 //     +super;
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart b/pkg/front_end/testcases/redirecting_factory_const_inference.dart
new file mode 100644
index 0000000..8d904fd
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the type inference implementation correctly uses least
+// closure of the inferred type arguments in invocations of 'const' redirecting
+// factory constructors in case there are type variables in them.
+
+class _X<T> {
+  const factory _X() = _Y<T>;
+}
+
+class _Y<T> implements _X<T> {
+  const _Y();
+}
+
+class A<T> {
+  _X<T> x;
+  A(this.x);
+}
+
+class B<T> extends A<T> {
+  B() : super(const _X());
+}
+
+main() {
+  dynamic x = new B().x;
+  if (x is! _Y<Null>) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, "
+        "but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect
new file mode 100644
index 0000000..5e1d683
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  field self::_X<self::A::T> x;
+  constructor •(self::_X<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<dynamic>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().x;
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect
new file mode 100644
index 0000000..5e1d683
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  field self::_X<self::A::T> x;
+  constructor •(self::_X<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<dynamic>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().x;
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
new file mode 100644
index 0000000..1b16077
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
+  const constructor •() → void
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  field self::_X<self::A::T> x;
+  constructor •(self::_X<self::A::T> x) → void
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect
new file mode 100644
index 0000000..3e7197c
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field self::_X<self::A::T> x;
+  constructor •(self::_X<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<core::Null>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().{self::A::x};
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..c825208
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
+    let<BottomType> #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field self::_X<self::A::T> x;
+  constructor •(self::_X<self::A::T> x) → void
+    : self::A::x = x, super core::Object::•()
+    ;
+}
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
+  constructor •() → void
+    : super self::A::•(const self::_Y::•<core::Null>())
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().{self::A::x};
+  if(!(x is self::_Y<core::Null>)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
index 7bb3ead..ad177b0 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
@@ -25,9 +25,9 @@
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected ';' after this.
+//   )
+//   ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
index 7bb3ead..ad177b0 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
@@ -25,9 +25,9 @@
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected ';' after this.
+//   )
+//   ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
index 1e14bbe..125df90 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
@@ -33,9 +33,9 @@
 //   f(
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected ';' after this.
+//   )
+//   ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
index 4ef9968..d87258e 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
@@ -5,9 +5,9 @@
 //   🔛
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
index 4ef9968..d87258e 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
@@ -5,9 +5,9 @@
 //   🔛
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
index 9eae89d..2ec7cc8 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
@@ -5,9 +5,9 @@
 //   🔛
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
 //
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '🔛'.
 //   🔛
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect
index 9eae89d..2ec7cc8 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect
@@ -5,9 +5,9 @@
 //   🔛
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-// }
-// ^
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
 //
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '🔛'.
 //   🔛
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
index 226845f..0f54478 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
-//                   ^
+//                  ^
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
index 226845f..0f54478 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
-//                   ^
+//                  ^
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
index f4bc906..f805c54 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
-//                   ^
+//                  ^
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
index c20c97e..e7de89b 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
-//                   ^
+//                  ^
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
index fbeb2bc..49b38eb 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
@@ -4,7 +4,7 @@
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
index fbeb2bc..49b38eb 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
index fbeb2bc..49b38eb 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -4,7 +4,7 @@
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
index fbeb2bc..49b38eb 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
 // typedef F = Map<String, dynamic> Function();
 // ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
index 8d617e0..0e18d33 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
 //   for (int i = 0, i > 10; i++) {}
-//                     ^
+//                   ^
 //
 // pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
 //   for (int i = 0, i > 10; i++) {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
index 8d617e0..0e18d33 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
 //   for (int i = 0, i > 10; i++) {}
-//                     ^
+//                   ^
 //
 // pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
 //   for (int i = 0, i > 10; i++) {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
index 0485037..b3ffbf8 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
 //   for (int i = 0, i > 10; i++) {}
-//                     ^
+//                   ^
 //
 // pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
 //   for (int i = 0, i > 10; i++) {}
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
index 3b34000..d3a912f 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
@@ -1,12 +1,12 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
-//               ^
+//            ^^
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:12:14: Error: Expected ';' after this.
 //   return (i) ++ (i);
-//                 ^
+//              ^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
index 3b34000..d3a912f 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
@@ -1,12 +1,12 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
-//               ^
+//            ^^
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:12:14: Error: Expected ';' after this.
 //   return (i) ++ (i);
-//                 ^
+//              ^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
index 96522f4..f26aee4 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
@@ -1,12 +1,12 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
-//               ^
+//            ^^
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:12:14: Error: Expected ';' after this.
 //   return (i) ++ (i);
-//                 ^
+//              ^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
index a48a597..1e08909 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
@@ -1,12 +1,12 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
-//               ^
+//            ^^
 //
-// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31185.dart:12:14: Error: Expected ';' after this.
 //   return (i) ++ (i);
-//                 ^
+//              ^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
index 404127d..eb3888b 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // type T = Map<A, B>
-//                  ^
+//                 ^
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
 // type T = Map<A, B>
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
index 404127d..eb3888b 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // type T = Map<A, B>
-//                  ^
+//                 ^
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
 // type T = Map<A, B>
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
index 51447393..c9a4233 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // type T = Map<A, B>
-//                  ^
+//                 ^
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
 // type T = Map<A, B>
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
index c128307..b9f1830 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -1,8 +1,8 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // type T = Map<A, B>
-//                  ^
+//                 ^
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
 // type T = Map<A, B>
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
index 2af900e..30d4403 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
@@ -1,13 +1,3 @@
-// Errors:
-//
-// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
-//   A.foo() : m = 2;
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
-//   int foo(int a, int b) => a + b * m;
-//       ^
-
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
index 2af900e..30d4403 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
@@ -1,13 +1,3 @@
-// Errors:
-//
-// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
-//   A.foo() : m = 2;
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
-//   int foo(int a, int b) => a + b * m;
-//       ^
-
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
index 8a7471d..33b03d6 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -1,13 +1,5 @@
 // Errors:
 //
-// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
-//   A.foo() : m = 2;
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
-//   int foo(int a, int b) => a + b * m;
-//       ^
-//
 // pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments: 0 allowed, 2 given.
 //   new A.foo(1, 2);
 //       ^
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart
new file mode 100644
index 0000000..cdf7460
--- /dev/null
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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 generic function types are rejected with an appropriate
+// compile-time error message if encountered in bounds of type variables.
+
+class Hest<TypeX extends TypeY Function<TypeY>(TypeY)> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect
new file mode 100644
index 0000000..8abcc85
--- /dev/null
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect
new file mode 100644
index 0000000..8abcc85
--- /dev/null
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.outline.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.outline.expect
new file mode 100644
index 0000000..1149d7f
--- /dev/null
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.expect
new file mode 100644
index 0000000..8bd0c4b
--- /dev/null
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.expect
@@ -0,0 +1,16 @@
+// Errors:
+//
+// pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart:8:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends TypeY Function<TypeY>(TypeY)> {}
+//            ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.transformed.expect
new file mode 100644
index 0000000..8bd0c4b
--- /dev/null
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+// Errors:
+//
+// pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart:8:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends TypeY Function<TypeY>(TypeY)> {}
+//            ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
index 3234a21..36ff607b 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
@@ -30,9 +30,9 @@
   synthetic constructor •() → void
     : super self::B::•()
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x]) → void
+  forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x}) → void
+  forwarding-stub method g({generic-covariant-impl core::num x = 20}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
index 3234a21..36ff607b 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
@@ -30,9 +30,9 @@
   synthetic constructor •() → void
     : super self::B::•()
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x]) → void
+  forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x}) → void
+  forwarding-stub method g({generic-covariant-impl core::num x = 20}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 4c3a11f..b5d4f7b 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -201,7 +201,6 @@
 regress/issue_31299: TypeCheckError
 regress/issue_33452: RuntimeError # Test has an intentional error
 
-runtime_checks/forwarding_stub_with_default_values: RuntimeError # Bug 31027
 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 5332ba5..9813833 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1943,6 +1943,7 @@
         var annotation = annotations[i];
         annotation.parent = node;
       }
+      node.annotations = annotations;
     }
     return node;
   }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index b59903b..06207a7 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -823,7 +823,7 @@
     writeOffset(node.fileEndOffset);
     writeByte(node.kind.index);
     writeByte(node.flags);
-    writeName(node.name ?? '');
+    writeName(node.name ?? _emptyName);
     writeAnnotationList(node.annotations);
     writeOptionalReference(node.forwardingStubSuperTargetReference);
     writeOptionalReference(node.forwardingStubInterfaceTargetReference);
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 4239b87..3d8e362 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -27,7 +27,7 @@
       // TODO(ahe): Fix the compiler instead.
     }
     if (location != null) {
-      String file = location.file ?? "";
+      String file = location.file?.toString() ?? "";
       return "$file:${location.line}:${location.column}: Verification error:"
           " $details";
     } else {
diff --git a/pkg/kernel/test/class_hierarchy_basic.dart b/pkg/kernel/test/class_hierarchy_basic.dart
index 1f69a0e..6179cb0 100644
--- a/pkg/kernel/test/class_hierarchy_basic.dart
+++ b/pkg/kernel/test/class_hierarchy_basic.dart
@@ -4,12 +4,13 @@
 
 library kernel.class_hierarchy_basic;
 
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/ast.dart';
 
 /// A simple implementation of the class hierarchy interface using
 /// hash tables for everything.
-class BasicClassHierarchy {
+class BasicClassHierarchy implements ClassHierarchy {
   final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{};
   final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{};
   final Map<Class, Set<Class>> supertypes = <Class, Set<Class>>{};
@@ -215,7 +216,7 @@
     return setter ? setters[class_][name] : gettersAndCalls[class_][name];
   }
 
-  Iterable<Member> getDispatchTargets(Class class_, {bool setters: false}) {
+  List<Member> getDispatchTargets(Class class_, {bool setters: false}) {
     return setters
         ? this.setters[class_].values
         : gettersAndCalls[class_].values;
@@ -237,7 +238,7 @@
     return iterable == null ? const <Member>[] : iterable;
   }
 
-  Iterable<Member> getInterfaceMembers(Class class_, {bool setters: false}) {
+  List<Member> getInterfaceMembers(Class class_, {bool setters: false}) {
     return setters
         ? interfaceSetters[class_].values.expand((x) => x)
         : interfaceGettersAndCalls[class_].values.expand((x) => x);
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index ed639d0..dd92cbe 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 1.1.5
 
+* Set max SDK version to <3.0.0.
+
 * Introduce @isTest and @isTestGroup to declare a function that is a
   test, or a test group.
 
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index 73e1dfd..e908e08 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 1.1.5
+version: 1.1.6
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/meta
 description: >
@@ -7,4 +7,4 @@
  semantic information about the program being annotated. These annotations are
  intended to be used by tools to provide a better user experience.
 environment:
-  sdk: '>=1.12.0 <2.0.0'
+  sdk: '>=1.12.0 <3.0.0'
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 66c275c..e2a1a1a 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -26,13 +26,10 @@
 analyzer_plugin/test/plugin/folding_mixin_test: Slow, Pass
 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/options/*: Skip # test needs fixes
+dev_compiler/test/sourcemap/*: SkipByDesign # Skip sourcemap tests
 dev_compiler/test/sourcemap/testfiles/*: SkipByDesign # Skip dev_compiler codegen tests
-dev_compiler/test/worker/*: Skip # Skip dev_compiler codegen tests
+dev_compiler/test/worker/*: Skip # test needs fixes
 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
@@ -181,8 +178,7 @@
 analysis_server/test/domain_completion_test: Fail
 analysis_server/test/edit/fixes_test: Fail
 analysis_server/test/integration/analysis/package_root_test: Pass, RuntimeError # Issue 33382
-analysis_server/test/services/completion/dart/keyword_contributor_test: Fail
-analysis_server/test/services/completion/dart/override_contributor_test: Fail
+analysis_server/test/services/completion/dart/keyword_contributor_test: Pass, Slow
 analysis_server/test/services/completion/statement/statement_completion_test: Fail
 analysis_server/test/services/correction/fix_test: Fail, Timeout
 analysis_server/test/services/refactoring/extract_local_test: Fail
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 4d383d5..90dd842 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -38,7 +38,8 @@
 import 'package:kernel/kernel.dart' show Component, Procedure;
 import 'package:kernel/target/targets.dart' show TargetFlags;
 import 'package:kernel/target/vm.dart' show VmTarget;
-import 'package:vm/incremental_compiler.dart';
+import '../lib/incremental_compiler.dart';
+import '../lib/http_filesystem.dart';
 
 final bool verbose = new bool.fromEnvironment('DFE_VERBOSE');
 const String platformKernelFile = 'virtual_platform_kernel.dill';
@@ -305,18 +306,20 @@
     int isolateId, Component component, String packageConfig) {
   final dependencies = isolateDependencies[isolateId] ??= new List<Uri>();
 
-  for (var lib in component.libraries) {
-    if (lib.importUri.scheme == "dart") continue;
+  if (component != null) {
+    for (var lib in component.libraries) {
+      if (lib.importUri.scheme == "dart") continue;
 
-    dependencies.add(lib.fileUri);
-    for (var part in lib.parts) {
-      final fileUri = lib.fileUri.resolve(part.partUri);
-      if (fileUri.scheme != "" && fileUri.scheme != "file") {
-        // E.g. part 'package:foo/foo.dart';
-        // Maybe the front end should resolve this?
-        continue;
+      dependencies.add(lib.fileUri);
+      for (var part in lib.parts) {
+        final fileUri = lib.fileUri.resolve(part.partUri);
+        if (fileUri.scheme != "" && fileUri.scheme != "file") {
+          // E.g. part 'package:foo/foo.dart';
+          // Maybe the front end should resolve this?
+          continue;
+        }
+        dependencies.add(fileUri);
       }
-      dependencies.add(fileUri);
     }
   }
 
@@ -447,7 +450,7 @@
     FileSystem fileSystem = _buildFileSystem(
         sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
     compiler = new SingleShotCompilerWrapper(fileSystem, platformKernelPath,
-        requireMain: sourceFiles.isEmpty,
+        requireMain: false,
         strongMode: strong,
         suppressWarnings: suppressWarnings,
         syncAsync: syncAsync,
@@ -461,12 +464,17 @@
     }
 
     Component component = await compiler.compile(script);
-    _recordDependencies(isolateId, component, packageConfig);
 
     if (compiler.errors.isNotEmpty) {
-      result = new CompilationResult.errors(compiler.errors,
-          serializeComponent(component, filter: (lib) => !lib.isExternal));
+      if (component != null) {
+        result = new CompilationResult.errors(compiler.errors,
+            serializeComponent(component, filter: (lib) => !lib.isExternal));
+      } else {
+        result = new CompilationResult.errors(compiler.errors, null);
+      }
     } else {
+      // Record dependencies only if compilation was error free.
+      _recordDependencies(isolateId, component, packageConfig);
       // We serialize the component excluding vm_platform.dill because the VM has
       // these sources built-in. Everything loaded as a summary in
       // [kernelForProgram] is marked `external`, so we can use that bit to
@@ -507,11 +515,9 @@
 /// frontend.
 FileSystem _buildFileSystem(List sourceFiles, List<int> platformKernel,
     String multirootFilepaths, String multirootScheme) {
-  FileSystem fileSystem;
+  FileSystem fileSystem = new HttpAwareFileSystem(StandardFileSystem.instance);
 
-  if (sourceFiles.isEmpty && platformKernel == null) {
-    fileSystem = StandardFileSystem.instance;
-  } else {
+  if (!sourceFiles.isEmpty || platformKernel != null) {
     MemoryFileSystem memoryFileSystem =
         new MemoryFileSystem(Uri.parse('file:///'));
     if (sourceFiles != null) {
@@ -526,7 +532,7 @@
           .entityForUri(Uri.parse(platformKernelFile))
           .writeAsBytesSync(platformKernel);
     }
-    fileSystem = new HybridFileSystem(memoryFileSystem);
+    fileSystem = new HybridFileSystem(memoryFileSystem, fileSystem);
   }
 
   if (multirootFilepaths != null) {
diff --git a/pkg/vm/lib/http_filesystem.dart b/pkg/vm/lib/http_filesystem.dart
new file mode 100644
index 0000000..ed036cd
--- /dev/null
+++ b/pkg/vm/lib/http_filesystem.dart
@@ -0,0 +1,67 @@
+import 'dart:async';
+import 'dart:io' as io;
+
+import 'package:front_end/src/api_unstable/build_integration.dart';
+
+class HttpAwareFileSystem implements FileSystem {
+  FileSystem original;
+
+  HttpAwareFileSystem(this.original);
+
+  @override
+  FileSystemEntity entityForUri(Uri uri) {
+    if (uri.scheme == 'http' || uri.scheme == 'https') {
+      return new HttpFileSystemEntity(this, uri);
+    } else {
+      return original.entityForUri(uri);
+    }
+  }
+}
+
+class HttpFileSystemEntity implements FileSystemEntity {
+  HttpAwareFileSystem fileSystem;
+  Uri uri;
+
+  HttpFileSystemEntity(this.fileSystem, this.uri);
+
+  @override
+  Future<bool> exists() async {
+    return connectAndRun((io.HttpClient httpClient) async {
+      io.HttpClientRequest request = await httpClient.headUrl(uri);
+      io.HttpClientResponse response = await request.close();
+      return response.statusCode == io.HttpStatus.ok;
+    });
+  }
+
+  @override
+  Future<List<int>> readAsBytes() async {
+    return connectAndRun((io.HttpClient httpClient) async {
+      io.HttpClientRequest request = await httpClient.getUrl(uri);
+      io.HttpClientResponse response = await request.close();
+      if (response.statusCode != io.HttpStatus.ok) {
+        throw new FileSystemException(uri, response.toString());
+      }
+      List<List<int>> list = await response.toList();
+      return list.expand((list) => list).toList();
+    });
+  }
+
+  @override
+  Future<String> readAsString() async {
+    return String.fromCharCodes(await readAsBytes());
+  }
+
+  T connectAndRun<T>(T body(io.HttpClient httpClient)) {
+    io.HttpClient httpClient;
+    try {
+      httpClient = new io.HttpClient();
+      // Set timeout to be shorter than anticipated OS default
+      httpClient.connectionTimeout = const Duration(seconds: 5);
+      return body(httpClient);
+    } on Exception catch (e) {
+      throw new FileSystemException(uri, e.toString());
+    } finally {
+      httpClient?.close(force: true);
+    }
+  }
+}
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 27506b0..5cd4241 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -682,18 +682,18 @@
 template("bin_to_assembly") {
   assert(defined(invoker.deps), "Must define deps")
   assert(defined(invoker.input), "Must define input binary file")
-  assert(defined(invoker.output), "Must define output assembly file")
   assert(defined(invoker.symbol), "Must define symbol name")
   assert(defined(invoker.executable), "Must define boolean executable")
 
   action(target_name) {
     deps = invoker.deps
     script = "../tools/bin_to_assembly.py"
+    output = invoker.input + ".S"
     args = [
       "--input",
       rebase_path(invoker.input),
       "--output",
-      rebase_path(invoker.output),
+      rebase_path(output),
       "--symbol_name",
       invoker.symbol,
       "--target_os",
@@ -711,114 +711,162 @@
       args += [ "--executable" ]
     }
     inputs = [
-      script,
       invoker.input,
     ]
     outputs = [
-      invoker.output,
+      output,
     ]
   }
 }
 
-bin_to_assembly("vm_snapshot_data_assembly") {
+# Generates an object file defining a given symbol with the bytes from a
+# binary file. Places the symbol in the read-only data section.
+template("bin_to_coff") {
+  assert(defined(invoker.deps), "Must define deps")
+  assert(defined(invoker.input), "Must define input binary file")
+  assert(defined(invoker.symbol), "Must define symbol name")
+  assert(defined(invoker.executable), "Must define executable")
+
+  action(target_name) {
+    deps = invoker.deps
+    script = "../tools/bin_to_coff.py"
+    output = invoker.input + ".o"
+    args = [
+      "--input",
+      rebase_path(invoker.input),
+      "--output",
+      rebase_path(output),
+      "--symbol_name",
+      invoker.symbol,
+    ]
+
+    if (defined(invoker.size_symbol)) {
+      args += [
+        "--size_symbol_name",
+        invoker.size_symbol,
+      ]
+    }
+
+    if (invoker.executable) {
+      args += [ "--executable" ]
+    }
+
+    if (current_cpu == "x64") {
+      args += [ "--64-bit" ]
+    }
+    inputs = [
+      invoker.input,
+    ]
+    outputs = [
+      output,
+    ]
+  }
+}
+
+template("bin_to_linkable") {
+  assert(defined(invoker.deps), "Must define deps")
+  assert(defined(invoker.input), "Must define input binary file")
+  assert(defined(invoker.symbol), "Must define symbol name")
+  target_type = "bin_to_assembly"
+  if (is_win) {
+    target_type = "bin_to_coff"
+  }
+
+  target(target_type, target_name) {
+    forward_variables_from(invoker, "*")
+  }
+}
+
+bin_to_linkable("vm_snapshot_data_linkable") {
   deps = [
     ":generate_snapshot_bin",
   ]
   input = "$target_gen_dir/vm_snapshot_data.bin"
-  output = "$target_gen_dir/vm_snapshot_data.S"
   symbol = "kDartVmSnapshotData"
   executable = false
 }
 
-bin_to_assembly("vm_snapshot_instructions_assembly") {
+bin_to_linkable("vm_snapshot_instructions_linkable") {
   deps = [
     ":generate_snapshot_bin",
   ]
   input = "$target_gen_dir/vm_snapshot_instructions.bin"
-  output = "$target_gen_dir/vm_snapshot_instructions.S"
   symbol = "kDartVmSnapshotInstructions"
   executable = true
 }
 
-bin_to_assembly("isolate_snapshot_data_assembly") {
+bin_to_linkable("isolate_snapshot_data_linkable") {
   deps = [
     ":generate_snapshot_bin",
   ]
   input = "$target_gen_dir/isolate_snapshot_data.bin"
-  output = "$target_gen_dir/isolate_snapshot_data.S"
   symbol = "kDartCoreIsolateSnapshotData"
   executable = false
 }
 
-bin_to_assembly("isolate_snapshot_instructions_assembly") {
+bin_to_linkable("isolate_snapshot_instructions_linkable") {
   deps = [
     ":generate_snapshot_bin",
   ]
   input = "$target_gen_dir/isolate_snapshot_instructions.bin"
-  output = "$target_gen_dir/isolate_snapshot_instructions.S"
   symbol = "kDartCoreIsolateSnapshotInstructions"
   executable = true
 }
 
-bin_to_assembly("kernel_service_dill_S") {
+bin_to_linkable("kernel_service_dill_linkable") {
   deps = [
     "../../utils/kernel-service:kernel_service_dill",
   ]
   input = "$root_gen_dir/kernel_service.dill"
-  output = "$root_gen_dir/kernel_service.dill.S"
   symbol = "kKernelServiceDill"
   size_symbol = "kKernelServiceDillSize"
   executable = false
 }
 
-bin_to_assembly("platform_dill_S") {
+bin_to_linkable("platform_dill_linkable") {
   deps = [
     "../vm:vm_legacy_platform",
   ]
   input = "$root_out_dir/vm_platform.dill"
-  output = "$target_gen_dir/vm_platform.dill.S"
   symbol = "kPlatformDill"
   size_symbol = "kPlatformDillSize"
   executable = false
 }
 
-bin_to_assembly("platform_strong_dill_S") {
+bin_to_linkable("platform_strong_dill_linkable") {
   deps = [
     "../vm:vm_platform",
   ]
   input = "$root_out_dir/vm_platform_strong.dill"
-  output = "$target_gen_dir/vm_platform_strong.dill.S"
   symbol = "kPlatformStrongDill"
   size_symbol = "kPlatformStrongDillSize"
   executable = false
 }
 
 source_set("dart_snapshot_cc") {
+  visibility = [ ":*" ]
   deps = [
-    ":isolate_snapshot_data_assembly",
-    ":isolate_snapshot_instructions_assembly",
-    ":vm_snapshot_data_assembly",
-    ":vm_snapshot_instructions_assembly",
+    ":isolate_snapshot_data_linkable",
+    ":isolate_snapshot_instructions_linkable",
+    ":vm_snapshot_data_linkable",
+    ":vm_snapshot_instructions_linkable",
   ]
-  sources = [
-    "$target_gen_dir/isolate_snapshot_data.S",
-    "$target_gen_dir/isolate_snapshot_instructions.S",
-    "$target_gen_dir/vm_snapshot_data.S",
-    "$target_gen_dir/vm_snapshot_instructions.S",
-  ]
+  sources = get_target_outputs(":isolate_snapshot_data_linkable") +
+            get_target_outputs(":isolate_snapshot_instructions_linkable") +
+            get_target_outputs(":vm_snapshot_data_linkable") +
+            get_target_outputs(":vm_snapshot_instructions_linkable")
 }
 
 source_set("dart_kernel_platform_cc") {
+  visibility = [ ":*" ]
   deps = [
-    ":kernel_service_dill_S",
-    ":platform_dill_S",
-    ":platform_strong_dill_S",
+    ":kernel_service_dill_linkable",
+    ":platform_dill_linkable",
+    ":platform_strong_dill_linkable",
   ]
-  sources = [
-    "$root_gen_dir/kernel_service.dill.S",
-    "$target_gen_dir/vm_platform.dill.S",
-    "$target_gen_dir/vm_platform_strong.dill.S",
-  ]
+  sources = get_target_outputs(":kernel_service_dill_linkable") +
+            get_target_outputs(":platform_dill_linkable") +
+            get_target_outputs(":platform_strong_dill_linkable")
 }
 
 template("dart_executable") {
@@ -881,6 +929,7 @@
     }
 
     sources = [
+                "dart_embedder_api_impl.cc",
                 "error_exit.cc",
                 "error_exit.h",
                 "main.cc",
diff --git a/runtime/bin/dart_embedder_api_impl.cc b/runtime/bin/dart_embedder_api_impl.cc
new file mode 100644
index 0000000..645a7bb
--- /dev/null
+++ b/runtime/bin/dart_embedder_api_impl.cc
@@ -0,0 +1,106 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "include/dart_embedder_api.h"
+
+#include "bin/dartutils.h"
+#include "bin/eventhandler.h"
+#include "bin/isolate_data.h"
+#include "bin/thread.h"
+#include "bin/utils.h"
+#include "bin/vmservice_impl.h"
+
+namespace dart {
+namespace embedder {
+
+static char* MallocFormatedString(const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  intptr_t len = vsnprintf(NULL, 0, format, args);
+  va_end(args);
+
+  char* buffer = reinterpret_cast<char*>(malloc(len + 1));
+  MSAN_UNPOISON(buffer, (len + 1));
+  va_list args2;
+  va_start(args2, format);
+  vsnprintf(buffer, (len + 1), format, args2);
+  va_end(args2);
+  return buffer;
+}
+
+bool InitOnce(char** error) {
+  if (!bin::DartUtils::SetOriginalWorkingDirectory()) {
+    bin::OSError err;
+    *error = MallocFormatedString("Error determining current directory: %s\n",
+                                  err.message());
+    return false;
+  }
+  bin::Thread::InitOnce();
+  bin::TimerUtils::InitOnce();
+  bin::EventHandler::Start();
+  return true;
+}
+
+Dart_Isolate CreateKernelServiceIsolate(const IsolateCreationData& data,
+                                        const uint8_t* buffer,
+                                        intptr_t buffer_size,
+                                        char** error) {
+  Dart_Isolate kernel_isolate = Dart_CreateIsolateFromKernel(
+      data.script_uri, data.main, buffer, buffer_size, data.flags,
+      data.callback_data, error);
+  if (kernel_isolate == nullptr) {
+    return nullptr;
+  }
+
+  Dart_EnterScope();
+  Dart_Handle result = Dart_LoadScriptFromKernel(buffer, buffer_size);
+  if (Dart_IsError(result)) {
+    *error = strdup(Dart_GetError(result));
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+    return nullptr;
+  }
+  result = bin::DartUtils::PrepareForScriptLoading(/*is_service_isolate=*/false,
+                                                   /*trace_loading=*/false);
+  Dart_ExitScope();
+  Dart_ExitIsolate();
+  return kernel_isolate;
+}
+
+Dart_Isolate CreateVmServiceIsolate(const IsolateCreationData& data,
+                                    const VmServiceConfiguration& config,
+                                    const uint8_t* kernel_buffer,
+                                    intptr_t kernel_buffer_size,
+                                    char** error) {
+  if (data.flags == nullptr) {
+    *error = strdup("Expected non-null flags");
+    return nullptr;
+  }
+  data.flags->load_vmservice_library = true;
+
+  Dart_Isolate service_isolate = Dart_CreateIsolateFromKernel(
+      data.script_uri, data.main, kernel_buffer, kernel_buffer_size, data.flags,
+      data.callback_data, error);
+  if (service_isolate == nullptr) {
+    return nullptr;
+  }
+
+  Dart_EnterScope();
+  // Load embedder specific bits and return.
+  if (!bin::VmService::Setup(config.ip, config.port,
+                             /*running_precompiled=*/true, config.dev_mode,
+                             /*trace_loading=*/false, config.deterministic)) {
+    *error = strdup(bin::VmService::GetErrorMessage());
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+    return nullptr;
+  }
+
+  Dart_ExitScope();
+  Dart_ExitIsolate();
+  return service_isolate;
+}
+
+}  // namespace embedder
+}  // namespace dart
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index e7c7886..6bba557 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -385,18 +385,16 @@
 }
 
 Dart_Handle DartUtils::SetWorkingDirectory() {
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
-  Dart_Handle builtin_lib = isolate_data->builtin_lib();
   Dart_Handle directory = NewString(original_working_directory);
-  return SingleArgDart_Invoke(builtin_lib, "_setWorkingDirectory", directory);
+  return SingleArgDart_Invoke(LookupBuiltinLib(), "_setWorkingDirectory",
+                              directory);
 }
 
 Dart_Handle DartUtils::ResolveUriInWorkingDirectory(Dart_Handle script_uri) {
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
   dart_args[0] = script_uri;
-  return Dart_Invoke(DartUtils::BuiltinLib(),
+  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
                      NewString("_resolveInWorkingDirectory"), kNumArgs,
                      dart_args);
 }
@@ -405,16 +403,16 @@
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
   dart_args[0] = library_uri;
-  return Dart_Invoke(DartUtils::BuiltinLib(), NewString("_libraryFilePath"),
-                     kNumArgs, dart_args);
+  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
+                     NewString("_libraryFilePath"), kNumArgs, dart_args);
 }
 
 Dart_Handle DartUtils::ResolveScript(Dart_Handle url) {
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
   dart_args[0] = url;
-  return Dart_Invoke(DartUtils::BuiltinLib(), NewString("_resolveScriptUri"),
-                     kNumArgs, dart_args);
+  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
+                     NewString("_resolveScriptUri"), kNumArgs, dart_args);
 }
 
 static bool CheckMagicNumber(const uint8_t* buffer,
@@ -569,16 +567,16 @@
     const int kNumArgs = 1;
     Dart_Handle dart_args[kNumArgs];
     dart_args[0] = result;
-    result = Dart_Invoke(DartUtils::BuiltinLib(), NewString("_setPackageRoot"),
-                         kNumArgs, dart_args);
+    result = Dart_Invoke(DartUtils::LookupBuiltinLib(),
+                         NewString("_setPackageRoot"), kNumArgs, dart_args);
   } else if (packages_config != NULL) {
     result = NewString(packages_config);
     RETURN_IF_ERROR(result);
     const int kNumArgs = 1;
     Dart_Handle dart_args[kNumArgs];
     dart_args[0] = result;
-    result = Dart_Invoke(DartUtils::BuiltinLib(), NewString("_setPackagesMap"),
-                         kNumArgs, dart_args);
+    result = Dart_Invoke(DartUtils::LookupBuiltinLib(),
+                         NewString("_setPackagesMap"), kNumArgs, dart_args);
   }
   return result;
 }
@@ -613,13 +611,6 @@
   RETURN_IF_ERROR(cli_lib);
   Builtin::SetNativeResolver(Builtin::kCLILibrary);
 
-  // Setup the builtin library in a persistent handle attached the isolate
-  // specific data as we seem to lookup and use builtin lib a lot.
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
-  ASSERT(isolate_data != NULL);
-  isolate_data->set_builtin_lib(builtin_lib);
-
   // We need to ensure that all the scripts loaded so far are finalized
   // as we are about to invoke some Dart code below to setup closures.
   Dart_Handle result = Dart_FinalizeLoading(false);
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 661ec7f..68cd47f 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -204,10 +204,8 @@
   static Dart_Handle NewError(const char* format, ...);
   static Dart_Handle NewInternalError(const char* message);
 
-  static Dart_Handle BuiltinLib() {
-    IsolateData* isolate_data =
-        reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
-    return isolate_data->builtin_lib();
+  static Dart_Handle LookupBuiltinLib() {
+    return Dart_LookupLibrary(NewString(kBuiltinLibURL));
   }
 
   static bool SetOriginalWorkingDirectory();
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 5f1721d..6c0dafb 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -81,6 +81,7 @@
 
 DFE::DFE()
     : use_dfe_(false),
+      use_incremental_compiler_(false),
       frontend_filename_(NULL),
       application_kernel_buffer_(NULL),
       application_kernel_buffer_size_(0) {}
@@ -218,8 +219,8 @@
                                int* exit_code,
                                bool strong,
                                const char* package_config) {
-  Dart_KernelCompilationResult result =
-      CompileScript(script_uri, strong, true, package_config);
+  Dart_KernelCompilationResult result = CompileScript(
+      script_uri, strong, use_incremental_compiler(), package_config);
   switch (result.status) {
     case Dart_KernelCompilationStatus_Ok:
       *kernel_buffer = result.kernel;
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 6efb45c..433550f 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -34,6 +34,11 @@
   void set_use_dfe(bool value = true) { use_dfe_ = value; }
   bool UseDartFrontend() const { return use_dfe_; }
 
+  void set_use_incremental_compiler(bool value) {
+    use_incremental_compiler_ = value;
+  }
+  bool use_incremental_compiler() const { return use_incremental_compiler_; }
+
   // Returns the platform binary file name if the path to
   // kernel binaries was set using SetKernelBinaries.
   const char* GetPlatformBinaryFilename();
@@ -100,6 +105,7 @@
 
  private:
   bool use_dfe_;
+  bool use_incremental_compiler_;
   char* frontend_filename_;
 
   // Kernel binary specified on the cmd line.
diff --git a/runtime/bin/file_test.cc b/runtime/bin/file_test.cc
index 548f7b4..967eec8 100644
--- a/runtime/bin/file_test.cc
+++ b/runtime/bin/file_test.cc
@@ -2,18 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "bin/dartutils.h"
+#include "bin/directory.h"
 #include "bin/file.h"
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "vm/unit_test.h"
 
 namespace dart {
-namespace bin {
 
 // Helper method to be able to run the test from the runtime
 // directory, or the top directory.
 static const char* GetFileName(const char* name) {
-  if (File::Exists(NULL, name)) {
+  if (bin::File::Exists(NULL, name)) {
     return name;
   } else {
     static const int kRuntimeLength = strlen("runtime/");
@@ -23,7 +24,7 @@
 
 TEST_CASE(Read) {
   const char* kFilename = GetFileName("runtime/bin/file_test.cc");
-  File* file = File::Open(NULL, kFilename, File::kRead);
+  bin::File* file = bin::File::Open(NULL, kFilename, bin::File::kRead);
   EXPECT(file != NULL);
   char buffer[16];
   buffer[0] = '\0';
@@ -34,9 +35,10 @@
   file->Release();
 }
 
-TEST_CASE(OpenUri) {
+TEST_CASE(OpenUri_RelativeFilename) {
   const char* kFilename = GetFileName("runtime/bin/file_test.cc");
-  char* encoded = reinterpret_cast<char*>(malloc(strlen(kFilename) * 3 + 1));
+  char* encoded = reinterpret_cast<char*>(bin::DartUtils::ScopedCString(
+      strlen(kFilename) * 3 + 1));
   char* t = encoded;
   // percent-encode all characters 'c'
   for (const char* p = kFilename; *p; p++) {
@@ -49,8 +51,7 @@
     }
   }
   *t = 0;
-  File* file = File::OpenUri(NULL, encoded, File::kRead);
-  free(encoded);
+  bin::File* file = bin::File::OpenUri(NULL, encoded, bin::File::kRead);
   EXPECT(file != NULL);
   char buffer[16];
   buffer[0] = '\0';
@@ -61,9 +62,122 @@
   file->Release();
 }
 
+TEST_CASE(OpenUri_AbsoluteFilename) {
+  const char* kRelativeFilename = GetFileName("runtime/bin/file_test.cc");
+  const char* kFilename = bin::File::GetCanonicalPath(NULL, kRelativeFilename);
+  EXPECT_NOTNULL(kFilename);
+  char* encoded = reinterpret_cast<char*>(bin::DartUtils::ScopedCString(
+      strlen(kFilename) * 3 + 1));
+  char* t = encoded;
+  // percent-encode all characters 'c'
+  for (const char* p = kFilename; *p; p++) {
+    if (*p == 'c') {
+      *t++ = '%';
+      *t++ = '6';
+      *t++ = '3';
+    } else {
+      *t++ = *p;
+    }
+  }
+  *t = 0;
+  bin::File* file = bin::File::OpenUri(NULL, encoded, bin::File::kRead);
+  EXPECT(file != NULL);
+  char buffer[16];
+  buffer[0] = '\0';
+  EXPECT(file->ReadFully(buffer, 13));  // ReadFully returns true.
+  buffer[13] = '\0';
+  EXPECT_STREQ("// Copyright ", buffer);
+  EXPECT(!file->WriteByte(1));  // Cannot write to a read-only file.
+  file->Release();
+}
+
+static const char* Concat(const char* a, const char* b) {
+  const intptr_t len = strlen(a) + strlen(b);
+  char* c = bin::DartUtils::ScopedCString(len + 1);
+  EXPECT_NOTNULL(c);
+  snprintf(c, len + 1, "%s%s", a, b);
+  return c;
+}
+
+TEST_CASE(OpenUri_ValidUri) {
+  const char* kRelativeFilename = GetFileName("runtime/bin/file_test.cc");
+  const char* kAbsoluteFilename = bin::File::GetCanonicalPath(NULL,
+      kRelativeFilename);
+  EXPECT_NOTNULL(kAbsoluteFilename);
+  const char* kFilename = Concat("file:///", kAbsoluteFilename);
+
+  char* encoded = reinterpret_cast<char*>(bin::DartUtils::ScopedCString(
+      strlen(kFilename) * 3 + 1));
+  char* t = encoded;
+  // percent-encode all characters 'c'
+  for (const char* p = kFilename; *p; p++) {
+    if (*p == 'c') {
+      *t++ = '%';
+      *t++ = '6';
+      *t++ = '3';
+    } else {
+      *t++ = *p;
+    }
+  }
+  *t = 0;
+  bin::File* file = bin::File::OpenUri(NULL, encoded, bin::File::kRead);
+  EXPECT(file != NULL);
+  char buffer[16];
+  buffer[0] = '\0';
+  EXPECT(file->ReadFully(buffer, 13));  // ReadFully returns true.
+  buffer[13] = '\0';
+  EXPECT_STREQ("// Copyright ", buffer);
+  EXPECT(!file->WriteByte(1));  // Cannot write to a read-only file.
+  file->Release();
+}
+
+TEST_CASE(OpenUri_UriWithSpaces) {
+  const char* kRelativeFilename = GetFileName("runtime/bin/file_test.cc");
+  const char* strSystemTemp = bin::Directory::SystemTemp(NULL);
+  EXPECT_NOTNULL(strSystemTemp);
+  const char* kTempDir = Concat(strSystemTemp, "/foo bar");
+  const char* strTempDir = bin::Directory::CreateTemp(NULL, kTempDir);
+  EXPECT_NOTNULL(strTempDir);
+  const char* kTargetFilename = Concat(strTempDir, "/file test.cc");
+  bool result = bin::File::Copy(NULL, kRelativeFilename, kTargetFilename);
+  EXPECT(result);
+
+  const char* kAbsoluteFilename = bin::File::GetCanonicalPath(NULL,
+      kTargetFilename);
+  EXPECT_NOTNULL(kAbsoluteFilename);
+  const char* kFilename = Concat("file:///", kAbsoluteFilename);
+
+  char* encoded = reinterpret_cast<char*>(bin::DartUtils::ScopedCString(
+      strlen(kFilename) * 3 + 1));
+  char* t = encoded;
+  // percent-encode all spaces
+  for (const char* p = kFilename; *p; p++) {
+    if (*p == ' ') {
+      *t++ = '%';
+      *t++ = '2';
+      *t++ = '0';
+    } else {
+      *t++ = *p;
+    }
+  }
+  *t = 0;
+  printf("encoded: %s\n", encoded);
+  bin::File* file = bin::File::OpenUri(NULL, encoded, bin::File::kRead);
+  EXPECT(file != NULL);
+  char buffer[16];
+  buffer[0] = '\0';
+  EXPECT(file->ReadFully(buffer, 13));  // ReadFully returns true.
+  buffer[13] = '\0';
+  EXPECT_STREQ("// Copyright ", buffer);
+  EXPECT(!file->WriteByte(1));  // Cannot write to a read-only file.
+  file->Release();
+  bin::Directory::Delete(NULL, strTempDir, /* recursive= */ true);
+}
+
 TEST_CASE(OpenUri_InvalidUriPercentEncoding) {
   const char* kFilename = GetFileName("runtime/bin/file_test.cc");
-  char* encoded = reinterpret_cast<char*>(malloc(strlen(kFilename) * 3 + 1));
+  char* encoded = reinterpret_cast<char*>(bin::DartUtils::ScopedCString(
+      strlen(kFilename) * 3 + 1));
   char* t = encoded;
   // percent-encode all characters 'c'
   for (const char* p = kFilename; *p; p++) {
@@ -76,14 +190,14 @@
     }
   }
   *t = 0;
-  File* file = File::OpenUri(NULL, encoded, File::kRead);
-  free(encoded);
+  bin::File* file = bin::File::OpenUri(NULL, encoded, bin::File::kRead);
   EXPECT(file == NULL);
 }
 
 TEST_CASE(OpenUri_TruncatedUriPercentEncoding) {
   const char* kFilename = GetFileName("runtime/bin/file_test.cc");
-  char* encoded = reinterpret_cast<char*>(malloc(strlen(kFilename) * 3 + 1));
+  char* encoded = reinterpret_cast<char*>(bin::DartUtils::ScopedCString(
+      strlen(kFilename) * 3 + 1));
   char* t = encoded;
   // percent-encode all characters 'c'
   for (const char* p = kFilename; *p; p++) {
@@ -96,15 +210,14 @@
     }
   }
   *(t - 1) = 0;  // truncate last uri encoding
-  File* file = File::OpenUri(NULL, encoded, File::kRead);
-  free(encoded);
+  bin::File* file = bin::File::OpenUri(NULL, encoded, bin::File::kRead);
   EXPECT(file == NULL);
 }
 
 TEST_CASE(FileLength) {
   const char* kFilename =
       GetFileName("runtime/tests/vm/data/fixed_length_file");
-  File* file = File::Open(NULL, kFilename, File::kRead);
+  bin::File* file = bin::File::Open(NULL, kFilename, bin::File::kRead);
   EXPECT(file != NULL);
   EXPECT_EQ(42, file->Length());
   file->Release();
@@ -114,7 +227,7 @@
   char buf[42];
   const char* kFilename =
       GetFileName("runtime/tests/vm/data/fixed_length_file");
-  File* file = File::Open(NULL, kFilename, File::kRead);
+  bin::File* file = bin::File::Open(NULL, kFilename, bin::File::kRead);
   EXPECT(file != NULL);
   EXPECT(file->ReadFully(buf, 12));
   EXPECT_EQ(12, file->Position());
@@ -123,5 +236,4 @@
   file->Release();
 }
 
-}  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/isolate_data.cc b/runtime/bin/isolate_data.cc
index c7f1779..dfd440c 100644
--- a/runtime/bin/isolate_data.cc
+++ b/runtime/bin/isolate_data.cc
@@ -15,7 +15,6 @@
     : script_url((url != NULL) ? strdup(url) : NULL),
       package_root(NULL),
       packages_file(NULL),
-      builtin_lib_(NULL),
       loader_(NULL),
       app_snapshot_(app_snapshot),
       dependencies_(NULL),
@@ -32,10 +31,6 @@
 }
 
 void IsolateData::OnIsolateShutdown() {
-  if (builtin_lib_ != NULL) {
-    Dart_DeletePersistentHandle(builtin_lib_);
-    builtin_lib_ = NULL;
-  }
 }
 
 IsolateData::~IsolateData() {
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index 575d1b0..ceab601 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -36,18 +36,6 @@
               AppSnapshot* app_snapshot);
   ~IsolateData();
 
-  Dart_Handle builtin_lib() const {
-    ASSERT(builtin_lib_ != NULL);
-    ASSERT(!Dart_IsError(builtin_lib_));
-    return builtin_lib_;
-  }
-  void set_builtin_lib(Dart_Handle lib) {
-    ASSERT(builtin_lib_ == NULL);
-    ASSERT(lib != NULL);
-    ASSERT(!Dart_IsError(lib));
-    builtin_lib_ = Dart_NewPersistentHandle(lib);
-  }
-
   char* script_url;
   char* package_root;
   char* packages_file;
@@ -99,7 +87,6 @@
   void OnIsolateShutdown();
 
  private:
-  Dart_Handle builtin_lib_;
   Loader* loader_;
   AppSnapshot* app_snapshot_;
   MallocGrowableArray<char*>* dependencies_;
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 38b59c3..51bbe73 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -7,6 +7,7 @@
 #include <string.h>
 
 #include "include/dart_api.h"
+#include "include/dart_embedder_api.h"
 #include "include/dart_tools_api.h"
 
 #include "bin/builtin.h"
@@ -267,11 +268,6 @@
   Dart_EnterScope();
   Dart_Handle library = Dart_LoadScriptFromKernel(payload, payload_length);
   CHECK_RESULT(library);
-  Dart_Handle url = DartUtils::NewString("dart:_builtin");
-  CHECK_RESULT(url);
-  Dart_Handle builtin_lib = Dart_LookupLibrary(url);
-  CHECK_RESULT(builtin_lib);
-  isolate_data->set_builtin_lib(builtin_lib);
   Dart_ExitScope();
   Dart_ExitIsolate();
 
@@ -1018,7 +1014,7 @@
     Dart_Handle root_lib = Dart_RootLibrary();
     // Import the root library into the builtin library so that we can easily
     // lookup the main entry point exported from the root library.
-    result = Dart_LibraryImportLibrary(isolate_data->builtin_lib(), root_lib,
+    result = Dart_LibraryImportLibrary(DartUtils::LookupBuiltinLib(), root_lib,
                                        Dart_Null());
 #if !defined(DART_PRECOMPILED_RUNTIME)
     if (Options::gen_snapshot_kind() == kAppAOT) {
@@ -1222,8 +1218,6 @@
     }
   }
 
-  Thread::InitOnce();
-
   Loader::InitOnce();
 
   if (!DartUtils::SetOriginalWorkingDirectory()) {
@@ -1284,7 +1278,14 @@
     Process::SetExitHook(SnapshotOnExitHook);
   }
 
-  char* error = Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+  char* error = nullptr;
+  if (!dart::embedder::InitOnce(&error)) {
+    Log::PrintErr("Stanalone embedder initialization failed: %s\n", error);
+    free(error);
+    Platform::Exit(kErrorExitCode);
+  }
+
+  error = Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
   if (error != NULL) {
     Log::PrintErr("Setting VM flags failed: %s\n", error);
     free(error);
@@ -1309,10 +1310,6 @@
   }
 #endif
 
-  // Start event handler.
-  TimerUtils::InitOnce();
-  EventHandler::Start();
-
   // Initialize the Dart VM.
   Dart_InitializeParams init_params;
   memset(&init_params, 0, sizeof(init_params));
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index cf88c86..ae4d441 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -296,6 +296,9 @@
         "Use --enable-vm-service[=<port number>[/<bind address>]]\n");
     return false;
   }
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  dfe()->set_use_incremental_compiler(true);
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   return true;
 }
@@ -320,6 +323,9 @@
   vm_options->AddArgument("--pause-isolates-on-unhandled-exceptions");
   vm_options->AddArgument("--profiler");
   vm_options->AddArgument("--warn-on-pause-with-no-debugger");
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  dfe()->set_use_incremental_compiler(true);
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   return true;
 }
 
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 74f96e6..f512dfb 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -41,7 +41,7 @@
   int length_;
 };
 
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_DART2_ONLY_MODE)
 ResourcesEntry __service_bin_resources_[] = {{NULL, NULL, 0}};
 #else
 extern ResourcesEntry __service_bin_resources_[];
@@ -185,7 +185,8 @@
   // Prepare builtin and its dependent libraries for use to resolve URIs.
   // Set up various closures, e.g: printing, timers etc.
   // Set up 'package root' for URI resolution.
-  result = DartUtils::PrepareForScriptLoading(true, false);
+  result = DartUtils::PrepareForScriptLoading(/*is_service_isolate=*/true,
+                                              trace_loading);
   SHUTDOWN_ON_ERROR(result);
 
   if (running_precompiled) {
@@ -261,12 +262,6 @@
       Dart_SetField(library, DartUtils::NewString("_isFuchsia"), is_fuchsia);
   SHUTDOWN_ON_ERROR(result);
 
-  if (trace_loading) {
-    result = Dart_SetField(library, DartUtils::NewString("_traceLoading"),
-                           Dart_True());
-    SHUTDOWN_ON_ERROR(result);
-  }
-
   if (deterministic) {
     result = Dart_SetField(library, DartUtils::NewString("_deterministic"),
                            Dart_True());
diff --git a/runtime/include/dart_embedder_api.h b/runtime/include/dart_embedder_api.h
new file mode 100644
index 0000000..eda9059
--- /dev/null
+++ b/runtime/include/dart_embedder_api.h
@@ -0,0 +1,80 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
+#define RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
+
+#include "dart_api.h"
+#include "dart_tools_api.h"
+
+namespace dart {
+namespace embedder {
+
+// Initialize all subsystems of the embedder.
+// Returns true on success and false otherwise, in which case error would
+// contain error message.
+DART_WARN_UNUSED_RESULT bool InitOnce(char** error);
+
+// Common arguments that are passed to isolate creation callback and to
+// API methods that create isolates.
+struct IsolateCreationData {
+  // URI for the main script that will be running in the isolate.
+  const char* script_uri;
+
+  // Advisory name of the main method that will be run by isolate.
+  // Only used for error messages.
+  const char* main;
+
+  // Isolate creation flags. Might be absent.
+  Dart_IsolateFlags* flags;
+
+  // Isolate callback data.
+  void* callback_data;
+};
+
+// Create and initialize kernel-service isolate. This method should be used
+// when VM invokes isolate creation callback with DART_KERNEL_ISOLATE_NAME as
+// script_uri.
+// The isolate is created from the given snapshot (might be kernel data or
+// app-jit snapshot).
+DART_WARN_UNUSED_RESULT Dart_Isolate
+CreateKernelServiceIsolate(const IsolateCreationData& data,
+                           const uint8_t* buffer,
+                           intptr_t buffer_size,
+                           char** error);
+
+// Service isolate configuration.
+struct VmServiceConfiguration {
+  enum {
+    kBindHttpServerToAFreePort = 0,
+    kDoNotAutoStartHttpServer = -1
+  };
+
+  // Address to which HTTP server will be bound.
+  const char* ip;
+
+  // Default port. See enum above for special values.
+  int port;
+
+  // TODO(vegorov) document these ones.
+  bool dev_mode;
+  bool deterministic;
+};
+
+// Create and initialize vm-service isolate. This method should be used
+// when VM invokes isolate creation callback with DART_VM_SERVICE_ISOLATE_NAME
+// as script_uri.
+// The isolate is created from the given kernel binary that is expected to
+// contain all necessary vmservice libraries.
+DART_WARN_UNUSED_RESULT Dart_Isolate
+CreateVmServiceIsolate(const IsolateCreationData& data,
+                       const VmServiceConfiguration& config,
+                       const uint8_t* kernel_buffer,
+                       intptr_t kernel_buffer_size,
+                       char** error);
+
+}  // namespace embedder
+}  // namespace dart
+
+#endif  // RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index eea02fd..b401d37 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -27,6 +27,12 @@
  * kTypedData. The specific type from dart:typed_data is in the type
  * field of the as_typed_data structure. The length in the
  * as_typed_data structure is always in bytes.
+ *
+ * The data for kTypedData is copied on message send and ownership remains with
+ * the caller. The ownership of data for kExternalTyped is passed to the VM on
+ * message send and returned when the VM invokes the
+ * Dart_WeakPersistentHandleFinalizer callback; a non-NULL callback must be
+ * provided.
  */
 typedef enum {
   Dart_CObject_kNull = 0,
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 352a2ec..e4ead66 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -774,6 +774,8 @@
     ThrowLanguageError("no library handler registered");
   }
 
+  NoReloadScope no_reload(isolate, thread);
+
   // Canonicalize library URI.
   String& canonical_uri = String::Handle(zone);
   if (uri.StartsWith(Symbols::DartScheme())) {
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index 29ab7b7..c8aea53 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -114,11 +114,7 @@
 
   List<int> _createList(int length);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<int> followedBy(Iterable<int> other) =>
       new FollowedByIterable<int>.firstEfficient(this, other);
@@ -471,11 +467,7 @@
 
   List<double> _createList(int length);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<double> followedBy(Iterable<double> other) =>
       new FollowedByIterable<double>.firstEfficient(this, other);
@@ -831,11 +823,7 @@
 
   List<Float32x4> _createList(int length);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<Float32x4> followedBy(Iterable<Float32x4> other) =>
       new FollowedByIterable<Float32x4>.firstEfficient(this, other);
@@ -1195,11 +1183,7 @@
 
   List<Int32x4> _createList(int length);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<Int32x4> followedBy(Iterable<Int32x4> other) =>
       new FollowedByIterable<Int32x4>.firstEfficient(this, other);
@@ -1558,11 +1542,7 @@
 
   List<Float64x2> _createList(int length);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<Float64x2> followedBy(Iterable<Float64x2> other) =>
       new FollowedByIterable<Float64x2>.firstEfficient(this, other);
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index d5092c7..76d5fc9 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -21,7 +21,6 @@
 namespace dart {
 
 DECLARE_FLAG(bool, trace_service);
-DECLARE_FLAG(bool, show_kernel_isolate);
 
 #ifndef PRODUCT
 class RegisterRunningIsolatesVisitor : public IsolateVisitor {
@@ -47,12 +46,7 @@
 
   virtual void VisitIsolate(Isolate* isolate) {
     ASSERT(ServiceIsolate::IsServiceIsolate(Isolate::Current()));
-    bool is_kernel_isolate = false;
-#ifndef DART_PRECOMPILED_RUNTIME
-    is_kernel_isolate =
-        KernelIsolate::IsKernelIsolate(isolate) && !FLAG_show_kernel_isolate;
-#endif
-    if (IsVMInternalIsolate(isolate) || is_kernel_isolate) {
+    if (IsVMInternalIsolate(isolate)) {
       // We do not register the service (and descendants), the vm-isolate, or
       // the kernel isolate.
       return;
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index f9d1fee..4c1c2e0 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -2,10 +2,13 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("../../build/dart/copy_tree.gni")
 import("../../build/dart/dart_action.gni")
 import("observatory_sources.gni")
 
 prebuilt_dart2js_action("build_observatory") {
+  visibility = [ ":copy_main_dart_js" ]
+
   script = "web/main.dart"
 
   # dart2js produces a .deps file, but it is not in a format that is understood
@@ -38,32 +41,139 @@
   ]
 }
 
-# TODO(zra): Investigate using GN's copy() with set_sources_assignment_filter
-# instead of using a python script.
-action("deploy_observatory") {
+# The rules here down to "deploy_observatory" copy files into place such that
+# they can be packaged into a tar file. These rules do the following copies:
+#
+# web/* ->
+#     $target_out_dir/observatory/deployed/web
+# $target_gen_dir/observatory/web/main.dart.js ->
+#     $target_out_dir/observatory/deployed/web/main.dart.js
+# ../../third_party/observatory_pub_packages/packages/$PACKAGE/lib/* ->
+#     $target_out_dir/observatory/deployed/web/packages/$PACKAGE
+# lib/* ->
+#     $target_out_dir/observatory/deployed/web/packages/observatory
+#
+# Files matching "observatory_ignore_patterns" are excluded.
+
+# Files matching these patterns are filtered out of the Observatory assets.
+observatory_ignore_patterns = [
+  # "\$sdk", this is the first element concatenated into the string below.
+  "*.concat.js",
+  "*.dart",
+  "*.log",
+  "*.map",
+  "*.precompiled.js",
+  "*.scriptUrls",
+  "*_buildLogs*",
+  "*~",
+  "CustomElements.*",
+  "HTMLImports.*",
+  "MutationObserver.*",
+  "ShadowDOM.*",
+  "bower.json",
+  "dart_support.*",
+  "interop_support.*",
+  "package.json",
+  "unittest*",
+  "webcomponents-lite.js",
+  "webcomponents.*",
+]
+
+# The ignore_patterns entry in the scopes accepted by copy_trees() is a
+# string of comma delimited patterns.
+observatory_ignore_string = "\$sdk"
+foreach(pattern, observatory_ignore_patterns) {
+  observatory_ignore_string = "$observatory_ignore_string,$pattern"
+}
+
+copy_tree_specs = []
+
+copy_tree_specs += [
+  {
+    target = "copy_web_package"
+    visibility = [ ":deploy_observatory" ]
+    source = "web"
+    dest = "$target_out_dir/observatory/deployed/web"
+    ignore_patterns = observatory_ignore_string
+  },
+]
+
+copy_tree_specs += [
+  {
+    target = "copy_observatory_package"
+    visibility = [ ":deploy_observatory" ]
+    source = "lib"
+    dest = "$target_out_dir/observatory/deployed/web/packages/observatory"
+    ignore_patterns = observatory_ignore_string
+  },
+]
+
+# All the contents of third_party/observatory_pub_packages should be
+# accounted for here. Uncommented entries are those packages that have
+# files that pass the observatory_ignore_patterns filters.
+observatory_pub_packages = [
+  "browser",
+  "charted",
+  "intl",
+
+  # Dependent packages that have no files that pass the above filter.
+  # "collection",
+  # "logging",
+  # "matcher",
+  # "meta",
+  # "observable",
+  # "path",
+  # "quiver",
+  # "stack_trace",
+  # "usage",
+
+  # Only needed for testing.
+  # "unittest",
+]
+
+foreach(package, observatory_pub_packages) {
+  copy_tree_specs += [
+    {
+      target = "copy_${package}_package"
+      visibility = [ ":deploy_observatory" ]
+      source =
+          "../../third_party/observatory_pub_packages/packages/$package/lib"
+      dest = "$target_out_dir/observatory/deployed/web/packages/$package"
+      ignore_patterns = observatory_ignore_string
+    },
+  ]
+}
+
+# This is not a rule, rather, it generates rules with names of the form:
+#   "copy_$package_package" for the packages in observatory_pub_packages.
+copy_trees("copy_observatory_packages") {
+  sources = copy_tree_specs
+}
+
+copy("copy_main_dart_js") {
+  visibility = [ ":deploy_observatory" ]
   deps = [
     ":build_observatory",
   ]
-
-  script = "../../tools/observatory_tool.py"
-
-  inputs = [
+  sources = [
     "$target_gen_dir/observatory/web/main.dart.js",
   ]
-
-  args = [
-    rebase_path("$target_out_dir/observatory/deployed"),
-    rebase_path("web"),
-    rebase_path("lib"),
-    rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
-    rebase_path("../../third_party/observatory_pub_packages/packages"),
-  ]
-
   outputs = [
     "$target_out_dir/observatory/deployed/web/main.dart.js",
   ]
 }
 
+group("deploy_observatory") {
+  deps = [
+    ":copy_browser_package",
+    ":copy_charted_package",
+    ":copy_intl_package",
+    ":copy_main_dart_js",
+    ":copy_observatory_package",
+    ":copy_web_package",
+  ]
+}
+
 template("observatory_archive") {
   enable_compression = false
   if (defined(invoker.compress) && invoker.compress) {
@@ -74,10 +184,6 @@
       ":deploy_observatory",
     ]
 
-    inputs = [
-      "$target_out_dir/observatory/deployed/web/main.dart.js",
-    ]
-
     output_name = target_name
 
     output = "$target_gen_dir/${output_name}.tar"
diff --git a/runtime/observatory/.analysis_options b/runtime/observatory/analysis_options.yaml
similarity index 100%
rename from runtime/observatory/.analysis_options
rename to runtime/observatory/analysis_options.yaml
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index e89d074..3ccc6c3 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -359,7 +359,7 @@
     var next = _graph._mergedDomNext;
     var cids = _graph._cids;
 
-    var domChildren = [];
+    var domChildren = <MergedObjectVertex>[];
     var prev = SENTINEL;
     var child = _graph._mergedDomHead[_id];
     // Walk the list of children and look for the representative objects, i.e.
diff --git a/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart b/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart
index d84be6c..fce8ce3 100644
--- a/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart
+++ b/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart
@@ -13,7 +13,7 @@
   final S.HeapSpace oldSpace;
   final Iterable<M.ClassHeapStats> members;
 
-  AllocationProfile(S.ServiceMap map, {Map<String, List<String>> defaults})
+  AllocationProfile(S.ServiceMap map, {Map/*<String, List<String>>*/ defaults})
       : lastAccumulatorReset = _intString2DateTime(map[_lastAccumulatorReset]),
         lastServiceGC = _intString2DateTime(map[_lastServiceGC]),
         oldSpace = new S.HeapSpace()..update(map['heaps']['old']),
@@ -27,14 +27,15 @@
     return new DateTime.fromMillisecondsSinceEpoch(int.parse(milliseconds));
   }
 
-  static ClassHeapStats _convertMember(S.ServiceMap map) {
+  static ClassHeapStats _convertMember(/*S.ServiceMap*/ map) {
     assert(map['type'] == 'ClassHeapStats');
     return new ClassHeapStats(map);
   }
 
-  static List<M.ClassHeapStats> _convertMembers(Iterable<S.ServiceMap> raw,
-      {Map<String, List<String>> defaults}) {
-    final List<M.ClassHeapStats> members = raw.map(_convertMember).toList();
+  static List<M.ClassHeapStats> _convertMembers(Iterable/*<S.ServiceMap>*/ raw,
+      {Map/*<String, List<String>>*/ defaults}) {
+    final List<M.ClassHeapStats> members =
+        raw.map<ClassHeapStats>(_convertMember).toList();
     if (defaults == null) {
       return members;
     }
@@ -42,7 +43,7 @@
         new Map.fromIterable(defaults.keys, value: (_) => <ClassHeapStats>[]);
     final Map<String, List<ClassHeapStats>> accumulators =
         <String, List<ClassHeapStats>>{};
-    defaults.forEach((String key, List<String> values) {
+    defaults.forEach((/*String*/ key, /*List<String>*/ values) {
       final classes = aliases[key];
       accumulators.addAll(new Map.fromIterable(values, value: (_) => classes));
     });
@@ -68,7 +69,7 @@
   final int promotedInstances;
   final int promotedBytes;
 
-  ClassHeapStats(S.ServiceMap map)
+  ClassHeapStats(Map map)
       : clazz = map['class'],
         oldSpace = new S.Allocations()..update(map['old']),
         newSpace = new S.Allocations()..update(map['new']),
diff --git a/runtime/observatory/lib/src/app/location_manager.dart b/runtime/observatory/lib/src/app/location_manager.dart
index cf77504..a0e1af1 100644
--- a/runtime/observatory/lib/src/app/location_manager.dart
+++ b/runtime/observatory/lib/src/app/location_manager.dart
@@ -95,7 +95,7 @@
         var newPath = ((_app.vm == null || _app.vm.isDisconnected)
             ? '/vm-connect'
             : '/isolate-reconnect');
-        var parameters = {};
+        var parameters = <String, dynamic>{};
         parameters.addAll(_uri.queryParameters);
         parameters['originalUri'] = _uri.toString();
         parameters['isolateId'] = parameters['isolateId'];
diff --git a/runtime/observatory/lib/src/app/page.dart b/runtime/observatory/lib/src/app/page.dart
index 248cacc..0009df1 100644
--- a/runtime/observatory/lib/src/app/page.dart
+++ b/runtime/observatory/lib/src/app/page.dart
@@ -172,7 +172,7 @@
     }
     app.vm.reload().then((serviceObject) {
       VM vm = serviceObject;
-      container.children = [
+      container.children = <Element>[
         new VMViewElement(vm, _vmrepository, app.events, app.notifications,
             new IsolateRepository(app.vm), _scriptRepository,
             queue: app.queue)
@@ -243,10 +243,10 @@
   }
 
   Future _visitObject(obj) async {
-    container.children = [];
+    container.children = <Element>[];
     await obj.reload();
     if (obj is Class) {
-      container.children = [
+      container.children = <Element>[
         new ClassViewElement(
             app.vm,
             obj.isolate,
@@ -269,7 +269,7 @@
       ];
     } else if (obj is Code) {
       await obj.loadScript();
-      container.children = [
+      container.children = <Element>[
         new CodeViewElement(
             app.vm,
             obj.isolate,
@@ -284,7 +284,7 @@
             queue: app.queue)
       ];
     } else if (obj is Context) {
-      container.children = [
+      container.children = <Element>[
         new ContextViewElement(
             app.vm,
             obj.isolate,
@@ -300,11 +300,11 @@
             queue: app.queue)
       ];
     } else if (obj is DartError) {
-      container.children = [
+      container.children = <Element>[
         new ErrorViewElement(app.notifications, obj, queue: app.queue)
       ];
     } else if (obj is Field) {
-      container.children = [
+      container.children = <Element>[
         new FieldViewElement(
             app.vm,
             obj.isolate,
@@ -322,7 +322,7 @@
             queue: app.queue)
       ];
     } else if (obj is Instance) {
-      container.children = [
+      container.children = <Element>[
         new InstanceViewElement(
             app.vm,
             obj.isolate,
@@ -343,7 +343,7 @@
             queue: app.queue)
       ];
     } else if (obj is Isolate) {
-      container.children = [
+      container.children = <Element>[
         new IsolateViewElement(
             app.vm,
             obj,
@@ -358,7 +358,7 @@
             queue: app.queue)
       ];
     } else if (obj is ServiceFunction) {
-      container.children = [
+      container.children = <Element>[
         new FunctionViewElement(
             app.vm,
             obj.isolate,
@@ -376,7 +376,7 @@
             queue: app.queue)
       ];
     } else if (obj is ICData) {
-      container.children = [
+      container.children = <Element>[
         new ICDataViewElement(
             app.vm,
             obj.isolate,
@@ -392,7 +392,7 @@
             queue: app.queue)
       ];
     } else if (obj is SingleTargetCache) {
-      container.children = [
+      container.children = <Element>[
         new SingleTargetCacheViewElement(
             app.vm,
             obj.isolate,
@@ -408,7 +408,7 @@
             queue: app.queue)
       ];
     } else if (obj is SubtypeTestCache) {
-      container.children = [
+      container.children = <Element>[
         new SubtypeTestCacheViewElement(
             app.vm,
             obj.isolate,
@@ -424,7 +424,7 @@
             queue: app.queue)
       ];
     } else if (obj is UnlinkedCall) {
-      container.children = [
+      container.children = <Element>[
         new UnlinkedCallViewElement(
             app.vm,
             obj.isolate,
@@ -440,7 +440,7 @@
             queue: app.queue)
       ];
     } else if (obj is Library) {
-      container.children = [
+      container.children = <Element>[
         new LibraryViewElement(
             app.vm,
             obj.isolate,
@@ -459,7 +459,7 @@
             queue: app.queue)
       ];
     } else if (obj is MegamorphicCache) {
-      container.children = [
+      container.children = <Element>[
         new MegamorphicCacheViewElement(
             app.vm,
             obj.isolate,
@@ -475,7 +475,7 @@
             queue: app.queue)
       ];
     } else if (obj is ObjectPool) {
-      container.children = [
+      container.children = <Element>[
         new ObjectPoolViewElement(
             app.vm,
             obj.isolate,
@@ -497,7 +497,7 @@
           pos = int.parse(app.locationManager.internalArguments['pos']);
         } catch (_) {}
       }
-      container.children = [
+      container.children = <Element>[
         new ScriptViewElement(
             app.vm,
             obj.isolate,
@@ -514,7 +514,7 @@
             queue: app.queue)
       ];
     } else if (obj is HeapObject) {
-      container.children = [
+      container.children = <Element>[
         new ObjectViewElement(
             app.vm,
             obj.isolate,
@@ -529,13 +529,13 @@
             queue: app.queue)
       ];
     } else if (obj is Sentinel) {
-      container.children = [
+      container.children = <Element>[
         new SentinelViewElement(
             app.vm, obj.isolate, obj, app.events, app.notifications,
             queue: app.queue)
       ];
     } else {
-      container.children = [
+      container.children = <Element>[
         new JSONViewElement(obj, app.notifications, queue: app.queue)
       ];
     }
@@ -556,7 +556,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new ClassTreeElement(
             app.vm, isolate, app.events, app.notifications, _classRepository)
       ];
@@ -572,7 +572,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) async {
-      container.children = [
+      container.children = <Element>[
         new DebuggerPageElement(
             isolate, _objectRepository, _scriptRepository, app.events)
       ];
@@ -601,7 +601,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) async {
-      container.children = [
+      container.children = <Element>[
         new ObjectStoreViewElement(isolate.vm, isolate, app.events,
             app.notifications, _objectstoreRepository, _objectRepository)
       ];
@@ -624,7 +624,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new CpuProfileElement(isolate.vm, isolate, app.events,
             app.notifications, _isolateSampleProfileRepository)
       ];
@@ -647,7 +647,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new CpuProfileTableElement(isolate.vm, isolate, app.events,
             app.notifications, _isolateSampleProfileRepository)
       ];
@@ -670,7 +670,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new AllocationProfileElement(isolate.vm, isolate, app.events,
             app.notifications, _allocationProfileRepository,
             queue: app.queue)
@@ -711,7 +711,7 @@
       VM vm = serviceObject;
       // Preload all isolates to avoid sorting problems.
       await Future.wait(vm.isolates.map((i) => i.load()));
-      container.children = [
+      container.children = <Element>[
         new MemoryDashboardElement(
             vm,
             _vmrepository,
@@ -754,7 +754,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new PortsElement(isolate.vm, isolate, app.events, app.notifications,
             _portsRepository, _objectRepository,
             queue: app.queue)
@@ -777,7 +777,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new PersistentHandlesPageElement(isolate.vm, isolate, app.events,
             app.notifications, _persistentHandlesRepository, _objectRepository,
             queue: app.queue)
@@ -800,7 +800,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new HeapMapElement(isolate.vm, isolate, app.events, app.notifications,
             queue: app.queue)
       ];
@@ -822,7 +822,7 @@
   void _visit(Uri uri) {
     super._visit(uri);
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new HeapSnapshotElement(isolate.vm, isolate, app.events,
             app.notifications, _heapSnapshotRepository, _objectRepository,
             queue: app.queue)
@@ -860,7 +860,7 @@
     assert(element != null);
     assert(canVisit(uri));
     getIsolate(uri).then((isolate) {
-      container.children = [
+      container.children = <Element>[
         new LoggingPageElement(app.vm, isolate, app.events, app.notifications,
             queue: app.queue)
       ];
@@ -919,7 +919,7 @@
 
   void _visit(Uri uri) {
     app.vm.reload();
-    container.children = [
+    container.children = <Element>[
       new IsolateReconnectElement(
           app.vm,
           app.events,
@@ -947,7 +947,7 @@
       lastIsolate = isolate;
       container.children = const [];
       await _metricRepository.startSampling(isolate);
-      container.children = [
+      container.children = <Element>[
         new MetricsPageElement(isolate.vm, isolate, app.events,
             app.notifications, _metricRepository,
             queue: app.queue)
@@ -999,7 +999,7 @@
   void _visit(Uri uri) {
     assert(canVisit(uri));
     app.vm.load().then((_) {
-      container.children = [
+      container.children = <Element>[
         new TimelineDashboardElement(
             app.vm, _timelineRepository, app.notifications,
             queue: app.queue)
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index f11e63a..d1e4f86 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -84,7 +84,7 @@
     assert(notifications != null);
     assert(repository != null);
     AllocationProfileElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<AllocationProfileElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -111,13 +111,13 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _gcSubscription.cancel();
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -133,7 +133,7 @@
           ..onRefresh.listen((_) => _refresh()),
         new DivElement()
           ..classes = ['nav-option']
-          ..children = [
+          ..children = <Element>[
             new CheckboxInputElement()
               ..id = 'allocation-profile-auto-refresh'
               ..checked = _autoRefresh
@@ -146,7 +146,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Allocation Profile',
           new HRElement()
         ]
@@ -155,7 +155,7 @@
       children.addAll([
         new DivElement()
           ..classes = ['content-centered-big']
-          ..children = [new HeadingElement.h2()..text = 'Loading...']
+          ..children = <Element>[new HeadingElement.h2()..text = 'Loading...']
       ]);
     } else {
       final newChartHost = new DivElement()..classes = ['host'];
@@ -170,10 +170,10 @@
               : [
                   new DivElement()
                     ..classes = ['memberList']
-                    ..children = [
+                    ..children = <Element>[
                       new DivElement()
                         ..classes = ['memberItem']
-                        ..children = [
+                        ..children = <Element>[
                           new DivElement()
                             ..classes = ['memberName']
                             ..text = 'last forced GC at',
@@ -185,7 +185,7 @@
                         ],
                       new DivElement()
                         ..classes = ['memberItem']
-                        ..children = [
+                        ..children = <Element>[
                           new DivElement()
                             ..classes = ['memberName']
                             ..text = 'last accumulator reset at',
@@ -200,7 +200,7 @@
                 ],
         new DivElement()
           ..classes = ['content-centered-big', 'compactable']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['heap-space', 'left']
               ..children = _isCompacted
@@ -218,7 +218,7 @@
                       new BRElement(),
                       new DivElement()
                         ..classes = ['chart']
-                        ..children = [newChartLegend, newChartHost]
+                        ..children = <Element>[newChartLegend, newChartHost]
                     ],
             new DivElement()
               ..classes = ['heap-space', 'right']
@@ -237,7 +237,7 @@
                       new BRElement(),
                       new DivElement()
                         ..classes = ['chart']
-                        ..children = [oldChartLegend, oldChartHost]
+                        ..children = <Element>[oldChartLegend, oldChartHost]
                     ],
             new ButtonElement()
               ..classes = ['compact']
@@ -250,7 +250,7 @@
           ],
         new DivElement()
           ..classes = _isCompacted ? ['collection', 'expanded'] : ['collection']
-          ..children = [
+          ..children = <Element>[
             new VirtualCollectionElement(
                 _createCollectionLine, _updateCollectionLine,
                 createHeader: _createCollectionHeader,
@@ -309,15 +309,21 @@
     }
     switch (_sortingDirection) {
       case _SortingDirection.ascending:
-        return (a, b) => getter(a).compareTo(getter(b));
+        int sort(M.ClassHeapStats a, M.ClassHeapStats b) {
+          return getter(a).compareTo(getter(b));
+        }
+        return sort;
       case _SortingDirection.descending:
-        return (a, b) => getter(b).compareTo(getter(a));
+        int sort(M.ClassHeapStats a, M.ClassHeapStats b) {
+          return getter(b).compareTo(getter(a));
+        }
+        return sort;
     }
   }
 
   static HtmlElement _createCollectionLine() => new DivElement()
     ..classes = ['collection-item']
-    ..children = [
+    ..children = <Element>[
       new SpanElement()
         ..classes = ['bytes']
         ..text = '0B',
@@ -360,7 +366,7 @@
   List<HtmlElement> _createCollectionHeader() => [
         new DivElement()
           ..classes = ['collection-item']
-          ..children = [
+          ..children = <Element>[
             new SpanElement()
               ..classes = ['group']
               ..text = 'Accumulated',
@@ -382,7 +388,7 @@
           ],
         new DivElement()
           ..classes = ['collection-item']
-          ..children = [
+          ..children = <Element>[
             _createHeaderButton(const ['bytes'], 'Size',
                 _SortingField.accumulatedSize, _SortingDirection.descending),
             _createHeaderButton(
@@ -473,7 +479,8 @@
       ..classes = ['name'];
   }
 
-  bool _search(Pattern pattern, M.ClassHeapStats item) {
+  bool _search(Pattern pattern, itemDynamic) {
+    M.ClassHeapStats item = itemDynamic;
     return item.clazz.name.contains(pattern);
   }
 
@@ -495,7 +502,7 @@
     return [
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'used',
@@ -505,7 +512,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'external',
@@ -515,7 +522,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'collections',
@@ -525,7 +532,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'average collection time',
@@ -535,7 +542,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'cumulative collection time',
@@ -545,7 +552,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'average time between collections',
@@ -570,7 +577,7 @@
     final config = new ChartConfig(series, [0])
       ..minimumSize = minSize
       ..legend = new ChartLegend(legend, showValues: true);
-    final data = new ChartData(_columns, [
+    final data = new ChartData(_columns, <List>[
       ['Used', space.used],
       ['Free', space.capacity - space.used],
       ['External', space.external]
diff --git a/runtime/observatory/lib/src/elements/class_allocation_profile.dart b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
index 36df884..60dadc3 100644
--- a/runtime/observatory/lib/src/elements/class_allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
@@ -46,7 +46,8 @@
     assert(cls != null);
     assert(profiles != null);
     ClassAllocationProfileElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r =
+        new RenderingScheduler<ClassAllocationProfileElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._cls = cls;
@@ -66,7 +67,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
diff --git a/runtime/observatory/lib/src/elements/class_instances.dart b/runtime/observatory/lib/src/elements/class_instances.dart
index 84ba605..beb1049 100644
--- a/runtime/observatory/lib/src/elements/class_instances.dart
+++ b/runtime/observatory/lib/src/elements/class_instances.dart
@@ -60,7 +60,7 @@
     assert(topRetainingInstances != null);
     assert(objects != null);
     ClassInstancesElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ClassInstancesElement>(e, queue: queue);
     e._isolate = isolate;
     e._cls = cls;
     e._retainedSizes = retainedSizes;
@@ -83,7 +83,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   StronglyReachableInstancesElement _strong;
@@ -102,13 +102,13 @@
         _cls.newSpace.current.instances + _cls.oldSpace.current.instances;
     final size = Utils
         .formatSize(_cls.newSpace.current.bytes + _cls.oldSpace.current.bytes);
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['memberList']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = const ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = const ['memberName']
                 ..text = 'currently allocated',
@@ -118,19 +118,19 @@
             ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'strongly reachable ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = [_strong]
+                ..children = <Element>[_strong]
             ],
           new DivElement()
             ..classes = ['memberItem']
             ..title = 'Space reachable from this object, '
                 'excluding class references'
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Reachable size ',
@@ -142,7 +142,7 @@
             ..classes = ['memberItem']
             ..title = 'Space that would be reclaimed if references to this '
                 'object were replaced with null'
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Retained size ',
@@ -152,13 +152,13 @@
             ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'toplist by retained memory ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = [_topRetainig]
+                ..children = <Element>[_topRetainig]
             ]
         ]
     ];
diff --git a/runtime/observatory/lib/src/elements/class_ref.dart b/runtime/observatory/lib/src/elements/class_ref.dart
index f17d161..eee3cb6 100644
--- a/runtime/observatory/lib/src/elements/class_ref.dart
+++ b/runtime/observatory/lib/src/elements/class_ref.dart
@@ -26,7 +26,7 @@
       {RenderingQueue queue}) {
     assert(cls != null);
     ClassRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ClassRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._class = cls;
     return e;
@@ -44,11 +44,11 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(
           href: (_isolate == null)
               ? null
diff --git a/runtime/observatory/lib/src/elements/class_tree.dart b/runtime/observatory/lib/src/elements/class_tree.dart
index 904014c..505eef9 100644
--- a/runtime/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/observatory/lib/src/elements/class_tree.dart
@@ -55,7 +55,7 @@
     assert(notifications != null);
     assert(classes != null);
     ClassTreeElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ClassTreeElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -76,15 +76,15 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   VirtualTreeElement _tree;
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -93,7 +93,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()
             ..text = 'Class Hierarchy (${_subclasses.length})',
           new BRElement(),
@@ -146,7 +146,7 @@
   static HtmlElement _create(toggle) {
     return new DivElement()
       ..classes = ['class-tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..classes = ['lines'],
         new ButtonElement()
           ..classes = ['expander']
@@ -155,14 +155,15 @@
       ];
   }
 
-  void _update(HtmlElement el, M.Class cls, int index) {
+  void _update(HtmlElement el, classDynamic, int index) {
+    M.Class cls = classDynamic;
     virtualTreeUpdateLines(el.children[0], index);
     if (cls.subclasses.isEmpty) {
       el.children[1].text = '';
     } else {
       el.children[1].text = _tree.isExpanded(cls) ? 'â–¼' : 'â–º';
     }
-    el.children[2].children = [
+    el.children[2].children = <Element>[
       new ClassRefElement(_isolate, cls, queue: _r.queue)
     ];
     if (_mixins[cls.id] != null) {
@@ -170,13 +171,14 @@
     }
   }
 
-  bool _search(Pattern pattern, M.Class cls) {
+  bool _search(Pattern pattern, classDynamic) {
+    M.Class cls = classDynamic;
     return cls.name.contains(pattern);
   }
 
   List<Element> _createMixins(List<M.Instance> types) {
     final children = types
-        .expand((type) => [
+        .expand((type) => <Element>[
               new SpanElement()..text = ', ',
               type.typeClass == null
                   ? (new SpanElement()..text = type.name.split('<').first)
diff --git a/runtime/observatory/lib/src/elements/class_view.dart b/runtime/observatory/lib/src/elements/class_view.dart
index 95c5279..f2ceec0 100644
--- a/runtime/observatory/lib/src/elements/class_view.dart
+++ b/runtime/observatory/lib/src/elements/class_view.dart
@@ -121,7 +121,7 @@
     assert(topRetained != null);
     assert(profiles != null);
     ClassViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ClassViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -155,7 +155,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   ObjectCommonElement _common;
@@ -184,8 +184,8 @@
     if (_cls.isPatch) {
       header += 'patch ';
     }
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -210,7 +210,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = '$header class ${_cls.name}',
           new HRElement(),
           _common,
@@ -240,7 +240,7 @@
           new HeadingElement.h2()..text = 'Allocations',
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Tracing allocations?	',
@@ -300,13 +300,13 @@
     if (_cls.library != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'library',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new LibraryRefElement(_isolate, _cls.library, queue: _r.queue)
             ]
         ]);
@@ -314,13 +314,13 @@
     if (_cls.location != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'script',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new SourceLinkElement(_isolate, _cls.location, _scripts,
                   queue: _r.queue)
             ]
@@ -329,13 +329,13 @@
     if (_cls.superclass != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'superclass',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new ClassRefElement(_isolate, _cls.superclass, queue: _r.queue)
             ]
         ]);
@@ -343,13 +343,13 @@
     if (_cls.superType != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'supertype',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new InstanceRefElement(_isolate, _cls.superType, _objects,
                   queue: _r.queue)
             ]
@@ -358,13 +358,13 @@
     if (cls.mixin != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'mixin',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new InstanceRefElement(_isolate, _cls.mixin, _objects,
                   queue: _r.queue)
             ]
@@ -373,14 +373,14 @@
     if (_cls.subclasses.length > 0) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'extended by',
           new DivElement()
             ..classes = ['memberValue']
             ..children = (_cls.subclasses
-                .expand((subcls) => [
+                .expand((subcls) => <Element>[
                       new ClassRefElement(_isolate, subcls, queue: _r.queue),
                       new SpanElement()..text = ', '
                     ])
@@ -394,14 +394,14 @@
     if (_cls.interfaces.length > 0) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'implements',
           new DivElement()
             ..classes = ['memberValue']
             ..children = (_cls.interfaces
-                .expand((interf) => [
+                .expand((interf) => <Element>[
                       new InstanceRefElement(_isolate, interf, _objects,
                           queue: _r.queue),
                       new SpanElement()..text = ', '
@@ -413,7 +413,7 @@
     if (_cls.name != _cls.vmName) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'vm name',
@@ -432,25 +432,25 @@
       _fieldsExpanded = _fieldsExpanded ?? (fields.length <= 8);
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'fields ${fields.length}',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(expanded: _fieldsExpanded)
                 ..onToggle.listen((e) => _fieldsExpanded = e.control.expanded)
-                ..content = [
+                ..content = <Element>[
                   new DivElement()
                     ..classes = ['memberList']
                     ..children = (fields
-                        .map((f) => new DivElement()
+                        .map<Element>((f) => new DivElement()
                           ..classes = ['memberItem']
-                          ..children = [
+                          ..children = <Element>[
                             new DivElement()
                               ..classes = ['memberName']
-                              ..children = [
+                              ..children = <Element>[
                                 new FieldRefElement(_isolate, f, _objects,
                                     queue: _r.queue)
                               ],
@@ -474,20 +474,20 @@
       _functionsExpanded = _functionsExpanded ?? (functions.length <= 8);
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'functions (${functions.length})',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(expanded: _functionsExpanded)
                 ..onToggle
                     .listen((e) => _functionsExpanded = e.control.expanded)
                 ..content = (functions
-                    .map((f) => new DivElement()
+                    .map<Element>((f) => new DivElement()
                       ..classes = ['indent']
-                      ..children = [
+                      ..children = <Element>[
                         new FunctionRefElement(_isolate, f, queue: _r.queue)
                       ])
                     .toList())
diff --git a/runtime/observatory/lib/src/elements/code_ref.dart b/runtime/observatory/lib/src/elements/code_ref.dart
index bf62390..fc35ef8 100644
--- a/runtime/observatory/lib/src/elements/code_ref.dart
+++ b/runtime/observatory/lib/src/elements/code_ref.dart
@@ -29,7 +29,7 @@
       {RenderingQueue queue}) {
     assert(code != null);
     CodeRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<CodeRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._code = code;
     return e;
@@ -46,12 +46,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(
           href: ((M.isSyntheticCode(_code.kind)) || (_isolate == null))
               ? null
diff --git a/runtime/observatory/lib/src/elements/code_view.dart b/runtime/observatory/lib/src/elements/code_view.dart
index cfec45b..b943be5 100644
--- a/runtime/observatory/lib/src/elements/code_view.dart
+++ b/runtime/observatory/lib/src/elements/code_view.dart
@@ -98,7 +98,7 @@
     assert(references != null);
     assert(retainingPaths != null);
     CodeViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<CodeViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -140,7 +140,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   TableElement _disassemblyTable;
@@ -151,9 +151,9 @@
   void render() {
     if (_inlineRangeTable == null) {
       _inlineRangeTable = new TableElement()..classes = ['table'];
-      _inlineRangeTable.createTHead().children = [
+      _inlineRangeTable.createTHead().children = <Element>[
         new TableRowElement()
-          ..children = [
+          ..children = <Element>[
             document.createElement('th')
               ..classes = ['address']
               ..text = 'Address Range',
@@ -171,9 +171,9 @@
     }
     if (_disassemblyTable == null) {
       _disassemblyTable = new TableElement()..classes = ['table'];
-      _disassemblyTable.createTHead().children = [
+      _disassemblyTable.createTHead().children = <Element>[
         new TableRowElement()
-          ..children = [
+          ..children = <Element>[
             document.createElement('th')
               ..classes = ['address']
               ..text = 'Address Range',
@@ -198,8 +198,8 @@
     }
     final inlinedFunctions = _code.inlinedFunctions.toList();
     final S.Code code = _code as S.Code;
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -218,7 +218,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()
             ..text = (M.isDartCode(_code.kind) && _code.isOptimized)
                 ? 'Optimized code for ${_code.name}'
@@ -230,10 +230,10 @@
           new BRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Kind',
@@ -255,13 +255,13 @@
                       ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Function',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       new FunctionRefElement(_isolate, _code.function,
                           queue: _r.queue)
                     ]
@@ -292,13 +292,13 @@
                       ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Object pool',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       new ObjectPoolRefElement(_isolate, _code.objectPool,
                           queue: _r.queue)
                     ]
@@ -314,12 +314,12 @@
                               'inlined functions (${inlinedFunctions.length})',
                         new DivElement()
                           ..classes = ['memberValue']
-                          ..children = [
+                          ..children = <Element>[
                             new CurlyBlockElement(
                                 expanded: inlinedFunctions.length < 8,
                                 queue: _r.queue)
                               ..content = inlinedFunctions
-                                  .map((f) => new FunctionRefElement(
+                                  .map<Element>((f) => new FunctionRefElement(
                                       _isolate, f,
                                       queue: _r.queue))
                                   .toList()
@@ -476,7 +476,9 @@
       final cell = tr.children[i];
       final content = row.values[i];
       if (content is S.HeapObject) {
-        cell.children = [anyRef(_isolate, content, _objects, queue: _r.queue)];
+        cell.children = <Element>[
+          anyRef(_isolate, content, _objects, queue: _r.queue)
+        ];
       } else if (content != null) {
         String text = '$content';
         if (i == kDisassemblyColumnIndex) {
diff --git a/runtime/observatory/lib/src/elements/containers/search_bar.dart b/runtime/observatory/lib/src/elements/containers/search_bar.dart
index e3cc4ea..c07c495 100644
--- a/runtime/observatory/lib/src/elements/containers/search_bar.dart
+++ b/runtime/observatory/lib/src/elements/containers/search_bar.dart
@@ -59,7 +59,7 @@
     assert(search != null);
     assert(isOpen != null);
     SearchBarElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SearchBarElement>(e, queue: queue);
     e._search = search;
     e._isOpen = isOpen;
     e._workspace = workspace;
@@ -128,7 +128,7 @@
           }
         });
       _resultsArea = new SpanElement();
-      children = [
+      children = <Element>[
         _input,
         _resultsArea,
         new ButtonElement()
diff --git a/runtime/observatory/lib/src/elements/containers/virtual_collection.dart b/runtime/observatory/lib/src/elements/containers/virtual_collection.dart
index 4f9839e..b1a9169 100644
--- a/runtime/observatory/lib/src/elements/containers/virtual_collection.dart
+++ b/runtime/observatory/lib/src/elements/containers/virtual_collection.dart
@@ -54,7 +54,7 @@
     assert(update != null);
     assert(items != null);
     VirtualCollectionElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<VirtualCollectionElement>(e, queue: queue);
     e._create = create;
     e._createHeader = createHeader;
     e._update = update;
@@ -126,12 +126,12 @@
 
   void render() {
     if (children.isEmpty) {
-      children = [
+      children = <Element>[
         _viewport
-          ..children = [
+          ..children = <Element>[
             _spacer
-              ..children = [
-                _buffer..children = [_create()]
+              ..children = <Element>[
+                _buffer..children = <Element>[_create()]
               ],
           ]
       ];
@@ -216,7 +216,7 @@
     _updateHeader();
   }
 
-  double _foldWidth(double value, HtmlElement child) {
+  double _foldWidth(double value, Element child) {
     return math.max(value, child.getBoundingClientRect().width);
   }
 
diff --git a/runtime/observatory/lib/src/elements/containers/virtual_tree.dart b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
index 82dc906..0c9b38b 100644
--- a/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
+++ b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
@@ -57,7 +57,7 @@
     assert(children != null);
     assert(items != null);
     VirtualTreeElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<VirtualTreeElement>(e, queue: queue);
     e._children = children;
     e._collection = new VirtualCollectionElement(() {
       var element;
@@ -151,7 +151,7 @@
 
   void render() {
     if (children.length == 0) {
-      children = [_collection];
+      children = <Element>[_collection];
     }
 
     final items = [];
diff --git a/runtime/observatory/lib/src/elements/context_ref.dart b/runtime/observatory/lib/src/elements/context_ref.dart
index 25b1fa5..c4c06b2 100644
--- a/runtime/observatory/lib/src/elements/context_ref.dart
+++ b/runtime/observatory/lib/src/elements/context_ref.dart
@@ -36,7 +36,7 @@
     assert(context != null);
     assert(objects != null);
     ContextRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ContextRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._context = context;
     e._objects = objects;
@@ -56,7 +56,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   Future _refresh() async {
@@ -67,7 +67,7 @@
   void render() {
     var children = <HtmlElement>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _context))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'Context',
@@ -78,7 +78,7 @@
       children.addAll([
         new SpanElement()..text = ' ',
         new CurlyBlockElement(expanded: _expanded, queue: _r.queue)
-          ..content = [
+          ..content = <Element>[
             new DivElement()
               ..classes = ['indent']
               ..children = _createValue()
@@ -104,13 +104,13 @@
     if (_loadedContext.parentContext != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'parent context',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new ContextRefElement(
                   _isolate, _loadedContext.parentContext, _objects,
                   queue: _r.queue)
@@ -123,13 +123,13 @@
         var variable = variables[index];
         members.add(new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = '[ $index ]',
             new DivElement()
               ..classes = ['memberName']
-              ..children = [
+              ..children = <Element>[
                 anyRef(_isolate, variable.value, _objects, queue: _r.queue)
               ]
           ]);
diff --git a/runtime/observatory/lib/src/elements/context_view.dart b/runtime/observatory/lib/src/elements/context_view.dart
index f89e578..15dd1a6 100644
--- a/runtime/observatory/lib/src/elements/context_view.dart
+++ b/runtime/observatory/lib/src/elements/context_view.dart
@@ -82,7 +82,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     ContextViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ContextViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -109,12 +109,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    var content = [
-      navBar([
+    var content = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -130,7 +130,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Context',
           new HRElement(),
           new ObjectCommonElement(_isolate, _context, _retainedSizes,
@@ -143,19 +143,19 @@
         new BRElement(),
         new DivElement()
           ..classes = ['content-centered-big']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberList']
-              ..children = [
+              ..children = <Element>[
                 new DivElement()
                   ..classes = ['memberItem']
-                  ..children = [
+                  ..children = <Element>[
                     new DivElement()
                       ..classes = ['memberName']
                       ..text = 'parent context',
                     new DivElement()
                       ..classes = ['memberName']
-                      ..children = [
+                      ..children = <Element>[
                         new ContextRefElement(
                             _isolate, _context.parentContext, _objects,
                             queue: _r.queue)
@@ -171,22 +171,22 @@
       content.addAll([
         new DivElement()
           ..classes = ['content-centered-big']
-          ..children = [
+          ..children = <Element>[
             new SpanElement()..text = 'Variables ',
             new CurlyBlockElement(expanded: true, queue: _r.queue)
-              ..content = [
+              ..content = <Element>[
                 new DivElement()
                   ..classes = ['memberList']
                   ..children = _context.variables
-                      .map((variable) => new DivElement()
+                      .map<Element>((variable) => new DivElement()
                         ..classes = ['memberItem']
-                        ..children = [
+                        ..children = <Element>[
                           new DivElement()
                             ..classes = ['memberName']
                             ..text = '[ ${++index} ]',
                           new DivElement()
                             ..classes = ['memberName']
-                            ..children = [
+                            ..children = <Element>[
                               anyRef(_isolate, variable.value, _objects,
                                   queue: _r.queue)
                             ]
@@ -198,7 +198,7 @@
     }
     content.add(new DivElement()
       ..classes = ['content-centered-big']
-      ..children = [new ViewFooterElement(queue: _r.queue)]);
+      ..children = <Element>[new ViewFooterElement(queue: _r.queue)]);
     children = content;
   }
 }
diff --git a/runtime/observatory/lib/src/elements/cpu_profile.dart b/runtime/observatory/lib/src/elements/cpu_profile.dart
index f5e5180..4c8bc31 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile.dart
@@ -68,7 +68,7 @@
     assert(notifications != null);
     assert(profiles != null);
     CpuProfileElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<CpuProfileElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -90,12 +90,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    var content = [
-      navBar([
+    var content = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
diff --git a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
index c4caa7c..3ee7325 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
@@ -58,7 +58,7 @@
     assert(mode != null);
     assert(direction != null);
     CpuProfileVirtualTreeElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<CpuProfileVirtualTreeElement>(e, queue: queue);
     e._isolate = owner;
     e._profile = profile;
     e._mode = mode;
@@ -79,7 +79,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   VirtualTreeElement _tree;
@@ -128,28 +128,28 @@
       });
     }
     if (tree == null) {
-      children = [new HeadingElement.h1()..text = 'No Results'];
+      children = <Element>[new HeadingElement.h1()..text = 'No Results'];
       return;
     }
     _tree = new VirtualTreeElement(create, update, _getChildren,
         items: tree.root.children, search: search, queue: _r.queue);
     if (tree.root.children.length == 0) {
-      children = [
+      children = <Element>[
         new DivElement()
           ..classes = ['tree-item']
-          ..children = [new HeadingElement.h1()..text = 'No Samples']
+          ..children = <Element>[new HeadingElement.h1()..text = 'No Samples']
       ];
       return;
     } else if (tree.root.children.length == 1) {
       _tree.expand(tree.root.children.first, autoExpandSingleChildNodes: true);
     }
-    children = [_tree];
+    children = <Element>[_tree];
   }
 
-  static Element _createCpuRow(toggle) {
+  static HtmlElement _createCpuRow(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['inclusive']
           ..title = 'global % on stack',
@@ -167,10 +167,10 @@
       ];
   }
 
-  static Element _createMemoryRow(toggle) {
+  static HtmlElement _createMemoryRow(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['inclusive']
           ..title = 'memory allocated from resulting calls: ',
@@ -197,7 +197,8 @@
   static const String _collapsedIcon = 'â–º';
 
   void _updateCpuFunctionRow(
-      HtmlElement element, M.FunctionCallTreeNode item, int depth) {
+      HtmlElement element, itemDynamic, int depth) {
+    M.FunctionCallTreeNode item = itemDynamic;
     element.children[0].text = Utils
         .formatPercentNormalized(item.profileFunction.normalizedInclusiveTicks);
     element.children[1].text = Utils
@@ -217,7 +218,8 @@
   }
 
   void _updateMemoryFunctionRow(
-      HtmlElement element, M.FunctionCallTreeNode item, int depth) {
+      HtmlElement element, itemDynamic, int depth) {
+    M.FunctionCallTreeNode item = itemDynamic;
     element.children[0].text =
         Utils.formatSize(item.inclusiveNativeAllocations);
     element.children[0].title = 'memory allocated from resulting calls: '
@@ -240,11 +242,14 @@
       ..classes = ['name'];
   }
 
-  bool _searchFunction(Pattern pattern, M.FunctionCallTreeNode item) =>
-      M.getFunctionFullName(item.profileFunction.function).contains(pattern);
+  bool _searchFunction(Pattern pattern, itemDynamic) {
+    M.FunctionCallTreeNode item = itemDynamic;
+    return M.getFunctionFullName(item.profileFunction.function).contains(pattern);
+  }
 
   void _updateCpuCodeRow(
-      HtmlElement element, M.CodeCallTreeNode item, int depth) {
+      HtmlElement element, itemDynamic, int depth) {
+    M.CodeCallTreeNode item = itemDynamic;
     element.children[0].text = Utils
         .formatPercentNormalized(item.profileCode.normalizedInclusiveTicks);
     element.children[1].text = Utils
@@ -263,7 +268,8 @@
   }
 
   void _updateMemoryCodeRow(
-      HtmlElement element, M.CodeCallTreeNode item, int depth) {
+      HtmlElement element, itemDynamic, int depth) {
+    M.CodeCallTreeNode item = itemDynamic;
     element.children[0].text =
         Utils.formatSize(item.inclusiveNativeAllocations);
     element.children[0].title = 'memory allocated from resulting calls: '
@@ -285,8 +291,10 @@
           ..classes = ['name'];
   }
 
-  bool _searchCode(Pattern pattern, M.CodeCallTreeNode item) =>
-      item.profileCode.code.name.contains(pattern);
+  bool _searchCode(Pattern pattern, itemDynamic) {
+    M.CodeCallTreeNode item = itemDynamic;
+    return item.profileCode.code.name.contains(pattern);
+  }
 
   static _updateLines(List<Element> lines, int n) {
     n = Math.max(0, n);
diff --git a/runtime/observatory/lib/src/elements/cpu_profile_table.dart b/runtime/observatory/lib/src/elements/cpu_profile_table.dart
index 3e141a1..a78e2a4 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile_table.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile_table.dart
@@ -85,7 +85,7 @@
     assert(notifications != null);
     assert(profiles != null);
     CpuProfileTableElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<CpuProfileTableElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -107,12 +107,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    var content = [
-      navBar([
+    var content = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -171,19 +171,19 @@
       _callers.items = const [];
       _callees.items = const [];
     }
-    return [
+    return <Element>[
       new DivElement()
         ..classes = ['profile-trees']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['profile-trees-all']
-            ..children = [_functions],
+            ..children = <Element>[_functions],
           new DivElement()
             ..classes = ['profile-trees-current']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['profile-trees-caller']
-                ..children = [_callers],
+                ..children = <Element>[_callers],
               new DivElement()
                 ..classes = ['profile-trees-selected']
                 ..children = _selected == null
@@ -194,16 +194,16 @@
                       ],
               new DivElement()
                 ..classes = ['profile-trees-callee']
-                ..children = [_callees]
+                ..children = <Element>[_callees]
             ]
         ]
     ];
   }
 
-  Element _createFunction() {
+  HtmlElement _createFunction() {
     final element = new DivElement()
       ..classes = ['function-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['exclusive']
           ..text = '0%',
@@ -237,7 +237,7 @@
   List<HtmlElement> _createFunctionHeader() => [
         new DivElement()
           ..classes = ['function-item']
-          ..children = [
+          ..children = <Element>[
             _createHeaderButton(
                 const ['exclusive'],
                 'Execution(%)',
@@ -255,7 +255,8 @@
           ]
       ];
 
-  bool _searchFunction(Pattern pattern, M.ProfileFunction item) {
+  bool _searchFunction(Pattern pattern, itemDynamic) {
+    M.ProfileFunction item = itemDynamic;
     return M.getFunctionFullName(item.function).contains(pattern);
   }
 
@@ -277,10 +278,10 @@
     _r.dirty();
   }
 
-  Element _createCallee() {
+  HtmlElement _createCallee() {
     final element = new DivElement()
       ..classes = ['function-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['inclusive']
           ..text = '0%',
@@ -304,7 +305,7 @@
   List<HtmlElement> _createCalleeHeader() => [
         new DivElement()
           ..classes = ['function-item']
-          ..children = [
+          ..children = <Element>[
             _createHeaderButton(
                 const ['inclusive'],
                 'Callees(%)',
@@ -316,10 +317,10 @@
           ]
       ];
 
-  Element _createCaller() {
+  HtmlElement _createCaller() {
     final element = new DivElement()
       ..classes = ['function-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['inclusive']
           ..text = '0%',
@@ -343,7 +344,7 @@
   List<HtmlElement> _createCallerHeader() => [
         new DivElement()
           ..classes = ['function-item']
-          ..children = [
+          ..children = <Element>[
             _createHeaderButton(
                 const ['inclusive'],
                 'Callers(%)',
@@ -403,8 +404,10 @@
     ];
   }
 
-  bool _filterTree(M.FunctionCallTreeNode node) =>
-      node.profileFunction == _selected;
+  bool _filterTree(nodeDynamic) {
+    M.FunctionCallTreeNode node = nodeDynamic;
+    return node.profileFunction == _selected;
+  }
 
   Future _request({bool clear: false, bool forceFetch: false}) async {
     _progress = null;
@@ -452,9 +455,15 @@
     }
     switch (_sortingDirection[table]) {
       case _SortingDirection.ascending:
-        return (a, b) => getter(a).compareTo(getter(b));
+        int sort(M.ProfileFunction a, M.ProfileFunction b) {
+          return getter(a).compareTo(getter(b));
+        }
+        return sort;
       case _SortingDirection.descending:
-        return (a, b) => getter(b).compareTo(getter(a));
+        int sort(M.ProfileFunction a, M.ProfileFunction b) {
+          return getter(b).compareTo(getter(a));
+        }
+        return sort;
     }
   }
 
diff --git a/runtime/observatory/lib/src/elements/curly_block.dart b/runtime/observatory/lib/src/elements/curly_block.dart
index 12ef047..3d88727 100644
--- a/runtime/observatory/lib/src/elements/curly_block.dart
+++ b/runtime/observatory/lib/src/elements/curly_block.dart
@@ -49,7 +49,7 @@
     assert(expanded != null);
     assert(disabled != null);
     CurlyBlockElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<CurlyBlockElement>(e, queue: queue);
     e._expanded = expanded;
     e._disabled = disabled;
     return e;
@@ -67,7 +67,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void toggle() {
@@ -79,7 +79,7 @@
   }
 
   void render() {
-    List<Element> content = [new SpanElement()..text = '{'];
+    List<Element> content = <Element>[new SpanElement()..text = '{'];
     SpanElement label = new SpanElement()
       ..classes = disabled ? ['curly-block', 'disabled'] : ['curly-block']
       ..innerHtml = expanded
@@ -92,7 +92,7 @@
         ..onClick.listen((_) {
           toggle();
         })
-        ..children = [label]);
+        ..children = <Element>[label]);
     }
     if (expanded) {
       content.add(new BRElement());
diff --git a/runtime/observatory/lib/src/elements/debugger.dart b/runtime/observatory/lib/src/elements/debugger.dart
index 5b15543..1c70579 100644
--- a/runtime/observatory/lib/src/elements/debugger.dart
+++ b/runtime/observatory/lib/src/elements/debugger.dart
@@ -36,7 +36,7 @@
 abstract class DebuggerCommand extends Command {
   ObservatoryDebugger debugger;
 
-  DebuggerCommand(this.debugger, name, children) : super(name, children);
+  DebuggerCommand(this.debugger, name, List<Command> children) : super(name, children);
 
   String get helpShort;
   String get helpLong;
@@ -46,7 +46,7 @@
 // provided by the cli library.
 class HelpCommand extends DebuggerCommand {
   HelpCommand(Debugger debugger)
-      : super(debugger, 'help', [
+      : super(debugger, 'help', <Command>[
           new HelpHotkeysCommand(debugger),
         ]);
 
@@ -62,7 +62,7 @@
     var con = debugger.console;
     if (args.length == 0) {
       // Print list of all top-level commands.
-      var commands = debugger.cmd.matchCommand([], false);
+      var commands = debugger.cmd.matchCommand(<String>[], false);
       commands.sort((a, b) => a.name.compareTo(b.name));
       con.print('List of commands:\n');
       for (DebuggerCommand command in commands) {
@@ -92,7 +92,7 @@
         con.printBold(_nameAndAlias(command));
         con.print(command.helpLong);
 
-        var newArgs = [];
+        var newArgs = <String>[];
         newArgs.addAll(args.take(args.length - 1));
         newArgs.add(command.name);
         newArgs.add('');
@@ -129,7 +129,7 @@
 }
 
 class HelpHotkeysCommand extends DebuggerCommand {
-  HelpHotkeysCommand(Debugger debugger) : super(debugger, 'hotkeys', []);
+  HelpHotkeysCommand(Debugger debugger) : super(debugger, 'hotkeys', <Command>[]);
 
   Future run(List<String> args) {
     var con = debugger.console;
@@ -160,7 +160,7 @@
 }
 
 class PrintCommand extends DebuggerCommand {
-  PrintCommand(Debugger debugger) : super(debugger, 'print', []) {
+  PrintCommand(Debugger debugger) : super(debugger, 'print', <Command>[]) {
     alias = 'p';
   }
 
@@ -193,7 +193,7 @@
 }
 
 class DownCommand extends DebuggerCommand {
-  DownCommand(Debugger debugger) : super(debugger, 'down', []);
+  DownCommand(Debugger debugger) : super(debugger, 'down', <Command>[]);
 
   Future run(List<String> args) {
     int count = 1;
@@ -227,7 +227,7 @@
 }
 
 class UpCommand extends DebuggerCommand {
-  UpCommand(Debugger debugger) : super(debugger, 'up', []);
+  UpCommand(Debugger debugger) : super(debugger, 'up', <Command>[]);
 
   Future run(List<String> args) {
     int count = 1;
@@ -261,7 +261,7 @@
 }
 
 class FrameCommand extends DebuggerCommand {
-  FrameCommand(Debugger debugger) : super(debugger, 'frame', []) {
+  FrameCommand(Debugger debugger) : super(debugger, 'frame', <Command>[]) {
     alias = 'f';
   }
 
@@ -295,7 +295,7 @@
 }
 
 class PauseCommand extends DebuggerCommand {
-  PauseCommand(Debugger debugger) : super(debugger, 'pause', []);
+  PauseCommand(Debugger debugger) : super(debugger, 'pause', <Command>[]);
 
   Future run(List<String> args) {
     return debugger.pause();
@@ -311,7 +311,7 @@
 }
 
 class ContinueCommand extends DebuggerCommand {
-  ContinueCommand(Debugger debugger) : super(debugger, 'continue', []) {
+  ContinueCommand(Debugger debugger) : super(debugger, 'continue', <Command>[]) {
     alias = 'c';
   }
 
@@ -330,7 +330,7 @@
 }
 
 class SmartNextCommand extends DebuggerCommand {
-  SmartNextCommand(Debugger debugger) : super(debugger, 'next', []) {
+  SmartNextCommand(Debugger debugger) : super(debugger, 'next', <Command>[]) {
     alias = 'n';
   }
 
@@ -352,7 +352,7 @@
 }
 
 class SyncNextCommand extends DebuggerCommand {
-  SyncNextCommand(Debugger debugger) : super(debugger, 'next-sync', []);
+  SyncNextCommand(Debugger debugger) : super(debugger, 'next-sync', <Command>[]);
 
   Future run(List<String> args) {
     return debugger.syncNext();
@@ -368,7 +368,7 @@
 }
 
 class AsyncNextCommand extends DebuggerCommand {
-  AsyncNextCommand(Debugger debugger) : super(debugger, 'next-async', []);
+  AsyncNextCommand(Debugger debugger) : super(debugger, 'next-async', <Command>[]);
 
   Future run(List<String> args) {
     return debugger.asyncNext();
@@ -384,7 +384,7 @@
 }
 
 class StepCommand extends DebuggerCommand {
-  StepCommand(Debugger debugger) : super(debugger, 'step', []) {
+  StepCommand(Debugger debugger) : super(debugger, 'step', <Command>[]) {
     alias = 's';
   }
 
@@ -406,7 +406,7 @@
 }
 
 class RewindCommand extends DebuggerCommand {
-  RewindCommand(Debugger debugger) : super(debugger, 'rewind', []);
+  RewindCommand(Debugger debugger) : super(debugger, 'rewind', <Command>[]);
 
   Future run(List<String> args) async {
     try {
@@ -443,7 +443,7 @@
   final M.IsolateRepository _isolates;
 
   ReloadCommand(Debugger debugger, this._isolates)
-      : super(debugger, 'reload', []);
+      : super(debugger, 'reload', <Command>[]);
 
   Future run(List<String> args) async {
     try {
@@ -477,7 +477,7 @@
 }
 
 class ClsCommand extends DebuggerCommand {
-  ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {}
+  ClsCommand(Debugger debugger) : super(debugger, 'cls', <Command>[]) {}
 
   Future run(List<String> args) {
     debugger.console.clear();
@@ -493,7 +493,7 @@
 }
 
 class LogCommand extends DebuggerCommand {
-  LogCommand(Debugger debugger) : super(debugger, 'log', []);
+  LogCommand(Debugger debugger) : super(debugger, 'log', <Command>[]);
 
   Future run(List<String> args) async {
     if (args.length == 0) {
@@ -560,7 +560,7 @@
 }
 
 class FinishCommand extends DebuggerCommand {
-  FinishCommand(Debugger debugger) : super(debugger, 'finish', []);
+  FinishCommand(Debugger debugger) : super(debugger, 'finish', <Command>[]);
 
   Future run(List<String> args) {
     if (debugger.isolatePaused()) {
@@ -591,7 +591,7 @@
 }
 
 class SetCommand extends DebuggerCommand {
-  SetCommand(Debugger debugger) : super(debugger, 'set', []);
+  SetCommand(Debugger debugger) : super(debugger, 'set', <Command>[]);
 
   static var _boeValues = ['All', 'None', 'Unhandled'];
   static var _boolValues = ['false', 'true'];
@@ -737,7 +737,7 @@
 }
 
 class BreakCommand extends DebuggerCommand {
-  BreakCommand(Debugger debugger) : super(debugger, 'break', []);
+  BreakCommand(Debugger debugger) : super(debugger, 'break', <Command>[]);
 
   Future run(List<String> args) async {
     if (args.length > 1) {
@@ -821,7 +821,7 @@
 }
 
 class ClearCommand extends DebuggerCommand {
-  ClearCommand(Debugger debugger) : super(debugger, 'clear', []);
+  ClearCommand(Debugger debugger) : super(debugger, 'clear', <Command>[]);
 
   Future run(List<String> args) async {
     if (args.length > 1) {
@@ -908,7 +908,7 @@
 
 // TODO(turnidge): Add argument completion.
 class DeleteCommand extends DebuggerCommand {
-  DeleteCommand(Debugger debugger) : super(debugger, 'delete', []);
+  DeleteCommand(Debugger debugger) : super(debugger, 'delete', <Command>[]);
 
   Future run(List<String> args) {
     if (args.length < 1) {
@@ -948,7 +948,7 @@
 
 class InfoBreakpointsCommand extends DebuggerCommand {
   InfoBreakpointsCommand(Debugger debugger)
-      : super(debugger, 'breakpoints', []);
+      : super(debugger, 'breakpoints', <Command>[]);
 
   Future run(List<String> args) async {
     if (debugger.isolate.breakpoints.isEmpty) {
@@ -975,7 +975,7 @@
 }
 
 class InfoFrameCommand extends DebuggerCommand {
-  InfoFrameCommand(Debugger debugger) : super(debugger, 'frame', []);
+  InfoFrameCommand(Debugger debugger) : super(debugger, 'frame', <Command>[]);
 
   Future run(List<String> args) {
     if (args.length > 0) {
@@ -995,7 +995,7 @@
 
 class IsolateCommand extends DebuggerCommand {
   IsolateCommand(Debugger debugger)
-      : super(debugger, 'isolate', [
+      : super(debugger, 'isolate', <Command>[
           new IsolateListCommand(debugger),
           new IsolateNameCommand(debugger),
         ]) {
@@ -1077,7 +1077,7 @@
 }
 
 class IsolateListCommand extends DebuggerCommand {
-  IsolateListCommand(Debugger debugger) : super(debugger, 'list', []);
+  IsolateListCommand(Debugger debugger) : super(debugger, 'list', <Command>[]);
 
   Future run(List<String> args) async {
     if (debugger.vm == null) {
@@ -1123,7 +1123,7 @@
 }
 
 class IsolateNameCommand extends DebuggerCommand {
-  IsolateNameCommand(Debugger debugger) : super(debugger, 'name', []);
+  IsolateNameCommand(Debugger debugger) : super(debugger, 'name', <Command>[]);
 
   Future run(List<String> args) {
     if (args.length != 1) {
@@ -1142,7 +1142,7 @@
 
 class InfoCommand extends DebuggerCommand {
   InfoCommand(Debugger debugger)
-      : super(debugger, 'info', [
+      : super(debugger, 'info', <Command>[
           new InfoBreakpointsCommand(debugger),
           new InfoFrameCommand(debugger)
         ]);
@@ -1160,7 +1160,7 @@
 }
 
 class RefreshStackCommand extends DebuggerCommand {
-  RefreshStackCommand(Debugger debugger) : super(debugger, 'stack', []);
+  RefreshStackCommand(Debugger debugger) : super(debugger, 'stack', <Command>[]);
 
   Future run(List<String> args) {
     return debugger.refreshStack();
@@ -1175,7 +1175,7 @@
 
 class RefreshCommand extends DebuggerCommand {
   RefreshCommand(Debugger debugger)
-      : super(debugger, 'refresh', [
+      : super(debugger, 'refresh', <Command>[
           new RefreshStackCommand(debugger),
         ]);
 
@@ -1193,7 +1193,7 @@
 }
 
 class VmListCommand extends DebuggerCommand {
-  VmListCommand(Debugger debugger) : super(debugger, 'list', []);
+  VmListCommand(Debugger debugger) : super(debugger, 'list', <Command>[]);
 
   Future run(List<String> args) async {
     if (args.length > 0) {
@@ -1235,7 +1235,7 @@
 }
 
 class VmNameCommand extends DebuggerCommand {
-  VmNameCommand(Debugger debugger) : super(debugger, 'name', []);
+  VmNameCommand(Debugger debugger) : super(debugger, 'name', <Command>[]);
 
   Future run(List<String> args) async {
     if (args.length != 1) {
@@ -1258,7 +1258,7 @@
 
 class VmCommand extends DebuggerCommand {
   VmCommand(Debugger debugger)
-      : super(debugger, 'vm', [
+      : super(debugger, 'vm', <Command>[
           new VmListCommand(debugger),
           new VmNameCommand(debugger),
         ]);
@@ -2054,17 +2054,17 @@
     final stackDiv = new DivElement()..classes = ['stack'];
     final stackElement = new DebuggerStackElement(
         _isolate, _debugger, stackDiv, _objects, _scripts, _events);
-    stackDiv.children = [stackElement];
+    stackDiv.children = <Element>[stackElement];
     final consoleDiv = new DivElement()
       ..classes = ['console']
-      ..children = [consoleElement];
+      ..children = <Element>[consoleElement];
     final commandElement = new DebuggerInputElement(_isolate, _debugger);
     final commandDiv = new DivElement()
       ..classes = ['commandline']
-      ..children = [commandElement];
+      ..children = <Element>[commandElement];
 
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: app.queue),
         new NavVMMenuElement(app.vm, app.events, queue: app.queue),
         new NavIsolateMenuElement(_isolate, app.events, queue: app.queue),
@@ -2074,10 +2074,10 @@
       ]),
       new DivElement()
         ..classes = ['variable']
-        ..children = [
+        ..children = <Element>[
           stackDiv,
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new HRElement()..classes = ['splitter']
             ],
           consoleDiv,
@@ -2221,10 +2221,10 @@
 
     var btnPause;
     var btnRefresh;
-    e.children = [
+    e.children = <Element>[
       e._isSampled = new DivElement()
         ..classes = ['sampledMessage', 'hidden']
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..text = 'The program is not paused. '
                 'The stack trace below may be out of date.',
@@ -2534,10 +2534,10 @@
       content.addAll([
         new DivElement()
           ..classes = ['frameDetails']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['flex-row-wrap']
-              ..children = [
+              ..children = <Element>[
                 new DivElement()
                   ..classes = ['flex-item-script']
                   ..children = _frame.function?.location == null
@@ -2556,7 +2556,7 @@
                         ],
                 new DivElement()
                   ..classes = ['flex-item-vars']
-                  ..children = [
+                  ..children = <Element>[
                     _varsDiv = new DivElement()
                       ..classes = ['memberList', 'frameVars']
                       ..children = ([
@@ -2570,22 +2570,22 @@
                                     ..text = homeMethodName,
                                   new DivElement()
                                     ..classes = ['memberName']
-                                    ..children = [
+                                    ..children = <Element>[
                                       anyRef(_isolate, homeMethod.dartOwner,
                                           _objects,
                                           queue: _r.queue)
                                     ]
                                 ]
                       ]..addAll(_frame.variables
-                          .map((v) => new DivElement()
+                          .map<Element>((v) => new DivElement()
                             ..classes = ['memberItem']
-                            ..children = [
+                            ..children = <Element>[
                               new DivElement()
                                 ..classes = ['memberName']
                                 ..text = v.name,
                               new DivElement()
                                 ..classes = ['memberName']
-                                ..children = [
+                                ..children = <Element>[
                                   anyRef(_isolate, v['value'], _objects,
                                       queue: _r.queue)
                                 ]
@@ -2595,14 +2595,14 @@
               ],
             new DivElement()
               ..classes = ['frameContractor']
-              ..children = [
+              ..children = <Element>[
                 collapseButton = new ButtonElement()
                   ..onClick.listen((e) async {
                     collapseButton.disabled = true;
                     await _toggleExpand();
                     collapseButton.disabled = false;
                   })
-                  ..children = [iconExpandLess.clone(true)]
+                  ..children = <Element>[iconExpandLess.clone(true)]
               ]
           ]
       ]);
@@ -2611,10 +2611,10 @@
   }
 
   List<Element> _createMarkerHeader(String marker) {
-    final content = [
+    final content = <Element>[
       new DivElement()
         ..classes = ['frameSummaryText']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['frameId']
             ..text = 'Frame ${_frame.index}',
@@ -2629,10 +2629,10 @@
   }
 
   List<Element> _createHeader() {
-    final content = [
+    final content = <Element>[
       new DivElement()
         ..classes = ['frameSummaryText']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['frameId']
             ..text = 'Frame ${_frame.index}',
@@ -2658,7 +2658,7 @@
     if (!_expanded) {
       content.add(new DivElement()
         ..classes = ['frameExpander']
-        ..children = [iconExpandMore.clone(true)]);
+        ..children = <Element>[iconExpandMore.clone(true)]);
     }
     return [
       new DivElement()
@@ -2810,7 +2810,7 @@
     assert(objects != null);
     assert(events != null);
     final DebuggerMessageElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<DebuggerMessageElement>(e, queue: queue);
     e._isolate = isolate;
     e._message = message;
     e._objects = objects;
@@ -2851,10 +2851,10 @@
       content.addAll([
         new DivElement()
           ..classes = ['messageDetails']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['flex-row-wrap']
-              ..children = [
+              ..children = <Element>[
                 new DivElement()
                   ..classes = ['flex-item-script']
                   ..children = _message.handler == null
@@ -2871,10 +2871,10 @@
                         ],
                 new DivElement()
                   ..classes = ['flex-item-vars']
-                  ..children = [
+                  ..children = <Element>[
                     new DivElement()
                       ..classes = ['memberItem']
-                      ..children = [
+                      ..children = <Element>[
                         new DivElement()..classes = ['memberName'],
                         new DivElement()
                           ..classes = ['memberValue']
@@ -2895,14 +2895,14 @@
               ],
             new DivElement()
               ..classes = ['messageContractor']
-              ..children = [
+              ..children = <Element>[
                 collapseButton = new ButtonElement()
                   ..onClick.listen((e) async {
                     collapseButton.disabled = true;
                     await _toggleExpand();
                     collapseButton.disabled = false;
                   })
-                  ..children = [iconExpandLess.clone(true)]
+                  ..children = <Element>[iconExpandLess.clone(true)]
               ]
           ]
       ]);
@@ -2917,10 +2917,10 @@
   }
 
   List<Element> _createHeader() {
-    final content = [
+    final content = <Element>[
       new DivElement()
         ..classes = ['messageSummaryText']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['messageId']
             ..text = 'message ${_message.index}',
@@ -2945,7 +2945,7 @@
     if (!_expanded) {
       content.add(new DivElement()
         ..classes = ['messageExpander']
-        ..children = [iconExpandMore.clone(true)]);
+        ..children = <Element>[iconExpandMore.clone(true)]);
     }
     return [
       new DivElement()
@@ -2975,7 +2975,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   Future _toggleExpand() async {
@@ -3001,7 +3001,7 @@
 
   factory DebuggerConsoleElement() {
     final DebuggerConsoleElement e = document.createElement(tag.name);
-    e.children = [new BRElement()];
+    e.children = <Element>[new BRElement()];
     return e;
   }
 
@@ -3133,7 +3133,7 @@
   factory DebuggerInputElement(
       S.Isolate isolate, ObservatoryDebugger debugger) {
     final DebuggerInputElement e = document.createElement(tag.name);
-    e.children = [e._modalPromptDiv, e._textBox];
+    e.children = <Element>[e._modalPromptDiv, e._textBox];
     e._textBox.select();
     e._textBox.onKeyDown.listen(e._onKeyDown);
     return e;
@@ -3282,7 +3282,7 @@
 final SvgSvgElement iconExpandLess = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PolygonElement()
       ..setAttribute('points', '12,8 6,14 7.4,15.4 12,10.8 16.6,15.4 18,14 ')
   ];
@@ -3290,7 +3290,7 @@
 final SvgSvgElement iconExpandMore = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PolygonElement()
       ..setAttribute('points', '16.6,8.6 12,13.2 7.4,8.6 6,10 12,16 18,10 ')
   ];
@@ -3298,7 +3298,7 @@
 final SvgSvgElement iconChevronRight = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute('d', 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z')
   ];
@@ -3306,7 +3306,7 @@
 final SvgSvgElement iconChevronLeft = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute('d', 'M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z')
   ];
@@ -3314,7 +3314,7 @@
 final SvgSvgElement iconHorizontalThreeDot = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute(
           'd',
@@ -3327,7 +3327,7 @@
 final SvgSvgElement iconVerticalThreeDot = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute(
           'd',
@@ -3340,7 +3340,7 @@
 final SvgSvgElement iconInfo = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute(
           'd',
@@ -3351,7 +3351,7 @@
 final SvgSvgElement iconInfoOutline = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute(
           'd',
diff --git a/runtime/observatory/lib/src/elements/error_ref.dart b/runtime/observatory/lib/src/elements/error_ref.dart
index 20cc4e3..ef7f04a 100644
--- a/runtime/observatory/lib/src/elements/error_ref.dart
+++ b/runtime/observatory/lib/src/elements/error_ref.dart
@@ -40,11 +40,11 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [new PreElement()..text = error.message];
+    children = <Element>[new PreElement()..text = error.message];
   }
 }
diff --git a/runtime/observatory/lib/src/elements/error_view.dart b/runtime/observatory/lib/src/elements/error_view.dart
index cfc4cd959..0d1d9b8 100644
--- a/runtime/observatory/lib/src/elements/error_view.dart
+++ b/runtime/observatory/lib/src/elements/error_view.dart
@@ -37,7 +37,7 @@
     assert(error != null);
     assert(notifications != null);
     ErrorViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ErrorViewElement>(e, queue: queue);
     e._error = error;
     e._notifications = notifications;
     return e;
@@ -54,25 +54,25 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavNotifyElement(_notifications, queue: _r.queue)
       ]),
       new DivElement()
         ..classes = ['content-centered']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()
             ..text = 'Error: ${_kindToString(_error.kind)}',
           new BRElement(),
           new DivElement()
             ..classes = ['well']
-            ..children = [new PreElement()..text = error.message]
+            ..children = <Element>[new PreElement()..text = error.message]
         ],
       new ViewFooterElement(queue: _r.queue)
     ];
diff --git a/runtime/observatory/lib/src/elements/eval_box.dart b/runtime/observatory/lib/src/elements/eval_box.dart
index 5096d75..0bf7b0c 100644
--- a/runtime/observatory/lib/src/elements/eval_box.dart
+++ b/runtime/observatory/lib/src/elements/eval_box.dart
@@ -44,7 +44,7 @@
     assert(multiline != null);
     assert(quickExpressions != null);
     EvalBoxElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<EvalBoxElement>(e, queue: queue);
     e._isolate = isolate;
     e._context = context;
     e._objects = objects;
@@ -66,16 +66,16 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _results.clear();
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['quicks']
         ..children = _quickExpressions
-            .map((q) => new ButtonElement()
+            .map<Element>((q) => new ButtonElement()
               ..text = q
               ..onClick.listen((_) {
                 _expression = q;
@@ -84,14 +84,14 @@
             .toList(),
       new DivElement()
         ..classes = ['heading']
-        ..children = [
+        ..children = <Element>[
           new FormElement()
             ..autocomplete = 'on'
-            ..children = [
+            ..children = <Element>[
               _multiline ? _createEvalTextArea() : _createEvalTextBox(),
               new SpanElement()
                 ..classes = ['buttons']
-                ..children = [
+                ..children = <Element>[
                   _createEvalButton(),
                   _createMultilineCheckbox(),
                   new SpanElement()..text = 'Multi-line'
@@ -100,11 +100,11 @@
         ],
       new TableElement()
         ..children = _results.reversed
-            .map((result) => new TableRowElement()
-              ..children = [
+            .map<Element>((result) => new TableRowElement()
+              ..children = <Element>[
                 new TableCellElement()
                   ..classes = ['historyExpr']
-                  ..children = [
+                  ..children = <Element>[
                     new ButtonElement()
                       ..text = result.expression
                       ..onClick.listen((_) {
@@ -114,7 +114,7 @@
                   ],
                 new TableCellElement()
                   ..classes = ['historyValue']
-                  ..children = [
+                  ..children = <Element>[
                     result.isPending
                         ? (new SpanElement()..text = 'Pending...')
                         : anyRef(_isolate, result.value, _objects,
@@ -122,7 +122,7 @@
                   ],
                 new TableCellElement()
                   ..classes = ['historyDelete']
-                  ..children = [
+                  ..children = <Element>[
                     new ButtonElement()
                       ..text = '✖ Remove'
                       ..onClick.listen((_) {
diff --git a/runtime/observatory/lib/src/elements/field_ref.dart b/runtime/observatory/lib/src/elements/field_ref.dart
index 3e6181b..ab4f170 100644
--- a/runtime/observatory/lib/src/elements/field_ref.dart
+++ b/runtime/observatory/lib/src/elements/field_ref.dart
@@ -33,7 +33,7 @@
     assert(field != null);
     assert(objects != null);
     FieldRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<FieldRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._field = field;
     e._objects = objects;
@@ -53,7 +53,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
@@ -73,13 +73,13 @@
       header += 'var ';
     }
     if (_field.declaredType.name == 'dynamic') {
-      children = [
+      children = <Element>[
         new SpanElement()..text = header,
         new AnchorElement(href: Uris.inspect(_isolate, object: _field))
           ..text = _field.name
       ];
     } else {
-      children = [
+      children = <Element>[
         new SpanElement()..text = header,
         new InstanceRefElement(_isolate, _field.declaredType, _objects,
             queue: _r.queue, expandable: _expandable),
diff --git a/runtime/observatory/lib/src/elements/field_view.dart b/runtime/observatory/lib/src/elements/field_view.dart
index be64960..27422a4 100644
--- a/runtime/observatory/lib/src/elements/field_view.dart
+++ b/runtime/observatory/lib/src/elements/field_view.dart
@@ -97,7 +97,7 @@
     assert(scripts != null);
     assert(objects != null);
     FieldViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<FieldViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -130,7 +130,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
@@ -152,11 +152,11 @@
     } else {
       header += _field.declaredType.name;
     }
-    children = [
+    children = <Element>[
       navBar(_createMenu()),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = '$header ${field.name}',
           new HRElement(),
           new ObjectCommonElement(_isolate, _field, _retainedSizes,
@@ -183,19 +183,18 @@
   }
 
   List<Element> _createMenu() {
-    final menu = [
+    final menu = <Element>[
       new NavTopMenuElement(queue: _r.queue),
       new NavVMMenuElement(_vm, _events, queue: _r.queue),
       new NavIsolateMenuElement(_isolate, _events, queue: _r.queue)
     ];
     if (_library != null) {
-      menu.add(new NavLibraryMenuElement(_isolate, _field.dartOwner,
-          queue: _r.queue));
+      menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue));
     } else if (_field.dartOwner is M.ClassRef) {
       menu.add(
           new NavClassMenuElement(_isolate, _field.dartOwner, queue: _r.queue));
     }
-    menu.addAll([
+    menu.addAll(<Element>[
       navMenu(_field.name),
       new NavRefreshElement(queue: _r.queue)
         ..onRefresh.listen((e) {
@@ -211,13 +210,13 @@
     final members = <Element>[
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'owner',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               _field.dartOwner == null
                   ? (new SpanElement()..text = '...')
                   : anyRef(_isolate, _field.dartOwner, _objects,
@@ -226,13 +225,13 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'script',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new SourceLinkElement(_isolate, field.location, _scripts,
                   queue: _r.queue)
             ]
@@ -244,7 +243,7 @@
         ..title = 'The types observed for this field at runtime. '
             'Fields that are observed to have a single type at runtime '
             'or to never be null may allow for additional optimization.'
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'observed types',
@@ -256,13 +255,13 @@
     if (_field.staticValue != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'static value',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               anyRef(_isolate, _field.staticValue, _objects, queue: _r.queue)
             ]
         ]);
diff --git a/runtime/observatory/lib/src/elements/flag_list.dart b/runtime/observatory/lib/src/elements/flag_list.dart
index cddef85..b0ca6e1 100644
--- a/runtime/observatory/lib/src/elements/flag_list.dart
+++ b/runtime/observatory/lib/src/elements/flag_list.dart
@@ -48,7 +48,7 @@
     assert(repository != null);
     assert(notifications != null);
     FlagListElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<FlagListElement>(e, queue: queue);
     e._vm = vm;
     e._events = events;
     e._repository = repository;
@@ -68,7 +68,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
@@ -97,8 +97,8 @@
       }
     }
 
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         navMenu('flags', link: Uris.flags()),
@@ -138,7 +138,7 @@
       new DivElement()
         ..classes =
             flag.modified ? ['flag', 'modified'] : ['flag', 'unmodified']
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['name']
             ..text = flag.name,
diff --git a/runtime/observatory/lib/src/elements/function_ref.dart b/runtime/observatory/lib/src/elements/function_ref.dart
index c769fde..54ace9e 100644
--- a/runtime/observatory/lib/src/elements/function_ref.dart
+++ b/runtime/observatory/lib/src/elements/function_ref.dart
@@ -39,7 +39,7 @@
     assert(function != null);
     assert(qualified != null);
     FunctionRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<FunctionRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._function = function;
     e._qualified = qualified;
@@ -57,7 +57,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     title = '';
     _r.disable(notify: true);
   }
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index c3edda8..57d775a 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -103,7 +103,7 @@
     assert(scripts != null);
     assert(objects != null);
     FunctionViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<FunctionViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -136,15 +136,15 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       navBar(_createMenu()),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Function ${_function.name}',
           new HRElement(),
           new ObjectCommonElement(_isolate, _function, _retainedSizes,
@@ -169,19 +169,19 @@
   }
 
   List<Element> _createMenu() {
-    final menu = [
+    final menu = <Element>[
       new NavTopMenuElement(queue: _r.queue),
       new NavVMMenuElement(_vm, _events, queue: _r.queue),
       new NavIsolateMenuElement(_isolate, _events, queue: _r.queue)
     ];
     if (_library != null) {
-      menu.add(new NavLibraryMenuElement(_isolate, _function.dartOwner,
+      menu.add(new NavLibraryMenuElement(_isolate, _library,
           queue: _r.queue));
     } else if (_function.dartOwner is M.ClassRef) {
       menu.add(new NavClassMenuElement(_isolate, _function.dartOwner,
           queue: _r.queue));
     }
-    menu.addAll([
+    menu.addAll(<Element>[
       navMenu(_function.name),
       new NavRefreshElement(queue: _r.queue)
         ..onRefresh.listen((e) {
@@ -197,13 +197,13 @@
     final members = <Element>[
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'kind',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new SpanElement()
                 ..text = '${_function.isStatic ? "static ": ""}'
                     '${_function.isConst ? "const ": ""}'
@@ -212,13 +212,13 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'owner',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               _function.dartOwner == null
                   ? (new SpanElement()..text = '...')
                   : anyRef(_isolate, _function.dartOwner, _objects,
@@ -229,13 +229,13 @@
     if (_function.field != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'script',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new FieldRefElement(_isolate, _function.field, _objects,
                   queue: _r.queue)
             ]
@@ -243,13 +243,13 @@
     }
     members.add(new DivElement()
       ..classes = ['memberItem']
-      ..children = [
+      ..children = <Element>[
         new DivElement()
           ..classes = ['memberName']
           ..text = 'script',
         new DivElement()
           ..classes = ['memberName']
-          ..children = [
+          ..children = <Element>[
             new SourceLinkElement(_isolate, _function.location, _scripts,
                 queue: _r.queue)
           ]
@@ -257,13 +257,13 @@
     if (_function.code != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'current code',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new CodeRefElement(_isolate, _function.code, queue: _r.queue)
             ]
         ]);
@@ -271,13 +271,13 @@
     if (_function.unoptimizedCode != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'unoptimized code',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new CodeRefElement(_isolate, _function.unoptimizedCode,
                   queue: _r.queue),
               new SpanElement()
@@ -295,13 +295,13 @@
     if (_function.icDataArray != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'ic data array',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new InstanceRefElement(_isolate, _function.icDataArray, _objects,
                   queue: _r.queue)
             ]
@@ -311,7 +311,7 @@
     members.addAll([
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'deoptimizations',
@@ -321,7 +321,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'optimizable',
@@ -331,7 +331,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'inlinable',
@@ -341,7 +341,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'intrinsic',
@@ -351,7 +351,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'recognized',
@@ -361,7 +361,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'native',
@@ -371,7 +371,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'vm name',
diff --git a/runtime/observatory/lib/src/elements/general_error.dart b/runtime/observatory/lib/src/elements/general_error.dart
index f902da8..152df99 100644
--- a/runtime/observatory/lib/src/elements/general_error.dart
+++ b/runtime/observatory/lib/src/elements/general_error.dart
@@ -33,7 +33,7 @@
     assert(notifications != null);
     assert(message != null);
     GeneralErrorElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<GeneralErrorElement>(e, queue: queue);
     e._message = message;
     e._notifications = notifications;
     return e;
@@ -50,19 +50,19 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavNotifyElement(_notifications, queue: _r.queue)
       ]),
       new DivElement()
         ..classes = ['content-centered']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()..text = 'Error',
           new BRElement(),
           new DivElement()
diff --git a/runtime/observatory/lib/src/elements/heap_map.dart b/runtime/observatory/lib/src/elements/heap_map.dart
index b2f7f81..6db1ce8 100644
--- a/runtime/observatory/lib/src/elements/heap_map.dart
+++ b/runtime/observatory/lib/src/elements/heap_map.dart
@@ -49,7 +49,7 @@
     assert(events != null);
     assert(notifications != null);
     HeapMapElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<HeapMapElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -70,7 +70,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   CanvasElement _canvas;
@@ -102,8 +102,8 @@
     // Set hover text to describe the object under the cursor.
     _canvas.title = _status;
 
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -120,13 +120,13 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = _status,
           new HRElement(),
         ],
       new DivElement()
         ..classes = ['flex-row']
-        ..children = [_canvas]
+        ..children = <Element>[_canvas]
     ];
   }
 
@@ -169,12 +169,12 @@
     return [rng.nextInt(128), rng.nextInt(128), rng.nextInt(128), 255];
   }
 
-  String _classNameAt(Point<int> point) {
+  String _classNameAt(Point<num> point) {
     var color = new PixelReference(_fragmentationData, point).color;
     return _classIdToName[_colorToClassId[_packColor(color)]];
   }
 
-  ObjectInfo _objectAt(Point<int> point) {
+  ObjectInfo _objectAt(Point<num> point) {
     if (_fragmentation == null || _canvas == null) {
       return null;
     }
@@ -302,13 +302,13 @@
   var _dataIndex;
   static const NUM_COLOR_COMPONENTS = 4;
 
-  PixelReference(ImageData data, Point<int> point)
+  PixelReference(ImageData data, Point<num> point)
       : _data = data,
         _dataIndex = (point.y * data.width + point.x) * NUM_COLOR_COMPONENTS;
 
   PixelReference._fromDataIndex(this._data, this._dataIndex);
 
-  Point<int> get point => new Point(index % _data.width, index ~/ _data.width);
+  Point<num> get point => new Point(index % _data.width, index ~/ _data.width);
 
   void set color(Iterable<int> color) {
     _data.data.setRange(_dataIndex, _dataIndex + NUM_COLOR_COMPONENTS, color);
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index a6b0953..3e6e455 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -80,7 +80,7 @@
     assert(snapshots != null);
     assert(objects != null);
     HeapSnapshotElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<HeapSnapshotElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -103,12 +103,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    final content = [
-      navBar([
+    final content = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -165,10 +165,10 @@
     return [
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['statusBox', 'shadow', 'center']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['statusMessage']
                 ..text = message,
@@ -191,13 +191,13 @@
     var report = <HtmlElement>[
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Refreshed ',
@@ -207,7 +207,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Objects ',
@@ -217,7 +217,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'References ',
@@ -227,7 +227,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Size ',
@@ -237,7 +237,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Roots ',
@@ -247,7 +247,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Analysis ',
@@ -329,7 +329,7 @@
   static HtmlElement _createDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['size']
           ..title = 'retained size',
@@ -347,7 +347,7 @@
   static HtmlElement _createMergedDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['size']
           ..title = 'retained size',
@@ -365,7 +365,7 @@
   static HtmlElement _createGroup(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['size']
           ..title = 'shallow size',
@@ -383,7 +383,7 @@
   static HtmlElement _createOwnershipClass(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['size']
           ..title = 'owned size',
@@ -430,8 +430,8 @@
     return const [];
   }
 
-  void _updateDominator(
-      HtmlElement element, M.HeapSnapshotDominatorNode node, int depth) {
+  void _updateDominator(HtmlElement element, nodeDynamic, int depth) {
+    M.HeapSnapshotDominatorNode node = nodeDynamic;
     element.children[0].text = Utils.formatSize(node.retainedSize);
     _updateLines(element.children[1].children, depth);
     if (_getChildrenDominator(node).isNotEmpty) {
@@ -448,14 +448,14 @@
     if (node.isStack) {
       wrapper
         ..text = ''
-        ..children = [
+        ..children = <Element>[
           new AnchorElement(href: Uris.debugger(isolate))..text = 'stack frames'
         ];
     } else {
       node.object.then((object) {
         wrapper
           ..text = ''
-          ..children = [
+          ..children = <Element>[
             anyRef(_isolate, object, _objects,
                 queue: _r.queue, expandable: false)
           ];
@@ -463,8 +463,8 @@
     }
   }
 
-  void _updateMergedDominator(
-      HtmlElement element, M.HeapSnapshotMergedDominatorNode node, int depth) {
+  void _updateMergedDominator(HtmlElement element, nodeDynamic, int depth) {
+    M.HeapSnapshotMergedDominatorNode node = nodeDynamic;
     element.children[0].text = Utils.formatSize(node.retainedSize);
     _updateLines(element.children[1].children, depth);
     if (_getChildrenMergedDominator(node).isNotEmpty) {
@@ -481,14 +481,14 @@
     if (node.isStack) {
       wrapper
         ..text = ''
-        ..children = [
+        ..children = <Element>[
           new AnchorElement(href: Uris.debugger(isolate))..text = 'stack frames'
         ];
     } else {
       node.klass.then((klass) {
         wrapper
           ..text = ''
-          ..children = [
+          ..children = <Element>[
             new SpanElement()..text = '${node.instanceCount} instances of ',
             anyRef(_isolate, klass, _objects,
                 queue: _r.queue, expandable: false)
@@ -535,12 +535,12 @@
       if (item is M.HeapSnapshotClassInbound) {
         element.children[3].text =
             '${item.count} references from instances of ';
-        element.children[4].children = [
+        element.children[4].children = <Element>[
           new ClassRefElement(_isolate, item.source, queue: _r.queue)
         ];
       } else if (item is M.HeapSnapshotClassOutbound) {
         element.children[3]..text = '${item.count} references to instances of ';
-        element.children[4].children = [
+        element.children[4].children = <Element>[
           new ClassRefElement(_isolate, item.target, queue: _r.queue)
         ];
       }
@@ -554,7 +554,7 @@
         Utils.formatPercentNormalized(item.size * 1.0 / _snapshot.size);
     element.children[2] = new SpanElement()
       ..classes = ['name']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = ' instances of ',
         new ClassRefElement(_isolate, item.clazz, queue: _r.queue)
           ..classes = ['name']
diff --git a/runtime/observatory/lib/src/elements/helpers/nav_bar.dart b/runtime/observatory/lib/src/elements/helpers/nav_bar.dart
index f15acfa..050041b 100644
--- a/runtime/observatory/lib/src/elements/helpers/nav_bar.dart
+++ b/runtime/observatory/lib/src/elements/helpers/nav_bar.dart
@@ -8,7 +8,7 @@
   assert(content != null);
   return document.createElement('nav')
     ..classes = ['nav-bar']
-    ..children = [
+    ..children = <Element>[
       new UListElement()..children = content,
     ];
 }
diff --git a/runtime/observatory/lib/src/elements/helpers/nav_menu.dart b/runtime/observatory/lib/src/elements/helpers/nav_menu.dart
index a23f109..02cf8ef 100644
--- a/runtime/observatory/lib/src/elements/helpers/nav_menu.dart
+++ b/runtime/observatory/lib/src/elements/helpers/nav_menu.dart
@@ -9,10 +9,10 @@
   assert(content != null);
   return new LIElement()
     ..classes = ['nav-menu']
-    ..children = [
+    ..children = <Element>[
       new SpanElement()
         ..classes = ['nav-menu_label']
-        ..children = [
+        ..children = <Element>[
           new AnchorElement(href: link)..text = label,
           new UListElement()..children = content
         ]
diff --git a/runtime/observatory/lib/src/elements/icdata_ref.dart b/runtime/observatory/lib/src/elements/icdata_ref.dart
index 613118c..5a4f4d7 100644
--- a/runtime/observatory/lib/src/elements/icdata_ref.dart
+++ b/runtime/observatory/lib/src/elements/icdata_ref.dart
@@ -27,7 +27,7 @@
     assert(isolate != null);
     assert(icdata != null);
     ICDataRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ICDataRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._icdata = icdata;
     return e;
@@ -45,13 +45,13 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _icdata))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'ICData',
diff --git a/runtime/observatory/lib/src/elements/icdata_view.dart b/runtime/observatory/lib/src/elements/icdata_view.dart
index 58e7bca..3729a73 100644
--- a/runtime/observatory/lib/src/elements/icdata_view.dart
+++ b/runtime/observatory/lib/src/elements/icdata_view.dart
@@ -78,7 +78,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     ICDataViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ICDataViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -105,12 +105,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -125,7 +125,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'ICData',
           new HRElement(),
           new ObjectCommonElement(_isolate, _icdata, _retainedSizes,
@@ -133,10 +133,10 @@
               queue: _r.queue),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'selector',
@@ -146,13 +146,13 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'owner',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       _icdata.dartOwner == null
                           ? (new SpanElement()..text = '<none>')
                           : anyRef(_isolate, _icdata.dartOwner, _objects,
@@ -161,13 +161,13 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'argumentsDescriptor',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       _icdata.argumentsDescriptor == null
                           ? (new SpanElement()..text = '<none>')
                           : anyRef(
@@ -177,13 +177,13 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'entries',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       _icdata.entries == null
                           ? (new SpanElement()..text = '<none>')
                           : anyRef(_isolate, _icdata.entries, _objects,
diff --git a/runtime/observatory/lib/src/elements/inbound_references.dart b/runtime/observatory/lib/src/elements/inbound_references.dart
index f58724f..bfd9d29 100644
--- a/runtime/observatory/lib/src/elements/inbound_references.dart
+++ b/runtime/observatory/lib/src/elements/inbound_references.dart
@@ -38,7 +38,7 @@
     assert(references != null);
     assert(objects != null);
     InboundReferencesElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<InboundReferencesElement>(e, queue: queue);
     e._isolate = isolate;
     e._object = object;
     e._references = references;
@@ -57,7 +57,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
@@ -73,7 +73,7 @@
               e.control.disabled = false;
             }
           });
-    children = [curlyBlock];
+    children = <Element>[curlyBlock];
     _r.waitFor([curlyBlock.onRendered.first]);
   }
 
@@ -86,7 +86,7 @@
     if (_inbounds == null) {
       return const [];
     }
-    return _inbounds.elements.map(_createItem).toList();
+    return _inbounds.elements.map<Element>(_createItem).toList();
   }
 
   Element _createItem(M.InboundReference reference) {
diff --git a/runtime/observatory/lib/src/elements/instance_ref.dart b/runtime/observatory/lib/src/elements/instance_ref.dart
index 748acbe..9130e69 100644
--- a/runtime/observatory/lib/src/elements/instance_ref.dart
+++ b/runtime/observatory/lib/src/elements/instance_ref.dart
@@ -38,7 +38,7 @@
     assert(instance != null);
     assert(objects != null);
     InstanceRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<InstanceRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._instance = instance;
     e._objects = objects;
@@ -57,7 +57,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
@@ -68,7 +68,7 @@
       content.addAll([
         new SpanElement()..text = ' ',
         new CurlyBlockElement(expanded: _expanded, queue: _r.queue)
-          ..content = [
+          ..content = <Element>[
             new DivElement()
               ..classes = ['indent']
               ..children = _createValue()
@@ -136,7 +136,7 @@
       case M.InstanceKind.closure:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
-            ..children = [
+            ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
                 ..text = 'Closure',
@@ -146,7 +146,7 @@
       case M.InstanceKind.regExp:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
-            ..children = [
+            ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
                 ..text = _instance.clazz.name,
@@ -156,7 +156,7 @@
       case M.InstanceKind.stackTrace:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
-            ..children = [
+            ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
                 ..text = _instance.clazz.name,
@@ -186,7 +186,7 @@
       case M.InstanceKind.float64x2List:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
-            ..children = [
+            ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
                 ..text = _instance.clazz.name,
@@ -245,24 +245,30 @@
     }
     switch (_instance.kind) {
       case M.InstanceKind.closure:
-        return [
-          new DivElement()
-            ..children = [
-              new SpanElement()..text = 'function = ',
-              anyRef(_isolate, _loadedInstance.closureFunction, _objects,
-                  queue: _r.queue)
-            ],
-          new DivElement()
-            ..children = [
-              new SpanElement()..text = 'context = ',
-              anyRef(_isolate, _loadedInstance.closureContext, _objects,
-                  queue: _r.queue)
-            ],
-        ];
+        {
+          var members = <Element>[];
+          if (_loadedInstance.closureFunction != null) {
+            members.add(new DivElement()
+              ..children = <Element>[
+                new SpanElement()..text = 'function = ',
+                anyRef(_isolate, _loadedInstance.closureFunction, _objects,
+                    queue: _r.queue)
+              ]);
+          }
+          if (_loadedInstance.closureContext != null) {
+            members.add(new DivElement()
+              ..children = <Element>[
+                new SpanElement()..text = 'context = ',
+                anyRef(_isolate, _loadedInstance.closureContext, _objects,
+                    queue: _r.queue)
+              ]);
+          }
+          return members;
+        }
       case M.InstanceKind.plainInstance:
         return _loadedInstance.fields
-            .map((f) => new DivElement()
-              ..children = [
+            .map<Element>((f) => new DivElement()
+              ..children = <Element>[
                 new FieldRefElement(_isolate, f.decl, _objects,
                     queue: _r.queue),
                 new SpanElement()..text = ' = ',
@@ -273,7 +279,7 @@
         var index = 0;
         return _loadedInstance.elements
             .map<Element>((element) => new DivElement()
-              ..children = [
+              ..children = <Element>[
                 new SpanElement()..text = '[ ${index++} ] : ',
                 anyRef(_isolate, element, _objects, queue: _r.queue)
               ])
@@ -282,7 +288,7 @@
       case M.InstanceKind.map:
         return _loadedInstance.associations
             .map<Element>((association) => new DivElement()
-              ..children = [
+              ..children = <Element>[
                 new SpanElement()..text = '[ ',
                 anyRef(_isolate, association.key, _objects, queue: _r.queue),
                 new SpanElement()..text = ' ] : ',
diff --git a/runtime/observatory/lib/src/elements/instance_view.dart b/runtime/observatory/lib/src/elements/instance_view.dart
index 85df20b..174af31 100644
--- a/runtime/observatory/lib/src/elements/instance_view.dart
+++ b/runtime/observatory/lib/src/elements/instance_view.dart
@@ -118,7 +118,7 @@
     assert(breakpoints != null);
     assert(functions != null);
     InstanceViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<InstanceViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -151,11 +151,11 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    final content = [
+    final content = <Element>[
       new HeadingElement.h2()
         ..text = M.isAbstractType(_instance.kind)
             ? 'type ${_instance.name}'
@@ -181,7 +181,7 @@
       ]);
     }
     content.addAll([new HRElement(), new ViewFooterElement(queue: _r.queue)]);
-    children = [
+    children = <Element>[
       navBar(_createMenu()),
       new DivElement()
         ..classes = ['content-centered-big']
@@ -190,7 +190,7 @@
   }
 
   List<Element> _createMenu() {
-    final menu = [
+    final menu = <Element>[
       new NavTopMenuElement(queue: _r.queue),
       new NavVMMenuElement(_vm, _events, queue: _r.queue),
       new NavIsolateMenuElement(_isolate, _events, queue: _r.queue)
@@ -198,7 +198,7 @@
     if (_library != null) {
       menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue));
     }
-    menu.addAll([
+    menu.addAll(<Element>[
       new NavClassMenuElement(_isolate, _instance.clazz, queue: _r.queue),
       navMenu('instance'),
       new NavRefreshElement(queue: _r.queue)
@@ -216,7 +216,7 @@
     if (_instance.valueAsString != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = _instance.kind == M.InstanceKind.string
@@ -233,13 +233,13 @@
     if (_instance.typeClass != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'type class',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new ClassRefElement(_isolate, _instance.typeClass,
                   queue: _r.queue)
             ]
@@ -248,7 +248,7 @@
     if (_typeArguments != null && _typeArguments.types.isNotEmpty) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'type arguments',
@@ -267,13 +267,13 @@
     if (_instance.parameterizedClass != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'parameterized class',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new ClassRefElement(_isolate, _instance.parameterizedClass,
                   queue: _r.queue)
             ]
@@ -282,7 +282,7 @@
     if (_instance.parameterIndex != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'parameter index',
@@ -294,13 +294,13 @@
     if (_instance.targetType != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'target type',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new InstanceRefElement(_isolate, _instance.targetType, _objects,
                   queue: _r.queue)
             ]
@@ -309,13 +309,13 @@
     if (_instance.bound != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'bound',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new InstanceRefElement(_isolate, _instance.bound, _objects,
                   queue: _r.queue)
             ]
@@ -324,13 +324,13 @@
     if (_instance.closureFunction != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'closure function',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new FunctionRefElement(_isolate, _instance.closureFunction,
                   queue: _r.queue)
             ]
@@ -339,13 +339,13 @@
     if (_instance.closureContext != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'closure context',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new ContextRefElement(
                   _isolate, _instance.closureContext, _objects,
                   queue: _r.queue)
@@ -356,13 +356,13 @@
       ButtonElement btn;
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'closure breakpoint',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               btn = new ButtonElement()
                 ..text = _instance.activationBreakpoint == null
                     ? 'break on activation'
@@ -379,23 +379,23 @@
       int i = 0;
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'native fields (${_instance.nativeFields.length})',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(
                   expanded: _instance.nativeFields.length <= 100,
                   queue: _r.queue)
-                ..content = [
+                ..content = <Element>[
                   new DivElement()
                     ..classes = ['memberList']
                     ..children = _instance.nativeFields
-                        .map((f) => new DivElement()
+                        .map<Element>((f) => new DivElement()
                           ..classes = ['memberItem']
-                          ..children = [
+                          ..children = <Element>[
                             new DivElement()
                               ..classes = ['memberName']
                               ..text = '[ ${i++} ]',
@@ -413,31 +413,31 @@
       final fields = _instance.fields.toList();
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'fields (${fields.length})',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(
                   expanded: fields.length <= 100, queue: _r.queue)
-                ..content = [
+                ..content = <Element>[
                   new DivElement()
                     ..classes = ['memberList']
                     ..children = fields
-                        .map((f) => new DivElement()
+                        .map<Element>((f) => new DivElement()
                           ..classes = ['memberItem']
-                          ..children = [
+                          ..children = <Element>[
                             new DivElement()
                               ..classes = ['memberName']
-                              ..children = [
+                              ..children = <Element>[
                                 new FieldRefElement(_isolate, f.decl, _objects,
                                     queue: _r.queue)
                               ],
                             new DivElement()
                               ..classes = ['memberValue']
-                              ..children = [
+                              ..children = <Element>[
                                 new SpanElement()..text = ' = ',
                                 anyRef(_isolate, f.value, _objects,
                                     queue: _r.queue)
@@ -454,28 +454,28 @@
       int i = 0;
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'elements (${_instance.length})',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(
                   expanded: elements.length <= 100, queue: _r.queue)
-                ..content = [
+                ..content = <Element>[
                   new DivElement()
                     ..classes = ['memberList']
                     ..children = elements
-                        .map((element) => new DivElement()
+                        .map<Element>((element) => new DivElement()
                           ..classes = ['memberItem']
-                          ..children = [
+                          ..children = <Element>[
                             new DivElement()
                               ..classes = ['memberName']
                               ..text = '[ ${i++} ]',
                             new DivElement()
                               ..classes = ['memberValue']
-                              ..children = [
+                              ..children = <Element>[
                                 anyRef(_isolate, element, _objects,
                                     queue: _r.queue)
                               ]
@@ -487,7 +487,7 @@
       if (_instance.length != elements.length) {
         members.add(new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = '...',
@@ -502,25 +502,25 @@
       final associations = _instance.associations.toList();
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'associations (${_instance.length})',
           new DivElement()
             ..classes = ['memberName']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(
                   expanded: associations.length <= 100, queue: _r.queue)
-                ..content = [
+                ..content = <Element>[
                   new DivElement()
                     ..classes = ['memberList']
                     ..children = associations
-                        .map((a) => new DivElement()
+                        .map<Element>((a) => new DivElement()
                           ..classes = ['memberItem']
-                          ..children = [
+                          ..children = <Element>[
                             new DivElement()
                               ..classes = ['memberName']
-                              ..children = [
+                              ..children = <Element>[
                                 new SpanElement()..text = '[ ',
                                 anyRef(_isolate, a.key, _objects,
                                     queue: _r.queue),
@@ -528,7 +528,7 @@
                               ],
                             new DivElement()
                               ..classes = ['memberValue']
-                              ..children = [
+                              ..children = <Element>[
                                 anyRef(_isolate, a.value, _objects,
                                     queue: _r.queue)
                               ]
@@ -540,7 +540,7 @@
       if (_instance.length != associations.length) {
         members.add(new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = '...',
@@ -557,22 +557,22 @@
       int i = 0;
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'elements (${_instance.length})',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               new CurlyBlockElement(
                   expanded: typedElements.length <= 100, queue: _r.queue)
-                ..content = [
+                ..content = <Element>[
                   new DivElement()
                     ..classes = ['memberList']
                     ..children = typedElements
-                        .map((e) => new DivElement()
+                        .map<Element>((e) => new DivElement()
                           ..classes = ['memberItem']
-                          ..children = [
+                          ..children = <Element>[
                             new DivElement()
                               ..classes = ['memberName']
                               ..text = '[ ${i++} ]',
@@ -587,7 +587,7 @@
       if (_instance.length != typedElements.length) {
         members.add(new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = '...',
@@ -603,19 +603,19 @@
       members.addAll([
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'pattern',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 anyRef(_isolate, _instance.pattern, _objects, queue: _r.queue)
               ]
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'isCaseSensitive',
@@ -625,7 +625,7 @@
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'isMultiLine',
@@ -635,39 +635,39 @@
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'oneByteFunction',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new FunctionRefElement(_isolate, _instance.oneByteFunction,
                     queue: _r.queue)
               ]
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'twoByteFunction',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new FunctionRefElement(_isolate, _instance.twoByteFunction,
                     queue: _r.queue)
               ]
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'externalOneByteFunction',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new FunctionRefElement(
                     _isolate, _instance.externalOneByteFunction,
                     queue: _r.queue)
@@ -675,13 +675,13 @@
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'externalTwoByteFunction',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new FunctionRefElement(
                     _isolate, _instance.externalTwoByteFunction,
                     queue: _r.queue)
@@ -689,13 +689,13 @@
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'oneByteBytecode',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new InstanceRefElement(
                     _isolate, _instance.oneByteBytecode, _objects,
                     queue: _r.queue)
@@ -703,13 +703,13 @@
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'twoByteBytecode',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new InstanceRefElement(
                     _isolate, _instance.twoByteBytecode, _objects,
                     queue: _r.queue)
@@ -721,13 +721,13 @@
     if (_instance.kind == M.InstanceKind.mirrorReference) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'referent',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = [
+            ..children = <Element>[
               anyRef(_isolate, _instance.referent, _objects, queue: _r.queue)
             ]
         ]);
@@ -736,26 +736,26 @@
       members.addAll([
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'key',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new InstanceRefElement(_isolate, _instance.key, _objects,
                     queue: _r.queue),
               ]
           ],
         new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = 'value',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 new InstanceRefElement(_isolate, _instance.value, _objects,
                     queue: _r.queue),
               ]
diff --git a/runtime/observatory/lib/src/elements/isolate/counter_chart.dart b/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
index b3917ec..37f8098 100644
--- a/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
+++ b/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
@@ -24,7 +24,7 @@
   factory IsolateCounterChartElement(Map counters, {RenderingQueue queue}) {
     assert(counters != null);
     IsolateCounterChartElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateCounterChartElement>(e, queue: queue);
     e._counters = counters;
     return e;
   }
@@ -41,7 +41,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _subscription.cancel();
   }
@@ -58,7 +58,7 @@
     ];
     final areaHost = new DivElement()..classes = ['host'];
     final legendHost = new DivElement()..classes = ['legend'];
-    children = [areaHost, legendHost];
+    children = <Element>[areaHost, legendHost];
     final rect = areaHost.getBoundingClientRect();
     final minSize = new Rect.size(rect.width, rect.height);
     final config = new ChartConfig(_series, const [0])
diff --git a/runtime/observatory/lib/src/elements/isolate/location.dart b/runtime/observatory/lib/src/elements/isolate/location.dart
index 6f565ce..161917e 100644
--- a/runtime/observatory/lib/src/elements/isolate/location.dart
+++ b/runtime/observatory/lib/src/elements/isolate/location.dart
@@ -31,7 +31,7 @@
     assert(events != null);
     assert(scripts != null);
     IsolateLocationElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateLocationElement>(e, queue: queue);
     e._isolate = isolate;
     e._events = events;
     e._scripts = scripts;
@@ -51,7 +51,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _debugSubscription.cancel();
     _isolateSubscription.cancel();
@@ -60,10 +60,10 @@
   void render() {
     switch (_isolate.status) {
       case M.IsolateStatus.loading:
-        children = [new SpanElement()..text = 'not yet runnable'];
+        children = <Element>[new SpanElement()..text = 'not yet runnable'];
         break;
       case M.IsolateStatus.running:
-        children = [
+        children = <Element>[
           new SpanElement()..text = 'at ',
           new FunctionRefElement(
               _isolate, M.topFrame(_isolate.pauseEvent).function,
@@ -77,11 +77,11 @@
         break;
       case M.IsolateStatus.paused:
         if (_isolate.pauseEvent is M.PauseStartEvent) {
-          children = [new SpanElement()..text = 'at isolate start'];
+          children = <Element>[new SpanElement()..text = 'at isolate start'];
         } else if (_isolate.pauseEvent is M.PauseExitEvent) {
-          children = [new SpanElement()..text = 'at isolate exit'];
+          children = <Element>[new SpanElement()..text = 'at isolate exit'];
         } else if (_isolate.pauseEvent is M.NoneEvent) {
-          children = [new SpanElement()..text = 'not yet runnable'];
+          children = <Element>[new SpanElement()..text = 'not yet runnable'];
         } else {
           final content = <Element>[];
           if (_isolate.pauseEvent is M.PauseBreakpointEvent) {
diff --git a/runtime/observatory/lib/src/elements/isolate/run_state.dart b/runtime/observatory/lib/src/elements/isolate/run_state.dart
index 0919cee..6dfc005 100644
--- a/runtime/observatory/lib/src/elements/isolate/run_state.dart
+++ b/runtime/observatory/lib/src/elements/isolate/run_state.dart
@@ -25,7 +25,7 @@
     assert(isolate != null);
     assert(events != null);
     IsolateRunStateElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateRunStateElement>(e, queue: queue);
     e._isolate = isolate;
     e._events = events;
     return e;
@@ -44,7 +44,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _debugSubscription.cancel();
     _isolateSubscription.cancel();
@@ -53,16 +53,16 @@
   void render() {
     switch (_isolate.status) {
       case M.IsolateStatus.loading:
-        children = [new SpanElement()..text = 'loading... '];
+        children = <Element>[new SpanElement()..text = 'loading... '];
         break;
       case M.IsolateStatus.running:
-        children = [new SpanElement()..text = 'running '];
+        children = <Element>[new SpanElement()..text = 'running '];
         break;
       case M.IsolateStatus.idle:
-        children = [new SpanElement()..text = 'idle '];
+        children = <Element>[new SpanElement()..text = 'idle '];
         break;
       case M.IsolateStatus.paused:
-        children = [
+        children = <Element>[
           new SpanElement()
             ..title = '${_isolate.pauseEvent.timestamp}'
             ..text = 'paused '
diff --git a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
index e13e8ad..be163f2 100644
--- a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
+++ b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
@@ -31,7 +31,7 @@
     assert(isolate != null);
     assert(events != null);
     IsolateSharedSummaryElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateSharedSummaryElement>(e, queue: queue);
     e._isolate = isolate;
     e._events = events;
     return e;
@@ -49,7 +49,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _isolateSubscription.cancel();
   }
@@ -59,16 +59,16 @@
     final newHeapCapacity = Utils.formatSize(_isolate.newSpace.capacity);
     final oldHeapUsed = Utils.formatSize(_isolate.oldSpace.used);
     final oldHeapCapacity = Utils.formatSize(_isolate.oldSpace.capacity);
-    final content = [
+    final content = <Element>[
       new DivElement()
         ..classes = ['menu']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'new heap',
@@ -78,7 +78,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'old heap',
@@ -89,63 +89,63 @@
             ],
           new BRElement(),
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.debugger(_isolate))..text = 'debug'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.classTree(_isolate))
                 ..text = 'class hierarchy'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.cpuProfiler(_isolate))
                 ..text = 'cpu profile'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.cpuProfilerTable(_isolate))
                 ..text = 'cpu profile (table)'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.allocationProfiler(_isolate))
                 ..text = 'allocation profile'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.heapSnapshot(_isolate))
                 ..text = 'heap snapshot'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.heapMap(_isolate))..text = 'heap map'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.metrics(_isolate))..text = 'metrics'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.persistentHandles(_isolate))
                 ..text = 'persistent handles'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.ports(_isolate))..text = 'ports'
             ],
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new SpanElement()..text = 'see ',
               new AnchorElement(href: Uris.logging(_isolate))..text = 'logging'
             ]
@@ -153,7 +153,7 @@
       new IsolateCounterChartElement(_isolate.counters, queue: _r.queue)
     ];
     if (_isolate.error != null) {
-      children = [
+      children = <Element>[
         new PreElement()
           ..classes = ['errorBox']
           ..text = _isolate.error.message,
@@ -162,7 +162,7 @@
           ..children = content
       ];
     } else {
-      children = [
+      children = <Element>[
         new DivElement()
           ..classes = ['summary']
           ..children = content
diff --git a/runtime/observatory/lib/src/elements/isolate/summary.dart b/runtime/observatory/lib/src/elements/isolate/summary.dart
index 0943996..434e1fa 100644
--- a/runtime/observatory/lib/src/elements/isolate/summary.dart
+++ b/runtime/observatory/lib/src/elements/isolate/summary.dart
@@ -43,7 +43,7 @@
     assert(events != null);
     assert(scripts != null);
     IsolateSummaryElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateSummaryElement>(e, queue: queue);
     e._isolate = isolate;
     e._isolates = isolates;
     e._events = events;
@@ -63,30 +63,30 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
     if (_loadedIsolate == null) {
-      children = [
+      children = <Element>[
         new SpanElement()..text = 'loading ',
         new IsolateRefElement(_isolate, _events, queue: _r.queue)
       ];
     } else {
-      children = [
+      children = <Element>[
         new DivElement()
           ..classes = ['flex-row']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['isolate-ref-container']
-              ..children = [
+              ..children = <Element>[
                 new IsolateRefElement(_isolate, _events, queue: _r.queue)
               ],
             new DivElement()..style.flex = '1',
             new DivElement()
               ..classes = ['flex-row', 'isolate-state-container']
-              ..children = [
+              ..children = <Element>[
                 new IsolateRunStateElement(_isolate, _events, queue: _r.queue),
                 new IsolateLocationElement(_isolate, _events, _scripts,
                     queue: _r.queue),
diff --git a/runtime/observatory/lib/src/elements/isolate_reconnect.dart b/runtime/observatory/lib/src/elements/isolate_reconnect.dart
index 49032c8..0820d41 100644
--- a/runtime/observatory/lib/src/elements/isolate_reconnect.dart
+++ b/runtime/observatory/lib/src/elements/isolate_reconnect.dart
@@ -48,7 +48,7 @@
     assert(uri != null);
     assert(notifications != null);
     IsolateReconnectElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateReconnectElement>(e, queue: queue);
     e._vm = vm;
     e._events = events;
     e._missing = missing;
@@ -72,32 +72,32 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _subscription.cancel();
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavNotifyElement(_notifications, queue: _r.queue)
       ]),
       new DivElement()
         ..classes = ['content-centered']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()..text = 'Isolate $_missing no longer exists',
           new HRElement(),
           new BRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = (_vm.isolates.map((isolate) {
-              final query = new Map.from(_uri.queryParameters);
+            ..children = (_vm.isolates.map<Element>((isolate) {
+              final query = new Map<String, dynamic>.from(_uri.queryParameters);
               query['isolateId'] = isolate.id;
               final href = new Uri(path: _uri.path, queryParameters: query);
               return new DivElement()
                 ..classes = ['memberItem', 'doubleSpaced']
-                ..children = [
+                ..children = <Element>[
                   new SpanElement()..text = 'Continue in ',
                   new AnchorElement(href: '#$href')
                     ..classes = ['isolate-link']
@@ -106,7 +106,7 @@
             }).toList()
               ..add(new DivElement()
                 ..classes = ['memberItem', 'doubleSpaced']
-                ..children = [
+                ..children = <Element>[
                   new SpanElement()..text = 'Go to ',
                   new AnchorElement(href: Uris.vm())..text = 'isolates summary',
                 ]))
diff --git a/runtime/observatory/lib/src/elements/isolate_ref.dart b/runtime/observatory/lib/src/elements/isolate_ref.dart
index 3b32c18..49a2182 100644
--- a/runtime/observatory/lib/src/elements/isolate_ref.dart
+++ b/runtime/observatory/lib/src/elements/isolate_ref.dart
@@ -29,7 +29,7 @@
     assert(isolate != null);
     assert(events != null);
     IsolateRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._events = events;
     return e;
@@ -52,13 +52,13 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _updatesSubscription.cancel();
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(isolate))
         ..text = 'Isolate ${isolate.number} (${isolate.name})'
         ..classes = ['isolate-ref']
diff --git a/runtime/observatory/lib/src/elements/isolate_view.dart b/runtime/observatory/lib/src/elements/isolate_view.dart
index e199135..01f5b60 100644
--- a/runtime/observatory/lib/src/elements/isolate_view.dart
+++ b/runtime/observatory/lib/src/elements/isolate_view.dart
@@ -96,7 +96,7 @@
     assert(eval != null);
     assert(libraries != null);
     IsolateViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<IsolateViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -129,7 +129,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _subscription.cancel();
   }
 
@@ -137,8 +137,8 @@
     final uptime = new DateTime.now().difference(_isolate.startTime);
     final libraries = _isolate.libraries.toList();
     final List<M.Thread> threads = _isolate.threads;
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -159,15 +159,15 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Isolate ${_isolate.name}',
           new BRElement(),
           new DivElement()
             ..classes = ['flex-row']
-            ..children = [
+            ..children = <Element>[
               new DivElement()..style.flex = '1',
               new DivElement()
-                ..children = [
+                ..children = <Element>[
                   new IsolateRunStateElement(_isolate, _events,
                       queue: _r.queue),
                   new IsolateLocationElement(_isolate, _events, _scripts,
@@ -195,10 +195,10 @@
           new HRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'started at',
@@ -208,7 +208,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'uptime',
@@ -218,13 +218,13 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'root library',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       _isolate.rootLibrary == null
                           ? (new SpanElement()..text = 'loading...')
                           : new LibraryRefElement(
@@ -241,7 +241,7 @@
                           ..text = 'entry',
                         new DivElement()
                           ..classes = ['memberValue']
-                          ..children = [
+                          ..children = <Element>[
                             new FunctionRefElement(_isolate, _isolate.entry,
                                 queue: _r.queue)
                           ]
@@ -249,7 +249,7 @@
                     : const [],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'isolate id',
@@ -259,7 +259,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'service protocol extensions',
@@ -269,7 +269,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'allocated zone handle count',
@@ -279,7 +279,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'allocated scoped handle count',
@@ -289,20 +289,20 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'object store',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       new AnchorElement(href: Uris.objectStore(_isolate))
                         ..text = 'object store'
                     ]
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'zone capacity high watermark'
@@ -316,17 +316,17 @@
               new BRElement(),
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'libraries (${libraries.length})',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       new CurlyBlockElement(queue: _r.queue)
                         ..content = libraries
-                            .map((l) => new DivElement()
-                              ..children = [
+                            .map<Element>((l) => new DivElement()
+                              ..children = <Element>[
                                 new LibraryRefElement(_isolate, l,
                                     queue: _r.queue)
                               ])
@@ -335,15 +335,15 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'threads (${threads.length})',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       new CurlyBlockElement(queue: _r.queue)
-                        ..content = threads.map(_populateThreadInfo)
+                        ..content = threads.map<Element>(_populateThreadInfo)
                     ]
                 ]
             ],
@@ -368,10 +368,10 @@
   DivElement _populateThreadInfo(M.Thread t) {
     return new DivElement()
       ..classes = ['indent']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = '${t.id} ',
         new CurlyBlockElement(queue: _r.queue)
-          ..content = [
+          ..content = <Element>[
             new DivElement()
               ..classes = ['indent']
               ..text = 'kind ${t.kindString}',
diff --git a/runtime/observatory/lib/src/elements/json_view.dart b/runtime/observatory/lib/src/elements/json_view.dart
index 5ce987b..6b452ef 100644
--- a/runtime/observatory/lib/src/elements/json_view.dart
+++ b/runtime/observatory/lib/src/elements/json_view.dart
@@ -37,7 +37,7 @@
     assert(notifications != null);
     assert(map != null);
     JSONViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<JSONViewElement>(e, queue: queue);
     e._notifications = notifications;
     e._map = map;
     return e;
@@ -55,18 +55,18 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavNotifyElement(_notifications, queue: _r.queue)
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Object',
           new HRElement(),
           new PreElement()..text = JSONPretty.stringify(_map),
diff --git a/runtime/observatory/lib/src/elements/library_ref.dart b/runtime/observatory/lib/src/elements/library_ref.dart
index fbc396b..dcfe17a 100644
--- a/runtime/observatory/lib/src/elements/library_ref.dart
+++ b/runtime/observatory/lib/src/elements/library_ref.dart
@@ -29,7 +29,7 @@
     assert(isolate != null);
     assert(library != null);
     LibraryRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<LibraryRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._library = library;
     return e;
@@ -47,12 +47,12 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
     final name = _library.name;
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _library))
         ..text = (name == null || name.isEmpty) ? 'unnamed' : name
     ];
diff --git a/runtime/observatory/lib/src/elements/library_view.dart b/runtime/observatory/lib/src/elements/library_view.dart
index 5da66e9..2f9f2d4 100644
--- a/runtime/observatory/lib/src/elements/library_view.dart
+++ b/runtime/observatory/lib/src/elements/library_view.dart
@@ -105,7 +105,7 @@
     assert(objects != null);
     assert(eval != null);
     LibraryViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<LibraryViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -136,12 +136,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -155,7 +155,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Library',
           new HRElement(),
           new ObjectCommonElement(_isolate, _library, _retainedSizes,
@@ -163,10 +163,10 @@
               queue: _r.queue),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'uri',
@@ -176,7 +176,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'vm name',
@@ -223,13 +223,13 @@
     }
     final dependencies = _library.dependencies.toList();
     return new DivElement()
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = 'dependencies (${dependencies.length}) ',
         new CurlyBlockElement(queue: _r.queue)
           ..content = dependencies
-              .map((d) => new DivElement()
+              .map<Element>((d) => new DivElement()
                 ..classes = ['indent']
-                ..children = [
+                ..children = <Element>[
                   new SpanElement()..text = d.isImport ? 'import ' : 'export ',
                   new LibraryRefElement(_isolate, d.target, queue: _r.queue),
                   new SpanElement()
@@ -246,13 +246,13 @@
     }
     final scripts = _library.scripts.toList();
     return new DivElement()
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = 'scripts (${scripts.length}) ',
         new CurlyBlockElement(queue: _r.queue)
           ..content = scripts
-              .map((s) => new DivElement()
+              .map<Element>((s) => new DivElement()
                 ..classes = ['indent']
-                ..children = [
+                ..children = <Element>[
                   new ScriptRefElement(_isolate, s, queue: _r.queue)
                 ])
               .toList()
@@ -265,13 +265,13 @@
     }
     final classes = _library.classes.toList();
     return new DivElement()
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = 'classes (${classes.length}) ',
         new CurlyBlockElement(queue: _r.queue)
           ..content = classes
-              .map((c) => new DivElement()
+              .map<Element>((c) => new DivElement()
                 ..classes = ['indent']
-                ..children = [
+                ..children = <Element>[
                   new ClassRefElement(_isolate, c, queue: _r.queue)
                 ])
               .toList()
@@ -284,27 +284,27 @@
     }
     final variables = _library.variables.toList();
     return new DivElement()
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = 'variables (${variables.length}) ',
         new CurlyBlockElement(queue: _r.queue)
-          ..content = [
+          ..content = <Element>[
             _variables == null
                 ? (new SpanElement()..text = 'loading...')
                 : (new DivElement()
                   ..classes = ['indent', 'memberList']
                   ..children = _variables
-                      .map((f) => new DivElement()
+                      .map<Element>((f) => new DivElement()
                         ..classes = ['memberItem']
-                        ..children = [
+                        ..children = <Element>[
                           new DivElement()
                             ..classes = ['memberName']
-                            ..children = [
+                            ..children = <Element>[
                               new FieldRefElement(_isolate, f, _objects,
                                   queue: _r.queue)
                             ],
                           new DivElement()
                             ..classes = ['memberValue']
-                            ..children = [
+                            ..children = <Element>[
                               new SpanElement()..text = ' = ',
                               anyRef(_isolate, f.staticValue, _objects,
                                   queue: _r.queue)
@@ -321,13 +321,13 @@
     }
     final functions = _library.functions.toList();
     return new DivElement()
-      ..children = [
+      ..children = <Element>[
         new SpanElement()..text = 'functions (${functions.length}) ',
         new CurlyBlockElement(queue: _r.queue)
           ..content = functions
-              .map((f) => new DivElement()
+              .map<Element>((f) => new DivElement()
                 ..classes = ['indent']
-                ..children = [
+                ..children = <Element>[
                   new FunctionRefElement(_isolate, f, queue: _r.queue)
                 ])
               .toList()
diff --git a/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart b/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart
index ce3981c..578a148 100644
--- a/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart
+++ b/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart
@@ -30,7 +30,8 @@
     assert(isolate != null);
     assert(localVar != null);
     LocalVarDescriptorsRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r =
+        new RenderingScheduler<LocalVarDescriptorsRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._localVar = localVar;
     return e;
@@ -48,14 +49,14 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
     final text = (_localVar.name == null || _localVar.name == '')
         ? 'LocalVarDescriptors'
         : _localVar.name;
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _localVar))
         ..text = text
     ];
diff --git a/runtime/observatory/lib/src/elements/logging.dart b/runtime/observatory/lib/src/elements/logging.dart
index 5350a30..8e168fa 100644
--- a/runtime/observatory/lib/src/elements/logging.dart
+++ b/runtime/observatory/lib/src/elements/logging.dart
@@ -56,7 +56,7 @@
     assert(events != null);
     assert(notifications != null);
     LoggingPageElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<LoggingPageElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -76,7 +76,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   LoggingListElement _logs;
@@ -84,8 +84,8 @@
   void render() {
     _logs = _logs ?? new LoggingListElement(_isolate, _events);
     _logs.level = _level;
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -100,7 +100,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Logging',
           new SpanElement()..text = 'Show messages with severity ',
           _createLevelSelector(),
diff --git a/runtime/observatory/lib/src/elements/logging_list.dart b/runtime/observatory/lib/src/elements/logging_list.dart
index 8b8b77d..ac9c728 100644
--- a/runtime/observatory/lib/src/elements/logging_list.dart
+++ b/runtime/observatory/lib/src/elements/logging_list.dart
@@ -33,7 +33,7 @@
     assert(isolate != null);
     assert(events != null);
     LoggingListElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<LoggingListElement>(e, queue: queue);
     e._isolate = isolate;
     e._events = events;
     return e;
@@ -59,16 +59,16 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _subscription.cancel();
   }
 
   void render() {
     children = _logs
         .where(_shouldBeVisible)
-        .map((logRecord) => new DivElement()
+        .map<Element>((logRecord) => new DivElement()
           ..classes = ['logItem', logRecord['level'].name]
-          ..children = [
+          ..children = <Element>[
             new SpanElement()
               ..classes = ['level']
               ..text = logRecord['level'].name,
diff --git a/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart b/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart
index 36a4aa9..b7eb6c2 100644
--- a/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart
+++ b/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart
@@ -31,7 +31,7 @@
     assert(isolate != null);
     assert(cache != null);
     MegamorphicCacheRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MegamorphicCacheRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._cache = cache;
     return e;
@@ -49,13 +49,13 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _cache))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'MegarmorphicCache',
diff --git a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
index d3f1ccf..5a35092 100644
--- a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
+++ b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
@@ -84,7 +84,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     MegamorphicCacheViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MegamorphicCacheViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -111,12 +111,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -131,7 +131,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Megamorphic Cache',
           new HRElement(),
           new ObjectCommonElement(_isolate, _cache, _retainedSizes,
@@ -140,10 +140,10 @@
           new BRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'selector',
@@ -153,7 +153,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'mask',
@@ -163,26 +163,26 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'buckets',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       anyRef(_isolate, _cache.buckets, _objects,
                           queue: _r.queue)
                     ]
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'argumentsDescriptor',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       anyRef(_isolate, _cache.argumentsDescriptor, _objects,
                           queue: _r.queue)
                     ]
diff --git a/runtime/observatory/lib/src/elements/memory/allocations.dart b/runtime/observatory/lib/src/elements/memory/allocations.dart
index ad3c5dd..1d8c4ba 100644
--- a/runtime/observatory/lib/src/elements/memory/allocations.dart
+++ b/runtime/observatory/lib/src/elements/memory/allocations.dart
@@ -55,7 +55,7 @@
     assert(editor != null);
     assert(repository != null);
     MemoryAllocationsElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MemoryAllocationsElement>(e, queue: queue);
     e._isolate = isolate;
     e._editor = editor;
     e._repository = repository;
@@ -75,7 +75,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   Future reload({bool gc = false, bool reset = false}) async {
@@ -84,13 +84,13 @@
 
   void render() {
     if (_profile == null) {
-      children = [
+      children = <Element>[
         new DivElement()
           ..classes = ['content-centered-big']
-          ..children = [new HeadingElement.h2()..text = 'Loading...']
+          ..children = <Element>[new HeadingElement.h2()..text = 'Loading...']
       ];
     } else {
-      children = [
+      children = <Element>[
         new VirtualCollectionElement(
             _createCollectionLine, _updateCollectionLine,
             createHeader: _createCollectionHeader,
@@ -129,15 +129,21 @@
     }
     switch (_sortingDirection) {
       case _SortingDirection.ascending:
-        return (a, b) => getter(a).compareTo(getter(b));
+        int sort(M.ClassHeapStats a, M.ClassHeapStats b) {
+          return getter(a).compareTo(getter(b));
+        }
+        return sort;
       case _SortingDirection.descending:
-        return (a, b) => getter(b).compareTo(getter(a));
+        int sort(M.ClassHeapStats a, M.ClassHeapStats b) {
+          return getter(b).compareTo(getter(a));
+        }
+        return sort;
     }
   }
 
   static HtmlElement _createCollectionLine() => new DivElement()
     ..classes = ['collection-item']
-    ..children = [
+    ..children = <Element>[
       new SpanElement()
         ..classes = ['bytes']
         ..text = '0B',
@@ -158,7 +164,7 @@
     return [
       new DivElement()
         ..classes = ['collection-item']
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['group']
             ..nodes = [
@@ -178,7 +184,7 @@
         ],
       new DivElement()
         ..classes = ['collection-item']
-        ..children = [
+        ..children = <Element>[
           _createHeaderButton(const ['bytes'], 'Size',
               _SortingField.accumulatedSize, _SortingDirection.descending),
           _createHeaderButton(const ['instances'], 'Instances',
@@ -243,7 +249,8 @@
     });
   }
 
-  bool _search(Pattern pattern, M.ClassHeapStats item) {
+  bool _search(Pattern pattern, itemDynamic) {
+    M.ClassHeapStats item = itemDynamic;
     final String value = item.clazz?.name ?? item.displayName;
     return value.contains(pattern);
   }
diff --git a/runtime/observatory/lib/src/elements/memory/dashboard.dart b/runtime/observatory/lib/src/elements/memory/dashboard.dart
index e02882b..802bed5 100644
--- a/runtime/observatory/lib/src/elements/memory/dashboard.dart
+++ b/runtime/observatory/lib/src/elements/memory/dashboard.dart
@@ -72,7 +72,7 @@
     assert(events != null);
     assert(notifications != null);
     MemoryDashboardElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MemoryDashboardElement>(e, queue: queue);
     e._vm = vm;
     e._vms = vms;
     e._isolates = isolates;
@@ -97,7 +97,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   M.IsolateRef _isolate;
@@ -110,11 +110,11 @@
           new MemoryGraphElement(vm, _vms, _isolates, _events, queue: _r.queue)
             ..onIsolateSelected.listen(_onIsolateSelected);
     }
-    children = [
-      navBar([new NavNotifyElement(_notifications, queue: _r.queue)]),
+    children = <Element>[
+      navBar(<Element>[new NavNotifyElement(_notifications, queue: _r.queue)]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Memory Dashboard',
           new HRElement(),
           _graph,
@@ -124,7 +124,9 @@
     if (_isolate == null) {
       children.add(new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [new HeadingElement.h1()..text = "No isolate selected"]);
+        ..children = <Element>[
+          new HeadingElement.h1()..text = "No isolate selected"
+        ]);
     } else {
       children.add(new MemoryProfileElement(
           _isolate, _editor, _allocations, _snapshots, _objects));
diff --git a/runtime/observatory/lib/src/elements/memory/graph.dart b/runtime/observatory/lib/src/elements/memory/graph.dart
index 537767d..30b18ac 100644
--- a/runtime/observatory/lib/src/elements/memory/graph.dart
+++ b/runtime/observatory/lib/src/elements/memory/graph.dart
@@ -60,7 +60,7 @@
     assert(isolates != null);
     assert(events != null);
     MemoryGraphElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MemoryGraphElement>(e, queue: queue);
     e._vm = vm;
     e._vms = vms;
     e._isolates = isolates;
@@ -104,7 +104,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _onGCSubscription.cancel();
     _onConnectionClosedSubscription.cancel();
     _onResizeSubscription.cancel();
@@ -137,7 +137,7 @@
     final legend = new DivElement();
     final host = new DivElement();
     final theme = new MemoryChartTheme(1);
-    children = [theme.style, legend, host];
+    children = <Element>[theme.style, legend, host];
     final rect = host.getBoundingClientRect();
 
     final series =
@@ -199,7 +199,7 @@
     }
   }
 
-  String _formatTimeAxis(num ms) =>
+  String _formatTimeAxis(dynamic ms) =>
       Utils.formatDuration(new Duration(microseconds: ms.toInt()),
           precision: DurationComponent.Seconds);
 
@@ -340,13 +340,13 @@
 
   static HtmlElement _formatNativeOvercard(int currentRSS, int heap) =>
       new DivElement()
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['hovercard-title']
             ..text = 'Native',
           new DivElement()
             ..classes = ['hovercard-measure', 'hovercard-multi']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['hovercard-measure-label']
                 ..text = 'Total Memory Usage',
@@ -358,7 +358,7 @@
             ],
           new DivElement()
             ..classes = ['hovercard-measure', 'hovercard-multi']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['hovercard-measure-label']
                 ..text = 'Native Heap',
@@ -371,13 +371,13 @@
   static HtmlElement _formatIsolateOvercard(String name, int free, int used) {
     final capacity = free + used;
     return new DivElement()
-      ..children = [
+      ..children = <Element>[
         new DivElement()
           ..classes = ['hovercard-title']
           ..text = name,
         new DivElement()
           ..classes = ['hovercard-measure', 'hovercard-multi']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['hovercard-measure-label']
               ..text = 'Heap Capacity',
@@ -387,7 +387,7 @@
           ],
         new DivElement()
           ..classes = ['hovercard-measure', 'hovercard-multi']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['hovercard-measure-label']
               ..text = 'Free Heap',
@@ -397,7 +397,7 @@
           ],
         new DivElement()
           ..classes = ['hovercard-measure', 'hovercard-multi']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['hovercard-measure-label']
               ..text = 'Used Heap',
diff --git a/runtime/observatory/lib/src/elements/memory/profile.dart b/runtime/observatory/lib/src/elements/memory/profile.dart
index 4a4f1d8..2c72042 100644
--- a/runtime/observatory/lib/src/elements/memory/profile.dart
+++ b/runtime/observatory/lib/src/elements/memory/profile.dart
@@ -57,7 +57,7 @@
     assert(snapshots != null);
     assert(objects != null);
     MemoryProfileElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MemoryProfileElement>(e, queue: queue);
     e._isolate = isolate;
     e._editor = editor;
     e._allocations = allocations;
@@ -78,7 +78,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
@@ -103,10 +103,10 @@
 
     final ButtonElement bReload = new ButtonElement();
     final ButtonElement bGC = new ButtonElement();
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()
             ..nodes = [
               new Text(_isolate.name),
@@ -134,7 +134,7 @@
                 }),
               new SpanElement()
                 ..classes = ['tab_buttons']
-                ..children = [
+                ..children = <Element>[
                   new ButtonElement()
                     ..text = 'Allocations'
                     ..disabled = _analysis == _Analysis.allocations
diff --git a/runtime/observatory/lib/src/elements/memory/snapshot.dart b/runtime/observatory/lib/src/elements/memory/snapshot.dart
index d6adcf3e..816a772 100644
--- a/runtime/observatory/lib/src/elements/memory/snapshot.dart
+++ b/runtime/observatory/lib/src/elements/memory/snapshot.dart
@@ -43,7 +43,7 @@
     assert(snapshots != null);
     assert(objects != null);
     MemorySnapshotElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MemorySnapshotElement>(e, queue: queue);
     e._isolate = isolate;
     e._editor = editor;
     e._snapshots = snapshots;
@@ -64,7 +64,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
@@ -72,7 +72,7 @@
       children = const [];
       return;
     }
-    List<HtmlElement> content;
+    List<Element> content;
     switch (_progress.status) {
       case M.HeapSnapshotLoadingStatus.fetching:
         content = _createStatusMessage('Fetching snapshot from VM...',
@@ -116,10 +116,10 @@
     return [
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['statusBox', 'shadow', 'center']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['statusMessage']
                 ..text = message,
@@ -139,7 +139,7 @@
   VirtualTreeElement _tree;
 
   List<Element> _createReport() {
-    final List roots = _getChildrenDominator(_snapshot.dominatorTree);
+    final List roots = _getChildrenDominator(_snapshot.dominatorTree).toList();
     _tree = new VirtualTreeElement(
         _createDominator, _updateDominator, _getChildrenDominator,
         items: roots, queue: _r.queue);
@@ -168,7 +168,7 @@
   static HtmlElement _createDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
-      ..children = [
+      ..children = <Element>[
         new SpanElement()
           ..classes = ['size']
           ..title = 'retained size',
@@ -195,8 +195,8 @@
         .take(kMaxChildren);
   }
 
-  void _updateDominator(
-      HtmlElement element, M.HeapSnapshotDominatorNode node, int depth) {
+  void _updateDominator(HtmlElement element, nodeDynamic, int depth) {
+    M.HeapSnapshotDominatorNode node = nodeDynamic;
     element.children[0].text = Utils.formatSize(node.retainedSize);
     _updateLines(element.children[1].children, depth);
     if (_getChildrenDominator(node).isNotEmpty) {
@@ -213,14 +213,14 @@
     if (node.isStack) {
       wrapper
         ..text = ''
-        ..children = [
+        ..children = <Element>[
           new AnchorElement(href: Uris.debugger(isolate))..text = 'stack frames'
         ];
     } else {
       node.object.then((object) {
         wrapper
           ..text = ''
-          ..children = [
+          ..children = <Element>[
             anyRef(_isolate, object, _objects,
                 queue: _r.queue, expandable: false)
           ];
diff --git a/runtime/observatory/lib/src/elements/metric/details.dart b/runtime/observatory/lib/src/elements/metric/details.dart
index 34b7a0f..458d12b 100644
--- a/runtime/observatory/lib/src/elements/metric/details.dart
+++ b/runtime/observatory/lib/src/elements/metric/details.dart
@@ -29,7 +29,7 @@
     assert(metric != null);
     assert(metrics != null);
     MetricDetailsElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MetricDetailsElement>(e, queue: queue);
     e._isolate = isolate;
     e._metric = metric;
     e._metrics = metrics;
@@ -48,17 +48,17 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['memberList']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'name',
@@ -68,7 +68,7 @@
             ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'description',
@@ -78,7 +78,7 @@
             ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'refresh rate',
@@ -88,7 +88,7 @@
             ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'buffer size',
diff --git a/runtime/observatory/lib/src/elements/metric/graph.dart b/runtime/observatory/lib/src/elements/metric/graph.dart
index c39d29c..608a936 100644
--- a/runtime/observatory/lib/src/elements/metric/graph.dart
+++ b/runtime/observatory/lib/src/elements/metric/graph.dart
@@ -31,7 +31,7 @@
     assert(metric != null);
     assert(metrics != null);
     MetricGraphElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MetricGraphElement>(e, queue: queue);
     e._isolate = isolate;
     e._metric = metric;
     e._metrics = metrics;
@@ -51,7 +51,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _timer.cancel();
   }
 
@@ -78,10 +78,10 @@
     }
 
     final host = new DivElement();
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['memberList']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberItem']
             ..children = min == null
@@ -96,7 +96,7 @@
                   ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'current',
@@ -119,7 +119,7 @@
         ],
       new DivElement()
         ..classes = ['graph']
-        ..children = [host]
+        ..children = <Element>[host]
     ];
     if (rows.length <= 1) {
       return;
diff --git a/runtime/observatory/lib/src/elements/metrics.dart b/runtime/observatory/lib/src/elements/metrics.dart
index f3ac7e9..ce8b91a 100644
--- a/runtime/observatory/lib/src/elements/metrics.dart
+++ b/runtime/observatory/lib/src/elements/metrics.dart
@@ -59,7 +59,7 @@
     assert(events != null);
     assert(notifications != null);
     MetricsPageElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<MetricsPageElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -81,12 +81,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -100,15 +100,15 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Metrics',
           new HRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Metric',
diff --git a/runtime/observatory/lib/src/elements/native_memory_profiler.dart b/runtime/observatory/lib/src/elements/native_memory_profiler.dart
index f517447..b32f2d2 100644
--- a/runtime/observatory/lib/src/elements/native_memory_profiler.dart
+++ b/runtime/observatory/lib/src/elements/native_memory_profiler.dart
@@ -63,7 +63,7 @@
     assert(notifications != null);
     assert(profiles != null);
     NativeMemoryProfileElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NativeMemoryProfileElement>(e, queue: queue);
     e._vm = vm;
     e._events = events;
     e._notifications = notifications;
@@ -84,12 +84,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    var content = [
-      navBar([
+    var content = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         navMenu('native memory profile', link: Uris.nativeMemory()),
@@ -133,7 +133,7 @@
             _direction = tree.direction = e.element.direction;
           }),
         new BRElement(),
-        tree = new CpuProfileVirtualTreeElement(_vm, _progress.profile,
+        tree = new CpuProfileVirtualTreeElement(null, _progress.profile,
             queue: _r.queue, type: M.SampleProfileType.memory)
       ]);
     }
diff --git a/runtime/observatory/lib/src/elements/nav/class_menu.dart b/runtime/observatory/lib/src/elements/nav/class_menu.dart
index d8ef46e..3844443 100644
--- a/runtime/observatory/lib/src/elements/nav/class_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/class_menu.dart
@@ -35,7 +35,7 @@
     assert(isolate != null);
     assert(cls != null);
     NavClassMenuElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavClassMenuElement>(e, queue: queue);
     e._isolate = isolate;
     e._cls = cls;
     return e;
@@ -52,12 +52,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       navMenu(cls.name,
           content: _content, link: Uris.inspect(isolate, object: cls))
     ];
diff --git a/runtime/observatory/lib/src/elements/nav/isolate_menu.dart b/runtime/observatory/lib/src/elements/nav/isolate_menu.dart
index ff7321f..5a1cfed 100644
--- a/runtime/observatory/lib/src/elements/nav/isolate_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/isolate_menu.dart
@@ -37,7 +37,7 @@
     assert(isolate != null);
     assert(events != null);
     NavIsolateMenuElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavIsolateMenuElement>(e, queue: queue);
     e._isolate = isolate;
     e._events = events;
     return e;
@@ -60,7 +60,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     assert(_updatesSubscription != null);
     _updatesSubscription.cancel();
@@ -68,7 +68,7 @@
   }
 
   void render() {
-    final content = [
+    final content = <Element>[
       new NavMenuItemElement('debugger',
           queue: _r.queue, link: Uris.debugger(isolate)),
       new NavMenuItemElement('class hierarchy',
@@ -92,7 +92,7 @@
       new NavMenuItemElement('logging',
           queue: _r.queue, link: Uris.logging(isolate)),
     ]..addAll(_content);
-    children = [
+    children = <Element>[
       navMenu(isolate.name, content: content, link: Uris.inspect(isolate))
     ];
   }
diff --git a/runtime/observatory/lib/src/elements/nav/library_menu.dart b/runtime/observatory/lib/src/elements/nav/library_menu.dart
index 5f22f81..8750d5e 100644
--- a/runtime/observatory/lib/src/elements/nav/library_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/library_menu.dart
@@ -35,7 +35,7 @@
     assert(isolate != null);
     assert(library != null);
     NavLibraryMenuElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavLibraryMenuElement>(e, queue: queue);
     e._isolate = isolate;
     e._library = library;
     return e;
@@ -52,12 +52,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       navMenu(library.name,
           content: _content,
           link: Uris.inspect(isolate, object: library).toString())
diff --git a/runtime/observatory/lib/src/elements/nav/menu_item.dart b/runtime/observatory/lib/src/elements/nav/menu_item.dart
index b7c3ea3..b196b4f 100644
--- a/runtime/observatory/lib/src/elements/nav/menu_item.dart
+++ b/runtime/observatory/lib/src/elements/nav/menu_item.dart
@@ -16,7 +16,7 @@
 
   String _label;
   String _link;
-  Iterable<Element> _content = const [];
+  Iterable<Element> _content = const <Element>[];
 
   String get label => _label;
   String get link => _link;
@@ -33,7 +33,7 @@
       {String link, RenderingQueue queue}) {
     assert(label != null);
     NavMenuItemElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavMenuItemElement>(e, queue: queue);
     e._label = label;
     e._link = link;
     return e;
@@ -51,14 +51,14 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new LIElement()
         ..classes = ['nav-menu-item']
-        ..children = [
+        ..children = <Element>[
           new AnchorElement(href: link)..text = label,
           new UListElement()..children = _content
         ]
diff --git a/runtime/observatory/lib/src/elements/nav/notify.dart b/runtime/observatory/lib/src/elements/nav/notify.dart
index 5eb9a52..6b22f32 100644
--- a/runtime/observatory/lib/src/elements/nav/notify.dart
+++ b/runtime/observatory/lib/src/elements/nav/notify.dart
@@ -36,7 +36,7 @@
     assert(repository != null);
     assert(notifyOnPause != null);
     NavNotifyElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavNotifyElement>(e, queue: queue);
     e._repository = repository;
     e._notifyOnPause = notifyOnPause;
     return e;
@@ -54,18 +54,21 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _subscription.cancel();
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new DivElement()
-        ..children = [
+        ..children = <Element>[
           new DivElement()
-            ..children =
-                _repository.list().where(_filter).map(_toElement).toList()
+            ..children = _repository
+                .list()
+                .where(_filter)
+                .map<Element>(_toElement)
+                .toList()
         ]
     ];
   }
@@ -77,7 +80,7 @@
     return true;
   }
 
-  HtmlElement _toElement(M.Notification notification) {
+  Element _toElement(M.Notification notification) {
     if (notification is M.EventNotification) {
       return new NavNotifyEventElement(notification.event, queue: _r.queue)
         ..onDelete.listen((_) => _repository.delete(notification));
diff --git a/runtime/observatory/lib/src/elements/nav/notify_event.dart b/runtime/observatory/lib/src/elements/nav/notify_event.dart
index 44a6d26..a75e723 100644
--- a/runtime/observatory/lib/src/elements/nav/notify_event.dart
+++ b/runtime/observatory/lib/src/elements/nav/notify_event.dart
@@ -32,7 +32,7 @@
   factory NavNotifyEventElement(M.Event event, {RenderingQueue queue}) {
     assert(event != null);
     NavNotifyEventElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavNotifyEventElement>(e, queue: queue);
     e._event = event;
     return e;
   }
@@ -48,12 +48,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [];
+    children = <Element>[];
     List<Element> content;
     if (event is M.PauseStartEvent) {
       content = _managePauseStartEvent(event as M.PauseStartEvent);
@@ -76,9 +76,9 @@
     } else {
       return;
     }
-    children = [
+    children = <Element>[
       new DivElement()
-        ..children = []
+        ..children = <Element>[]
         ..children.addAll(content)
         ..children.add(new ButtonElement()
           ..innerHtml = '&times;'
diff --git a/runtime/observatory/lib/src/elements/nav/notify_exception.dart b/runtime/observatory/lib/src/elements/nav/notify_exception.dart
index 3a76cc4..3c84af7 100644
--- a/runtime/observatory/lib/src/elements/nav/notify_exception.dart
+++ b/runtime/observatory/lib/src/elements/nav/notify_exception.dart
@@ -10,7 +10,7 @@
 import 'package:observatory/models.dart' show ConnectionException;
 
 class ExceptionDeleteEvent {
-  final Exception exception;
+  final dynamic exception;
   final StackTrace stacktrace;
 
   ExceptionDeleteEvent(this.exception, {this.stacktrace});
@@ -28,17 +28,17 @@
       new StreamController<ExceptionDeleteEvent>.broadcast();
   Stream<ExceptionDeleteEvent> get onDelete => _onDelete.stream;
 
-  Exception _exception;
+  dynamic _exception;
   StackTrace _stacktrace;
 
-  Exception get exception => _exception;
+  dynamic get exception => _exception;
   StackTrace get stacktrace => _stacktrace;
 
-  factory NavNotifyExceptionElement(Exception exception,
+  factory NavNotifyExceptionElement(dynamic exception,
       {StackTrace stacktrace: null, RenderingQueue queue}) {
     assert(exception != null);
     NavNotifyExceptionElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavNotifyExceptionElement>(e, queue: queue);
     e._exception = exception;
     e._stacktrace = stacktrace;
     return e;
@@ -55,7 +55,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
@@ -68,9 +68,9 @@
   }
 
   void renderConnectionException() {
-    children = [
+    children = <Element>[
       new DivElement()
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..text = 'The request cannot be completed because the '
                 'VM is currently disconnected',
@@ -88,8 +88,8 @@
   }
 
   void renderGenericException() {
-    List<Node> content;
-    content = [
+    List<Element> content;
+    content = <Element>[
       new SpanElement()..text = 'Unexpected exception:',
       new BRElement(),
       new BRElement(),
@@ -97,7 +97,7 @@
       new BRElement()
     ];
     if (stacktrace != null) {
-      content.addAll([
+      content.addAll(<Element>[
         new SpanElement()..text = 'StackTrace:',
         new BRElement(),
         new BRElement(),
@@ -105,7 +105,7 @@
         new BRElement()
       ]);
     }
-    content.addAll([
+    content.addAll(<Element>[
       new SpanElement()..text = '[',
       new AnchorElement(href: Uris.vmConnect())
         ..text = 'Connect to a different VM',
@@ -114,7 +114,7 @@
         ..innerHtml = '&times;'
         ..onClick.map(_toEvent).listen(_delete)
     ]);
-    children = [new DivElement()..children = content];
+    children = <Element>[new DivElement()..children = content];
   }
 
   ExceptionDeleteEvent _toEvent(_) {
diff --git a/runtime/observatory/lib/src/elements/nav/refresh.dart b/runtime/observatory/lib/src/elements/nav/refresh.dart
index 0b515d4..da859a5 100644
--- a/runtime/observatory/lib/src/elements/nav/refresh.dart
+++ b/runtime/observatory/lib/src/elements/nav/refresh.dart
@@ -37,7 +37,7 @@
     assert(label != null);
     assert(disabled != null);
     NavRefreshElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavRefreshElement>(e, queue: queue);
     e._label = label;
     e._disabled = disabled;
     return e;
@@ -54,14 +54,14 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new LIElement()
-        ..children = [
+        ..children = <Element>[
           new ButtonElement()
             ..text = label
             ..disabled = disabled
diff --git a/runtime/observatory/lib/src/elements/nav/reload.dart b/runtime/observatory/lib/src/elements/nav/reload.dart
index 5baa8a0..86c8225 100644
--- a/runtime/observatory/lib/src/elements/nav/reload.dart
+++ b/runtime/observatory/lib/src/elements/nav/reload.dart
@@ -39,7 +39,7 @@
     assert(isolates == null);
     assert(events == null);
     NavReloadElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavReloadElement>(e, queue: queue);
     e._isolate = isolate;
     e._isolates = isolates;
     e._events = events;
@@ -58,17 +58,17 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _sub.cancel();
     _sub = null;
     _r.disable(notify: true);
   }
 
   void render() {
-    final children = [];
+    final children = <Element>[];
     if (_isolates.reloadSourcesServices.isEmpty) {
       children.add(new LIElement()
-        ..children = [
+        ..children = <Element>[
           new ButtonElement()
             ..text = 'Reload Source'
             ..disabled = _disabled
@@ -76,7 +76,7 @@
         ]);
     } else if (_isolates.reloadSourcesServices.length == 1) {
       children.add(new LIElement()
-        ..children = [
+        ..children = <Element>[
           new ButtonElement()
             ..text = 'Reload Source'
             ..disabled = _disabled
@@ -85,7 +85,7 @@
         ]);
     } else {
       final content = _isolates.reloadSourcesServices.map((s) => new LIElement()
-        ..children = [
+        ..children = <Element>[
           new ButtonElement()
             ..text = s.alias
             ..disabled = _disabled
diff --git a/runtime/observatory/lib/src/elements/nav/top_menu.dart b/runtime/observatory/lib/src/elements/nav/top_menu.dart
index 0c4c957..285be91 100644
--- a/runtime/observatory/lib/src/elements/nav/top_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/top_menu.dart
@@ -18,7 +18,7 @@
 
   Stream<RenderedEvent<NavTopMenuElement>> get onRendered => _r.onRendered;
 
-  Iterable<Element> _content = const [];
+  Iterable<Element> _content = const <Element>[];
 
   Iterable<Element> get content => _content;
 
@@ -29,7 +29,7 @@
 
   factory NavTopMenuElement({RenderingQueue queue}) {
     NavTopMenuElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavTopMenuElement>(e, queue: queue);
     return e;
   }
 
@@ -45,13 +45,15 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    final content = ([
+    final content = (<Element>[
       new NavMenuItemElement('Connect to a VM', link: Uris.vmConnect()),
     ]..addAll(_content));
-    children = [navMenu('Observatory', link: Uris.vm(), content: content)];
+    children = <Element>[
+      navMenu('Observatory', link: Uris.vm(), content: content)
+    ];
   }
 }
diff --git a/runtime/observatory/lib/src/elements/nav/vm_menu.dart b/runtime/observatory/lib/src/elements/nav/vm_menu.dart
index c0b6877..af1f8c4 100644
--- a/runtime/observatory/lib/src/elements/nav/vm_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/vm_menu.dart
@@ -37,7 +37,7 @@
     assert(vm != null);
     assert(events != null);
     NavVMMenuElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<NavVMMenuElement>(e, queue: queue);
     e._vm = vm;
     e._events = events;
     return e;
@@ -58,17 +58,19 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _updatesSubscription.cancel();
   }
 
   void render() {
-    final content = (_vm.isolates.map((isolate) {
+    final content = (_vm.isolates.map<Element>((isolate) {
       return new NavMenuItemElement(isolate.name,
           queue: _r.queue, link: Uris.inspect(isolate));
     }).toList()
       ..addAll(_content));
-    children = [navMenu(vm.displayName, link: Uris.vm(), content: content)];
+    children = <Element>[
+      navMenu(vm.displayName, link: Uris.vm(), content: content)
+    ];
   }
 }
diff --git a/runtime/observatory/lib/src/elements/object_common.dart b/runtime/observatory/lib/src/elements/object_common.dart
index 1fafc22..4df6eba 100644
--- a/runtime/observatory/lib/src/elements/object_common.dart
+++ b/runtime/observatory/lib/src/elements/object_common.dart
@@ -58,7 +58,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     ObjectCommonElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ObjectCommonElement>(e, queue: queue);
     e._isolate = isolate;
     e._object = object;
     e._retainedSizes = retainedSizes;
@@ -81,7 +81,7 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   RetainingPathElement _path;
@@ -94,19 +94,19 @@
     _inbounds = _inbounds ??
         new InboundReferencesElement(_isolate, _object, _references, _objects,
             queue: _r.queue);
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['memberList']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Class ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = [
+                ..children = <Element>[
                   _object.clazz == null
                       ? (new SpanElement()..text = '...')
                       : new ClassRefElement(_isolate, _object.clazz,
@@ -116,7 +116,7 @@
           new DivElement()
             ..classes = ['memberItem']
             ..title = 'Space for this object in memory'
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Shallow size ',
@@ -128,7 +128,7 @@
             ..classes = ['memberItem']
             ..title = 'Space reachable from this object, '
                 'excluding class references'
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Reachable size ',
@@ -140,7 +140,7 @@
             ..classes = ['memberItem']
             ..title = 'Space that would be reclaimed if references to this '
                 'object were replaced with null'
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Retained size ',
@@ -150,24 +150,24 @@
             ],
           new DivElement()
             ..classes = ['memberItem']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Retaining path ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = [_path]
+                ..children = <Element>[_path]
             ],
           new DivElement()
             ..classes = ['memberItem']
             ..title = 'Objects which directly reference this object'
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberName']
                 ..text = 'Inbound references ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = [_inbounds]
+                ..children = <Element>[_inbounds]
             ]
         ]
     ];
diff --git a/runtime/observatory/lib/src/elements/object_view.dart b/runtime/observatory/lib/src/elements/object_view.dart
index 4c39bb3..d2a7237 100644
--- a/runtime/observatory/lib/src/elements/object_view.dart
+++ b/runtime/observatory/lib/src/elements/object_view.dart
@@ -76,7 +76,7 @@
     assert(references != null);
     assert(retainingPaths != null);
     ObjectViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ObjectViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -102,12 +102,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -122,7 +122,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Object',
           new HRElement(),
           new ObjectCommonElement(_isolate, _object, _retainedSizes,
diff --git a/runtime/observatory/lib/src/elements/objectpool_ref.dart b/runtime/observatory/lib/src/elements/objectpool_ref.dart
index 489581c..9c77445 100644
--- a/runtime/observatory/lib/src/elements/objectpool_ref.dart
+++ b/runtime/observatory/lib/src/elements/objectpool_ref.dart
@@ -27,7 +27,7 @@
     assert(isolate != null);
     assert(pool != null);
     ObjectPoolRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ObjectPoolRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._pool = pool;
     return e;
@@ -45,13 +45,13 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _pool))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'ObjectPool',
diff --git a/runtime/observatory/lib/src/elements/objectpool_view.dart b/runtime/observatory/lib/src/elements/objectpool_view.dart
index a68aade..85b546d 100644
--- a/runtime/observatory/lib/src/elements/objectpool_view.dart
+++ b/runtime/observatory/lib/src/elements/objectpool_view.dart
@@ -82,7 +82,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     ObjectPoolViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ObjectPoolViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -109,12 +109,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -129,7 +129,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'ObjectPool',
           new HRElement(),
           new ObjectCommonElement(_isolate, _pool, _retainedSizes,
@@ -140,9 +140,9 @@
           new DivElement()
             ..classes = ['memberList']
             ..children = _pool.entries
-                .map((entry) => new DivElement()
+                .map<Element>((entry) => new DivElement()
                   ..classes = ['memberItem']
-                  ..children = [
+                  ..children = <Element>[
                     new DivElement()
                       ..classes = ['memberName', 'hexadecimal']
                       ..text = '[PP+0x${entry.offset.toRadixString(16)}]',
diff --git a/runtime/observatory/lib/src/elements/objectstore_view.dart b/runtime/observatory/lib/src/elements/objectstore_view.dart
index 8e24f05..a7b31c9 100644
--- a/runtime/observatory/lib/src/elements/objectstore_view.dart
+++ b/runtime/observatory/lib/src/elements/objectstore_view.dart
@@ -62,7 +62,7 @@
     assert(stores != null);
     assert(objects != null);
     ObjectStoreViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ObjectStoreViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -85,13 +85,13 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
     final fields = _store?.fields?.toList(growable: false);
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -101,7 +101,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()
             ..text = fields == null
                 ? 'Object Store'
@@ -112,15 +112,15 @@
               : (new DivElement()
                 ..classes = ['memberList']
                 ..children = fields
-                    .map((field) => new DivElement()
+                    .map<Element>((field) => new DivElement()
                       ..classes = ['memberItem']
-                      ..children = [
+                      ..children = <Element>[
                         new DivElement()
                           ..classes = ['memberName']
                           ..text = field.name,
                         new DivElement()
                           ..classes = ['memberValue']
-                          ..children = [
+                          ..children = <Element>[
                             anyRef(_isolate, field.value, _objects,
                                 queue: _r.queue)
                           ]
diff --git a/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart b/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart
index 838f1fa..2629b9f 100644
--- a/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart
+++ b/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart
@@ -29,7 +29,7 @@
     assert(isolate != null);
     assert(descriptors != null);
     PcDescriptorsRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<PcDescriptorsRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._descriptors = descriptors;
     return e;
@@ -47,14 +47,14 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
     final text = (_descriptors.name == null || _descriptors.name == '')
         ? 'PcDescriptors'
         : _descriptors.name;
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _descriptors))
         ..text = text
     ];
diff --git a/runtime/observatory/lib/src/elements/persistent_handles.dart b/runtime/observatory/lib/src/elements/persistent_handles.dart
index bb4f665..57f6196 100644
--- a/runtime/observatory/lib/src/elements/persistent_handles.dart
+++ b/runtime/observatory/lib/src/elements/persistent_handles.dart
@@ -72,7 +72,8 @@
     assert(repository != null);
     assert(objects != null);
     PersistentHandlesPageElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r =
+        new RenderingScheduler<PersistentHandlesPageElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -95,12 +96,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -128,14 +129,14 @@
     return [
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()
             ..text = items == null ? '$name' : '$name (${items.length})',
           new HRElement(),
         ],
       new DivElement()
         ..classes = ['persistent-handles']
-        ..children = [
+        ..children = <Element>[
           items == null
               ? (new HeadingElement.h2()
                 ..classes = ['content-centered-big']
@@ -161,19 +162,25 @@
     }
     switch (_sortingDirection) {
       case _SortingDirection.ascending:
-        return (a, b) => getter(a).compareTo(getter(b));
+        int sort(M.WeakPersistentHandle a, M.WeakPersistentHandle b) {
+          return getter(a).compareTo(getter(b));
+        }
+        return sort;
       case _SortingDirection.descending:
-        return (a, b) => getter(b).compareTo(getter(a));
+        int sort(M.WeakPersistentHandle a, M.WeakPersistentHandle b) {
+          return getter(b).compareTo(getter(a));
+        }
+        return sort;
     }
   }
 
-  static Element _createLine() => new DivElement()
+  static HtmlElement _createLine() => new DivElement()
     ..classes = ['collection-item']
     ..text = 'object';
 
-  static Element _createWeakLine() => new DivElement()
+  static HtmlElement _createWeakLine() => new DivElement()
     ..classes = ['weak-item']
-    ..children = [
+    ..children = <Element>[
       new SpanElement()
         ..classes = ['external-size']
         ..text = '0B',
@@ -189,7 +196,7 @@
   List<HtmlElement> _createWeakHeader() => [
         new DivElement()
           ..classes = ['weak-item']
-          ..children = [
+          ..children = <Element>[
             _createHeaderButton(const ['external-size'], 'External Size',
                 _SortingField.externalSize, _SortingDirection.descending),
             _createHeaderButton(const ['peer'], 'Peer', _SortingField.peer,
@@ -230,7 +237,8 @@
     _r.dirty();
   }
 
-  void _updateWeakLine(Element e, M.WeakPersistentHandle item, index) {
+  void _updateWeakLine(Element e, itemDynamic, index) {
+    M.WeakPersistentHandle item = itemDynamic;
     e.children[0].text = Utils.formatSize(_getExternalSize(item));
     e.children[1].text = '${_getPeer(item)}';
     e.children[2] = anyRef(_isolate, item.object, _objects, queue: _r.queue)
@@ -240,8 +248,9 @@
       ..title = '${_getFinalizerCallback(item)}';
   }
 
-  void _updateLine(Element e, M.PersistentHandle item, index) {
-    e.children = [
+  void _updateLine(Element e, itemDynamic, index) {
+    M.PersistentHandle item = itemDynamic;
+    e.children = <Element>[
       anyRef(_isolate, item.object, _objects, queue: _r.queue)
         ..classes = ['object']
     ];
diff --git a/runtime/observatory/lib/src/elements/ports.dart b/runtime/observatory/lib/src/elements/ports.dart
index ff74673..59d7952 100644
--- a/runtime/observatory/lib/src/elements/ports.dart
+++ b/runtime/observatory/lib/src/elements/ports.dart
@@ -61,7 +61,7 @@
     assert(ports != null);
     assert(objects != null);
     PortsElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<PortsElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -87,13 +87,13 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -104,7 +104,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()..text = 'Ports ($portCount)',
           new HRElement(),
           new BRElement(),
@@ -120,12 +120,12 @@
     }
     int i = 0;
     return _isolatePorts.elements
-        .map((port) => new DivElement()
+        .map<Element>((port) => new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
-              ..children = [
+              ..children = <Element>[
                 new SpanElement()
                   ..classes = ['port-number']
                   ..text = '[ ${++i} ] ',
@@ -133,7 +133,7 @@
               ],
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 anyRef(_isolate, port.handler, _objects, queue: _r.queue)
               ]
           ])
diff --git a/runtime/observatory/lib/src/elements/retaining_path.dart b/runtime/observatory/lib/src/elements/retaining_path.dart
index 84df2d8..a72c728 100644
--- a/runtime/observatory/lib/src/elements/retaining_path.dart
+++ b/runtime/observatory/lib/src/elements/retaining_path.dart
@@ -37,7 +37,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     RetainingPathElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<RetainingPathElement>(e, queue: queue);
     e._isolate = isolate;
     e._object = object;
     e._retainingPaths = retainingPaths;
@@ -56,7 +56,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
@@ -72,7 +72,7 @@
               e.control.disabled = false;
             }
           });
-    children = [curlyBlock];
+    children = <Element>[curlyBlock];
     _r.waitFor([curlyBlock.onRendered.first]);
   }
 
@@ -87,7 +87,7 @@
       return [new SpanElement()..text = 'Loading'];
     }
 
-    var elements = new List();
+    var elements = new List<Element>();
     bool first = true;
     for (var item in _path.elements) {
       elements.add(_createItem(item, first));
@@ -104,7 +104,7 @@
       // No prefix.
     } else if (item.parentField != null) {
       content.add(new SpanElement()
-        ..children = [
+        ..children = <Element>[
           new SpanElement()..text = 'retained by ',
           anyRef(_isolate, item.parentField, _objects, queue: _r.queue),
           new SpanElement()..text = ' of ',
diff --git a/runtime/observatory/lib/src/elements/sample_buffer_control.dart b/runtime/observatory/lib/src/elements/sample_buffer_control.dart
index d7bd262..c9b8452 100644
--- a/runtime/observatory/lib/src/elements/sample_buffer_control.dart
+++ b/runtime/observatory/lib/src/elements/sample_buffer_control.dart
@@ -58,7 +58,7 @@
     assert(selectedTag != null);
     assert(showTag != null);
     SampleBufferControlElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SampleBufferControlElement>(e, queue: queue);
     e._vm = vm;
     e._progress = progress;
     e._progressStream = progressStream;
@@ -107,7 +107,7 @@
         content.addAll(_createStatusReport());
         break;
     }
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['content-centered-big']
         ..children = content
@@ -119,7 +119,7 @@
     return [
       new DivElement()
         ..classes = ['statusBox', 'shadow', 'center']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['statusMessage']
             ..text = message,
@@ -136,9 +136,9 @@
     return [
       new DivElement()
         ..classes = ['statusBox' 'shadow' 'center']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
-            ..children = [
+            ..children = <Element>[
               new HeadingElement.h1()..text = 'Profiling is disabled',
               new BRElement(),
               new DivElement()
@@ -169,7 +169,7 @@
     var content = <Element>[
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Refreshed at',
@@ -179,7 +179,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Profile contains ',
@@ -189,7 +189,7 @@
         ],
       new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Sampling',
@@ -201,7 +201,7 @@
     if (_showTag) {
       content.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Tag Order',
diff --git a/runtime/observatory/lib/src/elements/script_inset.dart b/runtime/observatory/lib/src/elements/script_inset.dart
index aedb6a9..28ecc97 100644
--- a/runtime/observatory/lib/src/elements/script_inset.dart
+++ b/runtime/observatory/lib/src/elements/script_inset.dart
@@ -59,7 +59,7 @@
     assert(inDebuggerContext != null);
     assert(variables != null);
     ScriptInsetElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ScriptInsetElement>(e, queue: queue);
     e._isolate = isolate;
     e._script = script;
     e._scripts = scripts;
@@ -106,16 +106,16 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _subscription.cancel();
   }
 
   void render() {
     if (noSource) {
-      children = [new SpanElement()..text = 'No source'];
+      children = <Element>[new SpanElement()..text = 'No source'];
     } else if (_loadedScript == null) {
-      children = [new SpanElement()..text = 'Loading...'];
+      children = <Element>[new SpanElement()..text = 'Loading...'];
     } else {
       final table = linesTable();
       var firstBuild = false;
@@ -125,7 +125,7 @@
 
         firstBuild = true;
       }
-      children = [container];
+      children = <Element>[container];
       container.children.clear();
       container.children.add(table);
       _makeCssClassUncopyable(table, "noCopy");
@@ -150,7 +150,7 @@
   int _startLine;
   int _endLine;
 
-  Map<int, List<S.ServiceMap>> _rangeMap = {};
+  Map/*<int, List<S.ServiceMap>>*/ _rangeMap = {};
   Set _callSites = new Set<S.CallSite>();
   Set _possibleBreakpointLines = new Set<int>();
   Map<int, ScriptLineProfile> _profileMap = {};
@@ -608,7 +608,7 @@
       button.disabled = false;
     });
     button.title = 'Refresh coverage';
-    button.children = [_iconRefresh.clone(true)];
+    button.children = <Element>[_iconRefresh.clone(true)];
     return button;
   }
 
@@ -624,7 +624,7 @@
       _refresh();
       button.disabled = false;
     });
-    button.children = [_iconWhatsHot.clone(true)];
+    button.children = <Element>[_iconWhatsHot.clone(true)];
     return button;
   }
 
@@ -1367,7 +1367,7 @@
 final SvgSvgElement _iconRefresh = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute(
           'd',
@@ -1381,7 +1381,7 @@
 final SvgSvgElement _iconWhatsHot = new SvgSvgElement()
   ..setAttribute('width', '24')
   ..setAttribute('height', '24')
-  ..children = [
+  ..children = <Element>[
     new PathElement()
       ..setAttribute(
           'd',
diff --git a/runtime/observatory/lib/src/elements/script_ref.dart b/runtime/observatory/lib/src/elements/script_ref.dart
index 78d8fda..eb1cc99 100644
--- a/runtime/observatory/lib/src/elements/script_ref.dart
+++ b/runtime/observatory/lib/src/elements/script_ref.dart
@@ -29,7 +29,7 @@
     assert(isolate != null);
     assert(script != null);
     ScriptRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ScriptRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._script = script;
     return e;
@@ -46,12 +46,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(isolate, object: script))
         ..title = script.uri
         ..text = script.uri.split('/').last
diff --git a/runtime/observatory/lib/src/elements/script_view.dart b/runtime/observatory/lib/src/elements/script_view.dart
index 297fa49..c797360 100644
--- a/runtime/observatory/lib/src/elements/script_view.dart
+++ b/runtime/observatory/lib/src/elements/script_view.dart
@@ -87,7 +87,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     ScriptViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ScriptViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -115,12 +115,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -136,7 +136,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Script',
           new HRElement(),
           new ObjectCommonElement(_isolate, _script, _retainedSizes,
@@ -145,10 +145,10 @@
           new BRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'load time',
diff --git a/runtime/observatory/lib/src/elements/sentinel_value.dart b/runtime/observatory/lib/src/elements/sentinel_value.dart
index 7e1483f..70ea4a3 100644
--- a/runtime/observatory/lib/src/elements/sentinel_value.dart
+++ b/runtime/observatory/lib/src/elements/sentinel_value.dart
@@ -22,7 +22,7 @@
   factory SentinelValueElement(M.Sentinel sentinel, {RenderingQueue queue}) {
     assert(sentinel != null);
     SentinelValueElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SentinelValueElement>(e, queue: queue);
     e._sentinel = sentinel;
     return e;
   }
diff --git a/runtime/observatory/lib/src/elements/sentinel_view.dart b/runtime/observatory/lib/src/elements/sentinel_view.dart
index c470758..9d9a2ad 100644
--- a/runtime/observatory/lib/src/elements/sentinel_view.dart
+++ b/runtime/observatory/lib/src/elements/sentinel_view.dart
@@ -50,7 +50,7 @@
     assert(events != null);
     assert(notifications != null);
     SentinelViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SentinelViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._sentinel = sentinel;
@@ -76,8 +76,8 @@
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -86,7 +86,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()
             ..text = 'Sentinel: #{_sentinel.valueAsString}',
           new HRElement(),
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
index 7d090c8..1e2e3dd 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
@@ -31,7 +31,7 @@
     assert(isolate != null);
     assert(singleTargetCache != null);
     SingleTargetCacheRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SingleTargetCacheRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._singleTargetCache = singleTargetCache;
     return e;
@@ -49,14 +49,14 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(
           href: Uris.inspect(_isolate, object: _singleTargetCache))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'SingleTargetCache',
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_view.dart b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
index 97a1353..651c9ff 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_view.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
@@ -80,7 +80,8 @@
     assert(retainingPaths != null);
     assert(objects != null);
     SingleTargetCacheViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r =
+        new RenderingScheduler<SingleTargetCacheViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -107,12 +108,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -128,7 +129,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'SingleTargetCache',
           new HRElement(),
           new ObjectCommonElement(_isolate, _singleTargetCache, _retainedSizes,
@@ -136,42 +137,42 @@
               queue: _r.queue),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'target',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       anyRef(_isolate, _singleTargetCache.target, _objects,
                           queue: _r.queue)
                     ]
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'lowerLimit',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       new SpanElement()
                         ..text = _singleTargetCache.lowerLimit.toString()
                     ]
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'upperLimit',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       new SpanElement()
                         ..text = _singleTargetCache.upperLimit.toString()
                     ]
diff --git a/runtime/observatory/lib/src/elements/source_inset.dart b/runtime/observatory/lib/src/elements/source_inset.dart
index f507f72..210ce2e 100644
--- a/runtime/observatory/lib/src/elements/source_inset.dart
+++ b/runtime/observatory/lib/src/elements/source_inset.dart
@@ -48,7 +48,7 @@
     assert(inDebuggerContext != null);
     assert(variables != null);
     SourceInsetElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SourceInsetElement>(e, queue: queue);
     e._isolate = isolate;
     e._location = location;
     e._scripts = scripts;
@@ -71,12 +71,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new ScriptInsetElement(
           _isolate, _location.script, _scripts, _objects, _events,
           startPos: _location.tokenPos,
diff --git a/runtime/observatory/lib/src/elements/source_link.dart b/runtime/observatory/lib/src/elements/source_link.dart
index 5c6b7a0..a08adbd 100644
--- a/runtime/observatory/lib/src/elements/source_link.dart
+++ b/runtime/observatory/lib/src/elements/source_link.dart
@@ -33,7 +33,7 @@
     assert(isolate != null);
     assert(location != null);
     SourceLinkElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SourceLinkElement>(e, queue: queue);
     e._isolate = isolate;
     e._location = location;
     e._repository = repository;
@@ -55,19 +55,19 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   Future render() async {
     if (_script == null) {
-      children = [new SpanElement()..text = '<LOADING>'];
+      children = <Element>[new SpanElement()..text = '<LOADING>'];
     } else {
       String label = _script.uri.split('/').last;
       int token = _location.tokenPos;
       int line = _script.tokenToLine(token);
       int column = _script.tokenToCol(token);
-      children = [
+      children = <Element>[
         new AnchorElement(
             href: Uris.inspect(isolate, object: _script, pos: token))
           ..title = _script.uri
diff --git a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
index 7597eaf..9aedfc6 100644
--- a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
+++ b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
@@ -79,7 +79,7 @@
     assert(direction != null);
     assert(filter != null);
     StackTraceTreeConfigElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<StackTraceTreeConfigElement>(e, queue: queue);
     e._showMode = showMode;
     e._showDirection = showDirection;
     e._showFilter = showFilter;
@@ -105,15 +105,15 @@
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'Tree display',
           new HRElement(),
           new DivElement()
             ..classes = ['row']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberList']
                 ..children = _createMembers()
@@ -127,7 +127,7 @@
     if (_showMode) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Mode',
@@ -139,7 +139,7 @@
     if (_showDirection) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Call Tree Direction',
@@ -151,7 +151,7 @@
     if (showFilter) {
       members.add(new DivElement()
         ..classes = ['memberItem']
-        ..children = [
+        ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
             ..text = 'Call Tree Filter'
diff --git a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
index 6e6f7c53..8319596 100644
--- a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
+++ b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
@@ -43,7 +43,8 @@
     assert(stronglyReachable != null);
     assert(objects != null);
     StronglyReachableInstancesElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<StronglyReachableInstancesElement>(e,
+        queue: queue);
     e._isolate = isolate;
     e._cls = cls;
     e._stronglyReachableInstances = stronglyReachable;
@@ -62,12 +63,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new CurlyBlockElement(expanded: _expanded, queue: _r.queue)
         ..content = _createContent()
         ..onToggle.listen((e) async {
@@ -90,8 +91,10 @@
       return [new SpanElement()..text = 'Loading...'];
     }
     final content = _result.samples
-        .map((sample) => new DivElement()
-          ..children = [anyRef(_isolate, sample, _objects, queue: _r.queue)])
+        .map<Element>((sample) => new DivElement()
+          ..children = <Element>[
+            anyRef(_isolate, sample, _objects, queue: _r.queue)
+          ])
         .toList();
     content.add(new DivElement()
       ..children = ([]
diff --git a/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart b/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart
index 9dbde53..fb7cf89 100644
--- a/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart
+++ b/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart
@@ -31,7 +31,7 @@
     assert(isolate != null);
     assert(subtypeTestCache != null);
     SubtypeTestCacheRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SubtypeTestCacheRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._subtypeTestCache = subtypeTestCache;
     return e;
@@ -49,13 +49,13 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _subtypeTestCache))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'SubtypeTestCache',
diff --git a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
index 7afcd0d..80c14fd 100644
--- a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
+++ b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
@@ -80,7 +80,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     SubtypeTestCacheViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<SubtypeTestCacheViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -107,12 +107,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -128,7 +128,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'SubtypeTestCache',
           new HRElement(),
           new ObjectCommonElement(_isolate, _subtypeTestCache, _retainedSizes,
@@ -136,16 +136,16 @@
               queue: _r.queue),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'cache',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       anyRef(_isolate, _subtypeTestCache.cache, _objects,
                           queue: _r.queue)
                     ]
diff --git a/runtime/observatory/lib/src/elements/timeline/dashboard.dart b/runtime/observatory/lib/src/elements/timeline/dashboard.dart
index 0f40c14..dbac222 100644
--- a/runtime/observatory/lib/src/elements/timeline/dashboard.dart
+++ b/runtime/observatory/lib/src/elements/timeline/dashboard.dart
@@ -58,7 +58,7 @@
     assert(repository != null);
     assert(notifications != null);
     TimelineDashboardElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<TimelineDashboardElement>(e, queue: queue);
     e._vm = vm;
     e._repository = repository;
     e._notifications = notifications;
@@ -81,7 +81,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   IFrameElement _frame;
@@ -95,7 +95,7 @@
       _content = new DivElement()..classes = ['content-centered-big'];
     }
     _frame.src = _makeFrameUrl();
-    _content.children = [
+    _content.children = <Element>[
       new HeadingElement.h2()
         ..nodes = ([new Text("Timeline View")]
           ..addAll(_createButtons())
@@ -108,12 +108,13 @@
             '(timestamps are preserved)')
     ];
     if (children.isEmpty) {
-      children = [
-        navBar([new NavNotifyElement(_notifications, queue: _r.queue)]),
+      children = <Element>[
+        navBar(
+            <Element>[new NavNotifyElement(_notifications, queue: _r.queue)]),
         _content,
         new DivElement()
           ..classes = ['iframe']
-          ..children = [_frame]
+          ..children = <Element>[_frame]
       ];
     }
   }
@@ -162,7 +163,7 @@
     return [
       new SpanElement()
         ..classes = ['tab_buttons']
-        ..children = [
+        ..children = <Element>[
           new ButtonElement()
             ..text = 'Frame View'
             ..title = 'Logical view of the computation involved in each frame\n'
@@ -206,7 +207,8 @@
   Future _refresh() async {
     _flags = await _repository.getFlags(vm);
     _r.dirty();
-    final params = new Map.from(await _repository.getIFrameParams(vm));
+    final params =
+        new Map<String, dynamic>.from(await _repository.getIFrameParams(vm));
     return _postMessage('refresh', params);
   }
 
diff --git a/runtime/observatory/lib/src/elements/timeline_page.dart b/runtime/observatory/lib/src/elements/timeline_page.dart
index 608a789..5a51145 100644
--- a/runtime/observatory/lib/src/elements/timeline_page.dart
+++ b/runtime/observatory/lib/src/elements/timeline_page.dart
@@ -51,7 +51,7 @@
     assert(events != null);
     assert(notifications != null);
     TimelinePageElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<TimelinePageElement>(e, queue: queue);
     e._vm = vm;
     e._repository = repository;
     e._events = events;
@@ -72,7 +72,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   IFrameElement _frame;
@@ -88,16 +88,16 @@
     if (_content == null) {
       _content = new DivElement()..classes = ['content-centered-big'];
     }
-    _content.children = [
+    _content.children = <Element>[
       new HeadingElement.h1()..text = 'Timeline settings',
       _recorder == null
           ? (new DivElement()..text = 'Loading...')
           : (new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Recorder:',
@@ -107,7 +107,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Recorded Streams Profile:',
@@ -117,20 +117,21 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'Recorded Streams:',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children =
-                        _availableStreams.map(_makeStreamToggle).toList()
+                    ..children = _availableStreams
+                        .map<Element>(_makeStreamToggle)
+                        .toList()
                 ]
             ])
     ];
 
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(vm, _events, queue: _r.queue),
         navMenu('timeline', link: Uris.timeline()),
@@ -175,7 +176,7 @@
     if (_recorder.name == "Fuchsia") {
       return new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new BRElement(),
           new SpanElement()
             ..text =
@@ -191,7 +192,7 @@
     if (_recorder.name == "Systrace") {
       return new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new BRElement(),
           new SpanElement()
             ..text =
@@ -206,14 +207,14 @@
 
     return new DivElement()
       ..classes = ['iframe']
-      ..children = [_frame];
+      ..children = <Element>[_frame];
   }
 
   List<Element> _createProfileSelect() {
     return [
       new SpanElement()
         ..children = (_profiles.expand((profile) {
-          return [
+          return <Element>[
             new ButtonElement()
               ..text = profile.name
               ..onClick.listen((_) {
@@ -227,7 +228,8 @@
   }
 
   Future _refresh() async {
-    final params = new Map.from(await _repository.getIFrameParams(vm));
+    final params =
+        new Map<String, dynamic>.from(await _repository.getIFrameParams(vm));
     return _postMessage('refresh', params);
   }
 
diff --git a/runtime/observatory/lib/src/elements/token_stream_ref.dart b/runtime/observatory/lib/src/elements/token_stream_ref.dart
index 7bb2364..042195d 100644
--- a/runtime/observatory/lib/src/elements/token_stream_ref.dart
+++ b/runtime/observatory/lib/src/elements/token_stream_ref.dart
@@ -27,7 +27,7 @@
     assert(isolate != null);
     assert(token != null);
     TokenStreamRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<TokenStreamRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._token = token;
     return e;
@@ -45,14 +45,14 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
     final text = (_token.name == null || _token.name == '')
         ? 'TokenStream'
         : _token.name;
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _token))
         ..text = text
     ];
diff --git a/runtime/observatory/lib/src/elements/top_retaining_instances.dart b/runtime/observatory/lib/src/elements/top_retaining_instances.dart
index 8c3cf8f..4d63dde 100644
--- a/runtime/observatory/lib/src/elements/top_retaining_instances.dart
+++ b/runtime/observatory/lib/src/elements/top_retaining_instances.dart
@@ -43,7 +43,8 @@
     assert(topRetainingInstances != null);
     assert(objects != null);
     TopRetainingInstancesElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r =
+        new RenderingScheduler<TopRetainingInstancesElement>(e, queue: queue);
     e._isolate = isolate;
     e._cls = cls;
     e._topRetainingInstances = topRetainingInstances;
@@ -62,14 +63,14 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new CurlyBlockElement(expanded: _expanded, queue: _r.queue)
-        ..content = [
+        ..content = <Element>[
           new DivElement()
             ..classes = ['memberList']
             ..children = _createContent()
@@ -96,15 +97,15 @@
       return [new SpanElement()..text = 'Loading...'];
     }
     return _topRetaining
-        .map((r) => new DivElement()
+        .map<Element>((r) => new DivElement()
           ..classes = ['memberItem']
-          ..children = [
+          ..children = <Element>[
             new DivElement()
               ..classes = ['memberName']
               ..text = '${Utils.formatSize(r.retainedSize)} ',
             new DivElement()
               ..classes = ['memberValue']
-              ..children = [
+              ..children = <Element>[
                 anyRef(_isolate, r.object, _objects, queue: _r.queue)
               ]
           ])
diff --git a/runtime/observatory/lib/src/elements/type_arguments_ref.dart b/runtime/observatory/lib/src/elements/type_arguments_ref.dart
index 46a254b..f29e560 100644
--- a/runtime/observatory/lib/src/elements/type_arguments_ref.dart
+++ b/runtime/observatory/lib/src/elements/type_arguments_ref.dart
@@ -28,7 +28,7 @@
     assert(isolate != null);
     assert(args != null);
     TypeArgumentsRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<TypeArgumentsRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._arguments = args;
     return e;
@@ -46,14 +46,14 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
     final text = (_arguments.name == null || _arguments.name == '')
         ? 'TypeArguments'
         : _arguments.name;
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _arguments))
         ..text = text
     ];
diff --git a/runtime/observatory/lib/src/elements/unknown_ref.dart b/runtime/observatory/lib/src/elements/unknown_ref.dart
index d5723c4..ff287c0 100644
--- a/runtime/observatory/lib/src/elements/unknown_ref.dart
+++ b/runtime/observatory/lib/src/elements/unknown_ref.dart
@@ -28,7 +28,7 @@
     assert(isolate != null);
     assert(obj != null);
     UnknownObjectRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<UnknownObjectRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._obj = obj;
     return e;
@@ -46,11 +46,11 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _obj))
         ..classes = ['emphasize']
         ..text = _obj.vmType
diff --git a/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart b/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart
index 394feb2..02a4434 100644
--- a/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart
+++ b/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart
@@ -28,7 +28,7 @@
     assert(isolate != null);
     assert(unlinkedcall != null);
     UnlinkedCallRefElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<UnlinkedCallRefElement>(e, queue: queue);
     e._isolate = isolate;
     e._unlinkedcall = unlinkedcall;
     return e;
@@ -46,13 +46,13 @@
   void detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement(href: Uris.inspect(_isolate, object: _unlinkedcall))
-        ..children = [
+        ..children = <Element>[
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'UnlinkedCall',
diff --git a/runtime/observatory/lib/src/elements/unlinkedcall_view.dart b/runtime/observatory/lib/src/elements/unlinkedcall_view.dart
index 3a5539f..d46f170 100644
--- a/runtime/observatory/lib/src/elements/unlinkedcall_view.dart
+++ b/runtime/observatory/lib/src/elements/unlinkedcall_view.dart
@@ -79,7 +79,7 @@
     assert(retainingPaths != null);
     assert(objects != null);
     UnlinkedCallViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<UnlinkedCallViewElement>(e, queue: queue);
     e._vm = vm;
     e._isolate = isolate;
     e._events = events;
@@ -106,12 +106,12 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
   }
 
   void render() {
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
@@ -127,7 +127,7 @@
       ]),
       new DivElement()
         ..classes = ['content-centered-big']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h2()..text = 'UnlinkedCall',
           new HRElement(),
           new ObjectCommonElement(_isolate, _unlinkedcall, _retainedSizes,
@@ -135,10 +135,10 @@
               queue: _r.queue),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'selector',
@@ -148,13 +148,13 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'argumentsDescriptor',
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       _unlinkedcall.argumentsDescriptor == null
                           ? (new SpanElement()..text = '<none>')
                           : anyRef(_isolate, _unlinkedcall.argumentsDescriptor,
diff --git a/runtime/observatory/lib/src/elements/view_footer.dart b/runtime/observatory/lib/src/elements/view_footer.dart
index cd8cd94..a1a039b 100644
--- a/runtime/observatory/lib/src/elements/view_footer.dart
+++ b/runtime/observatory/lib/src/elements/view_footer.dart
@@ -18,7 +18,7 @@
 
   factory ViewFooterElement({RenderingQueue queue}) {
     ViewFooterElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<ViewFooterElement>(e, queue: queue);
     return e;
   }
 
@@ -33,12 +33,12 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement()
         ..href = 'https://dart-lang.github.io/observatory/'
         ..text = 'View documentation',
diff --git a/runtime/observatory/lib/src/elements/vm_connect.dart b/runtime/observatory/lib/src/elements/vm_connect.dart
index 30dd852..d6036df 100644
--- a/runtime/observatory/lib/src/elements/vm_connect.dart
+++ b/runtime/observatory/lib/src/elements/vm_connect.dart
@@ -46,7 +46,7 @@
     assert(notifications != null);
     assert(targets != null);
     VMConnectElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<VMConnectElement>(e, queue: queue);
     e._address = address;
     e._loadDump = loadDump;
     e._notifications = notifications;
@@ -66,7 +66,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
     _targetsSubscription.cancel();
   }
@@ -74,30 +74,30 @@
   void render() {
     final host = window.location.hostname;
     final port = window.location.port;
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavNotifyElement(_notifications, queue: _r.queue)
       ]),
       new DivElement()
         ..classes = ['content-centered']
-        ..children = [
+        ..children = <Element>[
           new HeadingElement.h1()..text = 'Connect to a Dart VM',
           new HRElement(),
           new BRElement(),
           new DivElement()
             ..classes = ['flex-row']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['flex-item-40-percent']
-                ..children = [
+                ..children = <Element>[
                   new HeadingElement.h2()..text = 'Connect over WebSocket',
                   new BRElement(),
                   new UListElement()
-                    ..children = _targets.list().map((target) {
+                    ..children = _targets.list().map<Element>((target) {
                       final bool current = _targets.isConnectedVMTarget(target);
                       return new LIElement()
-                        ..children = [
+                        ..children = <Element>[
                           new VMConnectTargetElement(target,
                               current: current, queue: _r.queue)
                             ..onConnect.listen(_connect)
@@ -107,7 +107,7 @@
                   new HRElement(),
                   new FormElement()
                     ..autocomplete = 'on'
-                    ..children = [
+                    ..children = <Element>[
                       _createAddressBox(),
                       new SpanElement()..text = ' ',
                       new ButtonElement()
@@ -126,7 +126,7 @@
               new DivElement()..classes = ['flex-item-20-percent'],
               new DivElement()
                 ..classes = ['flex-item-40-percent']
-                ..children = [
+                ..children = <Element>[
                   new HeadingElement.h2()..text = 'View crash dump',
                   new BRElement(),
                   _createCrushDumpLoader(),
diff --git a/runtime/observatory/lib/src/elements/vm_connect_target.dart b/runtime/observatory/lib/src/elements/vm_connect_target.dart
index 6cd7b6a..2a2dd81 100644
--- a/runtime/observatory/lib/src/elements/vm_connect_target.dart
+++ b/runtime/observatory/lib/src/elements/vm_connect_target.dart
@@ -39,7 +39,7 @@
     assert(target != null);
     assert(current != null);
     VMConnectTargetElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<VMConnectTargetElement>(e, queue: queue);
     e._target = target;
     e._current = current;
     return e;
@@ -56,7 +56,7 @@
   @override
   void detached() {
     super.detached();
-    children = [];
+    children = <Element>[];
     _r.disable(notify: true);
   }
 
@@ -69,7 +69,7 @@
   }
 
   void render() {
-    children = [
+    children = <Element>[
       new AnchorElement()
         ..text = current ? '${target.name} (Connected)' : '${target.name}'
         ..onClick.where(_filter).map(_toEvent).listen(_connect),
diff --git a/runtime/observatory/lib/src/elements/vm_view.dart b/runtime/observatory/lib/src/elements/vm_view.dart
index c02ef47..4e79116 100644
--- a/runtime/observatory/lib/src/elements/vm_view.dart
+++ b/runtime/observatory/lib/src/elements/vm_view.dart
@@ -61,7 +61,7 @@
     assert(isolates != null);
     assert(scripts != null);
     VMViewElement e = document.createElement(tag.name);
-    e._r = new RenderingScheduler(e, queue: queue);
+    e._r = new RenderingScheduler<VMViewElement>(e, queue: queue);
     e._vm = vm;
     e._vms = vms;
     e._events = events;
@@ -89,7 +89,7 @@
   detached() {
     super.detached();
     _r.disable(notify: true);
-    children = [];
+    children = <Element>[];
     _vmSubscription.cancel();
     _startSubscription.cancel();
     _exitSubscription.cancel();
@@ -98,8 +98,8 @@
   void render() {
     final uptime = new DateTime.now().difference(_vm.startTime);
     final isolates = _vm.isolates.toList();
-    children = [
-      navBar([
+    children = <Element>[
+      navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue),
         new NavVMMenuElement(_vm, _events, queue: _r.queue),
         new NavRefreshElement(queue: _r.queue)
@@ -117,10 +117,10 @@
           new HRElement(),
           new DivElement()
             ..classes = ['memberList']
-            ..children = [
+            ..children = <Element>[
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'name',
@@ -130,7 +130,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'version',
@@ -140,7 +140,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'embedder',
@@ -150,7 +150,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'started at',
@@ -160,7 +160,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'uptime',
@@ -170,7 +170,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'refreshed at',
@@ -180,7 +180,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'pid',
@@ -190,7 +190,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'peak memory',
@@ -202,7 +202,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'current memory',
@@ -214,7 +214,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'native zone memory',
@@ -225,7 +225,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'native heap memory',
@@ -240,7 +240,7 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
                     ..text = 'native heap allocation count',
@@ -253,16 +253,16 @@
               new BRElement(),
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       new SpanElement()..text = 'see ',
                       new AnchorElement(href: Uris.flags())..text = 'flags'
                     ],
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..children = [
+                    ..children = <Element>[
                       new SpanElement()..text = 'view ',
                       new AnchorElement(href: Uris.timeline())
                         ..text = 'timeline'
@@ -270,10 +270,10 @@
                 ],
               new DivElement()
                 ..classes = ['memberItem']
-                ..children = [
+                ..children = <Element>[
                   new DivElement()
                     ..classes = ['memberName']
-                    ..children = [
+                    ..children = <Element>[
                       new SpanElement()..text = 'view ',
                       new AnchorElement(href: Uris.nativeMemory())
                         ..text = 'native memory profile'
@@ -286,10 +286,10 @@
           new UListElement()
             ..classes = ['list-group']
             ..children = isolates
-                .expand((i) => [
+                .expand((i) => <Element>[
                       new LIElement()
                         ..classes = ['list-group-item']
-                        ..children = [
+                        ..children = <Element>[
                           new IsolateSummaryElement(
                               i, _isolates, _events, _scripts,
                               queue: _r.queue)
diff --git a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
index c14bff7b..9b90eaa 100644
--- a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
@@ -136,16 +136,16 @@
 class HeapSnapshotDominatorNode implements M.HeapSnapshotDominatorNode {
   final ObjectVertex v;
   final S.Isolate isolate;
-  S.HeapObject _preloaded;
+  S.ServiceObject _preloaded;
 
   bool get isStack => v.isStack;
 
-  Future<S.HeapObject> get object {
+  Future<S.ServiceObject> get object {
     if (_preloaded != null) {
       return new Future.value(_preloaded);
     } else {
       return isolate.getObjectByAddress(v.address).then((S.ServiceObject obj) {
-        return _preloaded = obj as S.HeapObject;
+        return _preloaded = obj;
       });
     }
   }
diff --git a/runtime/observatory/lib/src/models/objects/field.dart b/runtime/observatory/lib/src/models/objects/field.dart
index 8ac61ee..d0d1221 100644
--- a/runtime/observatory/lib/src/models/objects/field.dart
+++ b/runtime/observatory/lib/src/models/objects/field.dart
@@ -32,7 +32,7 @@
 
 abstract class Field extends Object implements FieldRef {
   /// [optional] The value of this field, if the field is static.
-  InstanceRef get staticValue;
+  ObjectRef get staticValue;
 
   /// [optional] The location of this field in the source code.
   SourceLocation get location;
diff --git a/runtime/observatory/lib/src/repositories/event.dart b/runtime/observatory/lib/src/repositories/event.dart
index dc9b397..39313a9 100644
--- a/runtime/observatory/lib/src/repositories/event.dart
+++ b/runtime/observatory/lib/src/repositories/event.dart
@@ -37,23 +37,44 @@
   final Stream<M.ServiceRegisteredEvent> onServiceRegistered;
   final Stream<M.ServiceUnregisteredEvent> onServiceUnregistered;
 
-  EventRepository() : this._(new StreamController.broadcast());
+  static Stream<T> where<T extends M.Event>(
+      Stream<M.Event> stream, bool predicate(M.Event event)) {
+    var controller = new StreamController<T>.broadcast();
+    stream.listen(
+      (M.Event event) {
+        if (predicate(event)) {
+          controller.add(event as T);
+        }
+      },
+      onError: (error) => controller.addError(error),
+      onDone: () => controller.close(),
+    );
+    return controller.stream;
+  }
 
-  EventRepository._(StreamController controller)
+  EventRepository() : this._(new StreamController<M.Event>.broadcast());
+
+  EventRepository._(StreamController<M.Event> controller)
       : this.__(
             controller,
-            controller.stream.where((e) => e is M.VMEvent),
-            controller.stream.where((e) => e is M.IsolateEvent),
-            controller.stream.where((e) => e is M.DebugEvent),
-            controller.stream.where((e) => e is M.GCEvent),
-            controller.stream.where((e) => e is M.LoggingEvent),
-            controller.stream.where((e) => e is M.ExtensionEvent),
-            controller.stream.where((e) => e is M.TimelineEventsEvent),
-            controller.stream.where((e) => e is M.ConnectionClosedEvent),
-            controller.stream.where((e) => e is M.ServiceEvent));
+            where<M.VMEvent>(controller.stream, (e) => e is M.VMEvent),
+            where<M.IsolateEvent>(
+                controller.stream, (e) => e is M.IsolateEvent),
+            where<M.DebugEvent>(controller.stream, (e) => e is M.DebugEvent),
+            where<M.GCEvent>(controller.stream, (e) => e is M.GCEvent),
+            where<M.LoggingEvent>(
+                controller.stream, (e) => e is M.LoggingEvent),
+            where<M.ExtensionEvent>(
+                controller.stream, (e) => e is M.ExtensionEvent),
+            where<M.TimelineEventsEvent>(
+                controller.stream, (e) => e is M.TimelineEventsEvent),
+            where<M.ConnectionClosedEvent>(
+                controller.stream, (e) => e is M.ConnectionClosedEvent),
+            where<M.ServiceEvent>(
+                controller.stream, (e) => e is M.ServiceEvent));
 
   EventRepository.__(
-      StreamController controller,
+      StreamController<M.Event> controller,
       Stream<M.VMEvent> onVMEvent,
       Stream<M.IsolateEvent> onIsolateEvent,
       Stream<M.DebugEvent> onDebugEvent,
@@ -65,45 +86,52 @@
       Stream<M.ServiceEvent> onServiceEvent)
       : _onEvent = controller,
         onVMEvent = onVMEvent,
-        onVMUpdate = onVMEvent.where((e) => e is M.VMUpdateEvent),
+        onVMUpdate =
+            where<M.VMUpdateEvent>(onVMEvent, (e) => e is M.VMUpdateEvent),
         onIsolateEvent = onIsolateEvent,
-        onIsolateStart = onIsolateEvent.where((e) => e is M.IsolateStartEvent),
-        onIsolateRunnable =
-            onIsolateEvent.where((e) => e is M.IsolateRunnableEvent),
-        onIsolateExit = onIsolateEvent.where((e) => e is M.IsolateExitEvent),
-        onIsolateUpdate =
-            onIsolateEvent.where((e) => e is M.IsolateUpdateEvent),
-        onIsolateReload =
-            onIsolateEvent.where((e) => e is M.IsolateReloadEvent),
-        onServiceExtensionAdded =
-            onIsolateEvent.where((e) => e is M.IsolateReloadEvent),
+        onIsolateStart = where<M.IsolateStartEvent>(
+            onIsolateEvent, (e) => e is M.IsolateStartEvent),
+        onIsolateRunnable = where<M.IsolateRunnableEvent>(
+            onIsolateEvent, (e) => e is M.IsolateRunnableEvent),
+        onIsolateExit = where<M.IsolateExitEvent>(
+            onIsolateEvent, (e) => e is M.IsolateExitEvent),
+        onIsolateUpdate = where<M.IsolateUpdateEvent>(
+            onIsolateEvent, (e) => e is M.IsolateUpdateEvent),
+        onIsolateReload = where<M.IsolateReloadEvent>(
+            onIsolateEvent, (e) => e is M.IsolateReloadEvent),
+        onServiceExtensionAdded = where<M.ServiceExtensionAddedEvent>(
+            onIsolateEvent, (e) => e is M.ServiceExtensionAddedEvent),
         onDebugEvent = onDebugEvent,
-        onPauseStart = onDebugEvent.where((e) => e is M.PauseStartEvent),
-        onPauseExit = onDebugEvent.where((e) => e is M.PauseExitEvent),
-        onPauseBreakpoint =
-            onDebugEvent.where((e) => e is M.PauseBreakpointEvent),
-        onPauseInterrupted =
-            onDebugEvent.where((e) => e is M.PauseInterruptedEvent),
-        onPauseException =
-            onDebugEvent.where((e) => e is M.PauseExceptionEvent),
-        onResume = onDebugEvent.where((e) => e is M.ResumeEvent),
-        onBreakpointAdded =
-            onDebugEvent.where((e) => e is M.BreakpointAddedEvent),
-        onBreakpointResolved =
-            onDebugEvent.where((e) => e is M.BreakpointResolvedEvent),
-        onBreakpointRemoved =
-            onDebugEvent.where((e) => e is M.BreakpointRemovedEvent),
-        onInspect = onDebugEvent.where((e) => e is M.InspectEvent),
+        onPauseStart = where<M.PauseStartEvent>(
+            onDebugEvent, (e) => e is M.PauseStartEvent),
+        onPauseExit =
+            where<M.PauseExitEvent>(onDebugEvent, (e) => e is M.PauseExitEvent),
+        onPauseBreakpoint = where<M.PauseBreakpointEvent>(
+            onDebugEvent, (e) => e is M.PauseBreakpointEvent),
+        onPauseInterrupted = where<M.PauseInterruptedEvent>(
+            onDebugEvent, (e) => e is M.PauseInterruptedEvent),
+        onPauseException = where<M.PauseExceptionEvent>(
+            onDebugEvent, (e) => e is M.PauseExceptionEvent),
+        onResume =
+            where<M.ResumeEvent>(onDebugEvent, (e) => e is M.ResumeEvent),
+        onBreakpointAdded = where<M.BreakpointAddedEvent>(
+            onDebugEvent, (e) => e is M.BreakpointAddedEvent),
+        onBreakpointResolved = where<M.BreakpointResolvedEvent>(
+            onDebugEvent, (e) => e is M.BreakpointResolvedEvent),
+        onBreakpointRemoved = where<M.BreakpointRemovedEvent>(
+            onDebugEvent, (e) => e is M.BreakpointRemovedEvent),
+        onInspect =
+            where<M.InspectEvent>(onDebugEvent, (e) => e is M.InspectEvent),
         onGCEvent = onGCEvent,
         onLoggingEvent = onLoggingEvent,
         onExtensionEvent = onExtensionEvent,
         onTimelineEvents = onTimelineEvents,
         onConnectionClosed = onConnectionClosed,
         onServiceEvent = onServiceEvent,
-        onServiceRegistered =
-            onServiceEvent.where((e) => e is M.ServiceRegisteredEvent),
-        onServiceUnregistered =
-            onServiceEvent.where((e) => e is M.ServiceUnregisteredEvent);
+        onServiceRegistered = where<M.ServiceRegisteredEvent>(
+            onServiceEvent, (e) => e is M.ServiceRegisteredEvent),
+        onServiceUnregistered = where<M.ServiceUnregisteredEvent>(
+            onServiceEvent, (e) => e is M.ServiceUnregisteredEvent);
 
   void add(M.Event e) {
     _onEvent.add(e);
diff --git a/runtime/observatory/lib/src/repositories/flag.dart b/runtime/observatory/lib/src/repositories/flag.dart
index 0a080d2..a3db15d 100644
--- a/runtime/observatory/lib/src/repositories/flag.dart
+++ b/runtime/observatory/lib/src/repositories/flag.dart
@@ -22,8 +22,11 @@
   FlagsRepository(this.vm);
 
   Future<Iterable<Flag>> list() async {
-    List<Map> flags = ((await vm.getFlagList()) as S.ServiceMap)['flags'];
-    return flags.map(_toFlag);
+    var result = new List<Flag>();
+    for (var map in ((await vm.getFlagList()) as S.ServiceMap)['flags']) {
+      result.add(_toFlag(map));
+    }
+    return result;
   }
 
   static Flag _toFlag(Map map) {
diff --git a/runtime/observatory/lib/src/repositories/target.dart b/runtime/observatory/lib/src/repositories/target.dart
index 56c6246..245542d 100644
--- a/runtime/observatory/lib/src/repositories/target.dart
+++ b/runtime/observatory/lib/src/repositories/target.dart
@@ -51,7 +51,7 @@
     _store();
   }
 
-  Iterable<SC.WebSocketVMTarget> list() => _list;
+  Iterable<M.Target> list() => _list.toList();
 
   void setCurrent(M.Target t) {
     SC.WebSocketVMTarget target = t as SC.WebSocketVMTarget;
@@ -85,7 +85,9 @@
     if (loaded == null) {
       return;
     }
-    _list.addAll(loaded.map((i) => new SC.WebSocketVMTarget.fromMap(i)));
+    for (var i in loaded) {
+      _list.add(new SC.WebSocketVMTarget.fromMap(i));
+    }
     _list.sort((SC.WebSocketVMTarget a, SC.WebSocketVMTarget b) {
       return b.lastConnectionTime.compareTo(a.lastConnectionTime);
     });
diff --git a/runtime/observatory/lib/src/sample_profile/sample_profile.dart b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
index a06e5e7..ebc625a 100644
--- a/runtime/observatory/lib/src/sample_profile/sample_profile.dart
+++ b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
@@ -889,13 +889,13 @@
         }
 
         tries['exclusiveCodeTrie'] =
-            new Uint32List.fromList(profile['exclusiveCodeTrie']);
+            new Uint32List.fromList(profile['exclusiveCodeTrie'].cast<int>());
         tries['inclusiveCodeTrie'] =
-            new Uint32List.fromList(profile['inclusiveCodeTrie']);
-        tries['exclusiveFunctionTrie'] =
-            new Uint32List.fromList(profile['exclusiveFunctionTrie']);
-        tries['inclusiveFunctionTrie'] =
-            new Uint32List.fromList(profile['inclusiveFunctionTrie']);
+            new Uint32List.fromList(profile['inclusiveCodeTrie'].cast<int>());
+        tries['exclusiveFunctionTrie'] = new Uint32List.fromList(
+            profile['exclusiveFunctionTrie'].cast<int>());
+        tries['inclusiveFunctionTrie'] = new Uint32List.fromList(
+            profile['inclusiveFunctionTrie'].cast<int>());
       } finally {
         progress.close();
       }
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index df03ab5..b6f6fe3 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -106,7 +106,7 @@
 }
 
 /// A [ServiceObject] represents a persistent object within the vm.
-abstract class ServiceObject {
+abstract class ServiceObject implements M.ObjectRef {
   static int LexicalSortName(ServiceObject o1, ServiceObject o2) {
     return o1.name.compareTo(o2.name);
   }
@@ -1173,17 +1173,18 @@
   final Iterable<InboundReference> elements;
 
   InboundReferences(ServiceMap map)
-      : this.elements =
-            map['references'].map((rmap) => new InboundReference(rmap));
+      : this.elements = map['references']
+            .map<InboundReference>((rmap) => new InboundReference(rmap))
+            .toList();
 }
 
 class InboundReference implements M.InboundReference {
-  final HeapObject source;
+  final ServiceObject /*HeapObject*/ source;
   final Instance parentField;
   final int parentListIndex;
   final int parentWordOffset;
 
-  InboundReference(ServiceMap map)
+  InboundReference(Map map)
       : source = map['source'],
         parentField = map['parentField'],
         parentListIndex = map['parentListIndex'],
@@ -1194,17 +1195,18 @@
   final Iterable<RetainingPathItem> elements;
 
   RetainingPath(ServiceMap map)
-      : this.elements =
-            map['elements'].map((rmap) => new RetainingPathItem(rmap));
+      : this.elements = map['elements']
+            .map<RetainingPathItem>((rmap) => new RetainingPathItem(rmap))
+            .toList();
 }
 
 class RetainingPathItem implements M.RetainingPathItem {
-  final HeapObject source;
+  final ServiceObject /*HeapObject*/ source;
   final Instance parentField;
   final int parentListIndex;
   final int parentWordOffset;
 
-  RetainingPathItem(ServiceMap map)
+  RetainingPathItem(Map map)
       : source = map['value'],
         parentField = map['parentField'],
         parentListIndex = map['parentListIndex'],
@@ -1215,7 +1217,8 @@
   final Iterable<Port> elements;
 
   Ports(ServiceMap map)
-      : this.elements = map['ports'].map((rmap) => new Port(rmap));
+      : this.elements =
+            map['ports'].map<Port>((rmap) => new Port(rmap)).toList();
 }
 
 class Port implements M.Port {
@@ -1232,10 +1235,12 @@
   final Iterable<WeakPersistentHandle> weakElements;
 
   PersistentHandles(ServiceMap map)
-      : this.elements =
-            map['persistentHandles'].map((rmap) => new PersistentHandle(rmap)),
+      : this.elements = map['persistentHandles']
+            .map<PersistentHandle>((rmap) => new PersistentHandle(rmap))
+            .toList(),
         this.weakElements = map['weakPersistentHandles']
-            .map((rmap) => new WeakPersistentHandle(rmap));
+            .map<WeakPersistentHandle>((rmap) => new WeakPersistentHandle(rmap))
+            .toList();
 }
 
 class PersistentHandle implements M.PersistentHandle {
@@ -1453,7 +1458,7 @@
       // Skip over non-class classes.
       if (cls is Class) {
         _classesByCid[cls.vmCid] = cls;
-        futureClasses.add(cls.load());
+        futureClasses.add(cls.load().then<Class>((_) => cls));
       }
     }
     return Future.wait(futureClasses);
@@ -1982,13 +1987,14 @@
     return invokeRpc('_getInstances', params);
   }
 
-  Future<HeapObject> getObjectByAddress(String address, [bool ref = true]) {
+  Future<ServiceObject /*HeapObject*/ > getObjectByAddress(String address,
+      [bool ref = true]) {
     Map params = {
       'address': address,
       'ref': ref,
     };
     return invokeRpc('_getObjectByAddress', params)
-        .then((result) => result as HeapObject);
+        .then((result) => result as ServiceObject);
   }
 
   final Map<String, ServiceMetric> dartMetrics = <String, ServiceMetric>{};
@@ -2120,21 +2126,22 @@
 }
 
 /// A [DartError] is peered to a Dart Error object.
-class DartError extends ServiceObject implements M.Error {
+class DartError extends HeapObject implements M.Error {
   DartError._empty(ServiceObject owner) : super._empty(owner);
 
   M.ErrorKind kind;
-  final M.ClassRef clazz = null;
-  final int size = null;
   String message;
   Instance exception;
   Instance stacktrace;
 
   void _update(Map map, bool mapIsRef) {
+    _upgradeCollection(map, owner);
+    super._update(map, mapIsRef);
+
     message = map['message'];
     kind = stringToErrorKind(map['kind']);
-    exception = new ServiceObject._fromMap(owner, map['exception']);
-    stacktrace = new ServiceObject._fromMap(owner, map['stacktrace']);
+    exception = map['exception'];
+    stacktrace = map['stacktrace'];
     name = 'DartError($message)';
     vmName = name;
   }
@@ -2925,8 +2932,9 @@
       fields = null;
     }
     if (map['_nativeFields'] != null) {
-      nativeFields =
-          map['_nativeFields'].map((f) => new NativeField(f['value'])).toList();
+      nativeFields = map['_nativeFields']
+          .map<NativeField>((f) => new NativeField(f['value']))
+          .toList();
     } else {
       nativeFields = null;
     }
@@ -2944,7 +2952,7 @@
     }
     if (map['associations'] != null) {
       associations = map['associations']
-          .map((a) => new MapAssociation(a['key'], a['value']))
+          .map<MapAssociation>((a) => new MapAssociation(a['key'], a['value']))
           .toList();
     } else {
       associations = null;
@@ -3309,7 +3317,7 @@
   bool isStatic;
   bool isFinal;
   bool isConst;
-  Instance staticValue;
+  ServiceObject staticValue;
   String name;
   String vmName;
 
@@ -3959,7 +3967,9 @@
     if (mapIsRef) {
       return;
     }
-    entries = map['_entries'].map((map) => new ObjectPoolEntry(map));
+    entries = map['_entries']
+        .map<ObjectPoolEntry>((map) => new ObjectPoolEntry(map))
+        .toList();
   }
 }
 
@@ -3994,7 +4004,8 @@
       return M.ObjectPoolEntryKind.object;
     case 'Immediate':
       return M.ObjectPoolEntryKind.immediate;
-    case 'NativeEntry':
+    case 'NativeFunction':
+    case 'NativeFunctionWrapper':
       return M.ObjectPoolEntryKind.nativeEntry;
   }
   throw new Exception('Unknown ObjectPoolEntryKind ($kind)');
@@ -4119,7 +4130,7 @@
       return;
     }
     count = map['totalCount'];
-    samples = map['samples'];
+    samples = new List<HeapObject>.from(map['samples']);
   }
 }
 
@@ -4302,12 +4313,15 @@
           return;
         }
         // Load the script and then update descriptors.
-        script.load().then(_updateDescriptors);
+        script.load().then((_) => _updateDescriptors(script));
       });
       return;
     }
-    // Load the script and then update descriptors.
-    function.location.script.load().then(_updateDescriptors);
+    {
+      // Load the script and then update descriptors.
+      var script = function.location.script;
+      script.load().then((_) => _updateDescriptors(script));
+    }
   }
 
   /// Reload [this]. Returns a future which completes to [this] or an
@@ -4381,8 +4395,8 @@
     return null;
   }
 
-  void _processInline(List<ServiceFunction> inlinedFunctionsTable,
-      List<List<int>> inlinedIntervals) {
+  void _processInline(List/*<ServiceFunction>*/ inlinedFunctionsTable,
+      List/*<List<int>>*/ inlinedIntervals) {
     for (var i = 0; i < inlinedIntervals.length; i++) {
       var inlinedInterval = inlinedIntervals[i];
       var start = inlinedInterval[0] + startAddress;
@@ -4848,7 +4862,8 @@
 
     assert(response['availableStreams'] != null);
     final List<TimelineStream> streams = response['availableStreams']
-        .map((String name) => new TimelineStream(name, recorded.contains(name)))
+        .map<TimelineStream>((/*String*/ name) =>
+            new TimelineStream(name, recorded.contains(name)))
         .toList();
 
     final List<TimelineProfile> profiles = [
diff --git a/runtime/observatory/lib/utils.dart b/runtime/observatory/lib/utils.dart
index 4167fb5..caace77 100644
--- a/runtime/observatory/lib/utils.dart
+++ b/runtime/observatory/lib/utils.dart
@@ -97,7 +97,7 @@
   }
 
   static String formatSize(bytesDynamic) {
-    int bytes = bytesDynamic;
+    int bytes = bytesDynamic.toInt();
     const int digits = 1;
     const int bytesPerKB = 1024;
     const int bytesPerMB = 1024 * bytesPerKB;
diff --git a/runtime/observatory/pubspec.yaml b/runtime/observatory/pubspec.yaml
new file mode 100644
index 0000000..c1dcd02
--- /dev/null
+++ b/runtime/observatory/pubspec.yaml
@@ -0,0 +1 @@
+name: observatory
diff --git a/runtime/observatory/tests/observatory_ui/curly_block/element_test.dart b/runtime/observatory/tests/observatory_ui/curly_block/element_test.dart
index 69e4063..882f665 100644
--- a/runtime/observatory/tests/observatory_ui/curly_block/element_test.dart
+++ b/runtime/observatory/tests/observatory_ui/curly_block/element_test.dart
@@ -79,7 +79,7 @@
     CurlyBlockElement e;
     setUp(() async {
       e = new CurlyBlockElement();
-      e.content = [document.createElement('content')];
+      e.content = <Element>[document.createElement('content')];
       document.body.append(e);
       await e.onRendered.first;
     });
diff --git a/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.dart b/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.dart
index c622dbe..263ab43 100644
--- a/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.dart
+++ b/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.dart
@@ -20,7 +20,7 @@
   });
   test('elements created after attachment', () async {
     final e = new NavClassMenuElement(i_ref, c_ref);
-    e.content = [document.createElement('content')];
+    e.content = <Element>[document.createElement('content')];
     document.body.append(e);
     await e.onRendered.first;
     expect(e.children.length, isNonZero, reason: 'has elements');
diff --git a/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.dart b/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.dart
index 689af1b..ccb778f 100644
--- a/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.dart
+++ b/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.dart
@@ -27,7 +27,7 @@
     test('created', () async {
       final label = 'custom-label';
       final e = new NavMenuItemElement(label);
-      e.content = [document.createElement('content')];
+      e.content = <Element>[document.createElement('content')];
       document.body.append(e);
       await e.onRendered.first;
       expect(e.children.length, isNonZero, reason: 'has elements');
diff --git a/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.dart b/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.dart
index a15090d..165bfe5 100644
--- a/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.dart
+++ b/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.dart
@@ -16,7 +16,7 @@
   group('elements', () {
     test('created', () async {
       final e = new NavTopMenuElement();
-      e.content = [document.createElement('content')];
+      e.content = <Element>[document.createElement('content')];
       document.body.append(e);
       await e.onRendered.first;
       expect(e.children.length, isNonZero, reason: 'has elements');
diff --git a/runtime/observatory/tests/observatory_ui/observatory_ui.status b/runtime/observatory/tests/observatory_ui/observatory_ui.status
index 22bbc6d..002abb6 100644
--- a/runtime/observatory/tests/observatory_ui/observatory_ui.status
+++ b/runtime/observatory/tests/observatory_ui/observatory_ui.status
@@ -9,25 +9,16 @@
 cpu_profile/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 cpu_profile_table/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 curly_block/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-error_view/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 flag_list/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-general_error/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 icdata_view/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 inbound_references/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 isolate/counter_chart/element_test: CompileTimeError # observatory is not strong clean (Issue 32503)
 isolate/isolate-shared-summary/element_test: CompileTimeError # observatory is not strong clean (Issue 32503)
 isolate_reconnect/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 megamorphiccache_view/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/class-menu/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/isolate-menu/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/library-menu/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/menu-item/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/notify/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 nav/notify_event/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/notify_exception/connection_exception_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/notify_exception/exception_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/refresh/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-nav/top_menu/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
+nav/notify_exception/connection_exception_test: Timeout, RuntimeError # observatory is not strong clean (Issue 32503)
+nav/notify_exception/exception_test: Timeout, RuntimeError # observatory is not strong clean (Issue 32503)
 nav/vm_menu/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 object_common/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 objectpool_view/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
@@ -35,9 +26,7 @@
 persistent_handles_page/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 ports/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 retaining_path/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-script_ref/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 source_link/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
-view_footer/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 vm_connect/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 vm_connect_target/element_test: RuntimeError # observatory is not strong clean (Issue 32503)
 
diff --git a/runtime/observatory/tests/service/break_on_activation_test.dart b/runtime/observatory/tests/service/break_on_activation_test.dart
index 904ce63..1b56913 100644
--- a/runtime/observatory/tests/service/break_on_activation_test.dart
+++ b/runtime/observatory/tests/service/break_on_activation_test.dart
@@ -65,7 +65,7 @@
     valueOfField(String name) async {
       var field = rootLib.variables.singleWhere((v) => v.name == name);
       await field.load();
-      return field.staticValue;
+      return field.staticValue as Instance;
     }
 
     var r1Ref = await valueOfField('r1');
@@ -109,7 +109,7 @@
     valueOfField(String name) async {
       var field = rootLib.variables.singleWhere((v) => v.name == name);
       await field.load();
-      return field.staticValue;
+      return field.staticValue as Instance;
     }
 
     var r1Ref = await valueOfField('r1_named');
@@ -153,7 +153,7 @@
     valueOfField(String name) async {
       var field = rootLib.variables.singleWhere((v) => v.name == name);
       await field.load();
-      return field.staticValue;
+      return field.staticValue as Instance;
     }
 
     var r1Ref = await valueOfField('r1');
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index d961110..ccbe75b 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -69,9 +69,6 @@
 [ $builder_tag == optimization_counter_threshold && $compiler != dartk ]
 pause_on_unhandled_async_exceptions_test: Pass, RuntimeError # Issue 33365
 
-[ $compiler == dart2analyzer && $strong ]
-*: Skip # Issue 28649
-
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
diff --git a/runtime/observatory/tests/service/typed_data_test.dart b/runtime/observatory/tests/service/typed_data_test.dart
index 7c34f32..13dd5ee 100644
--- a/runtime/observatory/tests/service/typed_data_test.dart
+++ b/runtime/observatory/tests/service/typed_data_test.dart
@@ -90,7 +90,7 @@
 
     expectTypedData(name, expectedValue) {
       var variable = lib.variables.singleWhere((v) => v.name == name);
-      var actualValue = variable.staticValue.typedElements;
+      var actualValue = (variable.staticValue as Instance).typedElements;
       if (expectedValue is Int32x4List) {
         expect(actualValue.length, equals(expectedValue.length));
         for (var i = 0; i < actualValue.length; i++) {
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 4dd7760..66ef97f 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -38,7 +38,6 @@
 [ $compiler == dart2analyzer ]
 dart/byte_array_optimized_test: CompileTimeError # int64
 dart/byte_array_test: CompileTimeError # int64
-dart/truncating_ints_test: CompileTimeError # int64
 
 [ $compiler == dart2js ]
 dart/byte_array_optimized_test: Skip # compilers not aware of byte arrays
@@ -57,7 +56,7 @@
 [ $compiler == dartk ]
 cc/DartAPI_New: Fail # Issue #33041
 dart/appjit_cha_deopt_test: SkipSlow # Issue 33266
-dart/redirection_type_shuffling_test/00: RuntimeError
+dart/redirection_type_shuffling_test/00: RuntimeError, Pass
 dart/redirection_type_shuffling_test/none: RuntimeError
 
 [ $compiler != dartk ]
@@ -129,6 +128,14 @@
 cc/Profiler_TrivialRecordAllocation: Skip
 cc/Profiler_TypedArrayAllocation: Skip
 
+[ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && $compiler == dartk && $hot_reload ]
+dart/data_uri_import_test/base64: Crash
+dart/data_uri_import_test/nocharset: Crash
+dart/data_uri_import_test/nomime: Crash
+dart/data_uri_import_test/percentencoded: Crash
+dart/data_uri_import_test/utf16: Crash
+dart/data_uri_import_test/wrongmime: Crash
+
 [ $arch == x64 && $compiler == dartk && $system == windows && $strong ]
 cc/Profiler_BasicSourcePosition: Fail # http://dartbug.com/33224
 cc/Profiler_CodeTicks: Fail # dartbug.com/33337
@@ -145,11 +152,10 @@
 cc/Dart2JSCompileAll: SkipSlow # Timeout.
 
 [ $compiler == dart2analyzer && $strong ]
-*: Skip # Issue 28649
+dart/redirection_type_shuffling_test/00: CompileTimeError
 
 [ $compiler == dartk && $mode == debug && $runtime == vm ]
 cc/PrintJSON: Crash
-cc/Profiler_FunctionInline: Fail
 cc/Service_TokenStream: Crash
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
@@ -213,13 +219,8 @@
 cc/Service_Address: Fail
 cc/Service_Code: Fail
 
-[ $compiler == dartk && $hot_reload ]
-dart/data_uri_import_test/base64: Crash
-dart/data_uri_import_test/nocharset: Crash
-dart/data_uri_import_test/nomime: Crash
-dart/data_uri_import_test/percentencoded: Crash
-dart/data_uri_import_test/utf16: Crash
-dart/data_uri_import_test/wrongmime: Crash
+[ $compiler == dartk && $checked ]
+dart/redirection_type_shuffling_test/00: Pass # Works in --checked mode but not in --strong mode.
 
 [ $compiler == dartk && $strong ]
 cc/DartGeneratedArrayLiteralMessages: Crash # Issue 32190
@@ -358,9 +359,10 @@
 dart/redirection_type_shuffling_test: SkipByDesign # Imports dart:mirrors
 
 [ $hot_reload || $hot_reload_rollback ]
-dart/appjit_determinism_test: Skip # Reload affects determinisim
-dart/script_determinism_test: Skip # We can shutdown an isolate before it reloads.
-dart/slow_path_shared_stub_test: Skip # Too slow with --slow-path-triggers-gc flag and not relevant outside precompiled.
+dart/appjit_cha_deopt_test: SkipByDesign # Cannot reload with URI pointing to app snapshot.
+dart/appjit_determinism_test: SkipByDesign # Reload affects determinisim
+dart/script_determinism_test: SkipByDesign # Cannot reload with URI pointing to script snapshot.
+dart/slow_path_shared_stub_test: SkipSlow # Too slow with --slow-path-triggers-gc flag and not relevant outside precompiled.
 dart/spawn_infinite_loop_test: Skip # We can shutdown an isolate before it reloads.
 dart/spawn_shutdown_test: Skip # We can shutdown an isolate before it reloads.
-dart/stack_overflow_shared_test: Skip # Too slow with --slow-path-triggers-gc flag and not relevant outside precompiled.
+dart/stack_overflow_shared_test: SkipSlow # Too slow with --slow-path-triggers-gc flag and not relevant outside precompiled.
diff --git a/runtime/tools/bin_to_coff.py b/runtime/tools/bin_to_coff.py
new file mode 100644
index 0000000..5d5d9d2
--- /dev/null
+++ b/runtime/tools/bin_to_coff.py
@@ -0,0 +1,238 @@
+#!/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.
+
+import argparse
+from ctypes import create_string_buffer
+from struct import *
+
+# FILE HEADER FLAGS
+FILE_HEADER_RELFLG = 0x1    # No relocation information
+FILE_HEADER_EXEC   = 0x2    # Executable
+FILE_HEADER_LNNO   = 0x4    # No line number information
+FILE_HEADER_LSYMS  = 0x8    # Local symbols removed / not present
+FILE_HEADER_AR32WR = 0x100  # File is 32-bit little endian
+
+# SECTION HEADER FLAGS
+SECTION_HEADER_TEXT = 0x20  # Contains executable code
+SECTION_HEADER_DATA = 0x40  # Contains only initialized data
+SECTION_HEADER_BSS  = 0x80  # Contains uninitialized data
+
+# FILE HEADER FORMAT
+# typedef struct {
+#   unsigned short f_magic;         /* magic number             */
+#   unsigned short f_nscns;         /* number of sections       */
+#   unsigned long  f_timdat;        /* time & date stamp        */
+#   unsigned long  f_symptr;        /* file pointer to symtab   */
+#   unsigned long  f_nsyms;         /* number of symtab entries */
+#   unsigned short f_opthdr;        /* sizeof(optional hdr)     */
+#   unsigned short f_flags;         /* flags                    */
+# } FILHDR;
+FILE_HEADER_FORMAT           = 'HHIIIHH'
+FILE_HEADER_SIZE             = calcsize(FILE_HEADER_FORMAT)
+FILE_HEADER_MAGIC_X64        = 0x8664
+FILE_HEADER_MAGIC_IA32       = 0x014c
+FILE_HEADER_NUM_SECTIONS     = 1
+FILE_HEADER_TIMESTAMP        = 0
+FILE_HEADER_SIZE_OF_OPTIONAL = 0
+FILE_HEADER_FLAGS            = FILE_HEADER_LNNO
+
+# SECTION HEADER FORMAT
+# typedef struct {
+#   char           s_name[8];  /* section name                     */
+#   unsigned long  s_paddr;    /* physical address, aliased s_nlib */
+#   unsigned long  s_vaddr;    /* virtual address                  */
+#   unsigned long  s_size;     /* section size                     */
+#   unsigned long  s_scnptr;   /* file ptr to raw data for section */
+#   unsigned long  s_relptr;   /* file ptr to relocation           */
+#   unsigned long  s_lnnoptr;  /* file ptr to line numbers         */
+#   unsigned short s_nreloc;   /* number of relocation entries     */
+#   unsigned short s_nlnno;    /* number of line number entries    */
+#   unsigned long  s_flags;    /* flags                            */
+# } SCNHDR;
+SECTION_HEADER_FORMAT  = '8sIIIIIIHHI'
+SECTION_HEADER_SIZE    = calcsize(SECTION_HEADER_FORMAT)
+SECTION_NAME_RODATA    = '.rodata'
+SECTION_NAME_TEXT      = '.text'
+SECTION_PADDR          = 0x0
+SECTION_VADDR          = 0x0
+SECTION_RAW_DATA_PTR   = (FILE_HEADER_SIZE + FILE_HEADER_NUM_SECTIONS
+                          * SECTION_HEADER_SIZE)
+SECTION_RELOCATION_PTR = 0x0
+SECTION_LINE_NUMS_PTR  = 0x0
+SECTION_NUM_RELOCATION = 0
+SECTION_NUM_LINE_NUMS  = 0
+
+# SYMBOL TABLE FORMAT
+# typedef struct {
+#   union {
+#     char e_name[8];
+#     struct {
+#       unsigned long e_zeroes;
+#       unsigned long e_offset;
+#     } e;
+#   } e;
+#   unsigned long e_value;
+#   short e_scnum;
+#   unsigned short e_type;
+#   unsigned char e_sclass;
+#   unsigned char e_numaux;
+# } SYMENT;
+SYMBOL_TABLE_ENTRY_SHORT_LEN    = 8
+SYMBOL_TABLE_ENTRY_FORMAT_SHORT = '8sIhHBB'
+SYMBOL_TABLE_ENTRY_FORMAT_LONG  = 'IIIhHBB'
+SYMBOL_TABLE_ENTRY_SIZE         = calcsize(SYMBOL_TABLE_ENTRY_FORMAT_SHORT)
+SYMBOL_TABLE_ENTRY_ZEROS        = 0x0
+SYMBOL_TABLE_ENTRY_SECTION      = 1
+SYMBOL_TABLE_ENTRY_TYPE         = 0
+SYMBOL_TABLE_ENTRY_CLASS        = 2 # External (public) symbol.
+SYMBOL_TABLE_ENTRY_NUM_AUX      = 0 # Number of auxiliary entries.
+
+
+STRING_TABLE_OFFSET = 0x4 # Starting offset for the string table.
+SIZE_FORMAT         = 'I'
+SIZE_LENGTH         = calcsize(SIZE_FORMAT)
+
+def main():
+  parser = argparse.ArgumentParser(description='Generate a COFF file for binary data.')
+  parser.add_argument('--input', dest='input', help='Path of the input file.')
+  parser.add_argument('--output', dest='output', help='Name of the output file.')
+  parser.add_argument('--symbol_name', dest='symbol_name', help='Name of the symbol for the binary data')
+  parser.add_argument('--size_symbol_name', dest='size_name', help='Name of the symbol for the size of the binary data')
+  parser.add_argument('--64-bit', dest='use_64_bit', action='store_true', default=False)
+  parser.add_argument('--executable', dest='executable', action='store_true', default=False)
+
+  args = parser.parse_args()
+
+  with open(args.input, 'rb') as f:
+    section_data = f.read()
+
+  # We need to calculate the following to determine the size of our buffer:
+  #   1) Size of the data
+  #   2) Total length of the symbol strings which are over 8 characters
+
+  section_size = len(section_data)
+  includes_size_name = (args.size_name != None)
+
+  # Symbols on x86 are prefixed with '_'
+  symbol_prefix = '' if args.use_64_bit else '_'
+  num_symbols = 2 if includes_size_name else 1
+  symbol_name = symbol_prefix + args.symbol_name
+  size_symbol_name = None
+  if (includes_size_name):
+    size_symbol = args.size_name if args.size_name else args.symbol_name + "Size"
+    size_symbol_name = symbol_prefix + size_symbol
+
+  # The symbol table is directly after the data section
+  symbol_table_ptr = (FILE_HEADER_SIZE + SECTION_HEADER_SIZE + section_size + SIZE_LENGTH)
+  string_table_len = 0
+
+  # Symbols longer than 8 characters have their string representations stored
+  # in the string table.
+  long_symbol_name = False
+  long_size_symbol_name = False
+  if (len(symbol_name) > SYMBOL_TABLE_ENTRY_SHORT_LEN):
+    string_table_len += len(symbol_name) + 1
+    long_symbol_name = True
+
+  if (includes_size_name and (len(size_symbol_name) > SYMBOL_TABLE_ENTRY_SHORT_LEN)):
+    string_table_len += len(size_symbol_name) + 1
+    long_size_symbol_name = True
+
+  # Create the buffer and start building.
+  offset = 0
+  buff = create_string_buffer(FILE_HEADER_SIZE + SECTION_HEADER_SIZE +
+                              section_size + num_symbols *
+                              SYMBOL_TABLE_ENTRY_SIZE + 2 * SIZE_LENGTH +
+                              string_table_len)
+
+  FILE_HEADER_MAGIC = FILE_HEADER_MAGIC_X64 if args.use_64_bit else FILE_HEADER_MAGIC_IA32
+
+  # Populate the file header. Basically constant except for the pointer to the
+  # beginning of the symbol table.
+  pack_into(FILE_HEADER_FORMAT, buff, offset,
+       FILE_HEADER_MAGIC, FILE_HEADER_NUM_SECTIONS,
+       FILE_HEADER_TIMESTAMP, symbol_table_ptr,
+       num_symbols, FILE_HEADER_SIZE_OF_OPTIONAL,
+       FILE_HEADER_FLAGS)
+  offset += FILE_HEADER_SIZE
+
+  section_name = SECTION_NAME_RODATA
+  section_type = SECTION_HEADER_DATA
+  if args.executable:
+    section_name = SECTION_NAME_TEXT
+    section_type = SECTION_HEADER_TEXT
+
+  # Populate the section header for a single section.
+  pack_into(SECTION_HEADER_FORMAT, buff, offset,
+      section_name, SECTION_PADDR, SECTION_VADDR,
+      section_size + SIZE_LENGTH, SECTION_RAW_DATA_PTR, SECTION_RELOCATION_PTR,
+      SECTION_LINE_NUMS_PTR, SECTION_NUM_RELOCATION,
+      SECTION_NUM_LINE_NUMS, section_type)
+  offset += SECTION_HEADER_SIZE
+
+  # Copy the binary data.
+  buff[offset:offset + section_size] = section_data
+  offset += section_size
+
+  # Append the size of the section.
+  pack_into(SIZE_FORMAT, buff, offset, section_size)
+  offset += SIZE_LENGTH
+
+  # Build the symbol table. If a symbol name is 8 characters or less, it's
+  # placed directly in the symbol table. If not, it's entered in the string
+  # table immediately after the symbol table.
+
+  string_table_offset = STRING_TABLE_OFFSET
+  if long_symbol_name:
+    pack_into(SYMBOL_TABLE_ENTRY_FORMAT_LONG, buff, offset,
+      SYMBOL_TABLE_ENTRY_ZEROS, string_table_offset, 0x0,
+      SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
+      SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+    string_table_offset += len(symbol_name) + 1
+  else:
+    pack_into(SYMBOL_TABLE_ENTRY_FORMAT_SHORT, buff, offset,
+      symbol_name, 0x0,
+      SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
+      SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+  offset += SYMBOL_TABLE_ENTRY_SIZE
+
+  if includes_size_name:
+    # The size symbol table entry actually contains the value for the size.
+    if long_size_symbol_name:
+      pack_into(SYMBOL_TABLE_ENTRY_FORMAT_LONG, buff, offset,
+        SYMBOL_TABLE_ENTRY_ZEROS, string_table_offset, section_size,
+        SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
+        SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+    else:
+      pack_into(SYMBOL_TABLE_ENTRY_FORMAT_SHORT, buff, offset,
+        symbol_name, section_size,
+        SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
+        SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+    offset += SYMBOL_TABLE_ENTRY_SIZE
+
+  pack_into(SIZE_FORMAT, buff, offset, string_table_len + SIZE_LENGTH)
+  offset += SIZE_LENGTH
+
+  # Populate the string table for any symbols longer than 8 characters.
+  if long_symbol_name:
+    symbol_len = len(symbol_name)
+    buff[offset:offset + symbol_len] = symbol_name
+    offset += symbol_len
+    buff[offset] = '\0'
+    offset += 1
+
+  if includes_size_name and long_size_symbol_name:
+    symbol_len = len(size_symbol_name)
+    buff[offset:offset + symbol_len] = size_symbol_name
+    offset += symbol_len
+    buff[offset] = '\0'
+    offset += 1
+
+  with open(args.output, 'wb') as f:
+    f.write(buff.raw)
+
+if __name__ == '__main__':
+  main()
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index 000f75d..6367411 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -40,9 +40,18 @@
     --true_divergence : only report true divergences
     --mode1           : m1
     --mode2           : m2, and values one of
-        jit = Dart JIT
-        aot = Dart AOT
-        js  = dart2js + JS
+        jit-ia32  = Dart JIT (ia32)
+        jit-x64   = Dart JIT (x64)
+        jit-arm32 = Dart JIT (simarm)
+        jit-arm64 = Dart JIT (simarm64)
+        aot-x64   = Dart AOT (x64)
+        aot-arm64 = Dart AOT (simarm64)
+        js        = dart2js + JS
+
+This fuzzer tool assumes the environment variable 'DART_TOP' points to
+the top of the Dart SDK development tree in which all proper binaries
+have been built already (e.g. testing jit-ia32 will invoke the binary
+${DART_TOP}/out/ReleaseIA32/dart to start the Dart VM).
 
 Background
 ==========
diff --git a/runtime/tools/dartfuzz/run_dartfuzz_test.py b/runtime/tools/dartfuzz/run_dartfuzz_test.py
index 943622b..38b5496 100755
--- a/runtime/tools/dartfuzz/run_dartfuzz_test.py
+++ b/runtime/tools/dartfuzz/run_dartfuzz_test.py
@@ -118,39 +118,85 @@
 class TestRunnerDartJIT(TestRunner):
   """Concrete test runner of Dart JIT."""
 
+  def  __init__(self, mode):
+    self._mode = mode
+    if mode == 'jit-ia32':
+      self.AddPathAndTimeout('ReleaseIA32')
+    elif mode == 'jit-x64':
+      self.AddPathAndTimeout('ReleaseX64')
+    elif mode == 'jit-arm32':
+      self.AddPathAndTimeout('ReleaseSIMARM')
+    elif mode == 'jit-arm64':
+      self.AddPathAndTimeout('ReleaseSIMARM64')
+    else:
+      raise FatalError('Unknown JIT execution mode: ' + mode)
+
   @property
   def description(self):
-    return 'Dart JIT'
+    return 'Dart ' + self._mode
+
+  def AddPathAndTimeout(self, tag, timeout=30):
+    self._env = os.environ.copy()
+    self._env['PATH'] = self._env['DART_TOP'] + '/out/' + tag + ':' + self._env['PATH']
+    self._timeout = timeout
 
   def RunTest(self):
-    return RunCommandWithOutput(['dart', 'fuzz.dart'], None, PIPE, STDOUT)
+    return RunCommandWithOutput(
+        ['dart', 'fuzz.dart'], self._env, PIPE, STDOUT, self._timeout)
 
 class TestRunnerDartAOT(TestRunner):
   """Concrete test runner of Dart AOT."""
 
+  def  __init__(self, mode):
+    self._mode = mode
+    if mode == 'aot-x64':
+      self.AddPathConfigAndTimeout('ReleaseX64')
+    elif mode == 'aot-arm64':
+      self.AddPathConfigAndTimeout('ReleaseSIMARM64', 30 * 60)
+    else:
+      raise FatalError('Unknown AOT execution mode: ' + mode)
+
   @property
   def description(self):
-    return 'Dart AOT'
+    return 'Dart ' + self._mode
+
+  def AddPathConfigAndTimeout(self, tag, timeout=30):
+    self._env = os.environ.copy()
+    self._env['PATH'] = self._env['DART_TOP'] + '/pkg/vm/tool:' + self._env['PATH']
+    self._env['DART_CONFIGURATION'] = tag
+    self._timeout = timeout
 
   def RunTest(self):
     (out, err, retcode) = RunCommandWithOutput(
-        ['precompiler2', 'fuzz.dart', 'snap'], None, PIPE, STDOUT)
+        ['precompiler2', 'fuzz.dart', 'snap'],
+        self._env, PIPE, STDOUT, self._timeout)
     if retcode != RetCode.SUCCESS:
       return (out, err, retcode)
-    return RunCommandWithOutput(['dart_precompiled_runtime2', 'snap'], None, PIPE, STDOUT)
+    return RunCommandWithOutput(
+        ['dart_precompiled_runtime2', 'snap'],
+        self._env, PIPE, STDOUT, self._timeout)
 
 class TestRunnerDart2JS(TestRunner):
   """Concrete test runner of Dart through dart2js and JS."""
 
+  def  __init__(self):
+    self.AddPath()
+
   @property
   def description(self):
     return 'Dart as JS'
 
+  def AddPath(self):
+    self._env = os.environ.copy()
+    self._env['PATH'] = self._env['DART_TOP'] + '/ReleaseX64/dart-sdk/bin:' + self._env['PATH']
+
   def RunTest(self):
-    (out, err, retcode) = RunCommandWithOutput(['dart2js', 'fuzz.dart'], None, PIPE, STDOUT)
+    (out, err, retcode) = RunCommandWithOutput(
+        ['dart2js', 'fuzz.dart'], self._env, PIPE, STDOUT)
     if retcode != RetCode.SUCCESS:
       return (out, err, retcode)
-    return RunCommandWithOutput(['nodejs', 'out.js'], None, PIPE, STDOUT)
+    return RunCommandWithOutput(
+        ['nodejs', 'out.js'], self._env, PIPE, STDOUT)
 
 def GetExecutionModeRunner(mode):
   """Returns a runner for the given execution mode.
@@ -162,13 +208,13 @@
   Raises:
     FatalError: error for unknown execution mode
   """
-  if mode == 'jit':
-    return TestRunnerDartJIT()
-  if mode == 'aot':
-    return TestRunnerDartAOT()
+  if mode.startswith('jit'):
+    return TestRunnerDartJIT(mode)
+  if mode.startswith('aot'):
+    return TestRunnerDartAOT(mode)
   if mode == 'js':
     return TestRunnerDart2JS()
-  raise FatalError('Unknown execution mode')
+  raise FatalError('Unknown execution mode: ' + mode)
 
 #
 # DartFuzzTester class.
@@ -222,6 +268,7 @@
     print('#Tests      :', self._repeat)
     print('Exec-Mode 1 :', self._runner1.description)
     print('Exec-Mode 2 :', self._runner2.description)
+    print('Dart Dev    :', os.environ.get('DART_TOP'))
     print()
     self.ShowStats()  # show all zeros on start
     for self._test in range(1, self._repeat + 1):
@@ -352,12 +399,16 @@
                       help='number of tests to run (default: 1000)')
   parser.add_argument('--true_divergence', default=False, action='store_true',
                       help='only report true divergences')
-  parser.add_argument('--mode1', default='jit',
-                      help='execution mode 1 (default: jit)')
-  parser.add_argument('--mode2', default='aot',
-                      help='execution mode 2 (default: aot)')
+  parser.add_argument('--mode1', default='jit-x64',
+                      help='execution mode 1 (default: jit-x64)')
+  parser.add_argument('--mode2', default='aot-x64',
+                      help='execution mode 2 (default: aot-x64)')
   args = parser.parse_args()
 
+  # Verify DART_TOP.
+  if os.environ.get('DART_TOP') == None:
+    raise FatalError('DART_TOP needs to point to the Dart SDK tree')
+
   # Run DartFuzz tester.
   with DartFuzzTester(args.repeat,
                       args.true_divergence,
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 89d48c3..458ad3e 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -62,7 +62,7 @@
     extra_deps = [
       # TODO(US-399): Remove time_service specific code when it is no longer
       # necessary.
-      "//garnet/public/lib/app/cpp",
+      "//garnet/public/lib/component/cpp",
       "//garnet/public/fidl/fuchsia.timezone",
 
       # TODO(zra): When the platform-specific timeline code is moved out to
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index d180a24..73dc5fb 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1065,9 +1065,6 @@
 // Returns 'true' if regular code generation should be skipped.
 bool FlowGraphCompiler::TryIntrinsify() {
   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.
     //
@@ -1075,9 +1072,7 @@
     // 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);
-      const Field& field = Field::Handle(owner.LookupFieldAllowPrivate(name));
+      const Field& field = Field::Handle(function().accessor_field());
       ASSERT(!field.IsNull());
 
       // Only intrinsify getter if the field cannot contain a mutable double.
@@ -1093,9 +1088,7 @@
     } 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));
+        const Field& field = Field::Handle(function().accessor_field());
         ASSERT(!field.IsNull());
 
         if (field.is_instance() &&
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index c536e9c..0c3a45e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -824,7 +824,6 @@
 //   SP: address of last argument.
 //   FP: caller's frame pointer.
 //   PP: caller's pool pointer.
-//   R9: ic-data.
 //   R4: arguments descriptor array.
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 15e28ee..cf56eec 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -807,7 +807,6 @@
 //   SP: address of last argument.
 //   FP: caller's frame pointer.
 //   PP: caller's pool pointer.
-//   R5: ic-data.
 //   R4: arguments descriptor array.
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 6b3556b..e6b1481 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -916,12 +916,6 @@
                                               const ICData& unary_ic_data) {
   ASSERT(!unary_ic_data.NumberOfChecksIs(0) &&
          (unary_ic_data.NumArgsTested() == 1));
-  if (I->argument_type_checks()) {
-    // Checked mode setters are inlined like normal methods by conventional
-    // inlining.
-    return false;
-  }
-
   ASSERT(instr->HasICData());
   if (unary_ic_data.NumberOfChecksIs(0)) {
     // No type feedback collected.
@@ -940,8 +934,11 @@
     return false;
   }
   // Inline implicit instance setter.
-  const String& field_name =
-      String::Handle(Z, Field::NameFromSetter(instr->function_name()));
+  String& field_name = String::Handle(Z, instr->function_name().raw());
+  if (Function::IsDynamicInvocationForwaderName(field_name)) {
+    field_name = Function::DemangleDynamicInvocationForwarderName(field_name);
+  }
+  field_name = Field::NameFromSetter(field_name);
   const Field& field = Field::ZoneHandle(Z, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
@@ -974,6 +971,62 @@
     }
   }
 
+  // Build an AssertAssignable if necessary.
+  if (I->argument_type_checks()) {
+    const AbstractType& dst_type =
+        AbstractType::ZoneHandle(zone(), field.type());
+
+    // Compute if we need to type check the value. Always type check if
+    // not in strong mode or if at a dynamic invocation.
+    bool needs_check = true;
+    if (I->strong() && !instr->interface_target().IsNull() &&
+        (field.kernel_offset() >= 0)) {
+      bool is_covariant = false;
+      bool is_generic_covariant = false;
+      field.GetCovarianceAttributes(&is_covariant, &is_generic_covariant);
+
+      if (is_covariant) {
+        // Always type check covariant fields.
+        needs_check = true;
+      } else if (is_generic_covariant) {
+        // If field is generic covariant then we don't need to check it
+        // if we know that actual type arguments match static type arguments
+        // e.g. if this is an invocation on this (an instance we are storing
+        // into is also a receiver of a surrounding method).
+        needs_check = !flow_graph_->IsReceiver(instr->ArgumentAt(0));
+      } else {
+        // The rest of the stores are checked statically (we are not at
+        // a dynamic invocation).
+        needs_check = false;
+      }
+    }
+
+    if (needs_check) {
+      Definition* instantiator_type_args = flow_graph_->constant_null();
+      Definition* function_type_args = flow_graph_->constant_null();
+      if (!dst_type.IsInstantiated()) {
+        const Class& owner = Class::Handle(Z, field.Owner());
+        if (owner.NumTypeArguments() > 0) {
+          instantiator_type_args = new (Z) LoadFieldInstr(
+              new (Z) Value(instr->ArgumentAt(0)),
+              NativeFieldDesc::GetTypeArgumentsFieldFor(zone(), owner),
+              instr->token_pos());
+          InsertBefore(instr, instantiator_type_args, instr->env(),
+                       FlowGraph::kValue);
+        }
+      }
+
+      InsertBefore(
+          instr,
+          new (Z) AssertAssignableInstr(
+              instr->token_pos(), new (Z) Value(instr->ArgumentAt(1)),
+              new (Z) Value(instantiator_type_args),
+              new (Z) Value(function_type_args), dst_type,
+              String::ZoneHandle(zone(), field.name()), instr->deopt_id()),
+          instr->env(), FlowGraph::kEffect);
+    }
+  }
+
   // Field guard was detached.
   ASSERT(instr->FirstArgIndex() == 0);
   StoreInstanceFieldInstr* store = new (Z)
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 578dc45..41a61da 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -77,10 +77,14 @@
   "compiler_pass.h",
   "frontend/bytecode_reader.cc",
   "frontend/bytecode_reader.h",
+  "frontend/constant_evaluator.cc",
+  "frontend/constant_evaluator.h",
   "frontend/flow_graph_builder.cc",
   "frontend/flow_graph_builder.h",
   "frontend/kernel_binary_flowgraph.cc",
   "frontend/kernel_binary_flowgraph.h",
+  "frontend/kernel_fingerprints.cc",
+  "frontend/kernel_fingerprints.h",
   "frontend/kernel_to_il.cc",
   "frontend/kernel_to_il.h",
   "frontend/kernel_translation_helper.cc",
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index e32cf14..a257f25 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -38,6 +38,8 @@
 
   TypeTranslator& type_translator_;
   ActiveClass* const active_class_;
+
+  DISALLOW_COPY_AND_ASSIGN(BytecodeMetadataHelper);
 };
 
 }  // namespace kernel
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc
new file mode 100644
index 0000000..b0c1a5a
--- /dev/null
+++ b/runtime/vm/compiler/frontend/constant_evaluator.cc
@@ -0,0 +1,1247 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/frontend/constant_evaluator.h"
+
+#include "vm/compiler/aot/precompiler.h"
+#include "vm/compiler/frontend/kernel_to_il.h"
+#include "vm/compiler/jit/compiler.h"
+#include "vm/dart_entry.h"
+#include "vm/longjump.h"
+#include "vm/object_store.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+namespace dart {
+namespace kernel {
+
+#define Z (zone_)
+#define H (translation_helper_)
+#define T (type_translator_)
+#define I Isolate::Current()
+
+ConstantEvaluator::ConstantEvaluator(KernelReaderHelper* helper,
+                                     TypeTranslator* type_translator,
+                                     ActiveClass* active_class,
+                                     FlowGraphBuilder* flow_graph_builder)
+    : helper_(helper),
+      isolate_(Isolate::Current()),
+      zone_(helper->zone_),
+      translation_helper_(helper->translation_helper_),
+      type_translator_(*type_translator),
+      active_class_(active_class),
+      flow_graph_builder_(flow_graph_builder),
+      script_(helper->script()),
+      result_(Instance::Handle(zone_)) {}
+
+bool ConstantEvaluator::IsCached(intptr_t offset) {
+  return GetCachedConstant(offset, &result_);
+}
+
+RawInstance* ConstantEvaluator::EvaluateExpression(intptr_t offset,
+                                                   bool reset_position) {
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
+  if (!GetCachedConstant(offset, &result_)) {
+    ASSERT(IsAllowedToEvaluate());
+    intptr_t original_offset = helper_->ReaderOffset();
+    helper_->SetOffset(offset);
+    uint8_t payload = 0;
+    Tag tag = helper_->ReadTag(&payload);  // read tag.
+    switch (tag) {
+      case kVariableGet:
+        EvaluateVariableGet(/* is_specialized = */ false);
+        break;
+      case kSpecializedVariableGet:
+        EvaluateVariableGet(/* is_specialized = */ true);
+        break;
+      case kPropertyGet:
+        EvaluatePropertyGet();
+        break;
+      case kDirectPropertyGet:
+        EvaluateDirectPropertyGet();
+        break;
+      case kStaticGet:
+        EvaluateStaticGet();
+        break;
+      case kMethodInvocation:
+        EvaluateMethodInvocation();
+        break;
+      case kDirectMethodInvocation:
+        EvaluateDirectMethodInvocation();
+        break;
+      case kSuperMethodInvocation:
+        EvaluateSuperMethodInvocation();
+        break;
+      case kStaticInvocation:
+      case kConstStaticInvocation:
+        EvaluateStaticInvocation();
+        break;
+      case kConstConstructorInvocation:
+        EvaluateConstructorInvocationInternal();
+        break;
+      case kNot:
+        EvaluateNot();
+        break;
+      case kLogicalExpression:
+        EvaluateLogicalExpression();
+        break;
+      case kConditionalExpression:
+        EvaluateConditionalExpression();
+        break;
+      case kStringConcatenation:
+        EvaluateStringConcatenation();
+        break;
+      case kSymbolLiteral:
+        EvaluateSymbolLiteral();
+        break;
+      case kTypeLiteral:
+        EvaluateTypeLiteral();
+        break;
+      case kAsExpression:
+        EvaluateAsExpression();
+        break;
+      case kConstListLiteral:
+        EvaluateListLiteralInternal();
+        break;
+      case kConstMapLiteral:
+        EvaluateMapLiteralInternal();
+        break;
+      case kLet:
+        EvaluateLet();
+        break;
+      case kInstantiation:
+        EvaluatePartialTearoffInstantiation();
+        break;
+      case kBigIntLiteral:
+        EvaluateBigIntLiteral();
+        break;
+      case kStringLiteral:
+        EvaluateStringLiteral();
+        break;
+      case kSpecializedIntLiteral:
+        EvaluateIntLiteral(payload);
+        break;
+      case kNegativeIntLiteral:
+        EvaluateIntLiteral(true);
+        break;
+      case kPositiveIntLiteral:
+        EvaluateIntLiteral(false);
+        break;
+      case kDoubleLiteral:
+        EvaluateDoubleLiteral();
+        break;
+      case kTrueLiteral:
+        EvaluateBoolLiteral(true);
+        break;
+      case kFalseLiteral:
+        EvaluateBoolLiteral(false);
+        break;
+      case kNullLiteral:
+        EvaluateNullLiteral();
+        break;
+      case kConstantExpression:
+        EvaluateConstantExpression();
+        break;
+      default:
+        H.ReportError(
+            script_, TokenPosition::kNoSource,
+            "Not a constant expression: unexpected kernel tag %s (%" Pd ")",
+            Reader::TagName(tag), tag);
+    }
+
+    CacheConstantValue(offset, result_);
+    if (reset_position) helper_->SetOffset(original_offset);
+  } else {
+    if (!reset_position) {
+      helper_->SetOffset(offset);
+      helper_->SkipExpression();
+    }
+  }
+  return result_.raw();
+}
+
+Instance& ConstantEvaluator::EvaluateListLiteral(intptr_t offset,
+                                                 bool reset_position) {
+  if (!GetCachedConstant(offset, &result_)) {
+    ASSERT(IsAllowedToEvaluate());
+    intptr_t original_offset = helper_->ReaderOffset();
+    helper_->SetOffset(offset);
+    helper_->ReadTag();  // skip tag.
+    EvaluateListLiteralInternal();
+
+    CacheConstantValue(offset, result_);
+    if (reset_position) helper_->SetOffset(original_offset);
+  }
+  // We return a new `ZoneHandle` here on purpose: The intermediate language
+  // instructions do not make a copy of the handle, so we do it.
+  return Instance::ZoneHandle(Z, result_.raw());
+}
+
+Instance& ConstantEvaluator::EvaluateMapLiteral(intptr_t offset,
+                                                bool reset_position) {
+  if (!GetCachedConstant(offset, &result_)) {
+    ASSERT(IsAllowedToEvaluate());
+    intptr_t original_offset = helper_->ReaderOffset();
+    helper_->SetOffset(offset);
+    helper_->ReadTag();  // skip tag.
+    EvaluateMapLiteralInternal();
+
+    CacheConstantValue(offset, result_);
+    if (reset_position) helper_->SetOffset(original_offset);
+  }
+  // We return a new `ZoneHandle` here on purpose: The intermediate language
+  // instructions do not make a copy of the handle, so we do it.
+  return Instance::ZoneHandle(Z, result_.raw());
+}
+
+Instance& ConstantEvaluator::EvaluateConstructorInvocation(
+    intptr_t offset,
+    bool reset_position) {
+  if (!GetCachedConstant(offset, &result_)) {
+    ASSERT(IsAllowedToEvaluate());
+    intptr_t original_offset = helper_->ReaderOffset();
+    helper_->SetOffset(offset);
+    helper_->ReadTag();  // skip tag.
+    EvaluateConstructorInvocationInternal();
+
+    CacheConstantValue(offset, result_);
+    if (reset_position) helper_->SetOffset(original_offset);
+  }
+  // We return a new `ZoneHandle` here on purpose: The intermediate language
+  // instructions do not make a copy of the handle, so we do it.
+  return Instance::ZoneHandle(Z, result_.raw());
+}
+
+RawObject* ConstantEvaluator::EvaluateExpressionSafe(intptr_t offset) {
+  LongJumpScope jump;
+  if (setjmp(*jump.Set()) == 0) {
+    return EvaluateExpression(offset);
+  } else {
+    Thread* thread = H.thread();
+    Error& error = Error::Handle(Z);
+    error = thread->sticky_error();
+    thread->clear_sticky_error();
+    return error.raw();
+  }
+}
+
+bool ConstantEvaluator::IsBuildingFlowGraph() const {
+  return flow_graph_builder_ != nullptr;
+}
+
+bool ConstantEvaluator::IsAllowedToEvaluate() const {
+  return FLAG_precompiled_mode || !IsBuildingFlowGraph() ||
+         !flow_graph_builder_->optimizing_;
+}
+
+void ConstantEvaluator::EvaluateVariableGet(bool is_specialized) {
+  ASSERT(IsBuildingFlowGraph());
+  // When we see a [VariableGet] the corresponding [VariableDeclaration] must've
+  // been executed already. It therefore must have a constant object associated
+  // with it.
+  const TokenPosition position = helper_->ReadPosition();  // read position.
+  const intptr_t variable_kernel_position =
+      helper_->ReadUInt();  // read kernel position.
+  if (!is_specialized) {
+    helper_->ReadUInt();              // read relative variable index.
+    helper_->SkipOptionalDartType();  // read promoted type.
+  }
+  LocalVariable* variable =
+      flow_graph_builder_->LookupVariable(variable_kernel_position);
+  if (!variable->IsConst()) {
+    H.ReportError(script_, position, "Not a constant expression.");
+  }
+  result_ = variable->ConstValue()->raw();
+}
+
+void ConstantEvaluator::EvaluateGetStringLength(intptr_t expression_offset,
+                                                TokenPosition position) {
+  EvaluateExpression(expression_offset);
+  if (result_.IsString()) {
+    const String& str = String::Handle(Z, String::RawCast(result_.raw()));
+    result_ = Integer::New(str.Length(), H.allocation_space());
+  } else {
+    H.ReportError(
+        script_, position,
+        "Constant expressions can only call 'length' on string constants.");
+  }
+}
+
+void ConstantEvaluator::EvaluatePropertyGet() {
+  const TokenPosition position = helper_->ReadPosition();  // read position.
+  intptr_t expression_offset = helper_->ReaderOffset();
+  helper_->SkipExpression();                            // read receiver.
+  StringIndex name = helper_->ReadNameAsStringIndex();  // read name.
+  helper_->SkipCanonicalNameReference();  // read interface_target_reference.
+
+  if (H.StringEquals(name, "length")) {
+    EvaluateGetStringLength(expression_offset, position);
+  } else {
+    H.ReportError(
+        script_, position,
+        "Constant expressions can only call 'length' on string constants.");
+  }
+}
+
+void ConstantEvaluator::EvaluateDirectPropertyGet() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+  intptr_t expression_offset = helper_->ReaderOffset();
+  helper_->SkipExpression();  // read receiver.
+  NameIndex kernel_name =
+      helper_->ReadCanonicalNameReference();  // read target_reference.
+
+  // TODO(vegorov): add check based on the complete canonical name.
+  if (H.IsGetter(kernel_name) &&
+      H.StringEquals(H.CanonicalNameString(kernel_name), "length")) {
+    EvaluateGetStringLength(expression_offset, position);
+  } else {
+    H.ReportError(
+        script_, position,
+        "Constant expressions can only call 'length' on string constants.");
+  }
+}
+
+void ConstantEvaluator::EvaluateStaticGet() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+  NameIndex target =
+      helper_->ReadCanonicalNameReference();  // read target_reference.
+
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
+
+  if (H.IsField(target)) {
+    const Field& field = Field::Handle(Z, H.LookupFieldByKernelField(target));
+    if (!field.is_const()) {
+      H.ReportError(script_, position, "Not a constant field.");
+    }
+    if (field.StaticValue() == Object::transition_sentinel().raw()) {
+      if (IsBuildingFlowGraph()) {
+        flow_graph_builder_->InlineBailout(
+            "kernel::ConstantEvaluator::EvaluateStaticGet::Cyclic");
+      }
+      H.ReportError(script_, position, "Not a constant expression.");
+    } else if (field.StaticValue() == Object::sentinel().raw()) {
+      field.SetStaticValue(Object::transition_sentinel());
+      const Object& value =
+          Object::Handle(Compiler::EvaluateStaticInitializer(field));
+      if (value.IsError()) {
+        field.SetStaticValue(Object::null_instance());
+        H.ReportError(Error::Cast(value), script_, position,
+                      "Not a constant expression.");
+        UNREACHABLE();
+      }
+      Thread* thread = H.thread();
+      const Error& error =
+          Error::Handle(thread->zone(), thread->sticky_error());
+      if (!error.IsNull()) {
+        field.SetStaticValue(Object::null_instance());
+        thread->clear_sticky_error();
+        H.ReportError(error, script_, position, "Not a constant expression.");
+        UNREACHABLE();
+      }
+      ASSERT(value.IsNull() || value.IsInstance());
+      field.SetStaticValue(value.IsNull() ? Instance::null_instance()
+                                          : Instance::Cast(value));
+
+      result_ = field.StaticValue();
+      result_ = H.Canonicalize(result_);
+      field.SetStaticValue(result_, true);
+    } else {
+      result_ = field.StaticValue();
+    }
+  } else if (H.IsProcedure(target)) {
+    const Function& function =
+        Function::ZoneHandle(Z, H.LookupStaticMethodByKernelProcedure(target));
+
+    if (H.IsMethod(target)) {
+      Function& closure_function =
+          Function::ZoneHandle(Z, function.ImplicitClosureFunction());
+      result_ = closure_function.ImplicitStaticClosure();
+      result_ = H.Canonicalize(result_);
+    } else if (H.IsGetter(target)) {
+      H.ReportError(script_, position, "Not a constant expression.");
+    } else {
+      H.ReportError(script_, position, "Not a constant expression.");
+    }
+  }
+}
+
+void ConstantEvaluator::EvaluateMethodInvocation() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+  // This method call wasn't cached, so receiver et al. isn't cached either.
+  const Instance& receiver = Instance::Handle(
+      Z, EvaluateExpression(helper_->ReaderOffset(), false));  // read receiver.
+  Class& klass =
+      Class::Handle(Z, isolate_->class_table()->At(receiver.GetClassId()));
+  ASSERT(!klass.IsNull());
+
+  // Search the superclass chain for the selector.
+  const String& method_name = helper_->ReadNameAsMethodName();  // read name.
+  Function& function =
+      Function::Handle(Z, H.LookupDynamicFunction(klass, method_name));
+
+  // The frontend should guarantee that [MethodInvocation]s inside constant
+  // expressions are always valid.
+  ASSERT(!function.IsNull());
+
+  // Read arguments, run the method and canonicalize the result.
+  const Object& result = RunMethodCall(position, function, &receiver);
+  result_ ^= result.raw();
+  result_ = H.Canonicalize(result_);
+
+  helper_->SkipCanonicalNameReference();  // read interface_target_reference.
+}
+
+void ConstantEvaluator::EvaluateDirectMethodInvocation() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+
+  const Instance& receiver = Instance::Handle(
+      Z, EvaluateExpression(helper_->ReaderOffset(), false));  // read receiver.
+
+  NameIndex kernel_name =
+      helper_->ReadCanonicalNameReference();  // read target_reference.
+
+  const Function& function = Function::ZoneHandle(
+      Z, H.LookupMethodByMember(kernel_name, H.DartProcedureName(kernel_name)));
+
+  // Read arguments, run the method and canonicalize the result.
+  const Object& result = RunMethodCall(position, function, &receiver);
+  result_ ^= result.raw();
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateSuperMethodInvocation() {
+  ASSERT(IsBuildingFlowGraph());
+  TokenPosition position = helper_->ReadPosition();  // read position.
+
+  const LocalVariable* this_variable =
+      flow_graph_builder_->scopes_->this_variable;
+  ASSERT(this_variable->IsConst());
+  const Instance& receiver =
+      Instance::Handle(Z, this_variable->ConstValue()->raw());
+  ASSERT(!receiver.IsNull());
+
+  Class& klass = Class::Handle(Z, active_class_->klass->SuperClass());
+  ASSERT(!klass.IsNull());
+
+  const String& method_name = helper_->ReadNameAsMethodName();  // read name.
+  Function& function =
+      Function::Handle(Z, H.LookupDynamicFunction(klass, method_name));
+
+  // The frontend should guarantee that [MethodInvocation]s inside constant
+  // expressions are always valid.
+  ASSERT(!function.IsNull());
+
+  // Read arguments, run the method and canonicalize the result.
+  const Object& result = RunMethodCall(position, function, &receiver);
+  result_ ^= result.raw();
+  result_ = H.Canonicalize(result_);
+
+  helper_->SkipCanonicalNameReference();  // read interface_target_reference.
+}
+
+void ConstantEvaluator::EvaluateStaticInvocation() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+  NameIndex procedure_reference =
+      helper_->ReadCanonicalNameReference();  // read procedure reference.
+
+  const Function& function = Function::ZoneHandle(
+      Z, H.LookupStaticMethodByKernelProcedure(procedure_reference));
+  Class& klass = Class::Handle(Z, function.Owner());
+
+  intptr_t argument_count =
+      helper_->ReadUInt();  // read arguments part #1: arguments count.
+
+  // Build the type arguments vector (if necessary).
+  const TypeArguments* type_arguments =
+      TranslateTypeArguments(function, &klass);  // read argument types.
+
+  // read positional and named parameters.
+  const Object& result =
+      RunFunction(position, function, argument_count, NULL, type_arguments);
+  result_ ^= result.raw();
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateConstructorInvocationInternal() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+
+  NameIndex target = helper_->ReadCanonicalNameReference();  // read target.
+  const Function& constructor =
+      Function::Handle(Z, H.LookupConstructorByKernelConstructor(target));
+  Class& klass = Class::Handle(Z, constructor.Owner());
+
+  intptr_t argument_count =
+      helper_->ReadUInt();  // read arguments part #1: arguments count.
+
+  // Build the type arguments vector (if necessary).
+  const TypeArguments* type_arguments =
+      TranslateTypeArguments(constructor, &klass);  // read argument types.
+
+  if (klass.NumTypeArguments() > 0 && !klass.IsGeneric()) {
+    Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw());
+    // TODO(27590): Can we move this code into [ReceiverType]?
+    type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type,
+                                         ClassFinalizer::kFinalize);
+    ASSERT(!type.IsMalformedOrMalbounded());
+
+    TypeArguments& canonicalized_type_arguments =
+        TypeArguments::ZoneHandle(Z, type.arguments());
+    canonicalized_type_arguments = canonicalized_type_arguments.Canonicalize();
+    type_arguments = &canonicalized_type_arguments;
+  }
+
+  // Prepare either the instance or the type argument vector for the constructor
+  // call.
+  Instance* receiver = NULL;
+  const TypeArguments* type_arguments_argument = NULL;
+  if (!constructor.IsFactory()) {
+    receiver = &Instance::Handle(Z, Instance::New(klass, Heap::kOld));
+    if (type_arguments != NULL) {
+      receiver->SetTypeArguments(*type_arguments);
+    }
+  } else {
+    type_arguments_argument = type_arguments;
+  }
+
+  // read positional and named parameters.
+  const Object& result = RunFunction(position, constructor, argument_count,
+                                     receiver, type_arguments_argument);
+
+  if (constructor.IsFactory()) {
+    // Factories return the new object.
+    result_ ^= result.raw();
+  } else {
+    ASSERT(!receiver->IsNull());
+    result_ ^= (*receiver).raw();
+  }
+  if (I->obfuscate() &&
+      (result_.clazz() == I->object_store()->symbol_class())) {
+    Obfuscator::ObfuscateSymbolInstance(H.thread(), result_);
+  }
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateNot() {
+  result_ ^= Bool::Get(!EvaluateBooleanExpressionHere()).raw();
+}
+
+void ConstantEvaluator::EvaluateLogicalExpression() {
+  bool left = EvaluateBooleanExpressionHere();  // read left.
+  LogicalOperator op = static_cast<LogicalOperator>(helper_->ReadByte());
+  if (op == kAnd) {
+    if (left) {
+      EvaluateBooleanExpressionHere();  // read right.
+    } else {
+      helper_->SkipExpression();  // read right.
+    }
+  } else {
+    ASSERT(op == kOr);
+    if (!left) {
+      EvaluateBooleanExpressionHere();  // read right.
+    } else {
+      helper_->SkipExpression();  // read right.
+    }
+  }
+}
+
+void ConstantEvaluator::EvaluateAsExpression() {
+  TokenPosition position = helper_->ReadPosition();
+  const uint8_t flags = helper_->ReadFlags();
+  const bool is_type_error = (flags & (1 << 0)) != 0;
+
+  // Check that this AsExpression was inserted by the front-end.
+  if (!is_type_error) {
+    H.ReportError(
+        script_, position,
+        "explicit as operator is not permitted in constant expression");
+  }
+
+  EvaluateExpression(helper_->ReaderOffset(), false);
+
+  const AbstractType& type = T.BuildType();
+  if (!type.IsInstantiated() || type.IsMalformed()) {
+    const String& type_str = String::Handle(type.UserVisibleName());
+    H.ReportError(
+        script_, position,
+        "Not a constant expression: right hand side of an implicit "
+        "as-expression is expected to be an instantiated type, got %s",
+        type_str.ToCString());
+  }
+
+  const TypeArguments& instantiator_type_arguments = TypeArguments::Handle();
+  const TypeArguments& function_type_arguments = TypeArguments::Handle();
+  Error& error = Error::Handle();
+  if (!result_.IsInstanceOf(type, instantiator_type_arguments,
+                            function_type_arguments, &error)) {
+    const AbstractType& rtype =
+        AbstractType::Handle(result_.GetType(Heap::kNew));
+    const String& result_str = String::Handle(rtype.UserVisibleName());
+    const String& type_str = String::Handle(type.UserVisibleName());
+    H.ReportError(
+        script_, position,
+        "Not a constant expression: Type '%s' is not a subtype of type '%s'",
+        result_str.ToCString(), type_str.ToCString());
+  }
+}
+
+void ConstantEvaluator::EvaluateConditionalExpression() {
+  bool condition = EvaluateBooleanExpressionHere();
+  if (condition) {
+    EvaluateExpression(helper_->ReaderOffset(), false);  // read then.
+    helper_->SkipExpression();                           // read otherwise.
+  } else {
+    helper_->SkipExpression();                           // read then.
+    EvaluateExpression(helper_->ReaderOffset(), false);  // read otherwise.
+  }
+  helper_->SkipOptionalDartType();  // read unused static type.
+}
+
+void ConstantEvaluator::EvaluateStringConcatenation() {
+  TokenPosition position = helper_->ReadPosition();  // read position.
+  intptr_t length = helper_->ReadListLength();       // read list length.
+
+  bool all_string = true;
+  const Array& strings =
+      Array::Handle(Z, Array::New(length, H.allocation_space()));
+  for (intptr_t i = 0; i < length; ++i) {
+    EvaluateExpression(helper_->ReaderOffset(),
+                       false);  // read ith expression.
+    strings.SetAt(i, result_);
+    all_string = all_string && result_.IsString();
+  }
+  if (all_string) {
+    result_ = String::ConcatAll(strings, Heap::kOld);
+    result_ = H.Canonicalize(result_);
+  } else {
+    // Get string interpolation function.
+    const Class& cls =
+        Class::Handle(Z, Library::LookupCoreClass(Symbols::StringBase()));
+    ASSERT(!cls.IsNull());
+    const Function& func = Function::Handle(
+        Z, cls.LookupStaticFunction(
+               Library::PrivateCoreLibName(Symbols::Interpolate())));
+    ASSERT(!func.IsNull());
+
+    // Build argument array to pass to the interpolation function.
+    const Array& interpolate_arg = Array::Handle(Z, Array::New(1, Heap::kOld));
+    interpolate_arg.SetAt(0, strings);
+
+    // Run and canonicalize.
+    const Object& result =
+        RunFunction(position, func, interpolate_arg, Array::null_array());
+    result_ = H.Canonicalize(String::Cast(result));
+  }
+}
+
+void ConstantEvaluator::EvaluateSymbolLiteral() {
+  const Class& owner = *active_class_->klass;
+  const Library& lib = Library::Handle(Z, owner.library());
+  String& symbol_value = H.DartIdentifier(lib, helper_->ReadStringReference());
+  const Class& symbol_class =
+      Class::ZoneHandle(Z, I->object_store()->symbol_class());
+  ASSERT(!symbol_class.IsNull());
+  const Function& symbol_constructor = Function::ZoneHandle(
+      Z, symbol_class.LookupConstructor(Symbols::SymbolCtor()));
+  ASSERT(!symbol_constructor.IsNull());
+  result_ ^= EvaluateConstConstructorCall(
+      symbol_class, TypeArguments::Handle(Z), symbol_constructor, symbol_value);
+}
+
+void ConstantEvaluator::EvaluateTypeLiteral() {
+  const AbstractType& type = T.BuildType();
+  if (type.IsMalformed()) {
+    H.ReportError(script_, TokenPosition::kNoSource,
+                  "Malformed type literal in constant expression.");
+  }
+  result_ = type.raw();
+}
+
+void ConstantEvaluator::EvaluateListLiteralInternal() {
+  helper_->ReadPosition();  // read position.
+  const TypeArguments& type_arguments = T.BuildTypeArguments(1);  // read type.
+  intptr_t length = helper_->ReadListLength();  // read list length.
+  const Array& const_list =
+      Array::ZoneHandle(Z, Array::New(length, Heap::kOld));
+  const_list.SetTypeArguments(type_arguments);
+  Instance& expression = Instance::Handle(Z);
+  for (intptr_t i = 0; i < length; ++i) {
+    expression = EvaluateExpression(helper_->ReaderOffset(),
+                                    false);  // read ith expression.
+    const_list.SetAt(i, expression);
+  }
+  const_list.MakeImmutable();
+  result_ = H.Canonicalize(const_list);
+}
+
+void ConstantEvaluator::EvaluateMapLiteralInternal() {
+  helper_->ReadPosition();  // read position.
+  const TypeArguments& type_arguments =
+      T.BuildTypeArguments(2);  // read key type and value type.
+
+  intptr_t length = helper_->ReadListLength();  // read length of entries.
+
+  // This MapLiteral wasn't cached, so content isn't cached either.
+  Array& const_kv_array = Array::Handle(Z, Array::New(2 * length, Heap::kOld));
+  Instance& temp = Instance::Handle(Z);
+  for (intptr_t i = 0; i < length; ++i) {
+    temp = EvaluateExpression(helper_->ReaderOffset(), false);  // read key.
+    const_kv_array.SetAt(2 * i + 0, temp);
+    temp = EvaluateExpression(helper_->ReaderOffset(), false);  // read value.
+    const_kv_array.SetAt(2 * i + 1, temp);
+  }
+
+  const_kv_array.MakeImmutable();
+  const_kv_array ^= H.Canonicalize(const_kv_array);
+
+  const Class& map_class =
+      Class::Handle(Z, Library::LookupCoreClass(Symbols::ImmutableMap()));
+  ASSERT(!map_class.IsNull());
+  ASSERT(map_class.NumTypeArguments() == 2);
+
+  const Field& field =
+      Field::Handle(Z, map_class.LookupInstanceFieldAllowPrivate(
+                           H.DartSymbolObfuscate("_kvPairs")));
+  ASSERT(!field.IsNull());
+
+  // NOTE: This needs to be kept in sync with `runtime/lib/immutable_map.dart`!
+  result_ = Instance::New(map_class, Heap::kOld);
+  ASSERT(!result_.IsNull());
+  result_.SetTypeArguments(type_arguments);
+  result_.SetField(field, const_kv_array);
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateLet() {
+  ASSERT(IsBuildingFlowGraph());
+  intptr_t kernel_position =
+      helper_->ReaderOffset() + helper_->data_program_offset_;
+
+  LocalVariable* local = flow_graph_builder_->LookupVariable(kernel_position);
+
+  // read variable declaration.
+  VariableDeclarationHelper helper(helper_);
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
+  Tag tag = helper_->ReadTag();  // read (first part of) initializer.
+  if (tag == kNothing) {
+    local->SetConstValue(Instance::ZoneHandle(Z, Instance::null()));
+  } else {
+    local->SetConstValue(Instance::ZoneHandle(
+        Z, EvaluateExpression(helper_->ReaderOffset(),
+                              false)));  // read rest of initializer.
+  }
+
+  EvaluateExpression(helper_->ReaderOffset(), false);  // read body
+}
+
+void ConstantEvaluator::EvaluatePartialTearoffInstantiation() {
+  // This method call wasn't cached, so receiver et al. isn't cached either.
+  const Instance& receiver = Instance::Handle(
+      Z, EvaluateExpression(helper_->ReaderOffset(), false));  // read receiver.
+  if (!receiver.IsClosure()) {
+    H.ReportError(script_, TokenPosition::kNoSource, "Expected closure.");
+  }
+  const Closure& old_closure = Closure::Cast(receiver);
+
+  // read type arguments.
+  intptr_t num_type_args = helper_->ReadListLength();
+  const TypeArguments* type_args = &T.BuildTypeArguments(num_type_args);
+
+  // Create new closure with the type arguments inserted, and other things
+  // copied over.
+  Closure& new_closure = Closure::Handle(
+      Z,
+      Closure::New(
+          TypeArguments::Handle(Z, old_closure.instantiator_type_arguments()),
+          TypeArguments::Handle(old_closure.function_type_arguments()),
+          *type_args, Function::Handle(Z, old_closure.function()),
+          Context::Handle(Z, old_closure.context()), Heap::kOld));
+  result_ = H.Canonicalize(new_closure);
+}
+
+void ConstantEvaluator::EvaluateBigIntLiteral() {
+  const String& value =
+      H.DartString(helper_->ReadStringReference());  // read string reference.
+  result_ = Integer::New(value, Heap::kOld);
+  if (result_.IsNull()) {
+    H.ReportError(script_, TokenPosition::kNoSource,
+                  "Integer literal %s is out of range", value.ToCString());
+  }
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateStringLiteral() {
+  result_ = H.DartSymbolPlain(helper_->ReadStringReference())
+                .raw();  // read string reference.
+}
+
+void ConstantEvaluator::EvaluateIntLiteral(uint8_t payload) {
+  int64_t value = static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
+  result_ = Integer::New(value, Heap::kOld);
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateIntLiteral(bool is_negative) {
+  int64_t value = is_negative ? -static_cast<int64_t>(helper_->ReadUInt())
+                              : helper_->ReadUInt();  // read value.
+  result_ = Integer::New(value, Heap::kOld);
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateDoubleLiteral() {
+  result_ = Double::New(helper_->ReadDouble(), Heap::kOld);  // read value.
+  result_ = H.Canonicalize(result_);
+}
+
+void ConstantEvaluator::EvaluateBoolLiteral(bool value) {
+  result_ = Bool::Get(value).raw();
+}
+
+void ConstantEvaluator::EvaluateNullLiteral() {
+  result_ = Instance::null();
+}
+
+void ConstantEvaluator::EvaluateConstantExpression() {
+  KernelConstantsMap constant_map(H.constants().raw());
+  result_ ^= constant_map.GetOrDie(helper_->ReadUInt());
+  ASSERT(constant_map.Release().raw() == H.constants().raw());
+}
+
+// This depends on being about to read the list of positionals on arguments.
+const Object& ConstantEvaluator::RunFunction(TokenPosition position,
+                                             const Function& function,
+                                             intptr_t argument_count,
+                                             const Instance* receiver,
+                                             const TypeArguments* type_args) {
+  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
+  // we should never end up evaluating constants using the VM's constant
+  // evaluator.
+  if (I->strong() && FLAG_precompiled_mode) {
+    UNREACHABLE();
+  }
+
+  // We do not support generic methods yet.
+  ASSERT((receiver == NULL) || (type_args == NULL));
+  intptr_t extra_arguments =
+      (receiver != NULL ? 1 : 0) + (type_args != NULL ? 1 : 0);
+
+  // Build up arguments.
+  const Array& arguments = Array::Handle(
+      Z, Array::New(extra_arguments + argument_count, H.allocation_space()));
+  intptr_t pos = 0;
+  if (receiver != NULL) {
+    arguments.SetAt(pos++, *receiver);
+  }
+  if (type_args != NULL) {
+    arguments.SetAt(pos++, *type_args);
+  }
+
+  // List of positional.
+  intptr_t list_length = helper_->ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    EvaluateExpression(helper_->ReaderOffset(),
+                       false);  // read ith expression.
+    arguments.SetAt(pos++, result_);
+  }
+
+  // List of named.
+  list_length = helper_->ReadListLength();  // read list length.
+  const Array& names =
+      Array::Handle(Z, Array::New(list_length, H.allocation_space()));
+  for (intptr_t i = 0; i < list_length; ++i) {
+    String& name = H.DartSymbolObfuscate(
+        helper_->ReadStringReference());  // read ith name index.
+    names.SetAt(i, name);
+    EvaluateExpression(helper_->ReaderOffset(),
+                       false);  // read ith expression.
+    arguments.SetAt(pos++, result_);
+  }
+
+  return RunFunction(position, function, arguments, names);
+}
+
+const Object& ConstantEvaluator::RunFunction(const TokenPosition position,
+                                             const Function& function,
+                                             const Array& arguments,
+                                             const Array& names) {
+  // We do not support generic methods yet.
+  const int kTypeArgsLen = 0;
+  const Array& args_descriptor = Array::Handle(
+      Z, ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length(), names));
+  const Object& result = Object::Handle(
+      Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
+  if (result.IsError()) {
+    H.ReportError(Error::Cast(result), script_, position,
+                  "error evaluating constant constructor");
+  }
+  return result;
+}
+
+const Object& ConstantEvaluator::RunMethodCall(const TokenPosition position,
+                                               const Function& function,
+                                               const Instance* receiver) {
+  intptr_t argument_count = helper_->ReadUInt();  // read arguments count.
+
+  // TODO(28109) Support generic methods in the VM or reify them away.
+  ASSERT(helper_->PeekListLength() == 0);
+  helper_->SkipListOfDartTypes();  // read list of types.
+
+  // Run the method.
+  return RunFunction(position, function, argument_count, receiver, NULL);
+}
+
+RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
+    const Class& type_class,
+    const TypeArguments& type_arguments,
+    const Function& constructor,
+    const Object& argument) {
+  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
+  // we should never end up evaluating constants using the VM's constant
+  // evaluator.
+  if (I->strong() && FLAG_precompiled_mode) {
+    UNREACHABLE();
+  }
+
+  // Factories have one extra argument: the type arguments.
+  // Constructors have 1 extra arguments: receiver.
+  const int kTypeArgsLen = 0;
+  const int kNumArgs = 1;
+  const int kNumExtraArgs = 1;
+  const int argument_count = kNumArgs + kNumExtraArgs;
+  const Array& arg_values =
+      Array::Handle(Z, Array::New(argument_count, Heap::kOld));
+  Instance& instance = Instance::Handle(Z);
+  if (!constructor.IsFactory()) {
+    instance = Instance::New(type_class, Heap::kOld);
+    if (!type_arguments.IsNull()) {
+      ASSERT(type_arguments.IsInstantiated());
+      instance.SetTypeArguments(
+          TypeArguments::Handle(Z, type_arguments.Canonicalize()));
+    }
+    arg_values.SetAt(0, instance);
+  } else {
+    // Prepend type_arguments to list of arguments to factory.
+    ASSERT(type_arguments.IsZoneHandle());
+    arg_values.SetAt(0, type_arguments);
+  }
+  arg_values.SetAt((0 + kNumExtraArgs), argument);
+  const Array& args_descriptor =
+      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, argument_count,
+                                                Object::empty_array()));
+  const Object& result = Object::Handle(
+      Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
+  ASSERT(!result.IsError());
+  if (constructor.IsFactory()) {
+    // The factory method returns the allocated object.
+    instance ^= result.raw();
+  }
+  if (I->obfuscate() &&
+      (instance.clazz() == I->object_store()->symbol_class())) {
+    Obfuscator::ObfuscateSymbolInstance(H.thread(), instance);
+  }
+  return H.Canonicalize(instance);
+}
+
+const TypeArguments* ConstantEvaluator::TranslateTypeArguments(
+    const Function& target,
+    Class* target_klass) {
+  intptr_t type_count = helper_->ReadListLength();  // read type count.
+
+  const TypeArguments* type_arguments = NULL;
+  if (type_count > 0) {
+    type_arguments = &T.BuildInstantiatedTypeArguments(
+        *target_klass, type_count);  // read types.
+
+    if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) {
+      H.ReportError(script_, TokenPosition::kNoSource,
+                    "Type must be constant in const constructor.");
+    }
+  } else if (target.IsFactory() && type_arguments == NULL) {
+    // All factories take a type arguments vector as first argument (independent
+    // of whether the class is generic or not).
+    type_arguments = &TypeArguments::ZoneHandle(Z, TypeArguments::null());
+  }
+  return type_arguments;
+}
+
+bool ConstantEvaluator::EvaluateBooleanExpressionHere() {
+  EvaluateExpression(helper_->ReaderOffset(), false);
+  AssertBool();
+  return result_.raw() == Bool::True().raw();
+}
+
+bool ConstantEvaluator::GetCachedConstant(intptr_t kernel_offset,
+                                          Instance* value) {
+  if (!IsBuildingFlowGraph()) return false;
+
+  const Function& function = flow_graph_builder_->parsed_function_->function();
+  if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
+    // Don't cache constants in initializer expressions. They get
+    // evaluated only once.
+    return false;
+  }
+
+  bool is_present = false;
+  ASSERT(!script_.InVMHeap());
+  if (script_.compile_time_constants() == Array::null()) {
+    return false;
+  }
+  KernelConstantsMap constants(script_.compile_time_constants());
+  *value ^= constants.GetOrNull(kernel_offset + helper_->data_program_offset_,
+                                &is_present);
+  // Mutator compiler thread may add constants while background compiler
+  // is running, and thus change the value of 'compile_time_constants';
+  // do not assert that 'compile_time_constants' has not changed.
+  constants.Release();
+  if (FLAG_compiler_stats && is_present) {
+    ++H.thread()->compiler_stats()->num_const_cache_hits;
+  }
+  return is_present;
+}
+
+void ConstantEvaluator::CacheConstantValue(intptr_t kernel_offset,
+                                           const Instance& value) {
+  ASSERT(Thread::Current()->IsMutatorThread());
+
+  if (!IsBuildingFlowGraph()) return;
+
+  const Function& function = flow_graph_builder_->parsed_function_->function();
+  if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
+    // Don't cache constants in initializer expressions. They get
+    // evaluated only once.
+    return;
+  }
+  const intptr_t kInitialConstMapSize = 16;
+  ASSERT(!script_.InVMHeap());
+  if (script_.compile_time_constants() == Array::null()) {
+    const Array& array = Array::Handle(
+        HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
+    script_.set_compile_time_constants(array);
+  }
+  KernelConstantsMap constants(script_.compile_time_constants());
+  constants.InsertNewOrGetValue(kernel_offset + helper_->data_program_offset_,
+                                value);
+  script_.set_compile_time_constants(constants.Release());
+}
+
+ConstantHelper::ConstantHelper(Zone* zone,
+                               KernelReaderHelper* helper,
+                               TypeTranslator* type_translator,
+                               ActiveClass* active_class,
+                               NameIndex skip_vmservice_library)
+    : zone_(zone),
+      helper_(*helper),
+      type_translator_(*type_translator),
+      active_class_(active_class),
+      const_evaluator_(helper, type_translator, active_class, nullptr),
+      translation_helper_(helper->translation_helper_),
+      skip_vmservice_library_(skip_vmservice_library),
+      temp_type_(AbstractType::Handle(zone)),
+      temp_type_arguments_(TypeArguments::Handle(zone)),
+      temp_type_arguments2_(TypeArguments::Handle(zone)),
+      temp_type_arguments3_(TypeArguments::Handle(zone)),
+      temp_object_(Object::Handle(zone)),
+      temp_array_(Array::Handle(zone)),
+      temp_instance_(Instance::Handle(zone)),
+      temp_field_(Field::Handle(zone)),
+      temp_class_(Class::Handle(zone)),
+      temp_function_(Function::Handle(zone)),
+      temp_closure_(Closure::Handle(zone)),
+      temp_context_(Context::Handle(zone)),
+      temp_integer_(Integer::Handle(zone)) {}
+
+const Array& ConstantHelper::ReadConstantTable() {
+  const intptr_t number_of_constants = helper_.ReadUInt();
+  if (number_of_constants == 0) {
+    return Array::Handle(Z, Array::null());
+  }
+
+  const Library& corelib = Library::Handle(Z, Library::CoreLibrary());
+  const Class& list_class =
+      Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
+
+  // Eagerly finalize _ImmutableList (instead of doing it on every list
+  // constant).
+  temp_class_ = I->class_table()->At(kImmutableArrayCid);
+  temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
+  ASSERT(temp_object_.IsNull());
+
+  KernelConstantsMap constants(
+      HashTables::New<KernelConstantsMap>(number_of_constants, Heap::kOld));
+
+  const intptr_t start_offset = helper_.ReaderOffset();
+
+  for (intptr_t i = 0; i < number_of_constants; ++i) {
+    const intptr_t offset = helper_.ReaderOffset();
+    const intptr_t constant_tag = helper_.ReadByte();
+    switch (constant_tag) {
+      case kNullConstant:
+        temp_instance_ = Instance::null();
+        break;
+      case kBoolConstant:
+        temp_instance_ = helper_.ReadByte() == 1 ? Object::bool_true().raw()
+                                                 : Object::bool_false().raw();
+        break;
+      case kIntConstant: {
+        temp_instance_ = const_evaluator_.EvaluateExpression(
+            helper_.ReaderOffset(), false /* reset position */);
+        break;
+      }
+      case kDoubleConstant: {
+        temp_instance_ = Double::New(helper_.ReadDouble(), Heap::kOld);
+        temp_instance_ = H.Canonicalize(temp_instance_);
+        break;
+      }
+      case kStringConstant: {
+        temp_instance_ =
+            H.Canonicalize(H.DartString(helper_.ReadStringReference()));
+        break;
+      }
+      case kListConstant: {
+        temp_type_arguments_ = TypeArguments::New(1, Heap::kOld);
+        const AbstractType& type = type_translator_.BuildType();
+        temp_type_arguments_.SetTypeAt(0, type);
+        InstantiateTypeArguments(list_class, &temp_type_arguments_);
+
+        const intptr_t length = helper_.ReadUInt();
+        temp_array_ = ImmutableArray::New(length, Heap::kOld);
+        temp_array_.SetTypeArguments(temp_type_arguments_);
+        for (intptr_t j = 0; j < length; ++j) {
+          const intptr_t entry_offset = helper_.ReadUInt();
+          ASSERT(entry_offset < offset);  // We have a DAG!
+          temp_object_ = constants.GetOrDie(entry_offset);
+          temp_array_.SetAt(j, temp_object_);
+        }
+
+        temp_instance_ = H.Canonicalize(temp_array_);
+        break;
+      }
+      case kInstanceConstant: {
+        const NameIndex index = helper_.ReadCanonicalNameReference();
+        if (ShouldSkipConstant(index)) {
+          temp_instance_ = Instance::null();
+          break;
+        }
+
+        temp_class_ = H.LookupClassByKernelClass(index);
+        temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
+        ASSERT(temp_object_.IsNull());
+
+        temp_instance_ = Instance::New(temp_class_, Heap::kOld);
+
+        const intptr_t number_of_type_arguments = helper_.ReadUInt();
+        if (temp_class_.NumTypeArguments() > 0) {
+          temp_type_arguments_ =
+              TypeArguments::New(number_of_type_arguments, Heap::kOld);
+          for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
+            temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
+          }
+          InstantiateTypeArguments(temp_class_, &temp_type_arguments_);
+          temp_instance_.SetTypeArguments(temp_type_arguments_);
+        } else {
+          ASSERT(number_of_type_arguments == 0);
+        }
+
+        const intptr_t number_of_fields = helper_.ReadUInt();
+        for (intptr_t j = 0; j < number_of_fields; ++j) {
+          temp_field_ =
+              H.LookupFieldByKernelField(helper_.ReadCanonicalNameReference());
+          const intptr_t entry_offset = helper_.ReadUInt();
+          ASSERT(entry_offset < offset);  // We have a DAG!
+          temp_object_ = constants.GetOrDie(entry_offset);
+          temp_instance_.SetField(temp_field_, temp_object_);
+        }
+
+        temp_instance_ = H.Canonicalize(temp_instance_);
+        break;
+      }
+      case kPartialInstantiationConstant: {
+        const intptr_t entry_offset = helper_.ReadUInt();
+        temp_object_ = constants.GetOrDie(entry_offset);
+
+        // Happens if the tearoff was in the vmservice library and we have
+        // [skip_vm_service_library] enabled.
+        if (temp_object_.IsNull()) {
+          temp_instance_ = Instance::null();
+          break;
+        }
+
+        const intptr_t number_of_type_arguments = helper_.ReadUInt();
+        ASSERT(number_of_type_arguments > 0);
+        temp_type_arguments_ =
+            TypeArguments::New(number_of_type_arguments, Heap::kOld);
+        for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
+          temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
+        }
+
+        // Make a copy of the old closure, with the delayed type arguments
+        // set to [temp_type_arguments_].
+        temp_closure_ = Closure::RawCast(temp_object_.raw());
+        temp_function_ = temp_closure_.function();
+        temp_type_arguments2_ = temp_closure_.instantiator_type_arguments();
+        temp_type_arguments3_ = temp_closure_.function_type_arguments();
+        temp_context_ = temp_closure_.context();
+        temp_closure_ = Closure::New(
+            temp_type_arguments2_, Object::null_type_arguments(),
+            temp_type_arguments_, temp_function_, temp_context_, Heap::kOld);
+        temp_instance_ = H.Canonicalize(temp_closure_);
+        break;
+      }
+      case kTearOffConstant: {
+        const NameIndex index = helper_.ReadCanonicalNameReference();
+        if (ShouldSkipConstant(index)) {
+          temp_instance_ = Instance::null();
+          break;
+        }
+
+        temp_function_ = H.LookupStaticMethodByKernelProcedure(index);
+        temp_function_ = temp_function_.ImplicitClosureFunction();
+        temp_instance_ = temp_function_.ImplicitStaticClosure();
+        temp_instance_ = H.Canonicalize(temp_instance_);
+        break;
+      }
+      case kTypeLiteralConstant: {
+        temp_instance_ = type_translator_.BuildType().raw();
+        break;
+      }
+      case kMapConstant:
+        // Note: This is already lowered to InstanceConstant/ListConstant.
+        UNREACHABLE();
+        break;
+      default:
+        UNREACHABLE();
+    }
+    constants.InsertNewOrGetValue(offset - start_offset, temp_instance_);
+  }
+  return Array::Handle(Z, constants.Release().raw());
+}
+
+void ConstantHelper::InstantiateTypeArguments(const Class& receiver_class,
+                                              TypeArguments* type_arguments) {
+  // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
+  // finalize the argument types.
+  // (This can for example make the [type_arguments] vector larger)
+  temp_type_ =
+      Type::New(receiver_class, *type_arguments, TokenPosition::kNoSource);
+  temp_type_ = ClassFinalizer::FinalizeType(*active_class_->klass, temp_type_,
+                                            ClassFinalizer::kCanonicalize);
+  *type_arguments = temp_type_.arguments();
+}
+
+// If [index] has `dart:vm_service` as a parent and we are skipping the VM
+// service library, this method returns `true`, otherwise `false`.
+bool ConstantHelper::ShouldSkipConstant(NameIndex index) {
+  if (index == NameIndex::kInvalidName) {
+    return false;
+  }
+  while (!H.IsLibrary(index)) {
+    index = H.CanonicalNameParent(index);
+  }
+  ASSERT(H.IsLibrary(index));
+  return index == skip_vmservice_library_;
+}
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.h b/runtime/vm/compiler/frontend/constant_evaluator.h
new file mode 100644
index 0000000..48f6e9e
--- /dev/null
+++ b/runtime/vm/compiler/frontend/constant_evaluator.h
@@ -0,0 +1,188 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_EVALUATOR_H_
+#define RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_EVALUATOR_H_
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/object.h"
+
+namespace dart {
+namespace kernel {
+
+class FlowGraphBuilder;
+
+// There are several cases when we are compiling constant expressions:
+//
+//   * constant field initializers:
+//      const FieldName = <expr>;
+//
+//   * constant expressions:
+//      const [<expr>, ...]
+//      const {<expr> : <expr>, ...}
+//      const Constructor(<expr>, ...)
+//
+//   * constant default parameters:
+//      f(a, [b = <expr>])
+//      f(a, {b: <expr>})
+//
+//   * constant values to compare in a [SwitchCase]
+//      case <expr>:
+//
+// In all cases `<expr>` must be recursively evaluated and canonicalized at
+// compile-time.
+class ConstantEvaluator {
+ public:
+  ConstantEvaluator(KernelReaderHelper* helper,
+                    TypeTranslator* type_translator,
+                    ActiveClass* active_class,
+                    FlowGraphBuilder* flow_graph_builder = nullptr);
+
+  virtual ~ConstantEvaluator() {}
+
+  bool IsCached(intptr_t offset);
+
+  RawInstance* EvaluateExpression(intptr_t offset, bool reset_position = true);
+  Instance& EvaluateListLiteral(intptr_t offset, bool reset_position = true);
+  Instance& EvaluateMapLiteral(intptr_t offset, bool reset_position = true);
+  Instance& EvaluateConstructorInvocation(intptr_t offset,
+                                          bool reset_position = true);
+  RawObject* EvaluateExpressionSafe(intptr_t offset);
+
+ private:
+  bool IsBuildingFlowGraph() const;
+  bool IsAllowedToEvaluate() const;
+  void EvaluateAsExpression();
+  void EvaluateVariableGet(bool is_specialized);
+  void EvaluatePropertyGet();
+  void EvaluateDirectPropertyGet();
+  void EvaluateStaticGet();
+  void EvaluateMethodInvocation();
+  void EvaluateDirectMethodInvocation();
+  void EvaluateSuperMethodInvocation();
+  void EvaluateStaticInvocation();
+  void EvaluateConstructorInvocationInternal();
+  void EvaluateNot();
+  void EvaluateLogicalExpression();
+  void EvaluateConditionalExpression();
+  void EvaluateStringConcatenation();
+  void EvaluateSymbolLiteral();
+  void EvaluateTypeLiteral();
+  void EvaluateListLiteralInternal();
+  void EvaluateMapLiteralInternal();
+  void EvaluateLet();
+  void EvaluatePartialTearoffInstantiation();
+  void EvaluateBigIntLiteral();
+  void EvaluateStringLiteral();
+  void EvaluateIntLiteral(uint8_t payload);
+  void EvaluateIntLiteral(bool is_negative);
+  void EvaluateDoubleLiteral();
+  void EvaluateBoolLiteral(bool value);
+  void EvaluateNullLiteral();
+  void EvaluateConstantExpression();
+
+  void EvaluateGetStringLength(intptr_t expression_offset,
+                               TokenPosition position);
+
+  const Object& RunFunction(const TokenPosition position,
+                            const Function& function,
+                            intptr_t argument_count,
+                            const Instance* receiver,
+                            const TypeArguments* type_args);
+
+  const Object& RunFunction(const TokenPosition position,
+                            const Function& function,
+                            const Array& arguments,
+                            const Array& names);
+
+  const Object& RunMethodCall(const TokenPosition position,
+                              const Function& function,
+                              const Instance* receiver);
+
+  RawObject* EvaluateConstConstructorCall(const Class& type_class,
+                                          const TypeArguments& type_arguments,
+                                          const Function& constructor,
+                                          const Object& argument);
+
+  const TypeArguments* TranslateTypeArguments(const Function& target,
+                                              Class* target_klass);
+
+  void AssertBool() {
+    if (!result_.IsBool()) {
+      translation_helper_.ReportError("Expected boolean expression.");
+    }
+  }
+
+  bool EvaluateBooleanExpressionHere();
+
+  bool GetCachedConstant(intptr_t kernel_offset, Instance* value);
+  void CacheConstantValue(intptr_t kernel_offset, const Instance& value);
+
+  KernelReaderHelper* helper_;
+  Isolate* isolate_;
+  Zone* zone_;
+  TranslationHelper& translation_helper_;
+  TypeTranslator& type_translator_;
+  ActiveClass* active_class_;
+  FlowGraphBuilder* flow_graph_builder_;
+  const Script& script_;
+  Instance& result_;
+
+  DISALLOW_COPY_AND_ASSIGN(ConstantEvaluator);
+};
+
+// Helper class that reads a kernel Constant from binary.
+class ConstantHelper {
+ public:
+  ConstantHelper(Zone* zone,
+                 KernelReaderHelper* helper,
+                 TypeTranslator* type_translator,
+                 ActiveClass* active_class,
+                 NameIndex skip_vmservice_library);
+
+  // Reads the constant table from the binary.
+  //
+  // This method assumes the Reader is positioned already at the constant table
+  // and an active class scope is setup.
+  const Array& ReadConstantTable();
+
+ private:
+  void InstantiateTypeArguments(const Class& receiver_class,
+                                TypeArguments* type_arguments);
+
+  // If [index] has `dart:vm_service` as a parent and we are skipping the VM
+  // service library, this method returns `true`, otherwise `false`.
+  bool ShouldSkipConstant(NameIndex index);
+
+  Zone* zone_;
+  KernelReaderHelper& helper_;
+  TypeTranslator& type_translator_;
+  ActiveClass* const active_class_;
+  ConstantEvaluator const_evaluator_;
+  TranslationHelper& translation_helper_;
+  NameIndex skip_vmservice_library_;
+  AbstractType& temp_type_;
+  TypeArguments& temp_type_arguments_;
+  TypeArguments& temp_type_arguments2_;
+  TypeArguments& temp_type_arguments3_;
+  Object& temp_object_;
+  Array& temp_array_;
+  Instance& temp_instance_;
+  Field& temp_field_;
+  Class& temp_class_;
+  Function& temp_function_;
+  Closure& temp_closure_;
+  Context& temp_context_;
+  Integer& temp_integer_;
+
+  DISALLOW_COPY_AND_ASSIGN(ConstantHelper);
+};
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // RUNTIME_VM_COMPILER_FRONTEND_CONSTANT_EVALUATOR_H_
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 46dba1a..588c85a 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -4,14 +4,10 @@
 
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
 
-#include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
-#include "vm/dart_entry.h"
-#include "vm/longjump.h"
 #include "vm/object_store.h"
-#include "vm/resolver.h"
 #include "vm/stack_frame.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -25,387 +21,6 @@
 #define I Isolate::Current()
 #define B (flow_graph_builder_)
 
-StreamingConstantEvaluator::StreamingConstantEvaluator(
-    StreamingFlowGraphBuilder* builder)
-    : builder_(builder),
-      isolate_(Isolate::Current()),
-      zone_(builder_->zone_),
-      translation_helper_(builder_->translation_helper_),
-      type_translator_(builder_->type_translator_),
-      script_(builder_->script()),
-      result_(Instance::Handle(zone_)) {}
-
-bool StreamingConstantEvaluator::IsCached(intptr_t offset) {
-  return GetCachedConstant(offset, &result_);
-}
-
-RawInstance* StreamingConstantEvaluator::EvaluateExpression(
-    intptr_t offset,
-    bool reset_position) {
-  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
-  if (!GetCachedConstant(offset, &result_)) {
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = builder_->ReaderOffset();
-    builder_->SetOffset(offset);
-    uint8_t payload = 0;
-    Tag tag = builder_->ReadTag(&payload);  // read tag.
-    switch (tag) {
-      case kVariableGet:
-        EvaluateVariableGet(/* is_specialized = */ false);
-        break;
-      case kSpecializedVariableGet:
-        EvaluateVariableGet(/* is_specialized = */ true);
-        break;
-      case kPropertyGet:
-        EvaluatePropertyGet();
-        break;
-      case kDirectPropertyGet:
-        EvaluateDirectPropertyGet();
-        break;
-      case kStaticGet:
-        EvaluateStaticGet();
-        break;
-      case kMethodInvocation:
-        EvaluateMethodInvocation();
-        break;
-      case kDirectMethodInvocation:
-        EvaluateDirectMethodInvocation();
-        break;
-      case kSuperMethodInvocation:
-        EvaluateSuperMethodInvocation();
-        break;
-      case kStaticInvocation:
-      case kConstStaticInvocation:
-        EvaluateStaticInvocation();
-        break;
-      case kConstConstructorInvocation:
-        EvaluateConstructorInvocationInternal();
-        break;
-      case kNot:
-        EvaluateNot();
-        break;
-      case kLogicalExpression:
-        EvaluateLogicalExpression();
-        break;
-      case kConditionalExpression:
-        EvaluateConditionalExpression();
-        break;
-      case kStringConcatenation:
-        EvaluateStringConcatenation();
-        break;
-      case kSymbolLiteral:
-        EvaluateSymbolLiteral();
-        break;
-      case kTypeLiteral:
-        EvaluateTypeLiteral();
-        break;
-      case kAsExpression:
-        EvaluateAsExpression();
-        break;
-      case kConstListLiteral:
-        EvaluateListLiteralInternal();
-        break;
-      case kConstMapLiteral:
-        EvaluateMapLiteralInternal();
-        break;
-      case kLet:
-        EvaluateLet();
-        break;
-      case kInstantiation:
-        EvaluatePartialTearoffInstantiation();
-        break;
-      case kBigIntLiteral:
-        EvaluateBigIntLiteral();
-        break;
-      case kStringLiteral:
-        EvaluateStringLiteral();
-        break;
-      case kSpecializedIntLiteral:
-        EvaluateIntLiteral(payload);
-        break;
-      case kNegativeIntLiteral:
-        EvaluateIntLiteral(true);
-        break;
-      case kPositiveIntLiteral:
-        EvaluateIntLiteral(false);
-        break;
-      case kDoubleLiteral:
-        EvaluateDoubleLiteral();
-        break;
-      case kTrueLiteral:
-        EvaluateBoolLiteral(true);
-        break;
-      case kFalseLiteral:
-        EvaluateBoolLiteral(false);
-        break;
-      case kNullLiteral:
-        EvaluateNullLiteral();
-        break;
-      case kConstantExpression:
-        EvaluateConstantExpression();
-        break;
-      default:
-        H.ReportError(
-            script_, TokenPosition::kNoSource,
-            "Not a constant expression: unexpected kernel tag %s (%" Pd ")",
-            Reader::TagName(tag), tag);
-    }
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) builder_->SetOffset(original_offset);
-  } else {
-    if (!reset_position) {
-      builder_->SetOffset(offset);
-      builder_->SkipExpression();
-    }
-  }
-  return result_.raw();
-}
-
-Instance& StreamingConstantEvaluator::EvaluateListLiteral(intptr_t offset,
-                                                          bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = builder_->ReaderOffset();
-    builder_->SetOffset(offset);
-    builder_->ReadTag();  // skip tag.
-    EvaluateListLiteralInternal();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) builder_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-Instance& StreamingConstantEvaluator::EvaluateMapLiteral(intptr_t offset,
-                                                         bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = builder_->ReaderOffset();
-    builder_->SetOffset(offset);
-    builder_->ReadTag();  // skip tag.
-    EvaluateMapLiteralInternal();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) builder_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-Instance& StreamingConstantEvaluator::EvaluateConstructorInvocation(
-    intptr_t offset,
-    bool reset_position) {
-  if (!GetCachedConstant(offset, &result_)) {
-    ASSERT(IsAllowedToEvaluate());
-    intptr_t original_offset = builder_->ReaderOffset();
-    builder_->SetOffset(offset);
-    builder_->ReadTag();  // skip tag.
-    EvaluateConstructorInvocationInternal();
-
-    CacheConstantValue(offset, result_);
-    if (reset_position) builder_->SetOffset(original_offset);
-  }
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return Instance::ZoneHandle(Z, result_.raw());
-}
-
-RawObject* StreamingConstantEvaluator::EvaluateExpressionSafe(intptr_t offset) {
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    return EvaluateExpression(offset);
-  } else {
-    Thread* thread = H.thread();
-    Error& error = Error::Handle(Z);
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
-  }
-}
-
-bool StreamingConstantEvaluator::IsAllowedToEvaluate() {
-  return FLAG_precompiled_mode || builder_->flow_graph_builder_ == NULL ||
-         !builder_->optimizing();
-}
-
-void StreamingConstantEvaluator::EvaluateVariableGet(bool is_specialized) {
-  // When we see a [VariableGet] the corresponding [VariableDeclaration] must've
-  // been executed already. It therefore must have a constant object associated
-  // with it.
-  const TokenPosition position = builder_->ReadPosition();  // read position.
-  const intptr_t variable_kernel_position =
-      builder_->ReadUInt();  // read kernel position.
-  if (!is_specialized) {
-    builder_->ReadUInt();              // read relative variable index.
-    builder_->SkipOptionalDartType();  // read promoted type.
-  }
-  LocalVariable* variable = builder_->LookupVariable(variable_kernel_position);
-  if (!variable->IsConst()) {
-    H.ReportError(script_, position, "Not a constant expression.");
-  }
-  result_ = variable->ConstValue()->raw();
-}
-
-void StreamingConstantEvaluator::EvaluateGetStringLength(
-    intptr_t expression_offset,
-    TokenPosition position) {
-  EvaluateExpression(expression_offset);
-  if (result_.IsString()) {
-    const String& str = String::Handle(Z, String::RawCast(result_.raw()));
-    result_ = Integer::New(str.Length(), H.allocation_space());
-  } else {
-    H.ReportError(
-        script_, position,
-        "Constant expressions can only call 'length' on string constants.");
-  }
-}
-
-void StreamingConstantEvaluator::EvaluatePropertyGet() {
-  const TokenPosition position = builder_->ReadPosition();  // read position.
-  intptr_t expression_offset = builder_->ReaderOffset();
-  builder_->SkipExpression();                            // read receiver.
-  StringIndex name = builder_->ReadNameAsStringIndex();  // read name.
-  builder_->SkipCanonicalNameReference();  // read interface_target_reference.
-
-  if (H.StringEquals(name, "length")) {
-    EvaluateGetStringLength(expression_offset, position);
-  } else {
-    H.ReportError(
-        script_, position,
-        "Constant expressions can only call 'length' on string constants.");
-  }
-}
-
-void StreamingConstantEvaluator::EvaluateDirectPropertyGet() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-  intptr_t expression_offset = builder_->ReaderOffset();
-  builder_->SkipExpression();  // read receiver.
-  NameIndex kernel_name =
-      builder_->ReadCanonicalNameReference();  // read target_reference.
-
-  // TODO(vegorov): add check based on the complete canonical name.
-  if (H.IsGetter(kernel_name) &&
-      H.StringEquals(H.CanonicalNameString(kernel_name), "length")) {
-    EvaluateGetStringLength(expression_offset, position);
-  } else {
-    H.ReportError(
-        script_, position,
-        "Constant expressions can only call 'length' on string constants.");
-  }
-}
-
-void StreamingConstantEvaluator::EvaluateStaticGet() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-  NameIndex target =
-      builder_->ReadCanonicalNameReference();  // read target_reference.
-
-  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
-
-  if (H.IsField(target)) {
-    const Field& field = Field::Handle(Z, H.LookupFieldByKernelField(target));
-    if (!field.is_const()) {
-      H.ReportError(script_, position, "Not a constant field.");
-    }
-    if (field.StaticValue() == Object::transition_sentinel().raw()) {
-      builder_->InlineBailout(
-          "kernel::StreamingConstantEvaluator::EvaluateStaticGet::Cyclic");
-      H.ReportError(script_, position, "Not a constant expression.");
-    } else if (field.StaticValue() == Object::sentinel().raw()) {
-      field.SetStaticValue(Object::transition_sentinel());
-      const Object& value =
-          Object::Handle(Compiler::EvaluateStaticInitializer(field));
-      if (value.IsError()) {
-        field.SetStaticValue(Object::null_instance());
-        H.ReportError(Error::Cast(value), script_, position,
-                      "Not a constant expression.");
-        UNREACHABLE();
-      }
-      Thread* thread = H.thread();
-      const Error& error =
-          Error::Handle(thread->zone(), thread->sticky_error());
-      if (!error.IsNull()) {
-        field.SetStaticValue(Object::null_instance());
-        thread->clear_sticky_error();
-        H.ReportError(error, script_, position, "Not a constant expression.");
-        UNREACHABLE();
-      }
-      ASSERT(value.IsNull() || value.IsInstance());
-      field.SetStaticValue(value.IsNull() ? Instance::null_instance()
-                                          : Instance::Cast(value));
-
-      result_ = field.StaticValue();
-      result_ = H.Canonicalize(result_);
-      field.SetStaticValue(result_, true);
-    } else {
-      result_ = field.StaticValue();
-    }
-  } else if (H.IsProcedure(target)) {
-    const Function& function =
-        Function::ZoneHandle(Z, H.LookupStaticMethodByKernelProcedure(target));
-
-    if (H.IsMethod(target)) {
-      Function& closure_function =
-          Function::ZoneHandle(Z, function.ImplicitClosureFunction());
-      result_ = closure_function.ImplicitStaticClosure();
-      result_ = H.Canonicalize(result_);
-    } else if (H.IsGetter(target)) {
-      H.ReportError(script_, position, "Not a constant expression.");
-    } else {
-      H.ReportError(script_, position, "Not a constant expression.");
-    }
-  }
-}
-
-void StreamingConstantEvaluator::EvaluateMethodInvocation() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-  // This method call wasn't cached, so receiver et al. isn't cached either.
-  const Instance& receiver = Instance::Handle(
-      Z,
-      EvaluateExpression(builder_->ReaderOffset(), false));  // read receiver.
-  Class& klass =
-      Class::Handle(Z, isolate_->class_table()->At(receiver.GetClassId()));
-  ASSERT(!klass.IsNull());
-
-  // Search the superclass chain for the selector.
-  const String& method_name = builder_->ReadNameAsMethodName();  // read name.
-  Function& function =
-      builder_->FindMatchingFunctionAnyArgs(klass, method_name);
-
-  // The frontend should guarantee that [MethodInvocation]s inside constant
-  // expressions are always valid.
-  ASSERT(!function.IsNull());
-
-  // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(position, function, &receiver);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-
-  builder_->SkipCanonicalNameReference();  // read interface_target_reference.
-}
-
-void StreamingConstantEvaluator::EvaluateDirectMethodInvocation() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-
-  const Instance& receiver = Instance::Handle(
-      Z,
-      EvaluateExpression(builder_->ReaderOffset(), false));  // read receiver.
-
-  NameIndex kernel_name =
-      builder_->ReadCanonicalNameReference();  // read target_reference.
-
-  const Function& function = Function::ZoneHandle(
-      Z, H.LookupMethodByMember(kernel_name, H.DartProcedureName(kernel_name)));
-
-  // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(position, function, &receiver);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-}
-
 Class& StreamingFlowGraphBuilder::GetSuperOrDie() {
   Class& klass = Class::Handle(Z, parsed_function()->function().Owner());
   ASSERT(!klass.IsNull());
@@ -414,1301 +29,6 @@
   return klass;
 }
 
-void StreamingConstantEvaluator::EvaluateSuperMethodInvocation() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-
-  const LocalVariable* this_variable = builder_->scopes()->this_variable;
-  ASSERT(this_variable->IsConst());
-  const Instance& receiver =
-      Instance::Handle(Z, this_variable->ConstValue()->raw());
-  ASSERT(!receiver.IsNull());
-
-  Class& klass = builder_->GetSuperOrDie();
-
-  const String& method_name = builder_->ReadNameAsMethodName();  // read name.
-  Function& function =
-      builder_->FindMatchingFunctionAnyArgs(klass, method_name);
-
-  // The frontend should guarantee that [MethodInvocation]s inside constant
-  // expressions are always valid.
-  ASSERT(!function.IsNull());
-
-  // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(position, function, &receiver);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-
-  builder_->SkipCanonicalNameReference();  // read interface_target_reference.
-}
-
-void StreamingConstantEvaluator::EvaluateStaticInvocation() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-  NameIndex procedure_reference =
-      builder_->ReadCanonicalNameReference();  // read procedure reference.
-
-  const Function& function = Function::ZoneHandle(
-      Z, H.LookupStaticMethodByKernelProcedure(procedure_reference));
-  Class& klass = Class::Handle(Z, function.Owner());
-
-  intptr_t argument_count =
-      builder_->ReadUInt();  // read arguments part #1: arguments count.
-
-  // Build the type arguments vector (if necessary).
-  const TypeArguments* type_arguments =
-      TranslateTypeArguments(function, &klass);  // read argument types.
-
-  // read positional and named parameters.
-  const Object& result =
-      RunFunction(position, function, argument_count, NULL, type_arguments);
-  result_ ^= result.raw();
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateConstructorInvocationInternal() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-
-  NameIndex target = builder_->ReadCanonicalNameReference();  // read target.
-  const Function& constructor =
-      Function::Handle(Z, H.LookupConstructorByKernelConstructor(target));
-  Class& klass = Class::Handle(Z, constructor.Owner());
-
-  intptr_t argument_count =
-      builder_->ReadUInt();  // read arguments part #1: arguments count.
-
-  // Build the type arguments vector (if necessary).
-  const TypeArguments* type_arguments =
-      TranslateTypeArguments(constructor, &klass);  // read argument types.
-
-  if (klass.NumTypeArguments() > 0 && !klass.IsGeneric()) {
-    Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw());
-    // TODO(27590): Can we move this code into [ReceiverType]?
-    type ^= ClassFinalizer::FinalizeType(*builder_->active_class()->klass, type,
-                                         ClassFinalizer::kFinalize);
-    ASSERT(!type.IsMalformedOrMalbounded());
-
-    TypeArguments& canonicalized_type_arguments =
-        TypeArguments::ZoneHandle(Z, type.arguments());
-    canonicalized_type_arguments = canonicalized_type_arguments.Canonicalize();
-    type_arguments = &canonicalized_type_arguments;
-  }
-
-  // Prepare either the instance or the type argument vector for the constructor
-  // call.
-  Instance* receiver = NULL;
-  const TypeArguments* type_arguments_argument = NULL;
-  if (!constructor.IsFactory()) {
-    receiver = &Instance::Handle(Z, Instance::New(klass, Heap::kOld));
-    if (type_arguments != NULL) {
-      receiver->SetTypeArguments(*type_arguments);
-    }
-  } else {
-    type_arguments_argument = type_arguments;
-  }
-
-  // read positional and named parameters.
-  const Object& result = RunFunction(position, constructor, argument_count,
-                                     receiver, type_arguments_argument);
-
-  if (constructor.IsFactory()) {
-    // Factories return the new object.
-    result_ ^= result.raw();
-  } else {
-    ASSERT(!receiver->IsNull());
-    result_ ^= (*receiver).raw();
-  }
-  if (I->obfuscate() &&
-      (result_.clazz() == I->object_store()->symbol_class())) {
-    Obfuscator::ObfuscateSymbolInstance(H.thread(), result_);
-  }
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateNot() {
-  result_ ^= Bool::Get(!EvaluateBooleanExpressionHere()).raw();
-}
-
-void StreamingConstantEvaluator::EvaluateLogicalExpression() {
-  bool left = EvaluateBooleanExpressionHere();  // read left.
-  LogicalOperator op = static_cast<LogicalOperator>(builder_->ReadByte());
-  if (op == kAnd) {
-    if (left) {
-      EvaluateBooleanExpressionHere();  // read right.
-    } else {
-      builder_->SkipExpression();  // read right.
-    }
-  } else {
-    ASSERT(op == kOr);
-    if (!left) {
-      EvaluateBooleanExpressionHere();  // read right.
-    } else {
-      builder_->SkipExpression();  // read right.
-    }
-  }
-}
-
-void StreamingConstantEvaluator::EvaluateAsExpression() {
-  TokenPosition position = builder_->ReadPosition();
-  const uint8_t flags = builder_->ReadFlags();
-  const bool is_type_error = (flags & (1 << 0)) != 0;
-
-  // Check that this AsExpression was inserted by the front-end.
-  if (!is_type_error) {
-    H.ReportError(
-        script_, position,
-        "explicit as operator is not permitted in constant expression");
-  }
-
-  EvaluateExpression(builder_->ReaderOffset(), false);
-
-  const AbstractType& type = T.BuildType();
-  if (!type.IsInstantiated() || type.IsMalformed()) {
-    const String& type_str = String::Handle(type.UserVisibleName());
-    H.ReportError(
-        script_, position,
-        "Not a constant expression: right hand side of an implicit "
-        "as-expression is expected to be an instantiated type, got %s",
-        type_str.ToCString());
-  }
-
-  const TypeArguments& instantiator_type_arguments = TypeArguments::Handle();
-  const TypeArguments& function_type_arguments = TypeArguments::Handle();
-  Error& error = Error::Handle();
-  if (!result_.IsInstanceOf(type, instantiator_type_arguments,
-                            function_type_arguments, &error)) {
-    const AbstractType& rtype =
-        AbstractType::Handle(result_.GetType(Heap::kNew));
-    const String& result_str = String::Handle(rtype.UserVisibleName());
-    const String& type_str = String::Handle(type.UserVisibleName());
-    H.ReportError(
-        script_, position,
-        "Not a constant expression: Type '%s' is not a subtype of type '%s'",
-        result_str.ToCString(), type_str.ToCString());
-  }
-}
-
-void StreamingConstantEvaluator::EvaluateConditionalExpression() {
-  bool condition = EvaluateBooleanExpressionHere();
-  if (condition) {
-    EvaluateExpression(builder_->ReaderOffset(), false);  // read then.
-    builder_->SkipExpression();                           // read otherwise.
-  } else {
-    builder_->SkipExpression();                           // read then.
-    EvaluateExpression(builder_->ReaderOffset(), false);  // read otherwise.
-  }
-  builder_->SkipOptionalDartType();  // read unused static type.
-}
-
-void StreamingConstantEvaluator::EvaluateStringConcatenation() {
-  TokenPosition position = builder_->ReadPosition();  // read position.
-  intptr_t length = builder_->ReadListLength();  // read list length.
-
-  bool all_string = true;
-  const Array& strings =
-      Array::Handle(Z, Array::New(length, H.allocation_space()));
-  for (intptr_t i = 0; i < length; ++i) {
-    EvaluateExpression(builder_->ReaderOffset(),
-                       false);  // read ith expression.
-    strings.SetAt(i, result_);
-    all_string = all_string && result_.IsString();
-  }
-  if (all_string) {
-    result_ = String::ConcatAll(strings, Heap::kOld);
-    result_ = H.Canonicalize(result_);
-  } else {
-    // Get string interpolation function.
-    const Class& cls =
-        Class::Handle(Z, Library::LookupCoreClass(Symbols::StringBase()));
-    ASSERT(!cls.IsNull());
-    const Function& func = Function::Handle(
-        Z, cls.LookupStaticFunction(
-               Library::PrivateCoreLibName(Symbols::Interpolate())));
-    ASSERT(!func.IsNull());
-
-    // Build argument array to pass to the interpolation function.
-    const Array& interpolate_arg = Array::Handle(Z, Array::New(1, Heap::kOld));
-    interpolate_arg.SetAt(0, strings);
-
-    // Run and canonicalize.
-    const Object& result =
-        RunFunction(position, func, interpolate_arg, Array::null_array());
-    result_ = H.Canonicalize(String::Cast(result));
-  }
-}
-
-void StreamingConstantEvaluator::EvaluateSymbolLiteral() {
-  const Class& owner = *builder_->active_class()->klass;
-  const Library& lib = Library::Handle(Z, owner.library());
-  String& symbol_value = H.DartIdentifier(lib, builder_->ReadStringReference());
-  const Class& symbol_class =
-      Class::ZoneHandle(Z, I->object_store()->symbol_class());
-  ASSERT(!symbol_class.IsNull());
-  const Function& symbol_constructor = Function::ZoneHandle(
-      Z, symbol_class.LookupConstructor(Symbols::SymbolCtor()));
-  ASSERT(!symbol_constructor.IsNull());
-  result_ ^= EvaluateConstConstructorCall(
-      symbol_class, TypeArguments::Handle(Z), symbol_constructor, symbol_value);
-}
-
-void StreamingConstantEvaluator::EvaluateTypeLiteral() {
-  const AbstractType& type = T.BuildType();
-  if (type.IsMalformed()) {
-    H.ReportError(script_, TokenPosition::kNoSource,
-                  "Malformed type literal in constant expression.");
-  }
-  result_ = type.raw();
-}
-
-void StreamingConstantEvaluator::EvaluateListLiteralInternal() {
-  builder_->ReadPosition();  // read position.
-  const TypeArguments& type_arguments = T.BuildTypeArguments(1);  // read type.
-  intptr_t length = builder_->ReadListLength();  // read list length.
-  const Array& const_list =
-      Array::ZoneHandle(Z, Array::New(length, Heap::kOld));
-  const_list.SetTypeArguments(type_arguments);
-  Instance& expression = Instance::Handle(Z);
-  for (intptr_t i = 0; i < length; ++i) {
-    expression = EvaluateExpression(builder_->ReaderOffset(),
-                                    false);  // read ith expression.
-    const_list.SetAt(i, expression);
-  }
-  const_list.MakeImmutable();
-  result_ = H.Canonicalize(const_list);
-}
-
-void StreamingConstantEvaluator::EvaluateMapLiteralInternal() {
-  builder_->ReadPosition();  // read position.
-  const TypeArguments& type_arguments =
-      T.BuildTypeArguments(2);  // read key type and value type.
-
-  intptr_t length = builder_->ReadListLength();  // read length of entries.
-
-  // This MapLiteral wasn't cached, so content isn't cached either.
-  Array& const_kv_array = Array::Handle(Z, Array::New(2 * length, Heap::kOld));
-  Instance& temp = Instance::Handle(Z);
-  for (intptr_t i = 0; i < length; ++i) {
-    temp = EvaluateExpression(builder_->ReaderOffset(), false);  // read key.
-    const_kv_array.SetAt(2 * i + 0, temp);
-    temp = EvaluateExpression(builder_->ReaderOffset(), false);  // read value.
-    const_kv_array.SetAt(2 * i + 1, temp);
-  }
-
-  const_kv_array.MakeImmutable();
-  const_kv_array ^= H.Canonicalize(const_kv_array);
-
-  const Class& map_class =
-      Class::Handle(Z, Library::LookupCoreClass(Symbols::ImmutableMap()));
-  ASSERT(!map_class.IsNull());
-  ASSERT(map_class.NumTypeArguments() == 2);
-
-  const Field& field =
-      Field::Handle(Z, map_class.LookupInstanceFieldAllowPrivate(
-                           H.DartSymbolObfuscate("_kvPairs")));
-  ASSERT(!field.IsNull());
-
-  // NOTE: This needs to be kept in sync with `runtime/lib/immutable_map.dart`!
-  result_ = Instance::New(map_class, Heap::kOld);
-  ASSERT(!result_.IsNull());
-  result_.SetTypeArguments(type_arguments);
-  result_.SetField(field, const_kv_array);
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateLet() {
-  intptr_t kernel_position =
-      builder_->ReaderOffset() + builder_->data_program_offset_;
-  LocalVariable* local = builder_->LookupVariable(kernel_position);
-
-  // read variable declaration.
-  VariableDeclarationHelper helper(builder_);
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
-  Tag tag = builder_->ReadTag();  // read (first part of) initializer.
-  if (tag == kNothing) {
-    local->SetConstValue(Instance::ZoneHandle(Z, Instance::null()));
-  } else {
-    local->SetConstValue(Instance::ZoneHandle(
-        Z, EvaluateExpression(builder_->ReaderOffset(),
-                              false)));  // read rest of initializer.
-  }
-
-  EvaluateExpression(builder_->ReaderOffset(), false);  // read body
-}
-
-void StreamingConstantEvaluator::EvaluatePartialTearoffInstantiation() {
-  // This method call wasn't cached, so receiver et al. isn't cached either.
-  const Instance& receiver = Instance::Handle(
-      Z,
-      EvaluateExpression(builder_->ReaderOffset(), false));  // read receiver.
-  if (!receiver.IsClosure()) {
-    H.ReportError(script_, TokenPosition::kNoSource, "Expected closure.");
-  }
-  const Closure& old_closure = Closure::Cast(receiver);
-
-  // read type arguments.
-  intptr_t num_type_args = builder_->ReadListLength();
-  const TypeArguments* type_args = &T.BuildTypeArguments(num_type_args);
-
-  // Create new closure with the type arguments inserted, and other things
-  // copied over.
-  Closure& new_closure = Closure::Handle(
-      Z,
-      Closure::New(
-          TypeArguments::Handle(Z, old_closure.instantiator_type_arguments()),
-          TypeArguments::Handle(old_closure.function_type_arguments()),
-          *type_args, Function::Handle(Z, old_closure.function()),
-          Context::Handle(Z, old_closure.context()), Heap::kOld));
-  result_ = H.Canonicalize(new_closure);
-}
-
-void StreamingConstantEvaluator::EvaluateBigIntLiteral() {
-  const String& value =
-      H.DartString(builder_->ReadStringReference());  // read string reference.
-  result_ = Integer::New(value, Heap::kOld);
-  if (result_.IsNull()) {
-    H.ReportError(script_, TokenPosition::kNoSource,
-                  "Integer literal %s is out of range", value.ToCString());
-  }
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateStringLiteral() {
-  result_ = H.DartSymbolPlain(builder_->ReadStringReference())
-                .raw();  // read string reference.
-}
-
-void StreamingConstantEvaluator::EvaluateIntLiteral(uint8_t payload) {
-  int64_t value = static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
-  result_ = Integer::New(value, Heap::kOld);
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateIntLiteral(bool is_negative) {
-  int64_t value = is_negative ? -static_cast<int64_t>(builder_->ReadUInt())
-                              : builder_->ReadUInt();  // read value.
-  result_ = Integer::New(value, Heap::kOld);
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateDoubleLiteral() {
-  result_ = Double::New(builder_->ReadDouble(), Heap::kOld);  // read value.
-  result_ = H.Canonicalize(result_);
-}
-
-void StreamingConstantEvaluator::EvaluateBoolLiteral(bool value) {
-  result_ = Bool::Get(value).raw();
-}
-
-void StreamingConstantEvaluator::EvaluateNullLiteral() {
-  result_ = Instance::null();
-}
-
-void StreamingConstantEvaluator::EvaluateConstantExpression() {
-  KernelConstantsMap constant_map(H.constants().raw());
-  result_ ^= constant_map.GetOrDie(builder_->ReadUInt());
-  ASSERT(constant_map.Release().raw() == H.constants().raw());
-}
-
-// This depends on being about to read the list of positionals on arguments.
-const Object& StreamingConstantEvaluator::RunFunction(
-    TokenPosition position,
-    const Function& function,
-    intptr_t argument_count,
-    const Instance* receiver,
-    const TypeArguments* type_args) {
-  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
-  // we should never end up evaluating constants using the VM's constant
-  // evaluator.
-  if (I->strong() && FLAG_precompiled_mode) {
-    UNREACHABLE();
-  }
-
-  // We do not support generic methods yet.
-  ASSERT((receiver == NULL) || (type_args == NULL));
-  intptr_t extra_arguments =
-      (receiver != NULL ? 1 : 0) + (type_args != NULL ? 1 : 0);
-
-  // Build up arguments.
-  const Array& arguments = Array::Handle(
-      Z, Array::New(extra_arguments + argument_count, H.allocation_space()));
-  intptr_t pos = 0;
-  if (receiver != NULL) {
-    arguments.SetAt(pos++, *receiver);
-  }
-  if (type_args != NULL) {
-    arguments.SetAt(pos++, *type_args);
-  }
-
-  // List of positional.
-  intptr_t list_length = builder_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    EvaluateExpression(builder_->ReaderOffset(),
-                       false);  // read ith expression.
-    arguments.SetAt(pos++, result_);
-  }
-
-  // List of named.
-  list_length = builder_->ReadListLength();  // read list length.
-  const Array& names =
-      Array::Handle(Z, Array::New(list_length, H.allocation_space()));
-  for (intptr_t i = 0; i < list_length; ++i) {
-    String& name = H.DartSymbolObfuscate(
-        builder_->ReadStringReference());  // read ith name index.
-    names.SetAt(i, name);
-    EvaluateExpression(builder_->ReaderOffset(),
-                       false);  // read ith expression.
-    arguments.SetAt(pos++, result_);
-  }
-
-  return RunFunction(position, function, arguments, names);
-}
-
-const Object& StreamingConstantEvaluator::RunFunction(
-    const TokenPosition position,
-    const Function& function,
-    const Array& arguments,
-    const Array& names) {
-  // We do not support generic methods yet.
-  const int kTypeArgsLen = 0;
-  const Array& args_descriptor = Array::Handle(
-      Z, ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length(), names));
-  const Object& result = Object::Handle(
-      Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
-  if (result.IsError()) {
-    H.ReportError(Error::Cast(result), script_, position,
-                  "error evaluating constant constructor");
-  }
-  return result;
-}
-
-const Object& StreamingConstantEvaluator::RunMethodCall(
-    const TokenPosition position,
-    const Function& function,
-    const Instance* receiver) {
-  intptr_t argument_count = builder_->ReadUInt();  // read arguments count.
-
-  // TODO(28109) Support generic methods in the VM or reify them away.
-  ASSERT(builder_->PeekListLength() == 0);
-  builder_->SkipListOfDartTypes();  // read list of types.
-
-  // Run the method.
-  return RunFunction(position, function, argument_count, receiver, NULL);
-}
-
-RawObject* StreamingConstantEvaluator::EvaluateConstConstructorCall(
-    const Class& type_class,
-    const TypeArguments& type_arguments,
-    const Function& constructor,
-    const Object& argument) {
-  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
-  // we should never end up evaluating constants using the VM's constant
-  // evaluator.
-  if (I->strong() && FLAG_precompiled_mode) {
-    UNREACHABLE();
-  }
-
-  // Factories have one extra argument: the type arguments.
-  // Constructors have 1 extra arguments: receiver.
-  const int kTypeArgsLen = 0;
-  const int kNumArgs = 1;
-  const int kNumExtraArgs = 1;
-  const int argument_count = kNumArgs + kNumExtraArgs;
-  const Array& arg_values =
-      Array::Handle(Z, Array::New(argument_count, Heap::kOld));
-  Instance& instance = Instance::Handle(Z);
-  if (!constructor.IsFactory()) {
-    instance = Instance::New(type_class, Heap::kOld);
-    if (!type_arguments.IsNull()) {
-      ASSERT(type_arguments.IsInstantiated());
-      instance.SetTypeArguments(
-          TypeArguments::Handle(Z, type_arguments.Canonicalize()));
-    }
-    arg_values.SetAt(0, instance);
-  } else {
-    // Prepend type_arguments to list of arguments to factory.
-    ASSERT(type_arguments.IsZoneHandle());
-    arg_values.SetAt(0, type_arguments);
-  }
-  arg_values.SetAt((0 + kNumExtraArgs), argument);
-  const Array& args_descriptor =
-      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, argument_count,
-                                                Object::empty_array()));
-  const Object& result = Object::Handle(
-      Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
-  ASSERT(!result.IsError());
-  if (constructor.IsFactory()) {
-    // The factory method returns the allocated object.
-    instance ^= result.raw();
-  }
-  if (I->obfuscate() &&
-      (instance.clazz() == I->object_store()->symbol_class())) {
-    Obfuscator::ObfuscateSymbolInstance(H.thread(), instance);
-  }
-  return H.Canonicalize(instance);
-}
-
-const TypeArguments* StreamingConstantEvaluator::TranslateTypeArguments(
-    const Function& target,
-    Class* target_klass) {
-  intptr_t type_count = builder_->ReadListLength();  // read type count.
-
-  const TypeArguments* type_arguments = NULL;
-  if (type_count > 0) {
-    type_arguments = &T.BuildInstantiatedTypeArguments(
-        *target_klass, type_count);  // read types.
-
-    if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) {
-      H.ReportError(script_, TokenPosition::kNoSource,
-                    "Type must be constant in const constructor.");
-    }
-  } else if (target.IsFactory() && type_arguments == NULL) {
-    // All factories take a type arguments vector as first argument (independent
-    // of whether the class is generic or not).
-    type_arguments = &TypeArguments::ZoneHandle(Z, TypeArguments::null());
-  }
-  return type_arguments;
-}
-
-bool StreamingConstantEvaluator::EvaluateBooleanExpressionHere() {
-  EvaluateExpression(builder_->ReaderOffset(), false);
-  AssertBool();
-  return result_.raw() == Bool::True().raw();
-}
-
-bool StreamingConstantEvaluator::GetCachedConstant(intptr_t kernel_offset,
-                                                   Instance* value) {
-  if (builder_ == NULL || builder_->flow_graph_builder_ == NULL) return false;
-
-  const Function& function = builder_->parsed_function()->function();
-  if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
-    // Don't cache constants in initializer expressions. They get
-    // evaluated only once.
-    return false;
-  }
-
-  bool is_present = false;
-  ASSERT(!script_.InVMHeap());
-  if (script_.compile_time_constants() == Array::null()) {
-    return false;
-  }
-  KernelConstantsMap constants(script_.compile_time_constants());
-  *value ^= constants.GetOrNull(kernel_offset + builder_->data_program_offset_,
-                                &is_present);
-  // Mutator compiler thread may add constants while background compiler
-  // is running, and thus change the value of 'compile_time_constants';
-  // do not assert that 'compile_time_constants' has not changed.
-  constants.Release();
-  if (FLAG_compiler_stats && is_present) {
-    ++H.thread()->compiler_stats()->num_const_cache_hits;
-  }
-  return is_present;
-}
-
-void StreamingConstantEvaluator::CacheConstantValue(intptr_t kernel_offset,
-                                                    const Instance& value) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  if (builder_ == NULL || builder_->flow_graph_builder_ == NULL) return;
-
-  const Function& function = builder_->parsed_function()->function();
-  if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
-    // Don't cache constants in initializer expressions. They get
-    // evaluated only once.
-    return;
-  }
-  const intptr_t kInitialConstMapSize = 16;
-  ASSERT(!script_.InVMHeap());
-  if (script_.compile_time_constants() == Array::null()) {
-    const Array& array = Array::Handle(
-        HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
-    script_.set_compile_time_constants(array);
-  }
-  KernelConstantsMap constants(script_.compile_time_constants());
-  constants.InsertNewOrGetValue(kernel_offset + builder_->data_program_offset_,
-                                value);
-  script_.set_compile_time_constants(constants.Release());
-}
-
-void KernelFingerprintHelper::BuildHash(uint32_t val) {
-  hash_ = CalculateHash(hash_, val);
-}
-
-void KernelFingerprintHelper::CalculateConstructorFingerprint() {
-  ConstructorHelper helper(this);
-
-  helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
-  CalculateListOfExpressionsFingerprint();
-  CalculateFunctionNodeFingerprint();
-  intptr_t len = ReadListLength();
-  for (intptr_t i = 0; i < len; ++i) {
-    CalculateInitializerFingerprint();
-  }
-  helper.SetJustRead(ConstructorHelper::kInitializers);
-  BuildHash(helper.flags_);
-  BuildHash(helper.annotation_count_);
-}
-
-void KernelFingerprintHelper::CalculateArgumentsFingerprint() {
-  BuildHash(ReadUInt());  // read argument count.
-
-  CalculateListOfDartTypesFingerprint();    // read list of types.
-  CalculateListOfExpressionsFingerprint();  // read positionals.
-
-  // List of named.
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    CalculateStringReferenceFingerprint();  // read ith name index.
-    CalculateExpressionFingerprint();       // read ith expression.
-  }
-}
-
-void KernelFingerprintHelper::CalculateVariableDeclarationFingerprint() {
-  VariableDeclarationHelper helper(this);
-
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
-  CalculateListOfExpressionsFingerprint();
-  helper.SetJustRead(VariableDeclarationHelper::kAnnotations);
-
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-  // We don't need to use the helper after this point.
-  CalculateDartTypeFingerprint();
-  if (ReadTag() == kSomething) {
-    CalculateExpressionFingerprint();
-  }
-
-  BuildHash(helper.flags_);
-}
-
-void KernelFingerprintHelper::CalculateStatementListFingerprint() {
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    CalculateStatementFingerprint();  // read ith expression.
-  }
-}
-
-void KernelFingerprintHelper::CalculateListOfExpressionsFingerprint() {
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    CalculateExpressionFingerprint();  // read ith expression.
-  }
-}
-
-void KernelFingerprintHelper::CalculateListOfDartTypesFingerprint() {
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    CalculateDartTypeFingerprint();  // read ith type.
-  }
-}
-
-void KernelFingerprintHelper::CalculateStringReferenceFingerprint() {
-  BuildHash(
-      H.DartString(ReadStringReference()).Hash());  // read ith string index.
-}
-
-void KernelFingerprintHelper::CalculateListOfStringsFingerprint() {
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    CalculateStringReferenceFingerprint();  // read ith string index.
-  }
-}
-
-void KernelFingerprintHelper::CalculateListOfVariableDeclarationsFingerprint() {
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    // read ith variable declaration.
-    CalculateVariableDeclarationFingerprint();
-  }
-}
-
-void KernelFingerprintHelper::CalculateTypeParameterFingerprint() {
-  TypeParameterHelper helper(this);
-
-  helper.ReadUntilExcluding(TypeParameterHelper::kAnnotations);
-  CalculateListOfExpressionsFingerprint();
-  helper.SetJustRead(TypeParameterHelper::kAnnotations);
-
-  helper.ReadUntilExcluding(TypeParameterHelper::kBound);
-  // The helper isn't needed after this point.
-  CalculateDartTypeFingerprint();
-  if (ReadTag() == kSomething) {
-    CalculateDartTypeFingerprint();
-  }
-  BuildHash(helper.flags_);
-}
-
-void KernelFingerprintHelper::CalculateTypeParametersListFingerprint() {
-  intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    CalculateTypeParameterFingerprint();
-  }
-}
-
-void KernelFingerprintHelper::CalculateCanonicalNameFingerprint() {
-  const StringIndex i = H.CanonicalNameString(ReadCanonicalNameReference());
-  BuildHash(H.DartString(i).Hash());
-}
-
-void KernelFingerprintHelper::CalculateInitializerFingerprint() {
-  Tag tag = ReadTag();
-  ReadByte();  // read isSynthetic flag.
-  switch (tag) {
-    case kInvalidInitializer:
-      return;
-    case kFieldInitializer:
-      BuildHash(H.DartFieldName(ReadCanonicalNameReference()).Hash());
-      CalculateExpressionFingerprint();  // read value.
-      return;
-    case kSuperInitializer:
-      ReadPosition();                       // read position.
-      CalculateCanonicalNameFingerprint();  // read target_reference
-      CalculateArgumentsFingerprint();      // read arguments.
-      return;
-    case kRedirectingInitializer:
-      ReadPosition();                       // read position.
-      CalculateCanonicalNameFingerprint();  // read target_reference
-      CalculateArgumentsFingerprint();      // read arguments.
-      return;
-    case kLocalInitializer:
-      CalculateVariableDeclarationFingerprint();  // read variable.
-      return;
-    case kAssertInitializer:
-      CalculateStatementFingerprint();
-      return;
-    default:
-      ReportUnexpectedTag("initializer", tag);
-      UNREACHABLE();
-  }
-}
-
-void KernelFingerprintHelper::CalculateDartTypeFingerprint() {
-  Tag tag = ReadTag();
-  BuildHash(tag);
-  switch (tag) {
-    case kInvalidType:
-    case kDynamicType:
-    case kVoidType:
-    case kBottomType:
-      // those contain nothing.
-      break;
-      UNIMPLEMENTED();
-    case kInterfaceType:
-      CalculateInterfaceTypeFingerprint(false);
-      break;
-    case kSimpleInterfaceType:
-      CalculateInterfaceTypeFingerprint(true);
-      break;
-    case kFunctionType:
-      CalculateFunctionTypeFingerprint(false);
-      break;
-    case kSimpleFunctionType:
-      CalculateFunctionTypeFingerprint(true);
-      break;
-    case kTypeParameterType:
-      ReadUInt();                              // read index for parameter.
-      CalculateOptionalDartTypeFingerprint();  // read bound bound.
-      break;
-    default:
-      ReportUnexpectedTag("type", tag);
-      UNREACHABLE();
-  }
-}
-
-void KernelFingerprintHelper::CalculateOptionalDartTypeFingerprint() {
-  Tag tag = ReadTag();  // read tag.
-  BuildHash(tag);
-  if (tag == kNothing) {
-    return;
-  }
-  ASSERT(tag == kSomething);
-  CalculateDartTypeFingerprint();  // read type.
-}
-
-void KernelFingerprintHelper::CalculateInterfaceTypeFingerprint(bool simple) {
-  BuildHash(ReadUInt());  // read klass_name.
-  if (!simple) {
-    CalculateListOfDartTypesFingerprint();  // read list of types.
-  }
-}
-
-void KernelFingerprintHelper::CalculateFunctionTypeFingerprint(bool simple) {
-  if (!simple) {
-    CalculateTypeParametersListFingerprint();  // read type_parameters.
-    BuildHash(ReadUInt());                     // read required parameter count.
-    BuildHash(ReadUInt());                     // read total parameter count.
-  }
-
-  CalculateListOfDartTypesFingerprint();  // read positional_parameters types.
-
-  if (!simple) {
-    const intptr_t named_count =
-        ReadListLength();  // read named_parameters list length.
-    BuildHash(named_count);
-    for (intptr_t i = 0; i < named_count; ++i) {
-      // read string reference (i.e. named_parameters[i].name).
-      CalculateStringReferenceFingerprint();
-      CalculateDartTypeFingerprint();  // read named_parameters[i].type.
-    }
-  }
-
-  CalculateListOfStringsFingerprint();  // read positional parameter names.
-
-  if (!simple) {
-    // TODO(bkonyi): include in hash.
-    SkipCanonicalNameReference();  // read typedef reference.
-  }
-
-  CalculateDartTypeFingerprint();  // read return type.
-}
-
-void KernelFingerprintHelper::CalculateGetterNameFingerprint() {
-  const NameIndex name = ReadCanonicalNameReference();
-  if (I->strong() && !H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) {
-    BuildHash(H.DartGetterName(name).Hash());
-  }
-}
-
-void KernelFingerprintHelper::CalculateSetterNameFingerprint() {
-  const NameIndex name = ReadCanonicalNameReference();
-  if (I->strong() && !H.IsRoot(name)) {
-    BuildHash(H.DartSetterName(name).Hash());
-  }
-}
-
-void KernelFingerprintHelper::CalculateMethodNameFingerprint() {
-  const NameIndex name =
-      ReadCanonicalNameReference();  // read interface_target_reference.
-  if (I->strong() && !H.IsRoot(name) && !H.IsField(name)) {
-    BuildHash(H.DartProcedureName(name).Hash());
-  }
-}
-
-void KernelFingerprintHelper::CalculateExpressionFingerprint() {
-  uint8_t payload = 0;
-  Tag tag = ReadTag(&payload);
-  BuildHash(tag);
-  switch (tag) {
-    case kInvalidExpression:
-      ReadPosition();
-      CalculateStringReferenceFingerprint();
-      return;
-    case kVariableGet:
-      ReadPosition();                          // read position.
-      ReadUInt();                              // read kernel position.
-      ReadUInt();                              // read relative variable index.
-      CalculateOptionalDartTypeFingerprint();  // read promoted type.
-      return;
-    case kSpecializedVariableGet:
-      ReadPosition();  // read position.
-      ReadUInt();      // read kernel position.
-      return;
-    case kVariableSet:
-      ReadPosition();                    // read position.
-      ReadUInt();                        // read kernel position.
-      ReadUInt();                        // read relative variable index.
-      CalculateExpressionFingerprint();  // read expression.
-      return;
-    case kSpecializedVariableSet:
-      ReadPosition();                    // read position.
-      ReadUInt();                        // read kernel position.
-      CalculateExpressionFingerprint();  // read expression.
-      return;
-    case kPropertyGet:
-      ReadPosition();                            // read position.
-      CalculateExpressionFingerprint();          // read receiver.
-      BuildHash(ReadNameAsGetterName().Hash());  // read name.
-      CalculateGetterNameFingerprint();  // read interface_target_reference.
-      return;
-    case kPropertySet:
-      ReadPosition();                            // read position.
-      CalculateExpressionFingerprint();          // read receiver.
-      BuildHash(ReadNameAsSetterName().Hash());  // read name.
-      CalculateExpressionFingerprint();          // read value.
-      CalculateSetterNameFingerprint();  // read interface_target_reference.
-      return;
-    case kSuperPropertyGet:
-      ReadPosition();                            // read position.
-      BuildHash(ReadNameAsGetterName().Hash());  // read name.
-      CalculateGetterNameFingerprint();  // read interface_target_reference.
-      return;
-    case kSuperPropertySet:
-      ReadPosition();                            // read position.
-      BuildHash(ReadNameAsSetterName().Hash());  // read name.
-      CalculateExpressionFingerprint();          // read value.
-      CalculateSetterNameFingerprint();  // read interface_target_reference.
-      return;
-    case kDirectPropertyGet:
-      ReadPosition();                       // read position.
-      CalculateExpressionFingerprint();     // read receiver.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      return;
-    case kDirectPropertySet:
-      ReadPosition();                       // read position.
-      CalculateExpressionFingerprint();     // read receiver.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      CalculateExpressionFingerprint();     // read value·
-      return;
-    case kStaticGet:
-      ReadPosition();                       // read position.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      return;
-    case kStaticSet:
-      ReadPosition();                       // read position.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      CalculateExpressionFingerprint();     // read expression.
-      return;
-    case kMethodInvocation:
-      ReadPosition();                            // read position.
-      CalculateExpressionFingerprint();          // read receiver.
-      BuildHash(ReadNameAsMethodName().Hash());  // read name.
-      CalculateArgumentsFingerprint();           // read arguments.
-      CalculateMethodNameFingerprint();  // read interface_target_reference.
-      return;
-    case kSuperMethodInvocation:
-      ReadPosition();                            // read position.
-      BuildHash(ReadNameAsMethodName().Hash());  // read name.
-      CalculateArgumentsFingerprint();           // read arguments.
-      CalculateCanonicalNameFingerprint();       // read target_reference.
-      return;
-    case kDirectMethodInvocation:
-      ReadPosition();                       // read position.
-      CalculateExpressionFingerprint();     // read receiver.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      CalculateArgumentsFingerprint();      // read arguments.
-      return;
-    case kStaticInvocation:
-    case kConstStaticInvocation:
-      ReadPosition();                       // read position.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      CalculateArgumentsFingerprint();      // read arguments.
-      return;
-    case kConstructorInvocation:
-    case kConstConstructorInvocation:
-      ReadPosition();                       // read position.
-      CalculateCanonicalNameFingerprint();  // read target_reference.
-      CalculateArgumentsFingerprint();      // read arguments.
-      return;
-    case kNot:
-      CalculateExpressionFingerprint();  // read expression.
-      return;
-    case kLogicalExpression:
-      CalculateExpressionFingerprint();  // read left.
-      SkipBytes(1);                      // read operator.
-      CalculateExpressionFingerprint();  // read right.
-      return;
-    case kConditionalExpression:
-      CalculateExpressionFingerprint();        // read condition.
-      CalculateExpressionFingerprint();        // read then.
-      CalculateExpressionFingerprint();        // read otherwise.
-      CalculateOptionalDartTypeFingerprint();  // read unused static type.
-      return;
-    case kStringConcatenation:
-      ReadPosition();                           // read position.
-      CalculateListOfExpressionsFingerprint();  // read list of expressions.
-      return;
-    case kIsExpression:
-      ReadPosition();                    // read position.
-      CalculateExpressionFingerprint();  // read operand.
-      CalculateDartTypeFingerprint();    // read type.
-      return;
-    case kAsExpression:
-      ReadPosition();                    // read position.
-      BuildHash(ReadFlags());            // read flags.
-      CalculateExpressionFingerprint();  // read operand.
-      CalculateDartTypeFingerprint();    // read type.
-      return;
-    case kSymbolLiteral:
-      CalculateStringReferenceFingerprint();  // read index into string table.
-      return;
-    case kTypeLiteral:
-      CalculateDartTypeFingerprint();  // read type.
-      return;
-    case kThisExpression:
-      return;
-    case kRethrow:
-      ReadPosition();  // read position.
-      return;
-    case kThrow:
-      ReadPosition();                    // read position.
-      CalculateExpressionFingerprint();  // read expression.
-      return;
-    case kListLiteral:
-    case kConstListLiteral:
-      ReadPosition();                           // read position.
-      CalculateDartTypeFingerprint();           // read type.
-      CalculateListOfExpressionsFingerprint();  // read list of expressions.
-      return;
-    case kMapLiteral:
-    case kConstMapLiteral: {
-      ReadPosition();                           // read position.
-      CalculateDartTypeFingerprint();           // read type.
-      CalculateDartTypeFingerprint();           // read value type.
-      intptr_t list_length = ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        CalculateExpressionFingerprint();  // read ith key.
-        CalculateExpressionFingerprint();  // read ith value.
-      }
-      return;
-    }
-    case kFunctionExpression:
-      ReadPosition();                      // read position.
-      CalculateFunctionNodeFingerprint();  // read function node.
-      return;
-    case kLet:
-      CalculateVariableDeclarationFingerprint();  // read variable declaration.
-      CalculateExpressionFingerprint();           // read expression.
-      return;
-    case kInstantiation:
-      CalculateExpressionFingerprint();       // read expression.
-      CalculateListOfDartTypesFingerprint();  // read type arguments.
-      return;
-    case kBigIntLiteral:
-      CalculateStringReferenceFingerprint();  // read string reference.
-      return;
-    case kStringLiteral:
-      CalculateStringReferenceFingerprint();  // read string reference.
-      return;
-    case kSpecializedIntLiteral:
-      return;
-    case kNegativeIntLiteral:
-      BuildHash(ReadUInt());  // read value.
-      return;
-    case kPositiveIntLiteral:
-      BuildHash(ReadUInt());  // read value.
-      return;
-    case kDoubleLiteral: {
-      double value = ReadDouble();  // read value.
-      uint64_t data = bit_cast<uint64_t>(value);
-      BuildHash(static_cast<uint32_t>(data >> 32));
-      BuildHash(static_cast<uint32_t>(data));
-      return;
-    }
-    case kTrueLiteral:
-      return;
-    case kFalseLiteral:
-      return;
-    case kNullLiteral:
-      return;
-    case kConstantExpression:
-      SkipConstantReference();
-      return;
-    case kLoadLibrary:
-    case kCheckLibraryIsLoaded:
-      ReadUInt();  // skip library index
-      return;
-    default:
-      ReportUnexpectedTag("expression", tag);
-      UNREACHABLE();
-  }
-}
-
-void KernelFingerprintHelper::CalculateStatementFingerprint() {
-  Tag tag = ReadTag();  // read tag.
-  BuildHash(tag);
-  switch (tag) {
-    case kExpressionStatement:
-      CalculateExpressionFingerprint();  // read expression.
-      return;
-    case kBlock:
-      CalculateStatementListFingerprint();
-      return;
-    case kEmptyStatement:
-      return;
-    case kAssertBlock:
-      CalculateStatementListFingerprint();
-      return;
-    case kAssertStatement:
-      CalculateExpressionFingerprint();  // Read condition.
-      ReadPosition();                    // read condition start offset.
-      ReadPosition();                    // read condition end offset.
-      if (ReadTag() == kSomething) {
-        CalculateExpressionFingerprint();  // read (rest of) message.
-      }
-      return;
-    case kLabeledStatement:
-      CalculateStatementFingerprint();  // read body.
-      return;
-    case kBreakStatement:
-      ReadPosition();  // read position.
-      ReadUInt();      // read target_index.
-      return;
-    case kWhileStatement:
-      ReadPosition();                    // read position.
-      CalculateExpressionFingerprint();  // read condition.
-      CalculateStatementFingerprint();   // read body.
-      return;
-    case kDoStatement:
-      ReadPosition();                    // read position.
-      CalculateStatementFingerprint();   // read body.
-      CalculateExpressionFingerprint();  // read condition.
-      return;
-    case kForStatement: {
-      ReadPosition();                                    // read position.
-      CalculateListOfVariableDeclarationsFingerprint();  // read variables.
-      Tag tag = ReadTag();  // Read first part of condition.
-      if (tag == kSomething) {
-        CalculateExpressionFingerprint();  // read rest of condition.
-      }
-      CalculateListOfExpressionsFingerprint();  // read updates.
-      CalculateStatementFingerprint();          // read body.
-      return;
-    }
-    case kForInStatement:
-    case kAsyncForInStatement:
-      ReadPosition();                             // read position.
-      ReadPosition();                             // read body position.
-      CalculateVariableDeclarationFingerprint();  // read variable.
-      CalculateExpressionFingerprint();           // read iterable.
-      CalculateStatementFingerprint();            // read body.
-      return;
-    case kSwitchStatement: {
-      ReadPosition();                     // read position.
-      CalculateExpressionFingerprint();   // read condition.
-      int case_count = ReadListLength();  // read number of cases.
-      for (intptr_t i = 0; i < case_count; ++i) {
-        int expression_count = ReadListLength();  // read number of expressions.
-        for (intptr_t j = 0; j < expression_count; ++j) {
-          ReadPosition();                    // read jth position.
-          CalculateExpressionFingerprint();  // read jth expression.
-        }
-        BuildHash(ReadBool());            // read is_default.
-        CalculateStatementFingerprint();  // read body.
-      }
-      return;
-    }
-    case kContinueSwitchStatement:
-      ReadPosition();  // read position.
-      ReadUInt();      // read target_index.
-      return;
-    case kIfStatement:
-      ReadPosition();                    // read position.
-      CalculateExpressionFingerprint();  // read condition.
-      CalculateStatementFingerprint();   // read then.
-      CalculateStatementFingerprint();   // read otherwise.
-      return;
-    case kReturnStatement: {
-      ReadPosition();       // read position
-      Tag tag = ReadTag();  // read (first part of) expression.
-      BuildHash(tag);
-      if (tag == kSomething) {
-        CalculateExpressionFingerprint();  // read (rest of) expression.
-      }
-      return;
-    }
-    case kTryCatch: {
-      CalculateStatementFingerprint();  // read body.
-      BuildHash(ReadByte());            // read flags
-      intptr_t catch_count = ReadListLength();  // read number of catches.
-      for (intptr_t i = 0; i < catch_count; ++i) {
-        ReadPosition();                  // read position.
-        CalculateDartTypeFingerprint();  // read guard.
-        tag = ReadTag();                 // read first part of exception.
-        BuildHash(tag);
-        if (tag == kSomething) {
-          CalculateVariableDeclarationFingerprint();  // read exception.
-        }
-        tag = ReadTag();  // read first part of stack trace.
-        BuildHash(tag);
-        if (tag == kSomething) {
-          CalculateVariableDeclarationFingerprint();  // read stack trace.
-        }
-        CalculateStatementFingerprint();  // read body.
-      }
-      return;
-    }
-    case kTryFinally:
-      CalculateStatementFingerprint();  // read body.
-      CalculateStatementFingerprint();  // read finalizer.
-      return;
-    case kYieldStatement: {
-      ReadPosition();                    // read position.
-      BuildHash(ReadByte());             // read flags.
-      CalculateExpressionFingerprint();  // read expression.
-      return;
-    }
-    case kVariableDeclaration:
-      CalculateVariableDeclarationFingerprint();  // read variable declaration.
-      return;
-    case kFunctionDeclaration:
-      ReadPosition();                             // read position.
-      CalculateVariableDeclarationFingerprint();  // read variable.
-      CalculateFunctionNodeFingerprint();         // read function node.
-      return;
-    default:
-      ReportUnexpectedTag("statement", tag);
-      UNREACHABLE();
-  }
-}
-
-uint32_t KernelFingerprintHelper::CalculateFieldFingerprint() {
-  hash_ = 0;
-  FieldHelper field_helper(this);
-
-  field_helper.ReadUntilExcluding(FieldHelper::kName);
-  const String& name = ReadNameAsFieldName();  // read name.
-  field_helper.SetJustRead(FieldHelper::kName);
-
-  field_helper.ReadUntilExcluding(FieldHelper::kType);
-  CalculateDartTypeFingerprint();  // read type.
-  field_helper.SetJustRead(FieldHelper::kType);
-
-  if (ReadTag() == kSomething) {
-    if (PeekTag() == kFunctionExpression) {
-      AlternativeReadingScope alt(&reader_);
-      CalculateExpressionFingerprint();
-    }
-    SkipExpression();
-  }
-
-  BuildHash(name.Hash());
-  BuildHash(field_helper.flags_);
-  BuildHash(field_helper.annotation_count_);
-  return hash_;
-}
-
-void KernelFingerprintHelper::CalculateFunctionNodeFingerprint() {
-  FunctionNodeHelper function_node_helper(this);
-
-  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
-  CalculateTypeParametersListFingerprint();
-  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
-
-  function_node_helper.ReadUntilExcluding(
-      FunctionNodeHelper::kPositionalParameters);
-  CalculateListOfVariableDeclarationsFingerprint();  // read positionals
-  CalculateListOfVariableDeclarationsFingerprint();  // read named
-  CalculateDartTypeFingerprint();                    // read return type.
-
-  if (ReadTag() == kSomething) {
-    CalculateStatementFingerprint();  // Read body.
-  }
-  BuildHash(function_node_helper.total_parameter_count_);
-  BuildHash(function_node_helper.required_parameter_count_);
-}
-
-uint32_t KernelFingerprintHelper::CalculateFunctionFingerprint() {
-  hash_ = 0;
-  Tag tag = PeekTag();
-  if (tag == kField) {
-    return CalculateFieldFingerprint();
-  } else if (tag == kConstructor) {
-    CalculateConstructorFingerprint();
-    return hash_;
-  }
-  ProcedureHelper procedure_helper(this);
-  procedure_helper.ReadUntilExcluding(ProcedureHelper::kName);
-  const String& name = ReadNameAsMethodName();  // Read name.
-  procedure_helper.SetJustRead(ProcedureHelper::kName);
-
-  procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
-  if (ReadTag() == kSomething) {
-    CalculateFunctionNodeFingerprint();
-  }
-
-  BuildHash(procedure_helper.kind_);
-  BuildHash(procedure_helper.flags_);
-  BuildHash(procedure_helper.annotation_count_);
-  BuildHash(name.Hash());
-  return hash_;
-}
-
 bool StreamingFlowGraphBuilder::optimizing() {
   return flow_graph_builder_->optimizing_;
 }
@@ -3739,20 +2059,6 @@
   return flow_graph_builder_->MakeTemporary();
 }
 
-Function& StreamingFlowGraphBuilder::FindMatchingFunctionAnyArgs(
-    const Class& klass,
-    const String& name) {
-  // Search the superclass chain for the selector.
-  Function& function = Function::Handle(Z);
-  Class& iterate_klass = Class::Handle(Z, klass.raw());
-  while (!iterate_klass.IsNull()) {
-    function = iterate_klass.LookupDynamicFunctionAllowPrivate(name);
-    if (!function.IsNull()) break;
-    iterate_klass = iterate_klass.SuperClass();
-  }
-  return function;
-}
-
 Function& StreamingFlowGraphBuilder::FindMatchingFunction(
     const Class& klass,
     const String& name,
@@ -3987,8 +2293,61 @@
   // TranslateFinallyFinalizers can move the readers offset.
   // Save the current position and restore it afterwards.
   AlternativeReadingScope alt(&reader_);
-  return flow_graph_builder_->TranslateFinallyFinalizers(outer_finally,
-                                                         target_context_depth);
+
+  TryFinallyBlock* const saved_block = B->try_finally_block_;
+  TryCatchBlock* const saved_try_catch_block = B->try_catch_block_;
+  const intptr_t saved_depth = B->context_depth_;
+  const intptr_t saved_try_depth = B->try_depth_;
+
+  Fragment instructions;
+
+  // While translating the body of a finalizer we need to set the try-finally
+  // block which is active when translating the body.
+  while (B->try_finally_block_ != outer_finally) {
+    // Set correct try depth (in case there are nested try statements).
+    B->try_depth_ = B->try_finally_block_->try_depth();
+
+    // Potentially restore the context to what is expected for the finally
+    // block.
+    instructions += B->AdjustContextTo(B->try_finally_block_->context_depth());
+
+    // The to-be-translated finalizer has to have the correct try-index (namely
+    // the one outside the try-finally block).
+    bool changed_try_index = false;
+    intptr_t target_try_index = B->try_finally_block_->try_index();
+    while (B->CurrentTryIndex() != target_try_index) {
+      B->try_catch_block_ = B->try_catch_block_->outer();
+      changed_try_index = true;
+    }
+    if (changed_try_index) {
+      JoinEntryInstr* entry = BuildJoinEntry();
+      instructions += Goto(entry);
+      instructions = Fragment(instructions.entry, entry);
+    }
+
+    intptr_t finalizer_kernel_offset =
+        B->try_finally_block_->finalizer_kernel_offset();
+    B->try_finally_block_ = B->try_finally_block_->outer();
+    instructions += BuildStatementAt(finalizer_kernel_offset);
+
+    // We only need to make sure that if the finalizer ended normally, we
+    // continue towards the next outer try-finally.
+    if (!instructions.is_open()) break;
+  }
+
+  if (instructions.is_open() && target_context_depth != -1) {
+    // A target context depth of -1 indicates that the code after this
+    // will not care about the context chain so we can leave it any way we
+    // want after the last finalizer.  That is used when returning.
+    instructions += B->AdjustContextTo(target_context_depth);
+  }
+
+  B->try_finally_block_ = saved_block;
+  B->try_catch_block_ = saved_try_catch_block;
+  B->context_depth_ = saved_depth;
+  B->try_depth_ = saved_try_depth;
+
+  return instructions;
 }
 
 Fragment StreamingFlowGraphBuilder::BranchIfTrue(
@@ -4535,7 +2894,8 @@
 
   const String& setter_name = ReadNameAsSetterName();  // read name.
 
-  Function& function = FindMatchingFunctionAnyArgs(klass, setter_name);
+  Function& function =
+      Function::Handle(Z, H.LookupDynamicFunction(klass, setter_name));
 
   Fragment instructions(MakeTemp());
   LocalVariable* value = MakeTemporary();  // this holds RHS value
@@ -7449,197 +5809,6 @@
   return line_starts_data.raw();
 }
 
-const Array& ConstantHelper::ReadConstantTable() {
-  const intptr_t number_of_constants = builder_.ReadUInt();
-  if (number_of_constants == 0) {
-    return Array::Handle(Z, Array::null());
-  }
-
-  const Library& corelib = Library::Handle(Z, Library::CoreLibrary());
-  const Class& list_class =
-      Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
-
-  // Eagerly finalize _ImmutableList (instead of doing it on every list
-  // constant).
-  temp_class_ = I->class_table()->At(kImmutableArrayCid);
-  temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
-  ASSERT(temp_object_.IsNull());
-
-  KernelConstantsMap constants(
-      HashTables::New<KernelConstantsMap>(number_of_constants, Heap::kOld));
-
-  const intptr_t start_offset = builder_.ReaderOffset();
-
-  for (intptr_t i = 0; i < number_of_constants; ++i) {
-    const intptr_t offset = builder_.ReaderOffset();
-    const intptr_t constant_tag = builder_.ReadByte();
-    switch (constant_tag) {
-      case kNullConstant:
-        temp_instance_ = Instance::null();
-        break;
-      case kBoolConstant:
-        temp_instance_ = builder_.ReadByte() == 1 ? Object::bool_true().raw()
-                                                  : Object::bool_false().raw();
-        break;
-      case kIntConstant: {
-        temp_instance_ = const_evaluator_.EvaluateExpression(
-            builder_.ReaderOffset(), false /* reset position */);
-        break;
-      }
-      case kDoubleConstant: {
-        temp_instance_ = Double::New(builder_.ReadDouble(), Heap::kOld);
-        temp_instance_ = H.Canonicalize(temp_instance_);
-        break;
-      }
-      case kStringConstant: {
-        temp_instance_ =
-            H.Canonicalize(H.DartString(builder_.ReadStringReference()));
-        break;
-      }
-      case kListConstant: {
-        temp_type_arguments_ = TypeArguments::New(1, Heap::kOld);
-        const AbstractType& type = type_translator_.BuildType();
-        temp_type_arguments_.SetTypeAt(0, type);
-        InstantiateTypeArguments(list_class, &temp_type_arguments_);
-
-        const intptr_t length = builder_.ReadUInt();
-        temp_array_ = ImmutableArray::New(length, Heap::kOld);
-        temp_array_.SetTypeArguments(temp_type_arguments_);
-        for (intptr_t j = 0; j < length; ++j) {
-          const intptr_t entry_offset = builder_.ReadUInt();
-          ASSERT(entry_offset < offset);  // We have a DAG!
-          temp_object_ = constants.GetOrDie(entry_offset);
-          temp_array_.SetAt(j, temp_object_);
-        }
-
-        temp_instance_ = H.Canonicalize(temp_array_);
-        break;
-      }
-      case kInstanceConstant: {
-        const NameIndex index = builder_.ReadCanonicalNameReference();
-        if (ShouldSkipConstant(index)) {
-          temp_instance_ = Instance::null();
-          break;
-        }
-
-        temp_class_ = H.LookupClassByKernelClass(index);
-        temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
-        ASSERT(temp_object_.IsNull());
-
-        temp_instance_ = Instance::New(temp_class_, Heap::kOld);
-
-        const intptr_t number_of_type_arguments = builder_.ReadUInt();
-        if (temp_class_.NumTypeArguments() > 0) {
-          temp_type_arguments_ =
-              TypeArguments::New(number_of_type_arguments, Heap::kOld);
-          for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
-            temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
-          }
-          InstantiateTypeArguments(temp_class_, &temp_type_arguments_);
-          temp_instance_.SetTypeArguments(temp_type_arguments_);
-        } else {
-          ASSERT(number_of_type_arguments == 0);
-        }
-
-        const intptr_t number_of_fields = builder_.ReadUInt();
-        for (intptr_t j = 0; j < number_of_fields; ++j) {
-          temp_field_ =
-              H.LookupFieldByKernelField(builder_.ReadCanonicalNameReference());
-          const intptr_t entry_offset = builder_.ReadUInt();
-          ASSERT(entry_offset < offset);  // We have a DAG!
-          temp_object_ = constants.GetOrDie(entry_offset);
-          temp_instance_.SetField(temp_field_, temp_object_);
-        }
-
-        temp_instance_ = H.Canonicalize(temp_instance_);
-        break;
-      }
-      case kPartialInstantiationConstant: {
-        const intptr_t entry_offset = builder_.ReadUInt();
-        temp_object_ = constants.GetOrDie(entry_offset);
-
-        // Happens if the tearoff was in the vmservice library and we have
-        // [skip_vm_service_library] enabled.
-        if (temp_object_.IsNull()) {
-          temp_instance_ = Instance::null();
-          break;
-        }
-
-        const intptr_t number_of_type_arguments = builder_.ReadUInt();
-        ASSERT(number_of_type_arguments > 0);
-        temp_type_arguments_ =
-            TypeArguments::New(number_of_type_arguments, Heap::kOld);
-        for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
-          temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
-        }
-
-        // Make a copy of the old closure, with the delayed type arguments
-        // set to [temp_type_arguments_].
-        temp_closure_ = Closure::RawCast(temp_object_.raw());
-        temp_function_ = temp_closure_.function();
-        temp_type_arguments2_ = temp_closure_.instantiator_type_arguments();
-        temp_type_arguments3_ = temp_closure_.function_type_arguments();
-        temp_context_ = temp_closure_.context();
-        temp_closure_ = Closure::New(
-            temp_type_arguments2_, Object::null_type_arguments(),
-            temp_type_arguments_, temp_function_, temp_context_, Heap::kOld);
-        temp_instance_ = H.Canonicalize(temp_closure_);
-        break;
-      }
-      case kTearOffConstant: {
-        const NameIndex index = builder_.ReadCanonicalNameReference();
-        if (ShouldSkipConstant(index)) {
-          temp_instance_ = Instance::null();
-          break;
-        }
-
-        temp_function_ = H.LookupStaticMethodByKernelProcedure(index);
-        temp_function_ = temp_function_.ImplicitClosureFunction();
-        temp_instance_ = temp_function_.ImplicitStaticClosure();
-        temp_instance_ = H.Canonicalize(temp_instance_);
-        break;
-      }
-      case kTypeLiteralConstant: {
-        temp_instance_ = type_translator_.BuildType().raw();
-        break;
-      }
-      case kMapConstant:
-        // Note: This is already lowered to InstanceConstant/ListConstant.
-        UNREACHABLE();
-        break;
-      default:
-        UNREACHABLE();
-    }
-    constants.InsertNewOrGetValue(offset - start_offset, temp_instance_);
-  }
-  return Array::Handle(Z, constants.Release().raw());
-}
-
-void ConstantHelper::InstantiateTypeArguments(const Class& receiver_class,
-                                              TypeArguments* type_arguments) {
-  // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
-  // finalize the argument types.
-  // (This can for example make the [type_arguments] vector larger)
-  temp_type_ =
-      Type::New(receiver_class, *type_arguments, TokenPosition::kNoSource);
-  temp_type_ = ClassFinalizer::FinalizeType(*active_class_->klass, temp_type_,
-                                            ClassFinalizer::kCanonicalize);
-  *type_arguments = temp_type_.arguments();
-}
-
-// If [index] has `dart:vm_service` as a parent and we are skipping the VM
-// service library, this method returns `true`, otherwise `false`.
-bool ConstantHelper::ShouldSkipConstant(NameIndex index) {
-  if (index == NameIndex::kInvalidName) {
-    return false;
-  }
-  while (!H.IsLibrary(index)) {
-    index = H.CanonicalNameParent(index);
-  }
-  ASSERT(H.IsLibrary(index));
-  return index == skip_vmservice_library_;
-}
-
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index c9babb5..8dbbcaa 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -8,6 +8,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 #include "vm/compiler/frontend/bytecode_reader.h"
+#include "vm/compiler/frontend/constant_evaluator.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/frontend/scope_builder.h"
@@ -18,169 +19,6 @@
 namespace dart {
 namespace kernel {
 
-// There are several cases when we are compiling constant expressions:
-//
-//   * constant field initializers:
-//      const FieldName = <expr>;
-//
-//   * constant expressions:
-//      const [<expr>, ...]
-//      const {<expr> : <expr>, ...}
-//      const Constructor(<expr>, ...)
-//
-//   * constant default parameters:
-//      f(a, [b = <expr>])
-//      f(a, {b: <expr>})
-//
-//   * constant values to compare in a [SwitchCase]
-//      case <expr>:
-//
-// In all cases `<expr>` must be recursively evaluated and canonicalized at
-// compile-time.
-class StreamingConstantEvaluator {
- public:
-  explicit StreamingConstantEvaluator(StreamingFlowGraphBuilder* builder);
-
-  virtual ~StreamingConstantEvaluator() {}
-
-  bool IsCached(intptr_t offset);
-
-  RawInstance* EvaluateExpression(intptr_t offset, bool reset_position = true);
-  Instance& EvaluateListLiteral(intptr_t offset, bool reset_position = true);
-  Instance& EvaluateMapLiteral(intptr_t offset, bool reset_position = true);
-  Instance& EvaluateConstructorInvocation(intptr_t offset,
-                                          bool reset_position = true);
-  RawObject* EvaluateExpressionSafe(intptr_t offset);
-
- private:
-  bool IsAllowedToEvaluate();
-  void EvaluateAsExpression();
-  void EvaluateVariableGet(bool is_specialized);
-  void EvaluatePropertyGet();
-  void EvaluateDirectPropertyGet();
-  void EvaluateStaticGet();
-  void EvaluateMethodInvocation();
-  void EvaluateDirectMethodInvocation();
-  void EvaluateSuperMethodInvocation();
-  void EvaluateStaticInvocation();
-  void EvaluateConstructorInvocationInternal();
-  void EvaluateNot();
-  void EvaluateLogicalExpression();
-  void EvaluateConditionalExpression();
-  void EvaluateStringConcatenation();
-  void EvaluateSymbolLiteral();
-  void EvaluateTypeLiteral();
-  void EvaluateListLiteralInternal();
-  void EvaluateMapLiteralInternal();
-  void EvaluateLet();
-  void EvaluatePartialTearoffInstantiation();
-  void EvaluateBigIntLiteral();
-  void EvaluateStringLiteral();
-  void EvaluateIntLiteral(uint8_t payload);
-  void EvaluateIntLiteral(bool is_negative);
-  void EvaluateDoubleLiteral();
-  void EvaluateBoolLiteral(bool value);
-  void EvaluateNullLiteral();
-  void EvaluateConstantExpression();
-
-  void EvaluateGetStringLength(intptr_t expression_offset,
-                               TokenPosition position);
-
-  const Object& RunFunction(const TokenPosition position,
-                            const Function& function,
-                            intptr_t argument_count,
-                            const Instance* receiver,
-                            const TypeArguments* type_args);
-
-  const Object& RunFunction(const TokenPosition position,
-                            const Function& function,
-                            const Array& arguments,
-                            const Array& names);
-
-  const Object& RunMethodCall(const TokenPosition position,
-                              const Function& function,
-                              const Instance* receiver);
-
-  RawObject* EvaluateConstConstructorCall(const Class& type_class,
-                                          const TypeArguments& type_arguments,
-                                          const Function& constructor,
-                                          const Object& argument);
-
-  const TypeArguments* TranslateTypeArguments(const Function& target,
-                                              Class* target_klass);
-
-  void AssertBool() {
-    if (!result_.IsBool()) {
-      translation_helper_.ReportError("Expected boolean expression.");
-    }
-  }
-
-  bool EvaluateBooleanExpressionHere();
-
-  bool GetCachedConstant(intptr_t kernel_offset, Instance* value);
-  void CacheConstantValue(intptr_t kernel_offset, const Instance& value);
-
-  StreamingFlowGraphBuilder* builder_;
-  Isolate* isolate_;
-  Zone* zone_;
-  TranslationHelper& translation_helper_;
-  TypeTranslator& type_translator_;
-
-  const Script& script_;
-  Instance& result_;
-};
-
-class KernelFingerprintHelper : public KernelReaderHelper {
- public:
-  KernelFingerprintHelper(Zone* zone,
-                          TranslationHelper* translation_helper,
-                          const Script& script,
-                          const ExternalTypedData& data,
-                          intptr_t data_program_offset)
-      : KernelReaderHelper(zone,
-                           translation_helper,
-                           script,
-                           data,
-                           data_program_offset),
-        hash_(0) {}
-
-  virtual ~KernelFingerprintHelper() {}
-  uint32_t CalculateFieldFingerprint();
-  uint32_t CalculateFunctionFingerprint();
-
-  static uint32_t CalculateHash(uint32_t current, uint32_t val) {
-    return current * 31 + val;
-  }
-
- private:
-  void BuildHash(uint32_t val);
-  void CalculateConstructorFingerprint();
-  void CalculateArgumentsFingerprint();
-  void CalculateVariableDeclarationFingerprint();
-  void CalculateStatementListFingerprint();
-  void CalculateListOfExpressionsFingerprint();
-  void CalculateListOfDartTypesFingerprint();
-  void CalculateListOfVariableDeclarationsFingerprint();
-  void CalculateStringReferenceFingerprint();
-  void CalculateListOfStringsFingerprint();
-  void CalculateTypeParameterFingerprint();
-  void CalculateTypeParametersListFingerprint();
-  void CalculateCanonicalNameFingerprint();
-  void CalculateInitializerFingerprint();
-  void CalculateDartTypeFingerprint();
-  void CalculateOptionalDartTypeFingerprint();
-  void CalculateInterfaceTypeFingerprint(bool simple);
-  void CalculateFunctionTypeFingerprint(bool simple);
-  void CalculateGetterNameFingerprint();
-  void CalculateSetterNameFingerprint();
-  void CalculateMethodNameFingerprint();
-  void CalculateExpressionFingerprint();
-  void CalculateStatementFingerprint();
-  void CalculateFunctionNodeFingerprint();
-
-  uint32_t hash_;
-};
-
 class StreamingFlowGraphBuilder : public KernelReaderHelper {
  public:
   StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder,
@@ -196,8 +34,11 @@
             data_program_offset),
         flow_graph_builder_(flow_graph_builder),
         active_class_(&flow_graph_builder->active_class_),
-        constant_evaluator_(this),
         type_translator_(this, active_class_, /* finalize= */ true),
+        constant_evaluator_(this,
+                            &type_translator_,
+                            active_class_,
+                            flow_graph_builder),
         current_script_id_(-1),
         record_for_script_id_(-1),
         record_token_positions_into_(NULL),
@@ -223,8 +64,8 @@
                            data_program_offset),
         flow_graph_builder_(NULL),
         active_class_(active_class),
-        constant_evaluator_(this),
         type_translator_(this, active_class_, /* finalize= */ true),
+        constant_evaluator_(this, &type_translator_, active_class_, nullptr),
         current_script_id_(-1),
         record_for_script_id_(-1),
         record_token_positions_into_(NULL),
@@ -250,8 +91,8 @@
                            data_program_offset),
         flow_graph_builder_(NULL),
         active_class_(active_class),
-        constant_evaluator_(this),
         type_translator_(this, active_class_, /* finalize= */ true),
+        constant_evaluator_(this, &type_translator_, active_class_, nullptr),
         current_script_id_(-1),
         record_for_script_id_(-1),
         record_token_positions_into_(NULL),
@@ -344,7 +185,6 @@
   LocalVariable* MakeTemporary();
 
   LocalVariable* LookupVariable(intptr_t kernel_offset);
-  Function& FindMatchingFunctionAnyArgs(const Class& klass, const String& name);
   Function& FindMatchingFunction(const Class& klass,
                                  const String& name,
                                  int type_args_len,
@@ -576,8 +416,8 @@
 
   FlowGraphBuilder* flow_graph_builder_;
   ActiveClass* const active_class_;
-  StreamingConstantEvaluator constant_evaluator_;
   TypeTranslator type_translator_;
+  ConstantEvaluator constant_evaluator_;
   intptr_t current_script_id_;
   intptr_t record_for_script_id_;
   GrowableArray<intptr_t>* record_token_positions_into_;
@@ -589,76 +429,9 @@
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
 
-  friend class ConstantHelper;
   friend class KernelLoader;
-  friend class SimpleExpressionConverter;
-  friend class StreamingConstantEvaluator;
-};
 
-// Helper class that reads a kernel Constant from binary.
-class ConstantHelper {
- public:
-  ConstantHelper(ActiveClass* active_class,
-                 StreamingFlowGraphBuilder* builder,
-                 TypeTranslator* type_translator,
-                 TranslationHelper* translation_helper,
-                 Zone* zone,
-                 NameIndex skip_vmservice_library)
-      : skip_vmservice_library_(skip_vmservice_library),
-        active_class_(active_class),
-        builder_(*builder),
-        type_translator_(*type_translator),
-        const_evaluator_(&builder_),
-        translation_helper_(*translation_helper),
-        zone_(zone),
-        temp_type_(AbstractType::Handle(zone)),
-        temp_type_arguments_(TypeArguments::Handle(zone)),
-        temp_type_arguments2_(TypeArguments::Handle(zone)),
-        temp_type_arguments3_(TypeArguments::Handle(zone)),
-        temp_object_(Object::Handle(zone)),
-        temp_array_(Array::Handle(zone)),
-        temp_instance_(Instance::Handle(zone)),
-        temp_field_(Field::Handle(zone)),
-        temp_class_(Class::Handle(zone)),
-        temp_function_(Function::Handle(zone)),
-        temp_closure_(Closure::Handle(zone)),
-        temp_context_(Context::Handle(zone)),
-        temp_integer_(Integer::Handle(zone)) {}
-
-  // Reads the constant table from the binary.
-  //
-  // This method assumes the Reader is positioned already at the constant table
-  // and an active class scope is setup.
-  const Array& ReadConstantTable();
-
- private:
-  void InstantiateTypeArguments(const Class& receiver_class,
-                                TypeArguments* type_arguments);
-
-  // If [index] has `dart:vm_service` as a parent and we are skipping the VM
-  // service library, this method returns `true`, otherwise `false`.
-  bool ShouldSkipConstant(NameIndex index);
-
-  NameIndex skip_vmservice_library_;
-  ActiveClass* const active_class_;
-  StreamingFlowGraphBuilder& builder_;
-  TypeTranslator& type_translator_;
-  StreamingConstantEvaluator const_evaluator_;
-  TranslationHelper translation_helper_;
-  Zone* zone_;
-  AbstractType& temp_type_;
-  TypeArguments& temp_type_arguments_;
-  TypeArguments& temp_type_arguments2_;
-  TypeArguments& temp_type_arguments3_;
-  Object& temp_object_;
-  Array& temp_array_;
-  Instance& temp_instance_;
-  Field& temp_field_;
-  Class& temp_class_;
-  Function& temp_function_;
-  Closure& temp_closure_;
-  Context& temp_context_;
-  Integer& temp_integer_;
+  DISALLOW_COPY_AND_ASSIGN(StreamingFlowGraphBuilder);
 };
 
 }  // namespace kernel
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
new file mode 100644
index 0000000..71dad90
--- /dev/null
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -0,0 +1,845 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/frontend/kernel_fingerprints.h"
+#include "vm/compiler/frontend/kernel_translation_helper.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#define H (translation_helper_)
+#define I Isolate::Current()
+
+namespace dart {
+namespace kernel {
+
+class KernelFingerprintHelper : public KernelReaderHelper {
+ public:
+  KernelFingerprintHelper(Zone* zone,
+                          TranslationHelper* translation_helper,
+                          const Script& script,
+                          const ExternalTypedData& data,
+                          intptr_t data_program_offset)
+      : KernelReaderHelper(zone,
+                           translation_helper,
+                           script,
+                           data,
+                           data_program_offset),
+        hash_(0) {}
+
+  virtual ~KernelFingerprintHelper() {}
+  uint32_t CalculateFieldFingerprint();
+  uint32_t CalculateFunctionFingerprint();
+
+  static uint32_t CalculateHash(uint32_t current, uint32_t val) {
+    return current * 31 + val;
+  }
+
+ private:
+  void BuildHash(uint32_t val);
+  void CalculateConstructorFingerprint();
+  void CalculateArgumentsFingerprint();
+  void CalculateVariableDeclarationFingerprint();
+  void CalculateStatementListFingerprint();
+  void CalculateListOfExpressionsFingerprint();
+  void CalculateListOfDartTypesFingerprint();
+  void CalculateListOfVariableDeclarationsFingerprint();
+  void CalculateStringReferenceFingerprint();
+  void CalculateListOfStringsFingerprint();
+  void CalculateTypeParameterFingerprint();
+  void CalculateTypeParametersListFingerprint();
+  void CalculateCanonicalNameFingerprint();
+  void CalculateInitializerFingerprint();
+  void CalculateDartTypeFingerprint();
+  void CalculateOptionalDartTypeFingerprint();
+  void CalculateInterfaceTypeFingerprint(bool simple);
+  void CalculateFunctionTypeFingerprint(bool simple);
+  void CalculateGetterNameFingerprint();
+  void CalculateSetterNameFingerprint();
+  void CalculateMethodNameFingerprint();
+  void CalculateExpressionFingerprint();
+  void CalculateStatementFingerprint();
+  void CalculateFunctionNodeFingerprint();
+
+  uint32_t hash_;
+
+  DISALLOW_COPY_AND_ASSIGN(KernelFingerprintHelper);
+};
+
+void KernelFingerprintHelper::BuildHash(uint32_t val) {
+  hash_ = CalculateHash(hash_, val);
+}
+
+void KernelFingerprintHelper::CalculateConstructorFingerprint() {
+  ConstructorHelper helper(this);
+
+  helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
+  CalculateListOfExpressionsFingerprint();
+  CalculateFunctionNodeFingerprint();
+  intptr_t len = ReadListLength();
+  for (intptr_t i = 0; i < len; ++i) {
+    CalculateInitializerFingerprint();
+  }
+  helper.SetJustRead(ConstructorHelper::kInitializers);
+  BuildHash(helper.flags_);
+  BuildHash(helper.annotation_count_);
+}
+
+void KernelFingerprintHelper::CalculateArgumentsFingerprint() {
+  BuildHash(ReadUInt());  // read argument count.
+
+  CalculateListOfDartTypesFingerprint();    // read list of types.
+  CalculateListOfExpressionsFingerprint();  // read positionals.
+
+  // List of named.
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateStringReferenceFingerprint();  // read ith name index.
+    CalculateExpressionFingerprint();       // read ith expression.
+  }
+}
+
+void KernelFingerprintHelper::CalculateVariableDeclarationFingerprint() {
+  VariableDeclarationHelper helper(this);
+
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
+  CalculateListOfExpressionsFingerprint();
+  helper.SetJustRead(VariableDeclarationHelper::kAnnotations);
+
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+  // We don't need to use the helper after this point.
+  CalculateDartTypeFingerprint();
+  if (ReadTag() == kSomething) {
+    CalculateExpressionFingerprint();
+  }
+
+  BuildHash(helper.flags_);
+}
+
+void KernelFingerprintHelper::CalculateStatementListFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateStatementFingerprint();  // read ith expression.
+  }
+}
+
+void KernelFingerprintHelper::CalculateListOfExpressionsFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateExpressionFingerprint();  // read ith expression.
+  }
+}
+
+void KernelFingerprintHelper::CalculateListOfDartTypesFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateDartTypeFingerprint();  // read ith type.
+  }
+}
+
+void KernelFingerprintHelper::CalculateStringReferenceFingerprint() {
+  BuildHash(
+      H.DartString(ReadStringReference()).Hash());  // read ith string index.
+}
+
+void KernelFingerprintHelper::CalculateListOfStringsFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateStringReferenceFingerprint();  // read ith string index.
+  }
+}
+
+void KernelFingerprintHelper::CalculateListOfVariableDeclarationsFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    // read ith variable declaration.
+    CalculateVariableDeclarationFingerprint();
+  }
+}
+
+void KernelFingerprintHelper::CalculateTypeParameterFingerprint() {
+  TypeParameterHelper helper(this);
+
+  helper.ReadUntilExcluding(TypeParameterHelper::kAnnotations);
+  CalculateListOfExpressionsFingerprint();
+  helper.SetJustRead(TypeParameterHelper::kAnnotations);
+
+  helper.ReadUntilExcluding(TypeParameterHelper::kBound);
+  // The helper isn't needed after this point.
+  CalculateDartTypeFingerprint();
+  if (ReadTag() == kSomething) {
+    CalculateDartTypeFingerprint();
+  }
+  BuildHash(helper.flags_);
+}
+
+void KernelFingerprintHelper::CalculateTypeParametersListFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateTypeParameterFingerprint();
+  }
+}
+
+void KernelFingerprintHelper::CalculateCanonicalNameFingerprint() {
+  const StringIndex i = H.CanonicalNameString(ReadCanonicalNameReference());
+  BuildHash(H.DartString(i).Hash());
+}
+
+void KernelFingerprintHelper::CalculateInitializerFingerprint() {
+  Tag tag = ReadTag();
+  ReadByte();  // read isSynthetic flag.
+  switch (tag) {
+    case kInvalidInitializer:
+      return;
+    case kFieldInitializer:
+      BuildHash(H.DartFieldName(ReadCanonicalNameReference()).Hash());
+      CalculateExpressionFingerprint();  // read value.
+      return;
+    case kSuperInitializer:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kRedirectingInitializer:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kLocalInitializer:
+      CalculateVariableDeclarationFingerprint();  // read variable.
+      return;
+    case kAssertInitializer:
+      CalculateStatementFingerprint();
+      return;
+    default:
+      ReportUnexpectedTag("initializer", tag);
+      UNREACHABLE();
+  }
+}
+
+void KernelFingerprintHelper::CalculateDartTypeFingerprint() {
+  Tag tag = ReadTag();
+  BuildHash(tag);
+  switch (tag) {
+    case kInvalidType:
+    case kDynamicType:
+    case kVoidType:
+    case kBottomType:
+      // those contain nothing.
+      break;
+      UNIMPLEMENTED();
+    case kInterfaceType:
+      CalculateInterfaceTypeFingerprint(false);
+      break;
+    case kSimpleInterfaceType:
+      CalculateInterfaceTypeFingerprint(true);
+      break;
+    case kFunctionType:
+      CalculateFunctionTypeFingerprint(false);
+      break;
+    case kSimpleFunctionType:
+      CalculateFunctionTypeFingerprint(true);
+      break;
+    case kTypeParameterType:
+      ReadUInt();                              // read index for parameter.
+      CalculateOptionalDartTypeFingerprint();  // read bound bound.
+      break;
+    default:
+      ReportUnexpectedTag("type", tag);
+      UNREACHABLE();
+  }
+}
+
+void KernelFingerprintHelper::CalculateOptionalDartTypeFingerprint() {
+  Tag tag = ReadTag();  // read tag.
+  BuildHash(tag);
+  if (tag == kNothing) {
+    return;
+  }
+  ASSERT(tag == kSomething);
+  CalculateDartTypeFingerprint();  // read type.
+}
+
+void KernelFingerprintHelper::CalculateInterfaceTypeFingerprint(bool simple) {
+  BuildHash(ReadUInt());  // read klass_name.
+  if (!simple) {
+    CalculateListOfDartTypesFingerprint();  // read list of types.
+  }
+}
+
+void KernelFingerprintHelper::CalculateFunctionTypeFingerprint(bool simple) {
+  if (!simple) {
+    CalculateTypeParametersListFingerprint();  // read type_parameters.
+    BuildHash(ReadUInt());                     // read required parameter count.
+    BuildHash(ReadUInt());                     // read total parameter count.
+  }
+
+  CalculateListOfDartTypesFingerprint();  // read positional_parameters types.
+
+  if (!simple) {
+    const intptr_t named_count =
+        ReadListLength();  // read named_parameters list length.
+    BuildHash(named_count);
+    for (intptr_t i = 0; i < named_count; ++i) {
+      // read string reference (i.e. named_parameters[i].name).
+      CalculateStringReferenceFingerprint();
+      CalculateDartTypeFingerprint();  // read named_parameters[i].type.
+    }
+  }
+
+  CalculateListOfStringsFingerprint();  // read positional parameter names.
+
+  if (!simple) {
+    // TODO(bkonyi): include in hash.
+    SkipCanonicalNameReference();  // read typedef reference.
+  }
+
+  CalculateDartTypeFingerprint();  // read return type.
+}
+
+void KernelFingerprintHelper::CalculateGetterNameFingerprint() {
+  const NameIndex name = ReadCanonicalNameReference();
+  if (I->strong() && !H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) {
+    BuildHash(H.DartGetterName(name).Hash());
+  }
+}
+
+void KernelFingerprintHelper::CalculateSetterNameFingerprint() {
+  const NameIndex name = ReadCanonicalNameReference();
+  if (I->strong() && !H.IsRoot(name)) {
+    BuildHash(H.DartSetterName(name).Hash());
+  }
+}
+
+void KernelFingerprintHelper::CalculateMethodNameFingerprint() {
+  const NameIndex name =
+      ReadCanonicalNameReference();  // read interface_target_reference.
+  if (I->strong() && !H.IsRoot(name) && !H.IsField(name)) {
+    BuildHash(H.DartProcedureName(name).Hash());
+  }
+}
+
+void KernelFingerprintHelper::CalculateExpressionFingerprint() {
+  uint8_t payload = 0;
+  Tag tag = ReadTag(&payload);
+  BuildHash(tag);
+  switch (tag) {
+    case kInvalidExpression:
+      ReadPosition();
+      CalculateStringReferenceFingerprint();
+      return;
+    case kVariableGet:
+      ReadPosition();                          // read position.
+      ReadUInt();                              // read kernel position.
+      ReadUInt();                              // read relative variable index.
+      CalculateOptionalDartTypeFingerprint();  // read promoted type.
+      return;
+    case kSpecializedVariableGet:
+      ReadPosition();  // read position.
+      ReadUInt();      // read kernel position.
+      return;
+    case kVariableSet:
+      ReadPosition();                    // read position.
+      ReadUInt();                        // read kernel position.
+      ReadUInt();                        // read relative variable index.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kSpecializedVariableSet:
+      ReadPosition();                    // read position.
+      ReadUInt();                        // read kernel position.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kPropertyGet:
+      ReadPosition();                            // read position.
+      CalculateExpressionFingerprint();          // read receiver.
+      BuildHash(ReadNameAsGetterName().Hash());  // read name.
+      CalculateGetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kPropertySet:
+      ReadPosition();                            // read position.
+      CalculateExpressionFingerprint();          // read receiver.
+      BuildHash(ReadNameAsSetterName().Hash());  // read name.
+      CalculateExpressionFingerprint();          // read value.
+      CalculateSetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kSuperPropertyGet:
+      ReadPosition();                            // read position.
+      BuildHash(ReadNameAsGetterName().Hash());  // read name.
+      CalculateGetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kSuperPropertySet:
+      ReadPosition();                            // read position.
+      BuildHash(ReadNameAsSetterName().Hash());  // read name.
+      CalculateExpressionFingerprint();          // read value.
+      CalculateSetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kDirectPropertyGet:
+      ReadPosition();                       // read position.
+      CalculateExpressionFingerprint();     // read receiver.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      return;
+    case kDirectPropertySet:
+      ReadPosition();                       // read position.
+      CalculateExpressionFingerprint();     // read receiver.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateExpressionFingerprint();     // read value·
+      return;
+    case kStaticGet:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      return;
+    case kStaticSet:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateExpressionFingerprint();     // read expression.
+      return;
+    case kMethodInvocation:
+      ReadPosition();                            // read position.
+      CalculateExpressionFingerprint();          // read receiver.
+      BuildHash(ReadNameAsMethodName().Hash());  // read name.
+      CalculateArgumentsFingerprint();           // read arguments.
+      CalculateMethodNameFingerprint();  // read interface_target_reference.
+      return;
+    case kSuperMethodInvocation:
+      ReadPosition();                            // read position.
+      BuildHash(ReadNameAsMethodName().Hash());  // read name.
+      CalculateArgumentsFingerprint();           // read arguments.
+      CalculateCanonicalNameFingerprint();       // read target_reference.
+      return;
+    case kDirectMethodInvocation:
+      ReadPosition();                       // read position.
+      CalculateExpressionFingerprint();     // read receiver.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kStaticInvocation:
+    case kConstStaticInvocation:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kConstructorInvocation:
+    case kConstConstructorInvocation:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kNot:
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kLogicalExpression:
+      CalculateExpressionFingerprint();  // read left.
+      SkipBytes(1);                      // read operator.
+      CalculateExpressionFingerprint();  // read right.
+      return;
+    case kConditionalExpression:
+      CalculateExpressionFingerprint();        // read condition.
+      CalculateExpressionFingerprint();        // read then.
+      CalculateExpressionFingerprint();        // read otherwise.
+      CalculateOptionalDartTypeFingerprint();  // read unused static type.
+      return;
+    case kStringConcatenation:
+      ReadPosition();                           // read position.
+      CalculateListOfExpressionsFingerprint();  // read list of expressions.
+      return;
+    case kIsExpression:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read operand.
+      CalculateDartTypeFingerprint();    // read type.
+      return;
+    case kAsExpression:
+      ReadPosition();                    // read position.
+      BuildHash(ReadFlags());            // read flags.
+      CalculateExpressionFingerprint();  // read operand.
+      CalculateDartTypeFingerprint();    // read type.
+      return;
+    case kSymbolLiteral:
+      CalculateStringReferenceFingerprint();  // read index into string table.
+      return;
+    case kTypeLiteral:
+      CalculateDartTypeFingerprint();  // read type.
+      return;
+    case kThisExpression:
+      return;
+    case kRethrow:
+      ReadPosition();  // read position.
+      return;
+    case kThrow:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kListLiteral:
+    case kConstListLiteral:
+      ReadPosition();                           // read position.
+      CalculateDartTypeFingerprint();           // read type.
+      CalculateListOfExpressionsFingerprint();  // read list of expressions.
+      return;
+    case kMapLiteral:
+    case kConstMapLiteral: {
+      ReadPosition();                           // read position.
+      CalculateDartTypeFingerprint();           // read type.
+      CalculateDartTypeFingerprint();           // read value type.
+      intptr_t list_length = ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        CalculateExpressionFingerprint();  // read ith key.
+        CalculateExpressionFingerprint();  // read ith value.
+      }
+      return;
+    }
+    case kFunctionExpression:
+      ReadPosition();                      // read position.
+      CalculateFunctionNodeFingerprint();  // read function node.
+      return;
+    case kLet:
+      CalculateVariableDeclarationFingerprint();  // read variable declaration.
+      CalculateExpressionFingerprint();           // read expression.
+      return;
+    case kInstantiation:
+      CalculateExpressionFingerprint();       // read expression.
+      CalculateListOfDartTypesFingerprint();  // read type arguments.
+      return;
+    case kBigIntLiteral:
+      CalculateStringReferenceFingerprint();  // read string reference.
+      return;
+    case kStringLiteral:
+      CalculateStringReferenceFingerprint();  // read string reference.
+      return;
+    case kSpecializedIntLiteral:
+      return;
+    case kNegativeIntLiteral:
+      BuildHash(ReadUInt());  // read value.
+      return;
+    case kPositiveIntLiteral:
+      BuildHash(ReadUInt());  // read value.
+      return;
+    case kDoubleLiteral: {
+      double value = ReadDouble();  // read value.
+      uint64_t data = bit_cast<uint64_t>(value);
+      BuildHash(static_cast<uint32_t>(data >> 32));
+      BuildHash(static_cast<uint32_t>(data));
+      return;
+    }
+    case kTrueLiteral:
+      return;
+    case kFalseLiteral:
+      return;
+    case kNullLiteral:
+      return;
+    case kConstantExpression:
+      SkipConstantReference();
+      return;
+    case kLoadLibrary:
+    case kCheckLibraryIsLoaded:
+      ReadUInt();  // skip library index
+      return;
+    default:
+      ReportUnexpectedTag("expression", tag);
+      UNREACHABLE();
+  }
+}
+
+void KernelFingerprintHelper::CalculateStatementFingerprint() {
+  Tag tag = ReadTag();  // read tag.
+  BuildHash(tag);
+  switch (tag) {
+    case kExpressionStatement:
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kBlock:
+      CalculateStatementListFingerprint();
+      return;
+    case kEmptyStatement:
+      return;
+    case kAssertBlock:
+      CalculateStatementListFingerprint();
+      return;
+    case kAssertStatement:
+      CalculateExpressionFingerprint();  // Read condition.
+      ReadPosition();                    // read condition start offset.
+      ReadPosition();                    // read condition end offset.
+      if (ReadTag() == kSomething) {
+        CalculateExpressionFingerprint();  // read (rest of) message.
+      }
+      return;
+    case kLabeledStatement:
+      CalculateStatementFingerprint();  // read body.
+      return;
+    case kBreakStatement:
+      ReadPosition();  // read position.
+      ReadUInt();      // read target_index.
+      return;
+    case kWhileStatement:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read condition.
+      CalculateStatementFingerprint();   // read body.
+      return;
+    case kDoStatement:
+      ReadPosition();                    // read position.
+      CalculateStatementFingerprint();   // read body.
+      CalculateExpressionFingerprint();  // read condition.
+      return;
+    case kForStatement: {
+      ReadPosition();                                    // read position.
+      CalculateListOfVariableDeclarationsFingerprint();  // read variables.
+      Tag tag = ReadTag();  // Read first part of condition.
+      if (tag == kSomething) {
+        CalculateExpressionFingerprint();  // read rest of condition.
+      }
+      CalculateListOfExpressionsFingerprint();  // read updates.
+      CalculateStatementFingerprint();          // read body.
+      return;
+    }
+    case kForInStatement:
+    case kAsyncForInStatement:
+      ReadPosition();                             // read position.
+      ReadPosition();                             // read body position.
+      CalculateVariableDeclarationFingerprint();  // read variable.
+      CalculateExpressionFingerprint();           // read iterable.
+      CalculateStatementFingerprint();            // read body.
+      return;
+    case kSwitchStatement: {
+      ReadPosition();                     // read position.
+      CalculateExpressionFingerprint();   // read condition.
+      int case_count = ReadListLength();  // read number of cases.
+      for (intptr_t i = 0; i < case_count; ++i) {
+        int expression_count = ReadListLength();  // read number of expressions.
+        for (intptr_t j = 0; j < expression_count; ++j) {
+          ReadPosition();                    // read jth position.
+          CalculateExpressionFingerprint();  // read jth expression.
+        }
+        BuildHash(ReadBool());            // read is_default.
+        CalculateStatementFingerprint();  // read body.
+      }
+      return;
+    }
+    case kContinueSwitchStatement:
+      ReadPosition();  // read position.
+      ReadUInt();      // read target_index.
+      return;
+    case kIfStatement:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read condition.
+      CalculateStatementFingerprint();   // read then.
+      CalculateStatementFingerprint();   // read otherwise.
+      return;
+    case kReturnStatement: {
+      ReadPosition();       // read position
+      Tag tag = ReadTag();  // read (first part of) expression.
+      BuildHash(tag);
+      if (tag == kSomething) {
+        CalculateExpressionFingerprint();  // read (rest of) expression.
+      }
+      return;
+    }
+    case kTryCatch: {
+      CalculateStatementFingerprint();          // read body.
+      BuildHash(ReadByte());                    // read flags
+      intptr_t catch_count = ReadListLength();  // read number of catches.
+      for (intptr_t i = 0; i < catch_count; ++i) {
+        ReadPosition();                  // read position.
+        CalculateDartTypeFingerprint();  // read guard.
+        tag = ReadTag();                 // read first part of exception.
+        BuildHash(tag);
+        if (tag == kSomething) {
+          CalculateVariableDeclarationFingerprint();  // read exception.
+        }
+        tag = ReadTag();  // read first part of stack trace.
+        BuildHash(tag);
+        if (tag == kSomething) {
+          CalculateVariableDeclarationFingerprint();  // read stack trace.
+        }
+        CalculateStatementFingerprint();  // read body.
+      }
+      return;
+    }
+    case kTryFinally:
+      CalculateStatementFingerprint();  // read body.
+      CalculateStatementFingerprint();  // read finalizer.
+      return;
+    case kYieldStatement: {
+      ReadPosition();                    // read position.
+      BuildHash(ReadByte());             // read flags.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    }
+    case kVariableDeclaration:
+      CalculateVariableDeclarationFingerprint();  // read variable declaration.
+      return;
+    case kFunctionDeclaration:
+      ReadPosition();                             // read position.
+      CalculateVariableDeclarationFingerprint();  // read variable.
+      CalculateFunctionNodeFingerprint();         // read function node.
+      return;
+    default:
+      ReportUnexpectedTag("statement", tag);
+      UNREACHABLE();
+  }
+}
+
+uint32_t KernelFingerprintHelper::CalculateFieldFingerprint() {
+  hash_ = 0;
+  FieldHelper field_helper(this);
+
+  field_helper.ReadUntilExcluding(FieldHelper::kName);
+  const String& name = ReadNameAsFieldName();  // read name.
+  field_helper.SetJustRead(FieldHelper::kName);
+
+  field_helper.ReadUntilExcluding(FieldHelper::kType);
+  CalculateDartTypeFingerprint();  // read type.
+  field_helper.SetJustRead(FieldHelper::kType);
+
+  if (ReadTag() == kSomething) {
+    if (PeekTag() == kFunctionExpression) {
+      AlternativeReadingScope alt(&reader_);
+      CalculateExpressionFingerprint();
+    }
+    SkipExpression();
+  }
+
+  BuildHash(name.Hash());
+  BuildHash(field_helper.flags_);
+  BuildHash(field_helper.annotation_count_);
+  return hash_;
+}
+
+void KernelFingerprintHelper::CalculateFunctionNodeFingerprint() {
+  FunctionNodeHelper function_node_helper(this);
+
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+  CalculateTypeParametersListFingerprint();
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+  CalculateListOfVariableDeclarationsFingerprint();  // read positionals
+  CalculateListOfVariableDeclarationsFingerprint();  // read named
+  CalculateDartTypeFingerprint();                    // read return type.
+
+  if (ReadTag() == kSomething) {
+    CalculateStatementFingerprint();  // Read body.
+  }
+  BuildHash(function_node_helper.total_parameter_count_);
+  BuildHash(function_node_helper.required_parameter_count_);
+}
+
+uint32_t KernelFingerprintHelper::CalculateFunctionFingerprint() {
+  hash_ = 0;
+  Tag tag = PeekTag();
+  if (tag == kField) {
+    return CalculateFieldFingerprint();
+  } else if (tag == kConstructor) {
+    CalculateConstructorFingerprint();
+    return hash_;
+  }
+  ProcedureHelper procedure_helper(this);
+  procedure_helper.ReadUntilExcluding(ProcedureHelper::kName);
+  const String& name = ReadNameAsMethodName();  // Read name.
+  procedure_helper.SetJustRead(ProcedureHelper::kName);
+
+  procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
+  if (ReadTag() == kSomething) {
+    CalculateFunctionNodeFingerprint();
+  }
+
+  BuildHash(procedure_helper.kind_);
+  BuildHash(procedure_helper.flags_);
+  BuildHash(procedure_helper.annotation_count_);
+  BuildHash(name.Hash());
+  return hash_;
+}
+
+uint32_t KernelSourceFingerprintHelper::CalculateClassFingerprint(
+    const Class& klass) {
+  Zone* zone = Thread::Current()->zone();
+
+  // Handle typedefs.
+  if (klass.IsTypedefClass()) {
+    const Function& func = Function::Handle(zone, klass.signature_function());
+    return CalculateFunctionFingerprint(func);
+  }
+
+  String& name = String::Handle(zone, klass.Name());
+  const Array& fields = Array::Handle(zone, klass.fields());
+  const Array& functions = Array::Handle(zone, klass.functions());
+  const Array& interfaces = Array::Handle(zone, klass.interfaces());
+  AbstractType& type = AbstractType::Handle(zone);
+
+  uint32_t hash = 0;
+  hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+
+  type ^= klass.super_type();
+  if (!type.IsNull()) {
+    name ^= type.Name();
+    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+  }
+
+  type ^= klass.mixin();
+  if (!type.IsNull()) {
+    name ^= type.Name();
+    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+  }
+
+  Field& field = Field::Handle(zone);
+  // Calculate fingerprint for the class fields.
+  for (intptr_t i = 0; i < fields.Length(); ++i) {
+    field ^= fields.At(i);
+    uint32_t fingerprint = CalculateFieldFingerprint(field);
+    hash = KernelFingerprintHelper::CalculateHash(hash, fingerprint);
+  }
+
+  // Calculate fingerprint for the class functions.
+  Function& func = Function::Handle(zone);
+  for (intptr_t i = 0; i < functions.Length(); ++i) {
+    func ^= functions.At(i);
+    uint32_t fingerprint = CalculateFunctionFingerprint(func);
+    hash = KernelFingerprintHelper::CalculateHash(hash, fingerprint);
+  }
+
+  // Calculate fingerprint for the interfaces.
+  for (intptr_t i = 0; i < interfaces.Length(); ++i) {
+    type ^= interfaces.At(i);
+    name ^= type.Name();
+    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+  }
+
+  return hash;
+}
+
+uint32_t KernelSourceFingerprintHelper::CalculateFieldFingerprint(
+    const Field& field) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Script& script = Script::Handle(zone, field.Script());
+
+  TranslationHelper translation_helper(thread);
+  translation_helper.InitFromScript(script);
+
+  KernelFingerprintHelper helper(
+      zone, &translation_helper, script,
+      ExternalTypedData::Handle(zone, field.KernelData()),
+      field.KernelDataProgramOffset());
+  helper.SetOffset(field.kernel_offset());
+  return helper.CalculateFieldFingerprint();
+}
+
+uint32_t KernelSourceFingerprintHelper::CalculateFunctionFingerprint(
+    const Function& func) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Script& script = Script::Handle(zone, func.script());
+
+  TranslationHelper translation_helper(thread);
+  translation_helper.InitFromScript(script);
+
+  KernelFingerprintHelper helper(
+      zone, &translation_helper, script,
+      ExternalTypedData::Handle(zone, func.KernelData()),
+      func.KernelDataProgramOffset());
+  helper.SetOffset(func.kernel_offset());
+  return helper.CalculateFunctionFingerprint();
+}
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.h b/runtime/vm/compiler/frontend/kernel_fingerprints.h
new file mode 100644
index 0000000..601a488a
--- /dev/null
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.h
@@ -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.
+
+#ifndef RUNTIME_VM_COMPILER_FRONTEND_KERNEL_FINGERPRINTS_H_
+#define RUNTIME_VM_COMPILER_FRONTEND_KERNEL_FINGERPRINTS_H_
+
+#include "platform/allocation.h"
+#include "vm/object.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+namespace dart {
+namespace kernel {
+
+class KernelSourceFingerprintHelper : public AllStatic {
+ public:
+  static uint32_t CalculateClassFingerprint(const Class& klass);
+  static uint32_t CalculateFieldFingerprint(const Field& field);
+  static uint32_t CalculateFunctionFingerprint(const Function& func);
+};
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // RUNTIME_VM_COMPILER_FRONTEND_KERNEL_FINGERPRINTS_H_
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index d22bad5..73d7c38 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -104,8 +104,7 @@
       breakable_block_(NULL),
       switch_block_(NULL),
       try_finally_block_(NULL),
-      catch_block_(NULL),
-      streaming_flow_graph_builder_(NULL) {
+      catch_block_(NULL) {
   const Script& script =
       Script::Handle(Z, parsed_function->function().script());
   H.InitFromScript(script);
@@ -113,66 +112,6 @@
 
 FlowGraphBuilder::~FlowGraphBuilder() {}
 
-Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
-    TryFinallyBlock* outer_finally,
-    intptr_t target_context_depth) {
-  TryFinallyBlock* const saved_block = try_finally_block_;
-  TryCatchBlock* const saved_try_catch_block = try_catch_block_;
-  const intptr_t saved_depth = context_depth_;
-  const intptr_t saved_try_depth = try_depth_;
-
-  Fragment instructions;
-
-  // While translating the body of a finalizer we need to set the try-finally
-  // block which is active when translating the body.
-  while (try_finally_block_ != outer_finally) {
-    // Set correct try depth (in case there are nested try statements).
-    try_depth_ = try_finally_block_->try_depth();
-
-    // Potentially restore the context to what is expected for the finally
-    // block.
-    instructions += AdjustContextTo(try_finally_block_->context_depth());
-
-    // The to-be-translated finalizer has to have the correct try-index (namely
-    // the one outside the try-finally block).
-    bool changed_try_index = false;
-    intptr_t target_try_index = try_finally_block_->try_index();
-    while (CurrentTryIndex() != target_try_index) {
-      try_catch_block_ = try_catch_block_->outer();
-      changed_try_index = true;
-    }
-    if (changed_try_index) {
-      JoinEntryInstr* entry = BuildJoinEntry();
-      instructions += Goto(entry);
-      instructions = Fragment(instructions.entry, entry);
-    }
-
-    intptr_t finalizer_kernel_offset =
-        try_finally_block_->finalizer_kernel_offset();
-    try_finally_block_ = try_finally_block_->outer();
-    instructions += streaming_flow_graph_builder_->BuildStatementAt(
-        finalizer_kernel_offset);
-
-    // We only need to make sure that if the finalizer ended normally, we
-    // continue towards the next outer try-finally.
-    if (!instructions.is_open()) break;
-  }
-
-  if (instructions.is_open() && target_context_depth != -1) {
-    // A target context depth of -1 indicates that the code after this
-    // will not care about the context chain so we can leave it any way we
-    // want after the last finalizer.  That is used when returning.
-    instructions += AdjustContextTo(target_context_depth);
-  }
-
-  try_finally_block_ = saved_block;
-  try_catch_block_ = saved_try_catch_block;
-  context_depth_ = saved_depth;
-  try_depth_ = saved_try_depth;
-
-  return instructions;
-}
-
 Fragment FlowGraphBuilder::EnterScope(intptr_t kernel_offset,
                                       intptr_t* num_context_variables) {
   Fragment instructions;
@@ -1333,10 +1272,7 @@
   StreamingFlowGraphBuilder streaming_flow_graph_builder(
       this, ExternalTypedData::Handle(Z, function.KernelData()),
       function.KernelDataProgramOffset());
-  streaming_flow_graph_builder_ = &streaming_flow_graph_builder;
-  FlowGraph* result = streaming_flow_graph_builder_->BuildGraph();
-  streaming_flow_graph_builder_ = NULL;
-  return result;
+  return streaming_flow_graph_builder.BuildGraph();
 }
 
 Fragment FlowGraphBuilder::NativeFunctionBody(intptr_t first_positional_offset,
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 53d60ec..cca1409 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -7,7 +7,6 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
-#include <functional>
 #include <initializer_list>
 
 #include "vm/growable_array.h"
@@ -15,7 +14,7 @@
 
 #include "vm/compiler/backend/flow_graph.h"
 #include "vm/compiler/backend/il.h"
-#include "vm/compiler/frontend/flow_graph_builder.h"
+#include "vm/compiler/frontend/flow_graph_builder.h"  // For InlineExitCollector.
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/frontend/scope_builder.h"
 
@@ -253,6 +252,8 @@
   friend class StreamingFlowGraphBuilder;
   friend class FlowGraphBuilder;
   friend class PrologueBuilder;
+
+  DISALLOW_COPY_AND_ASSIGN(BaseFlowGraphBuilder);
 };
 
 class FlowGraphBuilder : public BaseFlowGraphBuilder {
@@ -285,9 +286,6 @@
   Fragment NativeFunctionBody(intptr_t first_positional_offset,
                               const Function& function);
 
-  Fragment TranslateFinallyFinalizers(TryFinallyBlock* outer_finally,
-                                      intptr_t target_context_depth);
-
   Fragment EnterScope(intptr_t kernel_offset,
                       intptr_t* num_context_variables = NULL);
   Fragment ExitScope(intptr_t kernel_offset);
@@ -468,14 +466,15 @@
 
   ActiveClass active_class_;
 
-  StreamingFlowGraphBuilder* streaming_flow_graph_builder_;
-
   friend class BreakableBlock;
   friend class CatchBlock;
+  friend class ConstantEvaluator;
   friend class StreamingFlowGraphBuilder;
   friend class SwitchBlock;
   friend class TryCatchBlock;
   friend class TryFinallyBlock;
+
+  DISALLOW_COPY_AND_ASSIGN(FlowGraphBuilder);
 };
 
 class SwitchBlock {
@@ -557,6 +556,8 @@
   intptr_t depth_;
   intptr_t context_depth_;
   intptr_t try_index_;
+
+  DISALLOW_COPY_AND_ASSIGN(SwitchBlock);
 };
 
 class TryCatchBlock {
@@ -578,6 +579,8 @@
   BaseFlowGraphBuilder* builder_;
   TryCatchBlock* outer_;
   intptr_t try_index_;
+
+  DISALLOW_COPY_AND_ASSIGN(TryCatchBlock);
 };
 
 class TryFinallyBlock {
@@ -609,6 +612,8 @@
   const intptr_t context_depth_;
   const intptr_t try_depth_;
   const intptr_t try_index_;
+
+  DISALLOW_COPY_AND_ASSIGN(TryFinallyBlock);
 };
 
 class BreakableBlock {
@@ -661,6 +666,8 @@
   TryFinallyBlock* outer_finally_;
   intptr_t context_depth_;
   intptr_t try_index_;
+
+  DISALLOW_COPY_AND_ASSIGN(BreakableBlock);
 };
 
 class CatchBlock {
@@ -688,6 +695,8 @@
   LocalVariable* exception_var_;
   LocalVariable* stack_trace_var_;
   intptr_t catch_try_index_;
+
+  DISALLOW_COPY_AND_ASSIGN(CatchBlock);
 };
 
 RawObject* EvaluateMetadata(const Field& metadata_field,
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 8e6e3b39..5872d07 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -585,6 +585,21 @@
   return function;
 }
 
+RawFunction* TranslationHelper::LookupDynamicFunction(const Class& klass,
+                                                      const String& name) {
+  // Search the superclass chain for the selector.
+  Class& iterate_klass = Class::Handle(Z, klass.raw());
+  while (!iterate_klass.IsNull()) {
+    RawFunction* function =
+        iterate_klass.LookupDynamicFunctionAllowPrivate(name);
+    if (function != Object::null()) {
+      return function;
+    }
+    iterate_klass = iterate_klass.SuperClass();
+  }
+  return Function::null();
+}
+
 Type& TranslationHelper::GetCanonicalType(const Class& klass) {
   ASSERT(!klass.IsNull());
   // Note that if cls is _Closure, the returned type will be _Closure,
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index f18a9bb..5175bfb 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -146,6 +146,7 @@
       StringIndex constructor_name);
   RawFunction* LookupMethodByMember(NameIndex target,
                                     const String& method_name);
+  RawFunction* LookupDynamicFunction(const Class& klass, const String& name);
 
   Type& GetCanonicalType(const Class& klass);
 
@@ -186,6 +187,8 @@
   ExternalTypedData& metadata_payloads_;
   ExternalTypedData& metadata_mappings_;
   Array& constants_;
+
+  DISALLOW_COPY_AND_ASSIGN(TranslationHelper);
 };
 
 // Helper class that reads a kernel FunctionNode from binary.
@@ -245,6 +248,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(FunctionNodeHelper);
 };
 
 class TypeParameterHelper {
@@ -295,6 +300,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(TypeParameterHelper);
 };
 
 // Helper class that reads a kernel VariableDeclaration from binary.
@@ -353,6 +360,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(VariableDeclarationHelper);
 };
 
 // Helper class that reads a kernel Field from binary.
@@ -434,6 +443,8 @@
   bool has_function_literal_initializer_;
   TokenPosition function_literal_start_;
   TokenPosition function_literal_end_;
+
+  DISALLOW_COPY_AND_ASSIGN(FieldHelper);
 };
 
 // Helper class that reads a kernel Procedure from binary.
@@ -518,6 +529,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(ProcedureHelper);
 };
 
 // Helper class that reads a kernel Constructor from binary.
@@ -577,6 +590,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(ConstructorHelper);
 };
 
 // Helper class that reads a kernel Class from binary.
@@ -649,6 +664,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(ClassHelper);
 };
 
 // Helper class that reads a kernel Library from binary.
@@ -705,6 +722,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(LibraryHelper);
 };
 
 class LibraryDependencyHelper {
@@ -745,6 +764,8 @@
  private:
   KernelReaderHelper* helper_;
   intptr_t next_read_;
+
+  DISALLOW_COPY_AND_ASSIGN(LibraryDependencyHelper);
 };
 
 // Base class for helpers accessing metadata of a certain kind.
@@ -778,6 +799,8 @@
   intptr_t mappings_num_;
   intptr_t last_node_offset_;
   intptr_t last_mapping_index_;
+
+  DISALLOW_COPY_AND_ASSIGN(MetadataHelper);
 };
 
 struct DirectCallMetadata {
@@ -803,6 +826,8 @@
   bool ReadMetadata(intptr_t node_offset,
                     NameIndex* target_name,
                     bool* check_receiver_for_null);
+
+  DISALLOW_COPY_AND_ASSIGN(DirectCallMetadataHelper);
 };
 
 struct InferredTypeMetadata {
@@ -823,6 +848,9 @@
   explicit InferredTypeMetadataHelper(KernelReaderHelper* helper);
 
   InferredTypeMetadata GetInferredType(intptr_t node_offset);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InferredTypeMetadataHelper);
 };
 
 struct ProcedureAttributesMetadata {
@@ -849,6 +877,8 @@
  private:
   bool ReadMetadata(intptr_t node_offset,
                     ProcedureAttributesMetadata* metadata);
+
+  DISALLOW_COPY_AND_ASSIGN(ProcedureAttributesMetadataHelper);
 };
 
 class KernelReaderHelper {
@@ -961,6 +991,7 @@
   intptr_t data_program_offset_;
 
   friend class ClassHelper;
+  friend class ConstantEvaluator;
   friend class ConstantHelper;
   friend class ConstructorHelper;
   friend class DirectCallMetadataHelper;
@@ -974,7 +1005,6 @@
   friend class ProcedureAttributesMetadataHelper;
   friend class ProcedureHelper;
   friend class SimpleExpressionConverter;
-  friend class StreamingConstantEvaluator;
   friend class ScopeBuilder;
   friend class TypeParameterHelper;
   friend class TypeTranslator;
@@ -983,6 +1013,9 @@
 #if defined(DART_USE_INTERPRETER)
   friend class BytecodeMetadataHelper;
 #endif  // defined(DART_USE_INTERPRETER)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(KernelReaderHelper);
 };
 
 class ActiveClass {
@@ -1046,6 +1079,8 @@
  private:
   ActiveClass* active_class_;
   ActiveClass saved_;
+
+  DISALLOW_COPY_AND_ASSIGN(ActiveClassScope);
 };
 
 class ActiveMemberScope {
@@ -1061,6 +1096,8 @@
  private:
   ActiveClass* active_class_;
   ActiveClass saved_;
+
+  DISALLOW_COPY_AND_ASSIGN(ActiveMemberScope);
 };
 
 class ActiveTypeParametersScope {
@@ -1087,6 +1124,8 @@
  private:
   ActiveClass* active_class_;
   ActiveClass saved_;
+
+  DISALLOW_COPY_AND_ASSIGN(ActiveTypeParametersScope);
 };
 
 class TypeTranslator {
@@ -1162,6 +1201,8 @@
 
   friend class ScopeBuilder;
   friend class KernelLoader;
+
+  DISALLOW_COPY_AND_ASSIGN(TypeTranslator);
 };
 
 }  // namespace kernel
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index 117f76c..a60d6fb 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -6,7 +6,7 @@
 
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/backend/il_printer.h"
-#include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/kernel_loader.h"
 #include "vm/longjump.h"
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
index 4d63d92..210c51b 100644
--- a/runtime/vm/compiler/frontend/scope_builder.h
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -159,6 +159,8 @@
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
   TypeTranslator type_translator_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopeBuilder);
 };
 
 struct FunctionScope {
@@ -221,6 +223,9 @@
 
   // For-in iterators, one per for-in nesting level.
   GrowableArray<LocalVariable*> iterator_variables;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ScopeBuildingResult);
 };
 
 bool IsFieldInitializer(const Function& function, Zone* zone);
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 8be187e..7eb81e2 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -268,7 +268,6 @@
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 const Register LRREG = LR;  // Link register.
-const Register ICREG = R9;  // IC data register.
 const Register ARGS_DESC_REG = R4;
 const Register CODE_REG = R6;
 const Register THR = R10;  // Caches current thread in generated code.
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 9294a1b..bde068a 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -112,7 +112,6 @@
 const Register FPREG = FP;          // Frame pointer register.
 const Register SPREG = R15;         // Stack pointer register.
 const Register LRREG = LR;          // Link register.
-const Register ICREG = R5;          // IC data register.
 const Register ARGS_DESC_REG = R4;  // Arguments descriptor register.
 const Register THR = R26;           // Caches current thread in generated code.
 const Register CALLEE_SAVED_TEMP = R19;
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index 2c94483..c211898 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -596,9 +596,11 @@
 //    arguments SP[-2] using SubtypeTestCache PP[D].
 //    If A is 1, then the instance may be a Smi.
 //
+//    Instance remains on stack. Other arguments are consumed.
+//
 //  - AssertSubtype
 //
-//    Assers that one type is a subtype of another.  Throws a TypeError
+//    Assert that one type is a subtype of another.  Throws a TypeError
 //    otherwise.  The stack has the following arguments on it:
 //
 //        SP[-4]  instantiator type args
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 1f4e449..239d4ab 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -60,7 +60,6 @@
 const Register PP = kNoRegister;     // No object pool pointer.
 const Register SPREG = ESP;          // Stack pointer register.
 const Register FPREG = EBP;          // Frame pointer register.
-const Register ICREG = ECX;          // IC data register.
 const Register ARGS_DESC_REG = EDX;  // Arguments descriptor register.
 const Register THR = ESI;            // Caches current thread in generated code.
 const Register CALLEE_SAVED_TEMP = EBX;
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index e6250b5..6874731 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -624,9 +624,11 @@
 //    arguments SP[-2] using SubtypeTestCache PP[D].
 //    If A is 1, then the instance may be a Smi.
 //
+//    Instance remains on stack. Other arguments are consumed.
+//
 //  - AssertSubtype
 //
-//    Assers that one type is a subtype of another.  Throws a TypeError
+//    Assert that one type is a subtype of another.  Throws a TypeError
 //    otherwise.  The stack has the following arguments on it:
 //
 //        SP[-4]  instantiator type args
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 0038c40..163821d 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -103,7 +103,6 @@
 const Register PP = R15;
 const Register SPREG = RSP;          // Stack pointer register.
 const Register FPREG = RBP;          // Frame pointer register.
-const Register ICREG = RBX;          // IC data register.
 const Register ARGS_DESC_REG = R10;  // Arguments descriptor register.
 const Register CODE_REG = R12;
 const Register THR = R14;  // Caches current thread in generated code.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index ddce593..b3bc990 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -324,21 +324,21 @@
   return NULL;
 }
 
-// This waits until only the VM isolate and the service isolate remains in the
-// list, i.e. list length == 2.
+bool Dart::HasApplicationIsolateLocked() {
+  for (Isolate* isolate = Isolate::isolates_list_head_; isolate != NULL;
+       isolate = isolate->next_) {
+    if (!Isolate::IsVMInternalIsolate(isolate)) return true;
+  }
+  return false;
+}
+
+// This waits until only the VM, service and kernel isolates are in the list.
 void Dart::WaitForApplicationIsolateShutdown() {
   ASSERT(!Isolate::creation_enabled_);
   MonitorLocker ml(Isolate::isolates_list_monitor_);
-  while ((Isolate::isolates_list_head_ != NULL) &&
-         (Isolate::isolates_list_head_->next_ != NULL) &&
-         (Isolate::isolates_list_head_->next_->next_ != NULL)) {
+  while (HasApplicationIsolateLocked()) {
     ml.Wait();
   }
-  ASSERT(
-      ((Isolate::isolates_list_head_ == Dart::vm_isolate()) &&
-       ServiceIsolate::IsServiceIsolate(Isolate::isolates_list_head_->next_)) ||
-      ((Isolate::isolates_list_head_->next_ == Dart::vm_isolate()) &&
-       ServiceIsolate::IsServiceIsolate(Isolate::isolates_list_head_)));
 }
 
 // This waits until only the VM isolate remains in the list.
@@ -402,7 +402,7 @@
 
   // Wait for all isolates, but the service and the vm isolate to shut down.
   // Only do that if there is a service isolate running.
-  if (ServiceIsolate::IsRunning()) {
+  if (ServiceIsolate::IsRunning() || KernelIsolate::IsRunning()) {
     if (FLAG_trace_shutdown) {
       OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down app isolates\n",
                    UptimeMillis());
@@ -410,6 +410,13 @@
     WaitForApplicationIsolateShutdown();
   }
 
+  // Shutdown the kernel isolate.
+  if (FLAG_trace_shutdown) {
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down kernel isolate\n",
+                 UptimeMillis());
+  }
+  KernelIsolate::Shutdown();
+
   // Shutdown the service isolate.
   if (FLAG_trace_shutdown) {
     OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down service isolate\n",
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 76243b3..fe4f566 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -120,6 +120,7 @@
  private:
   static void WaitForIsolateShutdown();
   static void WaitForApplicationIsolateShutdown();
+  static bool HasApplicationIsolateLocked();
 
   static Isolate* vm_isolate_;
   static int64_t start_time_micros_;
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 2ccdeca..864e7bf 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6057,11 +6057,13 @@
                                           platform_kernel_size, 0, NULL,
                                           incremental_compile, package_config);
   if (result.status == Dart_KernelCompilationStatus_Ok) {
-    if (KernelIsolate::AcceptCompilation().status !=
-        Dart_KernelCompilationStatus_Ok) {
-      FATAL(
+    Dart_KernelCompilationResult accept_result =
+        KernelIsolate::AcceptCompilation();
+    if (accept_result.status != Dart_KernelCompilationStatus_Ok) {
+      FATAL1(
           "An error occurred in the CFE while accepting the most recent"
-          " compilation results.");
+          " compilation results: %s",
+          accept_result.error);
     }
   }
 #endif
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index ef393a7..e81dd2f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -581,7 +581,7 @@
   EXPECT(Dart_IsError(result));
 
   if (FLAG_use_dart_frontend) {
-    EXPECT_SUBSTRING("Expected ';' before this.", Dart_GetError(result));
+    EXPECT_SUBSTRING("Expected ';' after this.", Dart_GetError(result));
   } else {
     EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
   }
@@ -593,7 +593,7 @@
   result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
   EXPECT(Dart_IsError(result));
   if (FLAG_use_dart_frontend) {
-    EXPECT_SUBSTRING("Expected ';' before this.", Dart_GetError(result));
+    EXPECT_SUBSTRING("Expected ';' after this.", Dart_GetError(result));
   } else {
     EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
   }
@@ -605,7 +605,7 @@
   result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
   EXPECT(Dart_IsError(result));
   if (FLAG_use_dart_frontend) {
-    EXPECT_SUBSTRING("Expected ';' before this.", Dart_GetError(result));
+    EXPECT_SUBSTRING("Expected ';' after this.", Dart_GetError(result));
   } else {
     EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
   }
@@ -6853,7 +6853,7 @@
       "foo1:///main.dart",
       /* multiroot_filepaths= */ "/bar,/baz",
       /* multiroot_scheme= */ "foo");
-  EXPECT_ERROR(lib, "Compilation failed foo1");
+  EXPECT_ERROR(lib, "Compilation failed FileSystemException(uri=foo1:");
 }
 
 void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 790ff67..689d488 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -1178,6 +1178,9 @@
       void* peer = object->value.as_external_typed_data.peer;
       Dart_WeakPersistentHandleFinalizer callback =
           object->value.as_external_typed_data.callback;
+      if (callback == NULL) {
+        return false;
+      }
       WriteSmi(length);
       finalizable_data_->Put(length, reinterpret_cast<void*>(data), peer,
                              callback);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 5c97ead..8fca526 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -138,12 +138,10 @@
       }
     }
     if (!function.HasCode() && function.HasBytecode()) {
-      const Code& bytecode = Code::Handle(zone, function.Bytecode());
-      ASSERT(!bytecode.IsNull());
       ASSERT(thread->no_callback_scope_depth() == 0);
       SuspendLongJumpScope suspend_long_jump_scope(thread);
       TransitionToGenerated transition(thread);
-      return Interpreter::Current()->Call(bytecode, arguments_descriptor,
+      return Interpreter::Current()->Call(function, arguments_descriptor,
                                           arguments, thread);
     }
 #else
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 12b87ef..11fc088 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -13,7 +13,6 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/compiler/jit/compiler.h"
-#include "vm/constants_kbc.h"
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
@@ -599,14 +598,6 @@
 }
 #endif  // defined(DEBUG)
 
-bool Interpreter::IsTracing() const {
-#if defined(DEBUG)
-  return IsTracingExecution();
-#else
-  return false;
-#endif
-}
-
 // Calls into the Dart runtime are based on this interface.
 typedef void (*InterpreterRuntimeCall)(NativeArguments arguments);
 
@@ -972,16 +963,46 @@
     }
     case RawFunction::kImplicitSetter: {
       // Field object is cached in function's data_.
-      // TODO(regis): We currently ignore field.guarded_cid() and the type
-      // test of the setter value. Either execute these tests here or fall
-      // back to compiling the setter when required.
+      // TODO(regis): We currently ignore field.guarded_cid().
       RawInstance* instance = reinterpret_cast<RawInstance*>(*call_base);
       RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
       intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
-      reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words] =
-          *(call_base + 1);
+      RawAbstractType* field_type = field->ptr()->type_;
+      const classid_t cid =
+          field_type->GetClassId() == kTypeCid
+              ? Smi::Value(reinterpret_cast<RawSmi*>(
+                    Type::RawCast(field_type)->ptr()->type_class_id_))
+              : kIllegalCid;  // Not really illegal, but not a Type to skip.
+      // Perform type test of value if field type is not one of dynamic, object,
+      // or void, and if the value is not null.
+      RawObject* null_value = Object::null();
+      RawObject* value = *(call_base + 1);
+      if (cid != kDynamicCid && cid != kInstanceCid && cid != kVoidCid &&
+          value != null_value) {
+        // Push arguments of type test.
+        // Type checked value is at call_base + 1.
+        // Provide type arguments of instance as instantiator.
+        RawClass* instance_class = thread->isolate()->class_table()->At(
+            InterpreterHelpers::GetClassId(instance));
+        call_base[2] =
+            instance_class->ptr()->num_type_arguments_ > 0
+                ? reinterpret_cast<RawObject**>(
+                      instance
+                          ->ptr())[instance_class->ptr()
+                                       ->type_arguments_field_offset_in_words_]
+                : null_value;
+        call_base[3] = null_value;  // Implicit setters cannot be generic.
+        call_base[4] = field_type;
+        call_base[5] = field->ptr()->name_;
+        if (!AssertAssignable(thread, *pc, *FP, call_base + 5, call_base + 1,
+                              SubtypeTestCache::RawCast(null_value))) {
+          *invoked = true;
+          return false;
+        }
+      }
+      reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words] = value;
       *SP = call_base;
-      **SP = Object::null();
+      **SP = null_value;
       *invoked = true;
       return true;
     }
@@ -1469,10 +1490,94 @@
   return true;
 }
 
-RawObject* Interpreter::Call(const Code& code,
+bool Interpreter::AssertAssignable(Thread* thread,
+                                   uint32_t* pc,
+                                   RawObject** FP,
+                                   RawObject** call_top,
+                                   RawObject** args,
+                                   RawSubtypeTestCache* cache) {
+  RawObject* null_value = Object::null();
+  if (cache != null_value) {
+    RawInstance* instance = static_cast<RawInstance*>(args[0]);
+    RawTypeArguments* instantiator_type_arguments =
+        static_cast<RawTypeArguments*>(args[1]);
+    RawTypeArguments* function_type_arguments =
+        static_cast<RawTypeArguments*>(args[2]);
+
+    const intptr_t cid = InterpreterHelpers::GetClassId(instance);
+
+    RawTypeArguments* instance_type_arguments =
+        static_cast<RawTypeArguments*>(null_value);
+    RawObject* instance_cid_or_function;
+    if (cid == kClosureCid) {
+      RawClosure* closure = static_cast<RawClosure*>(instance);
+      if (closure->ptr()->function_type_arguments_ != TypeArguments::null()) {
+        // Cache cannot be used for generic closures.
+        goto AssertAssignableCallRuntime;
+      }
+      instance_type_arguments = closure->ptr()->instantiator_type_arguments_;
+      instance_cid_or_function = closure->ptr()->function_;
+    } else {
+      instance_cid_or_function = Smi::New(cid);
+
+      RawClass* instance_class = thread->isolate()->class_table()->At(cid);
+      if (instance_class->ptr()->num_type_arguments_ < 0) {
+        goto AssertAssignableCallRuntime;
+      } else if (instance_class->ptr()->num_type_arguments_ > 0) {
+        instance_type_arguments = reinterpret_cast<RawTypeArguments**>(
+            instance->ptr())[instance_class->ptr()
+                                 ->type_arguments_field_offset_in_words_];
+      }
+    }
+
+    for (RawObject** entries = cache->ptr()->cache_->ptr()->data();
+         entries[0] != null_value;
+         entries += SubtypeTestCache::kTestEntryLength) {
+      if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
+           instance_cid_or_function) &&
+          (entries[SubtypeTestCache::kInstanceTypeArguments] ==
+           instance_type_arguments) &&
+          (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
+           instantiator_type_arguments) &&
+          (entries[SubtypeTestCache::kFunctionTypeArguments] ==
+           function_type_arguments)) {
+        if (Bool::True().raw() == entries[SubtypeTestCache::kTestResult]) {
+          return true;
+        } else {
+          break;
+        }
+      }
+    }
+  }
+
+AssertAssignableCallRuntime:
+  // TODO(regis): Modify AssertAssignable bytecode to expect arguments in same
+  // order as the TypeCheck runtime call, so this copying can be avoided.
+  call_top[1] = args[0];  // instance
+  call_top[2] = args[3];  // type
+  call_top[3] = args[1];  // instantiator type args
+  call_top[4] = args[2];  // function type args
+  call_top[5] = args[4];  // name
+  call_top[6] = cache;
+  call_top[7] = Smi::New(kTypeCheckFromInline);
+  Exit(thread, FP, call_top + 8, pc);
+  NativeArguments native_args(thread, 7, call_top + 1, call_top + 1);
+  return InvokeRuntime(thread, this, DRT_TypeCheck, native_args);
+}
+
+RawObject* Interpreter::Call(const Function& function,
                              const Array& arguments_descriptor,
                              const Array& arguments,
                              Thread* thread) {
+  return Call(function.raw(), arguments_descriptor.raw(), arguments.Length(),
+              arguments.raw_ptr()->data(), thread);
+}
+
+RawObject* Interpreter::Call(RawFunction* function,
+                             RawArray* argdesc,
+                             intptr_t argc,
+                             RawObject* const* argv,
+                             Thread* thread) {
   // Dispatch used to interpret bytecode. Contains addresses of
   // labels of bytecode handlers. Handlers themselves are defined below.
   static const void* dispatch[] = {
@@ -1500,7 +1605,7 @@
               reentering ? "Re-entering" : "Entering",
               reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
               thread->top_exit_frame_info(),
-              Function::Handle(code.function()).ToCString());
+              Function::Handle(function).ToCString());
   }
 #endif
 
@@ -1532,7 +1637,9 @@
   //                        |
   //                        v
   //
-  FP = fp_ + 1 + arguments.Length() + kKBCDartFrameFixedSize;
+  // A negative argc indicates reverse memory order of arguments.
+  const intptr_t arg_count = argc < 0 ? -argc : argc;
+  FP = fp_ + 1 + arg_count + kKBCDartFrameFixedSize;
   SP = FP - 1;
 
   // Save outer top_exit_frame_info.
@@ -1540,25 +1647,25 @@
   thread->set_top_exit_frame_info(0);
 
   // Copy arguments and setup the Dart frame.
-  const intptr_t argc = arguments.Length();
-  for (intptr_t i = 0; i < argc; i++) {
-    fp_[1 + i] = arguments.At(i);
+  for (intptr_t i = 0; i < arg_count; i++) {
+    fp_[1 + i] = argv[argc < 0 ? -i : i];
   }
 
-  FP[kKBCFunctionSlotFromFp] = code.function();
-  FP[kKBCPcMarkerSlotFromFp] = code.raw();
+  RawCode* bytecode = function->ptr()->bytecode_;
+  FP[kKBCFunctionSlotFromFp] = function;
+  FP[kKBCPcMarkerSlotFromFp] = bytecode;
   FP[kKBCSavedCallerPcSlotFromFp] =
-      reinterpret_cast<RawObject*>((argc << 2) | 2);
+      reinterpret_cast<RawObject*>((arg_count << 2) | 2);
   FP[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(fp_);
 
   // Load argument descriptor.
-  argdesc_ = arguments_descriptor.raw();
+  argdesc_ = argdesc;
 
   // Ready to start executing bytecode. Load entry point and corresponding
   // object pool.
-  pc = reinterpret_cast<uint32_t*>(code.raw()->ptr()->entry_point_);
+  pc = reinterpret_cast<uint32_t*>(bytecode->ptr()->entry_point_);
   pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
-  pp_ = code.object_pool();
+  pp_ = bytecode->ptr()->object_pool_;
 
   // Cache some frequently used values in the frame.
   RawBool* true_value = Bool::True().raw();
@@ -3189,6 +3296,9 @@
       ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());
       const intptr_t argc = reinterpret_cast<uword>(pc) >> 2;
       ASSERT(fp_ == FrameArguments(FP, argc + 1));
+      // Exception propagation should have been done.
+      ASSERT(!result->IsHeapObject() ||
+             result->GetClassId() != kUnhandledExceptionCid);
 #endif
       return result;
     }
@@ -3578,76 +3688,11 @@
     if (!smi_ok && (args[0] != null_value)) {
       RawSubtypeTestCache* cache =
           static_cast<RawSubtypeTestCache*>(LOAD_CONSTANT(rD));
-      if (cache != null_value) {
-        RawInstance* instance = static_cast<RawInstance*>(args[0]);
-        RawTypeArguments* instantiator_type_arguments =
-            static_cast<RawTypeArguments*>(args[1]);
-        RawTypeArguments* function_type_arguments =
-            static_cast<RawTypeArguments*>(args[2]);
 
-        const intptr_t cid = InterpreterHelpers::GetClassId(instance);
-
-        RawTypeArguments* instance_type_arguments =
-            static_cast<RawTypeArguments*>(null_value);
-        RawObject* instance_cid_or_function;
-        if (cid == kClosureCid) {
-          RawClosure* closure = static_cast<RawClosure*>(instance);
-          if (closure->ptr()->function_type_arguments_ !=
-              TypeArguments::null()) {
-            // Cache cannot be used for generic closures.
-            goto AssertAssignableCallRuntime;
-          }
-          instance_type_arguments =
-              closure->ptr()->instantiator_type_arguments_;
-          instance_cid_or_function = closure->ptr()->function_;
-        } else {
-          instance_cid_or_function = Smi::New(cid);
-
-          RawClass* instance_class = thread->isolate()->class_table()->At(cid);
-          if (instance_class->ptr()->num_type_arguments_ < 0) {
-            goto AssertAssignableCallRuntime;
-          } else if (instance_class->ptr()->num_type_arguments_ > 0) {
-            instance_type_arguments = reinterpret_cast<RawTypeArguments**>(
-                instance->ptr())[instance_class->ptr()
-                                     ->type_arguments_field_offset_in_words_];
-          }
-        }
-
-        for (RawObject** entries = cache->ptr()->cache_->ptr()->data();
-             entries[0] != null_value;
-             entries += SubtypeTestCache::kTestEntryLength) {
-          if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
-               instance_cid_or_function) &&
-              (entries[SubtypeTestCache::kInstanceTypeArguments] ==
-               instance_type_arguments) &&
-              (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
-               instantiator_type_arguments) &&
-              (entries[SubtypeTestCache::kFunctionTypeArguments] ==
-               function_type_arguments)) {
-            if (true_value == entries[SubtypeTestCache::kTestResult]) {
-              goto AssertAssignableOk;
-            } else {
-              break;
-            }
-          }
-        }
-      }
-
-    AssertAssignableCallRuntime:
-      SP[1] = args[0];  // instance
-      SP[2] = args[3];  // type
-      SP[3] = args[1];  // instantiator type args
-      SP[4] = args[2];  // function type args
-      SP[5] = args[4];  // name
-      SP[6] = cache;
-      SP[7] = Smi::New(kTypeCheckFromInline);
-      Exit(thread, FP, SP + 8, pc);
-      NativeArguments native_args(thread, 7, SP + 1, SP - 4);
-      INVOKE_RUNTIME(DRT_TypeCheck, native_args);
+      AssertAssignable(thread, pc, FP, SP, args, cache);
     }
 
-  AssertAssignableOk:
-    SP -= 4;
+    SP -= 4;  // Instance remains on stack.
     DISPATCH();
   }
 
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 04b3caa..80621a4 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -24,6 +24,7 @@
 class RawArray;
 class RawObjectPool;
 class RawFunction;
+class RawSubtypeTestCache;
 class ObjectPointerVisitor;
 
 // Interpreter intrinsic handler. It is invoked on entry to the intrinsified
@@ -62,11 +63,17 @@
   // Call on program start.
   static void InitOnce();
 
-  RawObject* Call(const Code& code,
+  RawObject* Call(const Function& function,
                   const Array& arguments_descriptor,
                   const Array& arguments,
                   Thread* thread);
 
+  RawObject* Call(RawFunction* function,
+                  RawArray* argdesc,
+                  intptr_t argc,
+                  RawObject* const* argv,
+                  Thread* thread);
+
   void JumpToFrame(uword pc, uword sp, uword fp, Thread* thread);
 
   uword get_sp() const { return reinterpret_cast<uword>(fp_); }  // Yes, fp_.
@@ -93,8 +100,6 @@
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
-  bool IsTracing() const;
-
  private:
   uintptr_t* stack_;
   uword stack_base_;
@@ -191,6 +196,13 @@
                           RawObject*** SP,
                           uint32_t** pc);
 
+  bool AssertAssignable(Thread* thread,
+                        uint32_t* pc,
+                        RawObject** FP,
+                        RawObject** call_top,
+                        RawObject** args,
+                        RawSubtypeTestCache* cache);
+
 #if defined(DEBUG)
   // Returns true if tracing of executed instructions is enabled.
   bool IsTracingExecution() const;
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 21ab5e0..7d73781 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2606,8 +2606,9 @@
 }
 
 bool Isolate::IsVMInternalIsolate(Isolate* isolate) {
-  return ((isolate == Dart::vm_isolate()) ||
-          ServiceIsolate::IsServiceIsolateDescendant(isolate));
+  return (isolate == Dart::vm_isolate()) ||
+         ServiceIsolate::IsServiceIsolateDescendant(isolate) ||
+         KernelIsolate::IsKernelIsolate(isolate);
 }
 
 void Isolate::KillLocked(LibMsgId msg_id) {
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index ff73002..33d0316 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -527,11 +527,12 @@
 
 static void AcceptCompilation(Thread* thread) {
   TransitionVMToNative transition(thread);
-  if (KernelIsolate::AcceptCompilation().status !=
-      Dart_KernelCompilationStatus_Ok) {
-    FATAL(
+  Dart_KernelCompilationResult result = KernelIsolate::AcceptCompilation();
+  if (result.status != Dart_KernelCompilationStatus_Ok) {
+    FATAL1(
         "An error occurred in the CFE while accepting the most recent"
-        " compilation results.");
+        " compilation results: %s",
+        result.error);
   }
 }
 
@@ -694,6 +695,12 @@
     if (!tmp.IsError()) {
       Library& lib = Library::Handle(thread->zone());
       lib ^= tmp.raw();
+      // If main method disappeared or were not there to begin with then
+      // KernelLoader will return null. In this case lookup library by
+      // URL.
+      if (lib.IsNull()) {
+        lib = Library::LookupLibrary(thread, root_lib_url);
+      }
       isolate()->object_store()->set_root_library(lib);
       FinalizeLoading();
       result = Object::null();
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 71fbf0e..ce3536a 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -309,7 +309,7 @@
 
   Dart_Handle result = TestCase::ReloadTestScript(kReloadScript);
   if (TestCase::UsingDartFrontend()) {
-    EXPECT_ERROR(result, "Expected ';' before this");
+    EXPECT_ERROR(result, "Expected ';' after this");
   } else {
     EXPECT_ERROR(result, "unexpected token");
   }
@@ -2470,7 +2470,7 @@
 
   lib = TestCase::ReloadTestScript(kReloadScript);
   if (TestCase::UsingDartFrontend()) {
-    EXPECT_ERROR(lib, "Expected ';' before this");
+    EXPECT_ERROR(lib, "Expected ';' after this");
   } else {
     EXPECT_ERROR(lib, "unexpected token");
   }
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 4fe6d44..bc5ad9c 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/kernel.h"
-#include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/frontend/kernel_translation_helper.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-namespace dart {
 
+namespace dart {
 namespace kernel {
 
 bool FieldHasFunctionLiteralInitializer(const Field& field,
@@ -19,106 +19,14 @@
   TranslationHelper translation_helper(Thread::Current());
   translation_helper.InitFromScript(script);
 
-  StreamingFlowGraphBuilder builder(
-      &translation_helper, Script::Handle(zone, field.Script()), zone,
-      ExternalTypedData::Handle(zone, field.KernelData()),
-      field.KernelDataProgramOffset(),
-      /* active_class = */ NULL);
-  builder.SetOffset(field.kernel_offset());
-  kernel::FieldHelper field_helper(&builder);
-  field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
-  return field_helper.FieldHasFunctionLiteralInitializer(start, end);
-}
-
-uint32_t KernelSourceFingerprintHelper::CalculateClassFingerprint(
-    const Class& klass) {
-  Zone* zone = Thread::Current()->zone();
-
-  // Handle typedefs.
-  if (klass.IsTypedefClass()) {
-    const Function& func = Function::Handle(zone, klass.signature_function());
-    return CalculateFunctionFingerprint(func);
-  }
-
-  String& name = String::Handle(zone, klass.Name());
-  const Array& fields = Array::Handle(zone, klass.fields());
-  const Array& functions = Array::Handle(zone, klass.functions());
-  const Array& interfaces = Array::Handle(zone, klass.interfaces());
-  AbstractType& type = AbstractType::Handle(zone);
-
-  uint32_t hash = 0;
-  hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
-
-  type ^= klass.super_type();
-  if (!type.IsNull()) {
-    name ^= type.Name();
-    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
-  }
-
-  type ^= klass.mixin();
-  if (!type.IsNull()) {
-    name ^= type.Name();
-    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
-  }
-
-  Field& field = Field::Handle(zone);
-  // Calculate fingerprint for the class fields.
-  for (intptr_t i = 0; i < fields.Length(); ++i) {
-    field ^= fields.At(i);
-    uint32_t fingerprint = CalculateFieldFingerprint(field);
-    hash = KernelFingerprintHelper::CalculateHash(hash, fingerprint);
-  }
-
-  // Calculate fingerprint for the class functions.
-  Function& func = Function::Handle(zone);
-  for (intptr_t i = 0; i < functions.Length(); ++i) {
-    func ^= functions.At(i);
-    uint32_t fingerprint = CalculateFunctionFingerprint(func);
-    hash = KernelFingerprintHelper::CalculateHash(hash, fingerprint);
-  }
-
-  // Calculate fingerprint for the interfaces.
-  for (intptr_t i = 0; i < interfaces.Length(); ++i) {
-    type ^= interfaces.At(i);
-    name ^= type.Name();
-    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
-  }
-
-  return hash;
-}
-
-uint32_t KernelSourceFingerprintHelper::CalculateFieldFingerprint(
-    const Field& field) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const Script& script = Script::Handle(zone, field.Script());
-
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  KernelFingerprintHelper helper(
-      zone, &translation_helper, script,
+  KernelReaderHelper kernel_reader_helper(
+      zone, &translation_helper, Script::Handle(zone, field.Script()),
       ExternalTypedData::Handle(zone, field.KernelData()),
       field.KernelDataProgramOffset());
-  helper.SetOffset(field.kernel_offset());
-  return helper.CalculateFieldFingerprint();
-}
-
-uint32_t KernelSourceFingerprintHelper::CalculateFunctionFingerprint(
-    const Function& func) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const Script& script = Script::Handle(zone, func.script());
-
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  KernelFingerprintHelper helper(
-      zone, &translation_helper, script,
-      ExternalTypedData::Handle(zone, func.KernelData()),
-      func.KernelDataProgramOffset());
-  helper.SetOffset(func.kernel_offset());
-  return helper.CalculateFunctionFingerprint();
+  kernel_reader_helper.SetOffset(field.kernel_offset());
+  kernel::FieldHelper field_helper(&kernel_reader_helper);
+  field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
+  return field_helper.FieldHasFunctionLiteralInitializer(start, end);
 }
 
 KernelLineStartsReader::KernelLineStartsReader(
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 5bcf919..29fb267 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -114,13 +114,6 @@
   DISALLOW_COPY_AND_ASSIGN(Program);
 };
 
-class KernelSourceFingerprintHelper {
- public:
-  static uint32_t CalculateClassFingerprint(const Class& klass);
-  static uint32_t CalculateFieldFingerprint(const Field& field);
-  static uint32_t CalculateFunctionFingerprint(const Function& func);
-};
-
 class KernelLineStartsReader {
  public:
   KernelLineStartsReader(const dart::TypedData& line_starts_data,
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 17128ce..0f6769d 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -124,11 +124,11 @@
   }
   kernel::Program* kernel_program = NULL;
   {
+    const String& uri = String::Handle(String::New(script_uri));
     TransitionVMToNative transition(thread);
     Api::Scope api_scope(thread);
     Dart_Handle retval = (thread->isolate()->library_tag_handler())(
-        Dart_kKernelTag, Api::Null(),
-        Api::NewHandle(thread, String::New(script_uri)));
+        Dart_kKernelTag, Api::Null(), Api::NewHandle(thread, uri.raw()));
     if (!Dart_IsError(retval)) {
       Dart_TypedData_Type data_type;
       uint8_t* data;
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 58ae9ca..ace2340 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -417,6 +417,8 @@
   const uint8_t* saved_raw_buffer_;
   const ExternalTypedData* saved_typed_data_;
   intptr_t saved_offset_;
+
+  DISALLOW_COPY_AND_ASSIGN(AlternativeReadingScope);
 };
 
 // A helper class that resets the readers min and max positions both upon
@@ -446,6 +448,8 @@
   Reader* reader_;
   TokenPosition min_;
   TokenPosition max_;
+
+  DISALLOW_COPY_AND_ASSIGN(PositionScope);
 };
 
 }  // namespace kernel
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index a841629..bbfeb3d 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -25,16 +25,10 @@
 
 namespace dart {
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
 #define Z (T->zone())
 
 DEFINE_FLAG(bool, trace_kernel, false, "Trace Kernel service requests.");
 DEFINE_FLAG(bool,
-            show_kernel_isolate,
-            false,
-            "Show Kernel service isolate as normal isolate.");
-DEFINE_FLAG(bool,
             suppress_fe_warnings,
             false,
             "Suppress warnings from the FE.");
@@ -237,6 +231,16 @@
   Dart::thread_pool()->Run(new RunKernelTask());
 }
 
+void KernelIsolate::Shutdown() {
+  Isolate::KillIfExists(isolate_, Isolate::kInternalKillMsg);
+  {
+    MonitorLocker ml(monitor_);
+    while (isolate_ != NULL) {
+      ml.Wait();
+    }
+  }
+}
+
 void KernelIsolate::InitCallback(Isolate* I) {
   Thread* T = Thread::Current();
   ASSERT(I == T->isolate());
@@ -279,11 +283,13 @@
     isolate->set_is_kernel_isolate(true);
   }
   isolate_ = isolate;
+  ml.NotifyAll();
 }
 
 void KernelIsolate::SetLoadPort(Dart_Port port) {
   MonitorLocker ml(monitor_);
   kernel_port_ = port;
+  ml.NotifyAll();
 }
 
 void KernelIsolate::FinishedInitializing() {
@@ -864,6 +870,4 @@
   Dart_PostCObject(kernel_port, &message);
 }
 
-#endif  // DART_PRECOMPILED_RUNTIME
-
 }  // namespace dart
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 3de2d9a..aaadeaf 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -5,8 +5,6 @@
 #ifndef RUNTIME_VM_KERNEL_ISOLATE_H_
 #define RUNTIME_VM_KERNEL_ISOLATE_H_
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 
@@ -30,6 +28,7 @@
   static const int kNotifyIsolateShutdown;
 
   static void Run();
+  static void Shutdown();
 
   static bool NameEquals(const char* name);
   static bool Exists();
@@ -89,6 +88,4 @@
 
 }  // namespace dart
 
-#endif  // DART_PRECOMPILED_RUNTIME
-
 #endif  // RUNTIME_VM_KERNEL_ISOLATE_H_
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 31148a0..60905db 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -32,21 +32,21 @@
 
 class SimpleExpressionConverter {
  public:
-  SimpleExpressionConverter(TranslationHelper* helper,
-                            StreamingFlowGraphBuilder* builder)
-      : translation_helper_(*helper),
+  SimpleExpressionConverter(TranslationHelper* translation_helper,
+                            KernelReaderHelper* reader_helper)
+      : translation_helper_(*translation_helper),
         zone_(translation_helper_.zone()),
         simple_value_(NULL),
-        builder_(builder) {}
+        helper_(reader_helper) {}
 
   bool IsSimple(intptr_t kernel_offset) {
-    AlternativeReadingScope alt(&builder_->reader_, kernel_offset);
+    AlternativeReadingScope alt(&helper_->reader_, kernel_offset);
     uint8_t payload = 0;
-    Tag tag = builder_->ReadTag(&payload);  // read tag.
+    Tag tag = helper_->ReadTag(&payload);  // read tag.
     switch (tag) {
       case kBigIntLiteral: {
         const String& literal_str =
-            H.DartString(builder_->ReadStringReference(),
+            H.DartString(helper_->ReadStringReference(),
                          Heap::kOld);  // read index into string table.
         simple_value_ = &Integer::ZoneHandle(Z, Integer::New(literal_str));
         if (simple_value_->IsNull()) {
@@ -59,7 +59,7 @@
       }
       case kStringLiteral:
         simple_value_ = &H.DartSymbolPlain(
-            builder_->ReadStringReference());  // read index into string table.
+            helper_->ReadStringReference());  // read index into string table.
         return true;
       case kSpecializedIntLiteral:
         simple_value_ =
@@ -70,19 +70,19 @@
         return true;
       case kNegativeIntLiteral:
         simple_value_ = &Integer::ZoneHandle(
-            Z, Integer::New(-static_cast<int64_t>(builder_->ReadUInt()),
+            Z, Integer::New(-static_cast<int64_t>(helper_->ReadUInt()),
                             Heap::kOld));  // read value.
         *simple_value_ = H.Canonicalize(*simple_value_);
         return true;
       case kPositiveIntLiteral:
         simple_value_ = &Integer::ZoneHandle(
-            Z, Integer::New(static_cast<int64_t>(builder_->ReadUInt()),
+            Z, Integer::New(static_cast<int64_t>(helper_->ReadUInt()),
                             Heap::kOld));  // read value.
         *simple_value_ = H.Canonicalize(*simple_value_);
         return true;
       case kDoubleLiteral:
         simple_value_ = &Double::ZoneHandle(
-            Z, Double::New(builder_->ReadDouble(), Heap::kOld));  // read value.
+            Z, Double::New(helper_->ReadDouble(), Heap::kOld));  // read value.
         *simple_value_ = H.Canonicalize(*simple_value_);
         return true;
       case kTrueLiteral:
@@ -106,7 +106,9 @@
   TranslationHelper& translation_helper_;
   Zone* zone_;
   Instance* simple_value_;
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
+
+  DISALLOW_COPY_AND_ASSIGN(SimpleExpressionConverter);
 };
 
 RawArray* KernelLoader::MakeFunctionsArray() {
@@ -368,8 +370,8 @@
                                   true /* finalize */);
   ASSERT(type_translator_.active_class_ == &active_class_);
 
-  ConstantHelper helper(&active_class_, &builder_, &type_translator_,
-                        &translation_helper_, Z, skip_vmservice_library_);
+  ConstantHelper helper(Z, &builder_, &type_translator_, &active_class_,
+                        skip_vmservice_library_);
   return helper.ReadConstantTable();
 }
 
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index bc41510..329fc72 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -29,6 +29,8 @@
 
  private:
   KernelLoader* loader_;
+
+  DISALLOW_COPY_AND_ASSIGN(BuildingTranslationHelper);
 };
 
 template <typename VmType>
@@ -318,6 +320,8 @@
 
   GrowableArray<const Function*> functions_;
   GrowableArray<const Field*> fields_;
+
+  DISALLOW_COPY_AND_ASSIGN(KernelLoader);
 };
 
 }  // namespace kernel
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index cfdfcbc..057eff5 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -13,8 +13,9 @@
 #include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
-#include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/frontend/kernel_fingerprints.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
+#include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/intrinsifier.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/compiler_stats.h"
@@ -3809,12 +3810,13 @@
     ASSERT(library_kernel_offset > 0);
     const intptr_t class_offset = kernel_offset();
 
-    kernel::TranslationHelper helper(thread);
-    helper.InitFromScript(scr);
-    kernel::StreamingFlowGraphBuilder builder_(&helper, scr, zone, kernel_data,
-                                               0, /* active_class = */ NULL);
-    builder_.SetOffset(class_offset);
-    kernel::ClassHelper class_helper(&builder_);
+    kernel::TranslationHelper translation_helper(thread);
+    translation_helper.InitFromScript(scr);
+
+    kernel::KernelReaderHelper kernel_reader_helper(zone, &translation_helper,
+                                                    scr, kernel_data, 0);
+    kernel_reader_helper.SetOffset(class_offset);
+    kernel::ClassHelper class_helper(&kernel_reader_helper);
     class_helper.ReadUntilIncluding(kernel::ClassHelper::kEndPosition);
     if (class_helper.end_position_.IsReal()) return class_helper.end_position_;
 
@@ -7423,27 +7425,27 @@
   if (thread->isolate()->strong() && !is_static() && kernel_offset() > 0) {
     const Script& function_script = Script::Handle(zone, script());
     kernel::TranslationHelper translation_helper(thread);
-    kernel::StreamingFlowGraphBuilder builder(
-        &translation_helper, function_script, zone,
-        ExternalTypedData::Handle(zone, KernelData()),
-        KernelDataProgramOffset(),
-        /* active_class = */ NULL);
     translation_helper.InitFromScript(function_script);
-    builder.SetOffset(kernel_offset());
 
-    builder.ReadUntilFunctionNode();
+    kernel::KernelReaderHelper kernel_reader_helper(
+        zone, &translation_helper, function_script,
+        ExternalTypedData::Handle(zone, KernelData()),
+        KernelDataProgramOffset());
 
-    kernel::FunctionNodeHelper fn_helper(&builder);
+    kernel_reader_helper.SetOffset(kernel_offset());
+    kernel_reader_helper.ReadUntilFunctionNode();
+
+    kernel::FunctionNodeHelper fn_helper(&kernel_reader_helper);
 
     // Check the positional parameters, including the optional positional ones.
     fn_helper.ReadUntilExcluding(
         kernel::FunctionNodeHelper::kPositionalParameters);
-    intptr_t num_pos_params = builder.ReadListLength();
+    intptr_t num_pos_params = kernel_reader_helper.ReadListLength();
     ASSERT(num_pos_params ==
            num_fixed_params - 1 + (has_opt_pos_params ? num_opt_params : 0));
     const Type& object_type = Type::Handle(zone, Type::ObjectType());
     for (intptr_t i = 0; i < num_pos_params; ++i) {
-      kernel::VariableDeclarationHelper var_helper(&builder);
+      kernel::VariableDeclarationHelper var_helper(&kernel_reader_helper);
       var_helper.ReadUntilExcluding(kernel::VariableDeclarationHelper::kEnd);
       if (var_helper.IsCovariant() || var_helper.IsGenericCovariantImpl()) {
         closure_function.SetParameterTypeAt(i + 1, object_type);
@@ -7453,10 +7455,10 @@
 
     // Check the optional named parameters.
     fn_helper.ReadUntilExcluding(kernel::FunctionNodeHelper::kNamedParameters);
-    intptr_t num_named_params = builder.ReadListLength();
+    intptr_t num_named_params = kernel_reader_helper.ReadListLength();
     ASSERT(num_named_params == (has_opt_pos_params ? 0 : num_opt_params));
     for (intptr_t i = 0; i < num_named_params; ++i) {
-      kernel::VariableDeclarationHelper var_helper(&builder);
+      kernel::VariableDeclarationHelper var_helper(&kernel_reader_helper);
       var_helper.ReadUntilExcluding(kernel::VariableDeclarationHelper::kEnd);
       if (var_helper.IsCovariant() || var_helper.IsGenericCovariantImpl()) {
         closure_function.SetParameterTypeAt(num_pos_params + 1 + i,
@@ -8314,7 +8316,11 @@
 
 RawExternalTypedData* Field::KernelData() const {
   const Object& obj = Object::Handle(this->raw_ptr()->owner_);
-  if (obj.IsClass()) {
+  // During background JIT compilation field objects are copied
+  // and copy points to the original field via the owner field.
+  if (obj.IsField()) {
+    return Field::Cast(obj).KernelData();
+  } else if (obj.IsClass()) {
     Library& library = Library::Handle(Class::Cast(obj).library());
     return library.kernel_data();
   }
@@ -8324,7 +8330,11 @@
 
 intptr_t Field::KernelDataProgramOffset() const {
   const Object& obj = Object::Handle(raw_ptr()->owner_);
-  if (obj.IsClass()) {
+  // During background JIT compilation field objects are copied
+  // and copy points to the original field via the owner field.
+  if (obj.IsField()) {
+    return Field::Cast(obj).KernelDataProgramOffset();
+  } else if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
     return lib.kernel_offset();
   }
@@ -8332,6 +8342,27 @@
   return PatchClass::Cast(obj).library_kernel_offset();
 }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+void Field::GetCovarianceAttributes(bool* is_covariant,
+                                    bool* is_generic_covariant) const {
+  Thread* thread = Thread::Current();
+  Zone* zone = Thread::Current()->zone();
+  auto& script = Script::Handle(zone, Script());
+
+  kernel::TranslationHelper translation_helper(thread);
+  translation_helper.InitFromScript(script);
+
+  kernel::KernelReaderHelper kernel_reader_helper(
+      zone, &translation_helper, script,
+      ExternalTypedData::Handle(zone, KernelData()), KernelDataProgramOffset());
+  kernel_reader_helper.SetOffset(kernel_offset());
+  kernel::FieldHelper field_helper(&kernel_reader_helper);
+  field_helper.ReadUntilIncluding(kernel::FieldHelper::kFlags);
+  *is_covariant = field_helper.IsCovariant();
+  *is_generic_covariant = field_helper.IsGenericCovariantImpl();
+}
+#endif
+
 // Called at finalization time
 void Field::SetFieldType(const AbstractType& value) const {
   ASSERT(Thread::Current()->IsMutatorThread());
@@ -15025,8 +15056,6 @@
   code.SetPrologueOffset(bytecode_size);  // TODO(regis): Correct?
   INC_STAT(Thread::Current(), total_code_size,
            code.comments().comments_.Length());
-  // TODO(regis): Until we support exception handling.
-  code.set_exception_handlers(Object::empty_exception_handlers());
   return code.raw();
 }
 #endif  // defined(DART_USE_INTERPRETER)
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ff768b4..3a1b5cb 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3177,6 +3177,11 @@
 
   intptr_t KernelDataProgramOffset() const;
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  void GetCovarianceAttributes(bool* is_covariant,
+                               bool* is_generic_covariant) const;
+#endif
+
   inline intptr_t Offset() const;
   // Called during class finalization.
   inline void SetOffset(intptr_t offset_in_bytes) const;
@@ -7988,6 +7993,7 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance);
   friend class Class;
   friend class ImmutableArray;
+  friend class Interpreter;
   friend class Object;
   friend class String;
 };
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index e97f30c..24a67c7 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -16,7 +16,7 @@
 
 #include <fuchsia/timezone/cpp/fidl.h>
 
-#include "lib/app/cpp/environment_services.h"
+#include "lib/component/cpp/environment_services.h"
 
 #include "platform/assert.h"
 #include "vm/zone.h"
@@ -43,13 +43,13 @@
 static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
                                                  int32_t* local_offset,
                                                  int32_t* dst_offset) {
-  fuchsia::timezone::TimezoneSync2Ptr tz;
-  fuchsia::sys::ConnectToEnvironmentService(tz.NewRequest());
+  fuchsia::timezone::TimezoneSyncPtr tz;
+  component::ConnectToEnvironmentService(tz.NewRequest());
   zx_status_t status = tz->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
-                                                    local_offset,
-                                                    dst_offset).statvs;
-  if (status != ZX_OK)
+                                                    local_offset, dst_offset);
+  if (status != ZX_OK) {
     return status;
+  }
   *local_offset *= 60;
   *dst_offset *= 60;
   return ZX_OK;
@@ -59,7 +59,7 @@
   // TODO(abarth): Handle time zone changes.
   static const auto* tz_name = new std::string([] {
     fuchsia::timezone::TimezoneSyncPtr tz;
-    fuchsia::sys::ConnectToEnvironmentService(tz.NewRequest());
+    component::ConnectToEnvironmentService(tz.NewRequest());
     fidl::StringPtr result;
     tz->GetTimezoneId(&result);
     return *result;
diff --git a/runtime/vm/os_thread.cc b/runtime/vm/os_thread.cc
index 5b62d16..125dabf 100644
--- a/runtime/vm/os_thread.cc
+++ b/runtime/vm/os_thread.cc
@@ -19,6 +19,10 @@
 Mutex* OSThread::thread_list_lock_ = NULL;
 bool OSThread::creation_enabled_ = false;
 
+#if defined(HAS_C11_THREAD_LOCAL)
+thread_local Thread* OSThread::current_vm_thread_ = NULL;
+#endif
+
 OSThread::OSThread()
     : BaseThread(true),
       id_(OSThread::GetCurrentThreadId()),
@@ -269,8 +273,18 @@
   }
 }
 
-void OSThread::SetCurrent(OSThread* current) {
-  OSThread::SetThreadLocal(thread_key_, reinterpret_cast<uword>(current));
+void OSThread::SetCurrentTLS(BaseThread* value) {
+  // Provides thread-local destructors.
+  SetThreadLocal(thread_key_, reinterpret_cast<uword>(value));
+
+#if defined(HAS_C11_THREAD_LOCAL)
+  // Allows the C compiler more freedom to optimize.
+  if ((value != NULL) && !value->is_os_thread()) {
+    current_vm_thread_ = static_cast<Thread*>(value);
+  } else {
+    current_vm_thread_ = NULL;
+  }
+#endif
 }
 
 OSThreadIterator::OSThreadIterator() {
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index cdf3985..baad4af 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -11,6 +11,10 @@
 #include "vm/allocation.h"
 #include "vm/globals.h"
 
+#if !HOST_OS_IOS
+#define HAS_C11_THREAD_LOCAL 1
+#endif
+
 // Declare the OS-specific types ahead of defining the generic classes.
 #if defined(HOST_OS_ANDROID)
 #include "vm/os_thread_android.h"
@@ -154,7 +158,11 @@
     }
     return os_thread;
   }
-  static void SetCurrent(OSThread* current);
+  static void SetCurrent(OSThread* current) { SetCurrentTLS(current); }
+
+#if defined(HAS_C11_THREAD_LOCAL)
+  static Thread* CurrentVMThread() { return current_vm_thread_; }
+#endif
 
   // TODO(5411455): Use flag to override default value and Validate the
   // stack size by querying OS.
@@ -166,7 +174,7 @@
   static BaseThread* GetCurrentTLS() {
     return reinterpret_cast<BaseThread*>(OSThread::GetThreadLocal(thread_key_));
   }
-  static void SetCurrentTLS(uword value) { SetThreadLocal(thread_key_, value); }
+  static void SetCurrentTLS(BaseThread* value);
 
   typedef void (*ThreadStartFunction)(uword parameter);
   typedef void (*ThreadDestructor)(void* parameter);
@@ -265,6 +273,10 @@
   static OSThread* thread_list_head_;
   static bool creation_enabled_;
 
+#if defined(HAS_C11_THREAD_LOCAL)
+  static thread_local Thread* current_vm_thread_;
+#endif
+
   friend class Isolate;  // to access set_thread(Thread*).
   friend class OSThreadIterator;
   friend class ThreadInterrupterWin;
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index 82198e2..6fef2cd 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -604,7 +604,12 @@
 // This function is executed on the thread that is exiting. It is invoked
 // by |OnDartThreadExit| (see below for notes on TLS destructors on Windows).
 void ThreadLocalData::RunDestructors() {
-  ASSERT(thread_locals_ != NULL);
+  // If an OS thread is created but ThreadLocalData::InitOnce has not yet been
+  // called, this method still runs. If this happens, there's nothing to clean
+  // up here. See issue 33826.
+  if (thread_locals_ == NULL) {
+    return;
+  }
   ASSERT(mutex_ != NULL);
   MutexLocker ml(mutex_, false);
   for (intptr_t i = 0; i < thread_locals_->length(); i++) {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 3e0d919..9632e50 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -14,7 +14,7 @@
 #include "vm/class_finalizer.h"
 #include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/backend/il_printer.h"
-#include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/frontend/scope_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/compiler_stats.h"
 #include "vm/dart_api_impl.h"
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index b298c05..0ebea7e 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -794,6 +794,15 @@
 
   if (should_update_cache) {
     if (cache.IsNull()) {
+#if defined(DART_USE_INTERPRETER)
+      // TODO(regis): Remove this workaround once the interpreter can provide a
+      // non-null cache for the type test in an implicit setter.
+      if (mode == kTypeCheckFromInline) {
+        arguments.SetReturn(src_instance);
+        return;
+      }
+#endif  // defined(DART_USE_INTERPRETER)
+
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
       ASSERT(mode == kTypeCheckFromSlowStub);
       // We lazily create [SubtypeTestCache] for those call sites which actually
@@ -1737,57 +1746,6 @@
   arguments.SetReturn(result);
 }
 
-// Interpret a function call. Should be called only for uncompiled functions.
-// Arg0: function object
-// Arg1: ICData or MegamorphicCache
-// Arg2: arguments descriptor array
-// Arg3: arguments array
-DEFINE_RUNTIME_ENTRY(InterpretCall, 4) {
-#if defined(DART_USE_INTERPRETER)
-  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
-  // TODO(regis): Use icdata.
-  // const Object& ic_data_or_cache = Object::Handle(zone, arguments.ArgAt(1));
-  const Array& orig_arguments_desc =
-      Array::CheckedHandle(zone, arguments.ArgAt(2));
-  const Array& orig_arguments = Array::CheckedHandle(zone, arguments.ArgAt(3));
-  ASSERT(!function.HasCode());
-  ASSERT(function.HasBytecode());
-  const Code& bytecode = Code::Handle(zone, function.Bytecode());
-  Object& result = Object::Handle(zone);
-  Interpreter* interpreter = Interpreter::Current();
-#if defined(DEBUG)
-  uword exit_fp = thread->top_exit_frame_info();
-  ASSERT(exit_fp != 0);
-  if (interpreter->IsTracing()) {
-    THR_Print("Interpreting call to %s exit 0x%" Px "\n", function.ToCString(),
-              exit_fp);
-  }
-#endif
-  ASSERT(interpreter != NULL);
-  {
-    TransitionToGenerated transition(thread);
-    result = interpreter->Call(bytecode, orig_arguments_desc, orig_arguments,
-                               thread);
-  }
-#if defined(DEBUG)
-  ASSERT(thread->top_exit_frame_info() == exit_fp);
-  if (interpreter->IsTracing()) {
-    THR_Print("Returning from interpreted function %s\n", function.ToCString());
-  }
-#endif
-  if (result.IsError()) {
-    if (result.IsLanguageError()) {
-      Exceptions::ThrowCompileTimeError(LanguageError::Cast(result));
-      UNREACHABLE();
-    }
-    Exceptions::PropagateError(Error::Cast(result));
-  }
-  arguments.SetReturn(result);
-#else
-  UNREACHABLE();
-#endif  // defined(DART_USE_INTERPRETER)
-}
-
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 // The following code is used to stress test
 //  - deoptimization
@@ -1863,8 +1821,37 @@
     JSONStream js;
     // Maybe adjust the rate of future reloads.
     isolate->MaybeIncreaseReloadEveryNStackOverflowChecks();
+
+    const char* script_uri;
+    {
+      NoReloadScope no_reload(isolate, thread);
+      const Library& lib =
+          Library::Handle(isolate->object_store()->_internal_library());
+      const Class& cls = Class::Handle(
+          lib.LookupClass(String::Handle(String::New("VMLibraryHooks"))));
+      const Function& func = Function::Handle(cls.LookupFunction(
+          String::Handle(String::New("get:platformScript"))));
+      Object& result = Object::Handle(
+          DartEntry::InvokeFunction(func, Object::empty_array()));
+      if (result.IsUnwindError()) {
+        Exceptions::PropagateError(Error::Cast(result));
+      }
+      if (!result.IsInstance()) {
+        FATAL1("Bad script uri hook: %s", result.ToCString());
+      }
+      result = DartLibraryCalls::ToString(Instance::Cast(result));
+      if (result.IsUnwindError()) {
+        Exceptions::PropagateError(Error::Cast(result));
+      }
+      if (!result.IsString()) {
+        FATAL1("Bad script uri hook: %s", result.ToCString());
+      }
+      script_uri = result.ToCString();  // Zone allocated.
+    }
+
     // Issue a reload.
-    bool success = isolate->ReloadSources(&js, true /* force_reload */);
+    bool success =
+        isolate->ReloadSources(&js, true /* force_reload */, script_uri);
     if (!success) {
       FATAL1("*** Isolate reload failed:\n%s\n", js.ToCString());
     }
@@ -2610,4 +2597,36 @@
     true /* is_float */,
     reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan)));
 
+uword RuntimeEntry::InterpretCallEntry() {
+  return reinterpret_cast<uword>(RuntimeEntry::InterpretCall);
+}
+
+// Interpret a function call. Should be called only for uncompiled functions.
+// argc indicates the number of arguments, including the type arguments.
+// argv points to the first argument.
+// If argc < 0, arguments are passed at decreasing memory addresses from argv.
+RawObject* RuntimeEntry::InterpretCall(RawFunction* function,
+                                       RawArray* argdesc,
+                                       intptr_t argc,
+                                       RawObject** argv,
+                                       Thread* thread) {
+#if defined(DART_USE_INTERPRETER)
+  RawObject* result;
+  Interpreter* interpreter = Interpreter::Current();
+#if defined(DEBUG)
+  uword exit_fp = thread->top_exit_frame_info();
+  ASSERT(exit_fp != 0);
+  ASSERT(thread == Thread::Current());
+  ASSERT(!Function::HasCode(function));
+  ASSERT(Function::HasBytecode(function));
+  ASSERT(interpreter != NULL);
+#endif
+  result = interpreter->Call(function, argdesc, argc, argv, thread);
+  DEBUG_ASSERT(thread->top_exit_frame_info() == exit_fp);
+  return result;
+#else
+  UNREACHABLE();
+#endif  // defined(DART_USE_INTERPRETER)
+}
+
 }  // namespace dart
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 4dd4935..b337cea 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -67,6 +67,13 @@
   static inline uword AddressFromId(RuntimeFunctionId id);
   static inline RuntimeFunctionId RuntimeFunctionIdFromAddress(uword address);
 
+  static uword InterpretCallEntry();
+  static RawObject* InterpretCall(RawFunction* function,
+                                  RawArray* argdesc,
+                                  intptr_t argc,
+                                  RawObject** argv,
+                                  Thread* thread);
+
  private:
   const char* name_;
   const RuntimeFunction function_;
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 65c2c0a..3234c88 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -46,7 +46,6 @@
   V(UpdateFieldCid)                                                            \
   V(InitStaticField)                                                           \
   V(CompileFunction)                                                           \
-  V(InterpretCall)                                                             \
   V(MonomorphicMiss)                                                           \
   V(SingleTargetMiss)                                                          \
   V(UnlinkedCall)
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index fc90307..85d37ee 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -63,8 +63,6 @@
             "Print a message when an isolate is paused but there is no "
             "debugger attached.");
 
-DECLARE_FLAG(bool, show_kernel_isolate);
-
 #ifndef PRODUCT
 // The name of this of this vm as reported by the VM service protocol.
 static char* vm_name = NULL;
@@ -4305,12 +4303,7 @@
   virtual ~ServiceIsolateVisitor() {}
 
   void VisitIsolate(Isolate* isolate) {
-    bool is_kernel_isolate = false;
-#ifndef DART_PRECOMPILED_RUNTIME
-    is_kernel_isolate =
-        KernelIsolate::IsKernelIsolate(isolate) && !FLAG_show_kernel_isolate;
-#endif
-    if (!IsVMInternalIsolate(isolate) && !is_kernel_isolate) {
+    if (!IsVMInternalIsolate(isolate)) {
       jsarr_->AddValue(isolate);
     }
   }
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 555fb3a..e221091 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -1762,17 +1762,13 @@
 }
 
 // Stub for compiling a function and jumping to the compiled code.
-// R9: IC-Data (for methods).
 // R4: Arguments descriptor.
 // R0: Function.
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
-  // Preserve arg desc. and IC data object.
   __ EnterStubFrame();
-  __ PushList((1 << R4) | (1 << R9));
-  __ Push(R0);  // Pass function.
+  __ PushList((1 << R0) | (1 << R4));  // Preserve arg desc, pass function.
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ Pop(R0);                         // Restore argument.
-  __ PopList((1 << R4) | (1 << R9));  // Restore arg desc. and IC data.
+  __ PopList((1 << R0) | (1 << R4));
   __ LeaveStubFrame();
 
   // When using the interpreter, the function's code may now point to the
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index fceea40..dcd5ee1 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -1930,19 +1930,16 @@
 }
 
 // Stub for compiling a function and jumping to the compiled code.
-// R5: IC-Data (for methods).
 // R4: Arguments descriptor.
 // R0: Function.
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
-  // Preserve arg desc. and IC data object.
+  // Preserve arg desc.
   __ EnterStubFrame();
-  __ Push(R5);  // Save IC Data.
   __ Push(R4);  // Save arg. desc.
   __ Push(R0);  // Pass function.
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ Pop(R0);  // Restore argument.
   __ Pop(R4);  // Restore arg desc.
-  __ Pop(R5);  // Restore IC Data.
   __ LeaveStubFrame();
 
   // When using the interpreter, the function's code may now point to the
@@ -1953,15 +1950,10 @@
 }
 
 // Stub for interpreting a function call.
-// R5: IC-Data (for methods).
 // R4: Arguments descriptor.
 // R0: Function.
 void StubCode::GenerateInterpretCallStub(Assembler* assembler) {
 #if defined(DART_USE_INTERPRETER)
-  const intptr_t thread_offset = NativeArguments::thread_offset();
-  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
-  const intptr_t argv_offset = NativeArguments::argv_offset();
-  const intptr_t retval_offset = NativeArguments::retval_offset();
 
   __ SetPrologueOffset();
   __ EnterStubFrame();
@@ -1978,60 +1970,37 @@
   }
 #endif
 
-  // Setup space on stack for result of the interpreted function call.
-  __ Push(ZR);
+  // Adjust arguments count for type arguments vector.
+  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+  __ SmiUntag(R2);
+  __ LoadFieldFromOffset(R1, R4, ArgumentsDescriptor::type_args_len_offset());
+  __ cmp(R1, Operand(0));
+  __ csinc(R2, R2, R2, EQ);  // R2 <- (R1 == 0) ? R2 : R2 + 1.
 
-  // Set callee-saved R23 to point to return value slot.
-  __ mov(R23, SP);
+  // Compute argv.
+  __ add(R3, ZR, Operand(R2, LSL, 3));
+  __ add(R3, FP, Operand(R3));
+  __ AddImmediate(R3, kParamEndSlotFromFp * kWordSize);
 
-  // Push first 3 arguments of the interpreted function call.
-  __ Push(R0);  // Function.
-  __ Push(R5);  // ICData/MegamorphicCache.
-  __ Push(R4);  // Arguments descriptor array.
+  // Indicate decreasing memory addresses of arguments with negative argc.
+  __ neg(R2, R2);
 
-  // Adjust arguments count.
-  __ LoadFieldFromOffset(R3, R4, ArgumentsDescriptor::type_args_len_offset());
-  __ AddImmediate(TMP, R2, 1);  // Include the type arguments.
-  __ cmp(R3, Operand(0));
-  __ csinc(R2, R2, TMP, EQ);  // R2 <- (R3 == 0) ? R2 : TMP + 1 (R2 : R2 + 2).
+  // Align frame before entering C++ world. No shadow stack space required.
+  __ ReserveAlignedFrameSpace(0 * kWordSize);
 
-  // Push 4th Dart argument of the interpreted function call.
-  // R2: Smi-tagged arguments array length.
-  PushArrayOfArguments(assembler);  // May call into the runtime.
-  const intptr_t kNumArgs = 4;
-
-  // Reserve space for arguments and align frame before entering C++ world.
-  // NativeArguments are passed in registers.
-  ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
-  __ ReserveAlignedFrameSpace(sizeof(NativeArguments));
-
-  // Pass NativeArguments structure by value and call runtime.
-  // Registers R0, R1, R2, and R3 are used.
-
-  ASSERT(thread_offset == 0 * kWordSize);
-  __ mov(R0, THR);  // Set thread in NativeArgs.
-
-  ASSERT(argc_tag_offset == 1 * kWordSize);
-  __ LoadImmediate(R1, kNumArgs);  // Set argc in NativeArguments.
-
-  ASSERT(argv_offset == 2 * kWordSize);
-  __ AddImmediate(R2, R23, -kWordSize);  // Set argv in NativeArguments.
-
-  ASSERT(retval_offset == 3 * kWordSize);
-  __ mov(R3, R23);  // Set retval in NativeArguments.
-
-  __ StoreToOffset(R0, SP, thread_offset);
-  __ StoreToOffset(R1, SP, argc_tag_offset);
-  __ StoreToOffset(R2, SP, argv_offset);
-  __ StoreToOffset(R3, SP, retval_offset);
-  __ mov(R0, SP);  // Pass the pointer to the NativeArguments.
+  // Pass arguments in registers.
+  // R0: Function.
+  __ mov(R1, R4);  // Arguments descriptor.
+  // R2: Negative argc.
+  // R3: Argv.
+  __ mov(R4, THR);  // Thread.
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
   __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
 
   // Mark that the thread is executing VM code.
-  __ LoadImmediate(R5, kInterpretCallRuntimeEntry.GetEntryPoint());
+  __ LoadFromOffset(R5, THR, Thread::interpret_call_entry_point_offset());
   __ StoreToOffset(R5, THR, Thread::vm_tag_offset());
 
   // We are entering runtime code, so the C stack pointer must be restored from
@@ -2053,9 +2022,6 @@
   // Reset exit frame information in Isolate structure.
   __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset());
 
-  // Load result of interpreted function call into R0.
-  __ LoadFromOffset(R0, R23, 0);
-
   __ LeaveStubFrame();
   __ ret();
 #else
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 6b91241..1b23e2d 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1616,17 +1616,14 @@
 }
 
 // Stub for compiling a function and jumping to the compiled code.
-// ECX: IC-Data (for methods).
 // EDX: Arguments descriptor.
 // EAX: Function.
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ pushl(EDX);  // Preserve arguments descriptor array.
-  __ pushl(ECX);  // Preserve IC data object.
   __ pushl(EAX);  // Pass function.
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popl(EAX);  // Restore function.
-  __ popl(ECX);  // Restore IC data array.
   __ popl(EDX);  // Restore arguments descriptor array.
   __ LeaveFrame();
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a16794a..5685994 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1872,17 +1872,14 @@
 }
 
 // Stub for compiling a function and jumping to the compiled code.
-// RBX: IC-Data (for methods).
 // R10: Arguments descriptor.
 // RAX: Function.
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ pushq(R10);  // Preserve arguments descriptor array.
-  __ pushq(RBX);  // Preserve IC data object.
   __ pushq(RAX);  // Pass function.
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popq(RAX);  // Restore function.
-  __ popq(RBX);  // Restore IC data array.
   __ popq(R10);  // Restore arguments descriptor array.
   __ LeaveStubFrame();
 
@@ -1894,16 +1891,10 @@
 }
 
 // Stub for interpreting a function call.
-// RBX: IC-Data (for methods).
 // R10: Arguments descriptor.
 // RAX: Function.
 void StubCode::GenerateInterpretCallStub(Assembler* assembler) {
 #if defined(DART_USE_INTERPRETER)
-  const intptr_t thread_offset = NativeArguments::thread_offset();
-  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
-  const intptr_t argv_offset = NativeArguments::argv_offset();
-  const intptr_t retval_offset = NativeArguments::retval_offset();
-
   __ EnterStubFrame();
 
 #if defined(DEBUG)
@@ -1918,56 +1909,47 @@
   }
 #endif
 
-  // Push result and first 3 arguments of the interpreted function call.
-  __ pushq(Immediate(0));  // Setup space on stack for result.
-  __ pushq(RAX);           // Function.
-  __ pushq(RBX);           // ICData/MegamorphicCache.
-  __ pushq(R10);           // Arguments descriptor array.
-
-  // Adjust arguments count.
-  __ movq(RDI, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
+  // Adjust arguments count for type arguments vector.
+  __ movq(R11, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
+  __ SmiUntag(R11);
   __ cmpq(FieldAddress(R10, ArgumentsDescriptor::type_args_len_offset()),
           Immediate(0));
-  __ movq(R10, RDI);
   Label args_count_ok;
   __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ addq(R10, Immediate(Smi::RawValue(1)));  // Include the type arguments.
+  __ incq(R11);
   __ Bind(&args_count_ok);
 
-  // Push 4th Dart argument of the interpreted function call.
-  // R10: Smi-tagged arguments array length.
-  PushArrayOfArguments(assembler);  // May call into the runtime.
-  const intptr_t kNumArgs = 4;
+  // Compute argv.
+  __ leaq(R12, Address(RBP, R11, TIMES_8, kParamEndSlotFromFp * kWordSize));
 
-  // Set callee-saved RBX to point to first one of the 4 Dart arguments.
-  __ leaq(RBX, Address(RSP, (kNumArgs - 1) * kWordSize));
+  // Indicate decreasing memory addresses of arguments with negative argc.
+  __ negq(R11);
 
-  // Reserve space for native args and align frame before entering C++ world.
-  __ subq(RSP, Immediate(sizeof(NativeArguments)));
+  // Reserve shadow space for args and align frame before entering C++ world.
+  __ subq(RSP, Immediate(5 * kWordSize));
   if (OS::ActivationFrameAlignment() > 1) {
     __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
   }
 
-  // Pass NativeArguments structure by value and call runtime.
-  __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
-  __ movq(Address(RSP, argc_tag_offset), Immediate(kNumArgs));  // Set argc.
-  // Compute argv.
-  __ movq(Address(RSP, argv_offset), RBX);    // Set argv in NativeArguments.
-  __ addq(RBX, Immediate(1 * kWordSize));     // Retval is next to 1st argument.
-  __ movq(Address(RSP, retval_offset), RBX);  // Set retval in NativeArguments.
+  __ movq(CallingConventions::kArg1Reg, RAX);  // Function.
+  __ movq(CallingConventions::kArg2Reg, R10);  // Arguments descriptor.
+  __ movq(CallingConventions::kArg3Reg, R11);  // Negative argc.
+  __ movq(CallingConventions::kArg4Reg, R12);  // Argv.
+
 #if defined(_WIN64)
-  ASSERT(sizeof(NativeArguments) > CallingConventions::kRegisterTransferLimit);
-  __ movq(CallingConventions::kArg1Reg, RSP);
+  __ movq(Address(RSP, 0 * kWordSize), THR);  // Thread.
+#else
+  __ movq(CallingConventions::kArg5Reg, THR);  // Thread.
 #endif
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), RBP);
 
   // Mark that the thread is executing VM code.
-  __ movq(RCX, Immediate(kInterpretCallRuntimeEntry.GetEntryPoint()));
-  __ movq(Assembler::VMTagAddress(), RCX);
+  __ movq(RAX, Address(THR, Thread::interpret_call_entry_point_offset()));
+  __ movq(Assembler::VMTagAddress(), RAX);
 
-  __ CallCFunction(RCX);
+  __ call(RAX);
 
   // Mark that the thread is executing Dart code.
   __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
@@ -1975,9 +1957,6 @@
   // Reset exit frame information in Isolate structure.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
-  // Load result of interpreted function call into RAX.
-  __ movq(RAX, Address(RBX, 0));
-
   __ LeaveStubFrame();
   __ ret();
 #else
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 8864071..ddedbb0 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -163,6 +163,7 @@
     NativeEntry::NoScopeNativeCallWrapperEntry(), 0)                           \
   V(uword, auto_scope_native_wrapper_entry_point_,                             \
     NativeEntry::AutoScopeNativeCallWrapperEntry(), 0)                         \
+  V(uword, interpret_call_entry_point_, RuntimeEntry::InterpretCallEntry(), 0) \
   V(RawString**, predefined_symbols_address_, Symbols::PredefinedAddress(),    \
     NULL)                                                                      \
   V(uword, double_nan_address_, reinterpret_cast<uword>(&double_nan_constant), \
@@ -212,11 +213,15 @@
 
   // The currently executing thread, or NULL if not yet initialized.
   static Thread* Current() {
+#if defined(HAS_C11_THREAD_LOCAL)
+    return OSThread::CurrentVMThread();
+#else
     BaseThread* thread = OSThread::GetCurrentTLS();
     if (thread == NULL || thread->is_os_thread()) {
       return NULL;
     }
     return reinterpret_cast<Thread*>(thread);
+#endif
   }
 
   // Makes the current thread enter 'isolate'.
@@ -902,9 +907,7 @@
   void ExitSafepointUsingLock();
   void BlockForSafepoint();
 
-  static void SetCurrent(Thread* current) {
-    OSThread::SetCurrentTLS(reinterpret_cast<uword>(current));
-  }
+  static void SetCurrent(Thread* current) { OSThread::SetCurrentTLS(current); }
 
   void DeferOOBMessageInterrupts();
   void RestoreOOBMessageInterrupts();
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index c065f34..89c1883 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -213,7 +213,7 @@
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
   dart_args[0] = DartUtils::NewString(uri_chars);
-  return Dart_Invoke(DartUtils::BuiltinLib(),
+  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
                      DartUtils::NewString("_filePathFromUri"), kNumArgs,
                      dart_args);
 }
diff --git a/samples/build_dart/bin/test.dart b/samples/build_dart/bin/test.dart
deleted file mode 100644
index bc7ce1b..0000000
--- a/samples/build_dart/bin/test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test_build_dart;
-
-import "dart:io";
-
-/**
- * In order to generate test.foobar, make an edit to test.foo.
- */
-void main() {
-  printContents("test.foo");
-  print("");
-  printContents("test.foobar");
-}
-
-void printContents(String file) {
-  print("the contents of ${file} are:");
-
-  var f = new File(file);
-
-  if (f.existsSync()) {
-    String contents = new File(file).readAsStringSync();
-
-    print("[${contents}]");
-  } else {
-    print("[]");
-  }
-}
diff --git a/samples/build_dart/build.dart b/samples/build_dart/build.dart
deleted file mode 100644
index 7058e70..0000000
--- a/samples/build_dart/build.dart
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library build_dart;
-
-import "dart:io";
-import "package:args/args.dart";
-
-bool cleanBuild;
-bool fullBuild;
-bool useMachineInterface;
-
-List<String> changedFiles;
-List<String> removedFiles;
-
-/**
- * If the file is named 'build.dart' and is placed in the root directory of a
- * project or in a directory containing a pubspec.yaml file, then the Editor
- * will automatically invoke that file whenever a file in that project changes.
- * See the source code of [processArgs] for information about the legal command
- * line options.
- */
-void main(List<String> arguments) {
-  processArgs(arguments);
-
-  if (cleanBuild) {
-    handleCleanCommand();
-  } else if (fullBuild) {
-    handleFullBuild();
-  } else {
-    handleChangedFiles(changedFiles);
-    handleRemovedFiles(removedFiles);
-  }
-
-  // Return a non-zero code to indicate a build failure.
-  //exit(1);
-}
-
-/**
- * Handle --changed, --removed, --clean, --full, and --help command-line args.
- */
-void processArgs(List<String> arguments) {
-  var parser = new ArgParser();
-  parser.addOption("changed",
-      help: "the file has changed since the last build", allowMultiple: true);
-  parser.addOption("removed",
-      help: "the file was removed since the last build", allowMultiple: true);
-  parser.addFlag("clean", negatable: false, help: "remove any build artifacts");
-  parser.addFlag("full", negatable: false, help: "perform a full build");
-  parser.addFlag("machine",
-      negatable: false, help: "produce warnings in a machine parseable format");
-  parser.addFlag("help", negatable: false, help: "display this help and exit");
-
-  var args = parser.parse(arguments);
-
-  if (args["help"]) {
-    print(parser.getUsage());
-    exit(0);
-  }
-
-  changedFiles = args["changed"];
-  removedFiles = args["removed"];
-
-  useMachineInterface = args["machine"];
-
-  cleanBuild = args["clean"];
-  fullBuild = args["full"];
-}
-
-/**
- * Delete all generated files.
- */
-void handleCleanCommand() {
-  Directory current = Directory.current;
-  current.list(recursive: true).listen((FileSystemEntity entity) {
-    if (entity is File) _maybeClean(entity);
-  });
-}
-
-/**
- * Recursively scan the current directory looking for .foo files to process.
- */
-void handleFullBuild() {
-  var files = <String>[];
-
-  Directory.current.list(recursive: true).listen((entity) {
-    if (entity is File) {
-      files.add((entity as File).resolveSymbolicLinksSync());
-    }
-  }, onDone: () => handleChangedFiles(files));
-}
-
-/**
- * Process the given list of changed files.
- */
-void handleChangedFiles(List<String> files) {
-  files.forEach(_processFile);
-}
-
-/**
- * Process the given list of removed files.
- */
-void handleRemovedFiles(List<String> files) {}
-
-/**
- * Convert a .foo file to a .foobar file.
- */
-void _processFile(String arg) {
-  if (arg.endsWith(".foo")) {
-    print("processing: ${arg}");
-
-    File file = new File(arg);
-
-    String contents = file.readAsStringSync();
-
-    File outFile = new File("${arg}bar");
-
-    IOSink out = outFile.openWrite();
-    out.writeln("// processed from ${file.path}:");
-    if (contents != null) {
-      out.write(contents);
-    }
-    out.close();
-
-    _findErrors(arg);
-
-    print("wrote: ${outFile.path}");
-  }
-}
-
-void _findErrors(String arg) {
-  File file = new File(arg);
-
-  List lines = file.readAsLinesSync();
-
-  for (int i = 0; i < lines.length; i++) {
-    if (lines[i].contains("woot") && !lines[i].startsWith("//")) {
-      if (useMachineInterface) {
-        // Ideally, we should emit the charStart and charEnd params as well.
-        print('[{"method":"error","params":{"file":"$arg","line":${i+1},'
-            '"message":"woot not supported"}}]');
-      }
-    }
-  }
-}
-
-/**
- * If this file is a generated file (based on the extension), delete it.
- */
-void _maybeClean(File file) {
-  if (file.path.endsWith(".foobar")) {
-    file.delete();
-  }
-}
diff --git a/samples/build_dart/pubspec.yaml b/samples/build_dart/pubspec.yaml
deleted file mode 100644
index 8af67a1..0000000
--- a/samples/build_dart/pubspec.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-name: buildhook2
-description: A demo of the buildhook build.dart script.
-dependencies:
-  args: ">=0.9.0 <0.10.0"
-environment:
-  sdk: ">=0.8.10+6 <2.0.0"
diff --git a/samples/build_dart/test.foo b/samples/build_dart/test.foo
deleted file mode 100644
index 3c1e3c0..0000000
--- a/samples/build_dart/test.foo
+++ /dev/null
@@ -1,4 +0,0 @@
-I'm from foo.
-I'm from foo.
-I'm from woot.
-//I'm from woot.
diff --git a/samples/build_dart/test/build_dart_test.dart b/samples/build_dart/test/build_dart_test.dart
deleted file mode 100644
index e146d6b..0000000
--- a/samples/build_dart/test/build_dart_test.dart
+++ /dev/null
@@ -1,14 +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.
-
-library build_dart_test;
-
-import '../build.dart' as build_dart;
-import '../bin/test.dart' as test2;
-
-/**
- * This test exists to ensure that the build_dart sample compiles without
- * errors.
- */
-void main() {}
diff --git a/samples/build_dart_simple/build.dart b/samples/build_dart_simple/build.dart
deleted file mode 100644
index 0345f74..0000000
--- a/samples/build_dart_simple/build.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library build_dart_simple;
-
-import "dart:io";
-
-/**
- * This minimal build script copies the contents of .foo files to .foobar files.
- * In order to be invoked automatically by the Editor, this script must be named
- * 'build.dart' and placed in the root of a project.
- */
-void main(List<String> arguments) {
-  for (String arg in arguments) {
-    if (arg.startsWith("--changed=")) {
-      String file = arg.substring("--changed=".length);
-
-      if (file.endsWith(".foo")) {
-        _processFile(file);
-      }
-    }
-  }
-}
-
-void _processFile(String file) {
-  String contents = new File(file).readAsStringSync();
-
-  if (contents != null) {
-    IOSink out = new File("${file}bar").openWrite();
-    out.write("// processed from ${file}:\n${contents}");
-    out.close();
-  }
-}
diff --git a/samples/build_dart_simple/test.dart b/samples/build_dart_simple/test.dart
deleted file mode 100644
index 6ed759b..0000000
--- a/samples/build_dart_simple/test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test_build_dart_simple;
-
-import "dart:io";
-
-/**
- * In order to generate test.foobar, make an edit to test.foo.
- */
-void main() {
-  printContents("test.foo");
-  print("");
-  printContents("test.foobar");
-}
-
-void printContents(String file) {
-  print("the contents of ${file} are:");
-
-  var f = new File(file);
-
-  if (f.existsSync()) {
-    String contents = new File(file).readAsStringSync();
-
-    print("[${contents}]");
-  } else {
-    print("[]");
-  }
-}
diff --git a/samples/build_dart_simple/test.foo b/samples/build_dart_simple/test.foo
deleted file mode 100644
index c6d13c9..0000000
--- a/samples/build_dart_simple/test.foo
+++ /dev/null
@@ -1 +0,0 @@
-I'm from foo.
\ No newline at end of file
diff --git a/samples/build_dart_simple/test/build_dart_simple_test.dart b/samples/build_dart_simple/test/build_dart_simple_test.dart
deleted file mode 100644
index 8a8c4c3..0000000
--- a/samples/build_dart_simple/test/build_dart_simple_test.dart
+++ /dev/null
@@ -1,14 +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.
-
-library build_dart_simple_test;
-
-import '../build.dart' as build_dart_simple;
-import '../test.dart' as test1;
-
-/**
- * This test exists to ensure that the build_dart_simple sample compiles
- * without errors.
- */
-void main() {}
diff --git a/samples/samples.status b/samples/samples.status
index aeefd6e..12d8f0d 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -11,15 +11,9 @@
 [ $compiler == app_jit ]
 sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
 
-[ $compiler == dart2analyzer ]
-build_dart: Skip
-
 [ $compiler == precompiler ]
 sample_extension/test/*: Skip # These tests attempt to spawn another script using the precompiled runtime.
 
-[ $compiler == dart2analyzer && $strong ]
-*: Skip # Issue 28649
-
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
@@ -36,9 +30,8 @@
 
 # Skip tests that use dart:io
 [ $runtime == d8 || $browser ]
-build_dart/*: Skip
-build_dart_simple/*: Skip
 sample_extension/*: Skip
 
 [ $hot_reload || $hot_reload_rollback ]
-sample_extension/test/sample_extension_script_snapshot_test: SkipByDesign # This test makes a script snapshot, which implies not exercising Dart code.
+sample_extension/test/sample_extension_app_snapshot_test: SkipByDesign # Cannot reload with URI pointing to app snapshot.
+sample_extension/test/sample_extension_script_snapshot_test: SkipByDesign # Cannot reload with URI pointing to script snapshot.
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index a0f23ed..1c3bdc2 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -13,7 +13,7 @@
 # or ":copy_libraries" may delete/overwrite your addition, and the build will
 # fail.
 
-import("copy_tree.gni")
+import("../build/dart/copy_tree.gni")
 
 declare_args() {
   # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries.
@@ -38,6 +38,7 @@
 # ......pub
 # ......snapshots/
 # ........analysis_server.dart.snapshot
+# ........analysis_server_dart1.dart.snapshot (this is temporary; #33877)
 # ........dart2js.dart.snapshot
 # ........dartanalyzer.dart.snapshot
 # ........dartdoc.dart.snapshot
@@ -118,6 +119,10 @@
     "../utils/analysis_server",
   ],
   [
+    "analysis_server_dart1",
+    "../utils/analysis_server_dart1",
+  ],
+  [
     "dartanalyzer",
     "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
   ],
@@ -145,6 +150,10 @@
     "../utils/analysis_server",
   ],
   [
+    "analysis_server_dart1",
+    "../utils/analysis_server_dart1",
+  ],
+  [
     "dart2js",
     "../utils/compiler:dart2js",
   ],
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 3af2658..494f471 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -148,10 +148,12 @@
  */
 abstract class Future<T> {
   /// A `Future<Null>` completed with `null`.
-  static final _Future<Null> _nullFuture = new _Future<Null>.value(null);
+  static final _Future<Null> _nullFuture =
+      new _Future<Null>.zoneValue(null, Zone.root);
 
   /// A `Future<bool>` completed with `false`.
-  static final _Future<bool> _falseFuture = new _Future<bool>.value(false);
+  static final _Future<bool> _falseFuture =
+      new _Future<bool>.zoneValue(false, Zone.root);
 
   /**
    * Creates a future containing the result of calling [computation]
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 077ccf6..b85e6ab 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -186,7 +186,7 @@
    * Until the future is completed, the field may hold the zone that
    * listener callbacks used to create this future should be run in.
    */
-  final Zone _zone = Zone.current;
+  final Zone _zone;
 
   /**
    * Either the result, a list of listeners or another future.
@@ -206,20 +206,24 @@
   var _resultOrListeners;
 
   // This constructor is used by async/await.
-  _Future();
+  _Future() : _zone = Zone.current;
 
-  _Future.immediate(FutureOr<T> result) {
+  _Future.immediate(FutureOr<T> result) : _zone = Zone.current {
     _asyncComplete(result);
   }
 
-  _Future.immediateError(var error, [StackTrace stackTrace]) {
+  /** Creates a future with the value and the specified zone. */
+  _Future.zoneValue(T value, this._zone) {
+    _setValue(value);
+  }
+
+  _Future.immediateError(var error, [StackTrace stackTrace])
+      : _zone = Zone.current {
     _asyncCompleteError(error, stackTrace);
   }
 
   /** Creates a future that is already completed with the value. */
-  _Future.value(T value) {
-    _setValue(value);
-  }
+  _Future.value(T value) : this.zoneValue(value, Zone.current);
 
   bool get _mayComplete => _state == _stateIncomplete;
   bool get _isPendingComplete => _state == _statePendingComplete;
@@ -475,7 +479,7 @@
 
   void _completeWithValue(T value) {
     assert(!_isComplete);
-    assert(value is! Future);
+    assert(value is! Future<T>);
 
     _FutureListener listeners = _removeListeners();
     _setValue(value);
diff --git a/sdk/lib/collection/iterable.dart b/sdk/lib/collection/iterable.dart
index fcad61f..79d6188 100644
--- a/sdk/lib/collection/iterable.dart
+++ b/sdk/lib/collection/iterable.dart
@@ -20,11 +20,7 @@
 
   Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<T> expand<T>(Iterable<T> f(E element)) =>
       new ExpandIterable<E, T>(this, f);
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index 644d4b7..a719679 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -191,11 +191,7 @@
 
   Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   Iterable<T> map<T>(T f(E element)) => new MappedListIterable<E, T>(this, f);
 
diff --git a/sdk/lib/collection/set.dart b/sdk/lib/collection/set.dart
index 6481a56..80ec9d3 100644
--- a/sdk/lib/collection/set.dart
+++ b/sdk/lib/collection/set.dart
@@ -51,11 +51,7 @@
   Iterable<E> followedBy(Iterable<E> other) =>
       new FollowedByIterable<E>.firstEfficient(this, other);
 
-  // TODO(leafp): Restore this functionality once generic methods are enabled
-  // in the VM and dart2js.
-  // https://github.com/dart-lang/sdk/issues/32463
-  Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
   void clear() {
     removeAll(toList());
diff --git a/sdk/lib/developer/timeline.dart b/sdk/lib/developer/timeline.dart
index f1ceda4..e838a1f 100644
--- a/sdk/lib/developer/timeline.dart
+++ b/sdk/lib/developer/timeline.dart
@@ -79,7 +79,7 @@
 /// [Timeline]'s methods add synchronous events to the timeline. When
 /// generating a timeline in Chrome's tracing format, using [Timeline] generates
 /// "Complete" events. [Timeline]'s [startSync] and [finishSync] can be used
-/// explicitly, or implicitly by wrapping a closure in [timeSync]. For exmaple:
+/// explicitly, or implicitly by wrapping a closure in [timeSync]. For example:
 ///
 /// ```dart
 /// Timeline.startSync("Doing Something");
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 6c2d46f..6d0e31a 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -4514,6 +4514,7 @@
 LayoutTests/fast/events/event-listener-sharing_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: RuntimeError # Please triage this failure
 LayoutTests/fast/events/form-onchange_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/init-message-event_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index c28c644..a716a8e 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -3,9 +3,13 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == fasta ]
+Language/Classes/Getters/override_t02: CompileTimeError
+Language/Classes/Getters/override_t03: CompileTimeError
+Language/Classes/Setters/override_t02: CompileTimeError
 Language/Classes/definition_t24: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
+Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError
 Language/Types/Type_Void/syntax_t08: MissingCompileTimeError
 Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
 LayoutTests/*: Skip # TODO(ahe): Make dart:html available.
@@ -58,8 +62,13 @@
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/static_type_t01: CompileTimeError
+Language/Classes/Constructors/name_t01: MissingCompileTimeError
+Language/Classes/Constructors/name_t02: MissingCompileTimeError
+Language/Classes/Constructors/name_t03: MissingCompileTimeError
 Language/Classes/Getters/static_getter_t01: CompileTimeError
+Language/Classes/Instance_Methods/same_name_setter_t01: CompileTimeError
 Language/Classes/Instance_Methods/same_name_setter_t02: CompileTimeError # Issue 14736
+Language/Classes/Setters/name_t02: CompileTimeError
 Language/Classes/Setters/name_t03: CompileTimeError
 Language/Classes/Setters/name_t04: CompileTimeError
 Language/Classes/Setters/name_t06: CompileTimeError
@@ -89,6 +98,9 @@
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t02: MissingCompileTimeError
+Language/Classes/Constructors/name_t01: MissingCompileTimeError
+Language/Classes/Constructors/name_t02: MissingCompileTimeError
+Language/Classes/Constructors/name_t03: MissingCompileTimeError
 Language/Classes/Getters/same_name_method_t03: MissingCompileTimeError
 Language/Classes/Getters/same_name_method_t04: MissingCompileTimeError
 Language/Classes/Getters/same_name_method_t05: MissingCompileTimeError
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
index 6824a1a..e8976f4 100644
--- a/tests/co19_2/co19_2-analyzer.status
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -42,6 +42,7 @@
 Language/Generics/syntax_t02: CompileTimeError # Please triage this failure
 Language/Generics/syntax_t03: Crash # Issue 29388
 Language/Libraries_and_Scripts/Parts/compilation_t01: MissingCompileTimeError, Pass # Please triage this failure
+Language/Libraries_and_Scripts/Parts/compilation_t04: Pass, CompileTimeError, MissingCompileTimeError # Please triage this failure
 Language/Libraries_and_Scripts/Parts/compilation_t15: CompileTimeError, Pass # Please triage this failure
 Language/Mixins/Mixin_Application/static_warning_t02: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/superinterfaces_t07: CompileTimeError # Issue 26409
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index 956726a..ab8f393 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -31,19 +31,19 @@
 Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t12: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
+Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Constructors/name_t02: MissingCompileTimeError # Legal, see #33235
+Language/Classes/Constructors/name_t03: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t04: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t05: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError
-Language/Classes/Getters/override_t02: MissingCompileTimeError
-Language/Classes/Getters/override_t03: MissingCompileTimeError
 Language/Classes/Getters/type_object_t01: CompileTimeError
 Language/Classes/Getters/type_object_t02: CompileTimeError
 Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_setter_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError
@@ -58,10 +58,8 @@
 Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError
 Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError
 Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError
-Language/Classes/Setters/name_t02: MissingCompileTimeError
 Language/Classes/Setters/name_t06: CompileTimeError
 Language/Classes/Setters/name_t07: CompileTimeError
-Language/Classes/Setters/override_t02: MissingCompileTimeError
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
 Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError
@@ -159,6 +157,7 @@
 Language/Metadata/compilation_t03: MissingCompileTimeError
 Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
 Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError
+Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # The test even says in the comment it should be a compile time error
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
diff --git a/tests/compiler/dart2js/dill_loader_test.dart b/tests/compiler/dart2js/dill_loader_test.dart
index e1fd6b1..05b9a43 100644
--- a/tests/compiler/dart2js/dill_loader_test.dart
+++ b/tests/compiler/dart2js/dill_loader_test.dart
@@ -4,17 +4,18 @@
 
 import 'memory_compiler.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart'
     show LibraryEntity, ClassEntity;
-import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
-import "package:expect/expect.dart";
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 import 'package:compiler/src/kernel/dart2js_target.dart';
-import 'package:kernel/target/targets.dart' show TargetFlags;
+import 'package:compiler/src/library_loader.dart';
+import 'package:expect/expect.dart';
+import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
+import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
+import 'package:kernel/target/targets.dart' show TargetFlags;
 
 /// Test that the compiler can successfully read in .dill kernel files rather
 /// than just string source files.
@@ -43,7 +44,9 @@
         diagnosticHandler: diagnostics,
         outputProvider: output);
     await compiler.setupSdk();
-    await compiler.libraryLoader.loadLibrary(entryPoint);
+    LoadedLibraries loadedLibraries =
+        await compiler.libraryLoader.loadLibraries(entryPoint);
+    compiler.frontendStrategy.registerLoadedLibraries(loadedLibraries);
 
     Expect.equals(0, diagnostics.errors.length);
     Expect.equals(0, diagnostics.warnings.length);
diff --git a/tests/compiler/dart2js/in_user_code_test.dart b/tests/compiler/dart2js/in_user_code_test.dart
index 82c080f..580fdf6 100644
--- a/tests/compiler/dart2js/in_user_code_test.dart
+++ b/tests/compiler/dart2js/in_user_code_test.dart
@@ -53,7 +53,8 @@
       packageConfig: Uri.parse('memory:.packages'));
   Compiler compiler = result.compiler;
   expectedResults.forEach((String uri, bool expectedResult) {
-    dynamic element = compiler.libraryLoader.lookupLibrary(Uri.parse(uri));
+    dynamic element = compiler.frontendStrategy.elementEnvironment
+        .lookupLibrary(Uri.parse(uri));
     Expect.isNotNull(element, "Unknown library '$uri'.");
     Expect.equals(
         expectedResult,
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 70b8757..c85cf11 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -15,12 +15,7 @@
         Diagnostic,
         PackagesDiscoveryProvider;
 import 'package:compiler/src/diagnostics/messages.dart' show Message;
-import 'package:compiler/src/elements/entities.dart'
-    show LibraryEntity, MemberEntity;
-import 'package:compiler/src/enqueue.dart' show ResolutionEnqueuer;
 import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput;
-import 'package:compiler/src/library_loader.dart'
-    show LoadedLibraries, KernelLibraryLoaderTask;
 import 'package:compiler/src/options.dart' show CompilerOptions;
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
@@ -68,9 +63,6 @@
   return handler;
 }
 
-Expando<MemorySourceFileProvider> expando =
-    new Expando<MemorySourceFileProvider>();
-
 // Cached kernel state for non-strong mode.
 fe.InitializedCompilerState kernelInitializedCompilerState;
 
@@ -86,7 +78,6 @@
     CompilerDiagnostics diagnosticHandler,
     CompilerOutput outputProvider,
     List<String> options: const <String>[],
-    CompilerImpl cachedCompiler,
     bool showDiagnostics: true,
     Uri packageRoot,
     Uri packageConfig,
@@ -101,7 +92,6 @@
       diagnosticHandler: diagnosticHandler,
       outputProvider: outputProvider,
       options: options,
-      cachedCompiler: cachedCompiler,
       showDiagnostics: showDiagnostics,
       packageRoot: packageRoot,
       packageConfig: packageConfig,
@@ -111,15 +101,12 @@
   }
   fe.InitializedCompilerState compilerState;
   bool isSuccess = await compiler.run(entryPoint);
-  if (compiler.libraryLoader is KernelLibraryLoaderTask) {
-    KernelLibraryLoaderTask loader = compiler.libraryLoader;
-    if (compiler.options.strongMode) {
-      compilerState = strongKernelInitializedCompilerState =
-          loader.initializedCompilerState;
-    } else {
-      compilerState =
-          kernelInitializedCompilerState = loader.initializedCompilerState;
-    }
+  if (compiler.options.strongMode) {
+    compilerState = strongKernelInitializedCompilerState =
+        compiler.libraryLoader.initializedCompilerState;
+  } else {
+    compilerState = kernelInitializedCompilerState =
+        compiler.libraryLoader.initializedCompilerState;
   }
   return new CompilationResult(compiler,
       isSuccess: isSuccess, kernelInitializedCompilerState: compilerState);
@@ -131,7 +118,6 @@
     CompilerDiagnostics diagnosticHandler,
     CompilerOutput outputProvider,
     List<String> options: const <String>[],
-    CompilerImpl cachedCompiler,
     bool showDiagnostics: true,
     Uri packageRoot,
     Uri packageConfig,
@@ -154,17 +140,7 @@
   }
 
   MemorySourceFileProvider provider;
-  if (cachedCompiler == null) {
-    provider = new MemorySourceFileProvider(memorySourceFiles);
-    // Saving the provider in case we need it later for a cached compiler.
-    expando[provider] = provider;
-  } else {
-    // When using a cached compiler, it has read a number of files from disk
-    // already (and will not attempt to read them again due to caching). These
-    // files must be available to the new diagnostic handler.
-    provider = expando[cachedCompiler.provider];
-    provider.memorySourceFiles = memorySourceFiles;
-  }
+  provider = new MemorySourceFileProvider(memorySourceFiles);
   diagnosticHandler = createCompilerDiagnostics(diagnosticHandler, provider,
       showDiagnostics: showDiagnostics,
       verbose: options.contains('-v') || options.contains('--verbose'));
@@ -190,67 +166,9 @@
   CompilerImpl compiler = new CompilerImpl(
       provider, outputProvider, diagnosticHandler, compilerOptions);
 
-  if (cachedCompiler != null) {
-    Map copiedLibraries = {};
-    cachedCompiler.libraryLoader.libraries.forEach((dynamic library) {
-      if (library.isPlatformLibrary) {
-        dynamic libraryLoader = compiler.libraryLoader;
-        libraryLoader.mapLibrary(library);
-        copiedLibraries[library.canonicalUri] = library;
-      }
-    });
-    compiler.processLoadedLibraries(new MemoryLoadedLibraries(copiedLibraries));
-    ResolutionEnqueuer resolutionEnqueuer = compiler.startResolution();
-
-    Iterable<MemberEntity> cachedTreeElements =
-        cachedCompiler.enqueuer.resolution.processedEntities;
-    cachedTreeElements.forEach((MemberEntity element) {
-      if (element.library.canonicalUri.scheme == 'dart') {
-        resolutionEnqueuer.registerProcessedElementInternal(element);
-      }
-    });
-
-    dynamic frontendStrategy = compiler.frontendStrategy;
-    frontendStrategy.nativeBasicDataBuilder.reopenForTesting();
-
-    // One potential problem that can occur when reusing elements is that there
-    // is a stale reference to an old compiler object.  By nulling out the old
-    // compiler's fields, such stale references are easier to identify.
-    cachedCompiler.libraryLoader = null;
-    cachedCompiler.globalInference = null;
-    cachedCompiler.backend = null;
-    // Don't null out the enqueuer as it prevents us from using cachedCompiler
-    // more than once.
-    cachedCompiler.deferredLoadTask = null;
-    cachedCompiler.dumpInfoTask = null;
-  }
   return compiler;
 }
 
-class MemoryLoadedLibraries implements LoadedLibraries {
-  final Map copiedLibraries;
-
-  MemoryLoadedLibraries(this.copiedLibraries);
-
-  @override
-  bool containsLibrary(Uri uri) => copiedLibraries.containsKey(uri);
-
-  @override
-  void forEachImportChain(f, {callback}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  void forEachLibrary(void f(LibraryEntity l)) =>
-      copiedLibraries.values.forEach((l) => f(l));
-
-  @override
-  getLibrary(Uri uri) => copiedLibraries[uri];
-
-  @override
-  LibraryEntity get rootLibrary => copiedLibraries.values.first;
-}
-
 DiagnosticHandler createDiagnosticHandler(DiagnosticHandler diagnosticHandler,
     SourceFileProvider provider, bool showDiagnostics) {
   var handler = diagnosticHandler;
diff --git a/tests/compiler/dart2js/rti/emission/event_callback.dart b/tests/compiler/dart2js/rti/emission/event_callback.dart
index a0c84dd..bb6068f 100644
--- a/tests/compiler/dart2js/rti/emission/event_callback.dart
+++ b/tests/compiler/dart2js/rti/emission/event_callback.dart
@@ -7,8 +7,13 @@
 /*kernel.class: global#Event:checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
 /*strong.class: global#Event:checkedInstance,checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
 
-/*class: global#MouseEvent:checks=[],instance*/
-/*class: global#KeyboardEvent:checks=[],instance*/
+/*kernel.class: global#MouseEvent:checks=[$isMouseEvent],instance,typeArgument*/
+/*strong.class: global#MouseEvent:checks=[$isMouseEvent],instance,typeArgument*/
+/*omit.class: global#MouseEvent:instance*/
+
+/*kernel.class: global#KeyboardEvent:checks=[$isKeyboardEvent],instance,typeArgument*/
+/*strong.class: global#KeyboardEvent:checks=[$isKeyboardEvent],instance,typeArgument*/
+/*omit.class: global#KeyboardEvent:instance*/
 
 void main() {
   print('InputElement');
diff --git a/tests/compiler/dart2js/rti/emission/map_literal.dart b/tests/compiler/dart2js/rti/emission/map_literal.dart
index 2dbeda8..f9eb53b 100644
--- a/tests/compiler/dart2js/rti/emission/map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/map_literal.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: global#Map:instance*/
-/*strong.class: global#Map:checkedInstance,checks=[],instance*/
+/*strong.class: global#Map:checkedInstance,instance*/
 
 /*class: global#LinkedHashMap:*/
 /*class: global#JsLinkedHashMap:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/map_literal_checked.dart b/tests/compiler/dart2js/rti/emission/map_literal_checked.dart
index 2f51833..a54e67f 100644
--- a/tests/compiler/dart2js/rti/emission/map_literal_checked.dart
+++ b/tests/compiler/dart2js/rti/emission/map_literal_checked.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#Map:checkedInstance,checks=[],instance*/
+/*class: global#Map:checkedInstance,instance*/
 /*class: global#LinkedHashMap:checkedInstance*/
 /*class: global#JsLinkedHashMap:checkedInstance,checks=[$isLinkedHashMap],instance*/
 /*class: global#double:checkedInstance,checks=[],instance,typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
new file mode 100644
index 0000000..5b22b5f
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+// This class is inlined away.
+/*class: Class:*/
+class Class<T> {
+  const Class();
+
+  Type get type => T;
+}
+
+/*class: A:checks=[],typeArgument*/
+class A {}
+
+@NoInline()
+test(o) => Expect.notEquals('dynamic', '$o');
+
+main() {
+  test(const Class<A>().type);
+}
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index 36fefb6..d7f6b65 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_test.dart
@@ -38,8 +38,6 @@
         'map_literal_checked.dart',
         // TODO(johnniwinther): Optimize local function type signature need.
         'subtype_named_args.dart',
-        // TODO(33690):
-        'native.dart',
       ],
     );
   });
diff --git a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart b/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
new file mode 100644
index 0000000..f530000
--- /dev/null
+++ b/tests/compiler/dart2js_extra/replaced_type_variable_test.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.
+
+import 'package:expect/expect.dart';
+
+// This class is inlined away.
+class Class<T> {
+  const Class();
+
+  Type get type => T;
+}
+
+class A {}
+
+@NoInline()
+test(o) => Expect.notEquals('dynamic', '$o');
+
+main() {
+  test(const Class<A>().type);
+}
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 8ad400d..6273aa3 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -10,7 +10,6 @@
 *: Skip
 
 [ $compiler == dart2js && $checked && !$strong ]
-error_safeToString_test: RuntimeError # Fix for Issue 33627 disabled native class sharing
 native_method_inlining_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
@@ -24,5 +23,4 @@
 optimization_hints_test: RuntimeError, OK # Test relies on unminified names.
 
 [ $compiler == dart2js && $strong ]
-error_safeToString_test: RuntimeError # Fix for Issue 33627 disabled native class sharing
 native_checked_fields_frog_test: RuntimeError
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 65d9def..0afd48c 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -1,7 +1,6 @@
 # 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.
-iterable_where_type_test: RuntimeError # Disabled.  Issue 32463
 maps_test: Skip # Maps class no longer exists
 
 [ $compiler == app_jitk ]
@@ -13,55 +12,22 @@
 unicode_test: RuntimeError
 
 [ $compiler == dart2analyzer ]
-bigint_from_test: CompileTimeError # Issue 32585
-compare_to2_test: CompileTimeError # invalid test
 int_parse_radix_bad_handler_test: MissingCompileTimeError
-int_try_parse_test: CompileTimeError # Issue 32585
 iterable_element_at_test/static: Pass
 num_sign_test: Crash, Pass # Issue 31768
 
 [ $compiler == dart2js ]
 bigint_from_test: RuntimeError # Issue 32589
 date_time11_test: RuntimeError, Pass # Fails when US is on winter time, issue 31285.
-iterable_where_type_test: RuntimeError # issue 31718
 list_unmodifiable_test: Pass, RuntimeError # Issue 28712
 
 [ $compiler != dartdevc ]
 error_stack_trace_test/static: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
-bigint_from_test: RuntimeError # Issue 32589
-bigint_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 bool_from_environment2_test/03: Crash
-compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_ceil_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_floor_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_round_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_truncate_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_ceil_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_ceil_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_floor_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_floor_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_from_environment_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 int_modulo_arith_test/modPow: RuntimeError
 int_modulo_arith_test/none: RuntimeError
-int_parse_radix_int64_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_round_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_round_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_to_int_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_truncate_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_truncate_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_arith_vm_test/modPow: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_arith_vm_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-num_sign_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 string_from_environment3_test/03: Crash
 
 [ $compiler == precompiler ]
@@ -122,6 +88,7 @@
 
 [ !$strong ]
 cast_test: SkipByDesign # Uses generic method parameters.
+iterable_where_type_test: SkipByDesign
 regress_33166_test: SkipByDesign # Not a Dart 1 test
 
 [ $arch == simarmv5te && ($runtime == dart_precompiled || $runtime == vm) ]
@@ -303,9 +270,7 @@
 string_from_environment3_test/03: MissingCompileTimeError
 
 [ $compiler == dartdevc && $runtime != none ]
-bigint_from_test: CompileTimeError # Issue 32585
 compare_to2_test: CompileTimeError # invalid test
-int_try_parse_test: CompileTimeError # Issue 32585
 symbol_operator_test: RuntimeError # Issue 29921
 
 [ $compiler != dartdevc && $compiler != dartdevk && $checked && !$strong ]
@@ -417,74 +382,6 @@
 regress_r21715_test: RuntimeError # Requires fixed-size int64 support.
 typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
 
-[ $runtime != none && ($compiler == dartdevc || $compiler == dartdevk) ]
-bigint_test: Pass, Slow, Timeout
-compare_to2_test: RuntimeError # Issue 30170
-date_time10_test: RuntimeError # Issue 29921
-error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
-hash_set_test/01: RuntimeError # Issue 29921
-int_modulo_arith_test/none: RuntimeError # Issue 29921
-int_parse_radix_int64_test/02: RuntimeError
-int_parse_radix_test/01: RuntimeError # Issue 29921
-int_parse_with_limited_ints_test: Skip # Requires fixed-size int64 support.
-integer_arith_vm_test/modPow: RuntimeError # Issue 30170
-integer_parsed_arith_vm_test: RuntimeError # Issue 29921
-integer_to_radix_string_test: RuntimeError # Issue 29921
-integer_to_string_test/01: RuntimeError # Issue 29921
-iterable_return_type_test/02: RuntimeError # Issue 29921
-list_concurrent_modify_test: RuntimeError # DDC uses ES6 array iterators so it does not issue this
-list_removeat_test: RuntimeError # Issue 29921
-main_test: RuntimeError # Issue 29921
-nan_infinity_test/01: RuntimeError # Issue 29921
-regexp/alternative-length-miscalculation_test: RuntimeError # Issue 29921
-regexp/ascii-regexp-subject_test: RuntimeError # Issue 29921
-regexp/bol-with-multiline_test: RuntimeError # Issue 29921
-regexp/capture-3_test: RuntimeError # Issue 29921
-regexp/char-insensitive_test: RuntimeError # Issue 29921
-regexp/character-match-out-of-order_test: RuntimeError # Issue 29921
-regexp/compile-crash_test: RuntimeError # Issue 29921
-regexp/default_arguments_test: RuntimeError # Issue 29921
-regexp/early-acid3-86_test: RuntimeError # Issue 29921
-regexp/ecma-regex-examples_test: RuntimeError # Issue 29921
-regexp/extended-characters-match_test: RuntimeError # Issue 29921
-regexp/extended-characters-more_test: RuntimeError # Issue 29921
-regexp/find-first-asserted_test: RuntimeError # Issue 29921
-regexp/invalid-range-in-class_test: RuntimeError # Issue 29921
-regexp/look-ahead_test: RuntimeError # Issue 29921
-regexp/loop-capture_test: RuntimeError # Issue 29921
-regexp/malformed-escapes_test: RuntimeError # Issue 29921
-regexp/many-brackets_test: RuntimeError # Issue 29921
-regexp/negative-special-characters_test: RuntimeError # Issue 29921
-regexp/no-extensions_test: RuntimeError # Issue 29921
-regexp/non-bmp_test: RuntimeError # Issue 29921
-regexp/non-capturing-backtracking_test: RuntimeError # Issue 29921
-regexp/non-capturing-groups_test: RuntimeError # Issue 29921
-regexp/non-character_test: RuntimeError # Issue 29921
-regexp/non-greedy-parentheses_test: RuntimeError # Issue 29921
-regexp/pcre-test-4_test: RuntimeError # Issue 29921
-regexp/quantified-assertions_test: RuntimeError # Issue 29921
-regexp/range-bound-ffff_test: RuntimeError # Issue 29921
-regexp/range-out-of-order_test: RuntimeError # Issue 29921
-regexp/ranges-and-escaped-hyphens_test: RuntimeError # Issue 29921
-regexp/regress-6-9-regexp_test: RuntimeError # Issue 29921
-regexp/regress-regexp-codeflush_test: RuntimeError # Issue 29921
-regexp/regress-regexp-construct-result_test: RuntimeError # Issue 29921
-regexp/repeat-match-waldemar_test: RuntimeError # Issue 29921
-regexp/results-cache_test: RuntimeError # Issue 29921
-regexp/stack-overflow2_test: RuntimeError # Issue 29921
-regexp/stack-overflow_test: RuntimeError # Issue 29921
-regexp/unicode-handling_test: RuntimeError # Issue 29921
-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/03: RuntimeError # Issue 29921
-symbol_reserved_word_test/06: RuntimeError # Issue 29921
-symbol_reserved_word_test/09: RuntimeError # Issue 29921
-symbol_reserved_word_test/12: RuntimeError # Issue 29921
-symbol_test/none: RuntimeError # Issue 29921
-typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
-uri_parse_test: Pass, Slow
-
 [ $runtime == vm && !$strong ]
 collection_of_test: RuntimeError
 
@@ -603,6 +500,102 @@
 from_environment_const_type_undefined_test/16: MissingCompileTimeError
 iterable_to_set_test: RuntimeError # is-checks do not implement strong mode type system
 
+[ $compiler == dartdevc || $compiler == dartdevk ]
+bigint_from_test: RuntimeError # Issue 32589
+bigint_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+compare_to2_test: RuntimeError # Issue 30170
+compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+date_time10_test: RuntimeError # Issue 29921
+date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_ceil_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_floor_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_round_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_truncate_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+hash_set_test/01: RuntimeError # Issue 29921
+int_ceil_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_from_environment_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_modulo_arith_test/none: RuntimeError # Issue 29921
+int_parse_radix_int64_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/02: RuntimeError
+int_parse_radix_int64_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_test/01: RuntimeError # Issue 29921
+int_parse_with_limited_ints_test: Skip # Requires fixed-size int64 support.
+int_round_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_round_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_to_int_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_arith_vm_test/modPow: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_arith_vm_test/modPow: RuntimeError # Issue 30170
+integer_arith_vm_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_parsed_arith_vm_test: RuntimeError # Issue 29921
+integer_to_radix_string_test: RuntimeError # Issue 29921
+integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_to_string_test/01: RuntimeError # Issue 29921
+iterable_return_type_test/02: RuntimeError # Issue 29921
+list_concurrent_modify_test: RuntimeError # DDC uses ES6 array iterators so it does not issue this
+list_removeat_test: RuntimeError # Issue 29921
+main_test: RuntimeError # Issue 29921
+nan_infinity_test/01: RuntimeError # Issue 29921
+num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_sign_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+regexp/alternative-length-miscalculation_test: RuntimeError # Issue 29921
+regexp/ascii-regexp-subject_test: RuntimeError # Issue 29921
+regexp/bol-with-multiline_test: RuntimeError # Issue 29921
+regexp/capture-3_test: RuntimeError # Issue 29921
+regexp/char-insensitive_test: RuntimeError # Issue 29921
+regexp/character-match-out-of-order_test: RuntimeError # Issue 29921
+regexp/compile-crash_test: RuntimeError # Issue 29921
+regexp/default_arguments_test: RuntimeError # Issue 29921
+regexp/early-acid3-86_test: RuntimeError # Issue 29921
+regexp/ecma-regex-examples_test: RuntimeError # Issue 29921
+regexp/extended-characters-match_test: RuntimeError # Issue 29921
+regexp/extended-characters-more_test: RuntimeError # Issue 29921
+regexp/find-first-asserted_test: RuntimeError # Issue 29921
+regexp/invalid-range-in-class_test: RuntimeError # Issue 29921
+regexp/look-ahead_test: RuntimeError # Issue 29921
+regexp/loop-capture_test: RuntimeError # Issue 29921
+regexp/malformed-escapes_test: RuntimeError # Issue 29921
+regexp/many-brackets_test: RuntimeError # Issue 29921
+regexp/negative-special-characters_test: RuntimeError # Issue 29921
+regexp/no-extensions_test: RuntimeError # Issue 29921
+regexp/non-bmp_test: RuntimeError # Issue 29921
+regexp/non-capturing-backtracking_test: RuntimeError # Issue 29921
+regexp/non-capturing-groups_test: RuntimeError # Issue 29921
+regexp/non-character_test: RuntimeError # Issue 29921
+regexp/non-greedy-parentheses_test: RuntimeError # Issue 29921
+regexp/pcre-test-4_test: RuntimeError # Issue 29921
+regexp/quantified-assertions_test: RuntimeError # Issue 29921
+regexp/range-bound-ffff_test: RuntimeError # Issue 29921
+regexp/range-out-of-order_test: RuntimeError # Issue 29921
+regexp/ranges-and-escaped-hyphens_test: RuntimeError # Issue 29921
+regexp/regress-6-9-regexp_test: RuntimeError # Issue 29921
+regexp/regress-regexp-codeflush_test: RuntimeError # Issue 29921
+regexp/regress-regexp-construct-result_test: RuntimeError # Issue 29921
+regexp/repeat-match-waldemar_test: RuntimeError # Issue 29921
+regexp/results-cache_test: RuntimeError # Issue 29921
+regexp/stack-overflow2_test: RuntimeError # Issue 29921
+regexp/stack-overflow_test: RuntimeError # Issue 29921
+regexp/unicode-handling_test: RuntimeError # Issue 29921
+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/03: RuntimeError # Issue 29921
+symbol_reserved_word_test/06: RuntimeError # Issue 29921
+symbol_reserved_word_test/09: RuntimeError # Issue 29921
+symbol_reserved_word_test/12: RuntimeError # Issue 29921
+symbol_test/none: RuntimeError # Issue 29921
+typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
+uri_parse_test: Pass, Slow
+
 [ $compiler == precompiler || $runtime == vm && !$checked && !$strong ]
 int_parse_radix_test/badTypes: RuntimeError # wrong exception returned
 
diff --git a/tests/html/html.status b/tests/html/html.status
index 0003482..3e1f490 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -159,9 +159,6 @@
 [ $strong ]
 *: SkipByDesign
 
-[ $compiler == dart2analyzer && $strong ]
-*: Skip # Issue 28649
-
 [ $compiler == dart2js && $runtime == chrome ]
 element_animate_test/timing_dict: RuntimeError # Issue 26730
 element_classes_test: RuntimeError # Issue 30291
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 1c23b98..5b370c1 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -42,9 +42,6 @@
 [ $strong ]
 *: SkipByDesign
 
-[ $compiler == dart2analyzer && $strong ]
-*: Skip # Issue 28649
-
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index dea875e..f5cd37f 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -18,7 +18,8 @@
 unsorted/super_mixin_test: CompileTimeError
 
 [ $compiler == dart2analyzer && $strong ]
-*: Skip # Issue 28649
+unsorted/klass_field_initializer_test: CompileTimeError
+unsorted/super_initializer_test: CompileTimeError
 
 [ $compiler == dart2js && $fasta ]
 unsorted/super_mixin_test: RuntimeError
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index ca82ca7..1dfe445 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -3,6 +3,8 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == fasta ]
+bad_constructor_test/04: MissingCompileTimeError
+bad_constructor_test/06: MissingCompileTimeError
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
 prefix5_negative_test: Fail
diff --git a/tests/language_2/bad_constructor_test.dart b/tests/language_2/bad_constructor_test.dart
index 429da88..4ae6751 100644
--- a/tests/language_2/bad_constructor_test.dart
+++ b/tests/language_2/bad_constructor_test.dart
@@ -14,24 +14,6 @@
   factory B() { return null; }
 }
 
-// A named constructor can't have the same name as a field.
-class C {
-  var field;
-  C
-      .field //# 04: compile-time error
-      ();
-  C.good();
-}
-
-// A named constructor can't have the same name as a method.
-class D {
-  method() {}
-  D
-      .method //# 06: compile-time error
-      ();
-  D.good();
-}
-
 // A named constructor can have the same name as a setter.
 class E {
   set setter(value) {} //# 05: ok
@@ -47,8 +29,6 @@
 main() {
   new A();
   new B();
-  new C.good();
-  new D.good();
   new E.setter();
   new F();
 }
diff --git a/tests/language_2/check_member_static_test.dart b/tests/language_2/check_member_static_test.dart
index 7f662eb..90aba31 100644
--- a/tests/language_2/check_member_static_test.dart
+++ b/tests/language_2/check_member_static_test.dart
@@ -10,7 +10,7 @@
 class B extends A {}
 
 class C extends B {
-  var a; //# 01: compile-time error
+  var a; //# 01: ok
   static var b; //# 02: compile-time error
 }
 
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index fdece1b..0572c2e 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -354,5 +354,6 @@
 regress_23408_test: Crash # Requires deferred libraries
 regress_28278_test: Crash # Requires deferred libraries
 static_closure_identical_test: Pass, Fail # Closure identity
+symbol_conflict_test: Pass, Timeout
 vm/optimized_stacktrace_test: Pass, Slow
 vm/regress_27201_test: Pass, Crash # Requires deferred libraries
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 8c33ba2..42452d8 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -57,6 +57,12 @@
 void_type_function_types_test/08: MissingCompileTimeError
 void_type_function_types_test/none: Pass
 
+[ $compiler == dart2analyzer && $fasta ]
+compile_time_constant_static5_test/11: CompileTimeError # Issue 31537
+compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
+compile_time_constant_static5_test/21: CompileTimeError # Issue 31537
+compile_time_constant_static5_test/23: CompileTimeError # Issue 31402
+
 [ $compiler == dart2analyzer && !$fasta ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
@@ -64,6 +70,7 @@
 bad_initializer2_negative_test: Fail # Issue 14880
 built_in_identifier_prefix_test: CompileTimeError
 built_in_identifier_type_annotation_test/dynamic-gen: MissingCompileTimeError # Issue 28813
+check_member_static_test/01: CompileTimeError
 config_import_corelib_test: StaticWarning, OK
 conflicting_type_variable_and_setter_test: CompileTimeError # Issue 25525
 const_cast2_test/01: CompileTimeError
@@ -90,7 +97,6 @@
 final_syntax_test/04: Fail # Issue 11124
 function_type_parameter2_negative_test: CompileTimeError
 function_type_parameter_negative_test: CompileTimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 30929
 generic_local_functions_test: CompileTimeError # Issue 28515
 generic_methods_generic_function_parameter_test: CompileTimeError # Issue 28515
 generic_no_such_method_dispatcher_simple_test: Skip # This test is just for kernel.
@@ -168,6 +174,18 @@
 regress_29349_test: CompileTimeError # Issue 29744
 regress_29405_test: CompileTimeError # Issue 29421
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
+regress_33235_03_test/01: MissingCompileTimeError
+regress_33235_07_test/03: MissingCompileTimeError
+regress_33235_10_test/01: MissingCompileTimeError
+regress_33235_10_test/02: MissingCompileTimeError
+regress_33235_10_test/03: MissingCompileTimeError
+regress_33235_11_test/01: MissingCompileTimeError
+regress_33235_12_test/03: MissingCompileTimeError
+regress_33235_13_test/03: MissingCompileTimeError
+regress_33235_16_test/02: MissingCompileTimeError
+regress_33235_16_test/03: MissingCompileTimeError
+regress_33235_19_test: CompileTimeError
+regress_33235_20_test: CompileTimeError
 script1_negative_test: CompileTimeError
 script2_negative_test: CompileTimeError
 setter_declaration2_negative_test: CompileTimeError
@@ -201,16 +219,12 @@
 vm/regress_33469_test/01: Crash # http://dartbug.com/33481
 vm/regress_33469_test/02: Crash # http://dartbug.com/33481
 vm/regress_33469_test/03: MissingCompileTimeError # http://dartbug.com/33481
-void_type_override_test/00: MissingCompileTimeError
-void_type_override_test/00b: MissingCompileTimeError
-void_type_override_test/01: MissingCompileTimeError
 void_type_override_test/02: MissingCompileTimeError
 void_type_override_test/03: MissingCompileTimeError
 void_type_usage_test/call_conditional: MissingCompileTimeError
 void_type_usage_test/call_literal_list_init: MissingCompileTimeError
 void_type_usage_test/call_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/call_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/call_return: MissingCompileTimeError
 void_type_usage_test/call_void_init: MissingCompileTimeError
 void_type_usage_test/conditional2_conditional: MissingCompileTimeError
 void_type_usage_test/conditional2_for: MissingCompileTimeError
@@ -247,51 +261,41 @@
 void_type_usage_test/final_local_literal_list_init: MissingCompileTimeError
 void_type_usage_test/final_local_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/final_local_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/final_local_return: MissingCompileTimeError
 void_type_usage_test/final_local_void_init: MissingCompileTimeError
 void_type_usage_test/global_conditional: MissingCompileTimeError
 void_type_usage_test/global_literal_list_init: MissingCompileTimeError
 void_type_usage_test/global_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/global_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/global_return: MissingCompileTimeError
 void_type_usage_test/global_void_init: MissingCompileTimeError
 void_type_usage_test/instance2_conditional: MissingCompileTimeError
-void_type_usage_test/instance2_for_in2: MissingCompileTimeError
 void_type_usage_test/instance2_literal_list_init: MissingCompileTimeError
 void_type_usage_test/instance2_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/instance2_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/instance2_return: MissingCompileTimeError
 void_type_usage_test/instance2_void_init: MissingCompileTimeError
 void_type_usage_test/instance3_conditional: MissingCompileTimeError
-void_type_usage_test/instance3_for_in2: MissingCompileTimeError
 void_type_usage_test/instance3_literal_list_init: MissingCompileTimeError
 void_type_usage_test/instance3_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/instance3_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/instance3_return: MissingCompileTimeError
 void_type_usage_test/instance3_void_init: MissingCompileTimeError
 void_type_usage_test/instance_conditional: MissingCompileTimeError
 void_type_usage_test/instance_literal_list_init: MissingCompileTimeError
 void_type_usage_test/instance_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/instance_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/instance_return: MissingCompileTimeError
 void_type_usage_test/instance_void_init: MissingCompileTimeError
 void_type_usage_test/local_conditional: MissingCompileTimeError
 void_type_usage_test/local_literal_list_init: MissingCompileTimeError
 void_type_usage_test/local_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/local_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/local_return: MissingCompileTimeError
 void_type_usage_test/local_void_init: MissingCompileTimeError
 void_type_usage_test/param_conditional: MissingCompileTimeError
 void_type_usage_test/param_literal_list_init: MissingCompileTimeError
 void_type_usage_test/param_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/param_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/param_return: MissingCompileTimeError
 void_type_usage_test/param_void_init: MissingCompileTimeError
 void_type_usage_test/paren_conditional: MissingCompileTimeError
 void_type_usage_test/paren_literal_list_init: MissingCompileTimeError
 void_type_usage_test/paren_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/paren_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/paren_return: MissingCompileTimeError
 void_type_usage_test/paren_void_init: MissingCompileTimeError
 web_int_literals_test/01: MissingCompileTimeError
 web_int_literals_test/02: MissingCompileTimeError
@@ -399,10 +403,6 @@
 override_inheritance_field_test/26: CompileTimeError
 override_inheritance_field_test/29: CompileTimeError
 override_inheritance_field_test/42: CompileTimeError
-override_inheritance_field_test/43: CompileTimeError
-override_inheritance_field_test/45: CompileTimeError
-override_inheritance_field_test/49: CompileTimeError
-override_inheritance_field_test/50: CompileTimeError
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 4a641cd..329ec9c 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -48,9 +48,6 @@
 field_type_check2_test/01: MissingRuntimeError
 round_test: Pass, Fail, OK # Fixed in ff 35. Common JavaScript engine Math.round bug.
 
-[ $compiler == dart2js && $runtime == ff && $strong ]
-call_function_test: RuntimeError
-
 [ $compiler == dart2js && $runtime == jsshell ]
 async_call_test: RuntimeError # Timer interface not supported: Issue 7728.
 async_star_await_pauses_test: RuntimeError # Need triage
@@ -149,6 +146,7 @@
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $runtime == safari && $strong ]
+async_throw_in_catch_test/none: Pass, RuntimeError
 stacktrace_test: RuntimeError
 
 [ $compiler == dart2js && $system == windows ]
@@ -571,7 +569,6 @@
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
-check_member_static_test/01: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
 class_literal_static_test/03: MissingCompileTimeError
 class_literal_static_test/07: MissingCompileTimeError
@@ -592,10 +589,7 @@
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_unused_parameter_test: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 identical_const_test/01: MissingCompileTimeError
@@ -604,8 +598,6 @@
 identical_const_test/04: MissingCompileTimeError
 issue18628_2_test/01: MissingCompileTimeError
 issue23244_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-issue31596_override_test/07: MissingCompileTimeError
-issue31596_override_test/08: MissingCompileTimeError
 library_env_test/has_no_html_support: RuntimeError
 library_env_test/has_no_io_support: RuntimeError
 malbounded_instantiation_test/01: MissingCompileTimeError
@@ -657,11 +649,6 @@
 named_constructor_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
-override_inheritance_field_test/44: MissingCompileTimeError
-override_inheritance_field_test/47: MissingCompileTimeError
-override_inheritance_field_test/48: MissingCompileTimeError
-override_inheritance_field_test/53: MissingCompileTimeError
-override_inheritance_field_test/54: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 partial_tearoff_instantiation_test/06: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 partial_tearoff_instantiation_test/07: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
@@ -670,7 +657,6 @@
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
-setter4_test: MissingCompileTimeError
 sync_generator2_test/41: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 sync_generator2_test/52: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 type_literal_prefix_call_test/00: MissingCompileTimeError
@@ -774,7 +760,6 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: RuntimeError
-check_member_static_test/01: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
 class_literal_static_test/03: MissingCompileTimeError
 class_literal_static_test/07: MissingCompileTimeError
@@ -794,10 +779,7 @@
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
@@ -807,8 +789,6 @@
 invocation_mirror_test: RuntimeError
 issue18628_2_test/01: MissingCompileTimeError
 issue23244_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-issue31596_override_test/07: MissingCompileTimeError
-issue31596_override_test/08: MissingCompileTimeError
 library_env_test/has_no_html_support: RuntimeError
 library_env_test/has_no_io_support: RuntimeError
 malbounded_instantiation_test/01: MissingCompileTimeError
@@ -866,18 +846,12 @@
 overridden_no_such_method_test: RuntimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
-override_inheritance_field_test/44: MissingCompileTimeError
-override_inheritance_field_test/47: MissingCompileTimeError
-override_inheritance_field_test/48: MissingCompileTimeError
-override_inheritance_field_test/53: MissingCompileTimeError
-override_inheritance_field_test/54: MissingCompileTimeError
 recursive_generic_test: RuntimeError
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
 regress_21795_test: RuntimeError # Issue 12605
-setter4_test: MissingCompileTimeError
 stack_trace_test: RuntimeError, OK # Stack trace not preserved in minified code.
 symbol_conflict_test: RuntimeError # Issue 23857
 type_literal_prefix_call_test/00: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 015334b..1285c54 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -28,6 +28,7 @@
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 28816
 cascaded_forwarding_stubs_generic_test: RuntimeError
 cascaded_forwarding_stubs_test: CompileTimeError
+check_member_static_test/01: CompileTimeError
 conflicting_generic_interfaces_hierarchy_loop_infinite_test: Skip # Crashes or times out
 conflicting_generic_interfaces_simple_test: MissingCompileTimeError
 conflicting_type_variable_and_setter_test: CompileTimeError
@@ -133,10 +134,6 @@
 override_inheritance_field_test/26: CompileTimeError
 override_inheritance_field_test/29: CompileTimeError
 override_inheritance_field_test/42: CompileTimeError
-override_inheritance_field_test/43: CompileTimeError
-override_inheritance_field_test/45: CompileTimeError
-override_inheritance_field_test/49: CompileTimeError
-override_inheritance_field_test/50: CompileTimeError
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
@@ -149,10 +146,22 @@
 regress_29025_test: CompileTimeError # Issue 29081
 regress_29349_test: CompileTimeError # Issue 31093
 regress_29405_test: CompileTimeError # Issue 29421
-regress_29784_test/02: Crash # assert initializers not implemented
 regress_29784_test/02: MissingCompileTimeError
+regress_29784_test/02: Crash # assert initializers not implemented
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError # As expected. Should we make this a multi test?
+regress_33235_03_test/01: MissingCompileTimeError
+regress_33235_07_test/03: MissingCompileTimeError
+regress_33235_10_test/01: MissingCompileTimeError
+regress_33235_10_test/02: MissingCompileTimeError
+regress_33235_10_test/03: MissingCompileTimeError
+regress_33235_11_test/01: MissingCompileTimeError
+regress_33235_12_test/03: MissingCompileTimeError
+regress_33235_13_test/03: MissingCompileTimeError
+regress_33235_16_test/02: MissingCompileTimeError
+regress_33235_16_test/03: MissingCompileTimeError
+regress_33235_19_test: CompileTimeError
+regress_33235_20_test: CompileTimeError
 setter_override2_test/02: MissingCompileTimeError # Issue 14736
 stacktrace_test: RuntimeError # Issue 29920
 static_setter_conflicts_test/02: MissingCompileTimeError
@@ -192,16 +201,12 @@
 void_type_callbacks_test/00: MissingCompileTimeError # Issue 30514
 void_type_callbacks_test/01: MissingCompileTimeError
 void_type_function_types_test/none: CompileTimeError # Issue 30514
-void_type_override_test/00: MissingCompileTimeError
-void_type_override_test/00b: MissingCompileTimeError
-void_type_override_test/01: MissingCompileTimeError
 void_type_override_test/02: MissingCompileTimeError
 void_type_override_test/03: MissingCompileTimeError
 void_type_usage_test/call_conditional: MissingCompileTimeError
 void_type_usage_test/call_literal_list_init: MissingCompileTimeError
 void_type_usage_test/call_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/call_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/call_return: MissingCompileTimeError
 void_type_usage_test/call_void_init: MissingCompileTimeError
 void_type_usage_test/conditional2_conditional: MissingCompileTimeError
 void_type_usage_test/conditional2_for: MissingCompileTimeError
@@ -238,89 +243,51 @@
 void_type_usage_test/final_local_literal_list_init: MissingCompileTimeError
 void_type_usage_test/final_local_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/final_local_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/final_local_return: MissingCompileTimeError
 void_type_usage_test/final_local_void_init: MissingCompileTimeError
 void_type_usage_test/global_conditional: MissingCompileTimeError
 void_type_usage_test/global_literal_list_init: MissingCompileTimeError
 void_type_usage_test/global_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/global_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/global_return: MissingCompileTimeError
 void_type_usage_test/global_void_init: MissingCompileTimeError
 void_type_usage_test/instance2_conditional: MissingCompileTimeError
-void_type_usage_test/instance2_for_in2: MissingCompileTimeError
 void_type_usage_test/instance2_literal_list_init: MissingCompileTimeError
 void_type_usage_test/instance2_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/instance2_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/instance2_return: MissingCompileTimeError
 void_type_usage_test/instance2_void_init: MissingCompileTimeError
 void_type_usage_test/instance3_conditional: MissingCompileTimeError
-void_type_usage_test/instance3_for_in2: MissingCompileTimeError
 void_type_usage_test/instance3_literal_list_init: MissingCompileTimeError
 void_type_usage_test/instance3_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/instance3_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/instance3_return: MissingCompileTimeError
 void_type_usage_test/instance3_void_init: MissingCompileTimeError
 void_type_usage_test/instance_conditional: MissingCompileTimeError
 void_type_usage_test/instance_literal_list_init: MissingCompileTimeError
 void_type_usage_test/instance_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/instance_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/instance_return: MissingCompileTimeError
 void_type_usage_test/instance_void_init: MissingCompileTimeError
 void_type_usage_test/local_conditional: MissingCompileTimeError
 void_type_usage_test/local_literal_list_init: MissingCompileTimeError
 void_type_usage_test/local_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/local_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/local_return: MissingCompileTimeError
 void_type_usage_test/local_void_init: MissingCompileTimeError
 void_type_usage_test/param_conditional: MissingCompileTimeError
 void_type_usage_test/param_literal_list_init: MissingCompileTimeError
 void_type_usage_test/param_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/param_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/param_return: MissingCompileTimeError
 void_type_usage_test/param_void_init: MissingCompileTimeError
 void_type_usage_test/paren_conditional: MissingCompileTimeError
 void_type_usage_test/paren_literal_list_init: MissingCompileTimeError
 void_type_usage_test/paren_literal_map_key_init: MissingCompileTimeError
 void_type_usage_test/paren_literal_map_value_init: MissingCompileTimeError
-void_type_usage_test/paren_return: MissingCompileTimeError
 void_type_usage_test/paren_void_init: MissingCompileTimeError
-web_int_literals_test/01: MissingCompileTimeError
-web_int_literals_test/02: MissingCompileTimeError
-web_int_literals_test/03: MissingCompileTimeError
-web_int_literals_test/10: MissingCompileTimeError
-web_int_literals_test/11: MissingCompileTimeError
-web_int_literals_test/12: MissingCompileTimeError
-web_int_literals_test/13: MissingCompileTimeError
-web_int_literals_test/14: MissingCompileTimeError
-web_int_literals_test/20: MissingCompileTimeError
-web_int_literals_test/21: MissingCompileTimeError
-web_int_literals_test/22: MissingCompileTimeError
-web_int_literals_test/23: MissingCompileTimeError
-web_int_literals_test/24: MissingCompileTimeError
-web_int_literals_test/25: MissingCompileTimeError
-web_int_literals_test/26: MissingCompileTimeError
-web_int_literals_test/27: MissingCompileTimeError
-web_int_literals_test/28: MissingCompileTimeError
-web_int_literals_test/29: MissingCompileTimeError
-web_int_literals_test/61: MissingCompileTimeError
-web_int_literals_test/62: MissingCompileTimeError
-web_int_literals_test/63: MissingCompileTimeError
-web_int_literals_test/64: MissingCompileTimeError
-web_int_literals_test/65: MissingCompileTimeError
-web_int_literals_test/70: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
 async_return_types_test/wrongReturnType: MissingCompileTimeError
-bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -331,7 +298,6 @@
 call_method_must_not_be_getter_test/06: RuntimeError # Kernel does not distinguish `d()` from `d.call()`
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
-check_member_static_test/01: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_c_test/02: MissingCompileTimeError
@@ -376,8 +342,6 @@
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
-deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -391,21 +355,17 @@
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
 generic_function_bounds_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
+generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
-generic_methods_overriding_test/01: MissingCompileTimeError # Issue 29920
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
-guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -422,16 +382,12 @@
 implicit_creation/implicit_const_not_default_values_test/e6: Pass
 implicit_creation/implicit_const_not_default_values_test/e9: Pass
 instantiate_tearoff_of_call_test: CompileTimeError
-int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 issue18628_2_test/01: MissingCompileTimeError
-issue31596_override_test/07: MissingCompileTimeError
-issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/01: CompileTimeError
 issue31596_super_test/02: MissingCompileTimeError
 issue31596_super_test/03: CompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 malbounded_instantiation_test/01: MissingCompileTimeError
 malbounded_instantiation_test/02: MissingCompileTimeError
 malbounded_instantiation_test/03: MissingCompileTimeError
@@ -452,9 +408,6 @@
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
-mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-mint_identical_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
 mixin_forwarding_constructor4_test/03: MissingCompileTimeError
@@ -535,17 +488,11 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError
 no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
 null_no_such_method_test: CompileTimeError # Issue 31533
-number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 override_field_test/02: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
 override_inheritance_field_test/06: CompileTimeError # Issue 31616
 override_inheritance_field_test/26: CompileTimeError # Issue 31616
 override_inheritance_field_test/29: CompileTimeError # Issue 31616
-override_inheritance_field_test/44: MissingCompileTimeError
-override_inheritance_field_test/47: MissingCompileTimeError
-override_inheritance_field_test/48: MissingCompileTimeError
-override_inheritance_field_test/53: MissingCompileTimeError
-override_inheritance_field_test/54: MissingCompileTimeError
 override_inheritance_generic_test/02: CompileTimeError # Issue 31616
 override_inheritance_method_test/28: CompileTimeError # Issue 31616
 override_inheritance_method_test/29: CompileTimeError # Issue 31616
@@ -562,7 +509,6 @@
 regress_29784_test/02: MissingCompileTimeError
 regress_30339_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
 regress_30339_test: CompileTimeError
-setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
@@ -616,6 +562,7 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
+arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 async_covariant_type_test: RuntimeError # Check too late
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
 async_star_pause_test: RuntimeError # Uncaught Expect.listEquals(at index 2, expected: <0+>, actual: <0!>) fails
@@ -625,6 +572,9 @@
 bit_operations_test: RuntimeError # No bigints on web.; Expect.equals(expected: <-25>, actual: <4294967271>) fails.
 bit_operations_test/01: MissingCompileTimeError
 bit_operations_test/02: MissingCompileTimeError
+bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 branch_canonicalization_test: RuntimeError # Issue 29920; Expect.equals(expected: <0>, actual: <1>) fails.
 built_in_identifier_prefix_test: CompileTimeError
 canonical_const2_test: RuntimeError # Ints and doubles are unified.; Expect.isFalse(true) fails.
@@ -652,6 +602,8 @@
 deferred_not_loaded_check_test: RuntimeError # Issue 27777; Expect.throws fails: Did not throw
 deferred_redirecting_factory_test: RuntimeError # Issue 27777; Uncaught Expect.throws fails: Did not throw
 deferred_static_seperate_test: RuntimeError # Issue 27777; Expect.throws fails: Did not throw
+deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 double_int_to_string_test: RuntimeError # Issue 29920; Expect.equals(expected: <0.0>, actual: <0>) fails.
 double_to_string_as_fixed2_test/none: RuntimeError # Issue 29920; Expect.throws(ArgumentError) fails: Did not throw
 example_constructor_test: RuntimeError # Expect.equals(expected: <0 1 2 3 4 5 6 >, actual: <0 3 4 1 2 5 6 >) fails.
@@ -667,14 +619,16 @@
 flatten_test/12: MissingRuntimeError # Issue 29920
 for_variable_capture_test: RuntimeError # Issue 29920; Expect.equals(expected: <1>, actual: <0>) fails.
 function_subtype_inline2_test: RuntimeError # Expect.fail('Missing type error: 'new C.c1(m2)'.')
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
 generic_instanceof2_test: RuntimeError # Issue 29920; ReferenceError: FooOfK$String is not defined
 generic_is_check_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
 generic_tearoff_test: CompileTimeError
+guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_closure2_test: RuntimeError # Issue 29920; Expect.isFalse(true) fails.
 infinite_switch_label_test: RuntimeError # Issue 29920; NoSuchMethodError: method not found: '<Unexpected Null Value>'
 infinity_test: RuntimeError # Issue 29920; Expect.isFalse(true) fails.
 instance_creation_in_function_annotation_test: RuntimeError # Issue 29920; UnimplementedError: JsClosureMirror.function unimplemented
+int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 int64_literal_test/*: Skip # This is testing Dart 2.0 int64 semantics.
 integer_division_by_zero_test: RuntimeError # Issue 29920; Expect.throws: Unexpected 'Unsupported operation: Infinity'
 internal_library_test/02: Crash
@@ -687,10 +641,14 @@
 library_env_test/has_io_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
 library_env_test/has_mirror_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
 library_env_test/has_no_html_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 local_function2_test/none: RuntimeError # ReferenceError: TToNull is not defined
 local_function3_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
 local_function_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mint_arithmetic_test: RuntimeError # Issue 29920; Expect.equals(expected: <4294967297>, actual: <1>) fails.
+mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_identical_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 modulo_test: RuntimeError # Ints and doubles are unified.; Expect.throws fails: Did not throw
 multiline_newline_test/04: MissingCompileTimeError
 multiline_newline_test/04r: MissingCompileTimeError
@@ -701,6 +659,7 @@
 nested_switch_label_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 null_test/mirrors: RuntimeError # Uses mirrors.; ReferenceError: GenericOfT is not defined
 number_identity2_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
+number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 numbers_test: RuntimeError # Issue 29920; Expect.equals(expected: <false>, actual: <true>) fails.
 override_field_test/03: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 9bf1bcbc..cdaf95b 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -228,7 +228,6 @@
 async_return_types_test/wrongReturnType: MissingCompileTimeError # Issue 33068
 call_non_method_field_test/01: MissingCompileTimeError # Issue 32975
 call_non_method_field_test/02: MissingCompileTimeError # Issue 32975
-check_member_static_test/01: MissingCompileTimeError # Issue 32613
 const_cast2_test/01: CompileTimeError # Issue 32517
 const_cast2_test/none: CompileTimeError # Issue 32517
 const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field. Issue 32326.
@@ -254,13 +253,8 @@
 factory4_test/00: MissingCompileTimeError # Issue 32988
 field3_test/01: MissingCompileTimeError # Issue 33022
 field3_test/02: MissingCompileTimeError # Issue 33022
-field_override_test/00: MissingCompileTimeError # Issue 32613
-field_override_test/01: MissingCompileTimeError # Issue 32613
 generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33018
-generic_methods_overriding_test/01: MissingCompileTimeError # Issue 32613
 generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33018
-issue31596_override_test/07: MissingCompileTimeError
-issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/02: MissingCompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 malbounded_instantiation_test/01: MissingCompileTimeError # Issue 33018
@@ -315,11 +309,6 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
-override_inheritance_field_test/44: MissingCompileTimeError
-override_inheritance_field_test/47: MissingCompileTimeError
-override_inheritance_field_test/48: MissingCompileTimeError
-override_inheritance_field_test/53: MissingCompileTimeError
-override_inheritance_field_test/54: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: MissingCompileTimeError
 partial_tearoff_instantiation_test/06: MissingCompileTimeError
 partial_tearoff_instantiation_test/07: MissingCompileTimeError
@@ -330,7 +319,6 @@
 regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
-setter4_test: MissingCompileTimeError # Issue 14736
 switch_bad_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_bad_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -363,10 +351,6 @@
 void_type_function_types_test/04: MissingCompileTimeError # Issue 32804
 void_type_function_types_test/06: MissingCompileTimeError # Issue 32804
 void_type_function_types_test/08: MissingCompileTimeError # Issue 32804
-void_type_override_test/00: MissingCompileTimeError # Issue 32804
-void_type_override_test/00b: MissingCompileTimeError # Issue 32804
-void_type_override_test/00c: MissingCompileTimeError # Issue 32804
-void_type_override_test/01: MissingCompileTimeError # Issue 32804
 void_type_override_test/03: MissingCompileTimeError # Issue 32804
 void_type_usage_test/call_argument: MissingCompileTimeError # Issue 32804
 void_type_usage_test/call_cascade: MissingCompileTimeError # Issue 32804
@@ -476,7 +460,6 @@
 void_type_usage_test/instance2_do_while: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance2_dynamic_init: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance2_for_in: MissingCompileTimeError # Issue 32804
-void_type_usage_test/instance2_for_in2: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance2_is: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance2_literal_list_init: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance2_literal_map_key_init: MissingCompileTimeError # Issue 32804
@@ -496,7 +479,6 @@
 void_type_usage_test/instance3_do_while: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance3_dynamic_init: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance3_for_in: MissingCompileTimeError # Issue 32804
-void_type_usage_test/instance3_for_in2: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance3_is: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance3_literal_list_init: MissingCompileTimeError # Issue 32804
 void_type_usage_test/instance3_literal_map_key_init: MissingCompileTimeError # Issue 32804
@@ -663,15 +645,8 @@
 assert_initializer_test/47: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/48: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/none: RuntimeError # KernelVM bug: Constant evaluation.
-async_await_test/02: RuntimeError
-async_await_test/03: RuntimeError
-async_await_test/none: RuntimeError
 async_return_types_test/nestedFuture: Fail
 compile_time_constant_checked_test/02: MissingCompileTimeError
-covariance_type_parameter_test/01: RuntimeError
-covariance_type_parameter_test/02: RuntimeError
-covariance_type_parameter_test/03: RuntimeError
-covariance_type_parameter_test/none: RuntimeError
 default_factory2_test/01: Fail
 malbounded_redirecting_factory_test/03: Fail
 malbounded_redirecting_factory_test/04: Fail
@@ -682,15 +657,23 @@
 mixin_invalid_bound2_test/10: Fail
 mixin_invalid_bound_test/06: Fail
 mixin_invalid_bound_test/07: Fail
-recursive_inheritance_test: RuntimeError
 redirecting_factory_infinite_steps_test/01: Fail
 redirecting_factory_malbounded_test/01: Fail
-regress_22728_test: Fail # Dartk Issue 28498
-regress_22728_test: RuntimeError
 regress_30339_test: RuntimeError
 type_variable_bounds4_test/01: RuntimeError
 
 [ $compiler == dartk && $runtime == vm && !$checked && $strong ]
+assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc03: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc04: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc05: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc06: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc07: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc08: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
 conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
 type_error_test: RuntimeError # Issue 31402 (Variable declaration)
 
@@ -844,18 +827,22 @@
 [ $compiler == dartk && $system == windows && $strong ]
 ct_const2_test: Fail
 
+[ $compiler == dartk && $checked ]
+assertion_initializer_const_error2_test/cc01: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc02: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc03: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc04: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc05: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc06: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc07: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc08: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc09: Pass # Works in --checked mode but not in --strong mode.
+assertion_initializer_const_error2_test/cc10: Pass # Works in --checked mode but not in --strong mode.
+
+[ $compiler == dartk && $hot_reload_rollback ]
+symbol_conflict_test: Pass, Slow
+
 [ $compiler == dartk && $strong ]
-assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc03: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc04: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc05: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc06: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc07: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc08: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
 covariant_subtyping_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
 
@@ -1394,6 +1381,34 @@
 prefix_transitive_import_test/01: MissingCompileTimeError
 prefix_transitive_import_test/02: MissingCompileTimeError
 regress_23089_test: MissingCompileTimeError
+regress_33235_05_test/02: MissingCompileTimeError
+regress_33235_05_test/03: MissingCompileTimeError
+regress_33235_06_test/02: MissingCompileTimeError
+regress_33235_06_test/03: MissingCompileTimeError
+regress_33235_07_test/01: MissingCompileTimeError
+regress_33235_07_test/02: MissingCompileTimeError
+regress_33235_07_test/03: MissingCompileTimeError
+regress_33235_08_test/02: MissingCompileTimeError
+regress_33235_08_test/03: MissingCompileTimeError
+regress_33235_09_test/02: MissingCompileTimeError
+regress_33235_09_test/03: MissingCompileTimeError
+regress_33235_10_test/01: MissingCompileTimeError
+regress_33235_10_test/02: MissingCompileTimeError
+regress_33235_10_test/03: MissingCompileTimeError
+regress_33235_12_test/01: MissingCompileTimeError
+regress_33235_12_test/02: MissingCompileTimeError
+regress_33235_12_test/03: MissingCompileTimeError
+regress_33235_13_test/01: MissingCompileTimeError
+regress_33235_13_test/02: MissingCompileTimeError
+regress_33235_13_test/03: MissingCompileTimeError
+regress_33235_14_test/02: MissingCompileTimeError
+regress_33235_14_test/03: MissingCompileTimeError
+regress_33235_15_test/02: MissingCompileTimeError
+regress_33235_15_test/03: MissingCompileTimeError
+regress_33235_16_test/01: MissingCompileTimeError
+regress_33235_16_test/02: MissingCompileTimeError
+regress_33235_16_test/03: MissingCompileTimeError
+setter4_test: MissingCompileTimeError
 setter_override2_test/02: MissingCompileTimeError
 super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
 super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
diff --git a/tests/language_2/override_inheritance_field_test.dart b/tests/language_2/override_inheritance_field_test.dart
index d2c6872..bd04da0 100644
--- a/tests/language_2/override_inheritance_field_test.dart
+++ b/tests/language_2/override_inheritance_field_test.dart
@@ -28,18 +28,19 @@
 
   @virtual int field1; //# 41: ok
   num field2; //# 42: ok
-  int field3; //# 43: ok
+  int field3; //# 43: compile-time error
   int field4; //# 44: compile-time error
-  int field5; //# 45: ok
+  int field5; //# 45: compile-time error
   @virtual num field6; //# 46: ok
   num field7; //# 47: compile-time error
   num get field8 => null; //# 48: compile-time error
-  num field9; //# 49: ok
-  num field10; //# 50: ok
+  num field9; //# 49: compile-time error
+  num field10; //# 50: compile-time error
   set field11(int _) {} //# 51: ok
   void set field12(int _) {} //# 52: ok
   num field13; //# 53: compile-time error
   set field14(num _) {} //# 54: compile-time error
+  num field15; //# 55: ok
 }
 
 class B extends A {
@@ -110,6 +111,7 @@
   num field12; //# 52: continued
   set field13(String _) {} //# 53: continued
   String field14; //# 54: continued
+  set field15(covariant int _) {} //# 55: continued
 }
 
 class SubClass extends Class {
diff --git a/tests/language_2/override_inheritance_method2_test.dart b/tests/language_2/override_inheritance_method2_test.dart
new file mode 100644
index 0000000..e22571f
--- /dev/null
+++ b/tests/language_2/override_inheritance_method2_test.dart
@@ -0,0 +1,1112 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new C();
+}
+
+class A {
+  method1(covariant dynamic a) => null; //# 001: ok
+  method2(covariant dynamic a) => null; //# 002: ok
+  method3(covariant dynamic a) => null; //# 003: ok
+  method4(covariant dynamic a) => null; //# 004: ok
+  method5(covariant dynamic a) => null; //# 005: ok
+  method6(covariant dynamic a) => null; //# 006: ok
+  method7(covariant dynamic a) => null; //# 007: ok
+  method8(covariant dynamic a) => null; //# 008: ok
+  method9(covariant dynamic a) => null; //# 009: ok
+  method10(covariant dynamic a) => null; //# 010: ok
+  method11(covariant dynamic a) => null; //# 011: ok
+  method12(covariant dynamic a) => null; //# 012: compile-time error
+  method13(covariant dynamic a) => null; //# 013: ok
+  method14(covariant dynamic a) => null; //# 014: ok
+  method15(covariant dynamic a) => null; //# 015: ok
+  method16(covariant dynamic a) => null; //# 016: compile-time error
+  method17(covariant dynamic a) => null; //# 017: ok
+  method18(covariant dynamic a) => null; //# 018: ok
+  method19(covariant dynamic a) => null; //# 019: ok
+  method20(covariant dynamic a) => null; //# 020: compile-time error
+  method21(covariant dynamic a) => null; //# 021: ok
+  method22(covariant dynamic a) => null; //# 022: ok
+  method23(covariant dynamic a) => null; //# 023: ok
+  method24(covariant dynamic a) => null; //# 024: compile-time error
+  method25(covariant dynamic a) => null; //# 025: ok
+  method26(covariant dynamic a) => null; //# 026: compile-time error
+  method27(covariant dynamic a) => null; //# 027: compile-time error
+  method28(covariant dynamic a) => null; //# 028: ok
+  method29(covariant dynamic a) => null; //# 029: ok
+  method30(covariant dynamic a) => null; //# 030: compile-time error
+  method31(covariant dynamic a) => null; //# 031: compile-time error
+  method32(covariant dynamic a) => null; //# 032: ok
+  method33(covariant dynamic a) => null; //# 033: ok
+  method34(covariant dynamic a) => null; //# 034: ok
+  method35(covariant dynamic a) => null; //# 035: ok
+  method36(covariant dynamic a) => null; //# 036: ok
+  method37(covariant dynamic a) => null; //# 037: ok
+  method38(covariant dynamic a) => null; //# 038: ok
+  method39(covariant dynamic a) => null; //# 039: ok
+  method40(covariant dynamic a) => null; //# 040: ok
+  method41(covariant dynamic a) => null; //# 041: ok
+  method42(covariant dynamic a) => null; //# 042: ok
+  method43(covariant dynamic a) => null; //# 043: ok
+  method44(covariant dynamic a) => null; //# 044: compile-time error
+  method45(covariant dynamic a) => null; //# 045: ok
+  method46(covariant dynamic a) => null; //# 046: ok
+  method47(covariant dynamic a) => null; //# 047: ok
+  method48(covariant dynamic a) => null; //# 048: compile-time error
+  method49(covariant dynamic a) => null; //# 049: ok
+  method50(covariant dynamic a) => null; //# 050: ok
+  method51(covariant dynamic a) => null; //# 051: ok
+  method52(covariant dynamic a) => null; //# 052: compile-time error
+  method53(covariant dynamic a) => null; //# 053: ok
+  method54(covariant dynamic a) => null; //# 054: ok
+  method55(covariant dynamic a) => null; //# 055: ok
+  method56(covariant dynamic a) => null; //# 056: compile-time error
+  method57(covariant dynamic a) => null; //# 057: ok
+  method58(covariant dynamic a) => null; //# 058: compile-time error
+  method59(covariant dynamic a) => null; //# 059: compile-time error
+  method60(covariant dynamic a) => null; //# 060: ok
+  method61(covariant dynamic a) => null; //# 061: ok
+  method62(covariant dynamic a) => null; //# 062: compile-time error
+  method63(covariant dynamic a) => null; //# 063: compile-time error
+  method64(covariant dynamic a) => null; //# 064: ok
+  method65(covariant num a) => null; //# 065: ok
+  method66(covariant num a) => null; //# 066: ok
+  method67(covariant num a) => null; //# 067: ok
+  method68(covariant num a) => null; //# 068: compile-time error
+  method69(covariant num a) => null; //# 069: ok
+  method70(covariant num a) => null; //# 070: ok
+  method71(covariant num a) => null; //# 071: ok
+  method72(covariant num a) => null; //# 072: compile-time error
+  method73(covariant num a) => null; //# 073: ok
+  method74(covariant num a) => null; //# 074: ok
+  method75(covariant num a) => null; //# 075: ok
+  method76(covariant num a) => null; //# 076: compile-time error
+  method77(covariant num a) => null; //# 077: ok
+  method78(covariant num a) => null; //# 078: ok
+  method79(covariant num a) => null; //# 079: ok
+  method80(covariant num a) => null; //# 080: compile-time error
+  method81(covariant num a) => null; //# 081: ok
+  method82(covariant num a) => null; //# 082: ok
+  method83(covariant num a) => null; //# 083: ok
+  method84(covariant num a) => null; //# 084: compile-time error
+  method85(covariant num a) => null; //# 085: ok
+  method86(covariant num a) => null; //# 086: ok
+  method87(covariant num a) => null; //# 087: ok
+  method88(covariant num a) => null; //# 088: compile-time error
+  method89(covariant num a) => null; //# 089: compile-time error
+  method90(covariant num a) => null; //# 090: ok
+  method91(covariant num a) => null; //# 091: ok
+  method92(covariant num a) => null; //# 092: ok
+  method93(covariant num a) => null; //# 093: compile-time error
+  method94(covariant num a) => null; //# 094: ok
+  method95(covariant num a) => null; //# 095: ok
+  method96(covariant num a) => null; //# 096: ok
+  method97(covariant num a) => null; //# 097: compile-time error
+  method98(covariant num a) => null; //# 098: ok
+  method99(covariant num a) => null; //# 099: ok
+  method100(covariant num a) => null; //# 100: ok
+  method101(covariant num a) => null; //# 101: compile-time error
+  method102(covariant num a) => null; //# 102: ok
+  method103(covariant num a) => null; //# 103: ok
+  method104(covariant num a) => null; //# 104: ok
+  method105(covariant num a) => null; //# 105: compile-time error
+  method106(covariant num a) => null; //# 106: ok
+  method107(covariant num a) => null; //# 107: ok
+  method108(covariant num a) => null; //# 108: ok
+  method109(covariant num a) => null; //# 109: compile-time error
+  method110(covariant num a) => null; //# 110: ok
+  method111(covariant num a) => null; //# 111: ok
+  method112(covariant num a) => null; //# 112: ok
+  method113(covariant num a) => null; //# 113: compile-time error
+  method114(covariant num a) => null; //# 114: compile-time error
+  method115(covariant int a) => null; //# 115: ok
+  method116(covariant int a) => null; //# 116: ok
+  method117(covariant int a) => null; //# 117: ok
+  method118(covariant int a) => null; //# 118: compile-time error
+  method119(covariant int a) => null; //# 119: ok
+  method120(covariant int a) => null; //# 120: ok
+  method121(covariant int a) => null; //# 121: ok
+  method122(covariant int a) => null; //# 122: compile-time error
+  method123(covariant int a) => null; //# 123: ok
+  method124(covariant int a) => null; //# 124: ok
+  method125(covariant int a) => null; //# 125: ok
+  method126(covariant int a) => null; //# 126: compile-time error
+  method127(covariant int a) => null; //# 127: ok
+  method128(covariant int a) => null; //# 128: ok
+  method129(covariant int a) => null; //# 129: ok
+  method130(covariant int a) => null; //# 130: compile-time error
+  method131(covariant int a) => null; //# 131: ok
+  method132(covariant int a) => null; //# 132: ok
+  method133(covariant int a) => null; //# 133: ok
+  method134(covariant int a) => null; //# 134: compile-time error
+  method135(covariant int a) => null; //# 135: ok
+  method136(covariant int a) => null; //# 136: ok
+  method137(covariant int a) => null; //# 137: ok
+  method138(covariant int a) => null; //# 138: compile-time error
+  method139(covariant int a) => null; //# 139: compile-time error
+  method140(covariant int a) => null; //# 140: ok
+  method141(covariant int a) => null; //# 141: ok
+  method142(covariant int a) => null; //# 142: ok
+  method143(covariant int a) => null; //# 143: compile-time error
+  method144(covariant int a) => null; //# 144: ok
+  method145(covariant int a) => null; //# 145: ok
+  method146(covariant int a) => null; //# 146: ok
+  method147(covariant int a) => null; //# 147: compile-time error
+  method148(covariant int a) => null; //# 148: ok
+  method149(covariant int a) => null; //# 149: ok
+  method150(covariant int a) => null; //# 150: ok
+  method151(covariant int a) => null; //# 151: compile-time error
+  method152(covariant int a) => null; //# 152: ok
+  method153(covariant int a) => null; //# 153: ok
+  method154(covariant int a) => null; //# 154: ok
+  method155(covariant int a) => null; //# 155: compile-time error
+  method156(covariant int a) => null; //# 156: ok
+  method157(covariant int a) => null; //# 157: ok
+  method158(covariant int a) => null; //# 158: ok
+  method159(covariant int a) => null; //# 159: compile-time error
+  method160(covariant int a) => null; //# 160: ok
+  method161(covariant int a) => null; //# 161: ok
+  method162(covariant int a) => null; //# 162: ok
+  method163(covariant int a) => null; //# 163: compile-time error
+  method164(covariant int a) => null; //# 164: compile-time error
+  method165(covariant String a) => null; //# 165: ok
+  method166(covariant String a) => null; //# 166: compile-time error
+  method167(covariant String a) => null; //# 167: compile-time error
+  method168(covariant String a) => null; //# 168: ok
+  method169(covariant String a) => null; //# 169: ok
+  method170(covariant String a) => null; //# 170: compile-time error
+  method171(covariant String a) => null; //# 171: compile-time error
+  method172(covariant String a) => null; //# 172: ok
+  method173(covariant String a) => null; //# 173: compile-time error
+  method174(covariant String a) => null; //# 174: compile-time error
+  method175(covariant String a) => null; //# 175: ok
+  method176(covariant String a) => null; //# 176: compile-time error
+  method177(covariant String a) => null; //# 177: compile-time error
+  method178(covariant String a) => null; //# 178: ok
+  method179(covariant String a) => null; //# 179: ok
+  method180(covariant String a) => null; //# 180: compile-time error
+  method181(covariant String a) => null; //# 181: compile-time error
+  method182(covariant String a) => null; //# 182: ok
+  method183(covariant String a) => null; //# 183: ok
+  method184(covariant String a) => null; //# 184: compile-time error
+  method185(covariant String a) => null; //# 185: compile-time error
+  method186(covariant String a) => null; //# 186: ok
+  method187(covariant String a) => null; //# 187: ok
+  method188(covariant String a) => null; //# 188: compile-time error
+  method189(covariant String a) => null; //# 189: compile-time error
+  method190(covariant String a) => null; //# 190: ok
+  method191(covariant String a) => null; //# 191: compile-time error
+  method192(covariant String a) => null; //# 192: compile-time error
+  method193(covariant String a) => null; //# 193: ok
+  method194(covariant String a) => null; //# 194: compile-time error
+  method195(covariant String a) => null; //# 195: compile-time error
+  method196(covariant String a) => null; //# 196: ok
+  method197(covariant String a) => null; //# 197: ok
+  method198(covariant String a) => null; //# 198: compile-time error
+  method199(covariant String a) => null; //# 199: compile-time error
+  method200(covariant String a) => null; //# 200: ok
+  method201(dynamic a) => null; //# 201: ok
+  method202(dynamic a) => null; //# 202: ok
+  method203(dynamic a) => null; //# 203: ok
+  method204(dynamic a) => null; //# 204: ok
+  method205(dynamic a) => null; //# 205: ok
+  method206(dynamic a) => null; //# 206: ok
+  method207(dynamic a) => null; //# 207: ok
+  method208(dynamic a) => null; //# 208: ok
+  method209(dynamic a) => null; //# 209: ok
+  method210(dynamic a) => null; //# 210: ok
+  method211(dynamic a) => null; //# 211: ok
+  method212(dynamic a) => null; //# 212: compile-time error
+  method213(dynamic a) => null; //# 213: ok
+  method214(dynamic a) => null; //# 214: ok
+  method215(dynamic a) => null; //# 215: ok
+  method216(dynamic a) => null; //# 216: compile-time error
+  method217(dynamic a) => null; //# 217: ok
+  method218(dynamic a) => null; //# 218: ok
+  method219(dynamic a) => null; //# 219: ok
+  method220(dynamic a) => null; //# 220: compile-time error
+  method221(dynamic a) => null; //# 221: ok
+  method222(dynamic a) => null; //# 222: ok
+  method223(dynamic a) => null; //# 223: ok
+  method224(dynamic a) => null; //# 224: compile-time error
+  method225(dynamic a) => null; //# 225: ok
+  method226(dynamic a) => null; //# 226: compile-time error
+  method227(dynamic a) => null; //# 227: compile-time error
+  method228(dynamic a) => null; //# 228: ok
+  method229(dynamic a) => null; //# 229: ok
+  method230(dynamic a) => null; //# 230: compile-time error
+  method231(dynamic a) => null; //# 231: compile-time error
+  method232(dynamic a) => null; //# 232: ok
+  method233(dynamic a) => null; //# 233: ok
+  method234(dynamic a) => null; //# 234: ok
+  method235(dynamic a) => null; //# 235: ok
+  method236(dynamic a) => null; //# 236: ok
+  method237(dynamic a) => null; //# 237: ok
+  method238(dynamic a) => null; //# 238: compile-time error
+  method239(dynamic a) => null; //# 239: compile-time error
+  method240(dynamic a) => null; //# 240: compile-time error
+  method241(dynamic a) => null; //# 241: compile-time error
+  method242(dynamic a) => null; //# 242: compile-time error
+  method243(dynamic a) => null; //# 243: compile-time error
+  method244(num a) => null; //# 244: ok
+  method245(num a) => null; //# 245: ok
+  method246(num a) => null; //# 246: ok
+  method247(num a) => null; //# 247: compile-time error
+  method248(num a) => null; //# 248: ok
+  method249(num a) => null; //# 249: ok
+  method250(num a) => null; //# 250: ok
+  method251(num a) => null; //# 251: compile-time error
+  method252(num a) => null; //# 252: ok
+  method253(num a) => null; //# 253: ok
+  method254(num a) => null; //# 254: ok
+  method255(num a) => null; //# 255: compile-time error
+  method256(num a) => null; //# 256: ok
+  method257(num a) => null; //# 257: ok
+  method258(num a) => null; //# 258: ok
+  method259(num a) => null; //# 259: compile-time error
+  method260(num a) => null; //# 260: ok
+  method261(num a) => null; //# 261: ok
+  method262(num a) => null; //# 262: ok
+  method263(num a) => null; //# 263: compile-time error
+  method264(num a) => null; //# 264: ok
+  method265(num a) => null; //# 265: ok
+  method266(num a) => null; //# 266: ok
+  method267(num a) => null; //# 267: compile-time error
+  method268(num a) => null; //# 268: compile-time error
+  method269(num a) => null; //# 269: ok
+  method270(num a) => null; //# 270: ok
+  method271(num a) => null; //# 271: ok
+  method272(num a) => null; //# 272: compile-time error
+  method273(num a) => null; //# 273: ok
+  method274(num a) => null; //# 274: compile-time error
+  method275(num a) => null; //# 275: compile-time error
+  method276(num a) => null; //# 276: compile-time error
+  method277(num a) => null; //# 277: ok
+  method278(num a) => null; //# 278: ok
+  method279(num a) => null; //# 279: ok
+  method280(num a) => null; //# 280: compile-time error
+  method281(num a) => null; //# 281: ok
+  method282(num a) => null; //# 282: ok
+  method283(num a) => null; //# 283: compile-time error
+  method284(num a) => null; //# 284: compile-time error
+  method285(num a) => null; //# 285: compile-time error
+  method286(num a) => null; //# 286: compile-time error
+  method287(int a) => null; //# 287: ok
+  method288(int a) => null; //# 288: ok
+  method289(int a) => null; //# 289: ok
+  method290(int a) => null; //# 290: compile-time error
+  method291(int a) => null; //# 291: ok
+  method292(int a) => null; //# 292: ok
+  method293(int a) => null; //# 293: ok
+  method294(int a) => null; //# 294: compile-time error
+  method295(int a) => null; //# 295: ok
+  method296(int a) => null; //# 296: ok
+  method297(int a) => null; //# 297: ok
+  method298(int a) => null; //# 298: compile-time error
+  method299(int a) => null; //# 299: ok
+  method300(int a) => null; //# 300: ok
+  method301(int a) => null; //# 301: ok
+  method302(int a) => null; //# 302: compile-time error
+  method303(int a) => null; //# 303: ok
+  method304(int a) => null; //# 304: ok
+  method305(int a) => null; //# 305: ok
+  method306(int a) => null; //# 306: compile-time error
+  method307(int a) => null; //# 307: ok
+  method308(int a) => null; //# 308: ok
+  method309(int a) => null; //# 309: ok
+  method310(int a) => null; //# 310: compile-time error
+  method311(int a) => null; //# 311: compile-time error
+  method312(int a) => null; //# 312: ok
+  method313(int a) => null; //# 313: ok
+  method314(int a) => null; //# 314: ok
+  method315(int a) => null; //# 315: compile-time error
+  method316(int a) => null; //# 316: ok
+  method317(int a) => null; //# 317: compile-time error
+  method318(int a) => null; //# 318: compile-time error
+  method319(int a) => null; //# 319: compile-time error
+  method320(int a) => null; //# 320: ok
+  method321(int a) => null; //# 321: ok
+  method322(int a) => null; //# 322: ok
+  method323(int a) => null; //# 323: compile-time error
+  method324(int a) => null; //# 324: ok
+  method325(int a) => null; //# 325: ok
+  method326(int a) => null; //# 326: compile-time error
+  method327(int a) => null; //# 327: compile-time error
+  method328(int a) => null; //# 328: ok
+  method329(int a) => null; //# 329: ok
+  method330(int a) => null; //# 330: ok
+  method331(int a) => null; //# 331: compile-time error
+  method332(int a) => null; //# 332: ok
+  method333(int a) => null; //# 333: ok
+  method334(int a) => null; //# 334: ok
+  method335(int a) => null; //# 335: compile-time error
+  method336(int a) => null; //# 336: compile-time error
+  method337(String a) => null; //# 337: ok
+  method338(String a) => null; //# 338: compile-time error
+  method339(String a) => null; //# 339: compile-time error
+  method340(String a) => null; //# 340: ok
+  method341(String a) => null; //# 341: ok
+  method342(String a) => null; //# 342: compile-time error
+  method343(String a) => null; //# 343: compile-time error
+  method344(String a) => null; //# 344: ok
+  method345(String a) => null; //# 345: compile-time error
+  method346(String a) => null; //# 346: compile-time error
+  method347(String a) => null; //# 347: ok
+  method348(String a) => null; //# 348: compile-time error
+  method349(String a) => null; //# 349: compile-time error
+  method350(String a) => null; //# 350: ok
+  method351(String a) => null; //# 351: ok
+  method352(String a) => null; //# 352: compile-time error
+  method353(String a) => null; //# 353: compile-time error
+  method354(String a) => null; //# 354: ok
+  method355(String a) => null; //# 355: ok
+  method356(String a) => null; //# 356: compile-time error
+  method357(String a) => null; //# 357: compile-time error
+  method358(String a) => null; //# 358: ok
+  method359(String a) => null; //# 359: ok
+  method360(String a) => null; //# 360: compile-time error
+  method361(String a) => null; //# 361: compile-time error
+  method362(String a) => null; //# 362: compile-time error
+  method363(String a) => null; //# 363: compile-time error
+  method364(String a) => null; //# 364: compile-time error
+  method365(String a) => null; //# 365: ok
+  method366(String a) => null; //# 366: compile-time error
+  method367(String a) => null; //# 367: compile-time error
+  method368(String a) => null; //# 368: ok
+  method369(String a) => null; //# 369: ok
+  method370(String a) => null; //# 370: compile-time error
+  method371(String a) => null; //# 371: compile-time error
+  method372(String a) => null; //# 372: ok
+}
+
+class B extends A {
+  method1(covariant dynamic a) => null; //# 001: continued
+  method2(covariant dynamic a) => null; //# 002: continued
+  method3(covariant dynamic a) => null; //# 003: continued
+  method4(covariant dynamic a) => null; //# 004: continued
+  method5(covariant dynamic a) => null; //# 005: continued
+  method6(covariant dynamic a) => null; //# 006: continued
+  method7(covariant dynamic a) => null; //# 007: continued
+  method8(covariant dynamic a) => null; //# 008: continued
+  method9(covariant num a) => null; //# 009: continued
+  method10(covariant num a) => null; //# 010: continued
+  method11(covariant num a) => null; //# 011: continued
+  method12(covariant num a) => null; //# 012: continued
+  method13(covariant num a) => null; //# 013: continued
+  method14(covariant num a) => null; //# 014: continued
+  method15(covariant num a) => null; //# 015: continued
+  method16(covariant num a) => null; //# 016: continued
+  method17(covariant int a) => null; //# 017: continued
+  method18(covariant int a) => null; //# 018: continued
+  method19(covariant int a) => null; //# 019: continued
+  method20(covariant int a) => null; //# 020: continued
+  method21(covariant int a) => null; //# 021: continued
+  method22(covariant int a) => null; //# 022: continued
+  method23(covariant int a) => null; //# 023: continued
+  method24(covariant int a) => null; //# 024: continued
+  method25(covariant String a) => null; //# 025: continued
+  method26(covariant String a) => null; //# 026: continued
+  method27(covariant String a) => null; //# 027: continued
+  method28(covariant String a) => null; //# 028: continued
+  method29(covariant String a) => null; //# 029: continued
+  method30(covariant String a) => null; //# 030: continued
+  method31(covariant String a) => null; //# 031: continued
+  method32(covariant String a) => null; //# 032: continued
+  method33(dynamic a) => null; //# 033: continued
+  method34(dynamic a) => null; //# 034: continued
+  method35(dynamic a) => null; //# 035: continued
+  method36(dynamic a) => null; //# 036: continued
+  method37(dynamic a) => null; //# 037: continued
+  method38(dynamic a) => null; //# 038: continued
+  method39(dynamic a) => null; //# 039: continued
+  method40(dynamic a) => null; //# 040: continued
+  method41(num a) => null; //# 041: continued
+  method42(num a) => null; //# 042: continued
+  method43(num a) => null; //# 043: continued
+  method44(num a) => null; //# 044: continued
+  method45(num a) => null; //# 045: continued
+  method46(num a) => null; //# 046: continued
+  method47(num a) => null; //# 047: continued
+  method48(num a) => null; //# 048: continued
+  method49(int a) => null; //# 049: continued
+  method50(int a) => null; //# 050: continued
+  method51(int a) => null; //# 051: continued
+  method52(int a) => null; //# 052: continued
+  method53(int a) => null; //# 053: continued
+  method54(int a) => null; //# 054: continued
+  method55(int a) => null; //# 055: continued
+  method56(int a) => null; //# 056: continued
+  method57(String a) => null; //# 057: continued
+  method58(String a) => null; //# 058: continued
+  method59(String a) => null; //# 059: continued
+  method60(String a) => null; //# 060: continued
+  method61(String a) => null; //# 061: continued
+  method62(String a) => null; //# 062: continued
+  method63(String a) => null; //# 063: continued
+  method64(String a) => null; //# 064: continued
+  method65(covariant dynamic a) => null; //# 065: continued
+  method66(covariant dynamic a) => null; //# 066: continued
+  method67(covariant dynamic a) => null; //# 067: continued
+  method68(covariant dynamic a) => null; //# 068: continued
+  method69(covariant dynamic a) => null; //# 069: continued
+  method70(covariant dynamic a) => null; //# 070: continued
+  method71(covariant dynamic a) => null; //# 071: continued
+  method72(covariant dynamic a) => null; //# 072: continued
+  method73(covariant num a) => null; //# 073: continued
+  method74(covariant num a) => null; //# 074: continued
+  method75(covariant num a) => null; //# 075: continued
+  method76(covariant num a) => null; //# 076: continued
+  method77(covariant num a) => null; //# 077: continued
+  method78(covariant num a) => null; //# 078: continued
+  method79(covariant num a) => null; //# 079: continued
+  method80(covariant num a) => null; //# 080: continued
+  method81(covariant int a) => null; //# 081: continued
+  method82(covariant int a) => null; //# 082: continued
+  method83(covariant int a) => null; //# 083: continued
+  method84(covariant int a) => null; //# 084: continued
+  method85(covariant int a) => null; //# 085: continued
+  method86(covariant int a) => null; //# 086: continued
+  method87(covariant int a) => null; //# 087: continued
+  method88(covariant int a) => null; //# 088: continued
+  method89(covariant String a) => null; //# 089: continued
+  method90(dynamic a) => null; //# 090: continued
+  method91(dynamic a) => null; //# 091: continued
+  method92(dynamic a) => null; //# 092: continued
+  method93(dynamic a) => null; //# 093: continued
+  method94(dynamic a) => null; //# 094: continued
+  method95(dynamic a) => null; //# 095: continued
+  method96(dynamic a) => null; //# 096: continued
+  method97(dynamic a) => null; //# 097: continued
+  method98(num a) => null; //# 098: continued
+  method99(num a) => null; //# 099: continued
+  method100(num a) => null; //# 100: continued
+  method101(num a) => null; //# 101: continued
+  method102(num a) => null; //# 102: continued
+  method103(num a) => null; //# 103: continued
+  method104(num a) => null; //# 104: continued
+  method105(num a) => null; //# 105: continued
+  method106(int a) => null; //# 106: continued
+  method107(int a) => null; //# 107: continued
+  method108(int a) => null; //# 108: continued
+  method109(int a) => null; //# 109: continued
+  method110(int a) => null; //# 110: continued
+  method111(int a) => null; //# 111: continued
+  method112(int a) => null; //# 112: continued
+  method113(int a) => null; //# 113: continued
+  method114(String a) => null; //# 114: continued
+  method115(covariant dynamic a) => null; //# 115: continued
+  method116(covariant dynamic a) => null; //# 116: continued
+  method117(covariant dynamic a) => null; //# 117: continued
+  method118(covariant dynamic a) => null; //# 118: continued
+  method119(covariant dynamic a) => null; //# 119: continued
+  method120(covariant dynamic a) => null; //# 120: continued
+  method121(covariant dynamic a) => null; //# 121: continued
+  method122(covariant dynamic a) => null; //# 122: continued
+  method123(covariant num a) => null; //# 123: continued
+  method124(covariant num a) => null; //# 124: continued
+  method125(covariant num a) => null; //# 125: continued
+  method126(covariant num a) => null; //# 126: continued
+  method127(covariant num a) => null; //# 127: continued
+  method128(covariant num a) => null; //# 128: continued
+  method129(covariant num a) => null; //# 129: continued
+  method130(covariant num a) => null; //# 130: continued
+  method131(covariant int a) => null; //# 131: continued
+  method132(covariant int a) => null; //# 132: continued
+  method133(covariant int a) => null; //# 133: continued
+  method134(covariant int a) => null; //# 134: continued
+  method135(covariant int a) => null; //# 135: continued
+  method136(covariant int a) => null; //# 136: continued
+  method137(covariant int a) => null; //# 137: continued
+  method138(covariant int a) => null; //# 138: continued
+  method139(covariant String a) => null; //# 139: continued
+  method140(dynamic a) => null; //# 140: continued
+  method141(dynamic a) => null; //# 141: continued
+  method142(dynamic a) => null; //# 142: continued
+  method143(dynamic a) => null; //# 143: continued
+  method144(dynamic a) => null; //# 144: continued
+  method145(dynamic a) => null; //# 145: continued
+  method146(dynamic a) => null; //# 146: continued
+  method147(dynamic a) => null; //# 147: continued
+  method148(num a) => null; //# 148: continued
+  method149(num a) => null; //# 149: continued
+  method150(num a) => null; //# 150: continued
+  method151(num a) => null; //# 151: continued
+  method152(num a) => null; //# 152: continued
+  method153(num a) => null; //# 153: continued
+  method154(num a) => null; //# 154: continued
+  method155(num a) => null; //# 155: continued
+  method156(int a) => null; //# 156: continued
+  method157(int a) => null; //# 157: continued
+  method158(int a) => null; //# 158: continued
+  method159(int a) => null; //# 159: continued
+  method160(int a) => null; //# 160: continued
+  method161(int a) => null; //# 161: continued
+  method162(int a) => null; //# 162: continued
+  method163(int a) => null; //# 163: continued
+  method164(String a) => null; //# 164: continued
+  method165(covariant dynamic a) => null; //# 165: continued
+  method166(covariant dynamic a) => null; //# 166: continued
+  method167(covariant dynamic a) => null; //# 167: continued
+  method168(covariant dynamic a) => null; //# 168: continued
+  method169(covariant dynamic a) => null; //# 169: continued
+  method170(covariant dynamic a) => null; //# 170: continued
+  method171(covariant dynamic a) => null; //# 171: continued
+  method172(covariant dynamic a) => null; //# 172: continued
+  method173(covariant num a) => null; //# 173: continued
+  method174(covariant int a) => null; //# 174: continued
+  method175(covariant String a) => null; //# 175: continued
+  method176(covariant String a) => null; //# 176: continued
+  method177(covariant String a) => null; //# 177: continued
+  method178(covariant String a) => null; //# 178: continued
+  method179(covariant String a) => null; //# 179: continued
+  method180(covariant String a) => null; //# 180: continued
+  method181(covariant String a) => null; //# 181: continued
+  method182(covariant String a) => null; //# 182: continued
+  method183(dynamic a) => null; //# 183: continued
+  method184(dynamic a) => null; //# 184: continued
+  method185(dynamic a) => null; //# 185: continued
+  method186(dynamic a) => null; //# 186: continued
+  method187(dynamic a) => null; //# 187: continued
+  method188(dynamic a) => null; //# 188: continued
+  method189(dynamic a) => null; //# 189: continued
+  method190(dynamic a) => null; //# 190: continued
+  method191(num a) => null; //# 191: continued
+  method192(int a) => null; //# 192: continued
+  method193(String a) => null; //# 193: continued
+  method194(String a) => null; //# 194: continued
+  method195(String a) => null; //# 195: continued
+  method196(String a) => null; //# 196: continued
+  method197(String a) => null; //# 197: continued
+  method198(String a) => null; //# 198: continued
+  method199(String a) => null; //# 199: continued
+  method200(String a) => null; //# 200: continued
+  method201(covariant dynamic a) => null; //# 201: continued
+  method202(covariant dynamic a) => null; //# 202: continued
+  method203(covariant dynamic a) => null; //# 203: continued
+  method204(covariant dynamic a) => null; //# 204: continued
+  method205(covariant dynamic a) => null; //# 205: continued
+  method206(covariant dynamic a) => null; //# 206: continued
+  method207(covariant dynamic a) => null; //# 207: continued
+  method208(covariant dynamic a) => null; //# 208: continued
+  method209(covariant num a) => null; //# 209: continued
+  method210(covariant num a) => null; //# 210: continued
+  method211(covariant num a) => null; //# 211: continued
+  method212(covariant num a) => null; //# 212: continued
+  method213(covariant num a) => null; //# 213: continued
+  method214(covariant num a) => null; //# 214: continued
+  method215(covariant num a) => null; //# 215: continued
+  method216(covariant num a) => null; //# 216: continued
+  method217(covariant int a) => null; //# 217: continued
+  method218(covariant int a) => null; //# 218: continued
+  method219(covariant int a) => null; //# 219: continued
+  method220(covariant int a) => null; //# 220: continued
+  method221(covariant int a) => null; //# 221: continued
+  method222(covariant int a) => null; //# 222: continued
+  method223(covariant int a) => null; //# 223: continued
+  method224(covariant int a) => null; //# 224: continued
+  method225(covariant String a) => null; //# 225: continued
+  method226(covariant String a) => null; //# 226: continued
+  method227(covariant String a) => null; //# 227: continued
+  method228(covariant String a) => null; //# 228: continued
+  method229(covariant String a) => null; //# 229: continued
+  method230(covariant String a) => null; //# 230: continued
+  method231(covariant String a) => null; //# 231: continued
+  method232(covariant String a) => null; //# 232: continued
+  method233(dynamic a) => null; //# 233: continued
+  method234(dynamic a) => null; //# 234: continued
+  method235(dynamic a) => null; //# 235: continued
+  method236(dynamic a) => null; //# 236: continued
+  method237(dynamic a) => null; //# 237: continued
+  method238(dynamic a) => null; //# 238: continued
+  method239(dynamic a) => null; //# 239: continued
+  method240(dynamic a) => null; //# 240: continued
+  method241(num a) => null; //# 241: continued
+  method242(int a) => null; //# 242: continued
+  method243(String a) => null; //# 243: continued
+  method244(covariant dynamic a) => null; //# 244: continued
+  method245(covariant dynamic a) => null; //# 245: continued
+  method246(covariant dynamic a) => null; //# 246: continued
+  method247(covariant dynamic a) => null; //# 247: continued
+  method248(covariant dynamic a) => null; //# 248: continued
+  method249(covariant dynamic a) => null; //# 249: continued
+  method250(covariant dynamic a) => null; //# 250: continued
+  method251(covariant dynamic a) => null; //# 251: continued
+  method252(covariant num a) => null; //# 252: continued
+  method253(covariant num a) => null; //# 253: continued
+  method254(covariant num a) => null; //# 254: continued
+  method255(covariant num a) => null; //# 255: continued
+  method256(covariant num a) => null; //# 256: continued
+  method257(covariant num a) => null; //# 257: continued
+  method258(covariant num a) => null; //# 258: continued
+  method259(covariant num a) => null; //# 259: continued
+  method260(covariant int a) => null; //# 260: continued
+  method261(covariant int a) => null; //# 261: continued
+  method262(covariant int a) => null; //# 262: continued
+  method263(covariant int a) => null; //# 263: continued
+  method264(covariant int a) => null; //# 264: continued
+  method265(covariant int a) => null; //# 265: continued
+  method266(covariant int a) => null; //# 266: continued
+  method267(covariant int a) => null; //# 267: continued
+  method268(covariant String a) => null; //# 268: continued
+  method269(dynamic a) => null; //# 269: continued
+  method270(dynamic a) => null; //# 270: continued
+  method271(dynamic a) => null; //# 271: continued
+  method272(dynamic a) => null; //# 272: continued
+  method273(dynamic a) => null; //# 273: continued
+  method274(dynamic a) => null; //# 274: continued
+  method275(dynamic a) => null; //# 275: continued
+  method276(dynamic a) => null; //# 276: continued
+  method277(num a) => null; //# 277: continued
+  method278(num a) => null; //# 278: continued
+  method279(num a) => null; //# 279: continued
+  method280(num a) => null; //# 280: continued
+  method281(num a) => null; //# 281: continued
+  method282(num a) => null; //# 282: continued
+  method283(num a) => null; //# 283: continued
+  method284(num a) => null; //# 284: continued
+  method285(int a) => null; //# 285: continued
+  method286(String a) => null; //# 286: continued
+  method287(covariant dynamic a) => null; //# 287: continued
+  method288(covariant dynamic a) => null; //# 288: continued
+  method289(covariant dynamic a) => null; //# 289: continued
+  method290(covariant dynamic a) => null; //# 290: continued
+  method291(covariant dynamic a) => null; //# 291: continued
+  method292(covariant dynamic a) => null; //# 292: continued
+  method293(covariant dynamic a) => null; //# 293: continued
+  method294(covariant dynamic a) => null; //# 294: continued
+  method295(covariant num a) => null; //# 295: continued
+  method296(covariant num a) => null; //# 296: continued
+  method297(covariant num a) => null; //# 297: continued
+  method298(covariant num a) => null; //# 298: continued
+  method299(covariant num a) => null; //# 299: continued
+  method300(covariant num a) => null; //# 300: continued
+  method301(covariant num a) => null; //# 301: continued
+  method302(covariant num a) => null; //# 302: continued
+  method303(covariant int a) => null; //# 303: continued
+  method304(covariant int a) => null; //# 304: continued
+  method305(covariant int a) => null; //# 305: continued
+  method306(covariant int a) => null; //# 306: continued
+  method307(covariant int a) => null; //# 307: continued
+  method308(covariant int a) => null; //# 308: continued
+  method309(covariant int a) => null; //# 309: continued
+  method310(covariant int a) => null; //# 310: continued
+  method311(covariant String a) => null; //# 311: continued
+  method312(dynamic a) => null; //# 312: continued
+  method313(dynamic a) => null; //# 313: continued
+  method314(dynamic a) => null; //# 314: continued
+  method315(dynamic a) => null; //# 315: continued
+  method316(dynamic a) => null; //# 316: continued
+  method317(dynamic a) => null; //# 317: continued
+  method318(dynamic a) => null; //# 318: continued
+  method319(dynamic a) => null; //# 319: continued
+  method320(num a) => null; //# 320: continued
+  method321(num a) => null; //# 321: continued
+  method322(num a) => null; //# 322: continued
+  method323(num a) => null; //# 323: continued
+  method324(num a) => null; //# 324: continued
+  method325(num a) => null; //# 325: continued
+  method326(num a) => null; //# 326: continued
+  method327(num a) => null; //# 327: continued
+  method328(int a) => null; //# 328: continued
+  method329(int a) => null; //# 329: continued
+  method330(int a) => null; //# 330: continued
+  method331(int a) => null; //# 331: continued
+  method332(int a) => null; //# 332: continued
+  method333(int a) => null; //# 333: continued
+  method334(int a) => null; //# 334: continued
+  method335(int a) => null; //# 335: continued
+  method336(String a) => null; //# 336: continued
+  method337(covariant dynamic a) => null; //# 337: continued
+  method338(covariant dynamic a) => null; //# 338: continued
+  method339(covariant dynamic a) => null; //# 339: continued
+  method340(covariant dynamic a) => null; //# 340: continued
+  method341(covariant dynamic a) => null; //# 341: continued
+  method342(covariant dynamic a) => null; //# 342: continued
+  method343(covariant dynamic a) => null; //# 343: continued
+  method344(covariant dynamic a) => null; //# 344: continued
+  method345(covariant num a) => null; //# 345: continued
+  method346(covariant int a) => null; //# 346: continued
+  method347(covariant String a) => null; //# 347: continued
+  method348(covariant String a) => null; //# 348: continued
+  method349(covariant String a) => null; //# 349: continued
+  method350(covariant String a) => null; //# 350: continued
+  method351(covariant String a) => null; //# 351: continued
+  method352(covariant String a) => null; //# 352: continued
+  method353(covariant String a) => null; //# 353: continued
+  method354(covariant String a) => null; //# 354: continued
+  method355(dynamic a) => null; //# 355: continued
+  method356(dynamic a) => null; //# 356: continued
+  method357(dynamic a) => null; //# 357: continued
+  method358(dynamic a) => null; //# 358: continued
+  method359(dynamic a) => null; //# 359: continued
+  method360(dynamic a) => null; //# 360: continued
+  method361(dynamic a) => null; //# 361: continued
+  method362(dynamic a) => null; //# 362: continued
+  method363(num a) => null; //# 363: continued
+  method364(int a) => null; //# 364: continued
+  method365(String a) => null; //# 365: continued
+  method366(String a) => null; //# 366: continued
+  method367(String a) => null; //# 367: continued
+  method368(String a) => null; //# 368: continued
+  method369(String a) => null; //# 369: continued
+  method370(String a) => null; //# 370: continued
+  method371(String a) => null; //# 371: continued
+  method372(String a) => null; //# 372: continued
+}
+
+class C extends B {
+  method1(covariant dynamic a) => null; //# 001: continued
+  method2(covariant num a) => null; //# 002: continued
+  method3(covariant int a) => null; //# 003: continued
+  method4(covariant String a) => null; //# 004: continued
+  method5(dynamic a) => null; //# 005: continued
+  method6(num a) => null; //# 006: continued
+  method7(int a) => null; //# 007: continued
+  method8(String a) => null; //# 008: continued
+  method9(covariant dynamic a) => null; //# 009: continued
+  method10(covariant num a) => null; //# 010: continued
+  method11(covariant int a) => null; //# 011: continued
+  method12(covariant String a) => null; //# 012: continued
+  method13(dynamic a) => null; //# 013: continued
+  method14(num a) => null; //# 014: continued
+  method15(int a) => null; //# 015: continued
+  method16(String a) => null; //# 016: continued
+  method17(covariant dynamic a) => null; //# 017: continued
+  method18(covariant num a) => null; //# 018: continued
+  method19(covariant int a) => null; //# 019: continued
+  method20(covariant String a) => null; //# 020: continued
+  method21(dynamic a) => null; //# 021: continued
+  method22(num a) => null; //# 022: continued
+  method23(int a) => null; //# 023: continued
+  method24(String a) => null; //# 024: continued
+  method25(covariant dynamic a) => null; //# 025: continued
+  method26(covariant num a) => null; //# 026: continued
+  method27(covariant int a) => null; //# 027: continued
+  method28(covariant String a) => null; //# 028: continued
+  method29(dynamic a) => null; //# 029: continued
+  method30(num a) => null; //# 030: continued
+  method31(int a) => null; //# 031: continued
+  method32(String a) => null; //# 032: continued
+  method33(covariant dynamic a) => null; //# 033: continued
+  method34(covariant num a) => null; //# 034: continued
+  method35(covariant int a) => null; //# 035: continued
+  method36(covariant String a) => null; //# 036: continued
+  method37(dynamic a) => null; //# 037: continued
+  method38(num a) => null; //# 038: continued
+  method39(int a) => null; //# 039: continued
+  method40(String a) => null; //# 040: continued
+  method41(covariant dynamic a) => null; //# 041: continued
+  method42(covariant num a) => null; //# 042: continued
+  method43(covariant int a) => null; //# 043: continued
+  method44(covariant String a) => null; //# 044: continued
+  method45(dynamic a) => null; //# 045: continued
+  method46(num a) => null; //# 046: continued
+  method47(int a) => null; //# 047: continued
+  method48(String a) => null; //# 048: continued
+  method49(covariant dynamic a) => null; //# 049: continued
+  method50(covariant num a) => null; //# 050: continued
+  method51(covariant int a) => null; //# 051: continued
+  method52(covariant String a) => null; //# 052: continued
+  method53(dynamic a) => null; //# 053: continued
+  method54(num a) => null; //# 054: continued
+  method55(int a) => null; //# 055: continued
+  method56(String a) => null; //# 056: continued
+  method57(covariant dynamic a) => null; //# 057: continued
+  method58(covariant num a) => null; //# 058: continued
+  method59(covariant int a) => null; //# 059: continued
+  method60(covariant String a) => null; //# 060: continued
+  method61(dynamic a) => null; //# 061: continued
+  method62(num a) => null; //# 062: continued
+  method63(int a) => null; //# 063: continued
+  method64(String a) => null; //# 064: continued
+  method65(covariant dynamic a) => null; //# 065: continued
+  method66(covariant num a) => null; //# 066: continued
+  method67(covariant int a) => null; //# 067: continued
+  method68(covariant String a) => null; //# 068: continued
+  method69(dynamic a) => null; //# 069: continued
+  method70(num a) => null; //# 070: continued
+  method71(int a) => null; //# 071: continued
+  method72(String a) => null; //# 072: continued
+  method73(covariant dynamic a) => null; //# 073: continued
+  method74(covariant num a) => null; //# 074: continued
+  method75(covariant int a) => null; //# 075: continued
+  method76(covariant String a) => null; //# 076: continued
+  method77(dynamic a) => null; //# 077: continued
+  method78(num a) => null; //# 078: continued
+  method79(int a) => null; //# 079: continued
+  method80(String a) => null; //# 080: continued
+  method81(covariant dynamic a) => null; //# 081: continued
+  method82(covariant num a) => null; //# 082: continued
+  method83(covariant int a) => null; //# 083: continued
+  method84(covariant String a) => null; //# 084: continued
+  method85(dynamic a) => null; //# 085: continued
+  method86(num a) => null; //# 086: continued
+  method87(int a) => null; //# 087: continued
+  method88(String a) => null; //# 088: continued
+  method90(covariant dynamic a) => null; //# 090: continued
+  method91(covariant num a) => null; //# 091: continued
+  method92(covariant int a) => null; //# 092: continued
+  method93(covariant String a) => null; //# 093: continued
+  method94(dynamic a) => null; //# 094: continued
+  method95(num a) => null; //# 095: continued
+  method96(int a) => null; //# 096: continued
+  method97(String a) => null; //# 097: continued
+  method98(covariant dynamic a) => null; //# 098: continued
+  method99(covariant num a) => null; //# 099: continued
+  method100(covariant int a) => null; //# 100: continued
+  method101(covariant String a) => null; //# 101: continued
+  method102(dynamic a) => null; //# 102: continued
+  method103(num a) => null; //# 103: continued
+  method104(int a) => null; //# 104: continued
+  method105(String a) => null; //# 105: continued
+  method106(covariant dynamic a) => null; //# 106: continued
+  method107(covariant num a) => null; //# 107: continued
+  method108(covariant int a) => null; //# 108: continued
+  method109(covariant String a) => null; //# 109: continued
+  method110(dynamic a) => null; //# 110: continued
+  method111(num a) => null; //# 111: continued
+  method112(int a) => null; //# 112: continued
+  method113(String a) => null; //# 113: continued
+  method115(covariant dynamic a) => null; //# 115: continued
+  method116(covariant num a) => null; //# 116: continued
+  method117(covariant int a) => null; //# 117: continued
+  method118(covariant String a) => null; //# 118: continued
+  method119(dynamic a) => null; //# 119: continued
+  method120(num a) => null; //# 120: continued
+  method121(int a) => null; //# 121: continued
+  method122(String a) => null; //# 122: continued
+  method123(covariant dynamic a) => null; //# 123: continued
+  method124(covariant num a) => null; //# 124: continued
+  method125(covariant int a) => null; //# 125: continued
+  method126(covariant String a) => null; //# 126: continued
+  method127(dynamic a) => null; //# 127: continued
+  method128(num a) => null; //# 128: continued
+  method129(int a) => null; //# 129: continued
+  method130(String a) => null; //# 130: continued
+  method131(covariant dynamic a) => null; //# 131: continued
+  method132(covariant num a) => null; //# 132: continued
+  method133(covariant int a) => null; //# 133: continued
+  method134(covariant String a) => null; //# 134: continued
+  method135(dynamic a) => null; //# 135: continued
+  method136(num a) => null; //# 136: continued
+  method137(int a) => null; //# 137: continued
+  method138(String a) => null; //# 138: continued
+  method140(covariant dynamic a) => null; //# 140: continued
+  method141(covariant num a) => null; //# 141: continued
+  method142(covariant int a) => null; //# 142: continued
+  method143(covariant String a) => null; //# 143: continued
+  method144(dynamic a) => null; //# 144: continued
+  method145(num a) => null; //# 145: continued
+  method146(int a) => null; //# 146: continued
+  method147(String a) => null; //# 147: continued
+  method148(covariant dynamic a) => null; //# 148: continued
+  method149(covariant num a) => null; //# 149: continued
+  method150(covariant int a) => null; //# 150: continued
+  method151(covariant String a) => null; //# 151: continued
+  method152(dynamic a) => null; //# 152: continued
+  method153(num a) => null; //# 153: continued
+  method154(int a) => null; //# 154: continued
+  method155(String a) => null; //# 155: continued
+  method156(covariant dynamic a) => null; //# 156: continued
+  method157(covariant num a) => null; //# 157: continued
+  method158(covariant int a) => null; //# 158: continued
+  method159(covariant String a) => null; //# 159: continued
+  method160(dynamic a) => null; //# 160: continued
+  method161(num a) => null; //# 161: continued
+  method162(int a) => null; //# 162: continued
+  method163(String a) => null; //# 163: continued
+  method165(covariant dynamic a) => null; //# 165: continued
+  method166(covariant num a) => null; //# 166: continued
+  method167(covariant int a) => null; //# 167: continued
+  method168(covariant String a) => null; //# 168: continued
+  method169(dynamic a) => null; //# 169: continued
+  method170(num a) => null; //# 170: continued
+  method171(int a) => null; //# 171: continued
+  method172(String a) => null; //# 172: continued
+  method175(covariant dynamic a) => null; //# 175: continued
+  method176(covariant num a) => null; //# 176: continued
+  method177(covariant int a) => null; //# 177: continued
+  method178(covariant String a) => null; //# 178: continued
+  method179(dynamic a) => null; //# 179: continued
+  method180(num a) => null; //# 180: continued
+  method181(int a) => null; //# 181: continued
+  method182(String a) => null; //# 182: continued
+  method183(covariant dynamic a) => null; //# 183: continued
+  method184(covariant num a) => null; //# 184: continued
+  method185(covariant int a) => null; //# 185: continued
+  method186(covariant String a) => null; //# 186: continued
+  method187(dynamic a) => null; //# 187: continued
+  method188(num a) => null; //# 188: continued
+  method189(int a) => null; //# 189: continued
+  method190(String a) => null; //# 190: continued
+  method193(covariant dynamic a) => null; //# 193: continued
+  method194(covariant num a) => null; //# 194: continued
+  method195(covariant int a) => null; //# 195: continued
+  method196(covariant String a) => null; //# 196: continued
+  method197(dynamic a) => null; //# 197: continued
+  method198(num a) => null; //# 198: continued
+  method199(int a) => null; //# 199: continued
+  method200(String a) => null; //# 200: continued
+  method201(covariant dynamic a) => null; //# 201: continued
+  method202(covariant num a) => null; //# 202: continued
+  method203(covariant int a) => null; //# 203: continued
+  method204(covariant String a) => null; //# 204: continued
+  method205(dynamic a) => null; //# 205: continued
+  method206(num a) => null; //# 206: continued
+  method207(int a) => null; //# 207: continued
+  method208(String a) => null; //# 208: continued
+  method209(covariant dynamic a) => null; //# 209: continued
+  method210(covariant num a) => null; //# 210: continued
+  method211(covariant int a) => null; //# 211: continued
+  method212(covariant String a) => null; //# 212: continued
+  method213(dynamic a) => null; //# 213: continued
+  method214(num a) => null; //# 214: continued
+  method215(int a) => null; //# 215: continued
+  method216(String a) => null; //# 216: continued
+  method217(covariant dynamic a) => null; //# 217: continued
+  method218(covariant num a) => null; //# 218: continued
+  method219(covariant int a) => null; //# 219: continued
+  method220(covariant String a) => null; //# 220: continued
+  method221(dynamic a) => null; //# 221: continued
+  method222(num a) => null; //# 222: continued
+  method223(int a) => null; //# 223: continued
+  method224(String a) => null; //# 224: continued
+  method225(covariant dynamic a) => null; //# 225: continued
+  method226(covariant num a) => null; //# 226: continued
+  method227(covariant int a) => null; //# 227: continued
+  method228(covariant String a) => null; //# 228: continued
+  method229(dynamic a) => null; //# 229: continued
+  method230(num a) => null; //# 230: continued
+  method231(int a) => null; //# 231: continued
+  method232(String a) => null; //# 232: continued
+  method233(covariant dynamic a) => null; //# 233: continued
+  method234(covariant num a) => null; //# 234: continued
+  method235(covariant int a) => null; //# 235: continued
+  method236(covariant String a) => null; //# 236: continued
+  method237(dynamic a) => null; //# 237: continued
+  method238(num a) => null; //# 238: continued
+  method239(int a) => null; //# 239: continued
+  method240(String a) => null; //# 240: continued
+  method244(covariant dynamic a) => null; //# 244: continued
+  method245(covariant num a) => null; //# 245: continued
+  method246(covariant int a) => null; //# 246: continued
+  method247(covariant String a) => null; //# 247: continued
+  method248(dynamic a) => null; //# 248: continued
+  method249(num a) => null; //# 249: continued
+  method250(int a) => null; //# 250: continued
+  method251(String a) => null; //# 251: continued
+  method252(covariant dynamic a) => null; //# 252: continued
+  method253(covariant num a) => null; //# 253: continued
+  method254(covariant int a) => null; //# 254: continued
+  method255(covariant String a) => null; //# 255: continued
+  method256(dynamic a) => null; //# 256: continued
+  method257(num a) => null; //# 257: continued
+  method258(int a) => null; //# 258: continued
+  method259(String a) => null; //# 259: continued
+  method260(covariant dynamic a) => null; //# 260: continued
+  method261(covariant num a) => null; //# 261: continued
+  method262(covariant int a) => null; //# 262: continued
+  method263(covariant String a) => null; //# 263: continued
+  method264(dynamic a) => null; //# 264: continued
+  method265(num a) => null; //# 265: continued
+  method266(int a) => null; //# 266: continued
+  method267(String a) => null; //# 267: continued
+  method269(covariant dynamic a) => null; //# 269: continued
+  method270(covariant num a) => null; //# 270: continued
+  method271(covariant int a) => null; //# 271: continued
+  method272(covariant String a) => null; //# 272: continued
+  method273(dynamic a) => null; //# 273: continued
+  method274(num a) => null; //# 274: continued
+  method275(int a) => null; //# 275: continued
+  method276(String a) => null; //# 276: continued
+  method277(covariant dynamic a) => null; //# 277: continued
+  method278(covariant num a) => null; //# 278: continued
+  method279(covariant int a) => null; //# 279: continued
+  method280(covariant String a) => null; //# 280: continued
+  method281(dynamic a) => null; //# 281: continued
+  method282(num a) => null; //# 282: continued
+  method283(int a) => null; //# 283: continued
+  method284(String a) => null; //# 284: continued
+  method287(covariant dynamic a) => null; //# 287: continued
+  method288(covariant num a) => null; //# 288: continued
+  method289(covariant int a) => null; //# 289: continued
+  method290(covariant String a) => null; //# 290: continued
+  method291(dynamic a) => null; //# 291: continued
+  method292(num a) => null; //# 292: continued
+  method293(int a) => null; //# 293: continued
+  method294(String a) => null; //# 294: continued
+  method295(covariant dynamic a) => null; //# 295: continued
+  method296(covariant num a) => null; //# 296: continued
+  method297(covariant int a) => null; //# 297: continued
+  method298(covariant String a) => null; //# 298: continued
+  method299(dynamic a) => null; //# 299: continued
+  method300(num a) => null; //# 300: continued
+  method301(int a) => null; //# 301: continued
+  method302(String a) => null; //# 302: continued
+  method303(covariant dynamic a) => null; //# 303: continued
+  method304(covariant num a) => null; //# 304: continued
+  method305(covariant int a) => null; //# 305: continued
+  method306(covariant String a) => null; //# 306: continued
+  method307(dynamic a) => null; //# 307: continued
+  method308(num a) => null; //# 308: continued
+  method309(int a) => null; //# 309: continued
+  method310(String a) => null; //# 310: continued
+  method312(covariant dynamic a) => null; //# 312: continued
+  method313(covariant num a) => null; //# 313: continued
+  method314(covariant int a) => null; //# 314: continued
+  method315(covariant String a) => null; //# 315: continued
+  method316(dynamic a) => null; //# 316: continued
+  method317(num a) => null; //# 317: continued
+  method318(int a) => null; //# 318: continued
+  method319(String a) => null; //# 319: continued
+  method320(covariant dynamic a) => null; //# 320: continued
+  method321(covariant num a) => null; //# 321: continued
+  method322(covariant int a) => null; //# 322: continued
+  method323(covariant String a) => null; //# 323: continued
+  method324(dynamic a) => null; //# 324: continued
+  method325(num a) => null; //# 325: continued
+  method326(int a) => null; //# 326: continued
+  method327(String a) => null; //# 327: continued
+  method328(covariant dynamic a) => null; //# 328: continued
+  method329(covariant num a) => null; //# 329: continued
+  method330(covariant int a) => null; //# 330: continued
+  method331(covariant String a) => null; //# 331: continued
+  method332(dynamic a) => null; //# 332: continued
+  method333(num a) => null; //# 333: continued
+  method334(int a) => null; //# 334: continued
+  method335(String a) => null; //# 335: continued
+  method337(covariant dynamic a) => null; //# 337: continued
+  method338(covariant num a) => null; //# 338: continued
+  method339(covariant int a) => null; //# 339: continued
+  method340(covariant String a) => null; //# 340: continued
+  method341(dynamic a) => null; //# 341: continued
+  method342(num a) => null; //# 342: continued
+  method343(int a) => null; //# 343: continued
+  method344(String a) => null; //# 344: continued
+  method347(covariant dynamic a) => null; //# 347: continued
+  method348(covariant num a) => null; //# 348: continued
+  method349(covariant int a) => null; //# 349: continued
+  method350(covariant String a) => null; //# 350: continued
+  method351(dynamic a) => null; //# 351: continued
+  method352(num a) => null; //# 352: continued
+  method353(int a) => null; //# 353: continued
+  method354(String a) => null; //# 354: continued
+  method355(covariant dynamic a) => null; //# 355: continued
+  method356(covariant num a) => null; //# 356: continued
+  method357(covariant int a) => null; //# 357: continued
+  method358(covariant String a) => null; //# 358: continued
+  method359(dynamic a) => null; //# 359: continued
+  method360(num a) => null; //# 360: continued
+  method361(int a) => null; //# 361: continued
+  method362(String a) => null; //# 362: continued
+  method365(covariant dynamic a) => null; //# 365: continued
+  method366(covariant num a) => null; //# 366: continued
+  method367(covariant int a) => null; //# 367: continued
+  method368(covariant String a) => null; //# 368: continued
+  method369(dynamic a) => null; //# 369: continued
+  method370(num a) => null; //# 370: continued
+  method371(int a) => null; //# 371: continued
+  method372(String a) => null; //# 372: continued
+}
diff --git a/tests/language_2/override_inheritance_setter_test.dart b/tests/language_2/override_inheritance_setter_test.dart
new file mode 100644
index 0000000..f709c75
--- /dev/null
+++ b/tests/language_2/override_inheritance_setter_test.dart
@@ -0,0 +1,32 @@
+main() {
+  new C();
+}
+
+class A {
+  void set setter1(num x) {} //# 001: compile-time error
+  void set setter2(num x) {} //# 002: compile-time error
+  void set setter3(num x) {} //# 003: ok
+  void set setter4(num x) {} //# 004: compile-time error
+  void set setter5(num x) {} //# 005: ok
+  void set setter6(num x) {} //# 006: compile-time error
+  void set setter7(num x) {} //# 007: ok
+}
+
+class B extends A {
+  void set setter1(covariant dynamic x) {} //# 001: continued
+  void set setter2(int x) {} //# 002: continued
+  void set setter3(covariant dynamic x) {} //# 003: continued
+  void set setter4(dynamic x) {} //# 004: continued
+  void set setter5(covariant dynamic x) {} //# 005: continued
+  covariant dynamic setter6; //# 006: continued
+  covariant dynamic setter7; //# 007: continued
+}
+
+class C extends B {
+  void set setter1(String x) {} //# 001: continued
+  void set setter3(num x) {} //# 003: continued
+  void set setter4(int x) {} //# 004: continued
+  void set setter5(int x) {} //# 005: continued
+  void set setter6(String x) {} //# 006: continued
+  void set setter7(int x) {} //# 007: continued
+}
diff --git a/tests/language_2/regress_33235_01_test.dart b/tests/language_2/regress_33235_01_test.dart
new file mode 100644
index 0000000..e4b252d
--- /dev/null
+++ b/tests/language_2/regress_33235_01_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class C {
+  C.n() {} // //# 01: compile-time error
+
+  static int get n {
+    return 42;
+  }
+}
+
+main() {
+  print(C);
+}
diff --git a/tests/language_2/regress_33235_02_test.dart b/tests/language_2/regress_33235_02_test.dart
new file mode 100644
index 0000000..6cc51d2
--- /dev/null
+++ b/tests/language_2/regress_33235_02_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class C {
+  C.n() {} // //# 01: compile-time error
+
+  static int n() {
+    return 42;
+  }
+}
+
+main() {
+  print(C);
+}
diff --git a/tests/language_2/regress_33235_03_test.dart b/tests/language_2/regress_33235_03_test.dart
new file mode 100644
index 0000000..f1e762b
--- /dev/null
+++ b/tests/language_2/regress_33235_03_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class C {
+  C.n() {} // //# 01: compile-time error
+
+  static set n(int x) {}
+}
+
+main() {
+  print(C);
+}
diff --git a/tests/language_2/regress_33235_04_test.dart b/tests/language_2/regress_33235_04_test.dart
new file mode 100644
index 0000000..db46401
--- /dev/null
+++ b/tests/language_2/regress_33235_04_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class C {
+  static int get n => 42; // //# 01: compile-time error
+
+  static int n() => 42;
+}
+
+main() {
+  print(C);
+}
diff --git a/tests/language_2/regress_33235_05_test.dart b/tests/language_2/regress_33235_05_test.dart
new file mode 100644
index 0000000..179a4f3
--- /dev/null
+++ b/tests/language_2/regress_33235_05_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int get n => 43;
+}
+
+class B extends A {
+  static int get n => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static int get n => 42; // //# 03: compile-time error
+}
+
+class C {
+  static int get n => 42; // //# 01: compile-time error
+
+  int get n => 43;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_06_test.dart b/tests/language_2/regress_33235_06_test.dart
new file mode 100644
index 0000000..bd9bcc2
--- /dev/null
+++ b/tests/language_2/regress_33235_06_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int n() => 43;
+}
+
+class B extends A {
+  static int get n => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static int get n => 42; // //# 03: compile-time error
+}
+
+class C {
+  static int get n => 42; // //# 01: compile-time error
+
+  int n() => 43;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_07_test.dart b/tests/language_2/regress_33235_07_test.dart
new file mode 100644
index 0000000..da33ad7
--- /dev/null
+++ b/tests/language_2/regress_33235_07_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  void set n(int i) {}
+}
+
+class B extends A {
+  static int get n => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static int get n => 42; // //# 03: compile-time error
+}
+
+class C {
+  static int get n => 42; // //# 01: compile-time error
+
+  void set n(int i) {}
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_08_test.dart b/tests/language_2/regress_33235_08_test.dart
new file mode 100644
index 0000000..82369f5
--- /dev/null
+++ b/tests/language_2/regress_33235_08_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int get n => 43;
+}
+
+class B extends A {
+  static int n() => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static int n() => 42; // //# 03: compile-time error
+}
+
+class C {
+  static int n() => 42; // //# 01: compile-time error
+
+  int get n => 43;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_09_test.dart b/tests/language_2/regress_33235_09_test.dart
new file mode 100644
index 0000000..b9cff42
--- /dev/null
+++ b/tests/language_2/regress_33235_09_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int n() => 43;
+}
+
+class B extends A {
+  static int n() => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static int n() => 42; // //# 03: compile-time error
+}
+
+class C {
+  static int n() => 42; // //# 01: compile-time error
+
+  int n() => 43;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_10_test.dart b/tests/language_2/regress_33235_10_test.dart
new file mode 100644
index 0000000..0aa1514
--- /dev/null
+++ b/tests/language_2/regress_33235_10_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  void set n(int i) {}
+}
+
+class B extends A {
+  static int n() => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static int n() => 42; // //# 03: compile-time error
+}
+
+class C {
+  static int n() => 42; // //# 01: compile-time error
+
+  void set n(int i) {}
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_11_test.dart b/tests/language_2/regress_33235_11_test.dart
new file mode 100644
index 0000000..08d4e49
--- /dev/null
+++ b/tests/language_2/regress_33235_11_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class C {
+  static void set n(int i) {} // //# 01: compile-time error
+
+  static int n() => 42;
+}
+
+main() {
+  print(C);
+}
diff --git a/tests/language_2/regress_33235_12_test.dart b/tests/language_2/regress_33235_12_test.dart
new file mode 100644
index 0000000..b8e2ec3
--- /dev/null
+++ b/tests/language_2/regress_33235_12_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int get n => 42;
+}
+
+class B extends A {
+  static void set n(int i) {} // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static void set n(int i) {} // //# 03: compile-time error
+}
+
+class C {
+  static void set n(int i) {} // //# 01: compile-time error
+
+  int get n => 42;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_13_test.dart b/tests/language_2/regress_33235_13_test.dart
new file mode 100644
index 0000000..13a0c35
--- /dev/null
+++ b/tests/language_2/regress_33235_13_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int n() => 42;
+}
+
+class B extends A {
+  static void set n(int i) {} // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static void set n(int i) {} // //# 03: compile-time error
+}
+
+class C {
+  static void set n(int i) {} // //# 01: compile-time error
+
+  int n() => 42;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_14_test.dart b/tests/language_2/regress_33235_14_test.dart
new file mode 100644
index 0000000..0ba2cba
--- /dev/null
+++ b/tests/language_2/regress_33235_14_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+class A {
+  void set n(int x) {}
+}
+
+class B extends A {
+  static void set n(int i) {} // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  static void set n(int i) {} // //# 03: compile-time error
+}
+
+class C {
+  static void set n(int i) {} // //# 01: compile-time error
+
+  void set n(int x) {}
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_15_test.dart b/tests/language_2/regress_33235_15_test.dart
new file mode 100644
index 0000000..6264201
--- /dev/null
+++ b/tests/language_2/regress_33235_15_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int n() => 43;
+}
+
+class B extends A {
+  int get n => 42; // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  int get n => 42; // //# 03: compile-time error
+}
+
+class C {
+  int get n => 42; // //# 01: compile-time error
+
+  int n() => 43;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_16_test.dart b/tests/language_2/regress_33235_16_test.dart
new file mode 100644
index 0000000..d3d5c05
--- /dev/null
+++ b/tests/language_2/regress_33235_16_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int n() => 43;
+}
+
+class B extends A {
+  void set n(int i) {} // //# 02: compile-time error
+}
+
+abstract class B2 implements A {
+  void set n(int i) {} // //# 03: compile-time error
+}
+
+class C {
+  void set n(int i) {} // //# 01: compile-time error
+
+  int n() => 43;
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_17_test.dart b/tests/language_2/regress_33235_17_test.dart
new file mode 100644
index 0000000..95ae7d7
--- /dev/null
+++ b/tests/language_2/regress_33235_17_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class C {
+  static void set n(int i) {}
+
+  static int get n {
+    return 43;
+  }
+}
+
+main() {
+  print(C);
+}
diff --git a/tests/language_2/regress_33235_18_test.dart b/tests/language_2/regress_33235_18_test.dart
new file mode 100644
index 0000000..ec72cb1
--- /dev/null
+++ b/tests/language_2/regress_33235_18_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  void set n(int i) {}
+}
+
+class B extends A {
+  int get n {
+    return 42;
+  }
+}
+
+abstract class B2 implements A {
+  int get n {
+    return 42;
+  }
+}
+
+class C {
+  int get n {
+    return 42;
+  }
+
+  void set n(int i) {}
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_19_test.dart b/tests/language_2/regress_33235_19_test.dart
new file mode 100644
index 0000000..999d661
--- /dev/null
+++ b/tests/language_2/regress_33235_19_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int n() {
+    return 42;
+  }
+}
+
+class B extends A {
+  B.n() {}
+}
+
+abstract class B2 implements A {
+  B2.n() {}
+}
+
+class C {
+  C.n() {}
+
+  int n() {
+    return 42;
+  }
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_20_test.dart b/tests/language_2/regress_33235_20_test.dart
new file mode 100644
index 0000000..d312026
--- /dev/null
+++ b/tests/language_2/regress_33235_20_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  int get n {
+    return 42;
+  }
+}
+
+class B extends A {
+  B.n() {}
+}
+
+abstract class B2 implements A {
+  B2.n() {}
+}
+
+class C {
+  C.n() {}
+
+  int get n {
+    return 42;
+  }
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/regress_33235_21_test.dart b/tests/language_2/regress_33235_21_test.dart
new file mode 100644
index 0000000..b013bce
--- /dev/null
+++ b/tests/language_2/regress_33235_21_test.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.
+
+// Test for complience with tables at
+// https://github.com/dart-lang/sdk/issues/33235#issue-326617285
+// Files 01 to 16 should be compile time errors, files 17 to 21 should not.
+
+class A {
+  void set n(int i) {}
+}
+
+class B extends A {
+  B.n() {}
+}
+
+abstract class B2 implements A {
+  B2.n() {}
+}
+
+class C {
+  C.n() {}
+
+  void set n(int i) {}
+}
+
+main() {
+  print(C);
+  print(B);
+  print(B2);
+}
diff --git a/tests/language_2/tearoff_dynamic_test.dart b/tests/language_2/tearoff_dynamic_test.dart
index 09446e7..c47edf7 100644
--- a/tests/language_2/tearoff_dynamic_test.dart
+++ b/tests/language_2/tearoff_dynamic_test.dart
@@ -110,7 +110,7 @@
   testType([1, 2, 3]);
   testType({'a': 'b'});
   testType((x) => x + 1);
-  testType(testType);
+  testType(testType as dynamic); // illegal inferred type for T otherwise
 }
 
 class N {
@@ -159,7 +159,7 @@
   testType([1, 2, 3]);
   testType({'a': 'b'});
   testType((x) => x + 1);
-  testType(testType);
+  testType(testType as dynamic); // illegal inferred type for T otherwise
 }
 
 main() {
diff --git a/tests/language_2/void_type_function_types_test.dart b/tests/language_2/void_type_function_types_test.dart
index d436c85..6146c43 100644
--- a/tests/language_2/void_type_function_types_test.dart
+++ b/tests/language_2/void_type_function_types_test.dart
@@ -67,21 +67,21 @@
   Expect.isTrue(g is F);
   Expect.isTrue(g is G);
   Expect.isFalse(g is H);
-  expectsF(g); //# 04: compile-time error
+  expectsF(g);
   expectsG(g);
   expectsH(g); //# 05: compile-time error
 
   Expect.isTrue(g2 is F2);
   Expect.isTrue(g2 is G2);
   Expect.isFalse(g2 is H2);
-  expectsF2(g2); //# 06: compile-time error
+  expectsF2(g2);
   expectsG2(g2);
   expectsH2(g2); //# 07: compile-time error
 
   Expect.isTrue(g3 is F3);
   Expect.isTrue(g3 is G3);
   Expect.isFalse(g3 is H3);
-  expectsF3(g3); //# 08: compile-time error
+  expectsF3(g3);
   expectsG3(g3);
   expectsH3(g3); //# 09: compile-time error
 
diff --git a/tests/language_2/void_type_override_test.dart b/tests/language_2/void_type_override_test.dart
index eb2a740..4b13843 100644
--- a/tests/language_2/void_type_override_test.dart
+++ b/tests/language_2/void_type_override_test.dart
@@ -23,13 +23,13 @@
 }
 
 class B implements A<Object> {
-  void   //# 00: compile-time error
+  void   //# 00: ok
   /*     //# 00: continued
   var
   */     //# 00: continued
   x;
 
-  void   //# 00b: compile-time error
+  void   //# 00b: ok
   /*     //# 00b: continued
   var
   */     //# 00b: continued
@@ -41,9 +41,8 @@
   */     //# 00c: continued
   z;
 
-  // Overriding an Object function with a void function is an error.
-  void  //# 01: compile-time error
-  foo() => null;
+  void  //# 01: ok
+  foo() {}
 
   int bar() => 499;
   void gee(void x) {}
diff --git a/tests/language_2/void_type_usage_test.dart b/tests/language_2/void_type_usage_test.dart
index 135e8bd..5ba0547 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) { }
 
-testVoidParam(void x) {
+Object 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,11 @@
   x..toString();  //# param_cascade: compile-time error
 }
 
-testVoidCall(void f()) {
+dynamic testVoidParamDynamic(void x) {
+  return x;   //# param_return_dynamic: ok
+}
+
+Object testVoidCall(void f()) {
   f();  //# call_stmt: ok
   true ? f() : f();  //# call_conditional: compile-time error
   for (f(); false; f()) {}   //# call_for: ok
@@ -60,7 +64,11 @@
   f()..toString();  //# call_cascade: compile-time error
 }
 
-testVoidLocal() {
+dynamic testVoidCallDynamic(void f()) {
+  return f();   //# call_return: ok
+}
+
+Object testVoidLocal() {
   void x;
   x = 42;   //# local_assign: ok
   x;  //# local_stmt: ok
@@ -90,7 +98,12 @@
   x..toString();  //# local_cascade: compile-time error
 }
 
-testVoidFinalLocal() {
+dynamic testVoidLocalDynamic() {
+  void x;
+  return x;   //# local_return_dynamic: ok
+}
+
+Object testVoidFinalLocal() {
   final void x = null;
   x = 42;   //# final_local_assign: compile-time error
   x;  //# final_local_stmt: ok
@@ -120,8 +133,13 @@
   x..toString();  //# final_local_cascade: compile-time error
 }
 
+dynamic testVoidFinalLocalDynamic() {
+  final void x = null;
+  return x;   //# final_local_return_dynamic: ok
+}
+
 void global;
-testVoidGlobal() {
+Object testVoidGlobal() {
   global;  //# global_stmt: ok
   true ? global : global;  //# global_conditional: compile-time error
   for (global; false; global) {}   //# global_for: ok
@@ -149,6 +167,10 @@
   global..toString();  //# global_cascade: compile-time error
 }
 
+dynamic testVoidGlobalDynamic() {
+  return global;   //# global_return_dynamic: ok
+}
+
 testVoidConditional() {
   void x;
   (true ? x : x);   //# conditional_parens: compile-time error
@@ -215,7 +237,7 @@
   int foo() => 499;
 
   void forInTest() {
-    for (x in <void>[]) {}  //# instance2_for_in2: compile-time error
+    for (x in <void>[]) {}  //# instance2_for_in2: ok
     for (x in [1, 2]) {}  //# instance2_for_in3: ok
   }
 }
@@ -227,12 +249,12 @@
   void foo() {}
 
   void forInTest() {
-    for (x in <void>[]) {}  //# instance3_for_in2: compile-time error
+    for (x in <void>[]) {}  //# instance3_for_in2: ok
     for (x in [1, 2]) {}  //# instance3_for_in3: ok
   }
 }
 
-testInstanceField() {
+Object testInstanceField() {
   A<void> a = new A<void>();
   a.x = 499;  //# field_assign: ok
   a.x;  //# instance_stmt: ok
@@ -317,7 +339,18 @@
   c.x..toString();  //# instance3_cascade: compile-time error
 }
 
-testParenthesized() {
+dynamic testInstanceFieldDynamic() {
+  A<void> a = new A<void>();
+  return a.x;   //# instance_return_dynamic: ok
+
+  B b = new B();
+  return b.x;   //# instance2_return_dynamic: ok
+
+  C c = new C();
+  return c.x;   //# instance3_return_dynamic: ok
+}
+
+Object testParenthesized() {
   void x;
   (x);  //# paren_stmt: ok
   true ? (x) : (x);  //# paren_conditional: compile-time error
@@ -344,6 +377,11 @@
   (x)..toString();  //# paren_cascade: compile-time error
 }
 
+dynamic testParenthesizedDynamic() {
+  void x;
+  return (x);   //# paren_return_dynamic: ok
+}
+
 void testReturnToVoid(void x, void f()) {
   void y;
   final void z = null;
diff --git a/tests/lib_2/async/future_test.dart b/tests/lib_2/async/future_test.dart
index 5a075e9..515adca 100644
--- a/tests/lib_2/async/future_test.dart
+++ b/tests/lib_2/async/future_test.dart
@@ -636,7 +636,6 @@
     Expect.equals("ERROR-tcwfe2", e);
     asyncEnd();
   });
-
 }
 
 void testCompleteErrorWithFuture() {
@@ -688,7 +687,8 @@
   completer.completeError(future);
   completer.future.then((_) {
     Expect.fail("Shouldn't happen");
-  }, onError: (Future f) {
+  }, onError: (e) {
+    Future f = e;
     f.then((v) {
       Expect.equals(42, v);
       asyncEnd();
@@ -888,7 +888,8 @@
       Expect.equals(e, 1);
       asyncEnd();
     });
-  }, onError: (int index, s) {
+  }, onError: (e, s) {
+    int index = e;
     Expect.isTrue(index == 0 || index == 2, "$index");
     Expect.isFalse(uncaughts[index]);
     uncaughts[index] = true;
@@ -977,7 +978,7 @@
 void testTypes() {
   // Test that future is a Future<int> and not something less precise.
   testType(name, future, [depth = 2]) {
-    var desc = "$name${".whenComplete"*(2-depth)}";
+    var desc = "$name${".whenComplete" * (2 - depth)}";
     Expect.isTrue(future is Future<int>, "$desc is Future<int>");
     Expect.isFalse(future is Future<String>, "$desc is! Future<String>");
     var stream = future.asStream();
@@ -995,12 +996,9 @@
         new Future<int>.delayed(Duration.zero, () => value));
     testType(
         "Future.microtask($value)", new Future<int>.microtask(() => value));
-    testType( //# 01: ok
-        "Future.sync($value)", new Future<int>.sync(() => value)); //# 01: continued
-    testType( //# 01: continued
-        "Future.sync(future($value))", //# 01: continued
-        new Future<int>.sync(//# 01: continued
-            () => new Future<int>.value(value))); //# 01: continued
+    testType("Future.sync($value)", new Future<int>.sync(() => value));
+    testType("Future.sync(future($value))",
+        new Future<int>.sync(() => new Future<int>.value(value)));
     testType("Future.value($value)", new Future<int>.value(value));
   }
   testType("Completer.future", new Completer<int>().future);
@@ -1100,6 +1098,33 @@
   }();
 }
 
+void testFutureOfFuture() async {
+  // Plain Future.
+  asyncStart();
+  var future = Future<Future<int>>.value(Future<int>.value(42));
+  Expect.type<Future<Future<int>>>(future);
+  future.then((innerFuture) {
+    Expect.type<Future<int>>(innerFuture);
+    innerFuture.then((number) {
+      Expect.equals(42, number);
+      asyncEnd();
+    });
+  });
+
+  // With completer.
+  asyncStart();
+  var completer = Completer<Future<int>>();
+  Expect.type<Future<Future<int>>>(completer.future);
+  completer.future.then((innerFuture) {
+    Expect.type<Future<int>>(innerFuture);
+    innerFuture.then((number) {
+      Expect.equals(42, number);
+      asyncEnd();
+    });
+  });
+  completer.complete(Future<int>.value(42));
+}
+
 main() {
   asyncStart();
 
@@ -1173,6 +1198,8 @@
 
   testFutureResult();
 
+  testFutureOfFuture();
+
   asyncEnd();
 }
 
diff --git a/tests/lib_2/async/null_future_zone_test.dart b/tests/lib_2/async/null_future_zone_test.dart
new file mode 100644
index 0000000..802c399
--- /dev/null
+++ b/tests/lib_2/async/null_future_zone_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import 'dart:async';
+
+main() {
+  asyncStart(2);
+  () async {
+    var it = new StreamIterator(new Stream.fromIterable([]));
+    Expect.isFalse(await it.moveNext());
+
+    Future nullFuture;
+    Future falseFuture;
+
+    runZoned(() {
+      nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
+      falseFuture = it.moveNext();
+    }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
+        (Zone self, ZoneDelegate parent, Zone zone, void f()) {
+      Expect.fail("Should not be called");
+    }));
+
+    nullFuture.then((value) {
+      Expect.isNull(value);
+      asyncEnd();
+    });
+
+    falseFuture.then((value) {
+      Expect.isFalse(value);
+      asyncEnd();
+    });
+  }();
+}
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 29d88bc..249a438 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -119,6 +119,7 @@
 isolate/spawn_uri_multi_test/none: RuntimeError # Issue 13544
 
 [ !$strong ]
+async/future_test: SkipByDesign # Uses Dart 2 syntax.
 async/stream_first_where_test/badType: MissingCompileTimeError
 async/stream_last_where_test/badType: MissingCompileTimeError
 mirrors/redirecting_factory_different_type_test/02: MissingCompileTimeError
@@ -245,6 +246,8 @@
 
 [ $hot_reload || $hot_reload_rollback ]
 async/stream_transformer_test: Pass, Fail # Closure identity
+convert/chunked_conversion_utf88_test: SkipSlow
+convert/utf85_test: SkipSlow
 isolate/deferred_in_isolate2_test: Crash # Requires deferred libraries
 isolate/deferred_in_isolate_test: Crash # Requires deferred libraries
 isolate/function_send_test: Pass, Fail # Closure identity
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 0ddba1c..9e3bf1c 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -471,18 +471,17 @@
 html/element_types_shadow_test: RuntimeError # Issue 29922
 html/file_sample_test: Skip # FileSystem not supported on Safari.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on Safari
-html/js_mock_test: RuntimeError # Issue 32286
 html/storage_promise_test: RuntimeError # Not supported on Safari
 html/xhr_test: RuntimeError
 
 [ $compiler == dart2js && $runtime == safari && $strong ]
+html/audiobuffersourcenode_test: Pass, RuntimeError
 html/canvasrenderingcontext2d_test/arc: Pass, RuntimeError
 html/canvasrenderingcontext2d_test/drawImage_canvas_element: Pass, RuntimeError
 html/canvasrenderingcontext2d_test/drawImage_image_element: Pass, RuntimeError
 html/canvasrenderingcontext2d_test/fillText: Pass, RuntimeError
-html/form_data_test/functional: RuntimeError
+html/interactive_media_test: SkipSlow
 html/notification_test: Pass, RuntimeError # Safari doesn't let us access the fields of the Notification to verify them.
-html/xhr_cross_origin_test/functional: RuntimeError
 
 [ $compiler == dart2js && $runtime == safari && !$strong ]
 convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
@@ -513,7 +512,6 @@
 [ $compiler == dart2js && $browser && $strong ]
 html/element_classes_svg_test: RuntimeError
 html/js_array_test: RuntimeError
-html/js_mock_test: RuntimeError
 html/typed_arrays_range_checks_test: RuntimeError
 
 [ $compiler == dart2js && $checked ]
@@ -823,8 +821,6 @@
 
 [ $compiler == dart2js && $strong ]
 async/future_or_type_test: RuntimeError
-async/future_test/01: RuntimeError
-async/future_test/none: RuntimeError
 async/slow_consumer2_test: RuntimeError
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 5a926e1..b4b3d70 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -14,10 +14,6 @@
 convert/chunked_conversion_utf87_test: RuntimeError
 convert/utf82_test: RuntimeError
 html/debugger_test: CompileTimeError
-math/double_pow_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-typed_data/int32x4_arithmetic_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-typed_data/int32x4_arithmetic_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 
 [ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/element_animate_test/timing_dict: RuntimeError # Issue 29922
@@ -102,6 +98,7 @@
 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/double_pow_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 math/low_test: RuntimeError # Issue 29922
 math/random_big_test: RuntimeError # Issue 29922
 mirrors/*: SkipByDesign # Mirrors not supported on web in Dart 2.0.
@@ -115,6 +112,9 @@
 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/int32x4_arithmetic_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 typed_data/int64_list_load_store_test: RuntimeError # Issue 29922
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 29922
 typed_data/unmodifiable_typed_data_test: RuntimeError # Issue 10275
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 4257d48..29fd51d 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -11,8 +11,6 @@
 # to add them.
 
 [ $compiler == app_jitk ]
-async/future_test/01: RuntimeError
-async/future_test/none: RuntimeError
 async/slow_consumer2_test: RuntimeError
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
@@ -196,17 +194,11 @@
 [ $compiler == dartk && $system == windows ]
 isolate/ping_pause_test: Skip # Issues 32137 and 32138
 
-[ $compiler == dartk && $hot_reload ]
-isolate/message4_test: Pass, Timeout
-
 [ $compiler == dartk && $hot_reload_rollback ]
 isolate/illegal_msg_function_test: Skip # Timeout
-isolate/message4_test: Pass, Timeout
 isolate/pause_test: Skip # Timeout
 
 [ $compiler == dartk && $strong ]
-async/future_test/01: RuntimeError
-async/future_test/none: RuntimeError
 async/slow_consumer2_test: RuntimeError # Issue 31402 (Invocation arguments)
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
@@ -289,6 +281,7 @@
 isolate/issue_21398_parent_isolate1_test: Skip # Timeout
 isolate/mandel_isolate_test: Skip # Timeout
 isolate/message2_test: Skip # Timeout
+isolate/message4_test: Pass, Timeout, Crash # Timeout and sporadic crash (issue 33824)
 isolate/nested_spawn2_test: Skip # Timeout
 isolate/nested_spawn_test: Skip # Timeout
 isolate/raw_port_test: Skip # Timeout
@@ -307,8 +300,6 @@
 
 # ===== dartkp + dart_precompiled status lines =====
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
-async/future_test/01: RuntimeError
-async/future_test/none: RuntimeError
 async/slow_consumer2_test: RuntimeError # Issue 31402 (Invocation arguments)
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
diff --git a/tests/lib_2/mirrors/dynamic_load_test.dart b/tests/lib_2/mirrors/dynamic_load_test.dart
index 2605b8b..dddb1ac 100644
--- a/tests/lib_2/mirrors/dynamic_load_test.dart
+++ b/tests/lib_2/mirrors/dynamic_load_test.dart
@@ -43,6 +43,7 @@
   }
   print(error);
   Expect.isTrue(error.toString().contains("Cannot open file") ||
+      error.toString().contains("file not found") ||
       error.toString().contains("No such file or directory") ||
       error.toString().contains("The system cannot find the file specified"));
   Expect.isTrue(error.toString().contains("DOES_NOT_EXIST"));
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index a80c78b..965c602 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -94,12 +94,6 @@
 [ $runtime == none && !$strong ]
 io/process_exit_negative_test: Fail, OK # Must be run to exit with non-zero exit code.
 
-# These tests spawn a process that imports using a http URL, since
-# spawned processes now run in Dart2 mode the tests fail as http URL imports
-# is not supported by the front end.
-[ $runtime == vm && ($compiler == app_jit || $compiler == none) ]
-http_launch_test: RuntimeError # Issue 33388
-
 [ $system == linux && ($runtime == flutter || $runtime == vm) ]
 io/http_basic_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
 io/http_launch_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
@@ -179,7 +173,10 @@
 deferred_transitive_import_error_test: Crash
 fragmentation_test: Pass, Crash # Issue 31421
 io/addlatexhash_test: Pass, Crash # Issue 31252
+io/many_directory_operations_test: SkipSlow
+io/many_file_operations_test: SkipSlow
 io/raw_datagram_read_all_test: Pass, Fail # Timing dependent.
-io/skipping_dart2js_compilations_test: Pass, Slow # Slow.
-io/test_runner_test: Pass, Slow # Slow.
+io/skipping_dart2js_compilations_test: SkipSlow
+io/test_runner_test: SkipSlow
 package/*: SkipByDesign # Launches VMs in interesting ways.
+typed_data_isolate_test: SkipSlow
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 2dbeff7..201fe64 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -11,7 +11,6 @@
 # to add them.
 
 [ $compiler == app_jitk ]
-http_launch_test: RuntimeError # Issue 33388
 io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
@@ -24,6 +23,7 @@
 io/http_redirect_test: RuntimeError
 io/http_reuse_server_port_test: RuntimeError
 io/http_server_response_test: RuntimeError
+io/named_pipe_script_test: RuntimeError # Issue 33842
 io/platform_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/secure_socket_argument_test: CompileTimeError
@@ -46,6 +46,9 @@
 package/scenarios/invalid/invalid_utf8_test: CompileTimeError # Issue 32085
 package/scenarios/invalid/non_existent_packages_file_test: CompileTimeError # Issue 32085
 
+[ $arch == simarm64 && $compiler == dartk && $strong ]
+io/http_bind_test: Pass, Slow
+
 [ $builder_tag == optimization_counter_threshold && $compiler == dartk ]
 map_insert_remove_oom_test: Skip # Heap limit too low.
 
@@ -62,11 +65,9 @@
 io/socket_port_test: Pass, Crash
 
 [ $compiler == dartk && $mode == debug && $hot_reload ]
-io/http_basic_test: Crash
 io/web_socket_ping_test: Crash, Pass
 
 [ $compiler == dartk && $runtime == vm && $strong ]
-http_launch_test: RuntimeError # Issue 33388
 io/http_client_request_test: Pass, Timeout
 io/http_compression_test: RuntimeError
 io/platform_resolved_executable_test/03: Pass, RuntimeError
@@ -93,6 +94,7 @@
 
 [ $compiler == dartk && $hot_reload_rollback ]
 io/directory_chdir_test: Skip # Timeout
+io/echo_server_stream_test: Pass, Slow
 
 # 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
@@ -103,8 +105,6 @@
 io/directory_list_sync_test: Timeout, Pass # Please triage.
 io/file_blocking_lock_test: Pass, Crash # Please triage.
 io/file_lock_test: Slow, Pass
-io/platform_resolved_executable_test/01: Pass, RuntimeError # Issue 32134
-io/platform_resolved_executable_test/05: Pass, RuntimeError # Issue 32134
 io/platform_test: RuntimeError # Please triage.
 io/process_sync_test: Timeout, Pass
 io/test_extension_fail_test: RuntimeError # Please traige.
@@ -123,6 +123,7 @@
 io/http_advanced_test: Skip # Timeout
 io/http_auth_digest_test: Crash
 io/http_auth_test: Skip # Timeout
+io/http_basic_test: Pass, Crash # Sporadic crash, issue 33824
 io/http_proxy_advanced_test: Skip # Timeout
 io/http_read_test: Skip # Timeout
 io/non_utf8_directory_test: Pass, Timeout
@@ -195,6 +196,9 @@
 io/secure_socket_argument_test: CompileTimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 
+[ $system != windows && $strong && ($compiler == dartk || $compiler == dartkp) ]
+io/named_pipe_script_test: RuntimeError # Issue 33842
+
 [ $fasta && $strong ]
 package/package_isolate_test: CompileTimeError
 
diff --git a/tests/standalone_2/standalone_2_vm.status b/tests/standalone_2/standalone_2_vm.status
index 729da33..cd92c8e 100644
--- a/tests/standalone_2/standalone_2_vm.status
+++ b/tests/standalone_2/standalone_2_vm.status
@@ -92,7 +92,6 @@
 io/file_input_stream_test: Skip # Issue 26109
 io/file_stream_test: Skip # Issue 26109
 io/file_typed_data_test: Skip # Issue 26109
-io/http_client_stays_alive_test: RuntimeError
 io/process_sync_test: Timeout, Pass
 
 [ $runtime == vm && ($arch == simarm || $arch == simarm64) ]
diff --git a/third_party/pkg/unittest.tar.gz.sha1 b/third_party/pkg/unittest.tar.gz.sha1
deleted file mode 100644
index 08c01a5..0000000
--- a/third_party/pkg/unittest.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f59bbc8788aa01618a5b7f143ef7c82068c86b0f
\ No newline at end of file
diff --git a/tools/3xhead_flutter_hooks.sh b/tools/3xhead_flutter_hooks.sh
new file mode 100644
index 0000000..a075705
--- /dev/null
+++ b/tools/3xhead_flutter_hooks.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+#
+# After you have checked out a flutter engine with the latest framework and the
+# latest dart sdk, run this script to apply workarounds to the source code. It
+# may patch up the source code so the three HEADs work together correctly.
+#
+# Usage: src/third_party/dart/tools/3xhead_flutter_hooks.sh
+# (run inside the root of a flutter engine checkout)
+
+set -e
+if [ ! -e src/third_party/dart ]; then
+  echo "$0: error: "\
+       "This script must be run from the root of a flutter engine checkout" >&2
+  exit 1
+fi
+
+# Apply patches to the Flutter Engine if needed.
+src/third_party/dart/tools/patches/flutter-engine/apply.sh
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index 4632769..fbe07a6 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -23,3 +23,4 @@
 Trigger mirroring of github repository
 Trigger mirroring of github repository
 Force build after DEPS format revert
+Force build while trybots are broken, to check builders for brokenness.
diff --git a/tools/VERSION b/tools/VERSION
index 2af778a..aa8aef1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 68
+PRERELEASE 69
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 71334db..ab78eda 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -312,8 +312,7 @@
           "name": "fasta sdk tests",
           "arguments": [
             "--compiler=fasta",
-            "--runtime=none",
-            "--strong"
+            "--runtime=none"
           ]
         },
         {
@@ -323,14 +322,6 @@
             "--runtime=none",
             "co19_2"
           ]
-        },
-        {
-          "name": "fasta legacy mode sdk tests",
-          "arguments": [
-            "--compiler=fasta",
-            "--no-preview-dart-2",
-            "--runtime=none"
-          ]
         }
       ]
     },
@@ -693,7 +684,6 @@
           "arguments": [
             "-cdartdevc",
             "--checked",
-            "--strong",
             "--use-sdk",
             "language_2",
             "corelib_2",
@@ -705,7 +695,6 @@
           "arguments": [
             "-cdartdevk",
             "--checked",
-            "--strong",
             "--use-sdk",
             "language_2",
             "corelib_2",
@@ -764,7 +753,6 @@
           "arguments": [
             "-cdartdevc",
             "--checked",
-            "--strong",
             "--use-sdk",
             "language_2",
             "corelib_2",
@@ -776,7 +764,6 @@
           "arguments": [
             "-cdartdevk",
             "--checked",
-            "--strong",
             "--use-sdk",
             "language_2",
             "corelib_2",
@@ -922,7 +909,6 @@
           "arguments": [
             "--builder-tag=optimization_counter_threshold",
             "--compiler=dartk",
-            "--strong",
             "--vm-options=--optimization-counter-threshold=5"
           ],
           "fileset": "vm-kernel",
@@ -974,7 +960,7 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--compiler=dartk", "--hot-reload", "--strong"]
+          "arguments": ["--compiler=dartk", "--hot-reload"]
         }
       ]
     },
@@ -1022,7 +1008,7 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--compiler=dartk", "--hot-reload-rollback", "--strong"]
+          "arguments": ["--compiler=dartk", "--hot-reload-rollback"]
         }
       ]
     },
@@ -1943,30 +1929,145 @@
           "script": "tools/build.py",
           "arguments": ["create_sdk"]
         },
+
         {
-          "name": "Analyze pkg/analysis_server",
+          "name": "analyze pkg/analysis_server",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": ["--no-hints","pkg/analysis_server"]
+          "arguments": ["pkg/analysis_server"]
         },
         {
-          "name": "Analyze pkg/analyzer",
+          "name": "analyze pkg/analysis_server_client",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": ["--no-hints","pkg/analyzer"]
+          "arguments": ["pkg/analysis_server_client"]
         },
         {
-          "name": "analyze tests",
-          "arguments": [
-            "--compiler=dart2analyzer",
-            "--use-sdk"
-          ]
+          "name": "analyze pkg/analyzer",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/analyzer"]
         },
         {
-          "name": "analyze pkg tests",
-          "arguments": [
-            "--compiler=dart2analyzer",
-            "--use-sdk",
-            "pkg"
-          ]
+          "name": "analyze pkg/analyzer_cli",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/analyzer_cli"]
+        },
+        {
+          "name": "analyze pkg/analyzer_plugin",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/analyzer_plugin"]
+        },
+        {
+          "name": "analyze pkg/async_helper",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/async_helper"]
+        },
+        {
+          "name": "analyze pkg/build_integration",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/build_integration"]
+        },
+        {
+          "name": "analyze pkg/compiler",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/compiler"]
+        },
+        {
+          "name": "analyze pkg/dart_internal",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/dart_internal"]
+        },
+        {
+          "name": "analyze pkg/dart_messages",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/dart_messages"]
+        },
+        {
+          "name": "analyze pkg/dev_compiler",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/dev_compiler"]
+        },
+        {
+          "name": "analyze pkg/expect",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/expect"]
+        },
+        {
+          "name": "analyze pkg/front_end",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/front_end"]
+        },
+        {
+          "name": "analyze pkg/js",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/js"]
+        },
+        {
+          "name": "analyze pkg/js_ast",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/js_ast"]
+        },
+        {
+          "name": "analyze pkg/kernel",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/kernel"]
+        },
+        {
+          "name": "analyze pkg/meta",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/meta"]
+        },
+        {
+          "name": "analyze pkg/microlytics",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/microlytics"]
+        },
+        {
+          "name": "analyze pkg/smith",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/smith"]
+        },
+        {
+          "name": "analyze pkg/sourcemap_testing",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/sourcemap_testing"]
+        },
+        {
+          "name": "analyze pkg/status_file",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/status_file"]
+        },
+        {
+          "name": "analyze pkg/telemetry",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/telemetry"]
+        },
+        {
+          "name": "analyze pkg/testing",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/testing"]
+        },
+        {
+          "name": "analyze pkg/vm",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["pkg/vm"]
+        },
+        {
+          "name": "analyze tools/gardening",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["tools/gardening"]
+        },
+        {
+          "name": "analyze tools/testing/dart",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["tools/testing/dart"]
+        },
+
+        {
+          "name": "dartanalyzer --batch tests",
+          "arguments": [ "--compiler=dart2analyzer", "--use-sdk" ]
+        },
+        {
+          "name": "dartanalyzer --batch pkg tests",
+          "arguments": [ "--compiler=dart2analyzer", "--use-sdk", "pkg" ]
         }
       ]
     },
@@ -1985,7 +2086,6 @@
           "name": "analyze pkg/analysis_server",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": [
-            "--no-hints",
             "--use-fasta-parser",
             "pkg/analysis_server"
           ]
@@ -1994,18 +2094,16 @@
           "name": "analyze pkg/analyzer",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": [
-            "--no-hints",
             "--use-fasta-parser",
             "pkg/analyzer"
           ]
         },
         {
-          "name": "analyze pkg/analyzer_cli/lib",
+          "name": "analyze pkg/analyzer_cli",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": [
-            "--no-hints",
             "--use-fasta-parser",
-            "pkg/analyzer_cli/lib"
+            "pkg/analyzer_cli"
           ]
         },
         {
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index 74b7c37..f6d7009 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -28,7 +28,7 @@
       builders { name: "dart2js-unit-linux-x64-release-try" }
       builders { name: "ddc-linux-release-chrome-try" }
       builders { name: "front-end-linux-release-x64-try" }
-      builders { name: "pkg-linux-release-try" }
+      builders { name: "pkg-linux-release-try" experiment_percentage: 100}
       builders { name: "vm-canary-linux-debug-try" }
       builders { name: "vm-kernel-linux-release-simdbc64-try" }
       builders { name: "vm-kernel-linux-release-x64-try" }
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
deleted file mode 100755
index 6d9c9e5..0000000
--- a/tools/observatory_tool.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-# 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.
-"""Helper for building and deploying Observatory"""
-
-import os
-import shutil
-import sys
-
-IGNORE_PATTERNS = shutil.ignore_patterns(
-    '$sdk',
-    '*.concat.js',
-    '*.dart',
-    '*.log',
-    '*.map',
-    '*.precompiled.js',
-    '*.scriptUrls',
-    '*_buildLogs*',
-    '*~',
-    'CustomElements.*',
-    'HTMLImports.*',
-    'MutationObserver.*',
-    'ShadowDOM.*',
-    'bower.json',
-    'dart_support.*',
-    'interop_support.*',
-    'package.json',
-    'unittest*',
-    'webcomponents-lite.js',
-    'webcomponents.*')
-
-# - Copy over the filtered web directory
-# - Merge in the .js file
-# - Copy over the filtered dependency lib directories
-# - Copy over the filtered observatory package
-def Deploy(output_dir, web_dir, observatory_lib, js_file, pub_packages_dir):
-  shutil.rmtree(output_dir)
-  os.makedirs(output_dir)
-
-  output_web_dir = os.path.join(output_dir, 'web')
-  shutil.copytree(web_dir, output_web_dir, ignore=IGNORE_PATTERNS)
-  os.utime(os.path.join(output_web_dir, 'index.html'), None)
-
-  shutil.copy(js_file, output_web_dir)
-
-  packages_dir = os.path.join(output_web_dir, 'packages')
-  os.makedirs(packages_dir)
-  for subdir in os.listdir(pub_packages_dir):
-    libdir = os.path.join(pub_packages_dir, subdir, 'lib')
-    if os.path.isdir(libdir):
-      shutil.copytree(libdir, os.path.join(packages_dir, subdir),
-                      ignore=IGNORE_PATTERNS)
-  shutil.copytree(observatory_lib, os.path.join(packages_dir, 'observatory'),
-                  ignore=IGNORE_PATTERNS)
-
-
-def Main():
-  args = sys.argv[1:]
-  return Deploy(args[0], args[1], args[2], args[3], args[4])
-
-
-if __name__ == '__main__':
-  sys.exit(Main());
diff --git a/tools/patches/flutter-engine/apply.sh b/tools/patches/flutter-engine/apply.sh
new file mode 100755
index 0000000..984576a
--- /dev/null
+++ b/tools/patches/flutter-engine/apply.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+#
+# When in a Flutter Engine checkout, this script checks what version of the Dart
+# SDK the engine is pinned to, and patches the engine if there is a known patch
+# that needs to be applied on the next Dart SDK roll in the engine.
+#
+# This script is meant to be used by 3xHEAD CI infrastructure, allowing
+# incompatible changes to be made to the Dart SDK requiring a matching change
+# to the Flutter Engine, without breaking the CI. The patch is associated with
+# the Dart SDK version the engine is pinned so. When the engine rolls its SDK,
+# then it stops applying patches atomically as there isn't a patch available yet
+# for the new roll.
+#
+# Usage: src/third_party/dart/tools/patches/flutter-engine/apply.sh
+# (run inside the root of a flutter engine checkout)
+
+set -e
+if [ ! -e src/third_party/dart ]; then
+  echo "$0: error: "\
+       "This script must be run from the root of a flutter engine checkout" >&2
+  exit 1
+fi
+pinned_dart_sdk=$(grep -E "'dart_revision':.*" src/flutter/DEPS |
+                  sed -E "s/.*'([^']*)',/\1/")
+patch=src/third_party/dart/tools/patches/flutter-engine/${pinned_dart_sdk}.patch
+if [ -e "$patch" ]; then
+  (cd src/flutter && git apply ../../$patch)
+  gclient runhooks
+fi
diff --git a/tools/patches/flutter-engine/create.sh b/tools/patches/flutter-engine/create.sh
new file mode 100755
index 0000000..d9bc6fd
--- /dev/null
+++ b/tools/patches/flutter-engine/create.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for 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 script produces a patch to the Flutter Engine from the local uncommitted
+# changes in the current engine checkout. It is named after the Dart SDK
+# revision the engine is currently pinned to. It's meant to be consumed by the
+# apply.sh script next to this script. Any existing patches are removed, as they
+# are assumed to not be relevant anymore. If there are no uncommited changes in
+# the local engine checkout, then no patch is produced.
+#
+# Usage: src/third_party/dart/tools/patches/flutter-engine/create.sh
+# (run inside the root of a flutter engine checkout)
+
+set -e
+if [ ! -e src/third_party/dart ]; then
+  echo "$0: error: "\
+       "This script must be run from the root of a flutter engine checkout" >&2
+  exit 1
+fi
+pinned_dart_sdk=$(grep -E "'dart_revision':.*" src/flutter/DEPS |
+                  sed -E "s/.*'([^']*)',/\1/")
+patch=src/third_party/dart/tools/patches/flutter-engine/$pinned_dart_sdk.patch
+rm -f src/third_party/dart/tools/patches/flutter-engine/*.patch
+(cd src/flutter && git diff) > $patch
+if [ ! -s $patch ]; then
+  rm $patch
+fi
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 439f46c..f3635c7 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -492,6 +492,15 @@
         .absolute
         .toNativePath();
 
+    // If we're testing a built SDK use the SDK path. This will test that we can
+    // find the summary file from that. For local development we don't have a
+    // built SDK yet, so point directly at the built summary file.
+    //
+    // TODO(jmesserly): ideally we'd test the `dartdevc` script/.bat file.
+    // That's the closest to what users/tools use. That script has its own way
+    // of computing `--dart-sdk` and passing it to DDC. For simplicitly that
+    // script should be passing `--dart-sdk-summary`, that way DDC doesn't need
+    // two options for the same thing.
     var args = _useSdk
         ? ["--dart-sdk", "${_configuration.buildDirectory}/dart-sdk"]
         : ["--dart-sdk-summary", sdkSummary];
diff --git a/utils/analysis_server/.gitignore b/utils/analysis_server/.gitignore
deleted file mode 100644
index 010faca..0000000
--- a/utils/analysis_server/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/analysis_server.Makefile
-/analysis_server.target.mk
-
diff --git a/utils/analysis_server_dart1/BUILD.gn b/utils/analysis_server_dart1/BUILD.gn
new file mode 100644
index 0000000..dee8bbd
--- /dev/null
+++ b/utils/analysis_server_dart1/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+import("../application_snapshot.gni")
+
+application_snapshot("analysis_server_dart1") {
+  dart_version = 1
+  main_dart = "../../pkg/analysis_server/bin/server.dart"
+  training_args = [ "--help" ]
+}