Version 2.1.0-dev.6.0

Merge commit 'c23a9815ec071ece905740801fd1499bcab27729' into dev
diff --git a/BUILD.gn b/BUILD.gn
index 6f97c3c..6a4a55e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -36,9 +36,6 @@
 group("runtime") {
   import("runtime/runtime_args.gni")
 
-  target_supports_aot = dart_target_arch == "arm" ||
-                        dart_target_arch == "arm64" || dart_target_arch == "x64"
-
   if (targetting_fuchsia) {
     # Fuchsia has run_vm_tests marked testonly.
     testonly = true
@@ -53,9 +50,6 @@
     "runtime/vm:kernel_platform_files($host_toolchain)",
     "utils/kernel-service:kernel-service",
   ]
-  if (target_supports_aot) {
-    deps += [ "runtime/bin:precompiler_entry_points_json" ]
-  }
 }
 
 group("runtime_kernel") {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 36b3269..b6949d9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.1.0-dev.6.0
+
 ## 2.1.0-dev.5.0
 
 ### Core library changes
diff --git a/DEPS b/DEPS
index cc19e00..efd5aea 100644
--- a/DEPS
+++ b/DEPS
@@ -78,9 +78,9 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "6f3efd209ff1828835936397b64be79265cc0c19",  # Please see the note above before updating.
+  "dart_style_tag": "1.2.0",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.20.4",
+  "dartdoc_tag" : "v0.21.1",
   "fixnum_tag": "0.10.8",
   "func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "1.1.7",
@@ -95,7 +95,7 @@
   "intl_tag": "0.15.6",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.62",
+  "linter_tag": "0.1.63",
   "logging_tag": "0.11.3+2",
   "markdown_tag": "2.0.2",
   "matcher_tag": "0.12.3",
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index a7e9cb7..d6c265d 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -1,6 +1,5 @@
-\def\code#1{\textsf{#1}}
-\def\builtinId#1{\code{\textbf{#1}}}
-\def\keyword#1{\code{\textbf{#1}}}
+\def\builtinId#1{\textsf{\textbf{#1}}}
+\def\keyword#1{\textsf{\textbf{#1}}}
 \def\metavar#1{\ensuremath{\mathit{#1}}}
 
 \def\ABSTRACT{\builtinId{abstract}}
@@ -66,20 +65,16 @@
 \def\WITH{\keyword{with}}
 \def\YIELD{\keyword{yield}}
 
+% Used for inline code snippets.
+\def\code#1{\texttt{#1}}
+
 % `call` has no special lexical status, so we just use \code{}.
 \def\CALL{\code{call}}
 
-% Used in regular text to indicate that #1 consists of non-terminals.
-%% TODO(eernst): Update to use grammar font when we start using that;
-%% at this point we just make it "regular text" using \mbox.
-\newcommand{\NonTerminal}[1]{\mbox{#1}}
-
-% Angle brackets used for operators in grammar context.
-\def\lt{\ensuremath{<}}
-\def\gt{\ensuremath{>}}
-
-% A quoted comma as used in the grammar: needs spacing fix.
-\newcommand{\gcomma}{\mbox{`,\hspace{-0.1em}'}}
+% Define commands for `<<`, `>>`, `>>>` that avoid introducing guillemets.
+\def\ltlt{<\mbox <}
+\def\gtgt{>\mbox >}
+\def\gtgtgt{>\mbox >\mbox >}
 
 % Used as line break in the right hand side of a grammar
 % alternative, that is, when starting a "continuation line".
@@ -102,15 +97,15 @@
 \newcommand{\Case}[1]{\textbf{Case }$\langle\hspace{0.1em}${#1}$\hspace{0.1em}\rangle$\textbf{.}}
 
 \newenvironment{dartCode}[1][!ht] {
-%  \begin{verbatim}[#1]
-  \def\@programcr{\@addfield\strut}
-  \let\\=\@programcr
-  \relax\@vobeyspaces\obeylines
+  \def\@programcr{\@addfield\strut}%
+  \let\\=\@programcr%
+  \relax\@vobeyspaces\obeylines%
+  \ttfamily%
+  \vspace{1em}
+}{\vspace{1em}}
 
-  \sffamily
-}{
-  %\end{verbatim}
-}
+% Used for comments in a code context.
+\def\comment#1{\textsf{#1}}
 
 % A commonly used name for an identifier
 \newcommand{\id}{\metavar{id}}
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index b37d438..72d9f1d 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -1,14 +1,15 @@
 \documentclass{article}
 \usepackage{epsfig}
 \usepackage{color}
+\usepackage{syntax}
 \usepackage{dart}
-\usepackage{bnf}
 \usepackage{hyperref}
 \usepackage{lmodern}
 \usepackage[T1]{fontenc}
 \title{Dart Programming Language Specification\\
 {5th edition draft}\\
 {\large Version 2.1.0-dev}}
+\author{}
 
 % For information about Location Markers (and in particular the
 % commands \LMHash and \LMLabel), see the long comment at the
@@ -56,6 +57,8 @@
 %   \ref{unqualifiedInvocation}, \ref{functionExpressionInvocation},
 %   \ref{superInvocations}, \ref{assignment}, \ref{compoundAssignment},
 %   \ref{localVariableDeclaration}, and \ref{return}.
+% - Corrected error involving multiple uses of the same part in the same
+%   program such that it takes exports into account.
 %
 % 2.0
 % - Don't allow functions as assert test values.
@@ -263,18 +266,16 @@
 }
 
 \begin{grammar}
-{\sf
-{\bf AProduction:}AnAlternative;
-  AnotherAlternative;
-  OneThing After Another;
-  ZeroOrMoreThings*;
-  OneOrMoreThings+;
-  AnOptionalThing?;
-  (Some Grouped Things);
-  \~{}NotAThing;
-  A\_LEXICAL\_THING
-  .
-}
+<aProduction> ::= <anAlternative>
+  \alt <anotherAlternative>
+  \alt <oneThing> <after> <another>
+  \alt <zeroOrMoreThings>*
+  \alt <oneOrMoreThings>+
+  \alt <anOptionalThing>?
+  \alt (<some> <grouped> <things>)
+  \alt \~{}<notAThing>
+  \alt `aTerminal'
+  \alt <A\_LEXICAL\_THING>
 \end{grammar}
 
 \LMHash{}
@@ -624,44 +625,46 @@
 Variables are storage locations in memory.
 
 \begin{grammar}
-{\bf variableDeclaration:}declaredIdentifier (`,' identifier)*
-  .
+<variableDeclaration> ::= <declaredIdentifier> (`,' <identifier>)*
 
-{\bf declaredIdentifier:}metadata finalConstVarOrType identifier
-  .
+<declaredIdentifier> ::= <metadata> <finalConstVarOrType> <identifier>
 
-{\bf finalConstVarOrType:}\FINAL{} type?;
-  \CONST{} type?;
-  varOrType
-  .
+<finalConstVarOrType> ::= \FINAL{} <type>?
+  \alt \CONST{} <type>?
+  \alt <varOrType>
 
-{\bf varOrType:}\VAR{};
-  type
-  .
+<varOrType> ::= \VAR{}
+  \alt <type>
 
-{\bf initializedVariableDeclaration:}declaredIdentifier (`=' expression)? (`,' initializedIdentifier)*
-  .
+<initializedVariableDeclaration> ::=
+  <declaredIdentifier> (`=' <expression>)? (`,' <initializedIdentifier>)*
 
-{\bf initializedIdentifier:}identifier (`=' expression)?
-  .
+<initializedIdentifier> ::= <identifier> (`=' <expression>)?
 
-{\bf initializedIdentifierList:}initializedIdentifier (`,' initializedIdentifier)*
-  .
+<initializedIdentifierList> ::= <initializedIdentifier> (`,' <initializedIdentifier>)*
 \end{grammar}
 
 \LMHash{}
 A variable declaration that contains one or more terms of the form
-\NonTerminal{initializedIdentifier}
+\syntax{<identifier>}
 (\commentary{i.e., a declaration that declares two or more variables})
 is equivalent to multiple variable declarations declaring
 the same set of variable names in the same order,
+with the same type and modifiers.
+
+\LMHash{}
+An initialized variable declaration that contains one or more terms of the form
+\syntax{<initializedIdentifier>}
+(\commentary{a declaration that declares two or more initialized variables})
+is equivalent to multiple variable declarations declaring
+the same set of variable names in the same order,
 with the same initialization, type, and modifiers.
 
 \commentary{
 For example,
-\code{\VAR{} x = 1, y;}
+\code{\VAR{} x, y;}
 is equivalent to
-\code{\VAR{} x = 1; \VAR{} y;}
+\code{\VAR{} x; \VAR{} y;}
 and
 \code{\STATIC{} \FINAL{} String s1, s2 = "foo";}
 is equivalent to
@@ -673,7 +676,7 @@
 \code{$N$ $v$;}
 \code{$N$ $v$ = $e$;}
 where $N$ is derived from
-\NonTerminal{metadata finalConstVarOrType},
+\syntax{<metadata> <finalConstVarOrType>},
 we say that $v$ is the {\em declaring occurrence} of the identifier.
 For every identifier which is not a declaring occurrence,
 we say that it is an {\em referencing occurrence}.
@@ -684,7 +687,7 @@
 In an expression of the form \code{$e$.\id} it is possible that
 $e$ has static type \DYNAMIC{} and \id{} cannot be associated with
 any declaration named \id{} at compile-time,
-but in this situation \id{} is still an referencing identifier.
+but in this situation \id{} is still a referencing identifier.
 }
 
 \LMHash{}
@@ -916,22 +919,17 @@
 Functions abstract over executable actions.
 
 \begin{grammar}
-{\bf functionSignature:}metadata returnType? identifier formalParameterPart
-  .
+<functionSignature> ::= <metadata> <returnType>? <identifier> <formalParameterPart>
 
-{\bf formalParameterPart:}typeParameters? formalParameterList
-  .
+<formalParameterPart> ::= <typeParameters>? <formalParameterList>
 
-{\bf returnType:}\VOID{};
-  type
-  .
+<returnType> ::= \VOID{}
+  \alt <type>
 
-{\bf functionBody:}\ASYNC{}? `={\escapegrammar \gt}' expression `{\escapegrammar ;}';
-  (\ASYNC{} $|$ \ASYNC* $|$ \SYNC*)? block
-  .
+<functionBody> ::= \ASYNC{}? `=>' <expression> `;'
+  \alt (\ASYNC{} | \ASYNC `*' | \SYNC `*')? <block>
 
-{\bf block:}`\{' statements `\}'
-  .
+<block> ::= `{' <statements> `}'
 \end{grammar}
 
 \LMHash{}
@@ -950,7 +948,7 @@
 and it always specifies its formal parameter list.
 A function body is either:
 \begin{itemize}
-\item A block statement (\ref{blocks}) containing the statements (\ref{statements}) executed by the function, optionally marked with one of the modifiers: \ASYNC, \ASYNC* or \SYNC*.
+\item A block statement (\ref{blocks}) containing the statements (\ref{statements}) executed by the function, optionally marked with one of the modifiers: \ASYNC, \code{\ASYNC*} or \code{\SYNC*}.
 
   \commentary{
   Because Dart is optionally typed, we cannot guarantee that a function that does not return a value will not be used in the context of an expression.
@@ -978,9 +976,9 @@
 \end{itemize}
 
 \LMHash{}
-A function is {\em asynchronous} if its body is marked with the \ASYNC{} or \ASYNC* modifier.
+A function is {\em asynchronous} if its body is marked with the \ASYNC{} or \code{\ASYNC*} modifier.
 Otherwise the function is {\em synchronous}.
-A function is a {\em generator} if its body is marked with the \SYNC* or \ASYNC* modifier.
+A function is a {\em generator} if its body is marked with the \code{\SYNC*} or \code{\ASYNC*} modifier.
 
 \commentary{
 Whether a function is synchronous or asynchronous is orthogonal to whether it is a generator or not.
@@ -991,7 +989,7 @@
 }
 
 \LMHash{}
-It is a compile-time error if an \ASYNC, \ASYNC* or \SYNC* modifier is attached to the body of a setter or constructor.
+It is a compile-time error if an \ASYNC, \code{\ASYNC*} or \code{\SYNC*} modifier is attached to the body of a setter or constructor.
 
 \rationale{
 An asynchronous setter would be of little use, since setters can only be used in the context of an assignment (\ref{assignment}),
@@ -1004,15 +1002,15 @@
 If you need to produce an object asynchronously, use a method.
 
 One could allow modifiers for factories.
-A factory for \code{Future} could be modified by \ASYNC{}, a factory for \code{Stream} could be modified by \ASYNC* and a factory for \code{Iterable} could be modified by \SYNC*.
+A factory for \code{Future} could be modified by \ASYNC{}, a factory for \code{Stream} could be modified by \code{\ASYNC*} and a factory for \code{Iterable} could be modified by \code{\SYNC*}.
 No other scenario makes sense because the object returned by the factory would be of the wrong type.
 This situation is very unusual so it is not worth making an exception to the general rule for constructors in order to allow it.
 }
 
 \LMHash{}
 It is a compile-time error if the declared return type of a function marked \ASYNC{} is not a supertype of \code{Future<$T$>} for some type $T$.
-It is a compile-time error if the declared return type of a function marked \SYNC* is not a supertype of \code{Iterable<$T$>} for some type $T$.
-It is a compile-time error if the declared return type of a function marked \ASYNC* is not a supertype of \code{Stream<$T$>} for some type $T$.
+It is a compile-time error if the declared return type of a function marked \code{\SYNC*} is not a supertype of \code{Iterable<$T$>} for some type $T$.
+It is a compile-time error if the declared return type of a function marked \code{\ASYNC*} is not a supertype of \code{Stream<$T$>} for some type $T$.
 
 
 \subsection{Function Declarations}
@@ -1112,27 +1110,22 @@
 It is a compile-time error if a formal parameter is declared as a constant variable (\ref{variables}).
 
 \begin{grammar}
-{\bf formalParameterList:}`(' `)';
-  `(' normalFormalParameters \gcomma{}? `)';
-  `(' normalFormalParameters \gcomma{} optionalFormalParameters `)';
-  `(' optionalFormalParameters `)'
-  .
+<formalParameterList> ::= `(' `)'
+  \alt `(' <normalFormalParameters> `,'? `)'
+  \alt `(' <normalFormalParameters> `,' <optionalFormalParameters> `)'
+  \alt `(' <optionalFormalParameters> `)'
 
-{\bf normalFormalParameters:}normalFormalParameter (\gcomma{} normalFormalParameter)*
-  .
+<normalFormalParameters> ::= <normalFormalParameter> (`,' <normalFormalParameter>)*
 
-{\bf optionalFormalParameters:}optionalPositionalFormalParameters;
-  namedFormalParameters
-  .
+<optionalFormalParameters> ::= <optionalPositionalFormalParameters>
+  \alt <namedFormalParameters>
 
-{\bf optionalPositionalFormalParameters:}`[' defaultFormalParameter (\gcomma{} defaultFormalParameter)* \gcomma{}? `]'
-  .
+<optionalPositionalFormalParameters> ::= `[' <defaultFormalParameter> (`,' <defaultFormalParameter>)* `,'? `]'
 
-{\bf namedFormalParameters:}`\{' defaultNamedParameter (\gcomma{} defaultNamedParameter)* \gcomma{}? `\}'
-  .
+<namedFormalParameters> ::= `{' <defaultNamedParameter> (`,' <defaultNamedParameter>)* `,'? `}'
 \end{grammar}
 
-Formal parameter lists allow an optional trailing comma after the last parameter (\gcomma{}?).
+Formal parameter lists allow an optional trailing comma after the last parameter (\syntax{`,'?}).
 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.
 
@@ -1150,21 +1143,17 @@
 \end{itemize}
 
 \begin{grammar}
-{\bf normalFormalParameter:}functionFormalParameter;
-  fieldFormalParameter;
-  simpleFormalParameter
-  .
+<normalFormalParameter> ::= <functionFormalParameter>
+  \alt <fieldFormalParameter>
+  \alt <simpleFormalParameter>
 
-{\bf functionFormalParameter:}metadata \COVARIANT{}? returnType? identifier
-  \gnewline{} formalParameterPart
-  .
+<functionFormalParameter> ::= <metadata> \COVARIANT{}? <returnType>? <identifier>
+  \gnewline{} <formalParameterPart>
 
-{\bf simpleFormalParameter:}metadata \COVARIANT{}? finalConstVarOrType? identifier;
-  .
+<simpleFormalParameter> ::= <metadata> \COVARIANT{}? <finalConstVarOrType>? <identifier>
 
-{\bf fieldFormalParameter:}metadata finalConstVarOrType? \THIS{} `{\escapegrammar .}' identifier
-  \gnewline{} formalParameterPart?
-  .
+<fieldFormalParameter> ::= <metadata> <finalConstVarOrType>? \THIS{} `.' <identifier>
+  \gnewline{} <formalParameterPart>?
 \end{grammar}
 
 \LMHash{}
@@ -1187,22 +1176,16 @@
 Optional parameters may be specified and provided with default values.
 
 \begin{grammar}
-{\bf defaultFormalParameter:}normalFormalParameter (`=' expression)?
-  .
+<defaultFormalParameter> ::= <normalFormalParameter> (`=' <expression>)?
 
-{\bf defaultNamedParameter:}normalFormalParameter (`=' expression)?;
-  normalFormalParameter ( `{\escapegrammar :}' expression)?
-  .
+<defaultNamedParameter> ::= <normalFormalParameter> (`=' <expression>)?
+  \alt <normalFormalParameter> ( `:' <expression>)?
 \end{grammar}
 
-A {\bf defaultNamedParameter} of the form:
-\begin{code}
-   normalFormalParameter : expression
-\end{code}
+A \syntax{<defaultNamedParameter>} of the form
+\syntax{<normalFormalParameter> `:' <expression>}
 is equivalent to one of the form:
-\begin{code}
-   normalFormalParameter = expression
-\end{code}
+\syntax{<normalFormalParameter> `=' <expression>}.
 The colon-syntax is included only for backwards compatibility.
 It is deprecated and will be removed in a later version of the language specification.
 
@@ -1211,7 +1194,7 @@
 If no default is explicitly specified for an optional parameter an implicit default of \NULL{} is provided.
 
 \LMHash{}
-It is a compile-time error if the name of a named optional parameter begins with an `\_' character.
+It is a compile-time error if the name of a named optional parameter begins with an `_' character.
 
 \rationale{
 The need for this restriction is a direct consequence of the fact that naming and privacy are not orthogonal.
@@ -1323,48 +1306,41 @@
 Classes may be defined by class declarations as described below, or via mixin applications (\ref{mixinApplication}).
 
 \begin{grammar}
-{\bf classDefinition:}metadata \ABSTRACT{}? \CLASS{} identifier typeParameters?
-  \gnewline{} superclass? mixins? interfaces?
-  \gnewline{} `\{' (metadata classMemberDefinition)* `\}';
-  metadata \ABSTRACT{}? \CLASS{} mixinApplicationClass
-  .
+<classDefinition> ::= <metadata> \ABSTRACT{}? \CLASS{} <identifier> <typeParameters>?
+  \gnewline{} <superclass>? <mixins>? <interfaces>?
+  \gnewline{} `{' (<metadata> <classMemberDefinition>)* `}'
+  \alt <metadata> \ABSTRACT{}? \CLASS{} <mixinApplicationClass>
 
-{\bf mixins:}\WITH{} typeList
-  .
+<mixins> ::= \WITH{} <typeList>
 
-{\bf classMemberDefinition:}declaration `{\escapegrammar ;}' ;
-  methodSignature functionBody
-  .
+<classMemberDefinition> ::= <declaration> `;'
+  \alt <methodSignature> <functionBody>
 
-{\bf methodSignature:}constructorSignature initializers?;
-  factoryConstructorSignature;
+<methodSignature> ::= <constructorSignature> <initializers>?
+  \alt <factoryConstructorSignature>
 % This doesn't work: `static @override foo() => 42`, but `functionSignature` starts with metadata. https://github.com/dart-lang/sdk/issues/29614
-  \STATIC{}? functionSignature;
-  \STATIC{}? getterSignature;
-  \STATIC{}? setterSignature;
-  operatorSignature
-  .
+  \alt \STATIC{}? <functionSignature>
+  \alt \STATIC{}? <getterSignature>
+  \alt \STATIC{}? <setterSignature>
+  \alt <operatorSignature>
 
-{\bf declaration:}constantConstructorSignature (redirection $|$ initializers)?;
-  constructorSignature (redirection $|$ initializers)?;
-  \EXTERNAL{} constantConstructorSignature;
-  \EXTERNAL{} constructorSignature;
-  ((\EXTERNAL{} \STATIC{}?))? getterSignature;
-  ((\EXTERNAL{} \STATIC{}?))? setterSignature;
-  \EXTERNAL{}? operatorSignature;
+<declaration> ::= <constantConstructorSignature> (<redirection> | <initializers>)?
+  \alt <constructorSignature> (<redirection> | <initializers>)?
+  \alt \EXTERNAL{} <constantConstructorSignature>
+  \alt \EXTERNAL{} <constructorSignature>
+  \alt ((\EXTERNAL{} \STATIC{}?))? <getterSignature>
+  \alt ((\EXTERNAL{} \STATIC{}?))? <setterSignature>
+  \alt \EXTERNAL{}? <operatorSignature>
 % This doesn't work: `static @override foo() => 42`, but `functionSignature` starts with metadata. https://github.com/dart-lang/sdk/issues/29614
-  ((\EXTERNAL{} \STATIC{}?))? functionSignature;
-  \STATIC{} (\FINAL{} $|$ \CONST{}) type? staticFinalDeclarationList;
+  \alt ((\EXTERNAL{} \STATIC{}?))? <functionSignature>
+  \alt \STATIC{} (\FINAL{} | \CONST{}) <type>? <staticFinalDeclarationList>
 %      \CONST{} type? staticFinalDeclarationList;
-  \FINAL{} type? initializedIdentifierList;
-  (\STATIC{} $|$ \COVARIANT{})? (\VAR{} $|$ type) initializedIdentifierList
-  .
+  \alt \FINAL{} <type>? <initializedIdentifierList>
+  \alt (\STATIC{} | \COVARIANT{})? (\VAR{} | <type>) <initializedIdentifierList>
 
-{\bf staticFinalDeclarationList:}staticFinalDeclaration (\gcomma{} staticFinalDeclaration)*
-  .
+<staticFinalDeclarationList> ::= <staticFinalDeclaration> (`,' <staticFinalDeclaration>)*
 
-{\bf staticFinalDeclaration:}identifier `=' expression
-  .
+<staticFinalDeclaration> ::= <identifier> `=' <expression>
 \end{grammar}
 
 \LMHash{}
@@ -1441,13 +1417,13 @@
   \VAR{} j;
   f(x) => 3;
 \}
-
+\\
 \CLASS{} B \EXTENDS{} A \{
-  int i = 1; // getter i and setter i= override versions from A
-  \STATIC{} j; // compile-time error: static getter \& setter conflict with
-  // instance getter \& setter
-
-  /* compile-time error: static method conflicts with instance method */
+  int i = 1; // \comment{getter i and setter i= override versions from A}
+  \STATIC{} j; // \comment{compile-time error: static getter \& setter conflict with}
+  // \comment{instance getter \& setter}
+\\
+  // \comment{compile-time error: static method conflicts with instance method}
   \STATIC{} f(x) => 3;
 \}
 \end{dartCode}
@@ -1492,68 +1468,118 @@
 {\em Operators} are instance methods with special names.
 
 \begin{grammar}
-{\bf operatorSignature:}returnType? \OPERATOR{} operator formalParameterList
-  .
+<operatorSignature> ::= <returnType>? \OPERATOR{} <operator> <formalParameterList>
 
-{\bf operator:}`\~{}';
-  binaryOperator;
-  `[]' ;
-  `[]='
-  .
+<operator> ::= `~'
+  \alt <binaryOperator>
+  \alt `[]'
+  \alt `[]='
 
-{\bf binaryOperator:}multiplicativeOperator;
-  additiveOperator;
-  shiftOperator;
-  relationalOperator;
-  `==';
-  bitwiseOperator
-  .
+<binaryOperator> ::= <multiplicativeOperator>
+  \alt <additiveOperator>
+  \alt <shiftOperator>
+  \alt <relationalOperator>
+  \alt `=='
+  \alt <bitwiseOperator>
 \end{grammar}
 
 \LMHash{}
 An operator declaration is identified using the built-in identifier (\ref{identifierReference}) \OPERATOR{}.
 
 \LMHash{}
-The following names are allowed for user-defined operators: \code{<, >, <=, >=, ==, -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$, $>>>$, []=, [], \~{}}.
+The following names are allowed for user-defined operators:
+\syntax{`<'},
+\syntax{`>'},
+\syntax{`<='},
+\syntax{`>='},
+\syntax{`=='},
+\syntax{`-'},
+\syntax{`+'},
+\syntax{`/'},
+\syntax{`~'},
+\syntax{`*'},
+\syntax{`\%'},
+\syntax{`|'},
+\syntax{`^'},
+\syntax{`\&'},
+\syntax{`\ltlt'},
+\syntax{`\gtgt'},
+\syntax{`\gtgtgt'},
+\syntax{`[]='},
+\syntax{`[]'},
+\syntax{`~'}.
 
 \LMHash{}
-It is a compile-time error if the arity of the user-declared operator \code{[]=} is not 2.
-It is a compile-time error if the arity of a user-declared operator with one of the names: \code{<, >, <=, >=, ==, -, +, \~{}/, /, *, \%, $|$, \^{}, \&, $<<$, $>>$, $>>>$, []} is not 1.
-It is a compile-time error if the arity of the user-declared operator \code{-} is not 0 or 1.
+It is a compile-time error if the arity of the user-declared operator
+\syntax{`[]='} is not 2.
+It is a compile-time error if the arity of a user-declared operator with one of the names:
+\syntax{`<'},
+\syntax{`>'},
+\syntax{`<='},
+\syntax{`>='},
+\syntax{`=='},
+\syntax{`-'},
+\syntax{`+'},
+\syntax{`~/'},
+\syntax{`/'},
+\syntax{`*'},
+\syntax{`\%'},
+\syntax{`|'},
+\syntax{`^'},
+\syntax{`\&'},
+\syntax{`\ltlt'},
+\syntax{`\gtgt'},
+\syntax{`\gtgtgt'},
+\syntax{`[]'}
+is not 1.
+It is a compile-time error if the arity of the user-declared operator
+\syntax{`-'}
+is not 0 or 1.
 
 \commentary{
-The \code{-} operator is unique in that two overloaded versions are permitted.
+The \syntax{`-'} operator is unique
+in that two overloaded versions are permitted.
 If the operator has no arguments, it denotes unary minus.
 If it has an argument, it denotes binary subtraction.
 }
 
 \LMHash{}
-The name of the unary operator \code{-} is \code{unary-}.
+The name of the unary operator \syntax{`-'} is \code{unary-}.
 
 \rationale{
 This device allows the two methods to be distinguished for purposes of method lookup, override and reflection.
 }
 
 \LMHash{}
-It is a compile-time error if the arity of the user-declared operator \code{\~{}} is not 0.
+It is a compile-time error if the arity of the user-declared operator
+\syntax{`~'}
+is not 0.
 
 \LMHash{}
 It is a compile-time error to declare an optional parameter in an operator.
 
 \LMHash{}
-It is a compile-time error if the return type of a user-declared operator \code{[]=} is explicitly declared and not \VOID{}.
+It is a compile-time error if the return type of a user-declared operator
+\syntax{`[]='}
+is explicitly declared and not \VOID{}.
 
 \commentary{
-If no return type is specified for a user-declared operator \code{[]=}, its return type is \VOID{} (\ref{typeOfAFunction}).
+If no return type is specified for a user-declared operator
+\syntax{`[]='},
+its return type is \VOID{} (\ref{typeOfAFunction}).
 }
 
 \rationale{
 The return type is \VOID{} because
-a return statement in an implementation of operator \code{[]=} does not return a value.
+a return statement in an implementation of operator
+\syntax{`[]='}
+does not return a value.
 Consider a non-throwing evaluation of an expression $e$ of the form \code{$e_1$[$e_2$] = $e_3$},
 and assume that the evaluation of $e_3$ yields an instance $o$.
 $e$ will then evaluate to $o$,
-and even if the executed body of operator \code{[]=} completes with a value $o'$,
+and even if the executed body of operator
+\syntax{`[]='}
+completes with a value $o'$,
 that is, if $o'$ is returned, that value is simply ignored.
 The rationale for this behavior is that assignments should be guaranteed to evaluate to the assigned value.
 }
@@ -1566,8 +1592,7 @@
 Getters are functions (\ref{functions}) that are used to retrieve the values of object properties.
 
 \begin{grammar}
-{\bf getterSignature:}returnType? \GET{} identifier
-  .
+<getterSignature> ::= <returnType>? \GET{} <identifier>
 \end{grammar}
 
 \LMHash{}
@@ -1602,8 +1627,7 @@
 Setters are functions (\ref{functions}) that are used to set the values of object properties.
 
 \begin{grammar}
-{\bf setterSignature:}returnType? \SET{} identifier formalParameterList
-  .
+<setterSignature> ::= <returnType>? \SET{} <identifier> <formalParameterList>
 \end{grammar}
 
 \commentary{
@@ -1692,16 +1716,16 @@
 }
 
 \begin{dartCode}
-  class Base \{
-    int get one => 1;
-  \}
-
-  abstract class Mix \{
-    int get one;
-    int get two => one + one;
-  \}
-
-  class C extends Base with Mix \{ \}
+class Base \{
+  int get one => 1;
+\}
+\\
+\ABSTRACT{} \CLASS{} Mix \{
+  int get one;
+  int get two => one + one;
+\}
+\\
+\CLASS{} C extends Base with Mix \{ \}
 \end{dartCode}
 
 \rationale{
@@ -1781,8 +1805,7 @@
 A {\em generative constructor} consists of a constructor name, a constructor parameter list, and either a redirect clause or an initializer list and an optional body.
 
 \begin{grammar}
-{\bf constructorSignature:}identifier (`{\escapegrammar .}' identifier)? formalParameterList
-  .
+<constructorSignature> ::= <identifier> (`.' <identifier>)? <formalParameterList>
 \end{grammar}
 
 \LMHash{}
@@ -1858,8 +1881,7 @@
 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
-  .
+<redirection> ::= `:' \THIS{} (`.' <identifier>)? <arguments>
 \end{grammar}
 
 \def\ConstMetavar{\mbox{\CONST{}?}}
@@ -1934,25 +1956,22 @@
 \commentary{
 There are three kinds of initializers.
 \begin{itemize}
-\item A {\em superinitializer} identifies a {\em superconstructor}\,---\,that is, a specific constructor of the superclass.
+\item[$\bullet$] A {\em superinitializer} identifies a {\em superconstructor}\,---\,that is, a specific constructor of the superclass.
 Execution of the superinitializer causes the initializer list of the superconstructor to be executed.
-\item An {\em instance variable initializer} assigns a value to an individual instance variable.
-\item An assertion.
+\item[$\bullet$] An {\em instance variable initializer} assigns a value to an individual instance variable.
+\item[$\bullet$] An assertion.
 \end{itemize}
 }
 
 \begin{grammar}
-{\bf initializers:}`{\escapegrammar :}' initializerListEntry (\gcomma{} initializerListEntry)*
-  .
+<initializers> ::= `:' <initializerListEntry> (`,' <initializerListEntry>)*
 
-{\bf initializerListEntry:}\SUPER{} arguments;
-  \SUPER{} `{\escapegrammar .}' identifier arguments;
-  fieldInitializer;
-  assertion
-  .
+<initializerListEntry> ::= \SUPER{} <arguments>
+  \alt \SUPER{} `.' <identifier> <arguments>
+  \alt <fieldInitializer>
+  \alt <assertion>
 
-{\bf fieldInitializer:}(\THIS{} `{\escapegrammar .}')? identifier `=' conditionalExpression cascadeSection*
-  .
+<fieldInitializer> ::= (\THIS{} `.')? <identifier> `=' <conditionalExpression> <cascadeSection>*
 \end{grammar}
 
 \LMHash{}
@@ -2053,7 +2072,8 @@
 
 \LMHash{}
 The instance variable declarations of the immediately enclosing class are visited in the order they appear in the program text.
-For each such declaration $d$, if $d$ has the form \code{\metavar{finalConstVarOrType} $v$ = $e$; }
+For each such declaration $d$, if $d$ has the form
+\code{\syntax{finalConstVarOrType} $v$ = $e$; }
 then $e$ is evaluated to an object $o$
 and the instance variable $v$ of $i$ is bound to $o$.
 
@@ -2151,8 +2171,7 @@
 A {\em factory} is a constructor prefaced by the built-in identifier (\ref{identifierReference}) \FACTORY{}.
 
 \begin{grammar}
-{\bf factoryConstructorSignature:}\FACTORY{} identifier (`{\escapegrammar .}' identifier)? formalParameterList
-  .
+<factoryConstructorSignature> ::= \FACTORY{} <identifier> (`.' <identifier>)? <formalParameterList>
 \end{grammar}
 
 %The enclosing scope of a factory constructor is the static scope \ref{} of the class in which it is declared.
@@ -2186,9 +2205,8 @@
 A {\em redirecting factory constructor} specifies a call to a constructor of another class that is to be used whenever the redirecting constructor is called.
 
 \begin{grammar}
-{\bf redirectingFactoryConstructorSignature:}\CONST{}? \FACTORY{} identifier (`{\escapegrammar .}' identifier)? formalParameterList
-  \gnewline{} `=' type (`{\escapegrammar .}' identifier)?
-  .
+<redirectingFactoryConstructorSignature> ::= \CONST{}? \FACTORY{} <identifier> (`.' <identifier>)? <formalParameterList>
+  \gnewline{} `=' <type> (`.' <identifier>)?
 \end{grammar}
 
 Assume that
@@ -2202,7 +2220,7 @@
 \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}
@@ -2360,8 +2378,7 @@
 A constant constructor is prefixed by the reserved word \CONST{}.
 
 \begin{grammar}
-{\bf constantConstructorSignature:}\CONST{} qualified formalParameterList
-  .
+<constantConstructorSignature> ::= \CONST{} <qualified> <formalParameterList>
 \end{grammar}
 
 %\commentary{Spell out subtleties: a constant constructor call within the initializer of a constant constructor is treated as a ordinary constructor call (a new), because the arguments cannot be assumed constant anymore. In practice, this means two versions are compiled and analyzed. One for new and one for const.}
@@ -2445,9 +2462,9 @@
 \begin{dartCode}
 \CLASS{} D \{
   \FINAL{} w;
-  \CONST{} D.makeList(p): w = \CONST{} [p]; // compile-time error
-  \CONST{} D.makeMap(p): w = \CONST{} \{``help'': q\}; // compile-time error
-  \CONST{} D.makeC(p): w = \CONST{} C(p, 12); // compile-time error
+  \CONST{} D.makeList(p): w = \CONST{} [p]; // \comment{compile-time error}
+  \CONST{} D.makeMap(p): w = \CONST{} \{``help'': q\}; // \comment{compile-time error}
+  \CONST{} D.makeC(p): w = \CONST{} C(p, 12); // \comment{compile-time error}
 \}
 \end{dartCode}
 
@@ -2528,8 +2545,7 @@
 It is a compile-time error to specify an \EXTENDS{} clause for class \code{Object}.
 
 \begin{grammar}
-{\bf superclass:}\EXTENDS{} type
-  .
+<superclass> ::= \EXTENDS{} <type>
 \end{grammar}
 
 %The superclass clause of a class C is processed within the enclosing scope of the static scope of C.
@@ -2554,10 +2570,9 @@
 
 \begin{dartCode}
 class T \{\}
-
+\\
 /* Compilation error: Attempt to subclass a type parameter */
 class G<T> extends T \{\}
-
 \end{dartCode}
 
 \LMHash{}
@@ -2665,7 +2680,7 @@
   for getters, setters, methods and constructors (\ref{scoping}).
   An instance or static variable $f$ introduces a getter $f$,
   and a mutable instance or static variable $f$ also introduces a setter
-  \code{$f$=} (\ref{instanceVariables}, \ref{staticVariables}).
+  \code{$f$=} (\ref{instanceVariables}, \ref{variables}).
   When we speak of members here, we mean
   accessible instance or static variables, getters, setters, and methods
   (\ref{classes}).
@@ -2766,8 +2781,7 @@
 This set includes the interface of its superclass and the interfaces specified in the \IMPLEMENTS{} clause of the class.
 
 \begin{grammar}
-{\bf interfaces:}\IMPLEMENTS{} typeList
-  .
+<interfaces> ::= \IMPLEMENTS{} <typeList>
 \end{grammar}
 
 \LMHash{}
@@ -2798,7 +2812,7 @@
 \LMHash{}
 Let $C$ be a concrete class that does not have a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
 %% TODO(eernst): Adjust to use 'correctly overrides' terminology.
-It is a compile-time error if the implicit interface of $C$ includes an accessible instance member $m$ of type $F$,
+It is a compile-time error if the implicit interface of $C$ has an accessible instance member $m$ of type $F$,
 and $C$ does not declare or inherit a corresponding concrete instance member $m$ of type $F'$ such that $F' <: F$.
 
 \commentary{
@@ -2821,7 +2835,7 @@
 
 \LMHash{}
 %% TODO(eernst): Switch to use 'correctly overrides' terminology.
-It is a compile-time error if the implicit interface of a class $C$ includes an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if $F'$ is not a subtype of $F$.
+It is a compile-time error if the implicit interface of a class $C$ has an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if $F'$ is not a subtype of $F$.
 
 \rationale{
 However, if a class does explicitly declare a member that conflicts with its superinterface, this always yields an error.
@@ -2836,13 +2850,16 @@
 \subsection{Class Member Conflicts}
 \LMLabel{classMemberConflicts}
 
+\LMHash{}
 Some pairs of class member declarations cannot coexist,
 even though they do not both introduce the same name into the same scope.
 This section specifies these errors.
 
+\LMHash{}
 The {\em basename} of a getter or method named $n$ is $n$;
 the basename of a setter named \code{$n$=} is $n$.
 
+\LMHash{}
 Let $C$ be a class.
 It is a compile-time error if $C$ declares a
 \begin{itemize}
@@ -2966,11 +2983,9 @@
 or type \code{FutureOr<$T$>} for any $T$ (\ref{typeFutureOr}).
 
 \begin{grammar}
-{\bf mixinApplicationClass:}identifier typeParameters? `=' mixinApplication `{\escapegrammar ;}'
-  .
+<mixinApplicationClass> ::= <identifier> <typeParameters>? `=' <mixinApplication> `;'
 
-{\bf mixinApplication:}type mixins interfaces?
-  .
+<mixinApplication> ::= <type> <mixins> <interfaces>?
 \end{grammar}
 
 \LMHash{}
@@ -2996,8 +3011,9 @@
 let $S$ be the superclass of $C$, and let $S_N$ be the name of $S$.
 
 For each generative constructor of the form \code{$S_q$($T_{1}$ $a_{1}$, $\ldots$, $T_{k}$ $a_{k}$)} of $S$ that is accessible to $L_C$, $C$ has an implicitly declared constructor of the form
+
 \begin{dartCode}
-$C_q$($T_{1}$ $a_{1}$, \ldots, $T_{k}$ $a_{k}$):$\SUPER_q$($a_{1}$, $\ldots$, $a_{k}$);
+$C_q$($T_{1}$ $a_{1}$, \ldots, $T_{k}$ $a_{k}$): $\SUPER_q$($a_{1}$, $\ldots$, $a_{k}$);
 \end{dartCode}
 
 \noindent
@@ -3009,6 +3025,7 @@
 
 \LMHash{}
 For each generative constructor of the form \code{$S_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, [$T_{k+1}$ $a_{k+1}$ = $d_1$, \ldots , $T_{k+p}$ $a_{k+p}$ = $d_p$])} of $S$ that is accessible to $L_C$, $C$ has an implicitly declared constructor of the form
+
 \begin{dartCode}
 $C_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, [$T_{k+1}$ $a_{k+1}$ = $d'_{1}$, \ldots , $T_{k+p}$ $a_{k+p}$ = $d'_p$])
     : $\SUPER_q$($a_{1}$, \ldots , $a_{k}$, $a_{k+1}$, \ldots, $a_p$);
@@ -3026,6 +3043,7 @@
 
 \LMHash{}
 For each generative constructor of the form \code{$S_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, \{$T_{k+1}$ $a_{k+1}$ = $d_1$, \ldots , $T_{k+n}$ $a_{k+n}$ = $d_n$\})} of $S$ that is accessible to $L_C$, $C$ has an implicitly declared constructor of the form
+
 \begin{dartCode}
 $C_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, \{$T_{k+1}$ $a_{k+1}$ = $d'_1$, \ldots , $T_{k+n}$ $a_{k+n}$ = $d'_n$\})
     : $\SUPER_q$($a_{1}$, \ldots , $a_{k}$, $a_{k+1}$: $a_{k+1}$, \ldots, $a_p$: $a_p$);
@@ -3125,28 +3143,26 @@
 An {\em enumerated type}, or {\em enum}, is used to represent a fixed number of constant values.
 
 \begin{grammar}
-{\bf enumType:}metadata \ENUM{} identifier
-  \gnewline{} `\{' enumEntry (\gcomma{} enumEntry)* (\gcomma{})? `\}'
-  .
+<enumType> ::= <metadata> \ENUM{} <identifier>
+  \gnewline{} `{' <enumEntry> (`,' <enumEntry>)* (`,')? `}'
 
-{\bf enumEntry:}metadata identifier
-  .
+<enumEntry> ::= <metadata> <identifier>
 \end{grammar}
 
 \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}
-$m$ \CLASS{} E \{
+$m$ \CLASS{} $E$ \{
   \FINAL{} int index;
-  \CONST{} E(\THIS{}.index);
-  $m_0$ \STATIC{} \CONST{} E id$_0$ = \CONST{} E(0);
+  \CONST{} $E$(\THIS{}.index);
+  $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]
+  $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]
 \}
 \end{dartCode}
 
@@ -3258,11 +3274,9 @@
 }
 
 \begin{grammar}
-{\bf typeParameter:}metadata identifier (\EXTENDS{} type)?
-  .
+<typeParameter> ::= <metadata> <identifier> (\EXTENDS{} <type>)?
 
-{\bf typeParameters:}`<' typeParameter (\gcomma{} typeParameter)* `>'
-  .
+<typeParameters> ::= `<' <typeParameter> (`,' <typeParameter>)* `>'
 \end{grammar}
 
 \LMHash{}
@@ -3302,10 +3316,10 @@
 
 \begin{dartCode}
 \CLASS{} Ordered<T> \{
-  operator > (T x);
+  operator >(T x);
 \}
 
-\CLASS{} Sorter<T \EXTENDS{} Ordered<T$>>$ \{
+\CLASS{} Sorter<T \EXTENDS{} Ordered<T\gtgt{} \{
    sort(List<T> l) {... l[n] < l[n+1] ...}
 \}
 
@@ -3314,9 +3328,9 @@
 \commentary{
 Even where type parameters are in scope there are numerous restrictions at this time:
 \begin{itemize}
-\item A type parameter cannot be used to name a constructor in an instance creation expression (\ref{instanceCreation}).
-\item A type parameter cannot be used as a superclass or superinterface (\ref{superclasses}, \ref{superinterfaces}, \ref{interfaceSuperinterfaces}).
-\item A type parameter cannot be used as a generic type.
+\item[$\bullet$] A type parameter cannot be used to name a constructor in an instance creation expression (\ref{instanceCreation}).
+\item[$\bullet$] A type parameter cannot be used as a superclass or superinterface (\ref{superclasses}, \ref{superinterfaces}, \ref{interfaceSuperinterfaces}).
+\item[$\bullet$] A type parameter cannot be used as a generic type.
 \end{itemize}
 
 The normative versions of these are given in the appropriate sections of this specification.
@@ -3651,7 +3665,7 @@
 \CLASS{} A<X \EXTENDS{} num> \{
   X x;
 \}
-
+\\
 A<Object> a;
 \end{dartCode}
 
@@ -3723,8 +3737,7 @@
 Dart supports metadata which is used to attach user defined annotations to program structures.
 
 \begin{grammar}
-{\bf metadata:}(`@' qualified ({\escapegrammar `.'} identifier)? (arguments)?)*
-  .
+<metadata> ::= (`@' <qualified> (`.' <identifier>)? (<arguments>)?)*
 \end{grammar}
 
 \LMHash{}
@@ -3789,31 +3802,25 @@
 the evaluation of $e$ stops at that point and throws the same exception object and stack trace.
 
 \begin{grammar}
-{\bf expression:}assignableExpression assignmentOperator expression;
-  conditionalExpression cascadeSection*;
-  throwExpression
-  .
+<expression> ::= <assignableExpression> <assignmentOperator> <expression>
+  \alt <conditionalExpression> <cascadeSection>*
+  \alt <throwExpression>
 
-{\bf expressionWithoutCascade:}assignableExpression assignmentOperator
-  \gnewline{} expressionWithoutCascade;
-  conditionalExpression;
-  throwExpressionWithoutCascade
-  .
+<expressionWithoutCascade> ::= <assignableExpression> <assignmentOperator>
+  \gnewline{} <expressionWithoutCascade>
+  \alt <conditionalExpression>
+  \alt <throwExpressionWithoutCascade>
 
-{\bf expressionList:}expression (\gcomma{} expression)*
-  .
-\end{grammar}
+<expressionList> ::= <expression> (`,' <expression>)*
 
-\begin{grammar}
-{\bf primary:}thisExpression;
-  \SUPER{} unconditionalAssignableSelector;
-  functionExpression;
-  literal;
-  identifier;
-  newExpression;
-  constObjectExpression;
-  `(' expression `)'
-  .
+<primary> ::= <thisExpression>
+  \alt \SUPER{} <unconditionalAssignableSelector>
+  \alt <functionExpression>
+  \alt <literal>
+  \alt <identifier>
+  \alt <newExpression>
+  \alt <constObjectExpression>
+  \alt `(' <expression> `)'
 \end{grammar}
 
 \LMHash{}
@@ -3825,7 +3832,7 @@
 }
 
 
-\subsubsection{Object Identity}
+\subsection{Object Identity}
 \LMLabel{objectIdentity}
 
 \LMHash{}
@@ -3897,13 +3904,13 @@
 \item A simple or qualified identifier denoting a top-level function (\ref{functions}) or a static method (\ref{staticMethods}) that is not qualified by a deferred prefix.
 \item A parenthesized expression \code{($e$)} where $e$ is a constant expression.
 \item An expression of the form \code{identical($e_1$, $e_2$)} where $e_1$ and $e_2$ are constant expressions and \code{identical()} is statically bound to the predefined dart function \code{identical()} discussed above (\ref{objectIdentity}).
-\item An expression of one of the forms \code{$e_1$ == $e_2$} or \code{$e_1$ != $e_2$} where $e_1$ and $e_2$ are constant expressions, and either both evaluate to a numeric, string or boolean value, or at least one of $e_1$ or $e_2$ evaluates to the null object (\ref{null}).
-\item An expression of one of the forms \code{!$e$}, \code{$e_1$ \&\& $e_2$} or \code{$e_1 || e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a boolean value.
-\item An expression of one of the forms \~{}$e$, $e_1$ \^{} $e_2$, \code{$e_1$ \& $e_2$}, $e_1 | e_2$, $e_1 << e_2$, $e_1 >> e_2$ or $e_1 >>> e_2$, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to an integer value or to the null object (\ref{null}).
-\item An expression of the form \code{$e_1 + e_2$} where $e_1$ and $e_2$ are constant expressions that evaluate to a numeric or string value or to the null object (\ref{null}).
-\item An expression of one of the forms \code{$-e$}, \code{$e_1$ - $e_2$}, \code{$e_1$ * $e_2$}, \code{$e_1$ / $e_2$,} \code{$e_1$ \~{}/ $e_2$}, \code{$e_1 > e_2$}, \code{$e_1 < e_2$}, \code{$e_1$ >= $e_2$}, \code{$e_1$ <= $e_2$} or \code{$e_1$ \% $e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value or to the null object (\ref{null}).
-\item An expression of the form \code{$e_1$?$e_2$:$e3$} where $e_1$, $e_2$ and $e_3$ are constant expressions and $e_1$ evaluates to a boolean value.
-\item An expression of the form \code{$e_1 ?? e_2$} where $e_1$ and $e_2$ are constant expressions.
+\item An expression of one of the forms \code{$e_1$\,==\,$e_2$} or \code{$e_1$\,!=\,$e_2$} where $e_1$ and $e_2$ are constant expressions, and either both evaluate to a numeric, string or boolean value, or at least one of $e_1$ or $e_2$ evaluates to the null object (\ref{null}).
+\item An expression of one of the forms \code{!$e$}, \code{$e_1$\,\&\&\,$e_2$} or \code{$e_1$\,||\,$e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a boolean value.
+\item An expression of one of the forms \code{\~{}$e$}, \code{$e_1$\,\^\,$e_2$}, \code{$e_1$\,\&\,$e_2$}, \code{$e_1$\,|\,$e_2$}, \code{$e_1$\,<\mbox<\,$e_2$}, \code{$e_1$\,\gtgt\,$e_2$} or \code{$e_1$\,\gtgtgt\,$e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to an integer value or to the null object (\ref{null}).
+\item An expression of the form \code{$e_1$\,+\,$e_2$} where $e_1$ and $e_2$ are constant expressions that evaluate to a numeric or string value or to the null object (\ref{null}).
+\item An expression of one of the forms \code{-$e$}, \code{$e_1$\,-\,$e_2$}, \code{$e_1$\,*\,$e_2$}, \code{$e_1$\,/\,$e_2$,} \code{$e_1$\,\~{}/\,$e_2$}, \code{$e_1$\,>\,$e_2$}, \code{$e_1$\,<\,$e_2$}, \code{$e_1$\,>=\,$e_2$}, \code{$e_1$\,<=\,$e_2$} or \code{$e_1$\,\%\,$e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value or to the null object (\ref{null}).
+\item An expression of the form \code{$e_1$\,?\,$e_2$\,:\,$e3$} where $e_1$, $e_2$ and $e_3$ are constant expressions and $e_1$ evaluates to a boolean value.
+\item An expression of the form \code{$e_1$\,??\,$e_2$} where $e_1$ and $e_2$ are constant expressions.
 \item An expression of the form \code{$e$.length} where $e$ is a constant expression that evaluates to a string value.
 \end{itemize}
 
@@ -3928,18 +3935,18 @@
 }
 
 \begin{dartCode}
-\CONST{} x = 1 ~/ 0;
-\FINAL{} y = 1 ~/ 0;
-
+\CONST{} x = 1 \~{}/ 0;
+\FINAL{} y = 1 \~{}/ 0;
+\\
 \CLASS{} K \{
   m1() \{
-   \VAR{} z = \FALSE{};
-    \IF{} (z) \{\RETURN{} x; \}
+    \VAR{} z = \FALSE{};
+    \IF{} (z) \{ \RETURN{} x; \}
     \ELSE{} \{ \RETURN{} 2; \}
   \}
-
+\\
   m2() \{
-    \IF{} (\TRUE{}) \{\RETURN{} y; \}
+    \IF{} (\TRUE{}) \{ \RETURN{} y; \}
     \ELSE{} \{ \RETURN{} 3; \}
   \}
 \}
@@ -3971,12 +3978,12 @@
 }
 
 \rationale{
-One might reasonably ask why $e_1? e_1: e_3$ and $e_1?? e_2$ have constant forms.
-For example, if $e_1$ is known statically, why do we need to test it?.
+One might reasonably ask why $e_1$\,?\,$e_1$\,:\,$e_3$ and $e_1$\,??\,$e_2$ have constant forms.
+For example, if $e_1$ is known statically, why do we need to test it?
 The answer is that there are contexts where $e_1$ is a variable.
 In particular, constant constructor initializers such as
 
-\code{\CONST{} C(foo) : \THIS.foo = foo ?? someDefaultValue;}
+\code{\CONST{} C(foo): \THIS.foo = foo ?? someDefaultValue;}
 }
 
 \LMHash{}
@@ -3987,22 +3994,21 @@
 }
 
 \begin{dartCode}
-\CLASS{} CircularConsts\{
-// Illegal program - mutually recursive compile-time constants
-  \STATIC{} \CONST{} i = j; // a compile-time constant
-  \STATIC{} \CONST{} j = i; // a compile-time constant
+\CLASS{} CircularConsts \{
+  // \comment{Illegal program - mutually recursive compile-time constants}
+  \STATIC{} \CONST{} i = j; // \comment{a compile-time constant}
+  \STATIC{} \CONST{} j = i; // \comment{a compile-time constant}
 \}
 \end{dartCode}
 
 \begin{grammar}
-{\bf literal:}nullLiteral;
-  booleanLiteral;
-  numericLiteral;
-  stringLiteral;
-  symbolLiteral;
-  mapLiteral;
-  listLiteral
-  .
+<literal> ::= <nullLiteral>
+  \alt <booleanLiteral>
+  \alt <numericLiteral>
+  \alt <stringLiteral>
+  \alt <symbolLiteral>
+  \alt <mapLiteral>
+  \alt <listLiteral>
 \end{grammar}
 
 
@@ -4013,8 +4019,7 @@
 The reserved word \NULL{} evaluates to the {\em null object}.
 
 \begin{grammar}
-{\bf nullLiteral:}\NULL{}
-  .
+<nullLiteral> ::= \NULL{}
 \end{grammar}
 
 \LMHash{}
@@ -4034,25 +4039,20 @@
 A {\em numeric literal} is either a decimal or hexadecimal numeral representing an integer value, or a decimal double representation.
 
 \begin{grammar}
-{\bf numericLiteral:}NUMBER;
-  HEX\_NUMBER
-  .
+<numericLiteral> ::= <NUMBER>
+  \alt <HEX\_NUMBER>
 
-{\bf NUMBER:}DIGIT+ (`{\escapegrammar.}' DIGIT+)? EXPONENT?;
-  {`\escapegrammar .}' DIGIT+ EXPONENT?
-  .
+<NUMBER> ::= <DIGIT>+ (`.' <DIGIT>+)? <EXPONENT>?
+  \alt `.' <DIGIT>+ <EXPONENT>?
 
-{\bf EXPONENT:}(`e' $|$ `E') (`+' $|$ `-')? DIGIT+
-  .
+<EXPONENT> ::= (`e' | `E') (`+' | `-')? <DIGIT>+
 
-{\bf HEX\_NUMBER:}`0x' HEX\_DIGIT+;
-  `0X' HEX\_DIGIT+
-  .
+<HEX\_NUMBER> ::= `0x' <HEX\_DIGIT>+
+  \alt `0X' <HEX\_DIGIT>+
 
-{\bf HEX\_DIGIT:}`a'{\escapegrammar ..}`f';
-  `A'{\escapegrammar ..}`F';
-  DIGIT
-  .
+<HEX\_DIGIT> ::= `a' .. `f'
+  \alt `A' .. `F'
+  \alt <DIGIT>
 \end{grammar}
 
 \LMHash{}
@@ -4091,7 +4091,7 @@
 then evaluation of $l$ proceeds as follows:
 \begin{itemize}
   \item{} If $l$ is a hexadecimal integer literal,
-  $2^{63} \le{} i \lt{} 2^{64}$ and the \code{int} class is implemented as
+  $2^{63} \le i < 2^{64}$ and the \code{int} class is implemented as
   signed 64-bit two's complement integers,
   then $l$ evaluates to an instance of the \code{int} class
   representing the numeric value $i - 2^{64}$,
@@ -4145,9 +4145,8 @@
 They are the {\em boolean literals}.
 
 \begin{grammar}
-{\bf booleanLiteral:}\TRUE{};
-  \FALSE{}
-  .
+<booleanLiteral> ::= \TRUE{}
+  \alt \FALSE{}
 \end{grammar}
 
 \LMHash{}
@@ -4173,19 +4172,17 @@
 }
 
 \begin{grammar}
-{\bf stringLiteral:}(multilineString $|$ singleLineString)+
-  .
+<stringLiteral> ::= (<multilineString> | <singleLineString>)+
 \end{grammar}
 
 \LMHash{}
 A string can be a sequence of single line strings and multiline strings.
 
 \begin{grammar}
-{\bf singleLineString:}`{\escapegrammar \code{"}}' stringContentDQ* `{\escapegrammar \code{"}}';
-  `{\escapegrammar \code{'}}' stringContentSQ* `{\escapegrammar \code{'}}';
-  `r{\escapegrammar \code{'}}' (\~{}( `{\escapegrammar \code{'}}' $|$ NEWLINE ))* `{\escapegrammar \code{'}}';
-  `r{\escapegrammar \code{"}}' (\~{}( `{\escapegrammar \code{"}}' $|$ NEWLINE ))* `{\escapegrammar \code{"}}'
-  .
+<singleLineString> ::= `"' <stringContentDQ>* `"'
+  \alt `\'' <stringContentSQ>* `\''
+  \alt `r\'' (\~{}( `\'' | <NEWLINE>))* `\''
+  \alt `r"' (\~{}( `"' | <NEWLINE>))* `"'
 \end{grammar}
 
 \LMHash{}
@@ -4208,7 +4205,7 @@
 }
 
 \begin{dartCode}
-print("A string" "and then another"); // prints: A stringand then another
+print("A string" "and then another"); // \comment{A stringand then another}
 \end{dartCode}
 
 \rationale{
@@ -4249,31 +4246,28 @@
 \end{dartCode}
 
 \begin{grammar}
-{\bf multilineString:}`{\escapegrammar \texttt{"""}}' stringContentTDQ* `{\escapegrammar \texttt{"""}}';
-  `{\escapegrammar \code{'}\code{'}\code{'}}' stringContentTSQ* `{\escapegrammar \code{'}\code{'}\code{'}}';
-  `r{\escapegrammar \texttt{"""}}' (\~{} `{\escapegrammar \texttt{"""}}')* `{\escapegrammar \texttt{"""}}';
-  `r{\escapegrammar \code{'}\code{'}\code{'}}' (\~{} `{\escapegrammar \code{'}\code{'}\code{'}}')* `{\escapegrammar \code{'}\code{'}\code{'}}'
-  .
+<multilineString> ::= `"""' <stringContentTDQ>* `"""'
+  \alt `\'\mbox\'\mbox\'' <stringContentTSQ>* `\'\mbox\'\mbox\''
+  \alt `r"""' (\~{} `"""')* `"""'
+  \alt `r\'\mbox\'\mbox\'' (\~{} `\'\mbox\'\mbox\'')* `\'\mbox\'\mbox\''
 
-{\bf ESCAPE\_SEQUENCE:}`$\backslash$n';
-  `$\backslash$r';
-  `$\backslash$f';
-  `$\backslash$b';
-  `$\backslash$t';
-  `$\backslash$v';
-  `$\backslash$x' HEX\_DIGIT HEX\_DIGIT;
-  `$\backslash$u' HEX\_DIGIT HEX\_DIGIT HEX\_DIGIT HEX\_DIGIT;
-  `$\backslash$u\{' HEX\_DIGIT\_SEQUENCE `\}'
-  .
+<ESCAPE\_SEQUENCE> ::= `\\n'
+  \alt `\\r'
+  \alt `\\f'
+  \alt `\\b'
+  \alt `\\t'
+  \alt `\\v'
+  \alt `\\x' <HEX\_DIGIT> <HEX\_DIGIT>
+  \alt `\\u' <HEX\_DIGIT> <HEX\_DIGIT> <HEX\_DIGIT> <HEX\_DIGIT>
+  \alt `\\u{' <HEX\_DIGIT\_SEQUENCE> `}'
 
-{\bf HEX\_DIGIT\_SEQUENCE:}HEX\_DIGIT HEX\_DIGIT? HEX\_DIGIT?
-  \gnewline{} HEX\_DIGIT? HEX\_DIGIT? HEX\_DIGIT?
-  .
+<HEX\_DIGIT\_SEQUENCE> ::= <HEX\_DIGIT> <HEX\_DIGIT>? <HEX\_DIGIT>?
+  \gnewline{} <HEX\_DIGIT>? <HEX\_DIGIT>? <HEX\_DIGIT>?
 \end{grammar}
 
 \LMHash{}
 Multiline strings are delimited by either matching triples of single quotes or matching triples of double quotes.
-If the first line of a multiline string consists solely of the whitespace characters defined by the production {\em WHITESPACE} (\ref{lexicalRules}), possibly prefixed by $\backslash$, then that line is ignored, including the line break at its end.
+If the first line of a multiline string consists solely of the whitespace characters defined by the production {\em WHITESPACE} (\ref{lexicalRules}), possibly prefixed by \syntax{`\\'}, then that line is ignored, including the line break at its end.
 
 \rationale{
 The idea is to ignore a whitespace-only first line of a multiline string, where whitespace is defined as tabs, spaces and the final line break.
@@ -4288,58 +4282,61 @@
 Strings support escape sequences for special characters.
 The escapes are:
 \begin{itemize}
-\item $\backslash$n for newline, equivalent to $\backslash$x0A.
-\item $\backslash$r for carriage return, equivalent to $\backslash$x0D.
-\item $\backslash$f for form feed, equivalent to $\backslash$x0C.
-\item $\backslash$b for backspace, equivalent to $\backslash$x08.
-\item $\backslash$t for tab, equivalent to $\backslash$x09.
-\item $\backslash$v for vertical tab, equivalent to $\backslash$x0B.
-\item $\backslash$x $HEX\_DIGIT_1$ $HEX\_DIGIT_2$, equivalent to
+\item \syntax{`\\n'} for newline, equivalent to \syntax{`\\x0A'}.
+\item \syntax{`\\r'} for carriage return, equivalent to \syntax{`\\x0D'}.
+\item \syntax{`\\f'} for form feed, equivalent to \syntax{`\\x0C'}.
+\item \syntax{`\\b'} for backspace, equivalent to \syntax{`\\x08'}.
+\item \syntax{`\\t'} for tab, equivalent to \syntax{`\\x09'}.
+\item \syntax{`\\v'} for vertical tab, equivalent to \syntax{`\\x0B'}.
+\item \syntax{`\\x' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$}, equivalent to
 
-$\backslash$u\{$HEX\_DIGIT_1$ $HEX\_DIGIT_2$\}.
-\item $\backslash$u $HEX\_DIGIT_1$ $HEX\_DIGIT_2$ $HEX\_DIGIT_3$ $HEX\_DIGIT_4$, equivalent to $\backslash$u\{$HEX\_DIGIT_1$ $HEX\_DIGIT_2$ $HEX\_DIGIT_3$ $HEX\_DIGIT_4$\}.
-\item $\backslash$u\{$HEX\_DIGIT\_SEQUENCE$\} is the Unicode code point represented by the $HEX\_DIGIT\_SEQUENCE$.
-It is a compile-time error if the value of the $HEX\_DIGIT\_SEQUENCE$ is not a valid Unicode code point.
-\item \$ indicating the beginning of an interpolated expression.
-\item Otherwise, $\backslash k$ indicates the character $k$ for any $k$ not in $\{n, r, f, b, t, v, x, u\}$.
+\syntax{`\\u{' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$ `}'}.
+\item \syntax{`\\u' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$ <HEX\_DIGIT>$_3$ <HEX\_DIGIT>$_4$},
+equivalent to
+\syntax{`\\u{' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$ <HEX\_DIGIT>$_3$ <HEX\_DIGIT>$_4$ `}'}.
+\item \syntax{`\\u{' <HEX\_DIGIT\_SEQUENCE> `}'} is the Unicode code point represented by the
+\syntax{<HEX\_DIGIT\_SEQUENCE>}.
+It is a compile-time error if the value of the
+\syntax{<HEX\_DIGIT\_SEQUENCE>}
+is not a valid Unicode code point.
+\item \syntax{`$'} indicating the beginning of an interpolated expression.
+\item Otherwise, \syntax{`\\'$k$} indicates the character $k$ for any $k$ not in
+\syntax{$\{$`n', `r', `f', `b', `t', `v', `x', `u'$\}$}.
 \end{itemize}
 
 \LMHash{}
-Any string may be prefixed with the character `r', indicating that it is a {\em raw string}, in which case no escapes or interpolations are recognized.
+Any string may be prefixed with the character \syntax{`r'},
+indicating that it is a {\em raw string},
+in which case no escapes or interpolations are recognized.
 
 \LMHash{}
-Line breaks in a multiline string are represented by the {\em NEWLINE} production.
+Line breaks in a multiline string are represented by the \syntax{<NEWLINE>} production.
 A line break introduces a single newline character into the string value.
 
 \LMHash{}
-It is a compile-time error if a non-raw string literal contains a character sequence of the form $\backslash$x that is not followed by a sequence of two hexadecimal digits.
-It is a compile-time error if a non-raw string literal contains a character sequence of the form $\backslash$u that is not followed by either a sequence of four hexadecimal digits, or by curly brace delimited sequence of hexadecimal digits.
+It is a compile-time error if a non-raw string literal contains a character sequence of the form \syntax{`\\x'} that is not followed by a sequence of two hexadecimal digits.
+It is a compile-time error if a non-raw string literal contains a character sequence of the form \syntax{`\\u'} that is not followed by either a sequence of four hexadecimal digits, or by curly brace delimited sequence of hexadecimal digits.
 
 \begin{grammar}
-{\bf stringContentDQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \texttt{"}}' $|$ `\$' $|$ NEWLINE );
-  `$\backslash$' \~{}( NEWLINE );
-  stringInterpolation
-  .
+<stringContentDQ> ::= \~{}( `\\' | `"' | `$' | <NEWLINE> )
+  \alt `\\' \~{}( <NEWLINE> )
+  \alt <stringInterpolation>
 
-{\bf stringContentSQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \texttt{'}}' $|$ `\$' $|$ NEWLINE );
-  `$\backslash$' \~{}( NEWLINE );
-  stringInterpolation
-  .
+<stringContentSQ> ::= \~{}( `\\' | `\'' | `$' | <NEWLINE> )
+  \alt `\\' \~{}( <NEWLINE> )
+  \alt <stringInterpolation>
 
-{\bf stringContentTDQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \texttt{"""}}' $|$ `\$');
-  `$\backslash$' \~{}( NEWLINE );
-  stringInterpolation
-  .
+<stringContentTDQ> ::= \~{}( `\\' | `"""' | `$')
+  \alt `\\' \~{}( <NEWLINE> )
+  \alt <stringInterpolation>
 
-{\bf stringContentTSQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \code{'}\code{'}\code{'}}' $|$ `\$');
-  `$\backslash$' \~{}( NEWLINE );
-  stringInterpolation
-  .
+<stringContentTSQ> ::= \~{}( `\\' | `\'\'\'' | `$')
+  \alt `\\' \~{}( <NEWLINE> )
+  \alt <stringInterpolation>
 
-{\bf NEWLINE:}$\backslash$n;
-  $\backslash$r;
-  $\backslash$r$\backslash$n
-  .
+<NEWLINE> ::= `\\n'
+  \alt `\\r'
+  \alt `\\r\\n'
 \end{grammar}
 
 \LMHash{}
@@ -4356,9 +4353,8 @@
 This process is known as {\em string interpolation}.
 
 \begin{grammar}
-{\bf stringInterpolation:}`\$' IDENTIFIER\_NO\_DOLLAR;
-  `\$\{' expression `\}'
-  .
+<stringInterpolation> ::= `$' <IDENTIFIER\_NO\_DOLLAR>
+  \alt `${' <expression> `}'
 \end{grammar}
 
 \commentary{
@@ -4366,16 +4362,17 @@
 }
 
 \LMHash{}
-An unescaped \$ character in a string signifies the beginning of an interpolated expression.
-The \$ sign may be followed by either:
+An unescaped \syntax{`$'} character in a string signifies the beginning of an interpolated expression.
+The \syntax{`$'} sign may be followed by either:
 \begin{itemize}
-\item A single identifier \id{} that must not contain the \$ character.
+\item A single identifier \id{} that must not contain the \syntax{`$'} character.
 \item An expression $e$ delimited by curly braces.
 \end{itemize}
 
 \LMHash{}
 The form \code{\$\id} is equivalent to the form \code{\$\{\id\}}.
-An interpolated string, $s$, with content `\code{$s_0$\$\{$e_1$\}$s_1\ldots{}s_{n-1}\$\{e_n\}s_{n}$}' (where any of $s_0, \ldots, s_n$ can be empty)
+An interpolated string, $s$, with content
+`\code{$s_0$\$\{$e_1$\}$s_1\ldots{}s_{n-1}$\$\{$e_n$\}$s_{n}$}' (where any of $s_0, \ldots, s_n$ can be empty)
 is evaluated by evaluating each expression $e_i$ ($1 \le i \le n$) in to a string $r_i$ in the order they occur in the source text, as follows:
 \begin{itemize}
 \item{} Evaluate $e_i$ to an object $o_i$.
@@ -4394,8 +4391,7 @@
 a valid declaration name or a valid library name in a Dart program.
 
 \begin{grammar}
-{\bf symbolLiteral:}`\#' (operator $|$ (identifier (`{\escapegrammar .}' identifier)*))
-  .
+<symbolLiteral> ::= `#' (<operator> | (<identifier> (`.' <identifier>)*))
 \end{grammar}
 
 \LMHash{}
@@ -4458,8 +4454,7 @@
 A {\em list literal} denotes a list, which is an integer indexed collection of objects.
 
 \begin{grammar}
-{\bf listLiteral:}\CONST{}? typeArguments? `[' (expressionList \gcomma{}?)? `]'
-  .
+<listLiteral> ::= \CONST{}? <typeArguments>? `[' (<expressionList> `,'?)? `]'
 \end{grammar}
 
 \LMHash{}
@@ -4479,18 +4474,29 @@
 
 \LMHash{}
 It is a compile-time error if an element of a constant list literal is not a compile-time constant.
-It is a compile-time error if the type argument of a constant list literal includes a type parameter.
+% Need 'free': `const <Function(Function<X>(X))>[]` is OK, but `X` is not free.
+It is a compile-time error if the type argument of a constant list literal is or contains a free type variable.
 \rationale{
 The binding of a type parameter is not known at compile time, so we cannot use type parameters inside compile-time constants.
 }
 
 \LMHash{}
-The value of a constant list literal \CONST{} $<E>[e_1, \ldots, e_n]$ is an object $a$ whose class implements the built-in class $List<E>$.
+The value of a constant list literal
+\code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
+is an object $a$ whose class implements the built-in class
+\code{List<$E$>}.
 The $i$th element of $a$ is $v_{i+1}$, where $v_i$ is the value of the compile-time expression $e_i$.
-The value of a constant list literal \CONST{} $[e_1, \ldots, e_n]$ is defined as the value of the constant list literal \CONST{}$ <\DYNAMIC{}>[e_1, \ldots, e_n]$.
+The value of a constant list literal
+\code{\CONST{} [$e_1, \ldots, e_n$]}
+is defined as the value of the constant list literal
+\code{\CONST{} <\DYNAMIC{}>[$e_1, \ldots, e_n$]}.
 
 \LMHash{}
-Let $list_1 =$ \CONST{} $<V>[e_{11}, \ldots, e_{1n}]$ and $list_2 =$ \CONST{} $<U>[e_{21}, \ldots, e_{2n}]$ be two constant list literals and let the elements of $list_1$ and $list_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
+Let
+$list_1 =$ \code{\CONST{} <$V$>[$e_{11}, \ldots, e_{1n}$]}
+and
+$list_2 =$ \code{\CONST{} <$U$>[$e_{21}, \ldots, e_{2n}$]}
+be two constant list literals and let the elements of $list_1$ and $list_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
 If{}f \code{identical($o_{1i}$, $o_{2i}$)} for $i \in 1 .. n$ and $V = U$ then \code{identical($list_1$, $list_2$)}.
 
 \commentary{
@@ -4498,13 +4504,17 @@
 }
 
 \LMHash{}
-A run-time list literal $<E>[e_1, \ldots, e_n]$ is evaluated as follows:
+A run-time list literal
+\code{<$E$>[$e_1, \ldots, e_n$]}
+is evaluated as follows:
 \begin{itemize}
 \item
 First, the expressions $e_1, \ldots, e_n$ are evaluated in order they appear in the program, producing objects $o_1, \ldots, o_n$.
-\item A fresh instance (\ref{generativeConstructors}) $a$, of size $n$, whose class implements the built-in class $List<E>$ is allocated.
+\item A fresh instance (\ref{generativeConstructors}) $a$, of size $n$, whose class implements the built-in class
+\code{List<$E$>}
+is allocated.
 \item
-The operator \code{[]=} is invoked on $a$ with first argument $i$ and second argument
+The operator \syntax{`[]='} is invoked on $a$ with first argument $i$ and second argument
 %The $i$th element of $a$ is set to
 $o_{i+1}, 0 \le i < n$.
 \item
@@ -4518,18 +4528,33 @@
 }
 
 \LMHash{}
-A run-time list literal $[e_1, \ldots, e_n]$ is evaluated as $<\DYNAMIC{}>[e_1, \ldots, e_n]$.
+A run-time list literal
+\code{[$e_1, \ldots, e_n$]}
+is evaluated as
+\code{<\DYNAMIC{}>[$e_1, \ldots, e_n$]}.
 
 \commentary{
 There is no restriction precluding nesting of list literals.
 It follows from the rules above that
-$<List<int>>[[1, 2, 3], [4, 5, 6]]$
-is a list with type parameter $List<int>$, containing two lists with type parameter \DYNAMIC{}.
+\code{<List<int\gtgt{}[[1, 2, 3], [4, 5, 6]]}
+is a list with type parameter
+\code{List<int>},
+containing two lists with type parameter \DYNAMIC{}.
 }
 
 \LMHash{}
-The static type of a list literal of the form \CONST{}$ <E>[e_1, \ldots, e_n]$ or the form $<E>[e_1, \ldots, e_n]$ is $List<E>$.
-The static type a list literal of the form \CONST{} $[e_1, \ldots, e_n$] or the form $[e_1, \ldots, e_n$] is $List<\DYNAMIC{}>$.
+The static type of a list literal of the form
+\code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
+or the form
+\code{<$E$>[$e_1, \ldots, e_n$]}
+is
+\code{List<E>}.
+The static type a list literal of the form
+\code{\CONST{} [$e_1, \ldots, e_n$]}
+or the form
+\code{[$e_1, \ldots, e_n$]}
+is
+\code{List<\DYNAMIC{}>}.
 
 \rationale{
 It is tempting to assume that the type of the list literal would be computed based on the types of its elements.
@@ -4551,12 +4576,10 @@
 A {\em map literal} denotes a map object.
 
 \begin{grammar}
-{\bf mapLiteral:}\CONST{}? typeArguments?
-  \gnewline{} `\{' (mapLiteralEntry (\gcomma{} mapLiteralEntry)* \gcomma{}?)? `\}'
-  .
+<mapLiteral> ::= \CONST{}? <typeArguments>?
+  \gnewline{} `{' (<mapLiteralEntry> (`,' <mapLiteralEntry>)* `,'?)? `\}'
 
-{\bf mapLiteralEntry:}expression `{\escapegrammar :}' expression
-  .
+<mapLiteralEntry> ::= <expression> `:' <expression>
 \end{grammar}
 
 \LMHash{}
@@ -4573,19 +4596,32 @@
 \LMHash{}
 It is a compile-time error if either a key or a value of an entry in a constant map literal is not a compile-time constant.
 It is a compile-time error if the key of an entry in a constant map literal is an instance of
-a class that has a concrete operator \code{==} declaration different from the one in \code{Object},
+a class that has a concrete operator \syntax{`=='} declaration different from the one in \code{Object},
 unless the key is a string or an integer,
 or the key expression is a literal symbol or
 an invocation of a constant constructor of class \code{Symbol}.
-It is a compile-time error if the type arguments of a constant map literal include a type variable.
+% Needs 'free': `const <int, Function(Function<X>(X))>{}` is OK, but
+% `X` is not free.
+It is a compile-time error if a type argument of a constant map literal
+is or contains a free type variable.
 
 \LMHash{}
-The value of a constant map literal \CONST{}$ <K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ is an object $m$ whose class implements the built-in class $Map<K, V>$.
+The value of a constant map literal
+\code{\CONST{} <$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
+is an object $m$ whose class implements the built-in class
+\code{Map<$K, V$>}.
 The entries of $m$ are $u_i:v_i, i \in 1 .. n$, where $u_i$ is the value of the compile-time expression $k_i$ and $v_i$ is the value of the compile-time expression $e_i$.
-The value of a constant map literal \CONST{} $\{k_1:e_1, \ldots, k_n :e_n\}$ is defined as the value of a constant map literal \CONST{} $<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1, \ldots, k_n:e_n\}$.
+The value of a constant map literal
+\code{\CONST{} \{$k_1:e_1, \ldots, k_n:e_n$\}}
+is defined as the value of a constant map literal
+\code{\CONST{} <\DYNAMIC{}, \DYNAMIC{}>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
 
 \LMHash{}
-Let $map_1 =$ \CONST{}$ <K, V>\{k_{11}:e_{11}, \ldots, k_{1n} :e_{1n}\}$ and $map_2 =$ \CONST{}$ <J, U>\{k_{21}:e_{21}, \ldots, k_{2n} :e_{2n}\}$ be two constant map literals.
+Let
+$map_1 =$ \code{\CONST{} <$K, V$>\{$k_{11}:e_{11}, \ldots, k_{1n}:e_{1n}$\}}
+and
+$map_2 =$ \code{\CONST{} <$J, U$>\{$k_{21}:e_{21}, \ldots, k_{2n}:e_{2n}$\}}
+be two constant map literals.
 Let the keys of $map_1$ and $map_2$ evaluate to $s_{11}, \ldots, s_{1n}$ and $s_{21}, \ldots, s_{2n}$ respectively, and let the elements of $map_1$ and $map_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
 If{}f \code{identical($o_{1i}$, $o_{2i}$)} and \code{identical($s_{1i}$, $s_{2i}$)} for $i \in 1 .. n$, and $K = J, V = U$ then \code{identical($map_1$, $map_2$)}.
 
@@ -4594,24 +4630,29 @@
 }
 
 \LMHash{}
-A run-time map literal $<K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ is evaluated as follows:
+A run-time map literal
+\code{<$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
+is evaluated as follows:
 \begin{itemize}
 \item
 For each $i \in 1 .. n$ in numeric order,
 first the expression $k_i$ is evaluated producing object $u_i$,
 and then $e_i$ is evaluated producing object $o_i$.
 This produces all the objects $u_1, o_1, \ldots, u_n, o_n$.
-\item A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class $Map<K, V>$ is allocated.
+\item A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class
+\code{Map<$K, V$>} is allocated.
 \item
-The operator \code{[]=} is invoked on $m$ with first argument $u_i$ and second argument $o_i$ for each $i \in 1 .. n$.
+The operator \syntax{`[]='} is invoked on $m$ with first argument $u_i$ and second argument $o_i$ for each $i \in 1 .. n$.
 \item
 The result of the evaluation is $m$.
 \end{itemize}
 
 \LMHash{}
-A run-time map literal $\{k_1:e_1, \ldots, k_n :e_n\}$ is evaluated as
+A run-time map literal
+\code{\{$k_1:e_1, \ldots, k_n:e_n$\}}
+is evaluated as
 
-$<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1, \ldots, k_n :e_n\}$.
+\code{<\DYNAMIC{}, \DYNAMIC{}>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
 
 \LMHash{}
 It is a compile-time error if two keys of a constant map literal are equal.
@@ -4625,8 +4666,17 @@
 }
 
 \LMHash{}
-The static type of a map literal of the form \CONST{}$ <K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ or the form $<K, V>\{k_1:e_1, \ldots, k_n :e_n\}$ is $Map<K, V>$.
-The static type of a map literal of the form \CONST{}$\{k_1:e_1, \ldots, k_n :e_n\}$ or the form $\{k_1:e_1, \ldots, k_n :e_n\}$ is $Map<\DYNAMIC{}, \DYNAMIC{}>$.
+The static type of a map literal of the form
+\code{\CONST{} <$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
+or the form
+\code{<$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
+is
+\code{Map<$K, V$>}.
+The static type of a map literal of the form
+\code{\CONST{} \{$k_1:e_1, \ldots, k_n:e_n$\}}
+or the form
+\code{\{$k_1:e_1, \ldots, k_n:e_n$\}} is
+\code{Map<\DYNAMIC{}, \DYNAMIC{}>}.
 
 
 \subsection{Throw}
@@ -4636,11 +4686,9 @@
 The {\em throw expression} is used to throw an exception.
 
 \begin{grammar}
-{\bf throwExpression:}\THROW{} expression
-  .
+<throwExpression> ::= \THROW{} <expression>
 
-{\bf throwExpressionWithoutCascade:}\THROW{} expressionWithoutCascade
-  .
+<throwExpressionWithoutCascade> ::= \THROW{} <expressionWithoutCascade>
 \end{grammar}
 
 \LMHash{}
@@ -4682,8 +4730,7 @@
 A {\em function literal} is an object that encapsulates an executable unit of code.
 
 \begin{grammar}
-{\bf functionExpression:}formalParameterPart functionBody
-  .
+<functionExpression> ::= <formalParameterPart> <functionBody>
 \end{grammar}
 
 %% TODO[inference]: The static and dynamic type of a function literal
@@ -4904,8 +4951,7 @@
 The reserved word \THIS{} denotes the target of the current instance member invocation.
 
 \begin{grammar}
-{\bf thisExpression:}\THIS{}
-  .
+<thisExpression> ::= \THIS{}
 \end{grammar}
 
 \LMHash{}
@@ -4964,8 +5010,7 @@
 The {\em new expression} invokes a constructor (\ref{constructors}).
 
 \begin{grammar}
-{\bf newExpression:}\NEW{} type (`{\escapegrammar .}' identifier)? arguments
-  .
+<newExpression> ::= \NEW{} <type> (`.' <identifier>)? <arguments>
 \end{grammar}
 
 \LMHash{}
@@ -5145,8 +5190,7 @@
 (\ref{constantConstructors}).
 
 \begin{grammar}
-{\bf constObjectExpression:}\NEW{} type (`{\escapegrammar .}' identifier)? arguments
-  .
+<constObjectExpression> ::= \CONST{} <type> (`.' <identifier>)? <arguments>
 \end{grammar}
 
 \LMHash{}
@@ -5306,17 +5350,17 @@
    \FINAL{} x;
    \CONST{} A(p): x = p * 10;
 \}
-
+\\
 \CLASS{} IntPair \{
   \CONST{} IntPair(\THIS{}.x, \THIS{}.y);
   \FINAL{} int x;
   \FINAL{} int y;
   \OPERATOR *(v) => \NEW{} IntPair(x*v, y*v);
 \}
-
-\CONST a1 = \CONST{} A(true); // compile-time error
-\CONST a2 = \CONST{} A(5); // legal
-\CONST a3 = \CONST{} A(\CONST{} IntPair(1,2)); // compile-time error
+\\
+\CONST a1 = \CONST{} A(true); // \comment{compile-time error}
+\CONST a2 = \CONST{} A(5); // \comment{legal}
+\CONST a3 = \CONST{} A(\CONST{} IntPair(1,2)); // \comment{compile-time error}
 \end{dartCode}
 
 \commentary{
@@ -5380,7 +5424,7 @@
 }
 
 \LMHash{}
-If $f$ is marked \SYNC* (\ref{functions}),
+If $f$ is marked \code{\SYNC*} (\ref{functions}),
 then a fresh instance (\ref{generativeConstructors}) $i$
 implementing \code{Iterable<$U$>} is immediately returned,
 where $U$ is determined as follows:
@@ -5389,7 +5433,7 @@
 otherwise $U$ is \code{Object}.
 
 \commentary{
-A Dart implementation will need to provide a specific implementation of \code{Iterable} that will be returned by \SYNC* methods.
+A Dart implementation will need to provide a specific implementation of \code{Iterable} that will be returned by \code{\SYNC*} methods.
 A typical strategy would be to produce an instance of a subclass of class \code{IterableBase} defined in \code{dart:core}.
 The only method that needs to be added by the Dart implementation in that case is \code{iterator}.
 }
@@ -5415,14 +5459,14 @@
 \end{itemize}
 
 Each iterator starts a separate computation.
-If the \SYNC* function is impure, the sequence of values yielded by each iterator may differ.
+If the \code{\SYNC*} function is impure, the sequence of values yielded by each iterator may differ.
 
 \commentary{
 One can derive more than one iterator from a given iterable.
 Note that operations on the iterable itself can create distinct iterators.
 An example would be \code{length}.
 It is conceivable that different iterators might yield sequences of different length.
-The same care needs to be taken when writing \SYNC* functions as when
+The same care needs to be taken when writing \code{\SYNC*} functions as when
 writing an \code{Iterator} class.
 In particular, it should handle multiple simultaneous iterators gracefully.
 If the iterator depends on external state that might change, it should check that the state is still valid after every yield (and maybe throw a \code{ConcurrentModificationError} if it isn't).
@@ -5458,7 +5502,7 @@
 }
 
 \LMHash{}
-If $f$ is marked \ASYNC* (\ref{functions}),
+If $f$ is marked \code{\ASYNC*} (\ref{functions}),
 then a fresh instance (\ref{generativeConstructors}) $s$
 implementing \code{Stream<$U$>} is immediately returned,
 where $U$ is determined as follows:
@@ -5497,19 +5541,16 @@
 Actual argument lists have the following syntax:
 
 \begin{grammar}
-{\bf arguments:}`(' (argumentList \gcomma{}?)? `)'
-  .
+<arguments> ::= `(' (<argumentList> `,'?)? `)'
 
-{\bf argumentList:}namedArgument (\gcomma{} namedArgument)*;
-  expressionList (\gcomma{} namedArgument)*
-  .
+<argumentList> ::= <namedArgument> (`,' <namedArgument>)*
+  \alt <expressionList> (`,' <namedArgument>)*
 
-{\bf namedArgument:}label expression
-  .
+<namedArgument> ::= <label> <expression>
 \end{grammar}
 
 \LMHash{}
-Argument lists allow an optional trailing comma after the last argument (\gcomma{}?).
+Argument lists allow an optional trailing comma after the last argument (\syntax{`,'?}).
 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.
@@ -6323,18 +6364,15 @@
 where $e$ is an expression and \metavar{suffix} is a sequence of operator, method, getter or setter invocations.
 
 \begin{grammar}
-{\bf cascadeSection:}`{\escapegrammar ..}' (cascadeSelector argumentPart*)
-  \gnewline{} (assignableSelector argumentPart*)*
-  \gnewline{} (assignmentOperator expressionWithoutCascade)?
-  .
+<cascadeSection> ::= `..' (<cascadeSelector> <argumentPart>*)
+  \gnewline{} (<assignableSelector> <argumentPart>*)*
+  \gnewline{} (<assignmentOperator> <expressionWithoutCascade>)?
 
-{\bf cascadeSelector:}`[' expression `]';
-  identifier
-  .
+<cascadeSelector> ::= `[' <expression> `]'
+  \alt <identifier>
 
-{\bf argumentPart:}
-  typeArguments? arguments
-  .
+<argumentPart> ::=
+  <typeArguments>? <arguments>
 \end{grammar}
 
 \LMHash{}
@@ -6673,7 +6711,6 @@
 \item
 \begin{dartCode}
 <$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-
 ($T_1\ r_1, \ldots,\ T_n\ r_n,\ $\{$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$\}) =>
     $u.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1$: $p_1, \ldots,\ p_k$: $p_k$);
 \end{dartCode}
@@ -6684,7 +6721,6 @@
 \item
 \begin{dartCode}
 <$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-
 ($T_1\ r_1, \ldots,\ T_n\ r_n,\ $[$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$]) =>
     $u.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1, \ldots,\ p_k$);
 \end{dartCode}
@@ -6804,7 +6840,6 @@
 \item
 \begin{dartCode}
 <$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-
 ($T_1\ r_1, \ldots,\ T_n\ r_n,\ $\{$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$\}) =>
     \SUPER$.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1$: $p_1, \ldots,\ p_k$: $p_k$);
 \end{dartCode}
@@ -6815,7 +6850,6 @@
 \item
 \begin{dartCode}
 <$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-
 ($T_1\ r_1, \ldots,\ T_n\ r_n,\ $[$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$]) =>
     \SUPER.$m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1, \ldots,\ p_k$);
 \end{dartCode}
@@ -6887,9 +6921,8 @@
 An assignment changes the value associated with a mutable variable or property.
 
 \begin{grammar}
-{\bf assignmentOperator:}`=' ;
-  compoundAssignmentOperator
-  .
+<assignmentOperator> ::= `='
+  \alt <compoundAssignmentOperator>
 \end{grammar}
 
 \LMHash{}
@@ -7291,20 +7324,19 @@
 is equivalent to the expression \code{$C$.$v$ $op$ = $e_2$}.
 
 \begin{grammar}
-{\bf compoundAssignmentOperator:}`*=';
-  `/=';
-  `\~{}/=';
-  `\%=';
-  `+=';
-  `-=';
-  `{\escapegrammar \lt \lt}=';
-  `{\escapegrammar \gt \gt}=';
-  `{\escapegrammar \gt \gt \gt}=';
-  `\&=';
-  `\^{}=';
-  `$|$=';
-  `??='
-  .
+<compoundAssignmentOperator> ::= `*='
+  \alt `/='
+  \alt `~/='
+  \alt `\%='
+  \alt `+='
+  \alt `-='
+  \alt `\ltlt='
+  \alt `\gtgt='
+  \alt `\gtgtgt='
+  \alt `\&='
+  \alt `^='
+  \alt `|='
+  \alt `??='
 \end{grammar}
 
 
@@ -7315,9 +7347,8 @@
 A {\em conditional expression} evaluates one of two expressions based on a boolean condition.
 
 \begin{grammar}
-{\bf conditionalExpression:}ifNullExpression
-  \gnewline{} (`?' expressionWithoutCascade `{\escapegrammar :}' expressionWithoutCascade)?
-  .
+<conditionalExpression> ::= <ifNullExpression>
+  \gnewline{} (`?' <expressionWithoutCascade> `:' <expressionWithoutCascade>)?
 \end{grammar}
 
 \LMHash{}
@@ -7352,8 +7383,7 @@
 An {\em if-null expression} evaluates an expression and if the result is the null object (\ref{null}), evaluates another.
 
 \begin{grammar}
-{\bf ifNullExpression:}logicalOrExpression (`??' logicalOrExpression)*
-  .
+<ifNullExpression> ::= <logicalOrExpression> (`??' <logicalOrExpression>)*
 \end{grammar}
 
 \LMHash{}
@@ -7377,11 +7407,9 @@
 The logical boolean expressions combine boolean objects using the boolean conjunction and disjunction operators.
 
 \begin{grammar}
-{\bf logicalOrExpression:}logicalAndExpression (`$||$' logicalAndExpression)*
-  .
+<logicalOrExpression> ::= <logicalAndExpression> (`||' <logicalAndExpression>)*
 
-{\bf logicalAndExpression:}equalityExpression (`\&\&' equalityExpression)*
-  .
+<logicalAndExpression> ::= <equalityExpression> (`\&\&' <equalityExpression>)*
 \end{grammar}
 
 \LMHash{}
@@ -7432,13 +7460,11 @@
 Equality expressions test objects for equality.
 
 \begin{grammar}
-{\bf equalityExpression:}relationalExpression (equalityOperator relationalExpression)?;
-  \SUPER{} equalityOperator relationalExpression
-  .
+<equalityExpression> ::= <relationalExpression> (<equalityOperator> <relationalExpression>)?
+  \alt \SUPER{} <equalityOperator> <relationalExpression>
 
-{\bf equalityOperator:}`==';
-  `!='
-  .
+<equalityOperator> ::= `=='
+  \alt `!='
 \end{grammar}
 
 \LMHash{}
@@ -7488,16 +7514,14 @@
 Relational expressions invoke the relational operators on objects.
 
 \begin{grammar}
-{\bf relationalExpression:}bitwiseOrExpression (typeTest $|$ typeCast $|$
-  \gnewline{} relationalOperator bitwiseOrExpression)?;
-  \SUPER{} relationalOperator bitwiseOrExpression
-  .
+<relationalExpression> ::= <bitwiseOrExpression> (<typeTest> | <typeCast> |
+  \gnewline{} <relationalOperator> <bitwiseOrExpression>)?
+  \alt \SUPER{} <relationalOperator> <bitwiseOrExpression>
 
-{\bf relationalOperator:}`{\escapegrammar \gt=}';
-  `{\escapegrammar \gt}';
-  `{\escapegrammar \lt}=';
-  `{\escapegrammar \lt}'
-  .
+<relationalOperator> ::= `>='
+  \alt `>'
+  \alt `<='
+  \alt `<'
 \end{grammar}
 
 \LMHash{}
@@ -7515,22 +7539,18 @@
 Bitwise expressions invoke the bitwise operators on objects.
 
 \begin{grammar}
-{\bf bitwiseOrExpression:}bitwiseXorExpression (`$|$' bitwiseXorExpression)*;
-  \SUPER{} (`$|$' bitwiseXorExpression)+
-  .
+<bitwiseOrExpression> ::= <bitwiseXorExpression> (`|' <bitwiseXorExpression>)*
+  \alt \SUPER{} (`|' <bitwiseXorExpression>)+
 
-{\bf bitwiseXorExpression:}bitwiseAndExpression (`\^{}' bitwiseAndExpression)*;
-  \SUPER{} (`\^{}' bitwiseAndExpression)+
-  .
+<bitwiseXorExpression> ::= <bitwiseAndExpression> (`^' <bitwiseAndExpression>)*
+  \alt \SUPER{} (`^' <bitwiseAndExpression>)+
 
-{\bf bitwiseAndExpression:}shiftExpression (`\&' shiftExpression)*;
-  \SUPER{} (`\&' shiftExpression)+
-  .
+<bitwiseAndExpression> ::= <shiftExpression> (`\&' <shiftExpression>)*
+  \alt \SUPER{} (`\&' <shiftExpression>)+
 
-{\bf bitwiseOperator:}`\&';
-  `\^{}';
-  `$|$'
-  .
+<bitwiseOperator> ::= `\&'
+  \alt `^'
+  \alt `|'
 \end{grammar}
 
 \LMHash{}
@@ -7553,14 +7573,12 @@
 Shift expressions invoke the shift operators on objects.
 
 \begin{grammar}
-{\bf shiftExpression:}additiveExpression (shiftOperator additiveExpression)*;
-  \SUPER{} (shiftOperator additiveExpression)+
-  .
+<shiftExpression> ::= <additiveExpression> (<shiftOperator> <additiveExpression>)*
+  \alt \SUPER{} (<shiftOperator> <additiveExpression>)+
 
-{\bf shiftOperator:}`{\escapegrammar \lt\lt'};
-  `{\escapegrammar \gt\gt}';
-  `{\escapegrammar \gt \gt \gt}'
-  .
+<shiftOperator> ::= `\ltlt'
+  \alt `\gtgt'
+  \alt `\gtgtgt'
 \end{grammar}
 
 \LMHash{}
@@ -7572,10 +7590,10 @@
 
 \commentary{
 Note that this definition implies left-to-right evaluation order among shift expressions:
-
-$e_1 << e_2 << e_3$
-
-is evaluated as $(e_1 << e_2 ).<< (e_3)$ which is equivalent to $(e_1 << e_2) << e_3$.
+\code{$e_1$\,<\mbox<\,$e_2$\,<\mbox<\,$e_3$}
+is evaluated as
+\code{($e_1$\,<\mbox<\,$e_2$).<\mbox< ($e_3$)} which is equivalent to
+\code{($e_1$\,<\mbox<\,$e_2$)\,<\mbox<\,$e_3$}.
 The same holds for additive and multiplicative expressions.
 }
 
@@ -7587,14 +7605,12 @@
 Additive expressions invoke the addition operators on objects.
 
 \begin{grammar}
-{\bf additiveExpression:}multiplicativeExpression
-  \gnewline{} (additiveOperator multiplicativeExpression)*;
-  \SUPER{} (additiveOperator multiplicativeExpression)+
-  .
+<additiveExpression> ::= <multiplicativeExpression>
+  \gnewline{} (<additiveOperator> <multiplicativeExpression>)*
+  \alt \SUPER{} (<additiveOperator> <multiplicativeExpression>)+
 
-{\bf additiveOperator:}`+';
-  `-'
-  .
+<additiveOperator> ::= `+'
+  \alt `-'
 \end{grammar}
 
 \LMHash{}
@@ -7618,15 +7634,13 @@
 Multiplicative expressions invoke the multiplication operators on objects.
 
 \begin{grammar}
-{\bf multiplicativeExpression:}unaryExpression (multiplicativeOperator unaryExpression)*;
-  \SUPER{} (multiplicativeOperator unaryExpression)+
-  .
+<multiplicativeExpression> ::= <unaryExpression> (<multiplicativeOperator> <unaryExpression>)*
+  \alt \SUPER{} (<multiplicativeOperator> <unaryExpression>)+
 
-{\bf multiplicativeOperator:}`*';
-  `/';
-  `\%';
-  `\~{}/'
-  .
+<multiplicativeOperator> ::= `*'
+  \alt `/'
+  \alt `\%'
+  \alt `~/'
 \end{grammar}
 
 \LMHash{}
@@ -7649,39 +7663,32 @@
 Unary expressions invoke unary operators on objects.
 
 \begin{grammar}
-{\bf unaryExpression:}prefixOperator unaryExpression;
-  awaitExpression;
-  postfixExpression;
-  (minusOperator $|$ tildeOperator) \SUPER{};
-  incrementOperator assignableExpression
-  .
+<unaryExpression> ::= <prefixOperator> <unaryExpression>
+  \alt <awaitExpression>
+  \alt <postfixExpression>
+  \alt (<minusOperator> | <tildeOperator>) \SUPER{}
+  \alt <incrementOperator> <assignableExpression>
 
-{\bf prefixOperator:}minusOperator;
-  negationOperator;
-  tildeOperator
-  .
+<prefixOperator> ::= <minusOperator>
+  \alt <negationOperator>
+  \alt <tildeOperator>
 
-{\bf minusOperator:}`-'
-  .
+<minusOperator> ::= `-'
 
-{\bf negationOperator:}`!'
-  .
+<negationOperator> ::= `!'
 
-{\bf tildeOperator:}`\~{}'
-  .
+<tildeOperator> ::= `~'
 \end{grammar}
 
 \LMHash{}
 A {\em unary expression} is either a postfix expression (\ref{postfixExpressions}), an await expression (\ref{awaitExpressions}) or an invocation of a prefix operator on an expression or an invocation of a unary operator on either \SUPER{} or an expression $e$.
 
 \LMHash{}
-The expression $!e$ is equivalent to the expression \code{$e$ ? \FALSE{} : \TRUE{}}.
+The expression $!e$ is equivalent to the expression \code{$e$\,?\,\FALSE\,:\,\TRUE}.
 
 \LMHash{}
-Evaluation of an expression of the form \code{++$e$} is equivalent to \code{$e$ += 1}.
-Evaluation of an expression of the form \code{-{}-$e$} is equivalent to \code{$e$ -= 1}.
-
-%The expression $-e$ is equivalent to the method invocation \code{$e$.-()}.  The expression \code{-\SUPER{}} is equivalent to the method invocation \code{\SUPER{}.-()}.
+Evaluation of an expression of the form \code{++$e$} is equivalent to \code{$e$\,+=\,1}.
+Evaluation of an expression of the form \code{-{}-$e$} is equivalent to \code{$e$\,-=\,1}.
 
 \LMHash{}
 If $e$ is an expression of the form \code{-$l$}
@@ -7721,8 +7728,7 @@
 An {\em await expression} allows code to yield control until an asynchronous operation (\ref{functions}) completes.
 
 \begin{grammar}
-{\bf awaitExpression:}\AWAIT{} unaryExpression
-  .
+<awaitExpression> ::= \AWAIT{} <unaryExpression>
 \end{grammar}
 
 \LMHash{}
@@ -7773,24 +7779,20 @@
 Postfix expressions invoke the postfix operators on objects.
 
 \begin{grammar}
-{\bf postfixExpression:}assignableExpression postfixOperator;
-  primary selector*
-  .
+<postfixExpression> ::= <assignableExpression> <postfixOperator>
+  \alt <primary> <selector>*
 
-{\bf postfixOperator:}incrementOperator
-  .
+<postfixOperator> ::= <incrementOperator>
 
-{\bf selector:}assignableSelector;
-  argumentPart
-  .
+<selector> ::= <assignableSelector>
+  \alt <argumentPart>
 
-{\bf incrementOperator:}`++';
-  `-{}-'
-  .
+<incrementOperator> ::= `++'
+  \alt `-\mbox-'
 \end{grammar}
 
 \LMHash{}
- A {\em postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$.
+A {\em postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$.
 
 \LMHash{}
 Evaluation of a postfix expression $e$ of the form \code{$v$++}, where $v$ is an identifier, proceeds as follows:
@@ -7952,18 +7954,15 @@
 }
 
 \begin{grammar}
-{\bf assignableExpression:}primary (argumentPart* assignableSelector)+;
-  \SUPER{} unconditionalAssignableSelector;
-  identifier
-  .
+<assignableExpression> ::= <primary> (<argumentPart>* <assignableSelector>)+
+  \alt \SUPER{} <unconditionalAssignableSelector>
+  <identifier>
 
-{\bf unconditionalAssignableSelector:}`[' expression `]';
-  `{\escapegrammar .}' identifier
-  .
+<unconditionalAssignableSelector> ::= `[' <expression> `]'
+  \alt `.' <identifier>
 
-{\bf assignableSelector:}unconditionalAssignableSelector;
-  `{\escapegrammar ?.}' identifier
-  .
+<assignableSelector> ::= <unconditionalAssignableSelector>
+  \alt `?.' <identifier>
 \end{grammar}
 
 \LMHash{}
@@ -7999,56 +7998,48 @@
 An {\em identifier expression} consists of a single identifier; it provides access to an object via an unqualified name.
 
 \begin{grammar}
-{\bf identifier:}IDENTIFIER
+<identifier> ::= <IDENTIFIER>
   .
 
-{\bf IDENTIFIER\_NO\_DOLLAR:}IDENTIFIER\_START\_NO\_DOLLAR
-  \gnewline{} IDENTIFIER\_PART\_NO\_DOLLAR*
-  .
+<IDENTIFIER\_NO\_DOLLAR> ::= <IDENTIFIER\_START\_NO\_DOLLAR>
+  \gnewline{} <IDENTIFIER\_PART\_NO\_DOLLAR>*
 
-{\bf IDENTIFIER:}IDENTIFIER\_START IDENTIFIER\_PART*
-  .
+<IDENTIFIER> ::= <IDENTIFIER\_START IDENTIFIER\_PART>*
 
-{\bf BUILT\_IN\_IDENTIFIER:}\ABSTRACT{};
-  \AS{};
-  \COVARIANT{};
-  \DEFERRED{};
-  \DYNAMIC{};
-  \EXPORT{};
-  \EXTERNAL{};
-  \FACTORY{};
-  \FUNCTION{};
-  \GET{};
-  \IMPLEMENTS{};
-  \IMPORT{};
-  \INTERFACE{};
-  \LIBRARY{};
-  \OPERATOR{};
-  \MIXIN{};
-  \PART{};
-  \SET{};
-  \STATIC{};
-  \TYPEDEF{}
-  .
+<BUILT\_IN\_IDENTIFIER> ::= \ABSTRACT{}
+  \alt \AS{}
+  \alt \COVARIANT{}
+  \alt \DEFERRED{}
+  \alt \DYNAMIC{}
+  \alt \EXPORT{}
+  \alt \EXTERNAL{}
+  \alt \FACTORY{}
+  \alt \FUNCTION{}
+  \alt \GET{}
+  \alt \IMPLEMENTS{}
+  \alt \IMPORT{}
+  \alt \INTERFACE{}
+  \alt \LIBRARY{}
+  \alt \OPERATOR{}
+  \alt \MIXIN{}
+  \alt \PART{}
+  \alt \SET{}
+  \alt \STATIC{}
+  \alt \TYPEDEF{}
 
-{\bf IDENTIFIER\_START:}IDENTIFIER\_START\_NO\_DOLLAR;
-  `\$'
-  .
+<IDENTIFIER\_START> ::= <IDENTIFIER\_START\_NO\_DOLLAR>
+  \alt `$'
 
-{\bf IDENTIFIER\_START\_NO\_DOLLAR:}LETTER;
-  `\_'
-  .
+<IDENTIFIER\_START\_NO\_DOLLAR> ::= <LETTER>
+  \alt `_'
 
-{\bf IDENTIFIER\_PART\_NO\_DOLLAR:}IDENTIFIER\_START\_NO\_DOLLAR;
-  DIGIT
-  .
+<IDENTIFIER\_PART\_NO\_DOLLAR> ::= <IDENTIFIER\_START\_NO\_DOLLAR>
+  \alt <DIGIT>
 
-{\bf IDENTIFIER\_PART:}IDENTIFIER\_START;
-  DIGIT
-  .
+<IDENTIFIER\_PART> ::= <IDENTIFIER\_START>
+  \alt <DIGIT>
 
-{\bf qualified:}identifier (`{\escapegrammar .}' identifier)?
-  .
+<qualified> ::= <identifier> (`.' <identifier>)?
 \end{grammar}
 
 \LMHash{}
@@ -8067,7 +8058,7 @@
 }
 
 \LMHash{}
-It is a compile-time error if either of the identifiers \AWAIT{} or \YIELD{} is used as an identifier in a function body marked with either \ASYNC{}, \ASYNC* or \SYNC*.
+It is a compile-time error if either of the identifiers \AWAIT{} or \YIELD{} is used as an identifier in a function body marked with either \ASYNC{}, \code{\ASYNC*} or \code{\SYNC*}.
 
 \rationale{
 For compatibility reasons, new constructs cannot rely upon new reserved words or even built-in identifiers.
@@ -8148,11 +8139,9 @@
 The {\em is-expression} tests if an object is a member of a type.
 
 \begin{grammar}
-{\bf typeTest:}isOperator type
-  .
+<typeTest> ::= <isOperator> <type>
 
-{\bf isOperator:}\IS{} `!'?
-  .
+<isOperator> ::= \IS{} `!'?
 \end{grammar}
 
 \LMHash{}
@@ -8208,11 +8197,9 @@
 The {\em cast expression} ensures that an object is a member of a type.
 
 \begin{grammar}
-{\bf typeCast:}asOperator type
-  .
+<typeCast> ::= <asOperator> <type>
 
-{\bf asOperator:}\AS{}
-  .
+<asOperator> ::= \AS{}
 \end{grammar}
 
 \LMHash{}
@@ -8264,30 +8251,27 @@
 \LMHash{}
 
 \begin{grammar}
-{\bf statements:}statement*
-  .
+<statements> ::= <statement>*
 
-{\bf statement:}label* nonLabelledStatement
-  .
+<statement> ::= <label>* <nonLabelledStatement>
 
-{\bf nonLabelledStatement:}block;
-  localVariableDeclaration;
-  forStatement;
-  whileStatement;
-  doStatement;
-  switchStatement;
-  ifStatement;
-  rethrowStatement;
-  tryStatement;
-  breakStatement;
-  continueStatement;
-  returnStatement;
-  yieldStatement;
-  yieldEachStatement;
-  expressionStatement;
-  assertStatement;
-  localFunctionDeclaration
-  .
+<nonLabelledStatement> ::= <block>
+  \alt <localVariableDeclaration>
+  \alt <forStatement>
+  \alt <whileStatement>
+  \alt <doStatement>
+  \alt <switchStatement>
+  \alt <ifStatement>
+  \alt <rethrowStatement>
+  \alt <tryStatement>
+  \alt <breakStatement>
+  \alt <continueStatement>
+  \alt <returnStatement>
+  \alt <yieldStatement>
+  \alt <yieldEachStatement>
+  \alt <expressionStatement>
+  \alt <assertStatement>
+  \alt <localFunctionDeclaration>
 \end{grammar}
 
 
@@ -8312,23 +8296,22 @@
 
 \LMHash{}
 An {\em expression statement} consists of an expression that does not
-begin with a \{ character.
+begin with a \syntax{`{'} character.
 
 \begin{grammar}
-{\bf expressionStatement:}expression? `{\escapegrammar ;}'
-  .
+<expressionStatement> ::= <expression>? `;'
 \end{grammar}
 
 \LMHash{}
-The expression of an expression statement is not allowed to begin with a \{.
+The expression of an expression statement is not allowed to begin with a \syntax{`\{'}.
 \commentary{
 This means that if some source text could otherwise be parsed as an expression
-followed by a {\rm `$;$'}, then this grammar production does not apply
-when the expression starts with a \{.
+followed by a \syntax{`;'}, then this grammar production does not apply
+when the expression starts with a \syntax{`\{'}.
 }
 \rationale{
 The restriction resolves an ambiguity while parsing where a
-\{ can start either a block (\ref{blocks}) or a map literal (\ref{maps}).
+\syntax{`\{'} can start either a block (\ref{blocks}) or a map literal (\ref{maps}).
 By disallowing the latter from starting an expression statement,
 the parser does not need to look further ahead
 before deciding that it is parsing a block statement.
@@ -8349,8 +8332,7 @@
 has the following form:
 
 \begin{grammar}
-{\bf localVariableDeclaration:}initializedVariableDeclaration `{\escapegrammar ;}'
-  .
+<localVariableDeclaration> ::= <initializedVariableDeclaration> `;'
 \end{grammar}
 
 \LMHash{}
@@ -8419,14 +8401,14 @@
 
 \begin{dartCode}
 \VAR{} x = 0;
-
+\\
 f(y) \{
-  \VAR{} z = x; // compile-time error
+  \VAR{} z = x; // \comment{compile-time error}
   if (y) \{
-    x = x + 1; // two compile-time errors
-    print(x); // compile-time error
+    x = x + 1; // \comment{two compile-time errors}
+    print(x); // \comment{compile-time error}
   \}
-  \VAR{} x = x++; // compile-time error
+  \VAR{} x = x++; // \comment{compile-time error}
   print(x);
 \}
 \end{dartCode}
@@ -8467,8 +8449,8 @@
 \begin{dartCode}
 \CLASS{} C \{\}
 perverse() \{
-   \VAR{} v = \NEW{} C(); // compile-time error
-   C aC; // compile-time error
+   \VAR{} v = \NEW{} C(); // \comment{compile-time error}
+   C aC; // \comment{compile-time error}
    \VAR{} C = 10;
 \}
 \end{dartCode}
@@ -8510,8 +8492,7 @@
 A function declaration statement declares a new local function (\ref{functionDeclarations}).
 
 \begin{grammar}
-{\bf localFunctionDeclaration:}functionSignature functionBody
-  .
+<localFunctionDeclaration> ::= <functionSignature> <functionBody>
 \end{grammar}
 
 \LMHash{}
@@ -8528,19 +8509,20 @@
 }
 
 \begin{dartCode}
-f(x) => x++; // a top level function
-top() \{ // another top level function
-  f(3); // illegal
-  f(x) => x > 0? x*f(x-1): 1; // recursion is legal
-  g1(x) => h(x, 1); // error: h is not declared yet
-  h(x, n) => x > 1? h(x-1, n*x): n; // again, recursion is fine
-  g2(x) => h(x, 1); // legal
-
-  p1(x) => q(x,x); // illegal
-  q1(a, b)$ =>$ a > 0 ? p1(a-1): b; // fine
-
-  q2(a, b) => a > 0 ? p2(a-1): b; // illegal
-  p1(x) => q2(x,x); // fine
+f(x) => x++; // \comment{a top level function}
+\\
+top() \{ // \comment{another top level function}
+  f(3); // \comment{illegal}
+  f(x) => x > 0? x*f(x-1): 1; // \comment{recursion is legal}
+  g1(x) => h(x, 1); // \comment{error: h is not declared yet}
+  h(x, n) => x > 1? h(x-1, n*x): n; // \comment{again, recursion is fine}
+  g2(x) => h(x, 1); // \comment{legal}
+\\
+  p1(x) => q(x,x); // \comment{illegal}
+  q1(a, b)$ =>$ a > 0 ? p1(a-1): b; // \comment{fine}
+\\
+  q2(a, b) => a > 0 ? p2(a-1): b; // \comment{illegal}
+  p1(x) => q2(x,x); // \comment{fine}
 \}
 \end{dartCode}
 
@@ -8553,7 +8535,7 @@
 }
 
 \begin{dartCode}
-top2() \{ // a top level function
+top2() \{ // \comment{a top level function}
   \VAR{} p, q;
   p = (x) => q(x,x);
   q = (a, b) => a > 0 ? p(a-1): b;
@@ -8574,15 +8556,17 @@
 The {\em if statement} allows for conditional execution of statements.
 
 \begin{grammar}
-{\bf ifStatement:}\IF{} `(' expression `)' statement ( \ELSE{} statement)?
-  .
+<ifStatement> ::= \IF{} `(' <expression> `)' <statement> (\ELSE{} <statement>)?
 \end{grammar}
+
+\LMHash{}
 An if statement of the form \code{\IF{} ($e$) $s_1$ \ELSE{} $s_2$} where $s_1$ is not a block statement is equivalent to the statement \code{\IF{} ($e$) \{$s_1$\} \ELSE{} $s_2$}.
 An if statement of the form \code{\IF{} ($e$) $s_1$ \ELSE{} $s_2$} where $s_2$ is not a block statement is equivalent to the statement \code{\IF{} ($e$) $s_1$ \ELSE{} \{$s_2$\}}.
 
 \rationale{
 The reason for this equivalence is to catch errors such as
 }
+
 \begin{dartCode}
 \VOID{} main() \{
   \IF{} (somePredicate)
@@ -8634,17 +8618,14 @@
 The {\em for statement} supports iteration.
 
 \begin{grammar}
-{\bf forStatement:}\AWAIT? \FOR{} `(' forLoopParts `)' statement
-  .
+<forStatement> ::= \AWAIT? \FOR{} `(' <forLoopParts> `)' <statement>
 
-{\bf forLoopParts:}forInitializerStatement expression? `{\escapegrammar ;}' expressionList?;
-  declaredIdentifier \IN{} expression;
-  identifier \IN{} expression
-  .
+<forLoopParts> ::= <forInitializerStatement> <expression>? `;' <expressionList>?
+  \alt <declaredIdentifier> \IN{} <expression>
+  \alt <identifier> \IN{} <expression>
 
-{\bf forInitializerStatement:}localVariableDeclaration;
-  expression? `{\escapegrammar ;}'
-  .
+<forInitializerStatement> ::= <localVariableDeclaration>
+  \alt <expression>? `;'
 \end{grammar}
 
 \LMHash{}
@@ -8721,7 +8702,7 @@
 \LMLabel{for-in}
 
 \LMHash{}
-Let $D$ be derived from \code{finalConstVarOrType?}
+Let $D$ be derived from \syntax{<finalConstVarOrType>?}
 and let $n0$ be an identifier that does not occur anywhere in the program.
 A for statement of the form \code{\FOR{} ($D$ \id{} \IN{} $e$) $s$} is equivalent to the following code:
 
@@ -8751,7 +8732,7 @@
 An asynchronous for loop is distinguished by the keyword \AWAIT{} immediately preceding the keyword \FOR.
 
 \LMHash{}
-Let $D$ be derived from \code{finalConstVarOrType?}.
+Let $D$ be derived from \syntax{<finalConstVarOrType>?}.
 Execution of a for-in statement, $f$, of the form
 \code{\AWAIT{} \FOR{} ($D$ \id{} \IN{} $e$) $s$}
 proceeds as follows:
@@ -8835,8 +8816,7 @@
 The while statement supports conditional iteration, where the condition is evaluated prior to the loop.
 
 \begin{grammar}
-{\bf whileStatement:}\WHILE{} `(' expression `)' statement
-  .
+<whileStatement> ::= \WHILE{} `(' <expression> `)' <statement>
 \end{grammar}
 
 \LMHash{}
@@ -8869,8 +8849,7 @@
 The do statement supports conditional iteration, where the condition is evaluated after the loop.
 
 \begin{grammar}
-{\bf doStatement:}\DO{} statement \WHILE{} `(' expression `)' `{\escapegrammar ;}'
-  .
+<doStatement> ::= \DO{} <statement> \WHILE{} `(' <expression> `)' `;'
 \end{grammar}
 
 \LMHash{}
@@ -8897,14 +8876,11 @@
 The {\em switch statement} supports dispatching control among a large number of cases.
 
 \begin{grammar}
-{\bf switchStatement:}\SWITCH{} `(' expression `)' `\{' switchCase* defaultCase? `\}'
-  .
+<switchStatement> ::= \SWITCH{} `(' <expression> `)' `{' <switchCase>* <defaultCase>? `}'
 
-{\bf switchCase:}label* \CASE{} expression `{\escapegrammar :}' statements
-  .
+<switchCase> ::= <label>* \CASE{} <expression> `:' <statements>
 
-{\bf defaultCase:}label* \DEFAULT{} `{\escapegrammar :}' statements
-  .
+<defaultCase> ::= <label>* \DEFAULT{} `:' <statements>
 \end{grammar}
 
 \LMHash{}
@@ -9143,8 +9119,7 @@
 The {\em rethrow statement} is used to re-throw an exception and its associated stack trace.
 
 \begin{grammar}
-{\bf rethrowStatement:}\RETHROW{} `{\escapegrammar ;}'
-  .
+<rethrowStatement> ::= \RETHROW{} `;'
 \end{grammar}
 
 \LMHash{}
@@ -9172,18 +9147,14 @@
 The try statement supports the definition of exception handling code in a structured way.
 
 \begin{grammar}
-{\bf tryStatement:}\TRY{} block (onPart+ finallyPart? $|$ finallyPart)
-  .
+<tryStatement> ::= \TRY{} <block> (<onPart>+ <finallyPart>? | <finallyPart>)
 
-{\bf onPart:}catchPart block;
-  \ON{} type catchPart? block
-  .
+<onPart> ::= <catchPart> <block>
+  \alt \ON{} <type> <catchPart>? <block>
 
-{\bf catchPart:}\CATCH{} `(' identifier (\gcomma{} identifier)? `)'
-  .
+<catchPart> ::= \CATCH{} `(' <identifier> (`,' <identifier>)? `)'
 
-{\bf finallyPart:}\FINALLY{} block
-  .
+<finallyPart> ::= \FINALLY{} <block>
 \end{grammar}
 
 \LMHash{}
@@ -9221,6 +9192,7 @@
 
 \LMHash{}
 Execution of a \TRY{} statement $s$ of the form:
+
 \begin{dartCode}
 \TRY{} $b$
 \ON{} $T_1$ \CATCH{} ($e_1$, $t_1$) $c_1$
@@ -9251,6 +9223,7 @@
 
 \LMHash{}
 Matching an exception object $e$ and stack trace $t$ against a (potentially empty) sequence of \ON{}-\CATCH{} clauses of the form
+
 \begin{dartCode}
 \ON{} $T_1$ \CATCH{} ($e_1$, $st_1$) \{ $s_1$ \}
 \ldots
@@ -9270,6 +9243,7 @@
 
 \LMHash{}
 Otherwise, if the first clause did not match $e$, $e$ and $t$ are recursively matched against the remaining \ON{}-\CATCH{} clauses:
+
 \begin{dartCode}
 \ON{} $T_2$ \CATCH{} ($e_2$, $t_2$) \{ $s_2$ \}
 \ldots
@@ -9286,8 +9260,7 @@
 or terminates the stream or iterable associated with a generator (\ref{functions}).
 
 \begin{grammar}
-{\bf returnStatement:}\RETURN{} expression? `{\escapegrammar ;}'
-  .
+<returnStatement> ::= \RETURN{} <expression>? `;'
 \end{grammar}
 
 \LMHash{}
@@ -9422,8 +9395,7 @@
 }
 
 \begin{grammar}
-{\bf label:}identifier `{\escapegrammar :}'
-  .
+<label> ::= <identifier> `:'
 \end{grammar}
 
 \LMHash{}
@@ -9452,8 +9424,7 @@
 The {\em break statement} consists of the reserved word \BREAK{} and an optional label (\ref{labels}).
 
 \begin{grammar}
-{\bf breakStatement:}\BREAK{} identifier? `{\escapegrammar ;}'
-  .
+<breakStatement> ::= \BREAK{} <identifier>? `;'
 \end{grammar}
 
 \LMHash{}
@@ -9479,8 +9450,7 @@
 The {\em continue statement} consists of the reserved word \CONTINUE{} and an optional label (\ref{labels}).
 
 \begin{grammar}
-{\bf continueStatement:}\CONTINUE{} identifier? `{\escapegrammar ;}'
-  .
+<continueStatement> ::= \CONTINUE{} <identifier>? `;'
 \end{grammar}
 
 \LMHash{}
@@ -9513,8 +9483,7 @@
 The {\em yield statement} adds an element to the result of a generator function (\ref{functions}).
 
 \begin{grammar}
-{\bf yieldStatement:}\YIELD{} expression `{\escapegrammar ;}'
-  .
+<yieldStatement> ::= \YIELD{} <expression> `;'
 \end{grammar}
 
 \LMHash{}
@@ -9522,13 +9491,13 @@
 
 \LMHash{}
 First, the expression $e$ is evaluated to an object $o$.
-If the enclosing function $m$ is marked \ASYNC* (\ref{functions}) and the stream $u$ associated with $m$ has been paused, then the nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused and execution of $m$ is suspended until $u$ is resumed or canceled.
+If the enclosing function $m$ is marked \code{\ASYNC*} (\ref{functions}) and the stream $u$ associated with $m$ has been paused, then the nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused and execution of $m$ is suspended until $u$ is resumed or canceled.
 
 \LMHash{}
 Next, $o$ is added to the iterable or stream associated with the immediately enclosing function.
 
 \LMHash{}
-If the enclosing function $m$ is marked \ASYNC* and the stream $u$ associated with $m$ has been canceled, then the \YIELD{} statement returns without a value (\ref{completion}), otherwise it completes normally.
+If the enclosing function $m$ is marked \code{\ASYNC*} and the stream $u$ associated with $m$ has been canceled, then the \YIELD{} statement returns without a value (\ref{completion}), otherwise it completes normally.
 
 \rationale{
 The stream associated with an asynchronous generator could be canceled by any code with a reference to that stream at any point where the generator was passivated.
@@ -9537,7 +9506,7 @@
 }
 
 \LMHash{}
-Otherwise, if the enclosing function $m$ is marked \ASYNC* (\ref{functions}) then the enclosing function may suspend, in which case the nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused first.
+Otherwise, if the enclosing function $m$ is marked \code{\ASYNC*} (\ref{functions}) then the enclosing function may suspend, in which case the nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused first.
 
 \rationale{
 If a \YIELD{} occurred inside an infinite loop and the enclosing function never suspended, there might not be an opportunity for consumers of the enclosing stream to run and access the data in the stream.
@@ -9550,7 +9519,7 @@
 }
 
 \LMHash{}
-If the enclosing function $m$ is marked \SYNC* (\ref{functions}) then:
+If the enclosing function $m$ is marked \code{\SYNC*} (\ref{functions}) then:
 \begin{itemize}
 \item
 Execution of the function $m$ immediately enclosing $s$ is suspended until the nullary method \code{moveNext()} is invoked upon the iterator used to initiate the current invocation of $m$.
@@ -9566,9 +9535,9 @@
 It is a compile-time error if either:
 \begin{itemize}
 \item
-the body of $f$ is marked \ASYNC* and the type \code{Stream<T>} may not be assigned to the declared return type of $f$.
+the body of $f$ is marked \code{\ASYNC*} and the type \code{Stream<T>} may not be assigned to the declared return type of $f$.
 \item
-the body of $f$ is marked \SYNC* and the type \code{Iterable<T>} may not be assigned to the declared return type of $f$.
+the body of $f$ is marked \code{\SYNC*} and the type \code{Iterable<T>} may not be assigned to the declared return type of $f$.
 \end{itemize}
 
 
@@ -9579,8 +9548,7 @@
 The {\em yield-each statement} adds a series of values to the result of a generator function (\ref{functions}).
 
 \begin{grammar}
-{\bf yieldEachStatement:}\YIELD* expression `{\escapegrammar ;}'
-  .
+<yieldEachStatement> ::= \YIELD{} `*' <expression> `;'
 \end{grammar}
 
 \LMHash{}
@@ -9590,7 +9558,7 @@
 First, the expression $e$ is evaluated to an object $o$.
 
 \LMHash{}
-If the immediately enclosing function $m$ is marked \SYNC* (\ref{functions}), then:
+If the immediately enclosing function $m$ is marked \code{\SYNC*} (\ref{functions}), then:
 \begin{enumerate}
 \item It is a dynamic error if the class of $o$ does not implement \code{Iterable}.
 Otherwise
@@ -9607,7 +9575,7 @@
 \end{enumerate}
 
 \LMHash{}
-If $m$ is marked \ASYNC* (\ref{functions}), then:
+If $m$ is marked \code{\ASYNC*} (\ref{functions}), then:
 \begin{itemize}
 \item It is a dynamic error if the class of $o$ does not implement \code{Stream}.
 Otherwise
@@ -9644,11 +9612,9 @@
 An {\em assert statement} is used to disrupt normal execution if a given boolean condition does not hold.
 
 \begin{grammar}
-{\bf assertStatement:}assertion `{\escapegrammar ;}'
-  .
+<assertStatement> ::= <assertion> `;'
 
-{\bf assertion:}\ASSERT{} `(' expression (\gcomma{} expression )? \gcomma{}? `)'
-  .
+<assertion> ::= \ASSERT{} `(' <expression> (`,' <expression> )? `,'? `)'
 \end{grammar}
 
 \LMHash{}
@@ -9726,39 +9692,32 @@
 The members of a library $L$ are those top level declarations given within $L$.
 
 \begin{grammar}
-{\bf topLevelDefinition:}classDefinition;
-  enumType;
-  typeAlias;
-  \EXTERNAL{}? functionSignature `{\escapegrammar ;}';
-  \EXTERNAL{}? getterSignature `{\escapegrammar ;}';
-  \EXTERNAL{}? setterSignature `{\escapegrammar ;}';
-  functionSignature functionBody;
-  returnType? \GET{} identifier functionBody;
-  returnType? \SET{} identifier formalParameterList functionBody;
-  (\FINAL{} $|$ \CONST{}) type? staticFinalDeclarationList `{\escapegrammar ;}';
-  variableDeclaration `{\escapegrammar ;}'
-  .
+<topLevelDefinition> ::= <classDefinition>
+  \alt <enumType>
+  \alt <typeAlias>
+  \alt \EXTERNAL{}? <functionSignature> `;'
+  \alt \EXTERNAL{}? <getterSignature> `;'
+  \alt \EXTERNAL{}? <setterSignature> `;'
+  \alt <functionSignature> <functionBody>
+  \alt <returnType>? \GET{} <identifier> <functionBody>
+  \alt <returnType>? \SET{} <identifier> <formalParameterList> <functionBody>
+  \alt (\FINAL{} | \CONST{}) <type> <staticFinalDeclarationList> `;'
+  \alt <variableDeclaration> `;'
 
-{\bf getOrSet:}\GET{};
-  \SET{}
-  .
+<getOrSet> ::= \GET{}
+  \alt \SET{}
 
-{\bf libraryDefinition:}scriptTag? libraryName? importOrExport* partDirective*
-  \gnewline{} topLevelDefinition*
-  .
+<libraryDefinition> ::= <scriptTag>? <libraryName>? <importOrExport>* <partDirective>*
+  \gnewline{} <topLevelDefinition>*
 
-{\bf scriptTag:}`\#!' {\escapegrammar (\~{}NEWLINE)*} NEWLINE
-  .
+<scriptTag> ::= `#!' (\~{}<NEWLINE>)* <NEWLINE>
 
-{\bf libraryName:}metadata \LIBRARY{} dottedIdentifierList `{\escapegrammar ;}'
-  .
+<libraryName> ::= <metadata> \LIBRARY{} <dottedIdentifierList> `;'
 
-{\bf importOrExport:}libraryImport;
-  libraryExport
-  .
+<importOrExport> ::= <libraryImport>
+  \alt <libraryExport>
 
-{\bf dottedIdentifierList:} identifier (`{\escapegrammar .}' identifier)*
-  .
+<dottedIdentifierList> ::= <identifier> (`.' <identifier>)*
 \end{grammar}
 
 \LMHash{}
@@ -9789,8 +9748,8 @@
 Script tags are intended for use with scripts (\ref{scripts}).
 A script tag can be used to identify the interpreter of the script to whatever computing environment the script is embedded in.
 The script tag must appear before any whitespace or comments.
-A script tag begins with the characters \#! and ends at the end of the line.
-Any characters that follow \#! in the script tag are ignored by the Dart implementation.
+A script tag begins with \syntax{`#!'} and ends at the end of the line.
+Any characters that follow \syntax{`#!'} in the script tag are ignored by the Dart implementation.
 
 \LMHash{}
 Libraries are units of privacy.
@@ -9812,19 +9771,15 @@
 \LMHash{}
 An {\em import} specifies a library to be used in the scope of another library.
 \begin{grammar}
-{\bf libraryImport:}metadata importSpecification
-  .
+<libraryImport> ::= <metadata> <importSpecification>
 
-{\bf importSpecification:}\IMPORT{} configurableUri (\AS{} identifier)? combinator* `{\escapegrammar ;}';
-  \IMPORT{} uri \DEFERRED{} \AS{} identifier combinator* `{\escapegrammar ;}'
-  .
+<importSpecification> ::= \IMPORT{} <configurableUri> (\AS{} <identifier>)? <combinator>* `;'
+  \alt \IMPORT{} <uri> \DEFERRED{} \AS{} <identifier> <combinator>* `;'
 
-{\bf combinator:}\SHOW{} identifierList;
-  \HIDE{} identifierList
-  .
+<combinator> ::= \SHOW{} <identifierList>
+  \alt \HIDE{} <identifierList>
 
-{\bf identifierList:}identifier (, identifier)*
-  .
+<identifierList> ::= <identifier> (, <identifier>)*
 \end{grammar}
 
 \LMHash{}
@@ -10077,8 +10032,7 @@
 The namespace that $L$ exports is known as its {\em exported namespace}.
 
 \begin{grammar}
-{\bf libraryExport:}metadata \EXPORT{} configurableUri combinator* `{\escapegrammar ;}'
-  .
+<libraryExport> ::= <metadata> \EXPORT{} <configurableUri> <combinator>* `;'
 \end{grammar}
 
 \LMHash{}
@@ -10155,14 +10109,11 @@
 A {\em part directive} specifies a URI where a Dart compilation unit that should be incorporated into the current library may be found.
 
 \begin{grammar}
-{\bf partDirective:}metadata \PART{} uri `{\escapegrammar ;}'
-  .
+<partDirective> ::= <metadata> \PART{} <uri> `;'
 
-{\bf partHeader:}metadata \PART{} \OF{} identifier (`{\escapegrammar .}' identifier)* `{\escapegrammar ;}'
-  .
+<partHeader> ::= <metadata> \PART{} \OF{} <identifier> (`.' <identifier>)* `;'
 
-{\bf partDeclaration:}partHeader topLevelDefinition* EOF
-  .
+<partDeclaration> ::= <partHeader> <topLevelDefinition>* <EOF>
 \end{grammar}
 
 \LMHash{}
@@ -10176,17 +10127,30 @@
 It is a compile-time error if the referenced part declaration $p$ names a library other than the current library as the library to which $p$ belongs.
 
 \LMHash{}
-Let $L$ be a library.
-It is a compile-time error if $L$ contains two part directives with the same URI.
-Furthermore,
-let $L_1$ be $L$ or any library which is directly or indirectly imported by $L$,
-and let $L_2$ be any library distinct from $L_1$ which is directly or indirectly imported by $L$
-(\ref{imports}).
-It is a compile-time error if $L_1$ and $L_2$ both contain a part directive with the same URI.
+It is a compile-time error if a library contains
+two part directives with the same URI.
+
+\LMHash{}
+We say that a library $L_1$ is {\em reachable from} a library $L$ if
+any of the following is true (\ref{imports}, \ref{exports}):
+\begin{itemize}
+\item $L$ and $L_1$ is the same library.
+\item $L$ imports or exports a library $L_2$, and $L_1$ is reachable from $L_2$.
+\end{itemize}
+
+\LMHash{}
+Let $L$ be a library, let $u$ be a URI,
+and let $L_1$ and $L_2$ be distinct libraries which are reachable from $L$.
+It is a compile-time error if $L_1$ and $L_2$ both contain
+a part directive with URI $u$.
 
 \commentary{
 In particular, it is an error to use the same part twice in the same program
 (\ref{scripts}).
+Note that a relative URI is interpreted as relative to the location of the
+enclosing library (\ref{uris}), which means that $L_1$ and $L_2$ may both
+have a part identified by \code{'myPart.dart'}, but they are not the same
+URI unless $L_1$ and $L_2$ have the same location.
 }
 
 
@@ -10248,14 +10212,13 @@
 URIs are specified by means of string literals:
 
 \begin{grammar}
-{\bf uri:}stringLiteral
-  .
-{\bf configurableUri:} uri configurationUri*
-  .
-{\bf configurationUri:} \IF{} `(' uriTest `)' uri
-  .
-{\bf uriTest:} dottedIdentifierList (`==' stringLiteral)?
-  .
+<uri> ::= <stringLiteral>
+
+<configurableUri> ::= <uri> <configurationUri>*
+
+<configurationUri> ::= \IF{} `(' <uriTest> `)' <uri>
+
+<uriTest> ::= <dottedIdentifierList> (`==' <stringLiteral>)?
 \end{grammar}
 
 \LMHash{}
@@ -10344,17 +10307,13 @@
 They have no effect whatsoever in production mode.
 
 \begin{grammar}
-{\bf type:}typeName typeArguments?
-  .
+<type> ::= <typeName> <typeArguments>?
 
-{\bf typeName:}qualified
-  .
+<typeName> ::= <qualified>
 
-{\bf typeArguments:}`<' typeList `>'
-  .
+<typeArguments> ::= `<' <typeList> `>'
 
-{\bf typeList:}type (\gcomma{} type)*
-  .
+<typeList> ::= <type> (`,' <type>)*
 \end{grammar}
 
 \LMHash{}
@@ -10563,17 +10522,13 @@
 A {\em type alias} declares a name for a type expression.
 
 \begin{grammar}
-{\bf typeAlias:}metadata \TYPEDEF{} typeAliasBody
-  .
+<typeAlias> ::= <metadata> \TYPEDEF{} <typeAliasBody>
 
-{\bf typeAliasBody:}functionTypeAlias
-  .
+<typeAliasBody> ::= <functionTypeAlias>
 
-{\bf functionTypeAlias:}functionPrefix typeParameters? formalParameterList `{\escapegrammar ;}'
-  .
+<functionTypeAlias> ::= <functionPrefix> <typeParameters>? <formalParameterList> `;'
 
-{\bf functionPrefix:}returnType? identifier
-  .
+<functionPrefix> ::= <returnType>? <identifier>
 \end{grammar}
 
 % TODO(eernst): Introduce new type aliases and new function type syntax, then
@@ -10643,7 +10598,9 @@
 This is because $<:$ is not transitive.
 If it was, the subtype rule would have a cycle.
 For example:
-$List <: List<String>$ and $List<int> <: List$, but $List<int>$ is not a subtype of $List<String>$.
+\code{List $<:$ List<String>} and
+\code{List<int> $<:$ List}, but
+\code{List<int>} is not a subtype of \code{List<String>}.
 Although $<:$ is not a partial order on types, it does contain a partial order, namely $<<$.
 This means that, barring raw types, intuition about classical subtype rules does apply.
 }
@@ -10920,7 +10877,7 @@
 This would lead to earlier error detection in checked mode, and more aggressive errors during static typechecking.
 For example:
 
-(1) \code{typedAPI(G\lt{String}\gt g)\{...\}}
+(1) \code{typedAPI(G<String> g)\{...\}}
 
 (2) \code{typedAPI(new G()); }
 
@@ -10928,7 +10885,7 @@
 This seems desirable from the perspective of error localization.
 However, when a dynamic error is thrown at (2), the only way to keep running is rewriting (2) into
 
-(3) \code{typedAPI(new G\lt{String}\gt());}
+(3) \code{typedAPI(new G<String>());}
 
 This forces users to write type information in their client code just because they are calling a typed API.
 We do not want to impose this on Dart programmers, some of which may be blissfully unaware of types in general, and genericity in particular.
@@ -10967,9 +10924,14 @@
         then \code{FutureOr<$T$>} <: $S$.
         \commentary{In particular, \code{FutureOr<$T$>} <: \code{Object}.}
 \end{itemize}.
-\commentary{The last point guarantees that generic type \code{FutureOr} is
+
+\commentary{
+The last point guarantees that generic type \code{FutureOr} is
 {\em covariant} in its type parameter, just like class types.
-That is, if $S$ <: $T$ then \code{FutureOr<$S$>} <: \code{FutureOr<$T$>}.}
+That is, if $S$ <: $T$ then \code{FutureOr<$S$>} <: \code{FutureOr<$T$>}.
+}
+
+\LMHash{}
 If the type arguments passed to \code{FutureOr} would incur compile-time errors
 if applied to a normal generic class with one type parameter,
 the same compile-time errors are issued for \code{FutureOr}.
@@ -10988,15 +10950,17 @@
 \LMHash{}
 The type \code{FutureOr<$T$>} has an interface that is identical to that
 of \code{Object}.
+
 \commentary{
 The only members that can be invoked on a value with static type
 \code{FutureOr<$T$>} are members that are also on \code{Object}.
 }
+
 \rationale{
 We only want to allow invocations of members that are inherited from
 a common supertype of both $T$ and \code{Future<$T$>}.
 In most cases the only common supertype is \code{Object}. The exceptions, like
-\code{FutureOr<Future<Object>>} which has \code{Future<Object>} as common
+\code{FutureOr<Future<Object\gtgt} which has \code{Future<Object>} as common
 supertype, are few and not practically useful, so for now we choose to
 only allow invocations of members inherited from \code{Object}.
 }
@@ -11017,11 +10981,11 @@
 
 The only subtype relations that pertain to void are therefore:
 \begin{itemize}
-\item
+\item[$\bullet$]
 $\VOID{} <: \VOID{}$ (by reflexivity)
-\item
+\item[$\bullet$]
 $\bot <: \VOID{}$ (as bottom is a subtype of all types).
-\item
+\item[$\bullet$]
 $\VOID{} <: \DYNAMIC{}$ (as \DYNAMIC{} is a supertype of all types)
 \end{itemize}
 
@@ -11277,15 +11241,12 @@
 \ASSERT{}, \BREAK{}, \CASE{}, \CATCH{}, \CLASS{}, \CONST{}, \CONTINUE{}, \DEFAULT{}, \DO{}, \ELSE{}, \ENUM{}, \EXTENDS{}, \FALSE{}, \FINAL{}, \FINALLY{}, \FOR{}, \IF{}, \IN{}, \IS{}, \NEW{}, \NULL{}, \RETHROW, \RETURN{}, \SUPER{}, \SWITCH{}, \THIS{}, \THROW{}, \TRUE{}, \TRY{}, \VAR{}, \VOID{}, \WHILE{}, \WITH{}.
 
 \begin{grammar}
-{\bf LETTER:}`a' {\escapegrammar ..} `z';
-  `A' {\escapegrammar ..}`Z'
-  .
+<LETTER> ::= `a' .. `z'
+  \alt `A' .. `Z'
 
-{\bf DIGIT:}`0' {\escapegrammar ..} `9'
-  .
+<DIGIT> ::= `0' .. `9'
 
-{\bf WHITESPACE:}(`$\backslash$t' $|$ ` ' $|$ NEWLINE)+
-  .
+<WHITESPACE> ::= (`\\t' | ` ' | <NEWLINE>)+
 \end{grammar}
 
 
@@ -11296,11 +11257,9 @@
 {\em Comments} are sections of program text that are used for documentation.
 
 \begin{grammar}
-{\bf SINGLE\_LINE\_COMMENT:}`//' \~{}(NEWLINE)* (NEWLINE)?
-  .
+<SINGLE\_LINE\_COMMENT> ::= `//' \~{}(<NEWLINE>)* (<NEWLINE>)?
 
-{\bf MULTI\_LINE\_COMMENT:}`/*' (MULTI\_LINE\_COMMENT $|$ \~{} `*/')* `*/'
-  .
+<MULTI\_LINE\_COMMENT> ::= `/*' (<MULTI\_LINE\_COMMENT> | \~{} `*/')* `*/'
 \end{grammar}
 
 \LMHash{}
@@ -11338,37 +11297,38 @@
 \hline
 Description & Operator & Associativity & Precedence \\
 \hline
-Unary postfix & ., ?., e++, e--, e1[e2], e1() , () & None & 16 \\
+Unary postfix & \code{$e$.}, \code{$e$?.}, \code{$e$++}, \code{$e$-{}-}, \code{$e1$[$e2$]},
+\code{$e$()} & None & 16 \\
 \hline
-Unary prefix & -e, !e, \~{}e, ++e, --e & None & 15\\
+Unary prefix & \code{-$e$}, \code{!$e$}, \code{\~{}$e$}, \code{++$e$}, \code{-{}-$e$} & None & 15\\
 \hline
-Multiplicative & *, /, \~/, \% & Left & 14\\
+Multiplicative & \code{*}, \code{/}, \code{\~{}/}, \code{\%} & Left & 14\\
 \hline
-Additive & +, - & Left & 13\\
+Additive & \code{+}, \code{-} & Left & 13\\
 \hline
-Shift & $<<$, $>>$, $>>>$& Left & 12\\
+Shift & \code{\ltlt}, \code{\gtgt}, \code{\gtgtgt} & Left & 12\\
 \hline
-Bitwise AND & \& & Left & 11\\
+Bitwise AND & \code{\&} & Left & 11\\
 \hline
-Bitwise XOR & \^{} & Left & 10\\
+Bitwise XOR & \code{\^{}} & Left & 10\\
 \hline
-Bitwise Or & $|$ & Left & 9\\
+Bitwise Or & \code{|} & Left & 9\\
 \hline
-Relational & <, >, $<=$, $>=$, \AS{}, \IS{}, \IS{}! & None & 8\\
+Relational & \code{<}, \code{>}, \code{<=}, \code{>=}, \AS{}, \IS{}, \code{\IS{}!} & None & 8\\
 \hline
-Equality & ==, != & None & 7\\
+Equality & \code{==}, \code{!=} & None & 7\\
 \hline
-Logical AND & \&\& & Left & 6\\
+Logical AND & \code{\&\&} & Left & 6\\
 \hline
-Logical Or & $||$ & Left & 5\\
+Logical Or & \code{||} & Left & 5\\
 \hline
-If-null & ?? & Left & 4\\
+If-null & \code{??} & Left & 4\\
 \hline
-Conditional & e1? e2: e3 & Right & 3\\
+Conditional & \code{$e1$\,?\,$e2$\,:\,$e3$} & Right & 3\\
 \hline
-Cascade & .. & Left & 2\\
+Cascade & \code{..} & Left & 2\\
 \hline
-Assignment & =, *=, /=, +=, -= ,\&=, \^{}= etc. & Right & 1\\
+Assignment & \code{=}, \code{*=}, \code{/=}, \code{+=}, \code{-=}, \code{\&=}, \code{\^{}=}, etc. & Right & 1\\
 \hline
 \end{tabular}
 }
@@ -11386,7 +11346,8 @@
 
 This introduces a number of differencs:
 \begin{itemize}
-\item Valid values of JavaScript \code{int} are any
+\item[$\bullet$]
+Valid values of JavaScript \code{int} are any
 IEEE-754 64-bit floating point number with no fractional part.
 This includes positive and negative {\em infinity},
 which can be reached by overflowing
@@ -11396,15 +11357,18 @@
 cannot be compiled to JavaScript.
 Operations on integers may lose precision since 64-bit floating point numbers
 are limited to 53 significant bits.
-\item JavaScript \code{int} instances also implement \code{double},
+\item[$\bullet$]
+JavaScript \code{int} instances also implement \code{double},
 and integer-valued \code{double} instances also implement \code{int}.
 The \code{int} and \code{double} class are still separate subclasses of the
 class \code{num}, but {\em instances} of either class that represent an integer,
 act as if they are actually instances of a common subclass implementing both
 \code{int} and \code{double}. Fractional numbers only implement \code{double}.
-\item Bitwise operations on integers (and, or, xor, negate and shifts)
+\item[$\bullet$]
+Bitwise operations on integers (and, or, xor, negate and shifts)
 all truncate the operands to 32-bit values.
-\item The \code{identical} method cannot distinguish the values $0.0$ and $-0.0$,
+\item[$\bullet$]
+The \code{identical} method cannot distinguish the values $0.0$ and $-0.0$,
 and it cannot recognize any {\em NaN} value as identical to itself.
 For efficiency, the \code{identical} operation uses the JavaScript \code{===}
 operator.
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 5cfd272..f9056d7 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1851,6 +1851,7 @@
   
   
   
+  
 <h3>Requests</h3><dl><dt class="request"><a name="request_edit.format">edit.format</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "edit.format"
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index af80d5a..40d0ca6 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -125,6 +125,8 @@
 const String DIAGNOSTIC_REQUEST_GET_SERVER_PORT = 'diagnostic.getServerPort';
 const String DIAGNOSTIC_RESPONSE_GET_DIAGNOSTICS_CONTEXTS = 'contexts';
 const String DIAGNOSTIC_RESPONSE_GET_SERVER_PORT_PORT = 'port';
+const String EDIT_REQUEST_DARTFIX = 'edit.dartfix';
+const String EDIT_REQUEST_DARTFIX_INCLUDED = 'included';
 const String EDIT_REQUEST_FORMAT = 'edit.format';
 const String EDIT_REQUEST_FORMAT_FILE = 'file';
 const String EDIT_REQUEST_FORMAT_LINE_LENGTH = 'lineLength';
@@ -171,6 +173,8 @@
 const String EDIT_REQUEST_ORGANIZE_DIRECTIVES_FILE = 'file';
 const String EDIT_REQUEST_SORT_MEMBERS = 'edit.sortMembers';
 const String EDIT_REQUEST_SORT_MEMBERS_FILE = 'file';
+const String EDIT_RESPONSE_DARTFIX_DESCRIPTION = 'description';
+const String EDIT_RESPONSE_DARTFIX_FIXES = 'fixes';
 const String EDIT_RESPONSE_FORMAT_EDITS = 'edits';
 const String EDIT_RESPONSE_FORMAT_SELECTION_LENGTH = 'selectionLength';
 const String EDIT_RESPONSE_FORMAT_SELECTION_OFFSET = 'selectionOffset';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index b1f5dce..aa83274 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -6166,6 +6166,218 @@
 }
 
 /**
+ * edit.dartfix params
+ *
+ * {
+ *   "included": List<FilePath>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class EditDartfixParams implements RequestParams {
+  List<String> _included;
+
+  /**
+   * A list of the files and directories for which edits should be suggested.
+   * If a request is made for a file which does not exist, or which is not
+   * currently subject to analysis (e.g. because it is not associated with any
+   * analysis root specified to analysis.setAnalysisRoots), an error of type
+   * FORMAT_INVALID_FILE will be generated.
+   */
+  List<String> get included => _included;
+
+  /**
+   * A list of the files and directories for which edits should be suggested.
+   * If a request is made for a file which does not exist, or which is not
+   * currently subject to analysis (e.g. because it is not associated with any
+   * analysis root specified to analysis.setAnalysisRoots), an error of type
+   * FORMAT_INVALID_FILE will be generated.
+   */
+  void set included(List<String> value) {
+    assert(value != null);
+    this._included = value;
+  }
+
+  EditDartfixParams(List<String> included) {
+    this.included = included;
+  }
+
+  factory EditDartfixParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> included;
+      if (json.containsKey("included")) {
+        included = jsonDecoder.decodeList(
+            jsonPath + ".included", json["included"], jsonDecoder.decodeString);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "included");
+      }
+      return new EditDartfixParams(included);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.dartfix params", json);
+    }
+  }
+
+  factory EditDartfixParams.fromRequest(Request request) {
+    return new EditDartfixParams.fromJson(
+        new RequestDecoder(request), "params", request.params);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["included"] = included;
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return new Request(id, "edit.dartfix", toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is EditDartfixParams) {
+      return listEqual(
+          included, other.included, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, included.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.dartfix result
+ *
+ * {
+ *   "description": List<String>
+ *   "fixes": List<SourceFileEdit>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class EditDartfixResult implements ResponseResult {
+  List<String> _description;
+
+  List<SourceFileEdit> _fixes;
+
+  /**
+   * A list of human readable changes made by applying the fixes.
+   */
+  List<String> get description => _description;
+
+  /**
+   * A list of human readable changes made by applying the fixes.
+   */
+  void set description(List<String> value) {
+    assert(value != null);
+    this._description = value;
+  }
+
+  /**
+   * The suggested fixes.
+   */
+  List<SourceFileEdit> get fixes => _fixes;
+
+  /**
+   * The suggested fixes.
+   */
+  void set fixes(List<SourceFileEdit> value) {
+    assert(value != null);
+    this._fixes = value;
+  }
+
+  EditDartfixResult(List<String> description, List<SourceFileEdit> fixes) {
+    this.description = description;
+    this.fixes = fixes;
+  }
+
+  factory EditDartfixResult.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> description;
+      if (json.containsKey("description")) {
+        description = jsonDecoder.decodeList(jsonPath + ".description",
+            json["description"], jsonDecoder.decodeString);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "description");
+      }
+      List<SourceFileEdit> fixes;
+      if (json.containsKey("fixes")) {
+        fixes = jsonDecoder.decodeList(
+            jsonPath + ".fixes",
+            json["fixes"],
+            (String jsonPath, Object json) =>
+                new SourceFileEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "fixes");
+      }
+      return new EditDartfixResult(description, fixes);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.dartfix result", json);
+    }
+  }
+
+  factory EditDartfixResult.fromResponse(Response response) {
+    return new EditDartfixResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
+        "result",
+        response.result);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["description"] = description;
+    result["fixes"] =
+        fixes.map((SourceFileEdit value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is EditDartfixResult) {
+      return listEqual(
+              description, other.description, (String a, String b) => a == b) &&
+          listEqual(fixes, other.fixes,
+              (SourceFileEdit a, SourceFileEdit b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, description.hashCode);
+    hash = JenkinsSmiHash.combine(hash, fixes.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * edit.format params
  *
  * {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 88d5252..2069432 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -38,6 +38,7 @@
 import 'package:analysis_server/src/plugin/plugin_watcher.dart';
 import 'package:analysis_server/src/protocol_server.dart' as server;
 import 'package:analysis_server/src/search/search_domain.dart';
+import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/search/element_visitors.dart';
@@ -338,6 +339,8 @@
    */
   DiagnosticServer diagnosticServer;
 
+  final DetachableFileSystemManager detachableFileSystemManager;
+
   /**
    * Initialize a newly created server to receive requests from and send
    * responses to the given [channel].
@@ -347,12 +350,17 @@
    * exceptions to show up in unit tests, but it should be set to false when
    * running a full analysis server.
    */
-  AnalysisServer(this.channel, this.resourceProvider, this.options,
-      this.sdkManager, this.instrumentationService,
-      {this.diagnosticServer,
-      ResolverProvider fileResolverProvider: null,
-      ResolverProvider packageResolverProvider: null})
-      : notificationManager =
+  AnalysisServer(
+    this.channel,
+    this.resourceProvider,
+    this.options,
+    this.sdkManager,
+    this.instrumentationService, {
+    this.diagnosticServer,
+    ResolverProvider fileResolverProvider: null,
+    ResolverProvider packageResolverProvider: null,
+    this.detachableFileSystemManager: null,
+  }) : notificationManager =
             new NotificationManager(channel, resourceProvider) {
     _performance = performanceDuringStartup;
 
@@ -1006,7 +1014,7 @@
     return contextManager.isInAnalysisRoot(file);
   }
 
-  Future<void> shutdown() async {
+  Future<void> shutdown() {
     running = false;
 
     if (options.analytics != null) {
@@ -1017,12 +1025,18 @@
       });
     }
 
+    if (options.enableUXExperiment2) {
+      detachableFileSystemManager?.dispose();
+    }
+
     // Defer closing the channel and shutting down the instrumentation server so
     // that the shutdown response can be sent and logged.
     new Future(() {
       instrumentationService.shutdown();
       channel.close();
     });
+
+    return new Future.value();
   }
 
   /**
@@ -1147,7 +1161,7 @@
     return flutterServices[service]?.contains(file) ?? false;
   }
 
-  _scheduleAnalysisImplementedNotification() async {
+  Future<void> _scheduleAnalysisImplementedNotification() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     Set<String> files = analysisServices[AnalysisService.IMPLEMENTED];
@@ -1190,6 +1204,19 @@
    * Whether to enable parsing via the Fasta parser.
    */
   bool useFastaParser = true;
+
+  /**
+   * User Experience, Experiment #1. This experiment changes the notion of
+   * what analysis roots are and priority files: the analysis root is set to be
+   * the priority files' containing directory.
+   */
+  bool enableUXExperiment1 = false;
+
+  /**
+   * User Experience, Experiment #2. This experiment introduces the notion of an
+   * intermittent file system.
+   */
+  bool enableUXExperiment2 = false;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index a8e0598..8cfedbb 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -28,6 +28,7 @@
 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:path/path.dart';
 
 // TODO(devoncarew): See #31456 for the tracking issue to remove this flag.
 final bool disableManageImportsOnPaste = true;
@@ -361,6 +362,10 @@
    * Implement the 'analysis.setAnalysisRoots' request.
    */
   Response setAnalysisRoots(Request request) {
+    if (server.options.enableUXExperiment1) {
+      return new AnalysisSetAnalysisRootsResult().toResponse(request.id);
+    }
+
     var params = new AnalysisSetAnalysisRootsParams.fromRequest(request);
     List<String> includedPathList = params.included;
     List<String> excludedPathList = params.excluded;
@@ -379,9 +384,17 @@
         return new Response.invalidFilePathFormat(request, path);
       }
     }
-    // continue in server
-    server.setAnalysisRoots(request.id, includedPathList, excludedPathList,
-        params.packageRoots ?? <String, String>{});
+    Map<String, String> packageRoots =
+        params.packageRoots ?? <String, String>{};
+
+    if (server.options.enableUXExperiment2 &&
+        server.detachableFileSystemManager != null) {
+      server.detachableFileSystemManager.setAnalysisRoots(
+          request.id, includedPathList, excludedPathList, packageRoots);
+    } else {
+      server.setAnalysisRoots(
+          request.id, includedPathList, excludedPathList, packageRoots);
+    }
     return new AnalysisSetAnalysisRootsResult().toResponse(request.id);
   }
 
@@ -400,6 +413,46 @@
    */
   Response setPriorityFiles(Request request) {
     var params = new AnalysisSetPriorityFilesParams.fromRequest(request);
+
+    if (server.options.enableUXExperiment1) {
+      // If this experiment is enabled, set the analysis root to be the
+      // containing directory.
+
+      List<String> includedPathList = new List<String>();
+
+      // Reference the priority files, remove files that don't end in dart, yaml
+      // or html suffixes and sort from shortest to longest file paths.
+      List<String> priorityFiles = params.files;
+      priorityFiles.removeWhere((s) =>
+          !s.endsWith('.dart') && !s.endsWith('.yaml') && !s.endsWith('.html'));
+
+      Context pathContext = server.resourceProvider.pathContext;
+      List<String> containingDirectories = <String>[];
+      for (String filePath in priorityFiles) {
+        containingDirectories.add(pathContext.dirname(filePath));
+      }
+      containingDirectories.sort();
+
+      // For each file, add the contained directory to includedPathList iff
+      // some other parent containing directory has not already been added.
+      for (String containedDir in containingDirectories) {
+        // Check that no parent directories have already been added (we have
+        // guarantees here as the list was sorted above.)
+        bool parentDirectoryInListAlready = false;
+        for (int i = 0; i < includedPathList.length; i++) {
+          if (containedDir.startsWith(includedPathList[i])) {
+            parentDirectoryInListAlready = true;
+          }
+        }
+        if (!parentDirectoryInListAlready) {
+          includedPathList.add(containedDir);
+        }
+      }
+
+      server.setAnalysisRoots(
+          request.id, includedPathList, <String>[], <String, String>{});
+    }
+
     server.setPriorityFiles(request.id, params.files);
     //
     // Forward the request to the plugins.
diff --git a/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart b/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart
new file mode 100644
index 0000000..dc2cead
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/analysis_server.dart';
+
+/**
+ * A class that can be used to confirm an analysis server instance to better
+ * support intermittent file systems.
+ *
+ * See also [AnalysisServerOptions.detachableFileSystemManager].
+ */
+abstract class DetachableFileSystemManager {
+  /**
+   * Indicate that the [DetachableFileSystemManager] and the containing analysis
+   * server are being shut down.
+   */
+  void dispose();
+
+  /**
+   * Forward on the 'analysis.setAnalysisRoots' request.
+   *
+   * This class can choose to pass through all [setAnalysisRoots] calls to the
+   * underlying analysis server, it can choose to modify the given
+   * [includedPaths] and other parameters, or it could choose to delays calls to
+   * [setAnalysisRoots].
+   */
+  void setAnalysisRoots(String requestId, List<String> includedPaths,
+      List<String> excludedPaths, Map<String, String> packageRoots);
+
+  /**
+   * Called exactly once before any calls to [setAnalysisRoots].
+   */
+  void setAnalysisServer(AnalysisServer server);
+}
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 59a43f0..0ee7c49 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -7,6 +7,7 @@
 import 'dart:math';
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/dev_server.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/server/http_server.dart';
@@ -265,6 +266,19 @@
   static const String TRAIN_USING = "train-using";
 
   /**
+   * User Experience, Experiment #1. This experiment changes the notion of
+   * what analysis roots are and priority files: the analysis root is set to be
+   * the priority files' containing directory.
+   */
+  static const String UX_EXPERIMENT_1 = "ux-experiment-1";
+
+  /**
+   * User Experience, Experiment #2. This experiment introduces the notion of an
+   * intermittent file system.
+   */
+  static const String UX_EXPERIMENT_2 = "ux-experiment-2";
+
+  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -281,6 +295,12 @@
    */
   ResolverProvider packageResolverProvider;
 
+  /***
+   * An optional manager to handle file systems which may not always be
+   * available.
+   */
+  DetachableFileSystemManager detachableFileSystemManager;
+
   SocketServer socketServer;
 
   HttpAnalysisServer httpServer;
@@ -308,6 +328,8 @@
     analysisServerOptions.clientVersion = results[CLIENT_VERSION];
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     analysisServerOptions.useFastaParser = results[USE_FASTA_PARSER];
+    analysisServerOptions.enableUXExperiment1 = results[UX_EXPERIMENT_1];
+    analysisServerOptions.enableUXExperiment2 = results[UX_EXPERIMENT_2];
 
     bool disableAnalyticsForSession = results[SUPPRESS_ANALYTICS_FLAG];
     if (results.wasParsed(TRAIN_USING)) {
@@ -431,7 +453,8 @@
         instrumentationService,
         diagnosticServer,
         fileResolverProvider,
-        packageResolverProvider);
+        packageResolverProvider,
+        detachableFileSystemManager);
     httpServer = new HttpAnalysisServer(socketServer);
 
     diagnosticServer.httpServer = httpServer;
@@ -465,6 +488,8 @@
         }
         await instrumentationService.shutdown();
 
+        socketServer.analysisServer.shutdown();
+
         try {
           tempDriverDir.deleteSync(recursive: true);
         } catch (_) {
@@ -479,10 +504,12 @@
         stdioServer.serveStdio().then((_) async {
           // TODO(brianwilkerson) Determine whether this await is necessary.
           await null;
+
           if (serve_http) {
             httpServer.close();
           }
           await instrumentationService.shutdown();
+          socketServer.analysisServer.shutdown();
           exit(0);
         });
       },
@@ -588,6 +615,16 @@
     parser.addOption(TRAIN_USING,
         help: "Pass in a directory to analyze for purposes of training an "
             "analysis server snapshot.");
+    parser.addFlag(UX_EXPERIMENT_1,
+        help: "User Experience, Experiment #1, "
+            "this experiment changes the notion of analysis roots and priority "
+            "files.",
+        hide: true);
+    parser.addFlag(UX_EXPERIMENT_2,
+        help: "User Experience, Experiment #2, "
+            "this experiment introduces the notion of an intermittent file "
+            "system.",
+        hide: true);
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 41a4803..e2ade9f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -227,6 +227,15 @@
    * location of this [Expression] in AST allows extracting.
    */
   RefactoringStatus _checkSelection() {
+    if (selectionOffset <= 0) {
+      return new RefactoringStatus.fatal(
+          'The selection offset must be greater than zero.');
+    }
+    if (selectionOffset + selectionLength >= resolveResult.content.length) {
+      return new RefactoringStatus.fatal(
+          'The selection end offset must be less then the length of the file.');
+    }
+
     String selectionStr;
     // exclude whitespaces
     {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index aa110e0..3b201fb 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -15,6 +15,46 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 /**
+ * Helper for renaming one or more [Element]s.
+ */
+class RenameProcessor {
+  final SearchEngine searchEngine;
+  final SourceChange change;
+  final String newName;
+
+  RenameProcessor(this.searchEngine, this.change, this.newName);
+
+  /**
+   * Add the edit that updates the [element] declaration.
+   */
+  void addDeclarationEdit(Element element) {
+    if (element != null) {
+      SourceEdit edit =
+          newSourceEdit_range(range.elementName(element), newName);
+      doSourceChange_addElementEdit(change, element, edit);
+    }
+  }
+
+  /**
+   * Add edits that update [matches].
+   */
+  void addReferenceEdits(List<SearchMatch> matches) {
+    List<SourceReference> references = getSourceReferences(matches);
+    for (SourceReference reference in references) {
+      reference.addEdit(change, newName);
+    }
+  }
+
+  /**
+   * Update the [element] declaration and reference to it.
+   */
+  Future<void> renameElement(Element element) {
+    addDeclarationEdit(element);
+    return searchEngine.searchReferences(element).then(addReferenceEdits);
+  }
+}
+
+/**
  * An abstract implementation of [RenameRefactoring].
  */
 abstract class RenameRefactoringImpl extends RefactoringImpl
@@ -36,27 +76,6 @@
 
   Element get element => _element;
 
-  /**
-   * Adds a [SourceEdit] to update [element] name to [change].
-   */
-  void addDeclarationEdit(Element element) {
-    if (element != null) {
-      SourceEdit edit =
-          newSourceEdit_range(range.elementName(element), newName);
-      doSourceChange_addElementEdit(change, element, edit);
-    }
-  }
-
-  /**
-   * Adds [SourceEdit]s to update [matches] to [change].
-   */
-  void addReferenceEdits(List<SearchMatch> matches) {
-    List<SourceReference> references = getSourceReferences(matches);
-    for (SourceReference reference in references) {
-      reference.addEdit(change, newName);
-    }
-  }
-
   @override
   Future<RefactoringStatus> checkInitialConditions() {
     RefactoringStatus result = new RefactoringStatus();
@@ -100,7 +119,7 @@
   /**
    * Adds individual edits to [change].
    */
-  Future fillChange();
+  Future<void> fillChange();
 
   @override
   bool requiresPreview() {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index cf80af9..d085e78 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -86,20 +86,19 @@
   }
 
   @override
-  Future fillChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+  Future<void> fillChange() async {
+    var processor = new RenameProcessor(searchEngine, change, newName);
     // update declarations
     for (Element renameElement in _validator.elements) {
       if (renameElement.isSynthetic && renameElement is FieldElement) {
-        addDeclarationEdit(renameElement.getter);
-        addDeclarationEdit(renameElement.setter);
+        processor.addDeclarationEdit(renameElement.getter);
+        processor.addDeclarationEdit(renameElement.setter);
       } else {
-        addDeclarationEdit(renameElement);
+        processor.addDeclarationEdit(renameElement);
       }
     }
     // update references
-    addReferenceEdits(_validator.references);
+    processor.addReferenceEdits(_validator.references);
     // potential matches
     List<SearchMatch> nameMatches =
         await searchEngine.searchMemberReferences(oldName);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index ff84856..755ebff 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -56,7 +56,7 @@
   }
 
   @override
-  Future fillChange() async {
+  Future<void> fillChange() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // prepare references
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 2ebf57a..53e382b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -52,7 +52,7 @@
   }
 
   @override
-  Future fillChange() async {
+  Future<void> fillChange() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // update declaration
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index e8a62c9..643be1f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -38,8 +38,8 @@
   }
 
   @override
-  Future fillChange() {
-    addDeclarationEdit(element);
-    return searchEngine.searchReferences(element).then(addReferenceEdits);
+  Future<void> fillChange() {
+    var processor = new RenameProcessor(searchEngine, change, newName);
+    return processor.renameElement(element);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index ac8326b..e270f82 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -40,8 +40,8 @@
   }
 
   @override
-  Future fillChange() {
-    addDeclarationEdit(element);
-    return searchEngine.searchReferences(element).then(addReferenceEdits);
+  Future<void> fillChange() async {
+    var processor = new RenameProcessor(searchEngine, change, newName);
+    await processor.renameElement(element);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index ce99486..369b832 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -75,11 +75,10 @@
   }
 
   @override
-  Future fillChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+  Future<void> fillChange() async {
+    var processor = new RenameProcessor(searchEngine, change, newName);
     for (Element element in elements) {
-      addDeclarationEdit(element);
+      processor.addDeclarationEdit(element);
       var references = await searchEngine.searchReferences(element);
 
       // Exclude "implicit" references to optional positional parameters.
@@ -87,7 +86,7 @@
         references.removeWhere((match) => match.sourceRange.length == 0);
       }
 
-      addReferenceEdits(references);
+      processor.addReferenceEdits(references);
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index db3ad4e..88cac3a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/element_visitors.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
 import 'package:analyzer/dart/ast/ast.dart' show Identifier;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -42,6 +43,13 @@
  * A [Refactoring] for renaming compilation unit member [Element]s.
  */
 class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
+  /// If the [element] is a Flutter `StatefulWidget` declaration, this is the
+  /// corresponding `State` declaration.
+  ClassElement _flutterWidgetState;
+
+  /// If [_flutterWidgetState] is set, this is the new name of it.
+  String _flutterWidgetStateNewName;
+
   RenameUnitMemberRefactoringImpl(
       RefactoringWorkspace workspace, Element element)
       : super(workspace, element);
@@ -61,8 +69,25 @@
   }
 
   @override
-  Future<RefactoringStatus> checkFinalConditions() {
-    return validateRenameTopLevel(searchEngine, element, newName);
+  Future<RefactoringStatus> checkFinalConditions() async {
+    var status = await validateRenameTopLevel(searchEngine, element, newName);
+    if (_flutterWidgetState != null) {
+      _updateFlutterWidgetStateName();
+      status.addStatus(
+        await validateRenameTopLevel(
+          searchEngine,
+          _flutterWidgetState,
+          _flutterWidgetStateNewName,
+        ),
+      );
+    }
+    return status;
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    _findFlutterStateClass();
+    return super.checkInitialConditions();
   }
 
   @override
@@ -84,7 +109,7 @@
   }
 
   @override
-  Future fillChange() {
+  Future<void> fillChange() async {
     // prepare elements
     List<Element> elements = [];
     if (element is PropertyInducingElement && element.isSynthetic) {
@@ -100,11 +125,41 @@
     } else {
       elements.add(element);
     }
-    // update each element
-    return Future.forEach(elements, (Element element) {
-      addDeclarationEdit(element);
-      return searchEngine.searchReferences(element).then(addReferenceEdits);
-    });
+
+    // Rename each element and references to it.
+    var processor = new RenameProcessor(searchEngine, change, newName);
+    for (var element in elements) {
+      await processor.renameElement(element);
+    }
+
+    // If a StatefulWidget is being renamed, rename also its State.
+    if (_flutterWidgetState != null) {
+      _updateFlutterWidgetStateName();
+      await new RenameProcessor(
+        searchEngine,
+        change,
+        _flutterWidgetStateNewName,
+      ).renameElement(_flutterWidgetState);
+    }
+  }
+
+  void _findFlutterStateClass() {
+    if (flutter.isStatefulWidgetDeclaration(element)) {
+      var oldStateName = oldName + 'State';
+      _flutterWidgetState = element.library.getType(oldStateName) ??
+          element.library.getType('_' + oldStateName);
+    }
+  }
+
+  void _updateFlutterWidgetStateName() {
+    if (_flutterWidgetState != null) {
+      _flutterWidgetStateNewName = newName + 'State';
+      // If the State was private, ensure that it stays private.
+      if (_flutterWidgetState.name.startsWith('_') &&
+          !_flutterWidgetStateNewName.startsWith('_')) {
+        _flutterWidgetStateNewName = '_' + _flutterWidgetStateNewName;
+      }
+    }
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 250c072..4fd78db 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
+import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -31,6 +32,7 @@
   final DiagnosticServer diagnosticServer;
   final ResolverProvider fileResolverProvider;
   final ResolverProvider packageResolverProvider;
+  final DetachableFileSystemManager detachableFileSystemManager;
 
   /**
    * The analysis server that was created when a client established a
@@ -45,7 +47,8 @@
       this.instrumentationService,
       this.diagnosticServer,
       this.fileResolverProvider,
-      this.packageResolverProvider);
+      this.packageResolverProvider,
+      this.detachableFileSystemManager);
 
   /**
    * Create an analysis server which will communicate with the client using the
@@ -75,10 +78,17 @@
           'File read mode was set to the unknown mode: $analysisServerOptions.fileReadMode');
     }
 
-    analysisServer = new AnalysisServer(serverChannel, resourceProvider,
-        analysisServerOptions, sdkManager, instrumentationService,
-        diagnosticServer: diagnosticServer,
-        fileResolverProvider: fileResolverProvider,
-        packageResolverProvider: packageResolverProvider);
+    analysisServer = new AnalysisServer(
+      serverChannel,
+      resourceProvider,
+      analysisServerOptions,
+      sdkManager,
+      instrumentationService,
+      diagnosticServer: diagnosticServer,
+      fileResolverProvider: fileResolverProvider,
+      packageResolverProvider: packageResolverProvider,
+      detachableFileSystemManager: detachableFileSystemManager,
+    );
+    detachableFileSystemManager?.setAnalysisServer(analysisServer);
   }
 }
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 7fc00fd..4628c6f 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -1307,6 +1307,14 @@
         diagnosticsSite.socketServer.analysisServerOptions.useFastaParser));
     buf.writeln(writeOption('Instrumentation enabled',
         AnalysisEngine.instance.instrumentationService.isActive));
+    bool uxExp1 =
+        diagnosticsSite.socketServer.analysisServerOptions.enableUXExperiment1;
+    bool uxExp2 =
+        diagnosticsSite.socketServer.analysisServerOptions.enableUXExperiment2;
+    if (uxExp1 || uxExp2) {
+      buf.writeln(writeOption('UX Experiment 1', uxExp1));
+      buf.writeln(writeOption('ux Experiment 2', uxExp2));
+    }
     buf.writeln(writeOption('Server process ID', pid));
     buf.writeln('</div>');
 
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index db72512..06c3d3c 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -319,6 +319,17 @@
 }
 
 /**
+ * Return `true` if the given [element] is a [ClassElement] that extends
+ * the Flutter class `StatefulWidget`.
+ */
+bool isStatefulWidgetDeclaration(Element element) {
+  if (element is ClassElement) {
+    return isExactlyStatefulWidgetType(element.supertype);
+  }
+  return false;
+}
+
+/**
  * Return `true` if the given [element] is the Flutter class `Widget`, or its
  * subtype.
  */
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
index 5059a59..aa4a30e 100644
--- a/pkg/analysis_server/lib/starter.dart
+++ b/pkg/analysis_server/lib/starter.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/driver.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
@@ -19,6 +20,12 @@
    */
   factory ServerStarter() = Driver;
 
+  /***
+   * An optional manager to handle file systems which may not always be
+   * available.
+   */
+  void set detachableFileSystemManager(DetachableFileSystemManager manager);
+
   /**
    * Set the file resolver provider used to override the way file URI's
    * are resolved in some contexts. The provider should return `null` if the
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 48b395c..5a877b3 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -180,7 +180,6 @@
     expect(suggestions, hasLength(2));
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_constructor() async {
     addTestFile('class A {bool foo; A() : ^;}');
     await getSuggestions();
@@ -190,7 +189,6 @@
         relevance: DART_RELEVANCE_LOCAL_FIELD);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_constructor2() async {
     addTestFile('class A {bool foo; A() : s^;}');
     await getSuggestions();
@@ -200,7 +198,6 @@
         relevance: DART_RELEVANCE_LOCAL_FIELD);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_constructor3() async {
     addTestFile('class A {bool foo; A() : a=7,^;}');
     await getSuggestions();
@@ -210,7 +207,6 @@
         relevance: DART_RELEVANCE_LOCAL_FIELD);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_constructor4() async {
     addTestFile('class A {bool foo; A() : a=7,s^;}');
     await getSuggestions();
@@ -220,7 +216,6 @@
         relevance: DART_RELEVANCE_LOCAL_FIELD);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_constructor5() async {
     addTestFile('class A {bool foo; A() : a=7,s^}');
     await getSuggestions();
@@ -230,7 +225,6 @@
         relevance: DART_RELEVANCE_LOCAL_FIELD);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_constructor6() async {
     addTestFile('class A {bool foo; A() : a=7,^ void bar() {}}');
     await getSuggestions();
@@ -538,11 +532,11 @@
         relevance: DART_RELEVANCE_LOCAL_FUNCTION);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_inherited() {
-    newFile('/libA.dart', content: 'class A {m() {}}');
     addTestFile('''
-import ${convertPathForImport('/libA.dart')};
+class A {
+  m() {}
+}
 class B extends A {
   x() {^}
 }
diff --git a/pkg/analysis_server/test/integration/coverage.md b/pkg/analysis_server/test/integration/coverage.md
index 2dbaa43..dcec50a 100644
--- a/pkg/analysis_server/test/integration/coverage.md
+++ b/pkg/analysis_server/test/integration/coverage.md
@@ -38,6 +38,7 @@
 - [x] diagnostic.getServerPort
 
 ## edit domain
+- [ ] edit.dartfix
 - [x] edit.format
 - [x] edit.getAssists
 - [x] edit.getAvailableRefactorings
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index 3433f34..0d95b2b 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1495,6 +1495,39 @@
   }
 
   /**
+   * Analyze the specified sources for recommended changes and return a set of
+   * suggested edits for those sources. These edits may include changes to
+   * sources outside the set of specified sources if a change in a specified
+   * source requires it.
+   *
+   * Parameters
+   *
+   * included: List<FilePath>
+   *
+   *   A list of the files and directories for which edits should be suggested.
+   *   If a request is made for a file which does not exist, or which is not
+   *   currently subject to analysis (e.g. because it is not associated with
+   *   any analysis root specified to analysis.setAnalysisRoots), an error of
+   *   type FORMAT_INVALID_FILE will be generated.
+   *
+   * Returns
+   *
+   * description: List<String>
+   *
+   *   A list of human readable changes made by applying the fixes.
+   *
+   * fixes: List<SourceFileEdit>
+   *
+   *   The suggested fixes.
+   */
+  Future<EditDartfixResult> sendEditDartfix(List<String> included) async {
+    var params = new EditDartfixParams(included).toJson();
+    var result = await server.send("edit.dartfix", params);
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    return new EditDartfixResult.fromJson(decoder, 'result', result);
+  }
+
+  /**
    * Return the set of fixes that are available for the errors at a given
    * offset in a given file.
    *
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 11b741a..26ecc39 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -2122,6 +2122,28 @@
     new MatchesJsonObject("diagnostic.getServerPort result", {"port": isInt}));
 
 /**
+ * edit.dartfix params
+ *
+ * {
+ *   "included": List<FilePath>
+ * }
+ */
+final Matcher isEditDartfixParams = new LazyMatcher(() => new MatchesJsonObject(
+    "edit.dartfix params", {"included": isListOf(isFilePath)}));
+
+/**
+ * edit.dartfix result
+ *
+ * {
+ *   "description": List<String>
+ *   "fixes": List<SourceFileEdit>
+ * }
+ */
+final Matcher isEditDartfixResult = new LazyMatcher(() => new MatchesJsonObject(
+    "edit.dartfix result",
+    {"description": isListOf(isString), "fixes": isListOf(isSourceFileEdit)}));
+
+/**
  * edit.format params
  *
  * {
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 5799565..67f5ca5 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -507,7 +507,7 @@
         expect(location.startColumn, 7);
       }
       expect(element.parameters, isNull);
-      expect(element.flags, 0);
+      expect(element.flags, Element.FLAG_ABSTRACT);
     }
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index df1e893c..fd048d2 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -52,6 +52,28 @@
         expectedMessage: "The name 'res' is already used in the scope.");
   }
 
+  test_checkInitialCondition_false_outOfRange_length() async {
+    await indexTestUnit('''
+main() {
+  print(1 + 2);
+}
+''');
+    _createRefactoring(0, 1 << 20);
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+  }
+
+  test_checkInitialCondition_outOfRange_offset() async {
+    await indexTestUnit('''
+main() {
+  print(1 + 2);
+}
+''');
+    _createRefactoring(-10, 20);
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+  }
+
   test_checkInitialConditions_assignmentLeftHandSize() async {
     await indexTestUnit('''
 main() {
@@ -68,8 +90,7 @@
 
   test_checkInitialConditions_namePartOfDeclaration_function() async {
     await indexTestUnit('''
-main() {
-}
+void main() {}
 ''');
     _createRefactoringWithSuffix('main', '()');
     // check conditions
@@ -695,6 +716,24 @@
     expect(refactoring.names, unorderedEquals(['helloBob', 'bob']));
   }
 
+  test_isAvailable_false_notPartOfFunction() async {
+    await indexTestUnit('''
+var v = 1 + 2;
+''');
+    _createRefactoringForString('1 + 2');
+    expect(refactoring.isAvailable(), isFalse);
+  }
+
+  test_isAvailable_true() async {
+    await indexTestUnit('''
+main() {
+  print(1 + 2);
+}
+''');
+    _createRefactoringForString('1 + 2');
+    expect(refactoring.isAvailable(), isTrue);
+  }
+
   test_occurrences_differentVariable() async {
     await indexTestUnit('''
 main() {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index e5c22bf..1db7113 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -367,6 +367,129 @@
 ''');
   }
 
+  test_createChange_ClassElement_flutterWidget() async {
+    addFlutterPackage();
+    await indexTestUnit('''
+import 'package:flutter/material.dart';
+
+class TestPage extends StatefulWidget {
+  const TestPage();
+
+  @override
+  TestPageState createState() => new TestPageState();
+}
+
+class TestPageState extends State<TestPage> {
+  @override
+  Widget build(BuildContext context) => null;
+}
+''');
+    createRenameRefactoringAtString('TestPage extends');
+
+    expect(refactoring.refactoringName, 'Rename Class');
+    expect(refactoring.elementKindName, 'class');
+    expect(refactoring.oldName, 'TestPage');
+    refactoring.newName = 'NewPage';
+
+    return assertSuccessfulRefactoring('''
+import 'package:flutter/material.dart';
+
+class NewPage extends StatefulWidget {
+  const NewPage();
+
+  @override
+  NewPageState createState() => new NewPageState();
+}
+
+class NewPageState extends State<NewPage> {
+  @override
+  Widget build(BuildContext context) => null;
+}
+''');
+  }
+
+  test_createChange_ClassElement_flutterWidget_privateBoth() async {
+    addFlutterPackage();
+    await indexTestUnit('''
+import 'package:flutter/material.dart';
+
+class _TestPage extends StatefulWidget {
+  const _TestPage();
+
+  @override
+  _TestPageState createState() => new _TestPageState();
+}
+
+class _TestPageState extends State<_TestPage> {
+  @override
+  Widget build(BuildContext context) => null;
+}
+''');
+    createRenameRefactoringAtString('_TestPage extends');
+
+    expect(refactoring.refactoringName, 'Rename Class');
+    expect(refactoring.elementKindName, 'class');
+    expect(refactoring.oldName, '_TestPage');
+    refactoring.newName = '_NewPage';
+
+    return assertSuccessfulRefactoring('''
+import 'package:flutter/material.dart';
+
+class _NewPage extends StatefulWidget {
+  const _NewPage();
+
+  @override
+  _NewPageState createState() => new _NewPageState();
+}
+
+class _NewPageState extends State<_NewPage> {
+  @override
+  Widget build(BuildContext context) => null;
+}
+''');
+  }
+
+  test_createChange_ClassElement_flutterWidget_privateState() async {
+    addFlutterPackage();
+    await indexTestUnit('''
+import 'package:flutter/material.dart';
+
+class TestPage extends StatefulWidget {
+  const TestPage();
+
+  @override
+  _TestPageState createState() => new _TestPageState();
+}
+
+class _TestPageState extends State<TestPage> {
+  @override
+  Widget build(BuildContext context) => null;
+}
+''');
+    createRenameRefactoringAtString('TestPage extends');
+
+    expect(refactoring.refactoringName, 'Rename Class');
+    expect(refactoring.elementKindName, 'class');
+    expect(refactoring.oldName, 'TestPage');
+    refactoring.newName = 'NewPage';
+
+    return assertSuccessfulRefactoring('''
+import 'package:flutter/material.dart';
+
+class NewPage extends StatefulWidget {
+  const NewPage();
+
+  @override
+  _NewPageState createState() => new _NewPageState();
+}
+
+class _NewPageState extends State<NewPage> {
+  @override
+  Widget build(BuildContext context) => null;
+}
+''');
+  }
+
   test_createChange_ClassElement_invocation() async {
     verifyNoTestUnitErrors = false;
     await indexTestUnit('''
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 931d87e7..d6957be 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -117,6 +117,7 @@
         InstrumentationService.NULL_SERVICE,
         null,
         null,
+        null,
         null);
   }
 }
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 8a410b7..551d5dd 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -406,6 +406,20 @@
   public void diagnostic_getServerPort(GetServerPortConsumer consumer);
 
   /**
+   * {@code edit.dartfix}
+   *
+   * Analyze the specified sources for recommended changes and return a set of suggested edits for
+   * those sources. These edits may include changes to sources outside the set of specified sources
+   * if a change in a specified source requires it.
+   *
+   * @param included A list of the files and directories for which edits should be suggested. If a
+   *         request is made for a file which does not exist, or which is not currently subject to
+   *         analysis (e.g. because it is not associated with any analysis root specified to
+   *         analysis.setAnalysisRoots), an error of type FORMAT_INVALID_FILE will be generated.
+   */
+  public void edit_dartfix(List<String> included, DartfixConsumer consumer);
+
+  /**
    * {@code edit.format}
    *
    * Format the contents of a single file. The currently selected region of text is passed in so that
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 2334b39..d5b0623 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1933,6 +1933,46 @@
       </field>
     </result>
   </request>
+  <request method="dartfix" experimental="true">
+    <p>
+      Analyze the specified sources for recommended changes
+      and return a set of suggested edits for those sources.
+      These edits may include changes to sources outside the set
+      of specified sources if a change in a specified source requires it.
+    </p>
+    <params>
+      <field name="included">
+        <list>
+          <ref>FilePath</ref>
+        </list>
+        <p>
+          A list of the files and directories for which edits should be suggested.
+          If a request is made for a file which does not exist, or which is not
+          currently subject to analysis (e.g. because it is not associated with
+          any analysis root specified to analysis.setAnalysisRoots), an error of
+          type <tt>FORMAT_INVALID_FILE</tt> will be generated.
+        </p>
+      </field>
+    </params>
+    <result>
+      <field name="description">
+        <list>
+          <ref>String</ref>
+        </list>
+        <p>
+          A list of human readable changes made by applying the fixes.
+        </p>
+      </field>
+      <field name="fixes">
+        <list>
+          <ref>SourceFileEdit</ref>
+        </list>
+        <p>
+          The suggested fixes.
+        </p>
+      </field>
+    </result>
+  </request>
   <request method="getFixes">
     <p>
       Return the set of fixes that are available for the errors at
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index ed74e72..fdc7100 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -267,12 +267,6 @@
   PropertyAccessorElement getSetter(String name);
 
   /**
-   * Determine whether the given [constructor], which exists in the superclass
-   * of this class, is accessible to constructors in this class.
-   */
-  bool isSuperConstructorAccessible(ConstructorElement constructor);
-
-  /**
    * Return the element representing the method that results from looking up the
    * given [methodName] in this class with respect to the given [library],
    * ignoring abstract methods, or `null` if the look up fails. The behavior of
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 5759b93..7292017 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -181,7 +181,6 @@
   CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR,
   CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
   CompileTimeErrorCode.MIXIN_DEFERRED_CLASS,
-  CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
   CompileTimeErrorCode.MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES,
   CompileTimeErrorCode.MIXIN_INFERENCE_NO_MATCHING_CLASS,
   CompileTimeErrorCode.MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index fc72f2b..3269d69 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -93,7 +93,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 69;
+  static const int DATA_VERSION = 70;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 6fc964a..5d62f06 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -126,7 +126,6 @@
   Set<String> _definedClassMemberNames;
   Set<String> _definedTopLevelNames;
   Set<String> _referencedNames;
-  Set<String> _subtypedNames;
   AnalysisDriverUnlinkedUnit _driverUnlinkedUnit;
   UnlinkedUnit _unlinked;
   List<int> _apiSignature;
@@ -270,14 +269,6 @@
     return _referencedNames ??= _driverUnlinkedUnit.referencedNames.toSet();
   }
 
-  /**
-   * The names which are used in `extends`, `with` or `implements` clauses in
-   * the file. Import prefixes and type arguments are not included.
-   */
-  Set<String> get subtypedNames {
-    return _subtypedNames ??= _driverUnlinkedUnit.subtypedNames.toSet();
-  }
-
   @visibleForTesting
   FileStateTestView get test => new FileStateTestView(this);
 
@@ -412,6 +403,8 @@
    * Return `true` if the API signature changed since the last refresh.
    */
   bool refresh({bool allowCached: false}) {
+    _invalidateCurrentUnresolvedData();
+
     {
       var rawFileState = _fsState._fileContentCache.get(path, allowCached);
       _content = rawFileState.content;
@@ -469,13 +462,6 @@
     _unlinked = _driverUnlinkedUnit.unit;
     _lineInfo = new LineInfo(_unlinked.lineStarts);
 
-    // Invalidate unlinked information.
-    _definedTopLevelNames = null;
-    _definedClassMemberNames = null;
-    _referencedNames = null;
-    _subtypedNames = null;
-    _topLevelDeclarations = null;
-
     // Prepare API signature.
     bool apiSignatureChanged = _apiSignature != null &&
         !_equalByteLists(_apiSignature, apiSignatureBytes);
@@ -548,6 +534,16 @@
       }
     }
 
+    // Update mapping from subtyped names to files.
+    for (var name in _driverUnlinkedUnit.subtypedNames) {
+      var files = _fsState._subtypedNameToFiles[name];
+      if (files == null) {
+        files = new Set<FileState>();
+        _fsState._subtypedNameToFiles[name] = files;
+      }
+      files.add(this);
+    }
+
     // Return whether the API signature changed.
     return apiSignatureChanged;
   }
@@ -643,6 +639,25 @@
     return _fsState.getFileForUri(absoluteUri);
   }
 
+  /**
+   * Invalidate any data that depends on the current unlinked data of the file,
+   * because [refresh] is going to recompute the unlinked data.
+   */
+  void _invalidateCurrentUnresolvedData() {
+    // Invalidate unlinked information.
+    _definedTopLevelNames = null;
+    _definedClassMemberNames = null;
+    _referencedNames = null;
+    _topLevelDeclarations = null;
+
+    if (_driverUnlinkedUnit != null) {
+      for (var name in _driverUnlinkedUnit.subtypedNames) {
+        var files = _fsState._subtypedNameToFiles[name];
+        files?.remove(this);
+      }
+    }
+  }
+
   CompilationUnit _parse(AnalysisErrorListener errorListener) {
     if (source == null) {
       return _createEmptyCompilationUnit();
@@ -766,6 +781,11 @@
   final Map<FileState, List<FileState>> _partToLibraries = {};
 
   /**
+   * The map of subtyped names to files where these names are subtyped.
+   */
+  final Map<String, Set<FileState>> _subtypedNameToFiles = {};
+
+  /**
    * The value of this field is incremented when the set of files is updated.
    */
   int fileStamp = 0;
@@ -902,6 +922,14 @@
   }
 
   /**
+   * Return files where the given [name] is subtyped, i.e. used in `extends`,
+   * `with` or `implements` clauses.
+   */
+  Set<FileState> getFilesSubtypingName(String name) {
+    return _subtypedNameToFiles[name];
+  }
+
+  /**
    * Return `true` if there is a URI that can be resolved to the [path].
    *
    * When a file exists, but for the URI that corresponds to the file is
@@ -940,6 +968,7 @@
     _pathToFiles.clear();
     _pathToCanonicalFile.clear();
     _partToLibraries.clear();
+    _subtypedNameToFiles.clear();
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 69dd439..4e620344 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -212,7 +212,7 @@
   /**
    * All subtypes declared in the unit.
    */
-  final List<AnalysisDriverSubtypeBuilder> subtypes = [];
+  final List<_SubtypeInfo> subtypes = [];
 
   /**
    * The [_StringInfo] to use for `null` strings.
@@ -236,12 +236,25 @@
     nameRelations.add(new _NameRelationInfo(nameId, kind, offset, isQualified));
   }
 
+  void addSubtype(String name, List<String> members, List<String> supertypes) {
+    for (var supertype in supertypes) {
+      subtypes.add(
+        new _SubtypeInfo(
+          _getStringInfo(supertype),
+          _getStringInfo(name),
+          members.map(_getStringInfo).toList(),
+        ),
+      );
+    }
+  }
+
   /**
    * Index the [unit] and assemble a new [AnalysisDriverUnitIndexBuilder].
    */
   AnalysisDriverUnitIndexBuilder assemble(CompilationUnit unit) {
     unit.accept(new _IndexContributor(this));
-    // sort strings end set IDs
+
+    // Sort strings and set IDs.
     List<_StringInfo> stringInfoList = stringMap.values.toList();
     stringInfoList.sort((a, b) {
       return a.value.compareTo(b.value);
@@ -249,16 +262,17 @@
     for (int i = 0; i < stringInfoList.length; i++) {
       stringInfoList[i].id = i;
     }
-    // sort elements and set IDs
+
+    // Sort elements and set IDs.
     List<_ElementInfo> elementInfoList = elementMap.values.toList();
     elementInfoList.sort((a, b) {
       int delta;
       delta = a.nameIdUnitMember.id - b.nameIdUnitMember.id;
-      if (delta != null) {
+      if (delta != 0) {
         return delta;
       }
       delta = a.nameIdClassMember.id - b.nameIdClassMember.id;
-      if (delta != null) {
+      if (delta != 0) {
         return delta;
       }
       return a.nameIdParameter.id - b.nameIdParameter.id;
@@ -266,6 +280,7 @@
     for (int i = 0; i < elementInfoList.length; i++) {
       elementInfoList[i].id = i;
     }
+
     // Sort element and name relations.
     elementRelations.sort((a, b) {
       return a.elementInfo.id - b.elementInfo.id;
@@ -273,6 +288,12 @@
     nameRelations.sort((a, b) {
       return a.nameInfo.id - b.nameInfo.id;
     });
+
+    // Sort subtypes by supertypes.
+    subtypes.sort((a, b) {
+      return a.supertype.id - b.supertype.id;
+    });
+
     return new AnalysisDriverUnitIndexBuilder(
         strings: stringInfoList.map((s) => s.value).toList(),
         nullStringId: nullString.id,
@@ -297,7 +318,13 @@
         usedNameOffsets: nameRelations.map((r) => r.offset).toList(),
         usedNameIsQualifiedFlags:
             nameRelations.map((r) => r.isQualified).toList(),
-        subtypes: subtypes);
+        supertypes: subtypes.map((subtype) => subtype.supertype.id).toList(),
+        subtypes: subtypes.map((subtype) {
+          return new AnalysisDriverSubtypeBuilder(
+            name: subtype.name.id,
+            members: subtype.members.map((member) => member.id).toList(),
+          );
+        }).toList());
   }
 
   /**
@@ -806,8 +833,7 @@
     supertypes.sort();
     members.sort();
 
-    assembler.subtypes.add(new AnalysisDriverSubtypeBuilder(
-        name: name, supertypes: supertypes, members: members));
+    assembler.addSubtype(name, members, supertypes);
   }
 
   /**
@@ -938,3 +964,25 @@
 
   _StringInfo(this.value);
 }
+
+/**
+ * Information about a subtype in the index.
+ */
+class _SubtypeInfo {
+  /**
+   * The identifier of a direct supertype.
+   */
+  final _StringInfo supertype;
+
+  /**
+   * The name of the class.
+   */
+  final _StringInfo name;
+
+  /**
+   * The names of defined instance members.
+   */
+  final List<_StringInfo> members;
+
+  _SubtypeInfo(this.supertype, this.name, this.members);
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 658298a..9d1ff41 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -378,8 +378,6 @@
    */
   Future<List<SubtypeResult>> subtypes(
       {ClassElement type, SubtypeResult subtype}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     String name;
     String id;
     if (type != null) {
@@ -395,23 +393,14 @@
     final List<SubtypeResult> results = [];
 
     // Note, this is a defensive copy.
-    List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
+    var files = _driver.fsState.getFilesSubtypingName(name)?.toList();
 
-    for (FileState file in knownFiles) {
-      if (file.subtypedNames.contains(name)) {
+    if (files != null) {
+      for (FileState file in files) {
         AnalysisDriverUnitIndex index = await _driver.getIndex(file.path);
         if (index != null) {
-          for (AnalysisDriverSubtype subtype in index.subtypes) {
-            if (subtype.supertypes.contains(id)) {
-              FileState library = file.library ?? file;
-              results.add(new SubtypeResult(
-                library.uriStr,
-                '${library.uriStr};${file.uriStr};${subtype.name}',
-                subtype.name,
-                subtype.members,
-              ));
-            }
-          }
+          var request = new _IndexRequest(index);
+          request.addSubtypes(id, results, file);
         }
       }
     }
@@ -987,6 +976,32 @@
 
   _IndexRequest(this.index);
 
+  void addSubtypes(
+      String superIdString, List<SubtypeResult> results, FileState file) {
+    var superId = getStringId(superIdString);
+    if (superId == -1) {
+      return;
+    }
+
+    var superIndex = _findFirstOccurrence(index.supertypes, superId);
+    if (superIndex == -1) {
+      return;
+    }
+
+    var library = file.library ?? file;
+    for (; index.supertypes[superIndex] == superId; superIndex++) {
+      var subtype = index.subtypes[superIndex];
+      var name = index.strings[subtype.name];
+      var subId = '${library.uriStr};${file.uriStr};$name';
+      results.add(new SubtypeResult(
+        library.uriStr,
+        subId,
+        name,
+        subtype.members.map((m) => index.strings[m]).toList(),
+      ));
+    }
+  }
+
   /**
    * Return the [element]'s identifier in the [index] or `-1` if the
    * [element] is not referenced in the [index].
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 627ce03..63b3281 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/error/codes.dart' show CompileTimeErrorCode;
 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine;
@@ -614,50 +613,6 @@
     return super.documentationComment;
   }
 
-  /**
-   * Return `true` if [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] should
-   * be reported for this class.
-   */
-  bool get doesMixinLackConstructors {
-    if (!isMixinApplication && mixins.isEmpty) {
-      // This class is not a mixin application and it doesn't have a "with"
-      // clause, so CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS is
-      // inapplicable.
-      return false;
-    }
-    if (supertype == null) {
-      // Should never happen, since Object and mixins are the only classes that
-      // have no supertype, and they should have been caught by the test above.
-      assert(false);
-      return false;
-    }
-    // Find the nearest class in the supertype chain that is not a mixin
-    // application.
-    ClassElement nearestNonMixinClass = supertype.element;
-    if (nearestNonMixinClass.isMixinApplication) {
-      // Use a list to keep track of the classes we've seen, so that we won't
-      // go into an infinite loop in the event of a non-trivial loop in the
-      // class hierarchy.
-      List<ClassElement> classesSeen = <ClassElement>[this];
-      while (nearestNonMixinClass.isMixinApplication) {
-        if (classesSeen.contains(nearestNonMixinClass)) {
-          // Loop in the class hierarchy (which is reported elsewhere).  Don't
-          // confuse the user with further errors.
-          return false;
-        }
-        classesSeen.add(nearestNonMixinClass);
-        if (nearestNonMixinClass.supertype == null) {
-          // Should never happen, since Object and mixins are the only classes that
-          // have no supertype, and they are not mixin applications.
-          assert(false);
-          return false;
-        }
-        nearestNonMixinClass = nearestNonMixinClass.supertype.element;
-      }
-    }
-    return !nearestNonMixinClass.constructors.any(isSuperConstructorAccessible);
-  }
-
   @override
   TypeParameterizedElementMixin get enclosingTypeParameterContext => null;
 
@@ -1067,26 +1022,6 @@
       getNamedConstructorFromList(name, constructors);
 
   @override
-  bool isSuperConstructorAccessible(ConstructorElement constructor) {
-    if (!constructor.isAccessibleIn(library)) {
-      return false;
-    }
-    // If this class has no mixins, then all superclass constructors are
-    // accessible.
-    if (mixins.isEmpty) {
-      return true;
-    }
-    // Otherwise only constructors that lack optional parameters are
-    // accessible (see dartbug.com/19576).
-    for (ParameterElement parameter in constructor.parameters) {
-      if (parameter.isOptional) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(constructors, visitor);
@@ -1112,12 +1047,9 @@
       assert(false);
       constructorsToForward = <ConstructorElement>[];
     } else if (!supertype.element.isMixinApplication) {
-      List<ConstructorElement> superclassConstructors =
-          supertype.element.constructors;
-      // Filter out any constructors with optional parameters (see
-      // dartbug.com/15101).
-      constructorsToForward =
-          superclassConstructors.where(isSuperConstructorAccessible);
+      var library = this.library;
+      constructorsToForward = supertype.element.constructors
+          .where((constructor) => constructor.isAccessibleIn(library));
     } else {
       if (visitedClasses == null) {
         visitedClasses = <ClassElementImpl>[this];
@@ -1170,8 +1102,15 @@
             new List<ParameterElement>(count);
         for (int i = 0; i < count; i++) {
           ParameterElement superParameter = superParameters[i];
-          ParameterElementImpl implicitParameter =
-              new ParameterElementImpl(superParameter.name, -1);
+          ParameterElementImpl implicitParameter;
+          if (superParameter is DefaultParameterElementImpl) {
+            implicitParameter =
+                new DefaultParameterElementImpl(superParameter.name, -1)
+                  ..constantInitializer = superParameter.constantInitializer;
+          } else {
+            implicitParameter =
+                new ParameterElementImpl(superParameter.name, -1);
+          }
           implicitParameter.isConst = superParameter.isConst;
           implicitParameter.isFinal = superParameter.isFinal;
           // ignore: deprecated_member_use
@@ -3809,9 +3748,6 @@
   @override
   ConstructorElement getNamedConstructor(String name) => null;
 
-  @override
-  bool isSuperConstructorAccessible(ConstructorElement constructor) => false;
-
   void _resynthesizeMembers() {
     List<FieldElementImpl> fields = <FieldElementImpl>[];
     // Build the 'index' field.
@@ -6645,6 +6581,9 @@
       : super.forSerialized(unlinkedClass, enclosingUnit);
 
   @override
+  bool get isAbstract => true;
+
+  @override
   bool get isMixin => true;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index f2929a7..8d6f5f0 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -139,10 +139,6 @@
       actualElement.getSetter(setterName);
 
   @override
-  bool isSuperConstructorAccessible(ConstructorElement constructor) =>
-      actualElement.isSuperConstructorAccessible(constructor);
-
-  @override
   MethodElement lookUpConcreteMethod(
           String methodName, LibraryElement library) =>
       actualElement.lookUpConcreteMethod(methodName, library);
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index b8a110c..617f5a5 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1389,6 +1389,9 @@
         _typeArguments = _typeArgumentsComputer();
       } on RecursiveInstantiateToBounds {
         _hasTypeParameterReferenceInBound = true;
+        _typeArguments = new List<DartType>.filled(
+            element.typeParameters.length,
+            element.context.typeProvider.dynamicType);
       }
       _typeArgumentsComputer = null;
     }
@@ -1505,9 +1508,11 @@
     //
     List<DartType> jArgs = j.typeArguments;
     List<DartType> jVars = jElement.type.typeArguments;
-    supertype = supertype.substitute2(jArgs, jVars);
-    if (supertype == i) {
-      return true;
+    if (supertype != null) {
+      supertype = supertype.substitute2(jArgs, jVars);
+      if (supertype == i) {
+        return true;
+      }
     }
     //
     // I is listed in the on clause of J.
@@ -1761,11 +1766,13 @@
   }
 
   ExecutableElement lookUpInheritedMember(String name, LibraryElement library,
-      {bool concrete: false, bool setter: false}) {
+      {bool concrete: false, int stopMixinIndex, bool setter: false}) {
     HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
 
     ExecutableElement lookUpImpl(InterfaceTypeImpl type,
-        {bool acceptAbstract: false, bool includeType: true}) {
+        {bool acceptAbstract: false,
+        bool includeType: true,
+        int stopMixinIndex}) {
       if (type == null || !visitedClasses.add(type.element)) {
         return null;
       }
@@ -1782,15 +1789,15 @@
           if (!concrete || acceptAbstract || !result.isAbstract) {
             return result;
           }
-          ClassElementImpl elementImpl = type.element;
-          if (elementImpl.hasNoSuchMethod) {
-            return result;
-          }
         }
       }
 
-      for (InterfaceType mixin in type.mixins.reversed) {
-        var result = lookUpImpl(mixin, acceptAbstract: acceptAbstract);
+      var mixins = type.mixins;
+      for (var i = 0; i < mixins.length; i++) {
+        if (stopMixinIndex != null && i >= stopMixinIndex) {
+          break;
+        }
+        var result = lookUpImpl(mixins[i], acceptAbstract: acceptAbstract);
         if (result != null) {
           return result;
         }
@@ -1819,7 +1826,11 @@
       }
       return null;
     } else {
-      return lookUpImpl(this, includeType: false);
+      return lookUpImpl(
+        this,
+        includeType: false,
+        stopMixinIndex: stopMixinIndex,
+      );
     }
   }
 
@@ -2380,6 +2391,13 @@
         return member;
       }
     }
+    for (InterfaceType constraint in targetType.superclassConstraints) {
+      ExecutableElement member = _lookUpMemberInInterfaces(
+          constraint, true, library, visitedInterfaces, getMember);
+      if (member != null) {
+        return member;
+      }
+    }
     for (InterfaceType mixinType in targetType.mixins.reversed) {
       ExecutableElement member = _lookUpMemberInInterfaces(
           mixinType, true, library, visitedInterfaces, getMember);
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index b75e8d1..45a79c0 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -449,10 +449,7 @@
           correction:
               "Try using a generic function type (returnType 'Function(' parameters ')').");
 
-  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode(
-      'INVALID_HEX_ESCAPE',
-      "An escape sequence starting with '\\x' "
-      "must be followed by 2 hexadecimal digits.");
+  static const ParserErrorCode INVALID_HEX_ESCAPE = _INVALID_HEX_ESCAPE;
 
   static const ParserErrorCode INVALID_LITERAL_IN_CONFIGURATION =
       const ParserErrorCode('INVALID_LITERAL_IN_CONFIGURATION',
@@ -463,8 +460,7 @@
    * Parameters:
    * 0: the operator that is invalid
    */
-  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode(
-      'INVALID_OPERATOR', "The string '{0}' isn't a user-definable operator.");
+  static const ParserErrorCode INVALID_OPERATOR = _INVALID_OPERATOR;
 
   /**
    * Parameters:
@@ -484,16 +480,10 @@
       "The modifier 'sync' isn't allowed for an expression function body.",
       correction: "Try converting the body to a block.");
 
-  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode(
-      'INVALID_UNICODE_ESCAPE',
-      "An escape sequence starting with '\\u' must be followed by 4 "
-      "hexadecimal digits or from 1 to 6 digits between '{' and '}'.");
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = _INVALID_UNICODE_ESCAPE;
 
   static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST =
-      const ParserErrorCode('LIBRARY_DIRECTIVE_NOT_FIRST',
-          "The library directive must appear before all other directives.",
-          correction:
-              "Try moving the library directive before any other directives.");
+      _LIBRARY_DIRECTIVE_NOT_FIRST;
 
   static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER =
       const ParserErrorCode('LOCAL_FUNCTION_DECLARATION_MODIFIER',
@@ -501,14 +491,10 @@
           correction: "Try removing the modifier.");
 
   static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR =
-      const ParserErrorCode('MISSING_ASSIGNABLE_SELECTOR',
-          "Missing selector such as '.<identifier>' or '[0]'.",
-          correction: "Try adding a selector.");
+      _MISSING_ASSIGNABLE_SELECTOR;
 
   static const ParserErrorCode MISSING_ASSIGNMENT_IN_INITIALIZER =
-      const ParserErrorCode('MISSING_ASSIGNMENT_IN_INITIALIZER',
-          "Expected an assignment after the field name.",
-          correction: "Try adding an assignment to initialize the field.");
+      _MISSING_ASSIGNMENT_IN_INITIALIZER;
 
   static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode(
       'MISSING_CATCH_OR_FINALLY',
@@ -527,11 +513,8 @@
           'MISSING_CLOSING_PARENTHESIS', "The closing parenthesis is missing.",
           correction: "Try adding the closing parenthesis.");
 
-  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode(
-      'MISSING_CONST_FINAL_VAR_OR_TYPE',
-      "Variables must be declared using the keywords 'const', 'final', 'var' or a type name.",
-      correction:
-          "Try adding the name of the type of the variable or the keyword 'var'.");
+  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE =
+      _MISSING_CONST_FINAL_VAR_OR_TYPE;
 
   static const ParserErrorCode MISSING_ENUM_BODY = const ParserErrorCode(
       'MISSING_ENUM_BODY',
@@ -545,9 +528,7 @@
               "remove the assignment operator.");
 
   static const ParserErrorCode MISSING_EXPRESSION_IN_THROW =
-      const ParserErrorCode(
-          'MISSING_EXPRESSION_IN_THROW', "Missing expression after 'throw'.",
-          correction: "Try using 'rethrow' to throw the caught exception.");
+      _MISSING_EXPRESSION_IN_THROW;
 
   static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode(
       'MISSING_FUNCTION_BODY', "A function body must be provided.",
@@ -571,13 +552,10 @@
   static const ParserErrorCode MISSING_IDENTIFIER =
       const ParserErrorCode('MISSING_IDENTIFIER', "Expected an identifier.");
 
-  static const ParserErrorCode MISSING_INITIALIZER =
-      const ParserErrorCode('MISSING_INITIALIZER', "Expected an initializer.");
+  static const ParserErrorCode MISSING_INITIALIZER = _MISSING_INITIALIZER;
 
-  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode(
-      'MISSING_KEYWORD_OPERATOR',
-      "Operator declarations must be preceeded by the keyword 'operator'.",
-      correction: "Try adding the keyword 'operator'.");
+  static const ParserErrorCode MISSING_KEYWORD_OPERATOR =
+      _MISSING_KEYWORD_OPERATOR;
 
   static const ParserErrorCode MISSING_METHOD_PARAMETERS =
       const ParserErrorCode('MISSING_METHOD_PARAMETERS',
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index 4c26c3a..ad89d34 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -38,152 +38,210 @@
   _MULTIPLE_EXTENDS_CLAUSES,
   _MISSING_STATEMENT,
   _MISSING_PREFIX_IN_DEFERRED_IMPORT,
+  _MISSING_KEYWORD_OPERATOR,
+  _MISSING_EXPRESSION_IN_THROW,
+  _MISSING_CONST_FINAL_VAR_OR_TYPE,
+  _MISSING_ASSIGNMENT_IN_INITIALIZER,
+  _MISSING_ASSIGNABLE_SELECTOR,
+  _MISSING_INITIALIZER,
+  _LIBRARY_DIRECTIVE_NOT_FIRST,
+  _INVALID_UNICODE_ESCAPE,
+  _INVALID_OPERATOR,
+  _INVALID_HEX_ESCAPE,
 ];
 
 const ParserErrorCode _CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode(
     'CONTINUE_OUTSIDE_OF_LOOP',
-    "A continue statement can't be used outside of a loop or switch statement.",
+    r"A continue statement can't be used outside of a loop or switch statement.",
     correction: "Try removing the continue statement.");
 
 const ParserErrorCode _COVARIANT_AFTER_VAR = const ParserErrorCode(
     'COVARIANT_AFTER_VAR',
-    "The modifier 'covariant' should be before the modifier 'var'.",
+    r"The modifier 'covariant' should be before the modifier 'var'.",
     correction: "Try re-ordering the modifiers.");
 
 const ParserErrorCode _EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode(
     'EQUALITY_CANNOT_BE_EQUALITY_OPERAND',
-    "An equality expression can't be an operand of another equality expression.",
+    r"An equality expression can't be an operand of another equality expression.",
     correction: "Try re-writing the expression.");
 
 const ParserErrorCode _EXTERNAL_CLASS = const ParserErrorCode(
-    'EXTERNAL_CLASS', "Classes can't be declared to be 'external'.",
+    'EXTERNAL_CLASS', r"Classes can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
 
 const ParserErrorCode _EXTERNAL_ENUM = const ParserErrorCode(
-    'EXTERNAL_ENUM', "Enums can't be declared to be 'external'.",
+    'EXTERNAL_ENUM', r"Enums can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
 
 const ParserErrorCode _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
     const ParserErrorCode('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
-        "Import directives must preceed part directives.",
+        r"Import directives must preceed part directives.",
         correction:
             "Try moving the import directives before the part directives.");
 
 const ParserErrorCode _INVALID_AWAIT_IN_FOR = const ParserErrorCode(
     'INVALID_AWAIT_IN_FOR',
-    "The keyword 'await' isn't allowed for a normal 'for' statement.",
+    r"The keyword 'await' isn't allowed for a normal 'for' statement.",
     correction: "Try removing the keyword, or use a for-each statement.");
 
+const ParserErrorCode _INVALID_HEX_ESCAPE = const ParserErrorCode(
+    'INVALID_HEX_ESCAPE',
+    r"An escape sequence starting with '\x' must be followed by 2 hexadecimal digits.");
+
+const ParserErrorCode _INVALID_OPERATOR = const ParserErrorCode(
+    'INVALID_OPERATOR',
+    r"The string '#lexeme' isn't a user-definable operator.");
+
+const ParserErrorCode _INVALID_UNICODE_ESCAPE = const ParserErrorCode(
+    'INVALID_UNICODE_ESCAPE',
+    r"An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.");
+
+const ParserErrorCode _LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode(
+    'LIBRARY_DIRECTIVE_NOT_FIRST',
+    r"The library directive must appear before all other directives.",
+    correction:
+        "Try moving the library directive before any other directives.");
+
+const ParserErrorCode _MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode(
+    'MISSING_ASSIGNABLE_SELECTOR',
+    r"Missing selector such as '.<identifier>' or '[0]'.",
+    correction: "Try adding a selector.");
+
+const ParserErrorCode _MISSING_ASSIGNMENT_IN_INITIALIZER =
+    const ParserErrorCode('MISSING_ASSIGNMENT_IN_INITIALIZER',
+        r"Expected an assignment after the field name.",
+        correction: "To initialize a field, use the syntax 'name = value'.");
+
+const ParserErrorCode _MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode(
+    'MISSING_CONST_FINAL_VAR_OR_TYPE',
+    r"Variables must be declared using the keywords 'const', 'final', 'var' or a type name.",
+    correction:
+        "Try adding the name of the type of the variable or the keyword 'var'.");
+
+const ParserErrorCode _MISSING_EXPRESSION_IN_THROW = const ParserErrorCode(
+    'MISSING_EXPRESSION_IN_THROW', r"Missing expression after 'throw'.",
+    correction:
+        "Add an expression after 'throw' or use 'rethrow' to throw a caught exception");
+
+const ParserErrorCode _MISSING_INITIALIZER =
+    const ParserErrorCode('MISSING_INITIALIZER', r"Expected an initializer.");
+
+const ParserErrorCode _MISSING_KEYWORD_OPERATOR = const ParserErrorCode(
+    'MISSING_KEYWORD_OPERATOR',
+    r"Operator declarations must be preceeded by the keyword 'operator'.",
+    correction: "Try adding the keyword 'operator'.");
+
 const ParserErrorCode _MISSING_PREFIX_IN_DEFERRED_IMPORT =
     const ParserErrorCode('MISSING_PREFIX_IN_DEFERRED_IMPORT',
-        "Deferred imports should have a prefix.",
+        r"Deferred imports should have a prefix.",
         correction: "Try adding a prefix to the import.");
 
 const ParserErrorCode _MISSING_STATEMENT =
-    const ParserErrorCode('MISSING_STATEMENT', "Expected a statement.");
+    const ParserErrorCode('MISSING_STATEMENT', r"Expected a statement.");
 
 const ParserErrorCode _MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode(
     'MULTIPLE_EXTENDS_CLAUSES',
-    "Each class definition can have at most one extends clause.",
+    r"Each class definition can have at most one extends clause.",
     correction:
         "Try choosing one superclass and define your class to implement (or mix in) the others.");
 
 const ParserErrorCode _MULTIPLE_LIBRARY_DIRECTIVES = const ParserErrorCode(
     'MULTIPLE_LIBRARY_DIRECTIVES',
-    "Only one library directive may be declared in a file.",
+    r"Only one library directive may be declared in a file.",
     correction: "Try removing all but one of the library directives.");
 
 const ParserErrorCode _MULTIPLE_ON_CLAUSES = const ParserErrorCode(
     'MULTIPLE_ON_CLAUSES',
-    "Each mixin definition can have at most one on clause.",
+    r"Each mixin definition can have at most one on clause.",
     correction: "Try combining all of the on clauses into a single clause.");
 
 const ParserErrorCode _MULTIPLE_PART_OF_DIRECTIVES = const ParserErrorCode(
     'MULTIPLE_PART_OF_DIRECTIVES',
-    "Only one part-of directive may be declared in a file.",
+    r"Only one part-of directive may be declared in a file.",
     correction: "Try removing all but one of the part-of directives.");
 
 const ParserErrorCode _MULTIPLE_WITH_CLAUSES = const ParserErrorCode(
     'MULTIPLE_WITH_CLAUSES',
-    "Each class definition can have at most one with clause.",
+    r"Each class definition can have at most one with clause.",
     correction: "Try combining all of the with clauses into a single clause.");
 
 const ParserErrorCode _NATIVE_CLAUSE_SHOULD_BE_ANNOTATION = const ParserErrorCode(
     'NATIVE_CLAUSE_SHOULD_BE_ANNOTATION',
-    "Native clause in this form is deprecated.",
+    r"Native clause in this form is deprecated.",
     correction:
         "Try removing this native clause and adding @native() or @native('native-name') before the declaration.");
 
 const ParserErrorCode _PREFIX_AFTER_COMBINATOR = const ParserErrorCode(
     'PREFIX_AFTER_COMBINATOR',
-    "The prefix ('as' clause) should come before any show/hide combinators.",
+    r"The prefix ('as' clause) should come before any show/hide combinators.",
     correction: "Try moving the prefix before the combinators.");
 
 const ParserErrorCode _REDIRECTING_CONSTRUCTOR_WITH_BODY = const ParserErrorCode(
     'REDIRECTING_CONSTRUCTOR_WITH_BODY',
-    "Redirecting constructors can't have a body.",
+    r"Redirecting constructors can't have a body.",
     correction:
         "Try removing the body, or not making this a redirecting constructor.");
 
 const ParserErrorCode _REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR =
     const ParserErrorCode('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR',
-        "Only factory constructor can specify '=' redirection.",
+        r"Only factory constructor can specify '=' redirection.",
         correction:
             "Try making this a factory constructor, or remove the redirection.");
 
 const ParserErrorCode _STATIC_AFTER_CONST = const ParserErrorCode(
     'STATIC_AFTER_CONST',
-    "The modifier 'static' should be before the modifier 'const'.",
+    r"The modifier 'static' should be before the modifier 'const'.",
     correction: "Try re-ordering the modifiers.");
 
 const ParserErrorCode _STATIC_AFTER_FINAL = const ParserErrorCode(
     'STATIC_AFTER_FINAL',
-    "The modifier 'static' should be before the modifier 'final'.",
+    r"The modifier 'static' should be before the modifier 'final'.",
     correction: "Try re-ordering the modifiers.");
 
 const ParserErrorCode _STATIC_AFTER_VAR = const ParserErrorCode(
     'STATIC_AFTER_VAR',
-    "The modifier 'static' should be before the modifier 'var'.",
+    r"The modifier 'static' should be before the modifier 'var'.",
     correction: "Try re-ordering the modifiers.");
 
 const ParserErrorCode _STATIC_CONSTRUCTOR = const ParserErrorCode(
-    'STATIC_CONSTRUCTOR', "Constructors can't be static.",
+    'STATIC_CONSTRUCTOR', r"Constructors can't be static.",
     correction: "Try removing the keyword 'static'.");
 
 const ParserErrorCode _STATIC_OPERATOR = const ParserErrorCode(
-    'STATIC_OPERATOR', "Operators can't be static.",
+    'STATIC_OPERATOR', r"Operators can't be static.",
     correction: "Try removing the keyword 'static'.");
 
 const ParserErrorCode _SWITCH_HAS_CASE_AFTER_DEFAULT_CASE =
     const ParserErrorCode('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE',
-        "The default case should be the last case in a switch statement.",
+        r"The default case should be the last case in a switch statement.",
         correction:
             "Try moving the default case after the other case clauses.");
 
 const ParserErrorCode _SWITCH_HAS_MULTIPLE_DEFAULT_CASES =
     const ParserErrorCode('SWITCH_HAS_MULTIPLE_DEFAULT_CASES',
-        "The 'default' case can only be declared once.",
+        r"The 'default' case can only be declared once.",
         correction: "Try removing all but one default case.");
 
 const ParserErrorCode _TOP_LEVEL_OPERATOR = const ParserErrorCode(
-    'TOP_LEVEL_OPERATOR', "Operators must be declared within a class.",
+    'TOP_LEVEL_OPERATOR', r"Operators must be declared within a class.",
     correction:
         "Try removing the operator, moving it to a class, or converting it to be a function.");
 
 const ParserErrorCode _TYPEDEF_IN_CLASS = const ParserErrorCode(
-    'TYPEDEF_IN_CLASS', "Typedefs can't be declared inside classes.",
+    'TYPEDEF_IN_CLASS', r"Typedefs can't be declared inside classes.",
     correction: "Try moving the typedef to the top-level.");
 
 const ParserErrorCode _TYPE_ARGUMENTS_ON_TYPE_VARIABLE = const ParserErrorCode(
     'TYPE_ARGUMENTS_ON_TYPE_VARIABLE',
-    "Can't use type arguments with type variable '#name'.",
+    r"Can't use type arguments with type variable '#name'.",
     correction: "Try removing the type arguments.");
 
 const ParserErrorCode _VAR_RETURN_TYPE = const ParserErrorCode(
-    'VAR_RETURN_TYPE', "The return type can't be 'var'.",
+    'VAR_RETURN_TYPE', r"The return type can't be 'var'.",
     correction:
         "Try removing the keyword 'var', or replacing it with the name of the return type.");
 
 const ParserErrorCode _WITH_BEFORE_EXTENDS = const ParserErrorCode(
-    'WITH_BEFORE_EXTENDS', "The extends clause must be before the with clause.",
+    'WITH_BEFORE_EXTENDS',
+    r"The extends clause must be before the with clause.",
     correction: "Try moving the extends clause before the with clause.");
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index a572b6a..37b838c 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1706,19 +1706,6 @@
           'MIXIN_DEFERRED_CLASS', "Classes can't mixin deferred classes.",
           correction: "Try changing the import to not be deferred.");
 
-  /**
-   * Not yet in the spec, but consistent with VM behavior.  It is a
-   * compile-time error if all of the constructors of a mixin's base class have
-   * at least one optional parameter (since only constructors that lack
-   * optional parameters can be forwarded to the mixin).  See
-   * https://code.google.com/p/dart/issues/detail?id=15101#c4
-   */
-  static const CompileTimeErrorCode MIXIN_HAS_NO_CONSTRUCTORS =
-      const CompileTimeErrorCode(
-          'MIXIN_HAS_NO_CONSTRUCTORS',
-          "This mixin application is invalid because all of the constructors "
-          "in the base class '{0}' have optional parameters.");
-
   static const CompileTimeErrorCode
       MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES =
       const CompileTimeErrorCode(
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 3b43199..3740609 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1111,7 +1111,7 @@
       if (variableOrDeclaration is! SimpleIdentifier) {
         // Parser has already reported the error.
         if (!leftParenthesis.next.isIdentifier) {
-          parser.rewriter.insertTokenAfter(
+          parser.rewriter.insertToken(
               leftParenthesis,
               new SyntheticStringToken(
                   TokenType.IDENTIFIER, '', leftParenthesis.next.charOffset));
@@ -1305,15 +1305,37 @@
     debugEvent("SwitchCase");
 
     List<Statement> statements = popTypedList(statementCount);
-    List<SwitchMember> members = popTypedList(expressionCount) ?? [];
-    List<Label> labels = popTypedList(labelCount);
-    if (defaultKeyword != null) {
-      members.add(ast.switchDefault(
-          <Label>[], defaultKeyword, colonAfterDefault, <Statement>[]));
+    List<SwitchMember> members;
+
+    if (labelCount == 0 && defaultKeyword == null) {
+      // Common situation: case with no default and no labels.
+      members = popTypedList<SwitchMember>(expressionCount) ?? [];
+    } else {
+      // Labels and case statements may be intertwined
+      if (defaultKeyword != null) {
+        SwitchDefault member = ast.switchDefault(
+            <Label>[], defaultKeyword, colonAfterDefault, <Statement>[]);
+        while (peek() is Label) {
+          member.labels.insert(0, pop());
+          --labelCount;
+        }
+        members = new List<SwitchMember>(expressionCount + 1);
+        members[expressionCount] = member;
+      } else {
+        members = new List<SwitchMember>(expressionCount);
+      }
+      for (int index = expressionCount - 1; index >= 0; --index) {
+        SwitchMember member = pop();
+        while (peek() is Label) {
+          member.labels.insert(0, pop());
+          --labelCount;
+        }
+        members[index] = member;
+      }
+      assert(labelCount == 0);
     }
     if (members.isNotEmpty) {
       members.last.statements.addAll(statements);
-      members.first.labels.addAll(labels);
     }
     push(members);
   }
@@ -2814,6 +2836,11 @@
   void endElseStatement(Token token) {
     debugEvent("endElseStatement");
   }
+
+  List popList(int n, List list) {
+    if (n == 0) return null;
+    return stack.popList(n, list, null);
+  }
 }
 
 /// Data structure placed on the stack to represent the default parameter
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index d11fb57..eb12686 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -362,10 +362,6 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE, offset, length);
         return;
-      case "INVALID_HEX_ESCAPE":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.INVALID_HEX_ESCAPE, offset, length);
-        return;
       case "INVALID_METHOD_OVERRIDE":
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_METHOD_OVERRIDE, offset, length);
@@ -374,10 +370,6 @@
         _reportByCode(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, message,
             offset, length);
         return;
-      case "INVALID_OPERATOR":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.INVALID_OPERATOR, offset, length, [lexeme()]);
-        return;
       case "INVALID_OPERATOR_FOR_SUPER":
         _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
             offset, length);
@@ -386,22 +378,6 @@
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_SUPER_INVOCATION, offset, length);
         return;
-      case "INVALID_UNICODE_ESCAPE":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.INVALID_UNICODE_ESCAPE, offset, length);
-        return;
-      case "LIBRARY_DIRECTIVE_NOT_FIRST":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, offset, length);
-        return;
-      case "MISSING_ASSIGNABLE_SELECTOR":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, offset, length);
-        return;
-      case "MISSING_ASSIGNMENT_IN_INITIALIZER":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, offset, length);
-        return;
       case "MISSING_CATCH_OR_FINALLY":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.MISSING_CATCH_OR_FINALLY, offset, length);
@@ -410,18 +386,10 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.MISSING_CLASS_BODY, offset, length);
         return;
-      case "MISSING_CONST_FINAL_VAR_OR_TYPE":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, offset, length);
-        return;
       case "MISSING_DIGIT":
         errorReporter?.reportErrorForOffset(
             ScannerErrorCode.MISSING_DIGIT, offset, length);
         return;
-      case "MISSING_EXPRESSION_IN_THROW":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_EXPRESSION_IN_THROW, offset, length);
-        return;
       case "MISSING_ENUM_BODY":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.MISSING_ENUM_BODY, offset, length);
@@ -442,14 +410,6 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.MISSING_IDENTIFIER, offset, length);
         return;
-      case "MISSING_INITIALIZER":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_INITIALIZER, offset, length);
-        return;
-      case "MISSING_KEYWORD_OPERATOR":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_KEYWORD_OPERATOR, offset, length);
-        return;
       case "MISSING_METHOD_PARAMETERS":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.MISSING_METHOD_PARAMETERS, offset, length);
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 4a24786..422c80d 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -17,39 +17,31 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
-/**
- * A visitor that resolves declarations in an AST structure to already built
- * elements.
- *
- * The resulting AST must have everything resolved that would have been resolved
- * by a [CompilationUnitBuilder] (that is, must be a valid [RESOLVED_UNIT1]).
- * This class must not assume that the [CompilationUnitElement] passed to it is
- * any more complete than a [COMPILATION_UNIT_ELEMENT].
- */
-class DeclarationResolver extends RecursiveAstVisitor<Object> {
-  /**
-   * The compilation unit containing the AST nodes being visited.
-   */
+/// A visitor that resolves declarations in an AST structure to already built
+/// elements.
+///
+/// The resulting AST must have everything resolved that would have been
+/// resolved by a [CompilationUnitBuilder] (that is, must be a valid
+/// [RESOLVED_UNIT1]). This class must not assume that the
+/// [CompilationUnitElement] passed to it is any more complete than a
+/// [COMPILATION_UNIT_ELEMENT].
+class DeclarationResolver extends RecursiveAstVisitor<void> {
+  /// The compilation unit containing the AST nodes being visited.
   CompilationUnitElementImpl _enclosingUnit;
 
-  /**
-   * The type provider used to access the known types.
-   */
+  /// The type provider used to access the known types.
   TypeProvider _typeProvider;
 
-  /**
-   * The [ElementWalker] we are using to keep track of progress through the
-   * element model.
-   */
+  /// The [ElementWalker] we are using to keep track of progress through the
+  /// element model.
   ElementWalker _walker;
 
   DeclarationResolver();
 
-  /**
-   * Resolve the declarations within the given compilation [unit] to the
-   * elements rooted at the given [element]. Throw an [ElementMismatchException]
-   * if the element model and compilation unit do not match each other.
-   */
+  /// Resolve the declarations within the given compilation [unit] to the
+  /// elements rooted at the given [element]. Throw an
+  /// [ElementMismatchException] if the element model and compilation unit do
+  /// not match each other.
   void resolve(CompilationUnit unit, CompilationUnitElement element) {
     _enclosingUnit = element;
     _typeProvider = _enclosingUnit.context?.typeProvider;
@@ -65,55 +57,51 @@
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     // Annotations can only contain elements in certain erroneous situations,
     // in which case the elements are disconnected from the rest of the element
     // model, thus we can't reconnect to them.  To avoid crashes, just create
     // fresh elements.
     ElementHolder elementHolder = new ElementHolder();
     new ElementBuilder(elementHolder, _enclosingUnit).visitAnnotation(node);
-    return null;
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     if (_isBodyToCreateElementsFor(node)) {
       _walker.consumeLocalElements();
       node.accept(_walker.elementBuilder);
-      return null;
     } else {
-      return super.visitBlockFunctionBody(node);
+      super.visitBlockFunctionBody(node);
     }
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     _walker.elementBuilder.buildCatchVariableElements(node);
-    return super.visitCatchClause(node);
+    super.visitCatchClause(node);
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     ClassElement element = _match(node.name, _walker.getClass());
     _walk(new ElementWalker.forClass(element), () {
       super.visitClassDeclaration(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     ClassElement element = _match(node.name, _walker.getClass());
     _walk(new ElementWalker.forClass(element), () {
       super.visitClassTypeAlias(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorElement element = _match(node.name, _walker.getConstructor(),
         offset: node.name?.offset ?? node.returnType.offset);
     _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () {
@@ -121,18 +109,16 @@
       super.visitConstructorDeclaration(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     // Declared identifiers can only occur inside executable elements.
     _walker.elementBuilder.visitDeclaredIdentifier(node);
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     NormalFormalParameter normalParameter = node.parameter;
     ParameterElement element =
         _match(normalParameter.identifier, _walker.getParameter());
@@ -161,11 +147,10 @@
     });
 
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     ClassElement element = _match(node.name, _walker.getEnum());
     node.name.staticType = _typeProvider.typeType;
     resolveMetadata(node, node.metadata, element);
@@ -179,11 +164,10 @@
       _walker.getFunction(); // toString()
       super.visitEnumDeclaration(node);
     });
-    return null;
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     super.visitExportDirective(node);
     List<ElementAnnotation> annotations =
         _enclosingUnit.getAnnotations(node.offset);
@@ -196,30 +180,27 @@
       annotations = _walker.element.library.exports[index].metadata;
     }
     resolveAnnotations(node, node.metadata, annotations);
-    return null;
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     if (_isBodyToCreateElementsFor(node)) {
       _walker.consumeLocalElements();
       node.accept(_walker.elementBuilder);
-      return null;
     } else {
-      return super.visitExpressionFunctionBody(node);
+      super.visitExpressionFunctionBody(node);
     }
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     super.visitFieldDeclaration(node);
     FieldElement firstFieldElement = node.fields.variables[0].declaredElement;
     resolveMetadata(node, node.metadata, firstFieldElement);
-    return null;
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       ParameterElement element =
           _match(node.identifier, _walker.getParameter());
@@ -229,14 +210,13 @@
       });
       resolveMetadata(node, node.metadata, element);
       _setGenericFunctionType(node.type, element.type);
-      return null;
     } else {
-      return super.visitFieldFormalParameter(node);
+      super.visitFieldFormalParameter(node);
     }
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     SimpleIdentifier functionName = node.name;
     Token property = node.propertyKeyword;
     ExecutableElement element;
@@ -260,31 +240,28 @@
       super.visitFunctionDeclaration(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       node.accept(_walker.elementBuilder);
-      return null;
     } else {
-      return super.visitFunctionExpression(node);
+      super.visitFunctionExpression(node);
     }
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAliasElement element = _match(node.name, _walker.getTypedef());
     _walk(new ElementWalker.forTypedef(element), () {
       super.visitFunctionTypeAlias(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       ParameterElement element =
           _match(node.identifier, _walker.getParameter());
@@ -292,14 +269,13 @@
         super.visitFunctionTypedFormalParameter(node);
       });
       resolveMetadata(node, node.metadata, element);
-      return null;
     } else {
-      return super.visitFunctionTypedFormalParameter(node);
+      super.visitFunctionTypedFormalParameter(node);
     }
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     if (_walker.elementBuilder != null) {
       _walker.elementBuilder.visitGenericFunctionType(node);
     } else {
@@ -314,11 +290,10 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     GenericTypeAliasElementImpl element =
         _match(node.name, _walker.getTypedef());
     _setGenericFunctionType(node.functionType, element.function?.type);
@@ -326,11 +301,10 @@
       super.visitGenericTypeAlias(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     super.visitImportDirective(node);
     List<ElementAnnotation> annotations =
         _enclosingUnit.getAnnotations(node.offset);
@@ -343,19 +317,18 @@
       annotations = _walker.element.library.imports[index].metadata;
     }
     resolveAnnotations(node, node.metadata, annotations);
-    return null;
   }
 
   @override
-  Object visitLabeledStatement(LabeledStatement node) {
+  void visitLabeledStatement(LabeledStatement node) {
     bool onSwitchStatement = node.statement is SwitchStatement;
     _walker.elementBuilder
         .buildLabelElements(node.labels, onSwitchStatement, false);
-    return super.visitLabeledStatement(node);
+    super.visitLabeledStatement(node);
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     super.visitLibraryDirective(node);
     List<ElementAnnotation> annotations =
         _enclosingUnit.getAnnotations(node.offset);
@@ -363,11 +336,10 @@
       annotations = _walker.element.library.metadata;
     }
     resolveAnnotations(node, node.metadata, annotations);
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     Token property = node.propertyKeyword;
     SimpleIdentifier methodName = node.name;
     String nameOfMethod = methodName.name;
@@ -394,21 +366,19 @@
       super.visitMethodDeclaration(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     ClassElement element = _match(node.name, _walker.getMixin());
     _walk(new ElementWalker.forClass(element), () {
       super.visitMixinDeclaration(node);
     });
     resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     super.visitPartDirective(node);
     List<ElementAnnotation> annotations =
         _enclosingUnit.getAnnotations(node.offset);
@@ -421,17 +391,16 @@
       annotations = _walker.element.library.parts[index].metadata;
     }
     resolveAnnotations(node, node.metadata, annotations);
-    return null;
   }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) {
+  void visitPartOfDirective(PartOfDirective node) {
     node.element = _enclosingUnit.library;
-    return super.visitPartOfDirective(node);
+    super.visitPartOfDirective(node);
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       ParameterElement element =
           _match(node.identifier, _walker.getParameter());
@@ -441,52 +410,49 @@
         super.visitSimpleFormalParameter(node);
       });
       resolveMetadata(node, node.metadata, element);
-      return null;
     } else {
-      return super.visitSimpleFormalParameter(node);
+      super.visitSimpleFormalParameter(node);
     }
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     _walker.elementBuilder.buildLabelElements(node.labels, false, true);
-    return super.visitSwitchCase(node);
+    super.visitSwitchCase(node);
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     _walker.elementBuilder.buildLabelElements(node.labels, false, true);
-    return super.visitSwitchDefault(node);
+    super.visitSwitchDefault(node);
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     super.visitTopLevelVariableDeclaration(node);
     VariableElement firstElement = node.variables.variables[0].declaredElement;
     resolveMetadata(node, node.metadata, firstElement);
-    return null;
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     if (node.parent.parent is FunctionTypedFormalParameter) {
       // Work around dartbug.com/28515.
       // TODO(paulberry): remove this once dartbug.com/28515 is fixed.
       var element = new TypeParameterElementImpl.forNode(node.name);
       element.type = new TypeParameterTypeImpl(element);
       node.name?.staticElement = element;
-      return null;
+    } else {
+      TypeParameterElement element =
+          _match(node.name, _walker.getTypeParameter());
+      _setGenericFunctionType(node.bound, element.bound);
+      super.visitTypeParameter(node);
+      resolveMetadata(node, node.metadata, element);
     }
-    TypeParameterElement element =
-        _match(node.name, _walker.getTypeParameter());
-    _setGenericFunctionType(node.bound, element.bound);
-    super.visitTypeParameter(node);
-    resolveMetadata(node, node.metadata, element);
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     VariableElement element = _match(node.name, _walker.getVariable());
     Expression initializer = node.initializer;
     if (initializer != null) {
@@ -498,13 +464,12 @@
     } else {
       super.visitVariableDeclaration(node);
     }
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     if (_walker.elementBuilder != null) {
-      return _walker.elementBuilder.visitVariableDeclarationList(node);
+      _walker.elementBuilder.visitVariableDeclarationList(node);
     } else {
       node.variables.accept(this);
       VariableElement firstVariable = node.variables[0].declaredElement;
@@ -514,20 +479,17 @@
           node.parent is! TopLevelVariableDeclaration) {
         resolveMetadata(node, node.metadata, firstVariable);
       }
-      return null;
     }
   }
 
-  /**
-   * Updates [identifier] to point to [element], after ensuring that the
-   * element has the expected name.
-   *
-   * If no [elementName] is given, it defaults to the name of the [identifier]
-   * (or the empty string if [identifier] is `null`).
-   *
-   * If [identifier] is `null`, nothing is updated, but the element name is
-   * still checked.
-   */
+  /// Updates [identifier] to point to [element], after ensuring that the
+  /// element has the expected name.
+  ///
+  /// If no [elementName] is given, it defaults to the name of the [identifier]
+  /// (or the empty string if [identifier] is `null`).
+  ///
+  /// If [identifier] is `null`, nothing is updated, but the element name is
+  /// still checked.
   E _match<E extends Element>(SimpleIdentifier identifier, E element,
       {String elementName, int offset}) {
     elementName ??= identifier?.name ?? '';
@@ -549,9 +511,7 @@
     }
   }
 
-  /**
-   * If the given [typeNode] is a [GenericFunctionType], set its [type].
-   */
+  /// If the given [typeNode] is a [GenericFunctionType], set its [type].
   void _setGenericFunctionType(TypeAnnotation typeNode, DartType type) {
     if (typeNode is GenericFunctionTypeImpl) {
       typeNode.type = type;
@@ -570,15 +530,13 @@
     }
   }
 
-  /**
-   * Recurses through the element model and AST, verifying that all elements are
-   * matched.
-   *
-   * Executes [callback] with [_walker] pointing to the given [walker] (which
-   * should be a new instance of [ElementWalker]).  Once [callback] returns,
-   * uses [ElementWalker.validate] to verify that all expected elements have
-   * been matched.
-   */
+  /// Recurses through the element model and AST, verifying that all elements
+  /// are matched.
+  ///
+  /// Executes [callback] with [_walker] pointing to the given [walker] (which
+  /// should be a new instance of [ElementWalker]).  Once [callback] returns,
+  /// uses [ElementWalker.validate] to verify that all expected elements have
+  /// been matched.
   void _walk(ElementWalker walker, void callback()) {
     ElementWalker outerWalker = _walker;
     _walker = walker;
@@ -749,11 +707,9 @@
     }
   }
 
-  /**
-   * Associate each of the annotation [nodes] with the corresponding
-   * [ElementAnnotation] in [annotations]. If there is a problem, report it
-   * against the given [parent] node.
-   */
+  /// Associate each of the annotation [nodes] with the corresponding
+  /// [ElementAnnotation] in [annotations]. If there is a problem, report it
+  /// against the given [parent] node.
   static void resolveAnnotations(AstNode parent, NodeList<Annotation> nodes,
       List<ElementAnnotation> annotations) {
     int nodeCount = nodes.length;
@@ -766,15 +722,13 @@
     }
   }
 
-  /**
-   * If [element] is not `null`, associate each of the annotation [nodes] with
-   * the corresponding [ElementAnnotation] in [element.metadata]. If there is a
-   * problem, report it against the given [parent] node.
-   *
-   * If [element] is `null`, do nothing--this allows us to be robust in the
-   * case where we are operating on an element model that hasn't been fully
-   * built.
-   */
+  /// If [element] is not `null`, associate each of the annotation [nodes] with
+  /// the corresponding [ElementAnnotation] in [element.metadata]. If there is a
+  /// problem, report it against the given [parent] node.
+  ///
+  /// If [element] is `null`, do nothing--this allows us to be robust in the
+  /// case where we are operating on an element model that hasn't been fully
+  /// built.
   static void resolveMetadata(
       AstNode parent, NodeList<Annotation> nodes, Element element) {
     if (element != null) {
@@ -816,27 +770,19 @@
   }
 }
 
-/**
- * Keeps track of the set of non-synthetic child elements of an element,
- * yielding them one at a time in response to "get" method calls.
- */
+/// Keeps track of the set of non-synthetic child elements of an element,
+/// yielding them one at a time in response to "get" method calls.
 class ElementWalker {
-  /**
-   * The element whose child elements are being walked.
-   */
+  /// The element whose child elements are being walked.
   final Element element;
 
-  /**
-   * If [element] is an executable element, an element builder which is
-   * accumulating the executable element's local variables and labels.
-   * Otherwise `null`.
-   */
+  /// If [element] is an executable element, an element builder which is
+  /// accumulating the executable element's local variables and labels.
+  /// Otherwise `null`.
   LocalElementBuilder elementBuilder;
 
-  /**
-   * If [element] is an executable element, the element holder associated with
-   * [elementBuilder].  Otherwise `null`.
-   */
+  /// If [element] is an executable element, the element holder associated with
+  /// [elementBuilder].  Otherwise `null`.
   ElementHolder _elementHolder;
 
   List<PropertyAccessorElement> _accessors;
@@ -860,10 +806,8 @@
   List<VariableElement> _variables;
   int _variableIndex = 0;
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a class
-   * element.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a class
+  /// element.
   ElementWalker.forClass(ClassElement element)
       : element = element,
         _accessors = element.accessors.where(_isNotSynthetic).toList(),
@@ -874,10 +818,8 @@
         _typeParameters = element.typeParameters,
         _variables = element.fields.where(_isNotSynthetic).toList();
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a compilation
-   * unit element.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a compilation
+  /// unit element.
   ElementWalker.forCompilationUnit(CompilationUnitElement compilationUnit)
       : element = compilationUnit,
         _accessors = compilationUnit.accessors.where(_isNotSynthetic).toList(),
@@ -889,35 +831,27 @@
         _variables =
             compilationUnit.topLevelVariables.where(_isNotSynthetic).toList();
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a compilation
-   * unit element.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a compilation
+  /// unit element.
   ElementWalker.forExecutable(
       ExecutableElement element, CompilationUnitElement compilationUnit)
       : this._forExecutable(element, compilationUnit, new ElementHolder());
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a typedef
-   * element.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a typedef
+  /// element.
   ElementWalker.forGenericFunctionType(GenericFunctionTypeElement element)
       : element = element,
         _parameters = element.parameters,
         _typeParameters = element.typeParameters;
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a typedef
-   * element defined using a generic function type.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a typedef
+  /// element defined using a generic function type.
   ElementWalker.forGenericTypeAlias(FunctionTypeAliasElement element)
       : element = element,
         _typeParameters = element.typeParameters;
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a parameter
-   * element.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a parameter
+  /// element.
   ElementWalker.forParameter(ParameterElement element, bool functionTyped)
       : element = element,
         _parameters = element.parameters,
@@ -931,10 +865,8 @@
     }
   }
 
-  /**
-   * Creates an [ElementWalker] which walks the child elements of a typedef
-   * element.
-   */
+  /// Creates an [ElementWalker] which walks the child elements of a typedef
+  /// element.
   ElementWalker.forTypedef(GenericTypeAliasElementImpl element)
       : element = element,
         _parameters = element.parameters,
@@ -958,73 +890,52 @@
     _parameterIndex = _parameters.length;
   }
 
-  /**
-   * Returns the next non-synthetic child of [element] which is an accessor;
-   * throws an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is an accessor;
+  /// throws an [IndexError] if there are no more.
   PropertyAccessorElement getAccessor() => _accessors[_accessorIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a class; throws
-   * an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a class; throws
+  /// an [IndexError] if there are no more.
   ClassElement getClass() => _classes[_classIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a constructor;
-   * throws an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a constructor;
+  /// throws an [IndexError] if there are no more.
   ConstructorElement getConstructor() => _constructors[_constructorIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is an enum; throws
-   * an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is an enum; throws
+  /// an [IndexError] if there are no more.
   ClassElement getEnum() => _enums[_enumIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a top level
-   * function, method, or local function; throws an [IndexError] if there are no
-   * more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a top level
+  /// function, method, or local function; throws an [IndexError] if there are
+  /// no more.
   ExecutableElement getFunction() => _functions[_functionIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a mixin; throws
-   * an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a mixin; throws
+  /// an [IndexError] if there are no more.
   ClassElement getMixin() => _mixins[_mixinIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a parameter;
-   * throws an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a parameter;
+  /// throws an [IndexError] if there are no more.
   ParameterElement getParameter() => _parameters[_parameterIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a typedef;
-   * throws an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a typedef;
+  /// throws an [IndexError] if there are no more.
   FunctionTypeAliasElement getTypedef() => _typedefs[_typedefIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a type
-   * parameter; throws an [IndexError] if there are no more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a type
+  /// parameter; throws an [IndexError] if there are no more.
   TypeParameterElement getTypeParameter() =>
       _typeParameters[_typeParameterIndex++];
 
-  /**
-   * Returns the next non-synthetic child of [element] which is a top level
-   * variable, field, or local variable; throws an [IndexError] if there are no
-   * more.
-   */
+  /// Returns the next non-synthetic child of [element] which is a top level
+  /// variable, field, or local variable; throws an [IndexError] if there are no
+  /// more.
   VariableElement getVariable() => _variables[_variableIndex++];
 
-  /**
-   * Verifies that all non-synthetic children of [element] have been obtained
-   * from their corresponding "get" method calls; if not, throws a [StateError].
-   */
+  /// Verifies that all non-synthetic children of [element] have been obtained
+  /// from their corresponding "get" method calls; if not, throws a
+  /// [StateError].
   void validate() {
     void check(List<Element> elements, int index) {
       if (elements != null && elements.length != index) {
@@ -1054,10 +965,8 @@
 }
 
 class _ElementMismatchException extends AnalysisException {
-  /**
-   * Creates an exception to refer to the given [compilationUnit], [element],
-   * and [cause].
-   */
+  /// Creates an exception to refer to the given [compilationUnit], [element],
+  /// and [cause].
   _ElementMismatchException(
       CompilationUnitElement compilationUnit, Element element,
       [CaughtException cause = null])
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index cc387c5..286a2f7 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1052,9 +1052,7 @@
     String superName = name?.name;
     ConstructorElement element =
         superType.lookUpConstructor(superName, _definingLibrary);
-    if (element == null ||
-        (!enclosingClass.doesMixinLackConstructors &&
-            !enclosingClass.isSuperConstructorAccessible(element))) {
+    if (element == null || !element.isAccessibleIn(_definingLibrary)) {
       if (name != null) {
         _resolver.errorReporter.reportErrorForNode(
             CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index a38db59..cf3cc20 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
@@ -1101,6 +1102,7 @@
       _checkForAssignmentToFinal(operand);
     }
     _checkForIntNotAssignable(operand);
+    _checkForUseOfVoidResult(operand);
     return super.visitPrefixExpression(node);
   }
 
@@ -1354,7 +1356,6 @@
       _checkForRepeatedType(implementsClause?.interfaces,
           CompileTimeErrorCode.IMPLEMENTS_REPEATED);
       _checkImplementsSuperClass(implementsClause);
-      _checkForMixinHasNoConstructors(node);
       _checkMixinInference(node, withClause);
       _checkForMixinWithConflictingPrivateMember(withClause, superclass);
       if (!disableConflictingGenericsCheck) {
@@ -1927,7 +1928,7 @@
             if (_checkForMixinSuperclassConstraints(mixinName, i)) {
               problemReported = true;
             }
-            if (_checkForMixinSuperInvokedMembers(mixinName, mixinElement)) {
+            if (_checkForMixinSuperInvokedMembers(i, mixinName, mixinElement)) {
               problemReported = true;
             }
           } else {
@@ -2545,7 +2546,7 @@
         var oldType = interfaces[element];
         if (oldType == null) {
           interfaces[element] = type;
-        } else if (oldType != type) {
+        } else if (!oldType.isEquivalentTo(type)) {
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
               node,
@@ -2731,7 +2732,7 @@
       InstanceCreationExpression expression,
       TypeName typeName,
       InterfaceType type) {
-    if (type.element.isAbstract) {
+    if (type.element.isAbstract && !type.element.isMixin) {
       ConstructorElement element = expression.staticElement;
       if (element != null && !element.isFactory) {
         bool isImplicit =
@@ -4204,18 +4205,6 @@
   }
 
   /**
-   * Report the error [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] if
-   * appropriate.
-   */
-  void _checkForMixinHasNoConstructors(AstNode node) {
-    if (_enclosingClass.doesMixinLackConstructors) {
-      ErrorCode errorCode = CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS;
-      _errorReporter
-          .reportErrorForNode(errorCode, node, [_enclosingClass.supertype]);
-    }
-  }
-
-  /**
    * Verify that the given mixin has the 'Object' superclass. The [mixinName] is
    * the node to report problem on. The [mixinElement] is the mixing to
    * evaluate.
@@ -4281,15 +4270,21 @@
     return false;
   }
 
-  /// Check that the [_enclosingClass] has concrete implementations of all
-  /// the super-invoked members of the [mixinElement].
+  /// Check that the superclass of the given [mixinElement] at the given
+  /// [mixinIndex] in the list of mixins of [_enclosingClass] has concrete
+  /// implementations of all the super-invoked members of the [mixinElement].
   bool _checkForMixinSuperInvokedMembers(
-      TypeName mixinName, ClassElementImpl mixinElement) {
+      int mixinIndex, TypeName mixinName, ClassElement mixinElement) {
+    ClassElementImpl mixinElementImpl = mixinElement is ClassElementHandle
+        ? mixinElement.actualElement
+        : mixinElement;
     InterfaceTypeImpl enclosingType = _enclosingClass.type;
-    for (var name in mixinElement.superInvokedNames) {
+    for (var name in mixinElementImpl.superInvokedNames) {
       var superMember = enclosingType.lookUpInheritedMember(
           name, _currentLibrary,
-          concrete: true, setter: name.endsWith('='));
+          concrete: true,
+          stopMixinIndex: mixinIndex,
+          setter: name.endsWith('='));
       if (superMember == null) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode
@@ -4487,10 +4482,6 @@
    */
   void _checkForNoDefaultSuperConstructorImplicit(
       ClassDeclaration declaration) {
-    // do nothing if mixin errors have already been reported for this class.
-    if (_enclosingClass.doesMixinLackConstructors) {
-      return;
-    }
     // do nothing if there is explicit constructor
     List<ConstructorElement> constructors = _enclosingClass.constructors;
     if (!constructors[0].isSynthetic) {
@@ -4513,9 +4504,7 @@
             [superUnnamedConstructor]);
         return;
       }
-      if (superUnnamedConstructor.isDefaultConstructor &&
-          _enclosingClass
-              .isSuperConstructorAccessible(superUnnamedConstructor)) {
+      if (superUnnamedConstructor.isDefaultConstructor) {
         return;
       }
     }
@@ -5491,10 +5480,6 @@
     if (_enclosingClass == null) {
       return;
     }
-    // do nothing if mixin errors have already been reported for this class.
-    if (_enclosingClass.doesMixinLackConstructors) {
-      return;
-    }
 
     // Ignore if the constructor is not generative.
     if (constructor.factoryKeyword != null) {
@@ -5526,9 +5511,7 @@
             CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
             constructor.returnType,
             [superUnnamedConstructor]);
-      } else if (!superUnnamedConstructor.isDefaultConstructor ||
-          !_enclosingClass
-              .isSuperConstructorAccessible(superUnnamedConstructor)) {
+      } else if (!superUnnamedConstructor.isDefaultConstructor) {
         Identifier returnType = constructor.returnType;
         SimpleIdentifier name = constructor.name;
         int offset = returnType.offset;
@@ -5822,7 +5805,7 @@
 
   void _checkMixinInference(
       NamedCompilationUnitMember node, WithClause withClause) {
-    if (withClause == null || !_options.enableSuperMixins) {
+    if (withClause == null) {
       return;
     }
     ClassElement classElement = node.declaredElement;
@@ -5832,11 +5815,12 @@
     ClassElementImpl.collectAllSupertypes(
         supertypesForMixinInference, supertype, type);
     for (var typeName in withClause.mixinTypes) {
-      var mixinElement = typeName.name.staticElement;
+      var mixinType = typeName.type;
+      var mixinElement = mixinType.element;
       if (mixinElement is ClassElement) {
         if (typeName.typeArguments == null) {
-          var mixinSupertypeConstraints =
-              _typeSystem.gatherMixinSupertypeConstraints(mixinElement);
+          var mixinSupertypeConstraints = _typeSystem
+              .gatherMixinSupertypeConstraintsForInference(mixinElement);
           if (mixinSupertypeConstraints.isNotEmpty) {
             var matchingInterfaceTypes = _findInterfaceTypesForConstraints(
                 typeName,
@@ -5861,7 +5845,7 @@
           }
         }
         ClassElementImpl.collectAllSupertypes(
-            supertypesForMixinInference, mixinElement.type, type);
+            supertypesForMixinInference, mixinType, type);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 8eed8da..2a8bf95 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -38,17 +38,13 @@
 export 'package:analyzer/src/dart/resolver/scope.dart';
 export 'package:analyzer/src/generated/type_system.dart';
 
-/**
- * A visitor that will re-write an AST to support the optional `new` and `const`
- * feature.
- */
+/// A visitor that will re-write an AST to support the optional `new` and
+/// `const` feature.
 class AstRewriteVisitor extends ScopedVisitor {
   final bool addConstKeyword;
   final TypeSystem typeSystem;
 
-  /**
-   * Initialize a newly created visitor.
-   */
+  /// Initialize a newly created visitor.
   AstRewriteVisitor(
       this.typeSystem,
       LibraryElement definingLibrary,
@@ -208,20 +204,16 @@
     return null;
   }
 
-  /**
-   * Return the token that should be used in the [InstanceCreationExpression]
-   * that corresponds to the given invocation [node].
-   */
+  /// Return the token that should be used in the [InstanceCreationExpression]
+  /// that corresponds to the given invocation [node].
   Token _getKeyword(MethodInvocation node) {
     return addConstKeyword
         ? new KeywordToken(Keyword.CONST, node.offset)
         : null;
   }
 
-  /**
-   * Return the type of the given class [element] after substituting any type
-   * arguments from the list of [typeArguments] for the class' type parameters.
-   */
+  /// Return the type of the given class [element] after substituting any type
+  /// arguments from the list of [typeArguments] for the class' type parameters.
   DartType _getType(ClassElement element, TypeArgumentList typeArguments) {
     DartType type = element.type;
     List<TypeParameterElement> typeParameters = element.typeParameters;
@@ -242,10 +234,8 @@
   }
 }
 
-/**
- * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
- * violations of Dart best practices.
- */
+/// Instances of the class `BestPracticesVerifier` traverse an AST structure
+/// looking for violations of Dart best practices.
 class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
 //  static String _HASHCODE_GETTER_NAME = "hashCode";
 
@@ -259,54 +249,36 @@
 
   static final _testingDir = '${path.separator}testing${path.separator}';
 
-  /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
-   * a class.
-   */
+  /// The class containing the AST nodes being visited, or `null` if we are not
+  /// in the scope of a class.
   ClassElementImpl _enclosingClass;
 
-  /**
-   * A flag indicating whether a surrounding member (compilation unit or class)
-   * is deprecated.
-   */
+  /// A flag indicating whether a surrounding member (compilation unit or class)
+  /// is deprecated.
   bool inDeprecatedMember;
 
-  /**
-   * The error reporter by which errors will be reported.
-   */
+  /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
-  /**
-   * The type [Null].
-   */
+  /// The type [Null].
   final InterfaceType _nullType;
 
-  /**
-   * The type Future<Null>, which is needed for determining whether it is safe
-   * to have a bare "return;" in an async method.
-   */
+  /// The type Future<Null>, which is needed for determining whether it is safe
+  /// to have a bare "return;" in an async method.
   final InterfaceType _futureNullType;
 
-  /**
-   * The type system primitives
-   */
+  /// The type system primitives
   TypeSystem _typeSystem;
 
-  /**
-   * The current library
-   */
+  /// The current library
   LibraryElement _currentLibrary;
 
-  /**
-   * The inheritance manager used to find overridden methods.
-   */
+  /// The inheritance manager used to find overridden methods.
   InheritanceManager _manager;
 
-  /**
-   * Create a new instance of the [BestPracticesVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
+  /// Create a new instance of the [BestPracticesVerifier].
+  ///
+  /// @param errorReporter the error reporter
   BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider,
       this._currentLibrary, this._manager,
       {TypeSystem typeSystem})
@@ -538,16 +510,14 @@
     return super.visitVariableDeclaration(node);
   }
 
-  /**
-   * Check for the passed is expression for the unnecessary type check hint codes as well as null
-   * checks expressed using an is expression.
-   *
-   * @param node the is expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.TYPE_CHECK_IS_NOT_NULL], [HintCode.TYPE_CHECK_IS_NULL],
-   * [HintCode.UNNECESSARY_TYPE_CHECK_TRUE], and
-   * [HintCode.UNNECESSARY_TYPE_CHECK_FALSE].
-   */
+  /// Check for the passed is expression for the unnecessary type check hint
+  /// codes as well as null checks expressed using an is expression.
+  ///
+  /// @param node the is expression to check
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.TYPE_CHECK_IS_NOT_NULL], [HintCode.TYPE_CHECK_IS_NULL],
+  /// [HintCode.UNNECESSARY_TYPE_CHECK_TRUE], and
+  /// [HintCode.UNNECESSARY_TYPE_CHECK_FALSE].
   bool _checkAllTypeChecks(IsExpression node) {
     Expression expression = node.expression;
     TypeAnnotation typeName = node.type;
@@ -601,14 +571,12 @@
     return false;
   }
 
-  /**
-   * Given some [Element], look at the associated metadata and report the use of the member if
-   * it is declared as deprecated.
-   *
-   * @param element some element to check for deprecated use of
-   * @param node the node use for the location of the error
-   * See [HintCode.DEPRECATED_MEMBER_USE].
-   */
+  /// Given some [Element], look at the associated metadata and report the use
+  /// of the member if it is declared as deprecated.
+  ///
+  /// @param element some element to check for deprecated use of
+  /// @param node the node use for the location of the error
+  /// See [HintCode.DEPRECATED_MEMBER_USE].
   void _checkForDeprecatedMemberUse(Element element, AstNode node) {
     bool isDeprecated(Element element) {
       if (element is PropertyAccessorElement && element.isSynthetic) {
@@ -670,20 +638,18 @@
     }
   }
 
-  /**
-   * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
-   * if the node is not in a declaration context.
-   *
-   * Also, if the identifier is a constructor name in a constructor invocation, then calls to the
-   * deprecated constructor will be caught by
-   * [visitInstanceCreationExpression] and
-   * [visitSuperConstructorInvocation], and can be ignored by
-   * this visit method.
-   *
-   * @param identifier some simple identifier to check for deprecated use of
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.DEPRECATED_MEMBER_USE].
-   */
+  /// For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
+  /// if the node is not in a declaration context.
+  ///
+  /// Also, if the identifier is a constructor name in a constructor invocation,
+  /// then calls to the deprecated constructor will be caught by
+  /// [visitInstanceCreationExpression] and
+  /// [visitSuperConstructorInvocation], and can be ignored by
+  /// this visit method.
+  ///
+  /// @param identifier some simple identifier to check for deprecated use of
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.DEPRECATED_MEMBER_USE].
   void _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
     if (identifier.inDeclarationContext()) {
       return;
@@ -700,13 +666,12 @@
     _checkForDeprecatedMemberUse(identifier.staticElement, identifier);
   }
 
-  /**
-   * Check for the passed binary expression for the [HintCode.DIVISION_OPTIMIZATION].
-   *
-   * @param node the binary expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.DIVISION_OPTIMIZATION].
-   */
+  /// Check for the passed binary expression for the
+  /// [HintCode.DIVISION_OPTIMIZATION].
+  ///
+  /// @param node the binary expression to check
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.DIVISION_OPTIMIZATION].
   bool _checkForDivisionOptimizationHint(BinaryExpression node) {
     // Return if the operator is not '/'
     if (node.operator.type != TokenType.SLASH) {
@@ -741,10 +706,8 @@
   }
 
   void _checkForImmutable(ClassDeclaration node) {
-    /**
-     * Return `true` if the given class [element] is annotated with the
-     * `@immutable` annotation.
-     */
+    /// Return `true` if the given class [element] is annotated with the
+    /// `@immutable` annotation.
     bool isImmutable(ClassElement element) {
       for (ElementAnnotation annotation in element.metadata) {
         if (annotation.isImmutable) {
@@ -754,10 +717,8 @@
       return false;
     }
 
-    /**
-     * Return `true` if the given class [element] or any superclass of it is
-     * annotated with the `@immutable` annotation.
-     */
+    /// Return `true` if the given class [element] or any superclass of it is
+    /// annotated with the `@immutable` annotation.
     bool isOrInheritsImmutable(
         ClassElement element, HashSet<ClassElement> visited) {
       if (visited.add(element)) {
@@ -781,10 +742,8 @@
       return false;
     }
 
-    /**
-     * Return `true` if the given class [element] defines a non-final instance
-     * field.
-     */
+    /// Return `true` if the given class [element] defines a non-final instance
+    /// field.
     bool hasNonFinalInstanceField(ClassElement element) {
       for (FieldElement field in element.fields) {
         if (!field.isSynthetic && !field.isFinal && !field.isStatic) {
@@ -794,10 +753,8 @@
       return false;
     }
 
-    /**
-     * Return `true` if the given class [element] defines or inherits a
-     * non-final field.
-     */
+    /// Return `true` if the given class [element] defines or inherits a
+    /// non-final field.
     bool hasOrInheritsNonFinalInstanceField(
         ClassElement element, HashSet<ClassElement> visited) {
       if (visited.add(element)) {
@@ -974,16 +931,16 @@
     }
   }
 
-  /**
-   * This verifies that the passed left hand side and right hand side represent a valid assignment.
-   *
-   * This method corresponds to ErrorVerifier.checkForInvalidAssignment.
-   *
-   * @param lhs the left hand side expression
-   * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
-   * See [HintCode.INVALID_ASSIGNMENT].
-   */
+  /// This verifies that the passed left hand side and right hand side represent
+  /// a valid assignment.
+  ///
+  /// This method corresponds to ErrorVerifier.checkForInvalidAssignment.
+  ///
+  /// @param lhs the left hand side expression
+  /// @param rhs the right hand side expression
+  /// @return `true` if and only if an error code is generated on the passed
+  ///         node
+  /// See [HintCode.INVALID_ASSIGNMENT].
   bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
     if (lhs == null || rhs == null) {
       return false;
@@ -1049,15 +1006,14 @@
         decl.name, [decl.name.toString()]);
   }
 
-  /**
-   * Check that the imported library does not define a loadLibrary function. The import has already
-   * been determined to be deferred when this is called.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node
-   * @return `true` if and only if an error code is generated on the passed node
-   * See [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION].
-   */
+  /// Check that the imported library does not define a loadLibrary function.
+  /// The import has already been determined to be deferred when this is called.
+  ///
+  /// @param node the import directive to evaluate
+  /// @param importElement the [ImportElement] retrieved from the node
+  /// @return `true` if and only if an error code is generated on the passed
+  ///         node
+  /// See [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION].
   bool _checkForLoadLibraryFunction(
       ImportDirective node, ImportElement importElement) {
     LibraryElement importedLibrary = importElement.importedLibrary;
@@ -1074,19 +1030,18 @@
     return false;
   }
 
-  /**
-   * Generate a hint for functions or methods that have a return type, but do not have a return
-   * statement on all branches. At the end of blocks with no return, Dart implicitly returns
-   * `null`, avoiding these implicit returns is considered a best practice.
-   *
-   * Note: for async functions/methods, this hint only applies when the
-   * function has a return type that Future<Null> is not assignable to.
-   *
-   * @param node the binary expression to check
-   * @param body the function body
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.MISSING_RETURN].
-   */
+  /// Generate a hint for functions or methods that have a return type, but do
+  /// not have a return statement on all branches. At the end of blocks with no
+  /// return, Dart implicitly returns `null`, avoiding these implicit returns is
+  /// considered a best practice.
+  ///
+  /// Note: for async functions/methods, this hint only applies when the
+  /// function has a return type that Future<Null> is not assignable to.
+  ///
+  /// @param node the binary expression to check
+  /// @param body the function body
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.MISSING_RETURN].
   void _checkForMissingReturn(TypeAnnotation returnNode, FunctionBody body,
       ExecutableElement element, AstNode functionNode) {
     if (body is BlockFunctionBody) {
@@ -1149,9 +1104,7 @@
     }
   }
 
-  /**
-   * Produce several null-aware related hints.
-   */
+  /// Produce several null-aware related hints.
   void _checkForNullAwareHints(Expression node, Token operator) {
     if (operator == null || operator.type != TokenType.QUESTION_PERIOD) {
       return;
@@ -1221,13 +1174,12 @@
     }
   }
 
-  /**
-   * Check for the passed as expression for the [HintCode.UNNECESSARY_CAST] hint code.
-   *
-   * @param node the as expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.UNNECESSARY_CAST].
-   */
+  /// Check for the passed as expression for the [HintCode.UNNECESSARY_CAST]
+  /// hint code.
+  ///
+  /// @param node the as expression to check
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.UNNECESSARY_CAST].
   bool _checkForUnnecessaryCast(AsExpression node) {
     // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to
     // remove the (x is! TypeParameterType) checks.
@@ -1270,13 +1222,11 @@
     return false;
   }
 
-  /**
-   * Generate a hint for `noSuchMethod` methods that do nothing except of
-   * calling another `noSuchMethod` that is not defined by `Object`.
-   *
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.UNNECESSARY_NO_SUCH_METHOD].
-   */
+  /// Generate a hint for `noSuchMethod` methods that do nothing except of
+  /// calling another `noSuchMethod` that is not defined by `Object`.
+  ///
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.UNNECESSARY_NO_SUCH_METHOD].
   bool _checkForUnnecessaryNoSuchMethod(MethodDeclaration node) {
     if (node.name.name != FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
       return false;
@@ -1337,14 +1287,12 @@
     }
   }
 
-  /**
-   * Check for the passed class declaration for the
-   * [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
-   *
-   * @param node the class declaration to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE].
-   */
+  /// Check for the passed class declaration for the
+  /// [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
+  ///
+  /// @param node the class declaration to check
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE].
 //  bool _checkForOverrideEqualsButNotHashCode(ClassDeclaration node) {
 //    ClassElement classElement = node.element;
 //    if (classElement == null) {
@@ -1376,9 +1324,7 @@
             .any((InterfaceType t) => t.element == typeElement);
   }
 
-  /**
-   * Return `true` if the given [type] represents `Future<void>`.
-   */
+  /// Return `true` if the given [type] represents `Future<void>`.
   bool _isFutureVoid(DartType type) {
     if (type.isDartAsyncFuture) {
       List<DartType> typeArgs = (type as InterfaceType).typeArguments;
@@ -1389,17 +1335,16 @@
     return false;
   }
 
-  /**
-   * Given a parenthesized expression, this returns the parent (or recursively grand-parent) of the
-   * expression that is a parenthesized expression, but whose parent is not a parenthesized
-   * expression.
-   *
-   * For example given the code `(((e)))`: `(e) -> (((e)))`.
-   *
-   * @param parenthesizedExpression some expression whose parent is a parenthesized expression
-   * @return the first parent or grand-parent that is a parenthesized expression, that does not have
-   *         a parenthesized expression parent
-   */
+  /// Given a parenthesized expression, this returns the parent (or recursively
+  /// grand-parent) of the expression that is a parenthesized expression, but
+  /// whose parent is not a parenthesized expression.
+  ///
+  /// For example given the code `(((e)))`: `(e) -> (((e)))`.
+  ///
+  /// @param parenthesizedExpression some expression whose parent is a
+  ///        parenthesized expression
+  /// @return the first parent or grand-parent that is a parenthesized
+  ///         expression, that does not have a parenthesized expression parent
   static ParenthesizedExpression _wrapParenthesizedExpression(
       ParenthesizedExpression parenthesizedExpression) {
     AstNode parent = parenthesizedExpression.parent;
@@ -1410,16 +1355,12 @@
   }
 }
 
-/**
- * Utilities for [LibraryElementImpl] building.
- */
+/// Utilities for [LibraryElementImpl] building.
 class BuildLibraryElementUtils {
-  /**
-   * Look through all of the compilation units defined for the given [library],
-   * looking for getters and setters that are defined in different compilation
-   * units but that have the same names. If any are found, make sure that they
-   * have the same variable element.
-   */
+  /// Look through all of the compilation units defined for the given [library],
+  /// looking for getters and setters that are defined in different compilation
+  /// units but that have the same names. If any are found, make sure that they
+  /// have the same variable element.
   static void patchTopLevelAccessors(LibraryElementImpl library) {
     // Without parts getters/setters already share the same variable element.
     List<CompilationUnitElement> parts = library.parts;
@@ -1452,10 +1393,9 @@
     }
   }
 
-  /**
-   * Add all of the non-synthetic [getters] and [setters] defined in the given
-   * [unit] that have no corresponding accessor to one of the given collections.
-   */
+  /// Add all of the non-synthetic [getters] and [setters] defined in the given
+  /// [unit] that have no corresponding accessor to one of the given
+  /// collections.
   static void _collectAccessors(Map<String, PropertyAccessorElement> getters,
       List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
     List<PropertyAccessorElement> accessors = unit.accessors;
@@ -1475,62 +1415,41 @@
   }
 }
 
-/**
- * Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
- * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
- * and warnings related to constant expressions.
- */
+/// Instances of the class `ConstantVerifier` traverse an AST structure looking
+/// for additional errors and warnings not covered by the parser and resolver.
+/// In particular, it looks for errors and warnings related to constant
+/// expressions.
 class ConstantVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The error reporter by which errors will be reported.
-   */
+  /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
-  /**
-   * The type provider used to access the known types.
-   */
+  /// The type provider used to access the known types.
   final TypeProvider _typeProvider;
 
-  /**
-   * The type system in use.
-   */
+  /// The type system in use.
   final TypeSystem _typeSystem;
 
-  /**
-   * The set of variables declared using '-D' on the command line.
-   */
+  /// The set of variables declared using '-D' on the command line.
   final DeclaredVariables declaredVariables;
 
-  /**
-   * The type representing the type 'bool'.
-   */
+  /// The type representing the type 'bool'.
   InterfaceType _boolType;
 
-  /**
-   * The type representing the type 'int'.
-   */
+  /// The type representing the type 'int'.
   InterfaceType _intType;
 
-  /**
-   * The type representing the type 'num'.
-   */
+  /// The type representing the type 'num'.
   InterfaceType _numType;
 
-  /**
-   * The type representing the type 'string'.
-   */
+  /// The type representing the type 'string'.
   InterfaceType _stringType;
 
-  /**
-   * The current library that is being analyzed.
-   */
+  /// The current library that is being analyzed.
   final LibraryElement _currentLibrary;
 
-  /**
-   * Initialize a newly created constant verifier.
-   *
-   * @param errorReporter the error reporter by which errors will be reported
-   */
+  /// Initialize a newly created constant verifier.
+  ///
+  /// @param errorReporter the error reporter by which errors will be reported
   ConstantVerifier(this._errorReporter, LibraryElement currentLibrary,
       this._typeProvider, this.declaredVariables)
       : _currentLibrary = currentLibrary,
@@ -1777,15 +1696,14 @@
     return null;
   }
 
-  /**
-   * This verifies that the passed switch statement does not have a case expression with the
-   * operator '==' overridden.
-   *
-   * @param node the switch statement to evaluate
-   * @param type the common type of all 'case' expressions
-   * @return `true` if and only if an error code is generated on the passed node
-   * See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS].
-   */
+  /// This verifies that the passed switch statement does not have a case
+  /// expression with the operator '==' overridden.
+  ///
+  /// @param node the switch statement to evaluate
+  /// @param type the common type of all 'case' expressions
+  /// @return `true` if and only if an error code is generated on the passed
+  ///         node.
+  /// See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS].
   bool _checkForCaseExpressionTypeImplementsEquals(
       SwitchStatement node, DartType type) {
     if (!_implementsEqualsWhenNotAllowed(type)) {
@@ -1799,11 +1717,9 @@
     return true;
   }
 
-  /**
-   * Verify that the given [type] does not reference any type parameters.
-   *
-   * See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
-   */
+  /// Verify that the given [type] does not reference any type parameters.
+  ///
+  /// See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
   void _checkForConstWithTypeParameters(TypeAnnotation type) {
     // something wrong with AST
     if (type is! TypeName) {
@@ -1828,10 +1744,8 @@
     }
   }
 
-  /**
-   * @return `true` if given [Type] implements operator <i>==</i>, and it is not
-   *         <i>int</i> or <i>String</i>.
-   */
+  /// @return `true` if given [Type] implements operator <i>==</i>, and it is
+  ///         not <i>int</i> or <i>String</i>.
   bool _implementsEqualsWhenNotAllowed(DartType type) {
     // ignore int or String
     if (type == null || type == _intType || type == _typeProvider.stringType) {
@@ -1854,14 +1768,14 @@
     return false;
   }
 
-  /**
-   * Given some computed [Expression], this method generates the passed [ErrorCode] on
-   * the node if its' value consists of information from a deferred library.
-   *
-   * @param expression the expression to be tested for a deferred library reference
-   * @param errorCode the error code to be used if the expression is or consists of a reference to a
-   *          deferred library
-   */
+  /// Given some computed [Expression], this method generates the passed
+  /// [ErrorCode] on the node if its' value consists of information from a
+  /// deferred library.
+  ///
+  /// @param expression the expression to be tested for a deferred library
+  ///        reference
+  /// @param errorCode the error code to be used if the expression is or
+  ///        consists of a reference to a deferred library
   void _reportErrorIfFromDeferredLibrary(
       Expression expression, ErrorCode errorCode) {
     DeferredLibraryReferenceDetector referenceDetector =
@@ -1872,13 +1786,11 @@
     }
   }
 
-  /**
-   * Report any errors in the given list. Except for special cases, use the given error code rather
-   * than the one reported in the error.
-   *
-   * @param errors the errors that need to be reported
-   * @param errorCode the error code to be used
-   */
+  /// Report any errors in the given list. Except for special cases, use the
+  /// given error code rather than the one reported in the error.
+  ///
+  /// @param errors the errors that need to be reported
+  /// @param errorCode the error code to be used
   void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) {
     int length = errors.length;
     for (int i = 0; i < length; i++) {
@@ -1915,14 +1827,14 @@
     }
   }
 
-  /**
-   * Validate that the given expression is a compile time constant. Return the value of the compile
-   * time constant, or `null` if the expression is not a compile time constant.
-   *
-   * @param expression the expression to be validated
-   * @param errorCode the error code to be used if the expression is not a compile time constant
-   * @return the value of the compile time constant
-   */
+  /// Validate that the given expression is a compile time constant. Return the
+  /// value of the compile time constant, or `null` if the expression is not a
+  /// compile time constant.
+  ///
+  /// @param expression the expression to be validated
+  /// @param errorCode the error code to be used if the expression is not a
+  ///        compile time constant
+  /// @return the value of the compile time constant
   DartObjectImpl _validate(Expression expression, ErrorCode errorCode) {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     ErrorReporter subErrorReporter =
@@ -1935,11 +1847,9 @@
     return result;
   }
 
-  /**
-   * Validate that if the passed arguments are constant expressions.
-   *
-   * @param argumentList the argument list to evaluate
-   */
+  /// Validate that if the passed arguments are constant expressions.
+  ///
+  /// @param argumentList the argument list to evaluate
   void _validateConstantArguments(ArgumentList argumentList) {
     for (Expression argument in argumentList.arguments) {
       Expression realArgument =
@@ -1949,10 +1859,8 @@
     }
   }
 
-  /**
-   * Validates that the expressions of the initializers of the given constant
-   * [constructor] are all compile time constants.
-   */
+  /// Validates that the expressions of the initializers of the given constant
+  /// [constructor] are all compile time constants.
   void _validateConstructorInitializers(ConstructorDeclaration constructor) {
     List<ParameterElement> parameterElements =
         constructor.parameters.parameterElements;
@@ -1978,12 +1886,10 @@
     }
   }
 
-  /**
-   * Validate that the default value associated with each of the parameters in the given list is a
-   * compile time constant.
-   *
-   * @param parameters the list of parameters to be validated
-   */
+  /// Validate that the default value associated with each of the parameters in
+  /// the given list is a compile time constant.
+  ///
+  /// @param parameters the list of parameters to be validated
   void _validateDefaultValues(FormalParameterList parameters) {
     if (parameters == null) {
       return;
@@ -2012,14 +1918,13 @@
     }
   }
 
-  /**
-   * Validates that the expressions of any field initializers in the class declaration are all
-   * compile time constants. Since this is only required if the class has a constant constructor,
-   * the error is reported at the constructor site.
-   *
-   * @param classDeclaration the class which should be validated
-   * @param errorSite the site at which errors should be reported.
-   */
+  /// Validates that the expressions of any field initializers in the class
+  /// declaration are all compile time constants. Since this is only required if
+  /// the class has a constant constructor, the error is reported at the
+  /// constructor site.
+  ///
+  /// @param classDeclaration the class which should be validated
+  /// @param errorSite the site at which errors should be reported.
   void _validateFieldInitializers(
       ClassDeclaration classDeclaration, ConstructorDeclaration errorSite) {
     NodeList<ClassMember> members = classDeclaration.members;
@@ -2052,13 +1957,12 @@
     }
   }
 
-  /**
-   * Validates that the given expression is a compile time constant.
-   *
-   * @param parameterElements the elements of parameters of constant constructor, they are
-   *          considered as a valid potentially constant expressions
-   * @param expression the expression to validate
-   */
+  /// Validates that the given expression is a compile time constant.
+  ///
+  /// @param parameterElements the elements of parameters of constant
+  ///        constructor, they are considered as a valid potentially constant
+  ///        expressions
+  /// @param expression the expression to validate
   void _validateInitializerExpression(
       List<ParameterElement> parameterElements, Expression expression) {
     RecordingErrorListener errorListener = new RecordingErrorListener();
@@ -2078,13 +1982,13 @@
     }
   }
 
-  /**
-   * Validates that all of the arguments of a constructor initializer are compile time constants.
-   *
-   * @param parameterElements the elements of parameters of constant constructor, they are
-   *          considered as a valid potentially constant expressions
-   * @param argumentList the argument list to validate
-   */
+  /// Validates that all of the arguments of a constructor initializer are
+  /// compile time constants.
+  ///
+  /// @param parameterElements the elements of parameters of constant
+  ///        constructor, they are considered as a valid potentially constant
+  ///        expressions
+  /// @param argumentList the argument list to validate
   void _validateInitializerInvocationArguments(
       List<ParameterElement> parameterElements, ArgumentList argumentList) {
     if (argumentList == null) {
@@ -2095,12 +1999,10 @@
     }
   }
 
-  /**
-   * Validate that if the passed instance creation is 'const' then all its arguments are constant
-   * expressions.
-   *
-   * @param node the instance creation evaluate
-   */
+  /// Validate that if the passed instance creation is 'const' then all its
+  /// arguments are constant expressions.
+  ///
+  /// @param node the instance creation evaluate
   void _validateInstanceCreationArguments(InstanceCreationExpression node) {
     if (!node.isConst) {
       return;
@@ -2113,26 +2015,19 @@
   }
 }
 
-/**
- * Instances of the class `Dart2JSVerifier` traverse an AST structure looking for hints for
- * code that will be compiled to JS, such as [HintCode.IS_DOUBLE].
- */
+/// Instances of the class `Dart2JSVerifier` traverse an AST structure looking
+/// for hints for code that will be compiled to JS, such as
+/// [HintCode.IS_DOUBLE].
 class Dart2JSVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The name of the `double` type.
-   */
+  /// The name of the `double` type.
   static String _DOUBLE_TYPE_NAME = "double";
 
-  /**
-   * The error reporter by which errors will be reported.
-   */
+  /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
-  /**
-   * Create a new instance of the [Dart2JSVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
+  /// Create a new instance of the [Dart2JSVerifier].
+  ///
+  /// @param errorReporter the error reporter
   Dart2JSVerifier(this._errorReporter);
 
   @override
@@ -2141,17 +2036,15 @@
     return super.visitIsExpression(node);
   }
 
-  /**
-   * Check for instances of `x is double`, `x is int`, `x is! double` and
-   * `x is! int`.
-   *
-   * @param node the is expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * See [HintCode.IS_DOUBLE],
-   * [HintCode.IS_INT],
-   * [HintCode.IS_NOT_DOUBLE], and
-   * [HintCode.IS_NOT_INT].
-   */
+  /// Check for instances of `x is double`, `x is int`, `x is! double` and
+  /// `x is! int`.
+  ///
+  /// @param node the is expression to check
+  /// @return `true` if and only if a hint code is generated on the passed node
+  /// See [HintCode.IS_DOUBLE],
+  /// [HintCode.IS_INT],
+  /// [HintCode.IS_NOT_DOUBLE], and
+  /// [HintCode.IS_NOT_INT].
   bool _checkForIsDoubleHints(IsExpression node) {
     DartType type = node.type.type;
     Element element = type?.element;
@@ -2182,30 +2075,20 @@
   }
 }
 
-/**
- * A visitor that finds dead code and unused labels.
- */
+/// A visitor that finds dead code and unused labels.
 class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The error reporter by which errors will be reported.
-   */
+  /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
-  /**
-   *  The type system for this visitor
-   */
+  ///  The type system for this visitor
   final TypeSystem _typeSystem;
 
-  /**
-   * The object used to track the usage of labels within a given label scope.
-   */
+  /// The object used to track the usage of labels within a given label scope.
   _LabelTracker labelTracker;
 
-  /**
-   * Initialize a newly created dead code verifier that will report dead code to
-   * the given [errorReporter] and will use the given [typeSystem] if one is
-   * provided.
-   */
+  /// Initialize a newly created dead code verifier that will report dead code
+  /// to the given [errorReporter] and will use the given [typeSystem] if one is
+  /// provided.
   DeadCodeVerifier(this._errorReporter, {TypeSystem typeSystem})
       : this._typeSystem = typeSystem ?? new StrongTypeSystemImpl(null);
 
@@ -2260,11 +2143,9 @@
     return super.visitBinaryExpression(node);
   }
 
-  /**
-   * For each block, this method reports and error on all statements between the
-   * end of the block and the first return statement (assuming there it is not
-   * at the end of the block.)
-   */
+  /// For each block, this method reports and error on all statements between
+  /// the end of the block and the first return statement (assuming there it is
+  /// not at the end of the block.)
   @override
   Object visitBlock(Block node) {
     NodeList<Statement> statements = node.statements;
@@ -2496,10 +2377,8 @@
     return null;
   }
 
-  /**
-   * Resolve the names in the given [combinator] in the scope of the given
-   * [library].
-   */
+  /// Resolve the names in the given [combinator] in the scope of the given
+  /// [library].
   void _checkCombinator(LibraryElement library, Combinator combinator) {
     Namespace namespace =
         new NamespaceBuilder().createExportNamespaceForLibrary(library);
@@ -2525,13 +2404,11 @@
     }
   }
 
-  /**
-   * Given some list of [statements], loop through the list searching for dead
-   * statements. If [allowMandated] is true, then allow dead statements that are
-   * mandated by the language spec. This allows for a final break, continue,
-   * return, or throw statement at the end of a switch case, that are mandated
-   * by the language spec.
-   */
+  /// Given some list of [statements], loop through the list searching for dead
+  /// statements. If [allowMandated] is true, then allow dead statements that
+  /// are mandated by the language spec. This allows for a final break,
+  /// continue, return, or throw statement at the end of a switch case, that are
+  /// mandated by the language spec.
   void _checkForDeadStatementsInNodeList(NodeList<Statement> statements,
       {bool allowMandated: false}) {
     bool statementExits(Statement statement) {
@@ -2565,11 +2442,9 @@
     }
   }
 
-  /**
-   * Given some [expression], return [ValidResult.RESULT_TRUE] if it is `true`,
-   * [ValidResult.RESULT_FALSE] if it is `false`, or `null` if the expression is
-   * not a constant boolean value.
-   */
+  /// Given some [expression], return [ValidResult.RESULT_TRUE] if it is `true`,
+  /// [ValidResult.RESULT_FALSE] if it is `false`, or `null` if the expression
+  /// is not a constant boolean value.
   EvaluationResultImpl _getConstantBooleanValue(Expression expression) {
     if (expression is BooleanLiteral) {
       if (expression.value) {
@@ -2594,9 +2469,8 @@
     return null;
   }
 
-  /**
-   * Return `true` if the given [expression] is resolved to a constant variable.
-   */
+  /// Return `true` if the given [expression] is resolved to a constant
+  /// variable.
   bool _isDebugConstant(Expression expression) {
     Element element = null;
     if (expression is Identifier) {
@@ -2611,10 +2485,8 @@
     return false;
   }
 
-  /**
-   * Exit the most recently entered label scope after reporting any labels that
-   * were not referenced within that scope.
-   */
+  /// Exit the most recently entered label scope after reporting any labels that
+  /// were not referenced within that scope.
   void _popLabels() {
     for (Label label in labelTracker.unusedLabels()) {
       _errorReporter
@@ -2623,21 +2495,17 @@
     labelTracker = labelTracker.outerTracker;
   }
 
-  /**
-   * Enter a new label scope in which the given [labels] are defined.
-   */
+  /// Enter a new label scope in which the given [labels] are defined.
   void _pushLabels(List<Label> labels) {
     labelTracker = new _LabelTracker(labelTracker, labels);
   }
 }
 
-/**
- * A visitor that resolves directives in an AST structure to already built
- * elements.
- *
- * The resulting AST must have everything resolved that would have been resolved
- * by a [DirectiveElementBuilder].
- */
+/// A visitor that resolves directives in an AST structure to already built
+/// elements.
+///
+/// The resulting AST must have everything resolved that would have been
+/// resolved by a [DirectiveElementBuilder].
 class DirectiveResolver extends SimpleAstVisitor {
   final Map<Source, int> sourceModificationTimeMap;
   final Map<Source, SourceKind> importSourceKindMap;
@@ -2723,10 +2591,9 @@
   }
 }
 
-/**
- * Instances of the class `ElementHolder` hold on to elements created while traversing an AST
- * structure so that they can be accessed when creating their enclosing element.
- */
+/// Instances of the class `ElementHolder` hold on to elements created while
+/// traversing an AST structure so that they can be accessed when creating their
+/// enclosing element.
 class ElementHolder {
   List<PropertyAccessorElement> _accessors;
 
@@ -3106,22 +2973,17 @@
   }
 }
 
-/**
- * Instances of the class `EnumMemberBuilder` build the members in enum declarations.
- */
+/// Instances of the class `EnumMemberBuilder` build the members in enum
+/// declarations.
 class EnumMemberBuilder extends RecursiveAstVisitor<Object> {
-  /**
-   * The type provider used to access the types needed to build an element model for enum
-   * declarations.
-   */
+  /// The type provider used to access the types needed to build an element
+  /// model for enum declarations.
   final TypeProvider _typeProvider;
 
-  /**
-   * Initialize a newly created enum member builder.
-   *
-   * @param typeProvider the type provider used to access the types needed to build an element model
-   *          for enum declarations
-   */
+  /// Initialize a newly created enum member builder.
+  ///
+  /// @param typeProvider the type provider used to access the types needed to
+  ///        build an element model for enum declarations
   EnumMemberBuilder(this._typeProvider);
 
   @override
@@ -3194,35 +3056,26 @@
     return super.visitEnumDeclaration(node);
   }
 
-  /**
-   * Create a getter that corresponds to the given [field].
-   */
+  /// Create a getter that corresponds to the given [field].
   PropertyAccessorElement _createGetter(FieldElementImpl field) {
     return new PropertyAccessorElementImpl_ImplicitGetter(field);
   }
 }
 
-/**
- * Instances of the class `ExitDetector` determine whether the visited AST node is guaranteed
- * to terminate by executing a `return` statement, `throw` expression, `rethrow`
- * expression, or simple infinite loop such as `while(true)`.
- */
+/// Instances of the class `ExitDetector` determine whether the visited AST node
+/// is guaranteed to terminate by executing a `return` statement, `throw`
+/// expression, `rethrow` expression, or simple infinite loop such as
+/// `while(true)`.
 class ExitDetector extends GeneralizingAstVisitor<bool> {
-  /**
-   * Set to `true` when a `break` is encountered, and reset to `false` when a
-   * `do`, `while`, `for` or `switch` block is entered.
-   */
+  /// Set to `true` when a `break` is encountered, and reset to `false` when a
+  /// `do`, `while`, `for` or `switch` block is entered.
   bool _enclosingBlockContainsBreak = false;
 
-  /**
-   * Set to `true` when a `continue` is encountered, and reset to `false` when a
-   * `do`, `while`, `for` or `switch` block is entered.
-   */
+  /// Set to `true` when a `continue` is encountered, and reset to `false` when
+  /// a `do`, `while`, `for` or `switch` block is entered.
   bool _enclosingBlockContainsContinue = false;
 
-  /**
-   * Add node when a labelled `break` is encountered.
-   */
+  /// Add node when a labelled `break` is encountered.
   Set<AstNode> _enclosingBlockBreaksLabel = new Set<AstNode>();
 
   @override
@@ -3694,12 +3547,10 @@
   @override
   bool visitYieldStatement(YieldStatement node) => _nodeExits(node.expression);
 
-  /**
-   * Return `true` if the given node exits.
-   *
-   * @param node the node being tested
-   * @return `true` if the given node exits
-   */
+  /// Return `true` if the given node exits.
+  ///
+  /// @param node the node being tested
+  /// @return `true` if the given node exits
   bool _nodeExits(AstNode node) {
     if (node == null) {
       return false;
@@ -3735,17 +3586,13 @@
     return false;
   }
 
-  /**
-   * Return `true` if the given [node] exits.
-   */
+  /// Return `true` if the given [node] exits.
   static bool exits(AstNode node) {
     return new ExitDetector()._nodeExits(node);
   }
 }
 
-/**
- * A visitor that visits ASTs and fills [UsedImportedElements].
- */
+/// A visitor that visits ASTs and fills [UsedImportedElements].
 class GatherUsedImportedElementsVisitor extends RecursiveAstVisitor {
   final LibraryElement library;
   final UsedImportedElements usedElements = new UsedImportedElements();
@@ -3772,10 +3619,8 @@
     _visitIdentifier(node, node.staticElement);
   }
 
-  /**
-   * If the given [identifier] is prefixed with a [PrefixElement], fill the
-   * corresponding `UsedImportedElements.prefixMap` entry and return `true`.
-   */
+  /// If the given [identifier] is prefixed with a [PrefixElement], fill the
+  /// corresponding `UsedImportedElements.prefixMap` entry and return `true`.
   bool _recordPrefixMap(SimpleIdentifier identifier, Element element) {
     bool recordIfTargetIsPrefixElement(Expression target) {
       if (target is SimpleIdentifier && target.staticElement is PrefixElement) {
@@ -3797,9 +3642,7 @@
     return false;
   }
 
-  /**
-   * Visit identifiers used by the given [directive].
-   */
+  /// Visit identifiers used by the given [directive].
   void _visitDirective(Directive directive) {
     directive.documentationComment?.accept(this);
     directive.metadata.accept(this);
@@ -3850,9 +3693,7 @@
   }
 }
 
-/**
- * An [AstVisitor] that fills [UsedLocalElements].
- */
+/// An [AstVisitor] that fills [UsedLocalElements].
 class GatherUsedLocalElementsVisitor extends RecursiveAstVisitor {
   final UsedLocalElements usedElements = new UsedLocalElements();
 
@@ -3950,9 +3791,7 @@
     }
   }
 
-  /**
-   * Marks an [Element] of [node] as used in the library.
-   */
+  /// Marks an [Element] of [node] as used in the library.
   void _useIdentifierElement(Identifier node) {
     Element element = node.staticElement;
     if (element == null) {
@@ -4014,86 +3853,75 @@
   }
 }
 
-/**
- * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the source code
- * verifying that all of the imports are used, otherwise a [HintCode.UNUSED_IMPORT] hint is
- * generated with [generateUnusedImportHints].
- *
- * Additionally, [generateDuplicateImportHints] generates [HintCode.DUPLICATE_IMPORT] hints and
- * [HintCode.UNUSED_SHOWN_NAME] hints.
- *
- * While this class does not yet have support for an "Organize Imports" action, this logic built up
- * in this class could be used for such an action in the future.
- */
+/// Instances of the class `ImportsVerifier` visit all of the referenced
+/// libraries in the source code verifying that all of the imports are used,
+/// otherwise a [HintCode.UNUSED_IMPORT] hint is generated with
+/// [generateUnusedImportHints].
+///
+/// Additionally, [generateDuplicateImportHints] generates
+/// [HintCode.DUPLICATE_IMPORT] hints and [HintCode.UNUSED_SHOWN_NAME] hints.
+///
+/// While this class does not yet have support for an "Organize Imports" action,
+/// this logic built up in this class could be used for such an action in the
+/// future.
 class ImportsVerifier {
-  /**
-   * All [ImportDirective]s of the current library.
-   */
+  /// All [ImportDirective]s of the current library.
   final List<ImportDirective> _allImports = <ImportDirective>[];
 
-  /**
-   * A list of [ImportDirective]s that the current library imports, but does not use.
-   *
-   * As identifiers are visited by this visitor and an import has been identified as being used
-   * by the library, the [ImportDirective] is removed from this list. After all the sources in the
-   * library have been evaluated, this list represents the set of unused imports.
-   *
-   * See [ImportsVerifier.generateUnusedImportErrors].
-   */
+  /// A list of [ImportDirective]s that the current library imports, but does
+  /// not use.
+  ///
+  /// As identifiers are visited by this visitor and an import has been
+  /// identified as being used by the library, the [ImportDirective] is removed
+  /// from this list. After all the sources in the library have been evaluated,
+  /// this list represents the set of unused imports.
+  ///
+  /// See [ImportsVerifier.generateUnusedImportErrors].
   final List<ImportDirective> _unusedImports = <ImportDirective>[];
 
-  /**
-   * After the list of [unusedImports] has been computed, this list is a proper subset of the
-   * unused imports that are listed more than once.
-   */
+  /// After the list of [unusedImports] has been computed, this list is a proper
+  /// subset of the unused imports that are listed more than once.
   final List<ImportDirective> _duplicateImports = <ImportDirective>[];
 
-  /**
-   * The cache of [Namespace]s for [ImportDirective]s.
-   */
+  /// The cache of [Namespace]s for [ImportDirective]s.
   final HashMap<ImportDirective, Namespace> _namespaceMap =
       new HashMap<ImportDirective, Namespace>();
 
-  /**
-   * This is a map between prefix elements and the import directives from which they are derived. In
-   * cases where a type is referenced via a prefix element, the import directive can be marked as
-   * used (removed from the unusedImports) by looking at the resolved `lib` in `lib.X`,
-   * instead of looking at which library the `lib.X` resolves.
-   *
-   * TODO (jwren) Since multiple [ImportDirective]s can share the same [PrefixElement],
-   * it is possible to have an unreported unused import in situations where two imports use the same
-   * prefix and at least one import directive is used.
-   */
+  /// This is a map between prefix elements and the import directives from which
+  /// they are derived. In cases where a type is referenced via a prefix
+  /// element, the import directive can be marked as used (removed from the
+  /// unusedImports) by looking at the resolved `lib` in `lib.X`, instead of
+  /// looking at which library the `lib.X` resolves.
+  ///
+  /// TODO (jwren) Since multiple [ImportDirective]s can share the same
+  /// [PrefixElement], it is possible to have an unreported unused import in
+  /// situations where two imports use the same prefix and at least one import
+  /// directive is used.
   final HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap =
       new HashMap<PrefixElement, List<ImportDirective>>();
 
-  /**
-   * A map of identifiers that the current library's imports show, but that the library does not
-   * use.
-   *
-   * Each import directive maps to a list of the identifiers that are imported via the "show"
-   * keyword.
-   *
-   * As each identifier is visited by this visitor, it is identified as being used by the library,
-   * and the identifier is removed from this map (under the import that imported it). After all the
-   * sources in the library have been evaluated, each list in this map's values present the set of
-   * unused shown elements.
-   *
-   * See [ImportsVerifier.generateUnusedShownNameHints].
-   */
+  /// A map of identifiers that the current library's imports show, but that the
+  /// library does not use.
+  ///
+  /// Each import directive maps to a list of the identifiers that are imported
+  /// via the "show" keyword.
+  ///
+  /// As each identifier is visited by this visitor, it is identified as being
+  /// used by the library, and the identifier is removed from this map (under
+  /// the import that imported it). After all the sources in the library have
+  /// been evaluated, each list in this map's values present the set of unused
+  /// shown elements.
+  ///
+  /// See [ImportsVerifier.generateUnusedShownNameHints].
   final HashMap<ImportDirective, List<SimpleIdentifier>> _unusedShownNamesMap =
       new HashMap<ImportDirective, List<SimpleIdentifier>>();
 
-  /**
-   * A map of names that are hidden more than once.
-   */
+  /// A map of names that are hidden more than once.
   final HashMap<NamespaceDirective, List<SimpleIdentifier>>
       _duplicateHiddenNamesMap =
       new HashMap<NamespaceDirective, List<SimpleIdentifier>>();
 
-  /**
-   * A map of names that are shown more than once.
-   */
+  /// A map of names that are shown more than once.
   final HashMap<NamespaceDirective, List<SimpleIdentifier>>
       _duplicateShownNamesMap =
       new HashMap<NamespaceDirective, List<SimpleIdentifier>>();
@@ -4155,14 +3983,13 @@
     }
   }
 
-  /**
-   * Any time after the defining compilation unit has been visited by this visitor, this method can
-   * be called to report an [HintCode.DUPLICATE_IMPORT] hint for each of the import directives
-   * in the [duplicateImports] list.
-   *
-   * @param errorReporter the error reporter to report the set of [HintCode.DUPLICATE_IMPORT]
-   *          hints to
-   */
+  /// Any time after the defining compilation unit has been visited by this
+  /// visitor, this method can be called to report an
+  /// [HintCode.DUPLICATE_IMPORT] hint for each of the import directives in the
+  /// [duplicateImports] list.
+  ///
+  /// @param errorReporter the error reporter to report the set of
+  ///        [HintCode.DUPLICATE_IMPORT] hints to
   void generateDuplicateImportHints(ErrorReporter errorReporter) {
     int length = _duplicateImports.length;
     for (int i = 0; i < length; i++) {
@@ -4171,16 +3998,14 @@
     }
   }
 
-  /**
-   * Report a [HintCode.DUPLICATE_SHOWN_HIDDEN_NAME] hint for each duplicate
-   * shown or hidden name.
-   *
-   * Only call this method after all of the compilation units have been visited
-   * by this visitor.
-   *
-   * @param errorReporter the error reporter used to report the set of
-   *          [HintCode.UNUSED_SHOWN_NAME] hints
-   */
+  /// Report a [HintCode.DUPLICATE_SHOWN_HIDDEN_NAME] hint for each duplicate
+  /// shown or hidden name.
+  ///
+  /// Only call this method after all of the compilation units have been visited
+  /// by this visitor.
+  ///
+  /// @param errorReporter the error reporter used to report the set of
+  ///          [HintCode.UNUSED_SHOWN_NAME] hints
   void generateDuplicateShownHiddenNameHints(ErrorReporter reporter) {
     _duplicateHiddenNamesMap.forEach(
         (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
@@ -4202,14 +4027,13 @@
     });
   }
 
-  /**
-   * Report an [HintCode.UNUSED_IMPORT] hint for each unused import.
-   *
-   * Only call this method after all of the compilation units have been visited by this visitor.
-   *
-   * @param errorReporter the error reporter used to report the set of [HintCode.UNUSED_IMPORT]
-   *          hints
-   */
+  /// Report an [HintCode.UNUSED_IMPORT] hint for each unused import.
+  ///
+  /// Only call this method after all of the compilation units have been visited
+  /// by this visitor.
+  ///
+  /// @param errorReporter the error reporter used to report the set of
+  ///        [HintCode.UNUSED_IMPORT] hints
   void generateUnusedImportHints(ErrorReporter errorReporter) {
     int length = _unusedImports.length;
     for (int i = 0; i < length; i++) {
@@ -4230,14 +4054,13 @@
     }
   }
 
-  /**
-   * Report an [HintCode.UNUSED_SHOWN_NAME] hint for each unused shown name.
-   *
-   * Only call this method after all of the compilation units have been visited by this visitor.
-   *
-   * @param errorReporter the error reporter used to report the set of [HintCode.UNUSED_SHOWN_NAME]
-   *          hints
-   */
+  /// Report an [HintCode.UNUSED_SHOWN_NAME] hint for each unused shown name.
+  ///
+  /// Only call this method after all of the compilation units have been visited
+  /// by this visitor.
+  ///
+  /// @param errorReporter the error reporter used to report the set of
+  ///        [HintCode.UNUSED_SHOWN_NAME] hints
   void generateUnusedShownNameHints(ErrorReporter reporter) {
     _unusedShownNamesMap.forEach(
         (ImportDirective importDirective, List<SimpleIdentifier> identifiers) {
@@ -4255,9 +4078,7 @@
     });
   }
 
-  /**
-   * Remove elements from [_unusedImports] using the given [usedElements].
-   */
+  /// Remove elements from [_unusedImports] using the given [usedElements].
   void removeUsedElements(UsedImportedElements usedElements) {
     // Stop if all the imports and shown names are known to be used.
     if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
@@ -4298,10 +4119,8 @@
     }
   }
 
-  /**
-   * Add duplicate shown and hidden names from [directive] into
-   * [_duplicateHiddenNamesMap] and [_duplicateShownNamesMap].
-   */
+  /// Add duplicate shown and hidden names from [directive] into
+  /// [_duplicateHiddenNamesMap] and [_duplicateShownNamesMap].
   void _addDuplicateShownHiddenNames(NamespaceDirective directive) {
     if (directive.combinators == null) {
       return;
@@ -4335,9 +4154,7 @@
     }
   }
 
-  /**
-   * Add every shown name from [importDirective] into [_unusedShownNamesMap].
-   */
+  /// Add every shown name from [importDirective] into [_unusedShownNamesMap].
   void _addShownNames(ImportDirective importDirective) {
     if (importDirective.combinators == null) {
       return;
@@ -4355,15 +4172,15 @@
     }
   }
 
-  /**
-   * Lookup and return the [Namespace] from the [_namespaceMap].
-   *
-   * If the map does not have the computed namespace, compute it and cache it in the map. If
-   * [importDirective] is not resolved or is not resolvable, `null` is returned.
-   *
-   * @param importDirective the import directive used to compute the returned namespace
-   * @return the computed or looked up [Namespace]
-   */
+  /// Lookup and return the [Namespace] from the [_namespaceMap].
+  ///
+  /// If the map does not have the computed namespace, compute it and cache it
+  /// in the map. If [importDirective] is not resolved or is not resolvable,
+  /// `null` is returned.
+  ///
+  /// @param importDirective the import directive used to compute the returned
+  ///        namespace
+  /// @return the computed or looked up [Namespace]
   Namespace _computeNamespace(ImportDirective importDirective) {
     Namespace namespace = _namespaceMap[importDirective];
     if (namespace == null) {
@@ -4378,9 +4195,7 @@
     return namespace;
   }
 
-  /**
-   * Remove [element] from the list of names shown by [importDirective].
-   */
+  /// Remove [element] from the list of names shown by [importDirective].
   void _removeFromUnusedShownNamesMap(
       Element element, ImportDirective importDirective) {
     List<SimpleIdentifier> identifiers = _unusedShownNamesMap[importDirective];
@@ -4410,72 +4225,54 @@
   }
 }
 
-/**
- * Maintains and manages contextual type information used for
- * inferring types.
- */
+/// Maintains and manages contextual type information used for
+/// inferring types.
 class InferenceContext {
   // TODO(leafp): Consider replacing these node properties with a
   // hash table help in an instance of this class.
   static const String _typeProperty =
       'analyzer.src.generated.InferenceContext.contextType';
 
-  /**
-   * The error listener on which to record inference information.
-   */
+  /// The error listener on which to record inference information.
   final ErrorReporter _errorReporter;
 
-  /**
-   * If true, emit hints when types are inferred
-   */
+  /// If true, emit hints when types are inferred
   final bool _inferenceHints;
 
-  /**
-   * Type provider, needed for type matching.
-   */
+  /// Type provider, needed for type matching.
   final TypeProvider _typeProvider;
 
-  /**
-   * The type system in use.
-   */
+  /// The type system in use.
   final TypeSystem _typeSystem;
 
-  /**
-   * When no context type is available, this will track the least upper bound
-   * of all return statements in a lambda.
-   *
-   * This will always be kept in sync with [_returnStack].
-   */
+  /// When no context type is available, this will track the least upper bound
+  /// of all return statements in a lambda.
+  ///
+  /// This will always be kept in sync with [_returnStack].
   final List<DartType> _inferredReturn = <DartType>[];
 
-  /**
-   * A stack of return types for all of the enclosing
-   * functions and methods.
-   */
+  /// A stack of return types for all of the enclosing
+  /// functions and methods.
   final List<DartType> _returnStack = <DartType>[];
 
   InferenceContext._(TypeProvider typeProvider, this._typeSystem,
       this._inferenceHints, this._errorReporter)
       : _typeProvider = typeProvider;
 
-  /**
-   * Get the return type of the current enclosing function, if any.
-   *
-   * The type returned for a function is the type that is expected
-   * to be used in a return or yield context.  For ordinary functions
-   * this is the same as the return type of the function.  For async
-   * functions returning Future<T> and for generator functions
-   * returning Stream<T> or Iterable<T>, this is T.
-   */
+  /// Get the return type of the current enclosing function, if any.
+  ///
+  /// The type returned for a function is the type that is expected
+  /// to be used in a return or yield context.  For ordinary functions
+  /// this is the same as the return type of the function.  For async
+  /// functions returning Future<T> and for generator functions
+  /// returning Stream<T> or Iterable<T>, this is T.
   DartType get returnContext =>
       _returnStack.isNotEmpty ? _returnStack.last : null;
 
-  /**
-   * Records the type of the expression of a return statement.
-   *
-   * This will be used for inferring a block bodied lambda, if no context
-   * type was available.
-   */
+  /// Records the type of the expression of a return statement.
+  ///
+  /// This will be used for inferring a block bodied lambda, if no context
+  /// type was available.
   void addReturnOrYieldType(DartType type) {
     if (_returnStack.isEmpty) {
       return;
@@ -4486,13 +4283,11 @@
     _inferredReturn[_inferredReturn.length - 1] = inferred;
   }
 
-  /**
-   * Pop a return type off of the return stack.
-   *
-   * Also record any inferred return type using [setType], unless this node
-   * already has a context type. This recorded type will be the least upper
-   * bound of all types added with [addReturnOrYieldType].
-   */
+  /// Pop a return type off of the return stack.
+  ///
+  /// Also record any inferred return type using [setType], unless this node
+  /// already has a context type. This recorded type will be the least upper
+  /// bound of all types added with [addReturnOrYieldType].
   void popReturnContext(FunctionBody node) {
     if (_returnStack.isNotEmpty && _inferredReturn.isNotEmpty) {
       DartType context = _returnStack.removeLast() ?? DynamicTypeImpl.instance;
@@ -4506,18 +4301,14 @@
     }
   }
 
-  /**
-   * Push a block function body's return type onto the return stack.
-   */
+  /// Push a block function body's return type onto the return stack.
   void pushReturnContext(FunctionBody node) {
     _returnStack.add(getContext(node));
     _inferredReturn.add(_typeProvider.nullType);
   }
 
-  /**
-   * Place an info node into the error stream indicating that a
-   * [type] has been inferred as the type of [node].
-   */
+  /// Place an info node into the error stream indicating that a
+  /// [type] has been inferred as the type of [node].
   void recordInference(Expression node, DartType type) {
     if (!_inferenceHints) {
       return;
@@ -4537,29 +4328,23 @@
     _errorReporter.reportErrorForNode(error, node, [node, type]);
   }
 
-  /**
-   * Clear the type information associated with [node].
-   */
+  /// Clear the type information associated with [node].
   static void clearType(AstNode node) {
     node?.setProperty(_typeProperty, null);
   }
 
-  /**
-   * Look for contextual type information attached to [node], and returns
-   * the type if found.
-   *
-   * The returned type may be partially or completely unknown, denoted with an
-   * unknown type `?`, for example `List<?>` or `(?, int) -> void`.
-   * You can use [StrongTypeSystemImpl.upperBoundForType] or
-   * [StrongTypeSystemImpl.lowerBoundForType] if you would prefer a known type
-   * that represents the bound of the context type.
-   */
+  /// Look for contextual type information attached to [node], and returns
+  /// the type if found.
+  ///
+  /// The returned type may be partially or completely unknown, denoted with an
+  /// unknown type `?`, for example `List<?>` or `(?, int) -> void`.
+  /// You can use [StrongTypeSystemImpl.upperBoundForType] or
+  /// [StrongTypeSystemImpl.lowerBoundForType] if you would prefer a known type
+  /// that represents the bound of the context type.
   static DartType getContext(AstNode node) => node?.getProperty(_typeProperty);
 
-  /**
-   * Attach contextual type information [type] to [node] for use during
-   * inference.
-   */
+  /// Attach contextual type information [type] to [node] for use during
+  /// inference.
   static void setType(AstNode node, DartType type) {
     if (type == null || type.isDynamic) {
       clearType(node);
@@ -4568,20 +4353,17 @@
     }
   }
 
-  /**
-   * Attach contextual type information [type] to [node] for use during
-   * inference.
-   */
+  /// Attach contextual type information [type] to [node] for use during
+  /// inference.
   static void setTypeFromNode(AstNode innerNode, AstNode outerNode) {
     setType(innerNode, getContext(outerNode));
   }
 }
 
-/**
- * The four states of a field initialization state through a constructor
- * signature, not initialized, initialized in the field declaration, initialized
- * in the field formal, and finally, initialized in the initializers list.
- */
+/// The four states of a field initialization state through a constructor
+/// signature, not initialized, initialized in the field declaration,
+/// initialized in the field formal, and finally, initialized in the
+/// initializers list.
 class INIT_STATE implements Comparable<INIT_STATE> {
   static const INIT_STATE NOT_INIT = const INIT_STATE('NOT_INIT', 0);
 
@@ -4601,14 +4383,10 @@
     INIT_IN_INITIALIZERS
   ];
 
-  /**
-   * The name of this init state.
-   */
+  /// The name of this init state.
   final String name;
 
-  /**
-   * The ordinal value of the init state.
-   */
+  /// The ordinal value of the init state.
   final int ordinal;
 
   const INIT_STATE(this.name, this.ordinal);
@@ -4623,33 +4401,27 @@
   String toString() => name;
 }
 
-/**
- * An AST visitor that is used to re-resolve the initializers of instance
- * fields. Although this class is an AST visitor, clients are expected to use
- * the method [resolveCompilationUnit] to run it over a compilation unit.
- */
+/// An AST visitor that is used to re-resolve the initializers of instance
+/// fields. Although this class is an AST visitor, clients are expected to use
+/// the method [resolveCompilationUnit] to run it over a compilation unit.
 class InstanceFieldResolverVisitor extends ResolverVisitor {
-  /**
-   * Initialize a newly created visitor to resolve the nodes in an AST node.
-   *
-   * The [definingLibrary] is the element for the library containing the node
-   * being visited. The [source] is the source representing the compilation unit
-   * containing the node being visited. The [typeProvider] is the object used to
-   * access the types from the core library. The [errorListener] is the error
-   * listener that will be informed of any errors that are found during
-   * resolution. The [nameScope] is the scope used to resolve identifiers in the
-   * node that will first be visited.  If `null` or unspecified, a new
-   * [LibraryScope] will be created based on the [definingLibrary].
-   */
+  /// Initialize a newly created visitor to resolve the nodes in an AST node.
+  ///
+  /// The [definingLibrary] is the element for the library containing the node
+  /// being visited. The [source] is the source representing the compilation
+  /// unit containing the node being visited. The [typeProvider] is the object
+  /// used to access the types from the core library. The [errorListener] is the
+  /// error listener that will be informed of any errors that are found during
+  /// resolution. The [nameScope] is the scope used to resolve identifiers in
+  /// the node that will first be visited.  If `null` or unspecified, a new
+  /// [LibraryScope] will be created based on the [definingLibrary].
   InstanceFieldResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
       {Scope nameScope})
       : super(definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope);
 
-  /**
-   * Resolve the instance fields in the given compilation unit [node].
-   */
+  /// Resolve the instance fields in the given compilation unit [node].
   void resolveCompilationUnit(CompilationUnit node) {
     _overrideManager.enterScope();
     try {
@@ -4666,9 +4438,7 @@
     }
   }
 
-  /**
-   * Resolve the instance fields in the given class declaration [node].
-   */
+  /// Resolve the instance fields in the given class declaration [node].
   void _resolveClassDeclaration(ClassDeclaration node) {
     _enclosingClassDeclaration = node;
     ClassElement outerType = enclosingClass;
@@ -4701,9 +4471,7 @@
     }
   }
 
-  /**
-   * Resolve the instance fields in the given field declaration [node].
-   */
+  /// Resolve the instance fields in the given field declaration [node].
   void _resolveFieldDeclaration(FieldDeclaration node) {
     if (!node.isStatic) {
       for (VariableDeclaration field in node.fields.variables) {
@@ -4720,27 +4488,21 @@
   }
 }
 
-/**
- * Instances of the class `OverrideVerifier` visit all of the declarations in a compilation
- * unit to verify that if they have an override annotation it is being used correctly.
- */
+/// Instances of the class `OverrideVerifier` visit all of the declarations in a
+/// compilation unit to verify that if they have an override annotation it is
+/// being used correctly.
 class OverrideVerifier extends RecursiveAstVisitor {
-  /**
-   * The error reporter used to report errors.
-   */
+  /// The error reporter used to report errors.
   final ErrorReporter _errorReporter;
 
-  /**
-   * The inheritance manager used to find overridden methods.
-   */
+  /// The inheritance manager used to find overridden methods.
   final InheritanceManager _manager;
 
-  /**
-   * Initialize a newly created verifier to look for inappropriate uses of the override annotation.
-   *
-   * @param errorReporter the error reporter used to report errors
-   * @param manager the inheritance manager used to find overridden methods
-   */
+  /// Initialize a newly created verifier to look for inappropriate uses of the
+  /// override annotation.
+  ///
+  /// @param errorReporter the error reporter used to report errors
+  /// @param manager the inheritance manager used to find overridden methods
   OverrideVerifier(this._errorReporter, this._manager);
 
   @override
@@ -4780,12 +4542,10 @@
     }
   }
 
-  /**
-   * Return the member that overrides the given member.
-   *
-   * @param member the member that overrides the returned member
-   * @return the member that overrides the given member
-   */
+  /// Return the member that overrides the given member.
+  ///
+  /// @param member the member that overrides the returned member
+  /// @return the member that overrides the given member
   ExecutableElement _getOverriddenMember(ExecutableElement member) {
     LibraryElement library = member.library;
     if (library == null) {
@@ -4799,46 +4559,40 @@
     return _manager.lookupInheritance(classElement, member.name);
   }
 
-  /**
-   * Return `true` if the given element has an override annotation associated with it.
-   *
-   * @param element the element being tested
-   * @return `true` if the element has an override annotation associated with it
-   */
+  /// Return `true` if the given element has an override annotation associated
+  /// with it.
+  ///
+  /// @param element the element being tested
+  /// @return `true` if the element has an override annotation associated with
+  ///         it
   bool _isOverride(Element element) => element != null && element.hasOverride;
 }
 
-/**
- * An AST visitor that is used to resolve the some of the nodes within a single
- * compilation unit. The nodes that are skipped are those that are within
- * function bodies.
- */
+/// An AST visitor that is used to resolve the some of the nodes within a single
+/// compilation unit. The nodes that are skipped are those that are within
+/// function bodies.
 class PartialResolverVisitor extends ResolverVisitor {
-  /**
-   * The static variables and fields that have an initializer. These are the
-   * variables that need to be re-resolved after static variables have their
-   * types inferred. A subset of these variables are those whose types should
-   * be inferred.
-   */
+  /// The static variables and fields that have an initializer. These are the
+  /// variables that need to be re-resolved after static variables have their
+  /// types inferred. A subset of these variables are those whose types should
+  /// be inferred.
   final List<VariableElement> staticVariables = <VariableElement>[];
 
-  /**
-   * Initialize a newly created visitor to resolve the nodes in an AST node.
-   *
-   * The [definingLibrary] is the element for the library containing the node
-   * being visited. The [source] is the source representing the compilation unit
-   * containing the node being visited. The [typeProvider] is the object used to
-   * access the types from the core library. The [errorListener] is the error
-   * listener that will be informed of any errors that are found during
-   * resolution. The [nameScope] is the scope used to resolve identifiers in the
-   * node that will first be visited.  If `null` or unspecified, a new
-   * [LibraryScope] will be created based on [definingLibrary] and
-   * [typeProvider]. The [inheritanceManager] is used to perform inheritance
-   * lookups.  If `null` or unspecified, a new [InheritanceManager] will be
-   * created based on [definingLibrary]. The [typeAnalyzerFactory] is used to
-   * create the type analyzer.  If `null` or unspecified, a type analyzer of
-   * type [StaticTypeAnalyzer] will be created.
-   */
+  /// Initialize a newly created visitor to resolve the nodes in an AST node.
+  ///
+  /// The [definingLibrary] is the element for the library containing the node
+  /// being visited. The [source] is the source representing the compilation
+  /// unit containing the node being visited. The [typeProvider] is the object
+  /// used to access the types from the core library. The [errorListener] is the
+  /// error listener that will be informed of any errors that are found during
+  /// resolution. The [nameScope] is the scope used to resolve identifiers in
+  /// the node that will first be visited.  If `null` or unspecified, a new
+  /// [LibraryScope] will be created based on [definingLibrary] and
+  /// [typeProvider]. The [inheritanceManager] is used to perform inheritance
+  /// lookups.  If `null` or unspecified, a new [InheritanceManager] will be
+  /// created based on [definingLibrary]. The [typeAnalyzerFactory] is used to
+  /// create the type analyzer.  If `null` or unspecified, a type analyzer of
+  /// type [StaticTypeAnalyzer] will be created.
   PartialResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
       {Scope nameScope})
@@ -4880,13 +4634,11 @@
     return super.visitTopLevelVariableDeclaration(node);
   }
 
-  /**
-   * Add all of the [variables] with initializers to the list of variables whose
-   * type can be inferred. Technically, we only infer the types of variables
-   * that do not have a static type, but all variables with initializers
-   * potentially need to be re-resolved after inference because they might
-   * refer to a field whose type was inferred.
-   */
+  /// Add all of the [variables] with initializers to the list of variables
+  /// whose type can be inferred. Technically, we only infer the types of
+  /// variables that do not have a static type, but all variables with
+  /// initializers potentially need to be re-resolved after inference because
+  /// they might refer to a field whose type was inferred.
   void _addStaticVariables(List<VariableDeclaration> variables) {
     int length = variables.length;
     for (int i = 0; i < length; i++) {
@@ -4897,10 +4649,8 @@
     }
   }
 
-  /**
-   * Return `true` if the given function body should be skipped because it is
-   * the body of a top-level function, method or constructor.
-   */
+  /// Return `true` if the given function body should be skipped because it is
+  /// the body of a top-level function, method or constructor.
   bool _shouldBeSkipped(FunctionBody body) {
     AstNode parent = body.parent;
     if (parent is MethodDeclaration) {
@@ -4920,9 +4670,7 @@
   }
 }
 
-/**
- * Kind of the redirecting constructor.
- */
+/// Kind of the redirecting constructor.
 class RedirectingConstructorKind
     implements Comparable<RedirectingConstructorKind> {
   static const RedirectingConstructorKind CONST =
@@ -4933,14 +4681,10 @@
 
   static const List<RedirectingConstructorKind> values = const [CONST, NORMAL];
 
-  /**
-   * The name of this redirecting constructor kind.
-   */
+  /// The name of this redirecting constructor kind.
   final String name;
 
-  /**
-   * The ordinal value of the redirecting constructor kind.
-   */
+  /// The ordinal value of the redirecting constructor kind.
   final int ordinal;
 
   const RedirectingConstructorKind(this.name, this.ordinal);
@@ -4955,13 +4699,11 @@
   String toString() => name;
 }
 
-/**
- * The enumeration `ResolverErrorCode` defines the error codes used for errors
- * detected by the resolver. The convention for this class is for the name of
- * the error code to indicate the problem that caused the error to be generated
- * and for the error message to explain what is wrong and, when appropriate, how
- * the problem can be corrected.
- */
+/// The enumeration `ResolverErrorCode` defines the error codes used for errors
+/// detected by the resolver. The convention for this class is for the name of
+/// the error code to indicate the problem that caused the error to be generated
+/// and for the error message to explain what is wrong and, when appropriate,
+/// how the problem can be corrected.
 class ResolverErrorCode extends ErrorCode {
   static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER =
       const ResolverErrorCode('BREAK_LABEL_ON_SWITCH_MEMBER',
@@ -4975,14 +4717,12 @@
       const ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART',
           "Libraries that have parts must have a library directive");
 
-  /**
-   * Parts: It is a static warning if the referenced part declaration
-   * <i>p</i> names a library that does not have a library tag.
-   *
-   * Parameters:
-   * 0: the URI of the expected library
-   * 1: the non-matching actual library name from the "part of" declaration
-   */
+  /// Parts: It is a static warning if the referenced part declaration
+  /// <i>p</i> names a library that does not have a library tag.
+  ///
+  /// Parameters:
+  /// 0: the URI of the expected library
+  /// 1: the non-matching actual library name from the "part of" declaration
   static const ResolverErrorCode PART_OF_UNNAMED_LIBRARY =
       const ResolverErrorCode(
           'PART_OF_UNNAMED_LIBRARY',
@@ -4992,12 +4732,10 @@
               "Try changing the part-of directive to a URI, or try including a"
               " different part.");
 
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
+  /// Initialize a newly created error code to have the given [name]. The
+  /// message associated with the error will be created from the given [message]
+  /// template. The correction associated with the error will be created from
+  /// the given [correction] template.
   const ResolverErrorCode(String name, String message, {String correction})
       : super.temporary(name, message, correction: correction);
 
@@ -5008,100 +4746,74 @@
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
 }
 
-/**
- * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
- * compilation unit.
- */
+/// Instances of the class `ResolverVisitor` are used to resolve the nodes
+/// within a single compilation unit.
 class ResolverVisitor extends ScopedVisitor {
-  /**
-   * The object used to resolve the element associated with the current node.
-   */
+  /// The object used to resolve the element associated with the current node.
   ElementResolver elementResolver;
 
-  /**
-   * The object used to compute the type associated with the current node.
-   */
+  /// The object used to compute the type associated with the current node.
   StaticTypeAnalyzer typeAnalyzer;
 
-  /**
-   * The type system in use during resolution.
-   */
+  /// The type system in use during resolution.
   TypeSystem typeSystem;
 
-  /**
-   * The class declaration representing the class containing the current node, or `null` if
-   * the current node is not contained in a class.
-   */
+  /// The class declaration representing the class containing the current node,
+  /// or `null` if the current node is not contained in a class.
   ClassDeclaration _enclosingClassDeclaration = null;
 
-  /**
-   * The function type alias representing the function type containing the current node, or
-   * `null` if the current node is not contained in a function type alias.
-   */
+  /// The function type alias representing the function type containing the
+  /// current node, or `null` if the current node is not contained in a function
+  /// type alias.
   FunctionTypeAlias _enclosingFunctionTypeAlias = null;
 
-  /**
-   * The element representing the function containing the current node, or `null` if the
-   * current node is not contained in a function.
-   */
+  /// The element representing the function containing the current node, or
+  /// `null` if the current node is not contained in a function.
   ExecutableElement _enclosingFunction = null;
 
-  /**
-   * The mixin declaration representing the class containing the current node,
-   * or `null` if the current node is not contained in a mixin.
-   */
+  /// The mixin declaration representing the class containing the current node,
+  /// or `null` if the current node is not contained in a mixin.
   MixinDeclaration _enclosingMixinDeclaration = null;
 
   InferenceContext inferenceContext = null;
 
-  /**
-   * The object keeping track of which elements have had their types overridden.
-   */
+  /// The object keeping track of which elements have had their types
+  /// overridden.
   TypeOverrideManager _overrideManager = new TypeOverrideManager();
 
-  /**
-   * The object keeping track of which elements have had their types promoted.
-   */
+  /// The object keeping track of which elements have had their types promoted.
   TypePromotionManager _promoteManager = new TypePromotionManager();
 
-  /**
-   * A comment before a function should be resolved in the context of the
-   * function. But when we incrementally resolve a comment, we don't want to
-   * resolve the whole function.
-   *
-   * So, this flag is set to `true`, when just context of the function should
-   * be built and the comment resolved.
-   */
+  /// A comment before a function should be resolved in the context of the
+  /// function. But when we incrementally resolve a comment, we don't want to
+  /// resolve the whole function.
+  ///
+  /// So, this flag is set to `true`, when just context of the function should
+  /// be built and the comment resolved.
   bool resolveOnlyCommentInFunctionBody = false;
 
-  /**
-   * Body of the function currently being analyzed, if any.
-   */
+  /// Body of the function currently being analyzed, if any.
   FunctionBody _currentFunctionBody;
 
-  /**
-   * The type of the expression of the immediately enclosing [SwitchStatement],
-   * or `null` if not in a [SwitchStatement].
-   */
+  /// The type of the expression of the immediately enclosing [SwitchStatement],
+  /// or `null` if not in a [SwitchStatement].
   DartType _enclosingSwitchStatementExpressionType;
 
-  /**
-   * Initialize a newly created visitor to resolve the nodes in an AST node.
-   *
-   * The [definingLibrary] is the element for the library containing the node
-   * being visited. The [source] is the source representing the compilation unit
-   * containing the node being visited. The [typeProvider] is the object used to
-   * access the types from the core library. The [errorListener] is the error
-   * listener that will be informed of any errors that are found during
-   * resolution. The [nameScope] is the scope used to resolve identifiers in the
-   * node that will first be visited.  If `null` or unspecified, a new
-   * [LibraryScope] will be created based on [definingLibrary] and
-   * [typeProvider]. The [inheritanceManager] is used to perform inheritance
-   * lookups.  If `null` or unspecified, a new [InheritanceManager] will be
-   * created based on [definingLibrary]. The [typeAnalyzerFactory] is used to
-   * create the type analyzer.  If `null` or unspecified, a type analyzer of
-   * type [StaticTypeAnalyzer] will be created.
-   */
+  /// Initialize a newly created visitor to resolve the nodes in an AST node.
+  ///
+  /// The [definingLibrary] is the element for the library containing the node
+  /// being visited. The [source] is the source representing the compilation
+  /// unit containing the node being visited. The [typeProvider] is the object
+  /// used to access the types from the core library. The [errorListener] is the
+  /// error listener that will be informed of any errors that are found during
+  /// resolution. The [nameScope] is the scope used to resolve identifiers in
+  /// the node that will first be visited.  If `null` or unspecified, a new
+  /// [LibraryScope] will be created based on [definingLibrary] and
+  /// [typeProvider]. The [inheritanceManager] is used to perform inheritance
+  /// lookups.  If `null` or unspecified, a new [InheritanceManager] will be
+  /// created based on [definingLibrary]. The [typeAnalyzerFactory] is used to
+  /// create the type analyzer.  If `null` or unspecified, a type analyzer of
+  /// type [StaticTypeAnalyzer] will be created.
   ResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
       {Scope nameScope,
@@ -5122,35 +4834,32 @@
     this.typeAnalyzer = new StaticTypeAnalyzer(this);
   }
 
-  /**
-   * Return the element representing the function containing the current node, or `null` if
-   * the current node is not contained in a function.
-   *
-   * @return the element representing the function containing the current node
-   */
+  /// Return the element representing the function containing the current node,
+  /// or `null` if the current node is not contained in a function.
+  ///
+  /// @return the element representing the function containing the current node
   ExecutableElement get enclosingFunction => _enclosingFunction;
 
-  /**
-   * Return the object keeping track of which elements have had their types overridden.
-   *
-   * @return the object keeping track of which elements have had their types overridden
-   */
+  /// Return the object keeping track of which elements have had their types
+  /// overridden.
+  ///
+  /// @return the object keeping track of which elements have had their types
+  ///         overridden
   TypeOverrideManager get overrideManager => _overrideManager;
 
-  /**
-   * Return the object keeping track of which elements have had their types promoted.
-   *
-   * @return the object keeping track of which elements have had their types promoted
-   */
+  /// Return the object keeping track of which elements have had their types
+  /// promoted.
+  ///
+  /// @return the object keeping track of which elements have had their types
+  ///         promoted
   TypePromotionManager get promoteManager => _promoteManager;
 
-  /**
-   * Return the static element associated with the given expression whose type can be overridden, or
-   * `null` if there is no element whose type can be overridden.
-   *
-   * @param expression the expression with which the element is associated
-   * @return the element associated with the given expression
-   */
+  /// Return the static element associated with the given expression whose type
+  /// can be overridden, or `null` if there is no element whose type can be
+  /// overridden.
+  ///
+  /// @param expression the expression with which the element is associated
+  /// @return the element associated with the given expression
   VariableElement getOverridableStaticElement(Expression expression) {
     Element element = null;
     if (expression is SimpleIdentifier) {
@@ -5166,11 +4875,9 @@
     return null;
   }
 
-  /**
-   * Return the static element associated with the given expression whose type
-   * can be promoted, or `null` if there is no element whose type can be
-   * promoted.
-   */
+  /// Return the static element associated with the given expression whose type
+  /// can be promoted, or `null` if there is no element whose type can be
+  /// promoted.
   VariableElement getPromotionStaticElement(Expression expression) {
     expression = expression?.unParenthesized;
     if (expression is SimpleIdentifier) {
@@ -5186,23 +4893,19 @@
     return null;
   }
 
-  /**
-   * Prepares this [ResolverVisitor] to using it for incremental resolution.
-   */
+  /// Prepares this [ResolverVisitor] to using it for incremental resolution.
   void initForIncrementalResolution() {
     _overrideManager.enterScope();
   }
 
-  /**
-   * Given a downward inference type [fnType], and the declared
-   * [typeParameterList] for a function expression, determines if we can enable
-   * downward inference and if so, returns the function type to use for
-   * inference.
-   *
-   * This will return null if inference is not possible. This happens when
-   * there is no way we can find a subtype of the function type, given the
-   * provided type parameter list.
-   */
+  /// Given a downward inference type [fnType], and the declared
+  /// [typeParameterList] for a function expression, determines if we can enable
+  /// downward inference and if so, returns the function type to use for
+  /// inference.
+  ///
+  /// This will return null if inference is not possible. This happens when
+  /// there is no way we can find a subtype of the function type, given the
+  /// provided type parameter list.
   FunctionType matchFunctionTypeParameters(
       TypeParameterList typeParameterList, FunctionType fnType) {
     if (typeParameterList == null) {
@@ -5237,33 +4940,30 @@
         .toList());
   }
 
-  /**
-   * If it is appropriate to do so, override the current type of the static element
-   * associated with the given expression with the given type. Generally speaking, it is appropriate
-   * if the given type is more specific than the current type.
-   *
-   * @param expression the expression used to access the static element whose types
-   *          might be overridden
-   * @param potentialType the potential type of the elements
-   * @param allowPrecisionLoss see @{code overrideVariable} docs
-   */
+  /// If it is appropriate to do so, override the current type of the static
+  /// element associated with the given expression with the given type.
+  /// Generally speaking, it is appropriate if the given type is more specific
+  /// than the current type.
+  ///
+  /// @param expression the expression used to access the static element whose
+  ///        types might be overridden
+  /// @param potentialType the potential type of the elements
+  /// @param allowPrecisionLoss see @{code overrideVariable} docs
   void overrideExpression(Expression expression, DartType potentialType,
       bool allowPrecisionLoss, bool setExpressionType) {
     // TODO(brianwilkerson) Remove this method.
   }
 
-  /**
-   * If it is appropriate to do so, override the current type of the given element with the given
-   * type.
-   *
-   * @param element the element whose type might be overridden
-   * @param potentialType the potential type of the element
-   * @param allowPrecisionLoss true if `potentialType` is allowed to be less precise than the
-   *          current best type
-   *
-   * Return a new better [DartType], or `null` if [potentialType] is not better
-   * than the current [element] type.
-   */
+  /// If it is appropriate to do so, override the current type of the given
+  /// element with the given type.
+  ///
+  /// @param element the element whose type might be overridden
+  /// @param potentialType the potential type of the element
+  /// @param allowPrecisionLoss true if `potentialType` is allowed to be less
+  ///        precise than the current best type
+  ///
+  /// Return a new better [DartType], or `null` if [potentialType] is not better
+  /// than the current [element] type.
   DartType overrideVariable(VariableElement element, DartType potentialType,
       bool allowPrecisionLoss) {
     // TODO(scheglov) type propagation for instance/top-level fields
@@ -5314,18 +5014,14 @@
     return null;
   }
 
-  /**
-   * A client is about to resolve a member in the given class declaration.
-   */
+  /// A client is about to resolve a member in the given class declaration.
   void prepareToResolveMembersInClass(ClassDeclaration node) {
     _enclosingClassDeclaration = node;
     enclosingClass = node.declaredElement;
     typeAnalyzer.thisType = enclosingClass?.type;
   }
 
-  /**
-   * Visit the given [comment] if it is not `null`.
-   */
+  /// Visit the given [comment] if it is not `null`.
   void safelyVisitComment(Comment comment) {
     if (comment != null) {
       super.visitComment(comment);
@@ -5565,10 +5261,8 @@
     return null;
   }
 
-  /**
-   * Implementation of this method should be synchronized with
-   * [visitClassDeclaration].
-   */
+  /// Implementation of this method should be synchronized with
+  /// [visitClassDeclaration].
   visitClassDeclarationIncrementally(ClassDeclaration node) {
     //
     // Resolve the metadata in the library scope.
@@ -6513,13 +6207,12 @@
     return null;
   }
 
-  /**
-   * Checks each promoted variable in the current scope for compliance with the following
-   * specification statement:
-   *
-   * If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i> then the variable
-   * <i>v</i> is not potentially mutated anywhere in the scope of <i>v</i>.
-   */
+  /// Checks each promoted variable in the current scope for compliance with the
+  /// following specification statement:
+  ///
+  /// If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i>
+  /// then the variable <i>v</i> is not potentially mutated anywhere in the
+  /// scope of <i>v</i>.
   void _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(
       AstNode target) {
     for (Element element in _promoteManager.promotedElements) {
@@ -6531,12 +6224,11 @@
     }
   }
 
-  /**
-   * Checks each promoted variable in the current scope for compliance with the following
-   * specification statement:
-   *
-   * <i>v</i> is not potentially mutated in <i>s<sub>1</sub></i> or within a closure.
-   */
+  /// Checks each promoted variable in the current scope for compliance with the
+  /// following specification statement:
+  ///
+  /// <i>v</i> is not potentially mutated in <i>s<sub>1</sub></i> or within a
+  /// closure.
   void _clearTypePromotionsIfPotentiallyMutatedIn(AstNode target) {
     for (Element element in _promoteManager.promotedElements) {
       if (_isVariablePotentiallyMutatedIn(element, target)) {
@@ -6545,11 +6237,9 @@
     }
   }
 
-  /**
-   * Given the declared return type of a function, compute the type of the
-   * values which should be returned or yielded as appropriate.  If a type
-   * cannot be computed from the declared return type, return null.
-   */
+  /// Given the declared return type of a function, compute the type of the
+  /// values which should be returned or yielded as appropriate.  If a type
+  /// cannot be computed from the declared return type, return null.
   DartType _computeReturnOrYieldType(DartType declaredType) {
     bool isGenerator = _enclosingFunction.isGenerator;
     bool isAsynchronous = _enclosingFunction.isAsynchronous;
@@ -6578,18 +6268,14 @@
     return declaredType;
   }
 
-  /**
-   * Return a newly created cloner that can be used to clone constant
-   * expressions.
-   */
+  /// Return a newly created cloner that can be used to clone constant
+  /// expressions.
   ConstantAstCloner _createCloner() {
     return new ConstantAstCloner();
   }
 
-  /**
-   * Creates a union of `T | Future<T>`, unless `T` is already a
-   * future-union, in which case it simply returns `T`.
-   */
+  /// Creates a union of `T | Future<T>`, unless `T` is already a
+  /// future-union, in which case it simply returns `T`.
   DartType _createFutureOr(DartType type) {
     if (type.isDartAsyncFutureOr) {
       return type;
@@ -6597,13 +6283,11 @@
     return typeProvider.futureOrType.instantiate([type]);
   }
 
-  /**
-   * The given expression is the expression used to compute the iterator for a
-   * for-each statement. Attempt to compute the type of objects that will be
-   * assigned to the loop variable and return that type. Return `null` if the
-   * type could not be determined. The [iteratorExpression] is the expression
-   * that will return the Iterable being iterated over.
-   */
+  /// The given expression is the expression used to compute the iterator for a
+  /// for-each statement. Attempt to compute the type of objects that will be
+  /// assigned to the loop variable and return that type. Return `null` if the
+  /// type could not be determined. The [iteratorExpression] is the expression
+  /// that will return the Iterable being iterated over.
   DartType _getIteratorElementType(Expression iteratorExpression) {
     DartType expressionType = iteratorExpression.staticType;
     if (expressionType is InterfaceType) {
@@ -6627,13 +6311,11 @@
     return null;
   }
 
-  /**
-   * The given expression is the expression used to compute the stream for an
-   * asynchronous for-each statement. Attempt to compute the type of objects
-   * that will be assigned to the loop variable and return that type.
-   * Return `null` if the type could not be determined. The [streamExpression]
-   * is the expression that will return the stream being iterated over.
-   */
+  /// The given expression is the expression used to compute the stream for an
+  /// asynchronous for-each statement. Attempt to compute the type of objects
+  /// that will be assigned to the loop variable and return that type.
+  /// Return `null` if the type could not be determined. The [streamExpression]
+  /// is the expression that will return the stream being iterated over.
   DartType _getStreamElementType(Expression streamExpression) {
     DartType streamType = streamExpression.staticType;
     if (streamType is InterfaceType) {
@@ -6657,11 +6339,9 @@
     return null;
   }
 
-  /**
-   * Return `true` if the given [parameter] element of the AST being resolved
-   * is resynthesized and is an API-level, not local, so has its initializer
-   * serialized.
-   */
+  /// Return `true` if the given [parameter] element of the AST being resolved
+  /// is resynthesized and is an API-level, not local, so has its initializer
+  /// serialized.
   bool _hasSerializedConstantInitializer(ParameterElement parameter) {
     Element executable = parameter.enclosingElement;
     if (executable is MethodElement ||
@@ -6785,13 +6465,11 @@
     }
   }
 
-  /**
-   * Return `true` if the given expression terminates abruptly (that is, if any expression
-   * following the given expression will not be reached).
-   *
-   * @param expression the expression being tested
-   * @return `true` if the given expression terminates abruptly
-   */
+  /// Return `true` if the given expression terminates abruptly (that is, if any
+  /// expression following the given expression will not be reached).
+  ///
+  /// @param expression the expression being tested
+  /// @return `true` if the given expression terminates abruptly
   bool _isAbruptTerminationExpression(Expression expression) {
     // TODO(brianwilkerson) This needs to be significantly improved. Ideally we
     // would eventually turn this into a method on Expression that returns a
@@ -6801,13 +6479,11 @@
     return expression is ThrowExpression || expression is RethrowExpression;
   }
 
-  /**
-   * Return `true` if the given statement terminates abruptly (that is, if any statement
-   * following the given statement will not be reached).
-   *
-   * @param statement the statement being tested
-   * @return `true` if the given statement terminates abruptly
-   */
+  /// Return `true` if the given statement terminates abruptly (that is, if any
+  /// statement following the given statement will not be reached).
+  ///
+  /// @param statement the statement being tested
+  /// @return `true` if the given statement terminates abruptly
   bool _isAbruptTerminationStatement(Statement statement) {
     // TODO(brianwilkerson) This needs to be significantly improved. Ideally we
     // would eventually turn this into a method on Statement that returns a
@@ -6854,15 +6530,14 @@
     return false;
   }
 
-  /**
-   * Return `true` if the given variable is accessed within a closure in the given
-   * [AstNode] and also mutated somewhere in variable scope. This information is only
-   * available for local variables (including parameters).
-   *
-   * @param variable the variable to check
-   * @param target the [AstNode] to check within
-   * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
-   */
+  /// Return `true` if the given variable is accessed within a closure in the
+  /// given [AstNode] and also mutated somewhere in variable scope. This
+  /// information is only available for local variables (including parameters).
+  ///
+  /// @param variable the variable to check
+  /// @param target the [AstNode] to check within
+  /// @return `true` if this variable is potentially mutated somewhere in the
+  ///         given ASTNode
   bool _isVariableAccessedInClosure(Element variable, AstNode target) {
     _ResolverVisitor_isVariableAccessedInClosure visitor =
         new _ResolverVisitor_isVariableAccessedInClosure(variable);
@@ -6870,14 +6545,14 @@
     return visitor.result;
   }
 
-  /**
-   * Return `true` if the given variable is potentially mutated somewhere in the given
-   * [AstNode]. This information is only available for local variables (including parameters).
-   *
-   * @param variable the variable to check
-   * @param target the [AstNode] to check within
-   * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
-   */
+  /// Return `true` if the given variable is potentially mutated somewhere in
+  /// the given [AstNode]. This information is only available for local
+  /// variables (including parameters).
+  ///
+  /// @param variable the variable to check
+  /// @param target the [AstNode] to check within
+  /// @return `true` if this variable is potentially mutated somewhere in the
+  ///         given ASTNode
   bool _isVariablePotentiallyMutatedIn(Element variable, AstNode target) {
     _ResolverVisitor_isVariablePotentiallyMutatedIn visitor =
         new _ResolverVisitor_isVariablePotentiallyMutatedIn(variable);
@@ -6885,15 +6560,14 @@
     return visitor.result;
   }
 
-  /**
-   * If it is appropriate to do so, promotes the current type of the static element associated with
-   * the given expression with the given type. Generally speaking, it is appropriate if the given
-   * type is more specific than the current type.
-   *
-   * @param expression the expression used to access the static element whose types might be
-   *          promoted
-   * @param potentialType the potential type of the elements
-   */
+  /// If it is appropriate to do so, promotes the current type of the static
+  /// element associated with the given expression with the given type.
+  /// Generally speaking, it is appropriate if the given type is more specific
+  /// than the current type.
+  ///
+  /// @param expression the expression used to access the static element whose
+  ///        types might be promoted
+  /// @param potentialType the potential type of the elements
   void _promote(Expression expression, DartType potentialType) {
     VariableElement element = getPromotionStaticElement(expression);
     if (element != null) {
@@ -6917,9 +6591,7 @@
     }
   }
 
-  /**
-   * Promotes type information using given condition.
-   */
+  /// Promotes type information using given condition.
   void _promoteTypes(Expression condition) {
     if (condition is BinaryExpression) {
       if (condition.operator.type == TokenType.AMPERSAND_AMPERSAND) {
@@ -6938,12 +6610,10 @@
     }
   }
 
-  /**
-   * Propagate any type information that results from knowing that the given condition will have
-   * been evaluated to 'false'.
-   *
-   * @param condition the condition that will have evaluated to 'false'
-   */
+  /// Propagate any type information that results from knowing that the given
+  /// condition will have been evaluated to 'false'.
+  ///
+  /// @param condition the condition that will have evaluated to 'false'
   void _propagateFalseState(Expression condition) {
     if (condition is BinaryExpression) {
       if (condition.operator.type == TokenType.BAR_BAR) {
@@ -6959,22 +6629,19 @@
     }
   }
 
-  /**
-   * Propagate any type information that results from knowing that the given expression will have
-   * been evaluated without altering the flow of execution.
-   *
-   * @param expression the expression that will have been evaluated
-   */
+  /// Propagate any type information that results from knowing that the given
+  /// expression will have been evaluated without altering the flow of
+  /// execution.
+  ///
+  /// @param expression the expression that will have been evaluated
   void _propagateState(Expression expression) {
     // TODO(brianwilkerson) Implement this.
   }
 
-  /**
-   * Propagate any type information that results from knowing that the given condition will have
-   * been evaluated to 'true'.
-   *
-   * @param condition the condition that will have evaluated to 'true'
-   */
+  /// Propagate any type information that results from knowing that the given
+  /// condition will have been evaluated to 'true'.
+  ///
+  /// @param condition the condition that will have evaluated to 'true'
   void _propagateTrueState(Expression condition) {
     if (condition is BinaryExpression) {
       if (condition.operator.type == TokenType.AMPERSAND_AMPERSAND) {
@@ -6990,20 +6657,18 @@
     }
   }
 
-  /**
-   * Given an [argumentList] and the [parameters] related to the element that
-   * will be invoked using those arguments, compute the list of parameters that
-   * correspond to the list of arguments.
-   *
-   * An error will be reported to [onError] if any of the arguments cannot be
-   * matched to a parameter. onError can be null to ignore the error.
-   *
-   * The flag [reportAsError] should be `true` if a compile-time error should be
-   * reported; or `false` if a compile-time warning should be reported.
-   *
-   * Returns the parameters that correspond to the arguments. If no parameter
-   * matched an argument, that position will be `null` in the list.
-   */
+  /// Given an [argumentList] and the [parameters] related to the element that
+  /// will be invoked using those arguments, compute the list of parameters that
+  /// correspond to the list of arguments.
+  ///
+  /// An error will be reported to [onError] if any of the arguments cannot be
+  /// matched to a parameter. onError can be null to ignore the error.
+  ///
+  /// The flag [reportAsError] should be `true` if a compile-time error should
+  /// be reported; or `false` if a compile-time warning should be reported.
+  ///
+  /// Returns the parameters that correspond to the arguments. If no parameter
+  /// matched an argument, that position will be `null` in the list.
   static List<ParameterElement> resolveArgumentsToParameters(
       ArgumentList argumentList,
       List<ParameterElement> parameters,
@@ -7105,69 +6770,49 @@
   }
 }
 
-/**
- * The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is
- * being visited.
- */
+/// The abstract class `ScopedVisitor` maintains name and label scopes as an AST
+/// structure is being visited.
 abstract class ScopedVisitor extends UnifyingAstVisitor<Object> {
-  /**
-   * The element for the library containing the compilation unit being visited.
-   */
+  /// The element for the library containing the compilation unit being visited.
   final LibraryElement definingLibrary;
 
-  /**
-   * The source representing the compilation unit being visited.
-   */
+  /// The source representing the compilation unit being visited.
   final Source source;
 
-  /**
-   * The object used to access the types from the core library.
-   */
+  /// The object used to access the types from the core library.
   final TypeProvider typeProvider;
 
-  /**
-   * The error reporter that will be informed of any errors that are found
-   * during resolution.
-   */
+  /// The error reporter that will be informed of any errors that are found
+  /// during resolution.
   final ErrorReporter errorReporter;
 
-  /**
-   * The scope used to resolve identifiers.
-   */
+  /// The scope used to resolve identifiers.
   Scope nameScope;
 
-  /**
-   * The scope used to resolve unlabeled `break` and `continue` statements.
-   */
+  /// The scope used to resolve unlabeled `break` and `continue` statements.
   ImplicitLabelScope _implicitLabelScope = ImplicitLabelScope.ROOT;
 
-  /**
-   * The scope used to resolve labels for `break` and `continue` statements, or
-   * `null` if no labels have been defined in the current context.
-   */
+  /// The scope used to resolve labels for `break` and `continue` statements, or
+  /// `null` if no labels have been defined in the current context.
   LabelScope labelScope;
 
-  /**
-   * The class containing the AST nodes being visited,
-   * or `null` if we are not in the scope of a class.
-   */
+  /// The class containing the AST nodes being visited,
+  /// or `null` if we are not in the scope of a class.
   ClassElement enclosingClass;
 
-  /**
-   * Initialize a newly created visitor to resolve the nodes in a compilation
-   * unit.
-   *
-   * [definingLibrary] is the element for the library containing the
-   * compilation unit being visited.
-   * [source] is the source representing the compilation unit being visited.
-   * [typeProvider] is the object used to access the types from the core
-   * library.
-   * [errorListener] is the error listener that will be informed of any errors
-   * that are found during resolution.
-   * [nameScope] is the scope used to resolve identifiers in the node that will
-   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
-   * created based on [definingLibrary] and [typeProvider].
-   */
+  /// Initialize a newly created visitor to resolve the nodes in a compilation
+  /// unit.
+  ///
+  /// [definingLibrary] is the element for the library containing the
+  /// compilation unit being visited.
+  /// [source] is the source representing the compilation unit being visited.
+  /// [typeProvider] is the object used to access the types from the core
+  /// library.
+  /// [errorListener] is the error listener that will be informed of any errors
+  /// that are found during resolution.
+  /// [nameScope] is the scope used to resolve identifiers in the node that will
+  /// first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+  /// created based on [definingLibrary] and [typeProvider].
   ScopedVisitor(this.definingLibrary, Source source, this.typeProvider,
       AnalysisErrorListener errorListener,
       {Scope nameScope})
@@ -7180,27 +6825,21 @@
     }
   }
 
-  /**
-   * Return the implicit label scope in which the current node is being
-   * resolved.
-   */
+  /// Return the implicit label scope in which the current node is being
+  /// resolved.
   ImplicitLabelScope get implicitLabelScope => _implicitLabelScope;
 
-  /**
-   * Replaces the current [Scope] with the enclosing [Scope].
-   *
-   * @return the enclosing [Scope].
-   */
+  /// Replaces the current [Scope] with the enclosing [Scope].
+  ///
+  /// @return the enclosing [Scope].
   Scope popNameScope() {
     nameScope = nameScope.enclosingScope;
     return nameScope;
   }
 
-  /**
-   * Pushes a new [Scope] into the visitor.
-   *
-   * @return the new [Scope].
-   */
+  /// Pushes a new [Scope] into the visitor.
+  ///
+  /// @return the new [Scope].
   Scope pushNameScope() {
     Scope newScope = new EnclosedScope(nameScope);
     nameScope = newScope;
@@ -7429,13 +7068,11 @@
     return null;
   }
 
-  /**
-   * Visit the given statement after it's scope has been created. This replaces the normal call to
-   * the inherited visit method so that ResolverVisitor can intervene when type propagation is
-   * enabled.
-   *
-   * @param node the statement to be visited
-   */
+  /// Visit the given statement after it's scope has been created. This replaces
+  /// the normal call to the inherited visit method so that ResolverVisitor can
+  /// intervene when type propagation is enabled.
+  ///
+  /// @param node the statement to be visited
   void visitForEachStatementInScope(ForEachStatement node) {
     //
     // We visit the iterator before the loop variable because the loop variable
@@ -7479,13 +7116,11 @@
     return null;
   }
 
-  /**
-   * Visit the given statement after it's scope has been created. This replaces the normal call to
-   * the inherited visit method so that ResolverVisitor can intervene when type propagation is
-   * enabled.
-   *
-   * @param node the statement to be visited
-   */
+  /// Visit the given statement after it's scope has been created. This replaces
+  /// the normal call to the inherited visit method so that ResolverVisitor can
+  /// intervene when type propagation is enabled.
+  ///
+  /// @param node the statement to be visited
   void visitForStatementInScope(ForStatement node) {
     node.variables?.accept(this);
     node.initialization?.accept(this);
@@ -7732,12 +7367,11 @@
     node.members.accept(this);
   }
 
-  /**
-   * Visit the given statement after it's scope has been created. This is used by ResolverVisitor to
-   * correctly visit the 'then' and 'else' statements of an 'if' statement.
-   *
-   * @param node the statement to be visited
-   */
+  /// Visit the given statement after it's scope has been created. This is used
+  /// by ResolverVisitor to correctly visit the 'then' and 'else' statements of
+  /// an 'if' statement.
+  ///
+  /// @param node the statement to be visited
   void visitStatementInScope(Statement node) {
     if (node is Block) {
       // Don't create a scope around a block because the block will create it's
@@ -7831,12 +7465,10 @@
     return null;
   }
 
-  /**
-   * Add scopes for each of the given labels.
-   *
-   * @param labels the labels for which new scopes are to be added
-   * @return the scope that was in effect before the new scopes were added
-   */
+  /// Add scopes for each of the given labels.
+  ///
+  /// @param labels the labels for which new scopes are to be added
+  /// @return the scope that was in effect before the new scopes were added
   LabelScope _addScopesFor(NodeList<Label> labels, AstNode node) {
     LabelScope outerScope = labelScope;
     for (Label label in labels) {
@@ -7849,38 +7481,30 @@
   }
 }
 
-/**
- * Instances of the class `ToDoFinder` find to-do comments in Dart code.
- */
+/// Instances of the class `ToDoFinder` find to-do comments in Dart code.
 class ToDoFinder {
-  /**
-   * The error reporter by which to-do comments will be reported.
-   */
+  /// The error reporter by which to-do comments will be reported.
   final ErrorReporter _errorReporter;
 
-  /**
-   * Initialize a newly created to-do finder to report to-do comments to the given reporter.
-   *
-   * @param errorReporter the error reporter by which to-do comments will be reported
-   */
+  /// Initialize a newly created to-do finder to report to-do comments to the
+  /// given reporter.
+  ///
+  /// @param errorReporter the error reporter by which to-do comments will be
+  ///        reported
   ToDoFinder(this._errorReporter);
 
-  /**
-   * Search the comments in the given compilation unit for to-do comments and report an error for
-   * each.
-   *
-   * @param unit the compilation unit containing the to-do comments
-   */
+  /// Search the comments in the given compilation unit for to-do comments and
+  /// report an error for each.
+  ///
+  /// @param unit the compilation unit containing the to-do comments
   void findIn(CompilationUnit unit) {
     _gatherTodoComments(unit.beginToken);
   }
 
-  /**
-   * Search the comment tokens reachable from the given token and create errors for each to-do
-   * comment.
-   *
-   * @param token the head of the list of tokens being searched
-   */
+  /// Search the comment tokens reachable from the given token and create errors
+  /// for each to-do comment.
+  ///
+  /// @param token the head of the list of tokens being searched
   void _gatherTodoComments(Token token) {
     while (token != null && token.type != TokenType.EOF) {
       Token commentToken = token.precedingComments;
@@ -7895,11 +7519,10 @@
     }
   }
 
-  /**
-   * Look for user defined tasks in comments and convert them into info level analysis issues.
-   *
-   * @param commentToken the comment token to analyze
-   */
+  /// Look for user defined tasks in comments and convert them into info level
+  /// analysis issues.
+  ///
+  /// @param commentToken the comment token to analyze
   void _scrapeTodoComment(Token commentToken) {
     Iterable<Match> matches =
         TodoCode.TODO_REGEX.allMatches(commentToken.lexeme);
@@ -7912,11 +7535,9 @@
   }
 }
 
-/**
- * Helper for resolving types.
- *
- * The client must set [nameScope] before calling [resolveTypeName].
- */
+/// Helper for resolving types.
+///
+/// The client must set [nameScope] before calling [resolveTypeName].
 class TypeNameResolver {
   final TypeSystem typeSystem;
   final DartType dynamicType;
@@ -7925,32 +7546,37 @@
   final Source source;
   final AnalysisErrorListener errorListener;
 
+  /// Indicates whether bare typenames in "with" clauses should have their type
+  /// inferred type arguments loaded from the element model.
+  ///
+  /// This is needed for mixin type inference, but is incompatible with the old
+  /// task model.
+  final bool shouldUseWithClauseInferredTypes;
+
   Scope nameScope;
 
   TypeNameResolver(this.typeSystem, TypeProvider typeProvider,
-      this.definingLibrary, this.source, this.errorListener)
+      this.definingLibrary, this.source, this.errorListener,
+      {this.shouldUseWithClauseInferredTypes: true})
       : dynamicType = typeProvider.dynamicType,
         undefinedType = typeProvider.undefinedType;
 
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param node the node specifying the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
+  /// Report an error with the given error code and arguments.
+  ///
+  /// @param errorCode the error code of the error to be reported
+  /// @param node the node specifying the location of the error
+  /// @param arguments the arguments to the error, used to compose the error
+  ///        message
   void reportErrorForNode(ErrorCode errorCode, AstNode node,
       [List<Object> arguments]) {
     errorListener.onError(new AnalysisError(
         source, node.offset, node.length, errorCode, arguments));
   }
 
-  /**
-   * Resolve the given [TypeName] - set its element and static type. Only the
-   * given [node] is resolved, all its children must be already resolved.
-   *
-   * The client must set [nameScope] before calling [resolveTypeName].
-   */
+  /// Resolve the given [TypeName] - set its element and static type. Only the
+  /// given [node] is resolved, all its children must be already resolved.
+  ///
+  /// The client must set [nameScope] before calling [resolveTypeName].
   void resolveTypeName(TypeName node) {
     Identifier typeName = node.name;
     _setElement(typeName, null); // Clear old Elements from previous run.
@@ -8213,15 +7839,41 @@
         }
       }
     }
-    typeName.staticType = type;
-    node.type = type;
+    DartType refinedType;
+    if (shouldUseWithClauseInferredTypes) {
+      var parent = node.parent;
+      if (parent is WithClause &&
+          type is InterfaceType &&
+          type.element.typeParameters.isNotEmpty) {
+        // Get the (possibly inferred) mixin type from the element model.
+        var grandParent = parent.parent;
+        if (grandParent is ClassDeclaration) {
+          refinedType =
+              _getInferredMixinType(grandParent.declaredElement, type.element);
+        } else if (grandParent is ClassTypeAlias) {
+          refinedType =
+              _getInferredMixinType(grandParent.declaredElement, type.element);
+        } else {
+          assert(false, 'Unexpected context for "with" clause');
+        }
+      }
+    }
+    refinedType ??= type;
+    typeName.staticType = refinedType;
+    node.type = refinedType;
   }
 
-  /**
-   * The number of type arguments in the given [typeName] does not match the
-   * number of parameters in the corresponding class element. Return the error
-   * code that should be used to report this error.
-   */
+  DartType _getInferredMixinType(
+      ClassElement classElement, ClassElement mixinElement) {
+    for (var candidateMixin in classElement.mixins) {
+      if (candidateMixin.element == mixinElement) return candidateMixin;
+    }
+    return null; // Not found
+  }
+
+  /// The number of type arguments in the given [typeName] does not match the
+  /// number of parameters in the corresponding class element. Return the error
+  /// code that should be used to report this error.
   ErrorCode _getInvalidTypeParametersErrorCode(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is ConstructorName) {
@@ -8237,9 +7889,7 @@
     return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
   }
 
-  /**
-   * Checks if the given [typeName] is the target in a redirected constructor.
-   */
+  /// Checks if the given [typeName] is the target in a redirected constructor.
   RedirectingConstructorKind _getRedirectingConstructorKind(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is ConstructorName) {
@@ -8256,9 +7906,7 @@
     return null;
   }
 
-  /**
-   * Return the type represented by the given type [annotation].
-   */
+  /// Return the type represented by the given type [annotation].
   DartType _getType(TypeAnnotation annotation) {
     DartType type = annotation.type;
     if (type == null) {
@@ -8267,12 +7915,10 @@
     return type;
   }
 
-  /**
-   * Returns the simple identifier of the given (may be qualified) type name.
-   *
-   * @param typeName the (may be qualified) qualified type name
-   * @return the simple identifier of the given (may be qualified) type name.
-   */
+  /// Returns the simple identifier of the given (may be qualified) type name.
+  ///
+  /// @param typeName the (may be qualified) qualified type name
+  /// @return the simple identifier of the given (may be qualified) type name.
   SimpleIdentifier _getTypeSimpleIdentifier(Identifier typeName) {
     if (typeName is SimpleIdentifier) {
       return typeName;
@@ -8291,13 +7937,13 @@
     }
   }
 
-  /**
-   * Given the multiple elements to which a single name could potentially be resolved, return the
-   * single interface type that should be used, or `null` if there is no clear choice.
-   *
-   * @param elements the elements to which a single name could potentially be resolved
-   * @return the single interface type that should be used for the type name
-   */
+  /// Given the multiple elements to which a single name could potentially be
+  /// resolved, return the single interface type that should be used, or `null`
+  /// if there is no clear choice.
+  ///
+  /// @param elements the elements to which a single name could potentially be
+  ///        resolved
+  /// @return the single interface type that should be used for the type name
   InterfaceType _getTypeWhenMultiplyDefined(List<Element> elements) {
     InterfaceType type = null;
     int length = elements.length;
@@ -8313,11 +7959,9 @@
     return type;
   }
 
-  /**
-   * If the [node] is the type name in a redirected factory constructor,
-   * infer type arguments using the enclosing class declaration. Return `null`
-   * otherwise.
-   */
+  /// If the [node] is the type name in a redirected factory constructor,
+  /// infer type arguments using the enclosing class declaration. Return `null`
+  /// otherwise.
   DartType _inferTypeArgumentsForRedirectedConstructor(
       TypeName node, DartType type) {
     AstNode constructorName = node.parent;
@@ -8341,9 +7985,7 @@
     return null;
   }
 
-  /**
-   * Checks if the given [typeName] is used as the type in an as expression.
-   */
+  /// Checks if the given [typeName] is used as the type in an as expression.
   bool _isTypeNameInAsExpression(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is AsExpression) {
@@ -8352,10 +7994,8 @@
     return false;
   }
 
-  /**
-   * Checks if the given [typeName] is used as the exception type in a catch
-   * clause.
-   */
+  /// Checks if the given [typeName] is used as the exception type in a catch
+  /// clause.
   bool _isTypeNameInCatchClause(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is CatchClause) {
@@ -8364,10 +8004,8 @@
     return false;
   }
 
-  /**
-   * Checks if the given [typeName] is used as the type in an instance creation
-   * expression.
-   */
+  /// Checks if the given [typeName] is used as the type in an instance creation
+  /// expression.
   bool _isTypeNameInInstanceCreationExpression(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is ConstructorName &&
@@ -8377,9 +8015,7 @@
     return false;
   }
 
-  /**
-   * Checks if the given [typeName] is used as the type in an is expression.
-   */
+  /// Checks if the given [typeName] is used as the type in an is expression.
   bool _isTypeNameInIsExpression(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is IsExpression) {
@@ -8388,19 +8024,15 @@
     return false;
   }
 
-  /**
-   * Checks if the given [typeName] used in a type argument list.
-   */
+  /// Checks if the given [typeName] used in a type argument list.
   bool _isTypeNameInTypeArgumentList(TypeName typeName) =>
       typeName.parent is TypeArgumentList;
 
-  /**
-   * Records the new Element for a TypeName's Identifier.
-   *
-   * A null may be passed in to indicate that the element can't be resolved.
-   * (During a re-run of a task, it's important to clear any previous value
-   * of the element.)
-   */
+  /// Records the new Element for a TypeName's Identifier.
+  ///
+  /// A null may be passed in to indicate that the element can't be resolved.
+  /// (During a re-run of a task, it's important to clear any previous value
+  /// of the element.)
   void _setElement(Identifier typeName, Element element) {
     if (typeName is SimpleIdentifier) {
       typeName.staticElement = element;
@@ -8411,17 +8043,14 @@
     }
   }
 
-  /**
-   * Return `true` if the name of the given [typeName] is an built-in identifier.
-   */
+  /// Return `true` if the name of the given [typeName] is an built-in
+  /// identifier.
   static bool _isBuiltInIdentifier(TypeName typeName) {
     Token token = typeName.name.beginToken;
     return token.type.isKeyword;
   }
 
-  /**
-   * @return `true` if given [typeName] is used as a type annotation.
-   */
+  /// @return `true` if given [typeName] is used as a type annotation.
   static bool _isTypeAnnotation(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is VariableDeclarationList) {
@@ -8435,21 +8064,15 @@
   }
 }
 
-/**
- * Instances of the class `TypeOverrideManager` manage the ability to override the type of an
- * element within a given context.
- */
+/// Instances of the class `TypeOverrideManager` manage the ability to override
+/// the type of an element within a given context.
 class TypeOverrideManager {
-  /**
-   * The current override scope, or `null` if no scope has been entered.
-   */
+  /// The current override scope, or `null` if no scope has been entered.
   TypeOverrideManager_TypeOverrideScope currentScope;
 
-  /**
-   * Apply a set of overrides that were previously captured.
-   *
-   * @param overrides the overrides to be applied
-   */
+  /// Apply a set of overrides that were previously captured.
+  ///
+  /// @param overrides the overrides to be applied
   void applyOverrides(Map<VariableElement, DartType> overrides) {
     if (currentScope == null) {
       throw new StateError("Cannot apply overrides without a scope");
@@ -8457,12 +8080,10 @@
     currentScope.applyOverrides(overrides);
   }
 
-  /**
-   * Return a table mapping the elements whose type is overridden in the current scope to the
-   * overriding type.
-   *
-   * @return the overrides in the current scope
-   */
+  /// Return a table mapping the elements whose type is overridden in the
+  /// current scope to the overriding type.
+  ///
+  /// @return the overrides in the current scope
   Map<VariableElement, DartType> captureLocalOverrides() {
     if (currentScope == null) {
       throw new StateError("Cannot capture local overrides without a scope");
@@ -8470,13 +8091,12 @@
     return currentScope.captureLocalOverrides();
   }
 
-  /**
-   * Return a map from the elements for the variables in the given list that have their types
-   * overridden to the overriding type.
-   *
-   * @param variableList the list of variables whose overriding types are to be captured
-   * @return a table mapping elements to their overriding types
-   */
+  /// Return a map from the elements for the variables in the given list that
+  /// have their types overridden to the overriding type.
+  ///
+  /// @param variableList the list of variables whose overriding types are to be
+  ///        captured
+  /// @return a table mapping elements to their overriding types
   Map<VariableElement, DartType> captureOverrides(
       VariableDeclarationList variableList) {
     if (currentScope == null) {
@@ -8485,16 +8105,12 @@
     return currentScope.captureOverrides(variableList);
   }
 
-  /**
-   * Enter a new override scope.
-   */
+  /// Enter a new override scope.
   void enterScope() {
     currentScope = new TypeOverrideManager_TypeOverrideScope(currentScope);
   }
 
-  /**
-   * Exit the current override scope.
-   */
+  /// Exit the current override scope.
   void exitScope() {
     if (currentScope == null) {
       throw new StateError("No scope to exit");
@@ -8502,25 +8118,22 @@
     currentScope = currentScope._outerScope;
   }
 
-  /**
-   * Return the best type information available for the given element. If the type of the element
-   * has been overridden, then return the overriding type. Otherwise, return the static type.
-   *
-   * @param element the element for which type information is to be returned
-   * @return the best type information available for the given element
-   */
+  /// Return the best type information available for the given element. If the
+  /// type of the element has been overridden, then return the overriding type.
+  /// Otherwise, return the static type.
+  ///
+  /// @param element the element for which type information is to be returned
+  /// @return the best type information available for the given element
   DartType getBestType(VariableElement element) {
     DartType bestType = getType(element);
     return bestType ?? element.type;
   }
 
-  /**
-   * Return the overridden type of the given element, or `null` if the type of the element has
-   * not been overridden.
-   *
-   * @param element the element whose type might have been overridden
-   * @return the overridden type of the given element
-   */
+  /// Return the overridden type of the given element, or `null` if the type of
+  /// the element has not been overridden.
+  ///
+  /// @param element the element whose type might have been overridden
+  /// @return the overridden type of the given element
   DartType getType(Element element) {
     if (currentScope == null) {
       return null;
@@ -8528,10 +8141,8 @@
     return currentScope.getType(element);
   }
 
-  /**
-   * Update overrides assuming [perBranchOverrides] is the collection of
-   * per-branch overrides for *all* branches flowing into a join point.
-   */
+  /// Update overrides assuming [perBranchOverrides] is the collection of
+  /// per-branch overrides for *all* branches flowing into a join point.
   void mergeOverrides(List<Map<VariableElement, DartType>> perBranchOverrides) {
     int length = perBranchOverrides.length;
     for (int i = 0; i < length; i++) {
@@ -8545,12 +8156,10 @@
     }
   }
 
-  /**
-   * Set the overridden type of the given element to the given type
-   *
-   * @param element the element whose type might have been overridden
-   * @param type the overridden type of the given element
-   */
+  /// Set the overridden type of the given element to the given type
+  ///
+  /// @param element the element whose type might have been overridden
+  /// @param type the overridden type of the given element
   void setType(VariableElement element, DartType type) {
     if (currentScope == null) {
       throw new StateError("Cannot override without a scope");
@@ -8559,53 +8168,40 @@
   }
 }
 
-/**
- * Instances of the class `TypeOverrideScope` represent a scope in which the types of
- * elements can be overridden.
- */
+/// Instances of the class `TypeOverrideScope` represent a scope in which the
+/// types of elements can be overridden.
 class TypeOverrideManager_TypeOverrideScope {
-  /**
-   * The outer scope in which types might be overridden.
-   */
+  /// The outer scope in which types might be overridden.
   final TypeOverrideManager_TypeOverrideScope _outerScope;
 
-  /**
-   * A table mapping elements to the overridden type of that element.
-   */
+  /// A table mapping elements to the overridden type of that element.
   Map<VariableElement, DartType> _overriddenTypes =
       new HashMap<VariableElement, DartType>();
 
-  /**
-   * Initialize a newly created scope to be an empty child of the given scope.
-   *
-   * @param outerScope the outer scope in which types might be overridden
-   */
+  /// Initialize a newly created scope to be an empty child of the given scope.
+  ///
+  /// @param outerScope the outer scope in which types might be overridden
   TypeOverrideManager_TypeOverrideScope(this._outerScope);
 
-  /**
-   * Apply a set of overrides that were previously captured.
-   *
-   * @param overrides the overrides to be applied
-   */
+  /// Apply a set of overrides that were previously captured.
+  ///
+  /// @param overrides the overrides to be applied
   void applyOverrides(Map<VariableElement, DartType> overrides) {
     _overriddenTypes.addAll(overrides);
   }
 
-  /**
-   * Return a table mapping the elements whose type is overridden in the current scope to the
-   * overriding type.
-   *
-   * @return the overrides in the current scope
-   */
+  /// Return a table mapping the elements whose type is overridden in the
+  /// current scope to the overriding type.
+  ///
+  /// @return the overrides in the current scope
   Map<VariableElement, DartType> captureLocalOverrides() => _overriddenTypes;
 
-  /**
-   * Return a map from the elements for the variables in the given list that have their types
-   * overridden to the overriding type.
-   *
-   * @param variableList the list of variables whose overriding types are to be captured
-   * @return a table mapping elements to their overriding types
-   */
+  /// Return a map from the elements for the variables in the given list that
+  /// have their types overridden to the overriding type.
+  ///
+  /// @param variableList the list of variables whose overriding types are to be
+  ///        captured
+  /// @return a table mapping elements to their overriding types
   Map<VariableElement, DartType> captureOverrides(
       VariableDeclarationList variableList) {
     Map<VariableElement, DartType> overrides =
@@ -8624,13 +8220,11 @@
     return overrides;
   }
 
-  /**
-   * Return the overridden type of the given element, or `null` if the type of the element
-   * has not been overridden.
-   *
-   * @param element the element whose type might have been overridden
-   * @return the overridden type of the given element
-   */
+  /// Return the overridden type of the given element, or `null` if the type of
+  /// the element has not been overridden.
+  ///
+  /// @param element the element whose type might have been overridden
+  /// @return the overridden type of the given element
   DartType getType(Element element) {
     Element nonAccessor =
         element is PropertyAccessorElement ? element.variable : element;
@@ -8641,28 +8235,22 @@
     return type ?? _outerScope?.getType(element);
   }
 
-  /**
-   * Clears the overridden type of the given [element].
-   */
+  /// Clears the overridden type of the given [element].
   void resetType(VariableElement element) {
     _overriddenTypes[element] = null;
   }
 
-  /**
-   * Set the overridden type of the given element to the given type
-   *
-   * @param element the element whose type might have been overridden
-   * @param type the overridden type of the given element
-   */
+  /// Set the overridden type of the given element to the given type
+  ///
+  /// @param element the element whose type might have been overridden
+  /// @param type the overridden type of the given element
   void setType(VariableElement element, DartType type) {
     _overriddenTypes[element] = type;
   }
 }
 
-/**
- * This class resolves bounds of type parameters of classes, class and function
- * type aliases.
- */
+/// This class resolves bounds of type parameters of classes, class and function
+/// type aliases.
 class TypeParameterBoundsResolver {
   final TypeSystem typeSystem;
   final LibraryElement library;
@@ -8678,10 +8266,8 @@
         typeNameResolver = new TypeNameResolver(typeSystem,
             typeSystem.typeProvider, library, source, errorListener);
 
-  /**
-   * Resolve bounds of type parameters of classes, class and function type
-   * aliases.
-   */
+  /// Resolve bounds of type parameters of classes, class and function type
+  /// aliases.
   void resolveTypeBounds(CompilationUnit unit) {
     for (CompilationUnitMember unitMember in unit.declarations) {
       if (unitMember is ClassDeclaration) {
@@ -8699,6 +8285,11 @@
             unitMember.typeParameters,
             () => new FunctionTypeScope(
                 libraryScope, unitMember.declaredElement));
+      } else if (unitMember is GenericTypeAlias) {
+        _resolveTypeParameters(
+            unitMember.typeParameters,
+            () => new FunctionTypeScope(
+                libraryScope, unitMember.declaredElement));
       }
     }
   }
@@ -8778,31 +8369,22 @@
   }
 }
 
-/**
- * Instances of the class `TypePromotionManager` manage the ability to promote types of local
- * variables and formal parameters from their declared types based on control flow.
- */
+/// Instances of the class `TypePromotionManager` manage the ability to promote
+/// types of local variables and formal parameters from their declared types
+/// based on control flow.
 class TypePromotionManager {
-  /**
-   * The current promotion scope, or `null` if no scope has been entered.
-   */
+  /// The current promotion scope, or `null` if no scope has been entered.
   TypePromotionManager_TypePromoteScope currentScope;
 
-  /**
-   * Returns the elements with promoted types.
-   */
+  /// Returns the elements with promoted types.
   Iterable<Element> get promotedElements => currentScope.promotedElements;
 
-  /**
-   * Enter a new promotions scope.
-   */
+  /// Enter a new promotions scope.
   void enterScope() {
     currentScope = new TypePromotionManager_TypePromoteScope(currentScope);
   }
 
-  /**
-   * Exit the current promotion scope.
-   */
+  /// Exit the current promotion scope.
   void exitScope() {
     if (currentScope == null) {
       throw new StateError("No scope to exit");
@@ -8810,24 +8392,18 @@
     currentScope = currentScope._outerScope;
   }
 
-  /**
-   * Return the static type of the given [variable] - declared or promoted.
-   */
+  /// Return the static type of the given [variable] - declared or promoted.
   DartType getStaticType(VariableElement variable) =>
       getType(variable) ?? variable.type;
 
-  /**
-   * Return the promoted type of the given [element], or `null` if the type of
-   * the element has not been promoted.
-   */
+  /// Return the promoted type of the given [element], or `null` if the type of
+  /// the element has not been promoted.
   DartType getType(Element element) => currentScope?.getType(element);
 
-  /**
-   * Set the promoted type of the given element to the given type.
-   *
-   * @param element the element whose type might have been promoted
-   * @param type the promoted type of the given element
-   */
+  /// Set the promoted type of the given element to the given type.
+  ///
+  /// @param element the element whose type might have been promoted
+  /// @param type the promoted type of the given element
   void setType(Element element, DartType type) {
     if (currentScope == null) {
       throw new StateError("Cannot promote without a scope");
@@ -8836,40 +8412,28 @@
   }
 }
 
-/**
- * Instances of the class `TypePromoteScope` represent a scope in which the types of
- * elements can be promoted.
- */
+/// Instances of the class `TypePromoteScope` represent a scope in which the
+/// types of elements can be promoted.
 class TypePromotionManager_TypePromoteScope {
-  /**
-   * The outer scope in which types might be promoter.
-   */
+  /// The outer scope in which types might be promoter.
   final TypePromotionManager_TypePromoteScope _outerScope;
 
-  /**
-   * A table mapping elements to the promoted type of that element.
-   */
+  /// A table mapping elements to the promoted type of that element.
   Map<Element, DartType> _promotedTypes = new HashMap<Element, DartType>();
 
-  /**
-   * Initialize a newly created scope to be an empty child of the given scope.
-   *
-   * @param outerScope the outer scope in which types might be promoted
-   */
+  /// Initialize a newly created scope to be an empty child of the given scope.
+  ///
+  /// @param outerScope the outer scope in which types might be promoted
   TypePromotionManager_TypePromoteScope(this._outerScope);
 
-  /**
-   * Returns the elements with promoted types.
-   */
+  /// Returns the elements with promoted types.
   Iterable<Element> get promotedElements => _promotedTypes.keys.toSet();
 
-  /**
-   * Return the promoted type of the given element, or `null` if the type of the element has
-   * not been promoted.
-   *
-   * @param element the element whose type might have been promoted
-   * @return the promoted type of the given element
-   */
+  /// Return the promoted type of the given element, or `null` if the type of
+  /// the element has not been promoted.
+  ///
+  /// @param element the element whose type might have been promoted
+  /// @return the promoted type of the given element
   DartType getType(Element element) {
     DartType type = _promotedTypes[element];
     if (type == null && element is PropertyAccessorElement) {
@@ -8883,186 +8447,118 @@
     return null;
   }
 
-  /**
-   * Set the promoted type of the given element to the given type.
-   *
-   * @param element the element whose type might have been promoted
-   * @param type the promoted type of the given element
-   */
+  /// Set the promoted type of the given element to the given type.
+  ///
+  /// @param element the element whose type might have been promoted
+  /// @param type the promoted type of the given element
   void setType(Element element, DartType type) {
     _promotedTypes[element] = type;
   }
 }
 
-/**
- * The interface `TypeProvider` defines the behavior of objects that provide access to types
- * defined by the language.
- */
+/// The interface `TypeProvider` defines the behavior of objects that provide
+/// access to types defined by the language.
 abstract class TypeProvider {
-  /**
-   * Return the type representing the built-in type 'bool'.
-   */
+  /// Return the type representing the built-in type 'bool'.
   InterfaceType get boolType;
 
-  /**
-   * Return the type representing the type 'bottom'.
-   */
+  /// Return the type representing the type 'bottom'.
   DartType get bottomType;
 
-  /**
-   * Return the type representing the built-in type 'Deprecated'.
-   */
+  /// Return the type representing the built-in type 'Deprecated'.
   InterfaceType get deprecatedType;
 
-  /**
-   * Return the type representing the built-in type 'double'.
-   */
+  /// Return the type representing the built-in type 'double'.
   InterfaceType get doubleType;
 
-  /**
-   * Return the type representing the built-in type 'dynamic'.
-   */
+  /// Return the type representing the built-in type 'dynamic'.
   DartType get dynamicType;
 
-  /**
-   * Return the type representing the built-in type 'Function'.
-   */
+  /// Return the type representing the built-in type 'Function'.
   InterfaceType get functionType;
 
-  /**
-   * Return the type representing 'Future<dynamic>'.
-   */
+  /// Return the type representing 'Future<dynamic>'.
   InterfaceType get futureDynamicType;
 
-  /**
-   * Return the type representing 'Future<Null>'.
-   */
+  /// Return the type representing 'Future<Null>'.
   InterfaceType get futureNullType;
 
-  /**
-   * Return the type representing 'FutureOr<Null>'.
-   */
+  /// Return the type representing 'FutureOr<Null>'.
   InterfaceType get futureOrNullType;
 
-  /**
-   * Return the type representing the built-in type 'FutureOr'.
-   */
+  /// Return the type representing the built-in type 'FutureOr'.
   InterfaceType get futureOrType;
 
-  /**
-   * Return the type representing the built-in type 'Future'.
-   */
+  /// Return the type representing the built-in type 'Future'.
   InterfaceType get futureType;
 
-  /**
-   * Return the type representing the built-in type 'int'.
-   */
+  /// Return the type representing the built-in type 'int'.
   InterfaceType get intType;
 
-  /**
-   * Return the type representing the type 'Iterable<dynamic>'.
-   */
+  /// Return the type representing the type 'Iterable<dynamic>'.
   InterfaceType get iterableDynamicType;
 
-  /**
-   * Return the type representing the built-in type 'Iterable'.
-   */
+  /// Return the type representing the built-in type 'Iterable'.
   InterfaceType get iterableType;
 
-  /**
-   * Return the type representing the built-in type 'List'.
-   */
+  /// Return the type representing the built-in type 'List'.
   InterfaceType get listType;
 
-  /**
-   * Return the type representing the built-in type 'Map'.
-   */
+  /// Return the type representing the built-in type 'Map'.
   InterfaceType get mapType;
 
-  /**
-   * Return a list containing all of the types that cannot be either extended or
-   * implemented.
-   */
+  /// Return a list containing all of the types that cannot be either extended
+  /// or implemented.
   List<InterfaceType> get nonSubtypableTypes;
 
-  /**
-   * Return a [DartObjectImpl] representing the `null` object.
-   */
+  /// Return a [DartObjectImpl] representing the `null` object.
   DartObjectImpl get nullObject;
 
-  /**
-   * Return the type representing the built-in type 'Null'.
-   */
+  /// Return the type representing the built-in type 'Null'.
   InterfaceType get nullType;
 
-  /**
-   * Return the type representing the built-in type 'num'.
-   */
+  /// Return the type representing the built-in type 'num'.
   InterfaceType get numType;
 
-  /**
-   * Return the type representing the built-in type 'Object'.
-   */
+  /// Return the type representing the built-in type 'Object'.
   InterfaceType get objectType;
 
-  /**
-   * Return the type representing the built-in type 'StackTrace'.
-   */
+  /// Return the type representing the built-in type 'StackTrace'.
   InterfaceType get stackTraceType;
 
-  /**
-   * Return the type representing 'Stream<dynamic>'.
-   */
+  /// Return the type representing 'Stream<dynamic>'.
   InterfaceType get streamDynamicType;
 
-  /**
-   * Return the type representing the built-in type 'Stream'.
-   */
+  /// Return the type representing the built-in type 'Stream'.
   InterfaceType get streamType;
 
-  /**
-   * Return the type representing the built-in type 'String'.
-   */
+  /// Return the type representing the built-in type 'String'.
   InterfaceType get stringType;
 
-  /**
-   * Return the type representing the built-in type 'Symbol'.
-   */
+  /// Return the type representing the built-in type 'Symbol'.
   InterfaceType get symbolType;
 
-  /**
-   * Return the type representing the built-in type 'Type'.
-   */
+  /// Return the type representing the built-in type 'Type'.
   InterfaceType get typeType;
 
-  /**
-   * Return the type representing typenames that can't be resolved.
-   */
+  /// Return the type representing typenames that can't be resolved.
   DartType get undefinedType;
 
-  /**
-   * Return 'true' if [id] is the name of a getter on
-   * the Object type.
-   */
+  /// Return 'true' if [id] is the name of a getter on
+  /// the Object type.
   bool isObjectGetter(String id);
 
-  /**
-   * Return 'true' if [id] is the name of a method or getter on
-   * the Object type.
-   */
+  /// Return 'true' if [id] is the name of a method or getter on
+  /// the Object type.
   bool isObjectMember(String id);
 
-  /**
-   * Return 'true' if [id] is the name of a method on
-   * the Object type.
-   */
+  /// Return 'true' if [id] is the name of a method on
+  /// the Object type.
   bool isObjectMethod(String id);
 }
 
-/**
- * Provide common functionality shared by the various TypeProvider
- * implementations.
- */
+/// Provide common functionality shared by the various TypeProvider
+/// implementations.
 abstract class TypeProviderBase implements TypeProvider {
   @override
   List<InterfaceType> get nonSubtypableTypes => <InterfaceType>[
@@ -9092,150 +8588,93 @@
   }
 }
 
-/**
- * Instances of the class `TypeProviderImpl` provide access to types defined by the language
- * by looking for those types in the element model for the core library.
- */
+/// Instances of the class `TypeProviderImpl` provide access to types defined by
+/// the language by looking for those types in the element model for the core
+/// library.
 class TypeProviderImpl extends TypeProviderBase {
-  /**
-   * The type representing the built-in type 'bool'.
-   */
+  /// The type representing the built-in type 'bool'.
   InterfaceType _boolType;
 
-  /**
-   * The type representing the type 'bottom'.
-   */
+  /// The type representing the type 'bottom'.
   DartType _bottomType;
 
-  /**
-   * The type representing the built-in type 'double'.
-   */
+  /// The type representing the built-in type 'double'.
   InterfaceType _doubleType;
 
-  /**
-   * The type representing the built-in type 'Deprecated'.
-   */
+  /// The type representing the built-in type 'Deprecated'.
   InterfaceType _deprecatedType;
 
-  /**
-   * The type representing the built-in type 'dynamic'.
-   */
+  /// The type representing the built-in type 'dynamic'.
   DartType _dynamicType;
 
-  /**
-   * The type representing the built-in type 'Function'.
-   */
+  /// The type representing the built-in type 'Function'.
   InterfaceType _functionType;
 
-  /**
-   * The type representing 'Future<dynamic>'.
-   */
+  /// The type representing 'Future<dynamic>'.
   InterfaceType _futureDynamicType;
 
-  /**
-   * The type representing 'Future<Null>'.
-   */
+  /// The type representing 'Future<Null>'.
   InterfaceType _futureNullType;
 
-  /**
-   * The type representing 'FutureOr<Null>'.
-   */
+  /// The type representing 'FutureOr<Null>'.
   InterfaceType _futureOrNullType;
 
-  /**
-   * The type representing the built-in type 'FutureOr'.
-   */
+  /// The type representing the built-in type 'FutureOr'.
   InterfaceType _futureOrType;
 
-  /**
-   * The type representing the built-in type 'Future'.
-   */
+  /// The type representing the built-in type 'Future'.
   InterfaceType _futureType;
 
-  /**
-   * The type representing the built-in type 'int'.
-   */
+  /// The type representing the built-in type 'int'.
   InterfaceType _intType;
 
-  /**
-   * The type representing 'Iterable<dynamic>'.
-   */
+  /// The type representing 'Iterable<dynamic>'.
   InterfaceType _iterableDynamicType;
 
-  /**
-   * The type representing the built-in type 'Iterable'.
-   */
+  /// The type representing the built-in type 'Iterable'.
   InterfaceType _iterableType;
 
-  /**
-   * The type representing the built-in type 'List'.
-   */
+  /// The type representing the built-in type 'List'.
   InterfaceType _listType;
 
-  /**
-   * The type representing the built-in type 'Map'.
-   */
+  /// The type representing the built-in type 'Map'.
   InterfaceType _mapType;
 
-  /**
-   * An shared object representing the value 'null'.
-   */
+  /// An shared object representing the value 'null'.
   DartObjectImpl _nullObject;
 
-  /**
-   * The type representing the type 'Null'.
-   */
+  /// The type representing the type 'Null'.
   InterfaceType _nullType;
 
-  /**
-   * The type representing the built-in type 'num'.
-   */
+  /// The type representing the built-in type 'num'.
   InterfaceType _numType;
 
-  /**
-   * The type representing the built-in type 'Object'.
-   */
+  /// The type representing the built-in type 'Object'.
   InterfaceType _objectType;
 
-  /**
-   * The type representing the built-in type 'StackTrace'.
-   */
+  /// The type representing the built-in type 'StackTrace'.
   InterfaceType _stackTraceType;
 
-  /**
-   * The type representing 'Stream<dynamic>'.
-   */
+  /// The type representing 'Stream<dynamic>'.
   InterfaceType _streamDynamicType;
 
-  /**
-   * The type representing the built-in type 'Stream'.
-   */
+  /// The type representing the built-in type 'Stream'.
   InterfaceType _streamType;
 
-  /**
-   * The type representing the built-in type 'String'.
-   */
+  /// The type representing the built-in type 'String'.
   InterfaceType _stringType;
 
-  /**
-   * The type representing the built-in type 'Symbol'.
-   */
+  /// The type representing the built-in type 'Symbol'.
   InterfaceType _symbolType;
 
-  /**
-   * The type representing the built-in type 'Type'.
-   */
+  /// The type representing the built-in type 'Type'.
   InterfaceType _typeType;
 
-  /**
-   * The type representing typenames that can't be resolved.
-   */
+  /// The type representing typenames that can't be resolved.
   DartType _undefinedType;
 
-  /**
-   * Initialize a newly created type provider to provide the types defined in
-   * the given [coreLibrary] and [asyncLibrary].
-   */
+  /// Initialize a newly created type provider to provide the types defined in
+  /// the given [coreLibrary] and [asyncLibrary].
   TypeProviderImpl(LibraryElement coreLibrary, LibraryElement asyncLibrary) {
     Namespace coreNamespace =
         new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary);
@@ -9244,10 +8683,8 @@
     _initializeFrom(coreNamespace, asyncNamespace);
   }
 
-  /**
-   * Initialize a newly created type provider to provide the types defined in
-   * the given [Namespace]s.
-   */
+  /// Initialize a newly created type provider to provide the types defined in
+  /// the given [Namespace]s.
   TypeProviderImpl.forNamespaces(
       Namespace coreNamespace, Namespace asyncNamespace) {
     _initializeFrom(coreNamespace, asyncNamespace);
@@ -9339,14 +8776,12 @@
   @override
   DartType get undefinedType => _undefinedType;
 
-  /**
-   * Return the type with the given name from the given namespace, or `null` if there is no
-   * class with the given name.
-   *
-   * @param namespace the namespace in which to search for the given name
-   * @param typeName the name of the type being searched for
-   * @return the type that was found
-   */
+  /// Return the type with the given name from the given namespace, or `null` if
+  /// there is no class with the given name.
+  ///
+  /// @param namespace the namespace in which to search for the given name
+  /// @param typeName the name of the type being searched for
+  /// @return the type that was found
   InterfaceType _getType(Namespace namespace, String typeName) {
     Element element = namespace.get(typeName);
     if (element == null) {
@@ -9357,10 +8792,8 @@
     return (element as ClassElement).type;
   }
 
-  /**
-   * Initialize the types provided by this type provider from the given
-   * [Namespace]s.
-   */
+  /// Initialize the types provided by this type provider from the given
+  /// [Namespace]s.
   void _initializeFrom(Namespace coreNamespace, Namespace asyncNamespace) {
     _boolType = _getType(coreNamespace, "bool");
     _bottomType = BottomTypeImpl.instance;
@@ -9393,11 +8826,9 @@
     _futureOrNullType = _futureOrType.instantiate(<DartType>[_nullType]);
   }
 
-  /**
-   * Create an [InterfaceType] that can be used for `FutureOr<T>` if the SDK
-   * being analyzed does not contain its own `FutureOr<T>`.  This ensures that
-   * we can analyze older SDKs.
-   */
+  /// Create an [InterfaceType] that can be used for `FutureOr<T>` if the SDK
+  /// being analyzed does not contain its own `FutureOr<T>`.  This ensures that
+  /// we can analyze older SDKs.
   static InterfaceType createPlaceholderFutureOr(
       InterfaceType futureType, InterfaceType objectType) {
     var compilationUnit =
@@ -9408,106 +8839,90 @@
   }
 }
 
-/**
- * Modes in which [TypeResolverVisitor] works.
- */
+/// Modes in which [TypeResolverVisitor] works.
 enum TypeResolverMode {
-  /**
-   * Resolve all names types of all nodes.
-   */
+  /// Resolve all names types of all nodes.
   everything,
 
-  /**
-   * Resolve only type names outside of function bodies, variable initializers,
-   * and parameter default values.
-   */
+  /// Resolve only type names outside of function bodies, variable initializers,
+  /// and parameter default values.
   api,
 
-  /**
-   * Resolve only type names that would be skipped during [api].
-   *
-   * Resolution must start from a unit member or a class member. For example
-   * it is not allowed to resolve types in a separate statement, or a function
-   * body.
-   */
+  /// Resolve only type names that would be skipped during [api].
+  ///
+  /// Resolution must start from a unit member or a class member. For example
+  /// it is not allowed to resolve types in a separate statement, or a function
+  /// body.
   local
 }
 
-/**
- * Instances of the class `TypeResolverVisitor` are used to resolve the types associated with
- * the elements in the element model. This includes the types of superclasses, mixins, interfaces,
- * fields, methods, parameters, and local variables. As a side-effect, this also finishes building
- * the type hierarchy.
- */
+/// Instances of the class `TypeResolverVisitor` are used to resolve the types
+/// associated with the elements in the element model. This includes the types
+/// of superclasses, mixins, interfaces, fields, methods, parameters, and local
+/// variables. As a side-effect, this also finishes building the type hierarchy.
 class TypeResolverVisitor extends ScopedVisitor {
-  /**
-   * The type representing the type 'dynamic'.
-   */
+  /// The type representing the type 'dynamic'.
   DartType _dynamicType;
 
-  /**
-   * The type representing typenames that can't be resolved.
-   */
+  /// The type representing typenames that can't be resolved.
   DartType _undefinedType;
 
-  /**
-   * The flag specifying if currently visited class references 'super' expression.
-   */
+  /// The flag specifying if currently visited class references 'super'
+  /// expression.
   bool _hasReferenceToSuper = false;
 
-  /**
-   * True if we're analyzing in strong mode.
-   */
+  /// True if we're analyzing in strong mode.
   final bool _strongMode = true;
 
-  /**
-   * Type type system in use for this resolver pass.
-   */
+  /// Type type system in use for this resolver pass.
   TypeSystem _typeSystem;
 
-  /**
-   * The helper to resolve types.
-   */
+  /// The helper to resolve types.
   TypeNameResolver _typeNameResolver;
 
   final TypeResolverMode mode;
 
-  /**
-   * Is `true` when we are visiting all nodes in [TypeResolverMode.local] mode.
-   */
+  /// Is `true` when we are visiting all nodes in [TypeResolverMode.local] mode.
   bool _localModeVisitAll = false;
 
-  /**
-   * Is `true` if we are in [TypeResolverMode.local] mode, and the initial
-   * [nameScope] was computed.
-   */
+  /// Is `true` if we are in [TypeResolverMode.local] mode, and the initial
+  /// [nameScope] was computed.
   bool _localModeScopeReady = false;
 
-  /**
-   * Initialize a newly created visitor to resolve the nodes in an AST node.
-   *
-   * [definingLibrary] is the element for the library containing the node being
-   * visited.
-   * [source] is the source representing the compilation unit containing the
-   * node being visited.
-   * [typeProvider] is the object used to access the types from the core
-   * library.
-   * [errorListener] is the error listener that will be informed of any errors
-   * that are found during resolution.
-   * [nameScope] is the scope used to resolve identifiers in the node that will
-   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
-   * created based on [definingLibrary] and [typeProvider].
-   */
+  /// Indicates whether the ClassElement fields interfaces, mixins, and
+  /// supertype should be set by this visitor.
+  ///
+  /// This is needed when using the old task model, but causes problems with the
+  /// new driver.
+  final bool shouldSetElementSupertypes;
+
+  /// Initialize a newly created visitor to resolve the nodes in an AST node.
+  ///
+  /// [definingLibrary] is the element for the library containing the node being
+  /// visited.
+  /// [source] is the source representing the compilation unit containing the
+  /// node being visited.
+  /// [typeProvider] is the object used to access the types from the core
+  /// library.
+  /// [errorListener] is the error listener that will be informed of any errors
+  /// that are found during resolution.
+  /// [nameScope] is the scope used to resolve identifiers in the node that will
+  /// first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+  /// created based on [definingLibrary] and [typeProvider].
   TypeResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
-      {Scope nameScope, this.mode: TypeResolverMode.everything})
+      {Scope nameScope,
+      this.mode: TypeResolverMode.everything,
+      bool shouldUseWithClauseInferredTypes: true,
+      this.shouldSetElementSupertypes: false})
       : super(definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope) {
     _dynamicType = typeProvider.dynamicType;
     _undefinedType = typeProvider.undefinedType;
     _typeSystem = TypeSystem.create(definingLibrary.context);
     _typeNameResolver = new TypeNameResolver(
-        _typeSystem, typeProvider, definingLibrary, source, errorListener);
+        _typeSystem, typeProvider, definingLibrary, source, errorListener,
+        shouldUseWithClauseInferredTypes: shouldUseWithClauseInferredTypes);
   }
 
   @override
@@ -9603,7 +9018,7 @@
       superclassType =
           _resolveType(extendsClause.superclass, errorCode, asClass: true);
     }
-    if (classElement != null) {
+    if (shouldSetElementSupertypes && classElement != null) {
       if (superclassType == null) {
         InterfaceType objectType = typeProvider.objectType;
         if (!identical(classElement.type, objectType)) {
@@ -9652,7 +9067,7 @@
       superclassType = typeProvider.objectType;
     }
     ClassElementImpl classElement = _getClassElement(node.name);
-    if (classElement != null) {
+    if (shouldSetElementSupertypes && classElement != null) {
       classElement.supertype = superclassType;
     }
     _resolveWithClause(classElement, node.withClause);
@@ -9901,9 +9316,7 @@
         _localModeScopeReady = true;
       }
 
-      /**
-       * Visit the given [node] and all its children.
-       */
+      /// Visit the given [node] and all its children.
       void visitAllNodes(AstNode node) {
         if (node != null) {
           bool wasVisitAllInLocalMode = _localModeVisitAll;
@@ -9988,7 +9401,8 @@
     AstNode parent2 = node.parent?.parent;
     if (parent2 is ClassDeclaration ||
         parent2 is ClassTypeAlias ||
-        parent2 is FunctionTypeAlias) {
+        parent2 is FunctionTypeAlias ||
+        parent2 is GenericTypeAlias) {
       // Bounds of parameters of classes and function type aliases are
       // already resolved.
     } else {
@@ -10030,10 +9444,8 @@
     return null;
   }
 
-  /**
-   * Given the [returnType] of a function, compute the return type of the
-   * function.
-   */
+  /// Given the [returnType] of a function, compute the return type of the
+  /// function.
   DartType _computeReturnType(TypeAnnotation returnType) {
     if (returnType == null) {
       return _dynamicType;
@@ -10042,12 +9454,11 @@
     }
   }
 
-  /**
-   * Return the class element that represents the class whose name was provided.
-   *
-   * @param identifier the name from the declaration of a class
-   * @return the class element that represents the class
-   */
+  /// Return the class element that represents the class whose name was
+  /// provided.
+  ///
+  /// @param identifier the name from the declaration of a class
+  /// @return the class element that represents the class
   ClassElementImpl _getClassElement(SimpleIdentifier identifier) {
     // TODO(brianwilkerson) Seems like we should be using
     // ClassDeclaration.getElement().
@@ -10066,11 +9477,9 @@
     return null;
   }
 
-  /**
-   * In strong mode we infer "void" as the return type of operator []= (as void
-   * is the only legal return type for []=). This allows us to give better
-   * errors later if an invalid type is returned.
-   */
+  /// In strong mode we infer "void" as the return type of operator []= (as void
+  /// is the only legal return type for []=). This allows us to give better
+  /// errors later if an invalid type is returned.
   void _inferOperatorReturnType(ExecutableElementImpl element) {
     if (_strongMode &&
         element.isOperator &&
@@ -10080,11 +9489,9 @@
     }
   }
 
-  /**
-   * In strong mode we infer "void" as the setter return type (as void is the
-   * only legal return type for a setter). This allows us to give better
-   * errors later if an invalid type is returned.
-   */
+  /// In strong mode we infer "void" as the setter return type (as void is the
+  /// only legal return type for a setter). This allows us to give better
+  /// errors later if an invalid type is returned.
   void _inferSetterReturnType(ExecutableElementImpl element) {
     if (_strongMode &&
         element is PropertyAccessorElementImpl &&
@@ -10094,12 +9501,10 @@
     }
   }
 
-  /**
-   * Record that the static type of the given node is the given type.
-   *
-   * @param expression the node whose type is to be recorded
-   * @param type the static type of the node
-   */
+  /// Record that the static type of the given node is the given type.
+  ///
+  /// @param expression the node whose type is to be recorded
+  /// @param type the static type of the node
   Object _recordType(Expression expression, DartType type) {
     if (type == null) {
       expression.staticType = _dynamicType;
@@ -10115,7 +9520,7 @@
       NodeList<TypeName> interfaces = clause.interfaces;
       List<InterfaceType> interfaceTypes =
           _resolveTypes(interfaces, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS);
-      if (classElement != null) {
+      if (shouldSetElementSupertypes && classElement != null) {
         classElement.interfaces = interfaceTypes;
       }
     }
@@ -10130,18 +9535,18 @@
     if (types == null || types.isEmpty) {
       types = [typeProvider.objectType];
     }
-    classElement.superclassConstraints = types;
+    if (shouldSetElementSupertypes) {
+      classElement.superclassConstraints = types;
+    }
   }
 
-  /**
-   * Return the [InterfaceType] of the given [typeName].
-   *
-   * If the resulting type is not a valid interface type, return `null`.
-   *
-   * The flag [asClass] specifies if the type will be used as a class, so mixin
-   * declarations are not valid (they declare interfaces and mixins, but not
-   * classes).
-   */
+  /// Return the [InterfaceType] of the given [typeName].
+  ///
+  /// If the resulting type is not a valid interface type, return `null`.
+  ///
+  /// The flag [asClass] specifies if the type will be used as a class, so mixin
+  /// declarations are not valid (they declare interfaces and mixins, but not
+  /// classes).
   InterfaceType _resolveType(TypeName typeName, ErrorCode errorCode,
       {bool asClass: false}) {
     DartType type = typeName.type;
@@ -10164,16 +9569,15 @@
     return null;
   }
 
-  /**
-   * Resolve the types in the given list of type names.
-   *
-   * @param typeNames the type names to be resolved
-   * @param nonTypeError the error to produce if the type name is defined to be something other than
-   *          a type
-   * @param enumTypeError the error to produce if the type name is defined to be an enum
-   * @param dynamicTypeError the error to produce if the type name is "dynamic"
-   * @return an array containing all of the types that were resolved.
-   */
+  /// Resolve the types in the given list of type names.
+  ///
+  /// @param typeNames the type names to be resolved
+  /// @param nonTypeError the error to produce if the type name is defined to be
+  ///        something other than a type
+  /// @param enumTypeError the error to produce if the type name is defined to
+  ///        be an enum
+  /// @param dynamicTypeError the error to produce if the type name is "dynamic"
+  /// @return an array containing all of the types that were resolved.
   List<InterfaceType> _resolveTypes(
       NodeList<TypeName> typeNames, ErrorCode errorCode) {
     List<InterfaceType> types = new List<InterfaceType>();
@@ -10190,15 +9594,15 @@
     if (clause != null) {
       List<InterfaceType> mixinTypes = _resolveTypes(
           clause.mixinTypes, CompileTimeErrorCode.MIXIN_OF_NON_CLASS);
-      classElement.mixins = mixinTypes;
+      if (shouldSetElementSupertypes) {
+        classElement.mixins = mixinTypes;
+      }
     }
   }
 
-  /**
-   * Given a function typed [parameter] with [FunctionType] based on a
-   * [GenericFunctionTypeElementImpl], compute and set the return type for the
-   * function element.
-   */
+  /// Given a function typed [parameter] with [FunctionType] based on a
+  /// [GenericFunctionTypeElementImpl], compute and set the return type for the
+  /// function element.
   void _setFunctionTypedParameterType(ParameterElementImpl parameter,
       TypeAnnotation returnType, FormalParameterList parameterList) {
     DartType type = parameter.type;
@@ -10207,25 +9611,17 @@
   }
 }
 
-/**
- * Instances of the class [UnusedLocalElementsVerifier] traverse an AST
- * looking for cases of [HintCode.UNUSED_ELEMENT], [HintCode.UNUSED_FIELD],
- * [HintCode.UNUSED_LOCAL_VARIABLE], etc.
- */
+/// Instances of the class [UnusedLocalElementsVerifier] traverse an AST
+/// looking for cases of [HintCode.UNUSED_ELEMENT], [HintCode.UNUSED_FIELD],
+/// [HintCode.UNUSED_LOCAL_VARIABLE], etc.
 class UnusedLocalElementsVerifier extends RecursiveAstVisitor {
-  /**
-   * The error listener to which errors will be reported.
-   */
+  /// The error listener to which errors will be reported.
   final AnalysisErrorListener _errorListener;
 
-  /**
-   * The elements know to be used.
-   */
+  /// The elements know to be used.
   final UsedLocalElements _usedElements;
 
-  /**
-   * Create a new instance of the [UnusedLocalElementsVerifier].
-   */
+  /// Create a new instance of the [UnusedLocalElementsVerifier].
   UnusedLocalElementsVerifier(this._errorListener, this._usedElements);
 
   visitSimpleIdentifier(SimpleIdentifier node) {
@@ -10375,56 +9771,39 @@
   }
 }
 
-/**
- * A container with information about used imports prefixes and used imported
- * elements.
- */
+/// A container with information about used imports prefixes and used imported
+/// elements.
 class UsedImportedElements {
-  /**
-   * The map of referenced [PrefixElement]s and the [Element]s that they prefix.
-   */
+  /// The map of referenced [PrefixElement]s and the [Element]s that they
+  /// prefix.
   final Map<PrefixElement, List<Element>> prefixMap =
       new HashMap<PrefixElement, List<Element>>();
 
-  /**
-   * The set of referenced top-level [Element]s.
-   */
+  /// The set of referenced top-level [Element]s.
   final Set<Element> elements = new HashSet<Element>();
 }
 
-/**
- * A container with sets of used [Element]s.
- * All these elements are defined in a single compilation unit or a library.
- */
+/// A container with sets of used [Element]s.
+/// All these elements are defined in a single compilation unit or a library.
 class UsedLocalElements {
-  /**
-   * Resolved, locally defined elements that are used or potentially can be
-   * used.
-   */
+  /// Resolved, locally defined elements that are used or potentially can be
+  /// used.
   final HashSet<Element> elements = new HashSet<Element>();
 
-  /**
-   * [LocalVariableElement]s that represent exceptions in [CatchClause]s.
-   */
+  /// [LocalVariableElement]s that represent exceptions in [CatchClause]s.
   final HashSet<LocalVariableElement> catchExceptionElements =
       new HashSet<LocalVariableElement>();
 
-  /**
-   * [LocalVariableElement]s that represent stack traces in [CatchClause]s.
-   */
+  /// [LocalVariableElement]s that represent stack traces in [CatchClause]s.
   final HashSet<LocalVariableElement> catchStackTraceElements =
       new HashSet<LocalVariableElement>();
 
-  /**
-   * Names of resolved or unresolved class members that are referenced in the
-   * library.
-   */
+  /// Names of resolved or unresolved class members that are referenced in the
+  /// library.
   final HashSet<String> members = new HashSet<String>();
 
-  /**
-   * Names of resolved or unresolved class members that are read in the
-   * library.
-   */
+  /// Names of resolved or unresolved class members that are read in the
+  /// library.
   final HashSet<String> readMembers = new HashSet<String>();
 
   UsedLocalElements();
@@ -10470,37 +9849,29 @@
   }
 }
 
-/**
- * Instances of the class `VariableResolverVisitor` are used to resolve
- * [SimpleIdentifier]s to local variables and formal parameters.
- */
+/// Instances of the class `VariableResolverVisitor` are used to resolve
+/// [SimpleIdentifier]s to local variables and formal parameters.
 class VariableResolverVisitor extends ScopedVisitor {
-  /**
-   * The method or function that we are currently visiting, or `null` if we are not inside a
-   * method or function.
-   */
+  /// The method or function that we are currently visiting, or `null` if we are
+  /// not inside a method or function.
   ExecutableElement _enclosingFunction;
 
-  /**
-   * Information about local variables in the enclosing function or method.
-   */
+  /// Information about local variables in the enclosing function or method.
   LocalVariableInfo _localVariableInfo;
 
-  /**
-   * Initialize a newly created visitor to resolve the nodes in an AST node.
-   *
-   * [definingLibrary] is the element for the library containing the node being
-   * visited.
-   * [source] is the source representing the compilation unit containing the
-   * node being visited
-   * [typeProvider] is the object used to access the types from the core
-   * library.
-   * [errorListener] is the error listener that will be informed of any errors
-   * that are found during resolution.
-   * [nameScope] is the scope used to resolve identifiers in the node that will
-   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
-   * created based on [definingLibrary] and [typeProvider].
-   */
+  /// Initialize a newly created visitor to resolve the nodes in an AST node.
+  ///
+  /// [definingLibrary] is the element for the library containing the node being
+  /// visited.
+  /// [source] is the source representing the compilation unit containing the
+  /// node being visited
+  /// [typeProvider] is the object used to access the types from the core
+  /// library.
+  /// [errorListener] is the error listener that will be informed of any errors
+  /// that are found during resolution.
+  /// [nameScope] is the scope used to resolve identifiers in the node that will
+  /// first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+  /// created based on [definingLibrary] and [typeProvider].
   VariableResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
       {Scope nameScope})
@@ -10715,34 +10086,22 @@
   }
 }
 
-/**
- * An object used to track the usage of labels within a single label scope.
- */
+/// An object used to track the usage of labels within a single label scope.
 class _LabelTracker {
-  /**
-   * The tracker for the outer label scope.
-   */
+  /// The tracker for the outer label scope.
   final _LabelTracker outerTracker;
 
-  /**
-   * The labels whose usage is being tracked.
-   */
+  /// The labels whose usage is being tracked.
   final List<Label> labels;
 
-  /**
-   * A list of flags corresponding to the list of [labels] indicating whether
-   * the corresponding label has been used.
-   */
+  /// A list of flags corresponding to the list of [labels] indicating whether
+  /// the corresponding label has been used.
   List<bool> used;
 
-  /**
-   * A map from the names of labels to the index of the label in [labels].
-   */
+  /// A map from the names of labels to the index of the label in [labels].
   final Map<String, int> labelMap = <String, int>{};
 
-  /**
-   * Initialize a newly created label tracker.
-   */
+  /// Initialize a newly created label tracker.
   _LabelTracker(this.outerTracker, this.labels) {
     used = new List.filled(labels.length, false);
     for (int i = 0; i < labels.length; i++) {
@@ -10750,9 +10109,7 @@
     }
   }
 
-  /**
-   * Record that the label with the given [labelName] has been used.
-   */
+  /// Record that the label with the given [labelName] has been used.
   void recordUsage(String labelName) {
     if (labelName != null) {
       int index = labelMap[labelName];
@@ -10764,9 +10121,7 @@
     }
   }
 
-  /**
-   * Return the unused labels.
-   */
+  /// Return the unused labels.
   Iterable<Label> unusedLabels() sync* {
     for (int i = 0; i < labels.length; i++) {
       if (!used[i]) {
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 0f80220d..d2ce780 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -1757,18 +1757,21 @@
    */
   TypeProvider get typeProvider;
 
-  List<InterfaceType> gatherMixinSupertypeConstraints(
+  List<InterfaceType> gatherMixinSupertypeConstraintsForInference(
       ClassElement mixinElement) {
-    var mixinSupertypeConstraints = <InterfaceType>[];
-    void addIfGeneric(InterfaceType type) {
-      if (type.element.typeParameters.isNotEmpty) {
-        mixinSupertypeConstraints.add(type);
+    List<InterfaceType> candidates;
+    if (mixinElement.isMixin) {
+      candidates = mixinElement.superclassConstraints;
+    } else {
+      candidates = [mixinElement.supertype];
+      candidates.addAll(mixinElement.mixins);
+      if (mixinElement.isMixinApplication) {
+        candidates.removeLast();
       }
     }
-
-    addIfGeneric(mixinElement.supertype);
-    mixinElement.mixins.forEach(addIfGeneric);
-    return mixinSupertypeConstraints;
+    return candidates
+        .where((type) => type.element.typeParameters.isNotEmpty)
+        .toList();
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 610ae0d..cda912f 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -672,47 +672,37 @@
 class AnalysisDriverSubtypeBuilder extends Object
     with _AnalysisDriverSubtypeMixin
     implements idl.AnalysisDriverSubtype {
-  List<String> _members;
-  String _name;
-  List<String> _supertypes;
+  List<int> _members;
+  int _name;
 
   @override
-  List<String> get members => _members ??= <String>[];
+  List<int> get members => _members ??= <int>[];
 
   /**
    * The names of defined instance members.
+   * They are indexes into [AnalysisDriverUnitError.strings] list.
    * The list is sorted in ascending order.
    */
-  void set members(List<String> value) {
+  void set members(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
     this._members = value;
   }
 
   @override
-  String get name => _name ??= '';
+  int get name => _name ??= 0;
 
   /**
    * The name of the class.
+   * It is an index into [AnalysisDriverUnitError.strings] list.
    */
-  void set name(String value) {
+  void set name(int value) {
+    assert(value == null || value >= 0);
     this._name = value;
   }
 
-  @override
-  List<String> get supertypes => _supertypes ??= <String>[];
-
-  /**
-   * The identifiers of the direct supertypes.
-   * The list is sorted in ascending order.
-   */
-  void set supertypes(List<String> value) {
-    this._supertypes = value;
-  }
-
-  AnalysisDriverSubtypeBuilder(
-      {List<String> members, String name, List<String> supertypes})
+  AnalysisDriverSubtypeBuilder({List<int> members, int name})
       : _members = members,
-        _name = name,
-        _supertypes = supertypes;
+        _name = name;
 
   /**
    * Flush [informative] data recursively.
@@ -723,49 +713,28 @@
    * Accumulate non-[informative] data into [signature].
    */
   void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._name ?? '');
-    if (this._supertypes == null) {
-      signature.addInt(0);
-    } else {
-      signature.addInt(this._supertypes.length);
-      for (var x in this._supertypes) {
-        signature.addString(x);
-      }
-    }
+    signature.addInt(this._name ?? 0);
     if (this._members == null) {
       signature.addInt(0);
     } else {
       signature.addInt(this._members.length);
       for (var x in this._members) {
-        signature.addString(x);
+        signature.addInt(x);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset offset_members;
-    fb.Offset offset_name;
-    fb.Offset offset_supertypes;
     if (!(_members == null || _members.isEmpty)) {
-      offset_members = fbBuilder
-          .writeList(_members.map((b) => fbBuilder.writeString(b)).toList());
-    }
-    if (_name != null) {
-      offset_name = fbBuilder.writeString(_name);
-    }
-    if (!(_supertypes == null || _supertypes.isEmpty)) {
-      offset_supertypes = fbBuilder
-          .writeList(_supertypes.map((b) => fbBuilder.writeString(b)).toList());
+      offset_members = fbBuilder.writeListUint32(_members);
     }
     fbBuilder.startTable();
     if (offset_members != null) {
-      fbBuilder.addOffset(2, offset_members);
+      fbBuilder.addOffset(1, offset_members);
     }
-    if (offset_name != null) {
-      fbBuilder.addOffset(0, offset_name);
-    }
-    if (offset_supertypes != null) {
-      fbBuilder.addOffset(1, offset_supertypes);
+    if (_name != null && _name != 0) {
+      fbBuilder.addUint32(0, _name);
     }
     return fbBuilder.endTable();
   }
@@ -788,29 +757,21 @@
 
   _AnalysisDriverSubtypeImpl(this._bc, this._bcOffset);
 
-  List<String> _members;
-  String _name;
-  List<String> _supertypes;
+  List<int> _members;
+  int _name;
 
   @override
-  List<String> get members {
-    _members ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 2, const <String>[]);
+  List<int> get members {
+    _members ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
     return _members;
   }
 
   @override
-  String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
+  int get name {
+    _name ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _name;
   }
-
-  @override
-  List<String> get supertypes {
-    _supertypes ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 1, const <String>[]);
-    return _supertypes;
-  }
 }
 
 abstract class _AnalysisDriverSubtypeMixin
@@ -819,8 +780,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (members.isNotEmpty) _result["members"] = members;
-    if (name != '') _result["name"] = name;
-    if (supertypes.isNotEmpty) _result["supertypes"] = supertypes;
+    if (name != 0) _result["name"] = name;
     return _result;
   }
 
@@ -828,7 +788,6 @@
   Map<String, Object> toMap() => {
         "members": members,
         "name": name,
-        "supertypes": supertypes,
       };
 
   @override
@@ -1048,6 +1007,7 @@
   int _nullStringId;
   List<String> _strings;
   List<AnalysisDriverSubtypeBuilder> _subtypes;
+  List<int> _supertypes;
   List<int> _unitLibraryUris;
   List<int> _unitUnitUris;
   List<bool> _usedElementIsQualifiedFlags;
@@ -1164,6 +1124,20 @@
   }
 
   @override
+  List<int> get supertypes => _supertypes ??= <int>[];
+
+  /**
+   * The identifiers of supertypes of elements at corresponding indexes
+   * in [subtypes].  They are indexes into [strings] list. The list is sorted
+   * in ascending order.  There might be more than one element with the same
+   * value if there is more than one subtype of this supertype.
+   */
+  void set supertypes(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._supertypes = value;
+  }
+
+  @override
   List<int> get unitLibraryUris => _unitLibraryUris ??= <int>[];
 
   /**
@@ -1304,6 +1278,7 @@
       int nullStringId,
       List<String> strings,
       List<AnalysisDriverSubtypeBuilder> subtypes,
+      List<int> supertypes,
       List<int> unitLibraryUris,
       List<int> unitUnitUris,
       List<bool> usedElementIsQualifiedFlags,
@@ -1323,6 +1298,7 @@
         _nullStringId = nullStringId,
         _strings = strings,
         _subtypes = subtypes,
+        _supertypes = supertypes,
         _unitLibraryUris = unitLibraryUris,
         _unitUnitUris = unitUnitUris,
         _usedElementIsQualifiedFlags = usedElementIsQualifiedFlags,
@@ -1483,6 +1459,14 @@
         signature.addBool(x);
       }
     }
+    if (this._supertypes == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._supertypes.length);
+      for (var x in this._supertypes) {
+        signature.addInt(x);
+      }
+    }
     if (this._subtypes == null) {
       signature.addInt(0);
     } else {
@@ -1506,6 +1490,7 @@
     fb.Offset offset_elementUnits;
     fb.Offset offset_strings;
     fb.Offset offset_subtypes;
+    fb.Offset offset_supertypes;
     fb.Offset offset_unitLibraryUris;
     fb.Offset offset_unitUnitUris;
     fb.Offset offset_usedElementIsQualifiedFlags;
@@ -1547,6 +1532,9 @@
       offset_subtypes = fbBuilder
           .writeList(_subtypes.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (!(_supertypes == null || _supertypes.isEmpty)) {
+      offset_supertypes = fbBuilder.writeListUint32(_supertypes);
+    }
     if (!(_unitLibraryUris == null || _unitLibraryUris.isEmpty)) {
       offset_unitLibraryUris = fbBuilder.writeListUint32(_unitLibraryUris);
     }
@@ -1611,7 +1599,10 @@
       fbBuilder.addOffset(0, offset_strings);
     }
     if (offset_subtypes != null) {
-      fbBuilder.addOffset(18, offset_subtypes);
+      fbBuilder.addOffset(19, offset_subtypes);
+    }
+    if (offset_supertypes != null) {
+      fbBuilder.addOffset(18, offset_supertypes);
     }
     if (offset_unitLibraryUris != null) {
       fbBuilder.addOffset(2, offset_unitLibraryUris);
@@ -1680,6 +1671,7 @@
   int _nullStringId;
   List<String> _strings;
   List<idl.AnalysisDriverSubtype> _subtypes;
+  List<int> _supertypes;
   List<int> _unitLibraryUris;
   List<int> _unitUnitUris;
   List<bool> _usedElementIsQualifiedFlags;
@@ -1745,11 +1737,18 @@
   List<idl.AnalysisDriverSubtype> get subtypes {
     _subtypes ??= const fb.ListReader<idl.AnalysisDriverSubtype>(
             const _AnalysisDriverSubtypeReader())
-        .vTableGet(_bc, _bcOffset, 18, const <idl.AnalysisDriverSubtype>[]);
+        .vTableGet(_bc, _bcOffset, 19, const <idl.AnalysisDriverSubtype>[]);
     return _subtypes;
   }
 
   @override
+  List<int> get supertypes {
+    _supertypes ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 18, const <int>[]);
+    return _supertypes;
+  }
+
+  @override
   List<int> get unitLibraryUris {
     _unitLibraryUris ??=
         const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
@@ -1849,6 +1848,7 @@
     if (strings.isNotEmpty) _result["strings"] = strings;
     if (subtypes.isNotEmpty)
       _result["subtypes"] = subtypes.map((_value) => _value.toJson()).toList();
+    if (supertypes.isNotEmpty) _result["supertypes"] = supertypes;
     if (unitLibraryUris.isNotEmpty)
       _result["unitLibraryUris"] = unitLibraryUris;
     if (unitUnitUris.isNotEmpty) _result["unitUnitUris"] = unitUnitUris;
@@ -1885,6 +1885,7 @@
         "nullStringId": nullStringId,
         "strings": strings,
         "subtypes": subtypes,
+        "supertypes": supertypes,
         "unitLibraryUris": unitLibraryUris,
         "unitUnitUris": unitUnitUris,
         "usedElementIsQualifiedFlags": usedElementIsQualifiedFlags,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index a37da95..0f70322 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -987,20 +987,16 @@
 table AnalysisDriverSubtype {
   /**
    * The names of defined instance members.
+   * They are indexes into [AnalysisDriverUnitError.strings] list.
    * The list is sorted in ascending order.
    */
-  members:[string] (id: 2);
+  members:[uint] (id: 1);
 
   /**
    * The name of the class.
+   * It is an index into [AnalysisDriverUnitError.strings] list.
    */
-  name:string (id: 0);
-
-  /**
-   * The identifiers of the direct supertypes.
-   * The list is sorted in ascending order.
-   */
-  supertypes:[string] (id: 1);
+  name:uint (id: 0);
 }
 
 /**
@@ -1089,7 +1085,15 @@
   /**
    * The list of classes declared in the unit.
    */
-  subtypes:[AnalysisDriverSubtype] (id: 18);
+  subtypes:[AnalysisDriverSubtype] (id: 19);
+
+  /**
+   * The identifiers of supertypes of elements at corresponding indexes
+   * in [subtypes].  They are indexes into [strings] list. The list is sorted
+   * in ascending order.  There might be more than one element with the same
+   * value if there is more than one subtype of this supertype.
+   */
+  supertypes:[uint] (id: 18);
 
   /**
    * Each item of this list corresponds to the library URI of a unique library
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index c9ca5fd..4a9640c 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -134,23 +134,18 @@
 abstract class AnalysisDriverSubtype extends base.SummaryClass {
   /**
    * The names of defined instance members.
-   * The list is sorted in ascending order.
-   */
-  @Id(2)
-  List<String> get members;
-
-  /**
-   * The name of the class.
-   */
-  @Id(0)
-  String get name;
-
-  /**
-   * The identifiers of the direct supertypes.
+   * They are indexes into [AnalysisDriverUnitError.strings] list.
    * The list is sorted in ascending order.
    */
   @Id(1)
-  List<String> get supertypes;
+  List<int> get members;
+
+  /**
+   * The name of the class.
+   * It is an index into [AnalysisDriverUnitError.strings] list.
+   */
+  @Id(0)
+  int get name;
 }
 
 /**
@@ -255,10 +250,19 @@
   /**
    * The list of classes declared in the unit.
    */
-  @Id(18)
+  @Id(19)
   List<AnalysisDriverSubtype> get subtypes;
 
   /**
+   * The identifiers of supertypes of elements at corresponding indexes
+   * in [subtypes].  They are indexes into [strings] list. The list is sorted
+   * in ascending order.  There might be more than one element with the same
+   * value if there is more than one subtype of this supertype.
+   */
+  @Id(18)
+  List<int> get supertypes;
+
+  /**
    * Each item of this list corresponds to the library URI of a unique library
    * specific unit referenced in the index.  It is an index into [strings] list.
    */
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 2095404..f97e1a3 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -715,7 +715,7 @@
               this.enclosingElement;
           if (enclosingElement is CompilationUnitElementInBuildUnit) {
             var mixinSupertypeConstraints = context.typeSystem
-                .gatherMixinSupertypeConstraints(mixinElement);
+                .gatherMixinSupertypeConstraintsForInference(mixinElement);
             if (mixinSupertypeConstraints.isNotEmpty) {
               if (supertypesForMixinInference == null) {
                 supertypesForMixinInference = <InterfaceType>[];
@@ -1241,6 +1241,9 @@
       for (ClassElementForLink_Class type in types) {
         _containedNames[type.name] = type;
       }
+      for (ClassElementForLink_Class mixin in mixins) {
+        _containedNames[mixin.name] = mixin;
+      }
       for (ClassElementForLink_Enum enm in enums) {
         _containedNames[enm.name] = enm;
       }
@@ -2353,6 +2356,17 @@
   bool get isStatic => unlinkedVariable.isStatic;
 
   @override
+  DartType get type {
+    if (declaredType != null) {
+      return declaredType;
+    }
+    if (Linker._isPerformingVariableTypeInference && !isStatic) {
+      return DynamicTypeImpl.instance;
+    }
+    return inferredType;
+  }
+
+  @override
   void set type(DartType inferredType) {
     assert(!isStatic);
     assert(_inferredInstanceType == null);
@@ -3585,6 +3599,11 @@
   /// instance variables in that same cycle.
   static LibraryCycleForLink _initializerTypeInferenceCycle;
 
+  /// If a top-level or an instance variable type inference is in progress,
+  /// this flag it set to `true`.  It is used to prevent type inference for
+  /// other instance variables (when they don't have declared type).
+  static bool _isPerformingVariableTypeInference = false;
+
   /// Callback to ask the client for a [LinkedLibrary] for a
   /// dependency.
   final GetDependencyCallback getDependency;
@@ -4952,11 +4971,13 @@
         assert(Linker._initializerTypeInferenceCycle == null);
         Linker._initializerTypeInferenceCycle =
             compilationUnit.library.libraryCycleForLink;
+        Linker._isPerformingVariableTypeInference = true;
         try {
           new TypeInferenceDependencyWalker().walk(_typeInferenceNode);
           assert(_inferredType != null);
         } finally {
           Linker._initializerTypeInferenceCycle = null;
+          Linker._isPerformingVariableTypeInference = false;
         }
       } else if (compilationUnit.isInBuildUnit) {
         _inferredType = DynamicTypeImpl.instance;
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index ec06d19..96e2632 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -5104,7 +5104,9 @@
     //
     RecordingErrorListener errorListener = new RecordingErrorListener();
     TypeResolverVisitor visitor = new TypeResolverVisitor(
-        library, unitElement.source, typeProvider, errorListener);
+        library, unitElement.source, typeProvider, errorListener,
+        shouldUseWithClauseInferredTypes: false,
+        shouldSetElementSupertypes: true);
     unit.accept(visitor);
     //
     // Re-write the AST to handle the optional new and const feature.
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
index 4e73768..248b5db 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
@@ -13,11 +13,91 @@
 }
 
 @reflectiveTest
-class CompileTimeErrorCodeTest_Driver extends CompileTimeErrorCodeTest {
+class CompileTimeErrorCodeTest_Driver extends CompileTimeErrorCodeTestBase {
   @override
   bool get enableNewAnalysisDriver => true;
 
-  @override // Passes with driver
-  test_mixinInference_recursiveSubtypeCheck() =>
-      super.test_mixinInference_recursiveSubtypeCheck();
+  @override
+  @failingTest
+  test_awaitInWrongContext_sync() {
+    return super.test_awaitInWrongContext_sync();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException() {
+    return super.test_constEvalThrowsException();
+  }
+
+  @override
+  @failingTest
+  test_genericFunctionTypeArgument_typedef() {
+    return super.test_genericFunctionTypeArgument_typedef();
+  }
+
+  @override
+  @failingTest
+  test_invalidIdentifierInAsync_async() {
+    return super.test_invalidIdentifierInAsync_async();
+  }
+
+  @override
+  @failingTest
+  test_invalidIdentifierInAsync_await() {
+    return super.test_invalidIdentifierInAsync_await();
+  }
+
+  @override
+  @failingTest
+  test_invalidIdentifierInAsync_yield() {
+    return super.test_invalidIdentifierInAsync_yield();
+  }
+
+  @override
+  @failingTest
+  test_mixinInference_noMatchingClass_typeParametersSupplied() {
+    return super.test_mixinInference_noMatchingClass_typeParametersSupplied();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfNonClass() {
+    return super.test_mixinOfNonClass();
+  }
+
+  @override
+  @failingTest
+  test_objectCannotExtendAnotherClass() {
+    return super.test_objectCannotExtendAnotherClass();
+  }
+
+  @override
+  @failingTest
+  test_superInitializerInObject() {
+    return super.test_superInitializerInObject();
+  }
+
+  @override
+  @failingTest
+  test_yieldEachInNonGenerator_async() {
+    return super.test_yieldEachInNonGenerator_async();
+  }
+
+  @override
+  @failingTest
+  test_yieldEachInNonGenerator_sync() {
+    return super.test_yieldEachInNonGenerator_sync();
+  }
+
+  @override
+  @failingTest
+  test_yieldInNonGenerator_async() {
+    return super.test_yieldInNonGenerator_async();
+  }
+
+  @override
+  @failingTest
+  test_yieldInNonGenerator_sync() {
+    return super.test_yieldInNonGenerator_sync();
+  }
 }
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 1955f4a..724f3b8 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -21,92 +21,109 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(CompileTimeErrorCodeTest);
-    defineReflectiveTests(CompileTimeErrorCodeSpecTest);
   });
 }
 
 @reflectiveTest
-class CompileTimeErrorCodeSpecTest extends ResolverTestCase {
-  test_constWithTypeParameters_direct() async {
-    Source source = addSource(r'''
-class A<T> {
-  static const V = const A<T>();
-  const A();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
-      StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC
-    ]);
-    verify([source]);
+class CompileTimeErrorCodeTest extends CompileTimeErrorCodeTestBase {
+  @override
+  @failingTest
+  test_awaitInWrongContext_sync() {
+    return super.test_awaitInWrongContext_sync();
   }
 
-  test_constWithTypeParameters_indirect() async {
-    Source source = addSource(r'''
-class A<T> {
-  static const V = const A<List<T>>();
-  const A();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
-      StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC
-    ]);
-    verify([source]);
+  @override
+  @failingTest
+  test_constEvalThrowsException() {
+    return super.test_constEvalThrowsException();
   }
 
-  test_invalidTypeArgumentInConstList() async {
-    Source source = addSource(r'''
-class A<E> {
-  m() {
-    return const <E>[];
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
-    verify([source]);
+  @override
+  @failingTest
+  test_genericFunctionTypeArgument_typedef() {
+    return super.test_genericFunctionTypeArgument_typedef();
   }
 
-  test_invalidTypeArgumentInConstMap() async {
-    Source source = addSource(r'''
-class A<E> {
-  m() {
-    return const <String, E>{};
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
-    verify([source]);
+  @override
+  @failingTest
+  test_invalidIdentifierInAsync_async() {
+    return super.test_invalidIdentifierInAsync_async();
   }
 
-  test_mixinOfDisallowedClass_classTypeAlias_String_num() async {
-    Source source = addSource(r'''
-class A {}
-class C = A with String, num;''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN,
-        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
-        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-      ]);
-    } else {
-      assertErrors(source, [
-        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
-        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-      ]);
-    }
-    verify([source]);
+  @override
+  @failingTest
+  test_invalidIdentifierInAsync_await() {
+    return super.test_invalidIdentifierInAsync_await();
+  }
+
+  @override
+  @failingTest
+  test_invalidIdentifierInAsync_yield() {
+    return super.test_invalidIdentifierInAsync_yield();
+  }
+
+  @override
+  @failingTest
+  test_mixinInference_noMatchingClass_typeParametersSupplied() {
+    return super.test_mixinInference_noMatchingClass_typeParametersSupplied();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_mixinInference_recursiveSubtypeCheck() {
+    return super.test_mixinInference_recursiveSubtypeCheck();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_mixinInference_recursiveSubtypeCheck_new_syntax() {
+    return super.test_mixinInference_recursiveSubtypeCheck_new_syntax();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfNonClass() {
+    return super.test_mixinOfNonClass();
+  }
+
+  @override
+  @failingTest
+  test_objectCannotExtendAnotherClass() {
+    return super.test_objectCannotExtendAnotherClass();
+  }
+
+  @override
+  @failingTest
+  test_superInitializerInObject() {
+    return super.test_superInitializerInObject();
+  }
+
+  @override
+  @failingTest
+  test_yieldEachInNonGenerator_async() {
+    return super.test_yieldEachInNonGenerator_async();
+  }
+
+  @override
+  @failingTest
+  test_yieldEachInNonGenerator_sync() {
+    return super.test_yieldEachInNonGenerator_sync();
+  }
+
+  @override
+  @failingTest
+  test_yieldInNonGenerator_async() {
+    return super.test_yieldInNonGenerator_async();
+  }
+
+  @override
+  @failingTest
+  test_yieldInNonGenerator_sync() {
+    return super.test_yieldInNonGenerator_sync();
   }
 }
 
-@reflectiveTest
-class CompileTimeErrorCodeTest extends ResolverTestCase {
-  @override
-  AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
-
+class CompileTimeErrorCodeTestBase extends ResolverTestCase {
   disabled_test_conflictingGenericInterfaces_hierarchyLoop_infinite() async {
     // There is an interface conflict here due to a loop in the class
     // hierarchy leading to an infinite set of implemented types; this loop
@@ -526,7 +543,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_awaitInWrongContext_sync() async {
     // This test requires better error recovery than we currently have. In
     // particular, we need to be able to distinguish between an await expression
@@ -1078,7 +1094,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_constEvalThrowsException() async {
     Source source = addSource(r'''
 class C {
@@ -1505,28 +1520,6 @@
     verify([source]);
   }
 
-  test_constWithNonConst_with() async {
-    Source source = addSource(r'''
-class B {
-  const B();
-}
-class C = B with M;
-class M {}
-const x = const C();
-main() {
-  print(x);
-}
-''');
-    await computeAnalysisResult(source);
-    // TODO(a14n): the error CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE is
-    // redundant and ought to be suppressed.
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_WITH_NON_CONST,
-      CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-    ]);
-    verify([source]);
-  }
-
   test_constWithNonConstantArgument_annotation() async {
     Source source = addSource(r'''
 class A {
@@ -1582,6 +1575,34 @@
     verify([source1]);
   }
 
+  test_constWithTypeParameters_direct() async {
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<T>();
+  const A();
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+      StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC
+    ]);
+    verify([source]);
+  }
+
+  test_constWithTypeParameters_indirect() async {
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<List<T>>();
+  const A();
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+      StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC
+    ]);
+    verify([source]);
+  }
+
   test_constWithUndefinedConstructor() async {
     Source source = addSource(r'''
 class A {
@@ -2471,7 +2492,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_genericFunctionTypeArgument_typedef() async {
     // TODO(mfairhurst) diagnose these parse errors to give the correct error
     Source source = addSource(r'''
@@ -3363,7 +3383,6 @@
     // no verify() call, "B" is not resolved
   }
 
-  @failingTest
   test_invalidIdentifierInAsync_async() async {
     // TODO(brianwilkerson) Report this error.
     Source source = addSource(r'''
@@ -3377,7 +3396,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_invalidIdentifierInAsync_await() async {
     // TODO(brianwilkerson) Report this error.
     Source source = addSource(r'''
@@ -3391,7 +3409,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_invalidIdentifierInAsync_yield() async {
     // TODO(brianwilkerson) Report this error.
     Source source = addSource(r'''
@@ -3611,6 +3628,32 @@
     verify([source]);
   }
 
+  test_invalidTypeArgumentInConstList() async {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <E>[];
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
+    verify([source]);
+  }
+
+  test_invalidTypeArgumentInConstMap() async {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <String, E>{};
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
+    verify([source]);
+  }
+
   test_invalidUri_export() async {
     Source source = addSource("export 'ht:';");
     await computeAnalysisResult(source);
@@ -3816,93 +3859,6 @@
     ]);
   }
 
-  test_mixinHasNoConstructors_mixinApp() async {
-    Source source = addSource(r'''
-class B {
-  B({x});
-}
-class M {}
-class C = B with M;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
-    verify([source]);
-  }
-
-  test_mixinHasNoConstructors_mixinClass() async {
-    Source source = addSource(r'''
-class B {
-  B({x});
-}
-class M {}
-class C extends B with M {}
-''');
-    // Note: the implicit call from C's default constructor to B() should not
-    // generate a further error (despite the fact that it's not forwarded),
-    // since CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job
-    // of explaining the probem to the user.
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
-    verify([source]);
-  }
-
-  test_mixinHasNoConstructors_mixinClass_explicitSuperCall() async {
-    Source source = addSource(r'''
-class B {
-  B({x});
-}
-class M {}
-class C extends B with M {
-  C() : super();
-}
-''');
-    // Note: the explicit call from C() to B() should not generate a further
-    // error (despite the fact that it's not forwarded), since
-    // CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job of
-    // explaining the error to the user.
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
-    verify([source]);
-  }
-
-  test_mixinHasNoConstructors_mixinClass_implicitSuperCall() async {
-    Source source = addSource(r'''
-class B {
-  B({x});
-}
-class M {}
-class C extends B with M {
-  C();
-}
-''');
-    // Note: the implicit call from C() to B() should not generate a further
-    // error (despite the fact that it's not forwarded), since
-    // CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job of
-    // explaining the error to the user.
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
-    verify([source]);
-  }
-
-  test_mixinHasNoConstructors_mixinClass_namedSuperCall() async {
-    Source source = addSource(r'''
-class B {
-  B.named({x});
-}
-class M {}
-class C extends B with M {
-  C() : super.named();
-}
-''');
-    // Note: the explicit call from C() to B.named() should not generate a
-    // further error (despite the fact that it's not forwarded), since
-    // CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job of
-    // explaining the error to the user.
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
-    verify([source]);
-  }
-
   test_mixinInference_matchingClass() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -3932,6 +3888,29 @@
     assertNoErrors(source);
   }
 
+  test_mixinInference_matchingClass_inPreviousMixin_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+class B {}
+mixin M1 implements A<B> {}
+mixin M2<T> on A<T> {}
+class C extends Object with M1, M2 {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
+  test_mixinInference_matchingClass_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+class B {}
+mixin M<T> on A<T> {}
+class C extends A<int> with M {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
   test_mixinInference_noMatchingClass() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -3962,6 +3941,30 @@
         source, [CompileTimeErrorCode.MIXIN_INFERENCE_NO_MATCHING_CLASS]);
   }
 
+  test_mixinInference_noMatchingClass_namedMixinApplication_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+class B {}
+mixin M<T> on A<T> {}
+class C = Object with M;
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE]);
+  }
+
+  test_mixinInference_noMatchingClass_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+class B {}
+mixin M<T> on A<T> {}
+class C extends Object with M {}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE]);
+  }
+
   test_mixinInference_noMatchingClass_noSuperclassConstraint() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -3976,6 +3979,17 @@
     assertNoErrors(source);
   }
 
+  test_mixinInference_noMatchingClass_noSuperclassConstraint_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+class B {}
+mixin M<T> {}
+class C extends Object with M {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
   test_mixinInference_noMatchingClass_typeParametersSupplied() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -3987,10 +4001,22 @@
 class C extends Object with M<int> {}
 ''');
     await computeAnalysisResult(source);
-    assertNoErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE]);
   }
 
-  @failingTest // Does not work with old task model
+  test_mixinInference_noMatchingClass_typeParametersSupplied_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+class B {}
+mixin M<T> on A<T> {}
+class C extends Object with M<int> {}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE]);
+  }
+
   test_mixinInference_recursiveSubtypeCheck() async {
     // See dartbug.com/32353 for a detailed explanation.
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
@@ -4029,6 +4055,41 @@
     expect(mixins[0].toString(), 'ForwardingDirectory<_LocalDirectory>');
   }
 
+  test_mixinInference_recursiveSubtypeCheck_new_syntax() async {
+    // See dartbug.com/32353 for a detailed explanation.
+    Source source = addSource('''
+class ioDirectory implements ioFileSystemEntity {}
+
+class ioFileSystemEntity {}
+
+abstract class _LocalDirectory
+    extends _LocalFileSystemEntity<_LocalDirectory, ioDirectory>
+    with ForwardingDirectory, DirectoryAddOnsMixin {}
+
+abstract class _LocalFileSystemEntity<T extends FileSystemEntity,
+  D extends ioFileSystemEntity> extends ForwardingFileSystemEntity<T, D> {}
+
+abstract class FileSystemEntity implements ioFileSystemEntity {}
+
+abstract class ForwardingFileSystemEntity<T extends FileSystemEntity,
+  D extends ioFileSystemEntity> implements FileSystemEntity {}
+
+
+mixin ForwardingDirectory<T extends Directory>
+    on ForwardingFileSystemEntity<T, ioDirectory>
+    implements Directory {}
+
+abstract class Directory implements FileSystemEntity, ioDirectory {}
+
+mixin DirectoryAddOnsMixin implements Directory {}
+''');
+    var analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    var mixins =
+        analysisResult.unit.declaredElement.getType('_LocalDirectory').mixins;
+    expect(mixins[0].toString(), 'ForwardingDirectory<_LocalDirectory>');
+  }
+
   test_mixinInheritsFromNotObject_classDeclaration_extends() async {
     Source source = addSource(r'''
 class A {}
@@ -4165,7 +4226,26 @@
     verify([source]);
   }
 
-  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_String_num() async {
+    Source source = addSource(r'''
+class A {}
+class C = A with String, num;''');
+    await computeAnalysisResult(source);
+    if (previewDart2) {
+      assertErrors(source, [
+        StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN,
+        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+      ]);
+    } else {
+      assertErrors(source, [
+        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+      ]);
+    }
+    verify([source]);
+  }
+
   test_mixinOfNonClass() async {
     // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
     Source source = addSource(r'''
@@ -4327,208 +4407,6 @@
     verify([source]);
   }
 
-  test_noDefaultSuperConstructorExplicit_MixinAppWithDirectSuperCall() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B({x});
-  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
-}
-class Mixed = B with M;
-class C extends Mixed {
-  C(x) : super();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorExplicit_mixinAppWithNamedParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B({x});
-  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
-}
-class Mixed = B with M;
-class C extends Mixed {
-  C();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorExplicit_MixinAppWithNamedSuperCall() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B.named({x});
-  B.named2(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
-}
-class Mixed = B with M;
-class C extends Mixed {
-  C(x) : super.named();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
-    // Don't verify since call to super.named() can't be resolved.
-  }
-
-  test_noDefaultSuperConstructorExplicit_mixinAppWithOptionalParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B([x]);
-  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
-}
-class Mixed = B with M;
-class C extends Mixed {
-  C();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorExplicit_MixinWithDirectSuperCall() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B({x});
-  B.other();
-}
-class C extends B with M {
-  C(x) : super();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorExplicit_mixinWithNamedParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B({x});
-  B.named();
-}
-class C extends B with M {
-  C();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorExplicit_MixinWithNamedSuperCall() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B.named({x});
-  B.other();
-}
-class C extends B with M {
-  C(x) : super.named();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
-    // Don't verify since call to super.named() can't be resolved.
-  }
-
-  test_noDefaultSuperConstructorExplicit_mixinWithOptionalParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B([x]);
-  B.other();
-}
-class C extends B with M {
-  C();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorImplicit_mixinAppWithNamedParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B({x});
-  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
-}
-class Mixed = B with M;
-class C extends Mixed {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorImplicit_mixinAppWithOptionalParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B([x]);
-  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
-}
-class Mixed = B with M;
-class C extends Mixed {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorImplicit_mixinWithNamedParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B({x});
-  B.other();
-}
-class C extends B with M {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  test_noDefaultSuperConstructorImplicit_mixinWithOptionalParam() async {
-    Source source = addSource(r'''
-class M {}
-class B {
-  B([x]);
-  B.other();
-}
-class C extends B with M {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
   test_noDefaultSuperConstructorImplicit_superHasParameters() async {
     Source source = addSource(r'''
 class A {
@@ -5201,7 +5079,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_objectCannotExtendAnotherClass() async {
     Source source = addSource(r'''
 ''');
@@ -6181,7 +6058,6 @@
     // no verify(), 'super.y' is not resolved
   }
 
-  @failingTest
   test_superInitializerInObject() async {
     Source source = addSource(r'''
 ''');
@@ -6725,7 +6601,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_yieldEachInNonGenerator_async() async {
     // TODO(brianwilkerson) We are currently parsing the yield statement as a
     // binary expression.
@@ -6738,7 +6613,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_yieldEachInNonGenerator_sync() async {
     // TODO(brianwilkerson) We are currently parsing the yield statement as a
     // binary expression.
@@ -6751,7 +6625,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_yieldInNonGenerator_async() async {
     // TODO(brianwilkerson) We are currently trying to parse the yield statement
     // as a binary expression.
@@ -6764,7 +6637,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_yieldInNonGenerator_sync() async {
     // TODO(brianwilkerson) We are currently trying to parse the yield statement
     // as a binary expression.
diff --git a/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
index 270773f..c524c9c 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
@@ -13,25 +13,31 @@
 }
 
 @reflectiveTest
-class NonErrorResolverTest_Driver extends NonErrorResolverTest {
+class NonErrorResolverTest_Driver extends NonErrorResolverTestBase {
   @override
   bool get enableNewAnalysisDriver => true;
 
-  @override // Passes with driver
-  test_infer_mixin() => super.test_infer_mixin();
+  @override
+  @failingTest
+  test_constConstructorWithMixinWithField_withoutSuperMixins() {
+    return super.test_constConstructorWithMixinWithField_withoutSuperMixins();
+  }
 
-  @override // Passes with driver
-  test_infer_mixin_multiplyConstrained() =>
-      super.test_infer_mixin_multiplyConstrained();
+  @override
+  @failingTest
+  test_intLiteralInDoubleContext_const_exact() {
+    return super.test_intLiteralInDoubleContext_const_exact();
+  }
 
-  @override // Passes with driver
-  test_infer_mixin_with_substitution() =>
-      super.test_infer_mixin_with_substitution();
+  @override
+  @failingTest
+  test_null_callMethod() {
+    return super.test_null_callMethod();
+  }
 
-  @override // Passes with driver
-  test_infer_mixin_with_substitution_functionType() =>
-      super.test_infer_mixin_with_substitution_functionType();
-
-  @override // Passes with driver
-  test_issue_32394() => super.test_issue_32394();
+  @override
+  @failingTest
+  test_null_callOperator() {
+    return super.test_null_callOperator();
+  }
 }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index f411b0f..d224d7f 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -25,7 +25,99 @@
 }
 
 @reflectiveTest
-class NonErrorResolverTest extends ResolverTestCase {
+class NonErrorResolverTest extends NonErrorResolverTestBase {
+  @override
+  @failingTest
+  test_constConstructorWithMixinWithField_withoutSuperMixins() {
+    return super.test_constConstructorWithMixinWithField_withoutSuperMixins();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_infer_mixin() {
+    return super.test_infer_mixin();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_infer_mixin_multiplyConstrained() {
+    return super.test_infer_mixin_multiplyConstrained();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_infer_mixin_new_syntax() {
+    return super.test_infer_mixin_new_syntax();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_infer_mixin_with_substitution() {
+    return super.test_infer_mixin_with_substitution();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_infer_mixin_with_substitution_functionType() {
+    return super.test_infer_mixin_with_substitution_functionType();
+  }
+
+  @override
+  @failingTest
+  test_infer_mixin_with_substitution_functionType_new_syntax() {
+    return super.test_infer_mixin_with_substitution_functionType_new_syntax();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_infer_mixin_with_substitution_new_syntax() {
+    return super.test_infer_mixin_with_substitution_new_syntax();
+  }
+
+  @override
+  @failingTest
+  test_intLiteralInDoubleContext_const_exact() {
+    return super.test_intLiteralInDoubleContext_const_exact();
+  }
+
+  @override
+  @failingTest // Fails with the old task model
+  test_issue_32394() {
+    return super.test_issue_32394();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_mixin_of_mixin_type_argument_inference_cascaded_mixin() {
+    return super.test_mixin_of_mixin_type_argument_inference_cascaded_mixin();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_mixinInference_with_actual_mixins() {
+    return super.test_mixinInference_with_actual_mixins();
+  }
+
+  @override
+  @failingTest // Does not work with old task model
+  test_mixinInference_with_actual_mixins_supermixins_enabled() {
+    return super.test_mixinInference_with_actual_mixins_supermixins_enabled();
+  }
+
+  @override
+  @failingTest
+  test_null_callMethod() {
+    return super.test_null_callMethod();
+  }
+
+  @override
+  @failingTest
+  test_null_callOperator() {
+    return super.test_null_callOperator();
+  }
+}
+
+class NonErrorResolverTestBase extends ResolverTestCase {
   @override
   AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
@@ -1215,7 +1307,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_constConstructorWithMixinWithField_withoutSuperMixins() async {
     Source source = addSource(r'''
 class M {
@@ -1243,6 +1334,18 @@
     verify([source]);
   }
 
+  test_constConstructorWithMixinWithField_withSuperMixins_new_syntax() async {
+    Source source = addSource(r'''
+mixin M {
+}
+class A extends Object with M {
+  const A();
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_constConstructorWithNonConstSuper_explicit() async {
     Source source = addSource(r'''
 class A {
@@ -1756,21 +1859,6 @@
     verify([source]);
   }
 
-  test_extraPositionalArguments_implicitConstructor() async {
-    Source source = addSource(r'''
-class A<E extends num> {
-  A(E x, E y);
-}
-class M {}
-class B<E extends num> = A<E> with M;
-void main() {
-   B<int> x = new B<int>(0,0);
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_extraPositionalArguments_typedef_local() async {
     Source source = addSource(r'''
 typedef A(p1, p2);
@@ -2264,29 +2352,6 @@
     verify([source]);
   }
 
-  test_implicitConstructorDependencies() async {
-    // No warning should be generated for the code below; this requires that
-    // implicit constructors are generated for C1 before C2, even though C1
-    // follows C2 in the file.  See dartbug.com/21600.
-    Source source = addSource(r'''
-class B {
-  B(int i);
-}
-class M1 {}
-class M2 {}
-
-class C2 = C1 with M2;
-class C1 = B with M1;
-
-main() {
-  new C2(5);
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_implicitThisReferenceInInitializer_constructorName() async {
     Source source = addSource(r'''
 class A {
@@ -2613,7 +2678,6 @@
     verify([source]);
   }
 
-  @failingTest // Does not work with old task model
   test_infer_mixin() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -2637,7 +2701,6 @@
     expect(classC.mixins[0].toString(), 'M<B>');
   }
 
-  @failingTest // Does not work with old task model
   test_infer_mixin_multiplyConstrained() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -2667,7 +2730,26 @@
     expect(classF.mixins[0].toString(), 'M<C, D>');
   }
 
-  @failingTest // Does not work with old task model
+  test_infer_mixin_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+
+class B {}
+
+mixin M<T> on A<T> {}
+
+class C extends A<B> with M {}
+''');
+    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = analysisResult.unit;
+    ClassElement classC =
+        resolutionMap.elementDeclaredByCompilationUnit(unit).getType('C');
+    expect(classC.mixins, hasLength(1));
+    expect(classC.mixins[0].toString(), 'M<B>');
+  }
+
   test_infer_mixin_with_substitution() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -2691,7 +2773,6 @@
     expect(classC.mixins[0].toString(), 'M<B>');
   }
 
-  @failingTest // Does not work with old task model
   test_infer_mixin_with_substitution_functionType() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -2714,6 +2795,45 @@
     expect(classC.mixins[0].toString(), 'M<int, String>');
   }
 
+  test_infer_mixin_with_substitution_functionType_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+
+class B {}
+
+mixin M<T, U> on A<T Function(U)> {}
+
+class C extends A<int Function(String)> with M {}
+''');
+    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    CompilationUnit unit = analysisResult.unit;
+    ClassElement classC =
+        resolutionMap.elementDeclaredByCompilationUnit(unit).getType('C');
+    expect(classC.mixins, hasLength(1));
+    expect(classC.mixins[0].toString(), 'M<int, String>');
+  }
+
+  test_infer_mixin_with_substitution_new_syntax() async {
+    Source source = addSource('''
+abstract class A<T> {}
+
+class B {}
+
+mixin M<T> on A<List<T>> {}
+
+class C extends A<List<B>> with M {}
+''');
+    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = analysisResult.unit;
+    ClassElement classC =
+        resolutionMap.elementDeclaredByCompilationUnit(unit).getType('C');
+    expect(classC.mixins, hasLength(1));
+    expect(classC.mixins[0].toString(), 'M<B>');
+  }
+
   test_initializingFormalForNonExistentField() async {
     Source source = addSource(r'''
 class A {
@@ -2883,7 +3003,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_intLiteralInDoubleContext_const_exact() async {
     // TODO(mfairhurst): get the commented out assertions to pass.
     Source source = addSource(r'''
@@ -3593,7 +3712,6 @@
     verify([source]);
   }
 
-  @failingTest // Fails with the old task model
   test_issue_32394() async {
     Source source = addSource('''
 var x = y.map((a) => a.toString());
@@ -3836,6 +3954,43 @@
     verify([source]);
   }
 
+  test_mixin_of_mixin_type_argument_inference() async {
+    // In the code below, B's superclass constraints don't include A, because
+    // superclass constraints are determined from the mixin's superclass, and
+    // B's superclass is Object.  So no mixin type inference is attempted, and
+    // "with B" is interpreted as "with B<dynamic>".
+    Source source = addSource('''
+class A<T> {}
+class B<T> = Object with A<T>;
+class C = Object with B;
+''');
+    var result = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+    var bReference = result.unit.declaredElement.getType('C').mixins[0];
+    expect(bReference.typeArguments[0].toString(), 'dynamic');
+  }
+
+  test_mixin_of_mixin_type_argument_inference_cascaded_mixin() async {
+    // In the code below, B has a single superclass constraint, A1, because
+    // superclass constraints are determined from the mixin's superclass, and
+    // B's superclass is "Object with A1<T>".  So mixin type inference succeeds
+    // (since C's base class implements A1<int>), and "with B" is interpreted as
+    // "with B<int>".
+    Source source = addSource('''
+class A1<T> {}
+class A2<T> {}
+class B<T> = Object with A1<T>, A2<T>;
+class Base implements A1<int> {}
+class C = Base with B;
+''');
+    var result = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+    var bReference = result.unit.declaredElement.getType('C').mixins[0];
+    expect(bReference.typeArguments[0].toString(), 'int');
+  }
+
   test_mixinDeclaresConstructor() async {
     Source source = addSource(r'''
 class A {
@@ -3858,6 +4013,61 @@
     verify([source]);
   }
 
+  test_mixinInference_with_actual_mixins() async {
+    Source source = addSource('''
+class I<X> {}
+
+mixin M0<T> on I<T> {}
+
+mixin M1<T> on I<T> {
+  T foo() => null;
+}
+
+class A = I<int> with M0, M1;
+
+void main () {
+  var x = new A().foo();
+}
+''');
+    var result = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+    var main = result.unit.declarations.last as FunctionDeclaration;
+    var mainBody = main.functionExpression.body as BlockFunctionBody;
+    var xDecl = mainBody.block.statements[0] as VariableDeclarationStatement;
+    var xElem = xDecl.variables.variables[0].declaredElement;
+    expect(xElem.type.toString(), 'int');
+  }
+
+  test_mixinInference_with_actual_mixins_supermixins_enabled() async {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableSuperMixins = true;
+    resetWith(options: options);
+    Source source = addSource('''
+class I<X> {}
+
+mixin M0<T> on I<T> {}
+
+mixin M1<T> on I<T> {
+  T foo() => null;
+}
+
+class A = I<int> with M0, M1;
+
+void main () {
+  var x = new A().foo();
+}
+''');
+    var result = await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+    var main = result.unit.declarations.last as FunctionDeclaration;
+    var mainBody = main.functionExpression.body as BlockFunctionBody;
+    var xDecl = mainBody.block.statements[0] as VariableDeclarationStatement;
+    var xElem = xDecl.variables.variables[0].declaredElement;
+    expect(xElem.type.toString(), 'int');
+  }
+
   test_mixinInheritsFromNotObject_classDeclaration_extends() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
@@ -3865,7 +4075,17 @@
     Source source = addSource(r'''
 class A {}
 class B extends A {}
-class C extends Object with B {}''');
+class C extends A with B {}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_mixinInheritsFromNotObject_classDeclaration_extends_new_syntax() async {
+    Source source = addSource(r'''
+class A {}
+mixin B on A {}
+class C extends A with B {}''');
     await computeAnalysisResult(source);
     assertNoErrors(source);
     verify([source]);
@@ -3901,7 +4121,17 @@
     Source source = addSource(r'''
 class A {}
 class B extends A {}
-class C = Object with B;''');
+class C = A with B;''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_mixinInheritsFromNotObject_typeAlias_extends_new_syntax() async {
+    Source source = addSource(r'''
+class A {}
+mixin B on A {}
+class C = A with B;''');
     await computeAnalysisResult(source);
     assertNoErrors(source);
     verify([source]);
@@ -3944,6 +4174,17 @@
     verify([source]);
   }
 
+  test_mixinReferencesSuper_new_syntax() async {
+    Source source = addSource(r'''
+mixin A {
+  toString() => super.toString();
+}
+class B extends Object with A {}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_multipleSuperInitializers_no() async {
     Source source = addSource(r'''
 class A {}
@@ -4743,7 +4984,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_null_callMethod() async {
     Source source = addSource(r'''
 main() {
@@ -4753,7 +4993,6 @@
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
-  @failingTest
   test_null_callOperator() async {
     Source source = addSource(r'''
 main() {
@@ -5845,18 +6084,6 @@
     verify([source]);
   }
 
-  test_undefinedConstructorInInitializer_implicit_typeAlias() async {
-    Source source = addSource(r'''
-class M {}
-class A = Object with M;
-class B extends A {
-  B();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_undefinedConstructorInInitializer_redirecting() async {
     Source source = addSource(r'''
 class Foo {
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 070694e..86c3bec 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -15470,6 +15470,29 @@
     expect(statement.rightBracket, isNotNull);
   }
 
+  void test_parseSwitchStatement_labeledCase2() {
+    SwitchStatement statement =
+        parseStatement('switch (a) {l1: case 0: l2: case 1: return;}');
+    assertNoErrors();
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(2));
+    {
+      List<Label> labels = statement.members[0].labels;
+      expect(labels, hasLength(1));
+      expect(labels[0].label.inDeclarationContext(), isTrue);
+    }
+    {
+      List<Label> labels = statement.members[1].labels;
+      expect(labels, hasLength(1));
+      expect(labels[0].label.inDeclarationContext(), isTrue);
+    }
+    expect(statement.rightBracket, isNotNull);
+  }
+
   void test_parseSwitchStatement_labeledDefault() {
     var statement =
         parseStatement('switch (a) {l1: l2: l3: default:}') as SwitchStatement;
@@ -15490,6 +15513,29 @@
     expect(statement.rightBracket, isNotNull);
   }
 
+  void test_parseSwitchStatement_labeledDefault2() {
+    SwitchStatement statement =
+        parseStatement('switch (a) {l1: case 0: l2: default: return;}');
+    assertNoErrors();
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(2));
+    {
+      List<Label> labels = statement.members[0].labels;
+      expect(labels, hasLength(1));
+      expect(labels[0].label.inDeclarationContext(), isTrue);
+    }
+    {
+      List<Label> labels = statement.members[1].labels;
+      expect(labels, hasLength(1));
+      expect(labels[0].label.inDeclarationContext(), isTrue);
+    }
+    expect(statement.rightBracket, isNotNull);
+  }
+
   void test_parseSwitchStatement_labeledStatementInCase() {
     var statement = parseStatement('switch (a) {case 0: f(); l1: g(); break;}')
         as SwitchStatement;
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 0f806d1..a786c34 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -28,7 +28,6 @@
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/element_search.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -1420,7 +1419,7 @@
     _listener.assertNoErrors();
   }
 
-  void setUp() {
+  void setUp({bool shouldSetElementSupertypes: false}) {
     _listener = new GatheringErrorListener();
     MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
@@ -1435,7 +1434,8 @@
     libraryScope = new LibraryScope(element);
     _visitor = new TypeResolverVisitor(
         element, librarySource, _typeProvider, _listener,
-        nameScope: libraryScope);
+        nameScope: libraryScope,
+        shouldSetElementSupertypes: shouldSetElementSupertypes);
   }
 
   test_modeApi() async {
@@ -1882,6 +1882,7 @@
     // class B {}
     // class C {}
     // class D {}
+    setUp(shouldSetElementSupertypes: true);
     ClassElement elementA = ElementFactory.classElement2("A");
     ClassElement elementB = ElementFactory.classElement2("B");
     ClassElement elementC = ElementFactory.classElement2("C");
@@ -1911,6 +1912,7 @@
     // class B extends A {
     //   void A() {}
     // }
+    setUp(shouldSetElementSupertypes: true);
     ClassElementImpl elementA = ElementFactory.classElement2("A");
     ClassElementImpl elementB = ElementFactory.classElement2("B");
     elementB.methods = <MethodElement>[
@@ -1926,124 +1928,6 @@
     _listener.assertNoErrors();
   }
 
-  test_visitClassTypeAlias() async {
-    // class A = B with C implements D;
-    ClassElement elementA = ElementFactory.classElement2("A");
-    ClassElement elementB = ElementFactory.classElement2("B");
-    ClassElement elementC = ElementFactory.classElement2("C");
-    ClassElement elementD = ElementFactory.classElement2("D");
-    WithClause withClause =
-        AstTestFactory.withClause([AstTestFactory.typeName(elementC)]);
-    ImplementsClause implementsClause =
-        AstTestFactory.implementsClause([AstTestFactory.typeName(elementD)]);
-    ClassTypeAlias alias = AstTestFactory.classTypeAlias("A", null, null,
-        AstTestFactory.typeName(elementB), withClause, implementsClause);
-    alias.name.staticElement = elementA;
-    _resolveNode(alias, [elementA, elementB, elementC, elementD]);
-    expect(elementA.supertype, same(elementB.type));
-    List<InterfaceType> mixins = elementA.mixins;
-    expect(mixins, hasLength(1));
-    expect(mixins[0], same(elementC.type));
-    List<InterfaceType> interfaces = elementA.interfaces;
-    expect(interfaces, hasLength(1));
-    expect(interfaces[0], same(elementD.type));
-    _listener.assertNoErrors();
-  }
-
-  test_visitClassTypeAlias_constructorWithOptionalParams_ignored() async {
-    // class T {}
-    // class B {
-    //   B.c1();
-    //   B.c2([T a0]);
-    //   B.c3({T a0});
-    // }
-    // class M {}
-    // class C = B with M
-    ClassElement classT = ElementFactory.classElement2('T', []);
-    ClassElementImpl classB = ElementFactory.classElement2('B', []);
-    ConstructorElementImpl constructorBc1 =
-        ElementFactory.constructorElement2(classB, 'c1', []);
-    ConstructorElementImpl constructorBc2 =
-        ElementFactory.constructorElement2(classB, 'c2', [classT.type]);
-    (constructorBc2.parameters[0] as ParameterElementImpl).parameterKind =
-        ParameterKind.POSITIONAL;
-    ConstructorElementImpl constructorBc3 =
-        ElementFactory.constructorElement2(classB, 'c3', [classT.type]);
-    (constructorBc3.parameters[0] as ParameterElementImpl).parameterKind =
-        ParameterKind.NAMED;
-    classB.constructors = [constructorBc1, constructorBc2, constructorBc3];
-    ClassElement classM = ElementFactory.classElement2('M', []);
-    WithClause withClause =
-        AstTestFactory.withClause([AstTestFactory.typeName(classM, [])]);
-    ClassElement classC = ElementFactory.classTypeAlias2('C', []);
-    ClassTypeAlias alias = AstTestFactory.classTypeAlias(
-        'C', null, null, AstTestFactory.typeName(classB, []), withClause, null);
-    alias.name.staticElement = classC;
-    _resolveNode(alias, [classT, classB, classM, classC]);
-    expect(classC.constructors, hasLength(1));
-    ConstructorElement constructor = classC.constructors[0];
-    expect(constructor.isFactory, isFalse);
-    expect(constructor.isSynthetic, isTrue);
-    expect(constructor.name, 'c1');
-    expect(constructor.parameters, isEmpty);
-  }
-
-  test_visitClassTypeAlias_constructorWithParams() async {
-    // class T {}
-    // class B {
-    //   B(T a0);
-    // }
-    // class M {}
-    // class C = B with M
-    ClassElement classT = ElementFactory.classElement2('T', []);
-    ClassElementImpl classB = ElementFactory.classElement2('B', []);
-    ConstructorElementImpl constructorB =
-        ElementFactory.constructorElement2(classB, '', [classT.type]);
-    classB.constructors = [constructorB];
-    ClassElement classM = ElementFactory.classElement2('M', []);
-    WithClause withClause =
-        AstTestFactory.withClause([AstTestFactory.typeName(classM, [])]);
-    ClassElement classC = ElementFactory.classTypeAlias2('C', []);
-    ClassTypeAlias alias = AstTestFactory.classTypeAlias(
-        'C', null, null, AstTestFactory.typeName(classB, []), withClause, null);
-    alias.name.staticElement = classC;
-    _resolveNode(alias, [classT, classB, classM, classC]);
-    expect(classC.constructors, hasLength(1));
-    ConstructorElement constructor = classC.constructors[0];
-    expect(constructor.isFactory, isFalse);
-    expect(constructor.isSynthetic, isTrue);
-    expect(constructor.name, '');
-    expect(constructor.parameters, hasLength(1));
-    expect(constructor.parameters[0].type, equals(classT.type));
-    expect(constructor.parameters[0].name,
-        equals(constructorB.parameters[0].name));
-  }
-
-  test_visitClassTypeAlias_defaultConstructor() async {
-    // class B {}
-    // class M {}
-    // class C = B with M
-    ClassElementImpl classB = ElementFactory.classElement2('B', []);
-    ConstructorElementImpl constructorB =
-        ElementFactory.constructorElement2(classB, '', []);
-    constructorB.setModifier(Modifier.SYNTHETIC, true);
-    classB.constructors = [constructorB];
-    ClassElement classM = ElementFactory.classElement2('M', []);
-    WithClause withClause =
-        AstTestFactory.withClause([AstTestFactory.typeName(classM, [])]);
-    ClassElement classC = ElementFactory.classTypeAlias2('C', []);
-    ClassTypeAlias alias = AstTestFactory.classTypeAlias(
-        'C', null, null, AstTestFactory.typeName(classB, []), withClause, null);
-    alias.name.staticElement = classC;
-    _resolveNode(alias, [classB, classM, classC]);
-    expect(classC.constructors, hasLength(1));
-    ConstructorElement constructor = classC.constructors[0];
-    expect(constructor.isFactory, isFalse);
-    expect(constructor.isSynthetic, isTrue);
-    expect(constructor.name, '');
-    expect(constructor.parameters, isEmpty);
-  }
-
   test_visitFieldFormalParameter_functionType() async {
     InterfaceType intType = _typeProvider.intType;
     TypeName intTypeName = AstTestFactory.typeName4('int');
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index b29d20d..5003da0 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -1389,6 +1389,17 @@
     assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
   }
 
+  test_generalizedVoid_negateVoidValueError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  !x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
   test_generalizedVoid_throwVoidValueError() async {
     Source source = addSource(r'''
 void main() {
@@ -1400,6 +1411,21 @@
     assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
   }
 
+  test_generalizedVoid_unaryNegativeVoidValueError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  -x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [
+      StaticWarningCode.USE_OF_VOID_RESULT,
+      // TODO(mfairhurst) suppress UNDEFINED_OPERATOR
+      StaticTypeWarningCode.UNDEFINED_OPERATOR
+    ]);
+  }
+
   test_generalizedVoid_useOfInForeachIterableError() async {
     Source source = addSource(r'''
 void main() {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index ca03d8e..1fd77a5 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2311,6 +2311,17 @@
     expect(_getTopLevelVarType(result.unit, 'b'), 'B');
   }
 
+  test_instantiateToBounds_invalid() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class A<T extends B> {}
+class B<T extends A<B>> {}
+''');
+
+    driver.addFile(a);
+    await waitForIdleWithoutExceptions();
+  }
+
   test_knownFiles() async {
     var a = _p('/test/lib/a.dart');
     var b = _p('/test/lib/b.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 0379c6b..104997b 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -588,6 +588,43 @@
     expect(files, [filePackageUri, fileFileUri]);
   }
 
+  test_getFilesSubtypingName() {
+    String a = _p('/a.dart');
+    String b = _p('/b.dart');
+
+    provider.newFile(a, r'''
+class A {}
+class B extends A {}
+''');
+    provider.newFile(b, r'''
+class A {}
+class D implements A {}
+''');
+
+    FileState aFile = fileSystemState.getFileForPath(a);
+    FileState bFile = fileSystemState.getFileForPath(b);
+
+    expect(
+      fileSystemState.getFilesSubtypingName('A'),
+      unorderedEquals([aFile, bFile]),
+    );
+
+    // Change b.dart so that it does not subtype A.
+    provider.newFile(b, r'''
+class C {}
+class D implements C {}
+''');
+    bFile.refresh();
+    expect(
+      fileSystemState.getFilesSubtypingName('A'),
+      unorderedEquals([aFile]),
+    );
+    expect(
+      fileSystemState.getFilesSubtypingName('C'),
+      unorderedEquals([bFile]),
+    );
+  }
+
   test_hasUri() {
     Uri uri = Uri.parse('package:aaa/foo.dart');
     String templatePath = _p('/aaa/lib/foo.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 179e4c4..e3106d1 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -1014,27 +1014,20 @@
 }
 ''');
 
-    {
-      AnalysisDriverSubtype X =
-          index.subtypes.singleWhere((t) => t.name == 'X');
-      expect(X.supertypes, ['$libP;A']);
-      expect(X.members, ['field1', 'field2', 'getter1', 'method1', 'setter1']);
-    }
+    expect(index.supertypes, hasLength(6));
+    expect(index.subtypes, hasLength(6));
 
-    {
-      AnalysisDriverSubtype Y =
-          index.subtypes.singleWhere((t) => t.name == 'Y');
-      expect(
-          Y.supertypes, ['dart:core;dart:core;Object', '$libP;B', '$libP;C']);
-      expect(Y.members, ['methodY']);
-    }
-
-    {
-      AnalysisDriverSubtype Z =
-          index.subtypes.singleWhere((t) => t.name == 'Z');
-      expect(Z.supertypes, ['$libP;D', '$libP;E']);
-      expect(Z.members, ['methodZ']);
-    }
+    _assertSubtype(0, 'dart:core;dart:core;Object', 'Y', ['methodY']);
+    _assertSubtype(
+      1,
+      '$libP;A',
+      'X',
+      ['field1', 'field2', 'getter1', 'method1', 'setter1'],
+    );
+    _assertSubtype(2, '$libP;B', 'Y', ['methodY']);
+    _assertSubtype(3, '$libP;C', 'Y', ['methodY']);
+    _assertSubtype(4, '$libP;D', 'Z', ['methodZ']);
+    _assertSubtype(5, '$libP;E', 'Z', ['methodZ']);
   }
 
   test_subtypes_classTypeAlias() async {
@@ -1052,19 +1045,16 @@
 class Y = A with B implements C, D;
 ''');
 
-    {
-      AnalysisDriverSubtype X =
-          index.subtypes.singleWhere((t) => t.name == 'X');
-      expect(X.supertypes, ['$libP;A', '$libP;B', '$libP;C']);
-      expect(X.members, isEmpty);
-    }
+    expect(index.supertypes, hasLength(7));
+    expect(index.subtypes, hasLength(7));
 
-    {
-      AnalysisDriverSubtype Y =
-          index.subtypes.singleWhere((t) => t.name == 'Y');
-      expect(Y.supertypes, ['$libP;A', '$libP;B', '$libP;C', '$libP;D']);
-      expect(Y.members, isEmpty);
-    }
+    _assertSubtype(0, '$libP;A', 'X', []);
+    _assertSubtype(1, '$libP;A', 'Y', []);
+    _assertSubtype(2, '$libP;B', 'X', []);
+    _assertSubtype(3, '$libP;B', 'Y', []);
+    _assertSubtype(4, '$libP;C', 'X', []);
+    _assertSubtype(5, '$libP;C', 'Y', []);
+    _assertSubtype(6, '$libP;D', 'Y', []);
   }
 
   test_subtypes_dynamic() async {
@@ -1074,9 +1064,8 @@
 }
 ''');
 
-    AnalysisDriverSubtype X = index.subtypes.singleWhere((t) => t.name == 'X');
-    expect(X.supertypes, isEmpty);
-    expect(X.members, ['foo']);
+    expect(index.supertypes, isEmpty);
+    expect(index.subtypes, isEmpty);
   }
 
   test_subtypes_mixinDeclaration() async {
@@ -1095,17 +1084,15 @@
 mixin Y on A, B implements C;
 ''');
 
-    {
-      var X = index.subtypes.singleWhere((t) => t.name == 'X');
-      expect(X.supertypes, ['$libP;A', '$libP;B', '$libP;C']);
-      expect(X.members, isEmpty);
-    }
+    expect(index.supertypes, hasLength(6));
+    expect(index.subtypes, hasLength(6));
 
-    {
-      var Y = index.subtypes.singleWhere((t) => t.name == 'Y');
-      expect(Y.supertypes, ['$libP;A', '$libP;B', '$libP;C']);
-      expect(Y.members, isEmpty);
-    }
+    _assertSubtype(0, '$libP;A', 'X', []);
+    _assertSubtype(1, '$libP;A', 'Y', []);
+    _assertSubtype(2, '$libP;B', 'X', []);
+    _assertSubtype(3, '$libP;B', 'Y', []);
+    _assertSubtype(4, '$libP;C', 'X', []);
+    _assertSubtype(5, '$libP;C', 'Y', []);
   }
 
   test_usedName_inLibraryIdentifier() async {
@@ -1213,6 +1200,14 @@
         'not found\n$element $expectedRelationKind at $expectedLocation');
   }
 
+  void _assertSubtype(
+      int i, String superEncoded, String subName, List<String> members) {
+    expect(index.strings[index.supertypes[i]], superEncoded);
+    var subtype = index.subtypes[i];
+    expect(index.strings[subtype.name], subName);
+    expect(_decodeStringList(subtype.members), members);
+  }
+
   void _assertUsedName(String name, IndexRelationKind kind,
       ExpectedLocation expectedLocation, bool isNot) {
     int nameId = _getStringId(name);
@@ -1233,6 +1228,10 @@
     _failWithIndexDump('Not found $name $kind at $expectedLocation');
   }
 
+  List<String> _decodeStringList(List<int> stringIds) {
+    return stringIds.map((i) => index.strings[i]).toList();
+  }
+
   ExpectedLocation _expectedLocation(String search, bool isQualified,
       {int length}) {
     int offset = findOffset(search);
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 7f21b03..c07703f 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
new file mode 100644
index 0000000..aea7e0f
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
@@ -0,0 +1,136 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ClassAliasDriverResolutionTest);
+    defineReflectiveTests(ClassAliasTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class ClassAliasDriverResolutionTest extends DriverResolutionTest
+    with ClassAliasResolutionMixin {}
+
+abstract class ClassAliasResolutionMixin implements ResolutionTest {
+  test_defaultConstructor() async {
+    addTestFile(r'''
+class A {}
+class M {}
+class X = A with M;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    assertConstructors(findElement.class_('X'), ['X() → X']);
+  }
+
+  test_element() async {
+    addTestFile(r'''
+class A {}
+class B {}
+class C {}
+
+class X = A with B implements C;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var x = findElement.class_('X');
+
+    assertTypeName(findNode.typeName('A with'), findElement.class_('A'), 'A');
+    assertTypeName(findNode.typeName('B impl'), findElement.class_('B'), 'B');
+    assertTypeName(findNode.typeName('C;'), findElement.class_('C'), 'C');
+
+    assertElementTypeString(x.supertype, 'A');
+    assertElementTypeStrings(x.mixins, ['B']);
+    assertElementTypeStrings(x.interfaces, ['C']);
+  }
+
+  @failingTest
+  test_implicitConstructors_const() async {
+    addTestFile(r'''
+class A {
+  const A();
+}
+
+class M {}
+
+class C = A with M;
+
+const x = const C();
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    // TODO(scheglov) add also negative test with fields
+  }
+
+  test_implicitConstructors_dependencies() async {
+    addTestFile(r'''
+class A {
+  A(int i);
+}
+class M1 {}
+class M2 {}
+
+class C2 = C1 with M2;
+class C1 = A with M1;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertConstructors(findElement.class_('C1'), ['C1(int i) → C1']);
+    assertConstructors(findElement.class_('C2'), ['C2(int i) → C2']);
+  }
+
+  test_implicitConstructors_optionalParameters() async {
+    addTestFile(r'''
+class A {
+  A.c1(int a);
+  A.c2(int a, [int b, int c]);
+  A.c3(int a, {int b, int c});
+}
+
+class M {}
+
+class C = A with M;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertConstructors(
+      findElement.class_('C'),
+      [
+        'C.c1(int a) → C',
+        'C.c2(int a, [int b, int c]) → C',
+        'C.c3(int a, {int b, int c}) → C'
+      ],
+    );
+  }
+
+  test_implicitConstructors_requiredParameters() async {
+    addTestFile(r'''
+class A<T extends num> {
+  A(T x, T y);
+}
+
+class M {}
+
+class B<E extends num> = A<E> with M;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertConstructors(findElement.class_('B'), ['B(E x, E y) → B<E>']);
+  }
+}
+
+@reflectiveTest
+class ClassAliasTaskResolutionTest extends TaskResolutionTest
+    with ClassAliasResolutionMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 7edebf0..02afc12 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -92,6 +96,33 @@
     assertElement(findNode.simple('foo; // ref'), findElement.method('foo'));
   }
 
+  test_abstractSuperMemberReference_noSuchMethod() async {
+    setAnalysisOptions(enableSuperMixins: true);
+    addTestFile('''
+class A {
+  void foo();
+  noSuchMethod(im) {}
+}
+
+abstract class B {
+  void foo();
+  noSuchMethod(im) {}
+}
+
+class C extends A with B {
+  void bar() {
+    super.foo(); // ref
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertElement(
+      findNode.simple('foo(); // ref'),
+      findElement.method('foo', of: 'B'),
+    );
+  }
+
   test_abstractSuperMemberReference_OK_mixinHasConcrete2_method() async {
     addTestFile('''
 class A {
@@ -117,33 +148,6 @@
     );
   }
 
-  test_abstractSuperMemberReference_OK_noSuchMethod() async {
-    setAnalysisOptions(enableSuperMixins: true);
-    addTestFile('''
-class A {
-  void foo();
-  noSuchMethod(im) {}
-}
-
-abstract class B {
-  void foo();
-  noSuchMethod(im) {}
-}
-
-class C extends A with B {
-  void bar() {
-    super.foo(); // ref
-  }
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-    assertElement(
-      findNode.simple('foo(); // ref'),
-      findElement.method('foo', of: 'B'),
-    );
-  }
-
   test_abstractSuperMemberReference_OK_superHasConcrete_mixinHasAbstract_method() async {
     addTestFile('''
 class A {
diff --git a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
index 2f4059c..1ad3cfa 100644
--- a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index 2171622..d30bf67 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/resolution/find_element.dart b/pkg/analyzer/test/src/dart/resolution/find_element.dart
index fe7cb76..dff0500 100644
--- a/pkg/analyzer/test/src/dart/resolution/find_element.dart
+++ b/pkg/analyzer/test/src/dart/resolution/find_element.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -95,6 +99,15 @@
     fail('Not found top-level function: $name');
   }
 
+  GenericTypeAliasElement genericTypeAlias(String name) {
+    for (var element in unitElement.functionTypeAliases) {
+      if (element is GenericTypeAliasElement && element.name == name) {
+        return element;
+      }
+    }
+    fail('Not found generic type alias: $name');
+  }
+
   PropertyAccessorElement getter(String name, {String className}) {
     for (var class_ in unitElement.types) {
       if (className != null && class_.name != className) {
diff --git a/pkg/analyzer/test/src/dart/resolution/find_node.dart b/pkg/analyzer/test/src/dart/resolution/find_node.dart
index 2b99226..67271af 100644
--- a/pkg/analyzer/test/src/dart/resolution/find_node.dart
+++ b/pkg/analyzer/test/src/dart/resolution/find_node.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/for_in_test.dart b/pkg/analyzer/test/src/dart/resolution/for_in_test.dart
index 3062f41..fdbdd76 100644
--- a/pkg/analyzer/test/src/dart/resolution/for_in_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/for_in_test.dart
@@ -1,3 +1,7 @@
+// 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:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart b/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart
index d860e9c..82ae780 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
new file mode 100644
index 0000000..7f24421a
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GenericTypeAliasDriverResolutionTest);
+    defineReflectiveTests(GenericTypeAliasTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class GenericTypeAliasDriverResolutionTest extends DriverResolutionTest
+    with GenericTypeAliasResolutionMixin {}
+
+abstract class GenericTypeAliasResolutionMixin implements ResolutionTest {
+  test_typeParameters() async {
+    addTestFile(r'''
+class A {}
+
+class B {}
+
+typedef F<T extends A> = B<T> Function<U extends B>(T a, U b);
+''');
+    await resolveTestFile();
+
+    var f = findElement.genericTypeAlias('F');
+    expect(f.typeParameters, hasLength(1));
+
+    var t = f.typeParameters[0];
+    expect(t.name, 'T');
+    assertElementTypeString(t.bound, 'A');
+
+    var ff = f.function;
+    expect(ff.typeParameters, hasLength(1));
+
+    var u = ff.typeParameters[0];
+    expect(u.name, 'U');
+    assertElementTypeString(u.bound, 'B');
+  }
+}
+
+@reflectiveTest
+class GenericTypeAliasTaskResolutionTest extends TaskResolutionTest
+    with GenericTypeAliasResolutionMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart b/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
index ea22bc8..a269e79 100644
--- a/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index 6ac6d4c..ddcfe34 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index c06d210..52d0187 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -1,3 +1,7 @@
+// 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:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -165,6 +169,10 @@
     expect(element.typeParameters, isEmpty);
 
     expect(element.supertype, isNull);
+    expect(element.isAbstract, isTrue);
+    expect(element.isEnum, isFalse);
+    expect(element.isMixin, isTrue);
+    expect(element.isMixinApplication, isFalse);
     expect(element.type.isObject, isFalse);
 
     assertElementTypes(element.superclassConstraints, [objectType]);
@@ -914,6 +922,50 @@
     ]);
   }
 
+  test_error_mixinApplicationNoConcreteSuperInvokedMember_inNextMixin() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+mixin M1 on A {
+  void foo() {
+    super.foo();
+  }
+}
+
+mixin M2 on A {
+  void foo() {}
+}
+
+class X extends A with M1, M2 {}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
+    ]);
+  }
+
+  test_error_mixinApplicationNoConcreteSuperInvokedMember_inSameMixin() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void foo() {
+    super.foo();
+  }
+}
+
+class X extends A with M {}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
+    ]);
+  }
+
   test_error_mixinApplicationNoConcreteSuperInvokedMember_method() async {
     addTestFile(r'''
 abstract class A {
@@ -956,6 +1008,30 @@
     assertNoTestErrors();
   }
 
+  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_inSuper_fromMixin() async {
+    addTestFile(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M1 {
+  void foo() {}
+}
+
+class B extends A with M1 {}
+
+mixin M2 on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class X extends B with M2 {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
   test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_notInvoked() async {
     addTestFile(r'''
 abstract class A {
@@ -1507,6 +1583,30 @@
     ]);
   }
 
+  test_isMoreSpecificThan() async {
+    addTestFile(r'''
+mixin M {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var element = findElement.mixin('M');
+    var type = element.type;
+    expect(type.isMoreSpecificThan(intType), isFalse);
+  }
+
+  test_lookUpMemberInInterfaces_Object() async {
+    addTestFile(r'''
+class Foo {}
+
+mixin UnhappyMixin on Foo {
+  String toString() => '$runtimeType';
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
   test_metadata() async {
     addTestFile(r'''
 const a = 0;
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index e01671b..27ee8fb 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -56,6 +60,13 @@
     newFile('/test/lib/test.dart', content: content);
   }
 
+  void assertConstructors(ClassElement class_, List<String> expected) {
+    expect(
+      class_.constructors.map((c) => c.toString()).toList(),
+      unorderedEquals(expected),
+    );
+  }
+
   void assertElement(AstNode node, Element expected) {
     Element actual = getNodeElement(node);
     expect(actual, same(expected));
@@ -96,6 +107,10 @@
     expect(type.toString(), expected);
   }
 
+  void assertElementTypeStrings(List<DartType> types, List<String> expected) {
+    expect(types.map((t) => t.displayName).toList(), expected);
+  }
+
   void assertEnclosingElement(Element element, Element expectedEnclosing) {
     expect(element.enclosingElement, expectedEnclosing);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/task_resolution.dart b/pkg/analyzer/test/src/dart/resolution/task_resolution.dart
index 4fcb693..3bfd858 100644
--- a/pkg/analyzer/test/src/dart/resolution/task_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/task_resolution.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index d93d42c..744c8d9 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -8,6 +8,7 @@
 import 'class_test.dart' as class_test;
 import 'enum_test.dart' as enum_test;
 import 'for_in_test.dart' as for_in_test;
+import 'generic_type_alias_test.dart' as generic_type_alias_test;
 import 'import_prefix_test.dart' as import_prefix_test;
 import 'instance_creation_test.dart' as instance_creation_test;
 import 'instance_member_inference_class_test.dart'
@@ -15,6 +16,7 @@
 import 'instance_member_inference_mixin_test.dart'
     as instance_member_inference_mixin_test;
 import 'mixin_test.dart' as mixin_test;
+import 'top_type_inference_test.dart' as top_type_inference_test;
 
 main() {
   defineReflectiveSuite(() {
@@ -22,10 +24,12 @@
     class_test.main();
     enum_test.main();
     for_in_test.main();
+    generic_type_alias_test.main();
     import_prefix_test.main();
     instance_creation_test.main();
     instance_member_inference_class_test.main();
     instance_member_inference_mixin_test.main();
     mixin_test.main();
+    top_type_inference_test.main();
   }, name: 'resolution');
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart b/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
new file mode 100644
index 0000000..3b6eb93
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
@@ -0,0 +1,55 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(TopTypeInferenceDriverResolutionTest);
+    defineReflectiveTests(TopTypeInferenceTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class TopTypeInferenceDriverResolutionTest extends DriverResolutionTest
+    with TopTypeInstanceMixin {}
+
+@reflectiveTest
+class TopTypeInferenceTaskResolutionTest extends TaskResolutionTest
+    with TopTypeInstanceMixin {}
+
+abstract class TopTypeInstanceMixin implements ResolutionTest {
+  test_referenceInstanceVariable_withDeclaredType() async {
+    addTestFile(r'''
+class A {
+  final int a = b + 1;
+}
+final b = new A().a;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElementTypeString(findElement.field('a').type, 'int');
+    assertElementTypeString(findElement.topVar('b').type, 'int');
+  }
+
+  test_referenceInstanceVariable_withoutDeclaredType() async {
+    addTestFile(r'''
+class A {
+  final a = b + 1;
+}
+final b = new A().a;
+''');
+    await resolveTestFile();
+    assertTestErrors([StrongModeCode.TOP_LEVEL_INSTANCE_GETTER]);
+
+    assertElementTypeDynamic(findElement.field('a').type);
+    assertElementTypeDynamic(findElement.topVar('b').type);
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart
index c61a1dc..3f834fd 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart
@@ -20,7 +20,38 @@
               ParserErrorCode.MISSING_INITIALIZER,
               ParserErrorCode.MISSING_FUNCTION_BODY
             ],
-            'C() {}',
+            'C() : _s_ = _s_ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+            failing: ['methodNonVoid', 'getter', 'setter'],
+          ),
+          new TestDescriptor(
+            'colon_field',
+            'C() : f',
+            [
+              ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : f = _s_ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+          ),
+          new TestDescriptor(
+            'colon_field_increment',
+            'C() : f++',
+            [
+              ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : _s_ = f++ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+          ),
+          new TestDescriptor(
+            'colon_field_comma',
+            'C() : f = 0,',
+            [
+              ParserErrorCode.MISSING_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : f = 0, _s_ = _s_ {}',
             adjustValidUnitBeforeComparison: setSeparator,
             failing: ['methodNonVoid', 'getter', 'setter'],
           ),
@@ -28,14 +59,14 @@
             'colon_block',
             'C() : {}',
             [ParserErrorCode.MISSING_INITIALIZER],
-            'C() {}',
+            'C() : _s_ = _s_ {}',
             adjustValidUnitBeforeComparison: setSeparator,
           ),
           new TestDescriptor(
             'colon_semicolon',
             'C() : ;',
             [ParserErrorCode.MISSING_INITIALIZER],
-            'C();',
+            'C() : _s_ = _s_ ;',
             adjustValidUnitBeforeComparison: setSeparator,
           ),
           new TestDescriptor(
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 09b1a87..d913441 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -169,7 +169,7 @@
     writeDocumentation(e);
     writeMetadata(e, '', '\n');
 
-    writeIf(e.isAbstract, 'abstract ');
+    writeIf(e.isAbstract && !e.isMixin, 'abstract ');
 
     if (e.isEnum) {
       buffer.write('enum ');
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index 9568a0b..3622597 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -527,7 +527,7 @@
 ''');
     LibraryElementForLink library = linker.getLibrary(testDartUri);
     expect(_getVariable(library.getContainedName('x')).inferredType.toString(),
-        'int');
+        'dynamic');
   }
 
   void test_inferredTypeFromOutsideBuildUnit_instanceField_toInstanceField() {
@@ -545,7 +545,7 @@
 ''');
     LibraryElementForLink library = linker.getLibrary(testDartUri);
     ClassElementForLink_Class classD = library.getContainedName('D');
-    expect(classD.fields[0].inferredType.toString(), 'int');
+    expect(classD.fields[0].inferredType.toString(), 'dynamic');
   }
 
   void test_inferredTypeFromOutsideBuildUnit_methodParamType_viaInheritance() {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index ab472d5..d9a2ab2 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -267,8 +267,8 @@
   Base();
   Base.noArgs();
   Base.requiredArg(x);
-  Base.positionalArg([x]);
-  Base.namedArg({x});
+  Base.positionalArg([bool x = true]);
+  Base.namedArg({int x = 42});
   factory Base.fact() => null;
   factory Base.fact2() = Base.noArgs;
 }
@@ -286,6 +286,8 @@
   synthetic MixinApp() = Base;
   synthetic MixinApp.noArgs() = Base.noArgs;
   synthetic MixinApp.requiredArg(dynamic x) = Base.requiredArg;
+  synthetic MixinApp.positionalArg([bool x = true]) = Base.positionalArg;
+  synthetic MixinApp.namedArg({int x: 42}) = Base.namedArg;
   synthetic MixinApp.fact() = Base.fact;
   synthetic MixinApp.fact2() = Base.fact2;
 }
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 4d895f0..939596c 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -697,7 +697,7 @@
 ''');
     checkElementText(library, r'''
 import 'a.dart';
-int t1;
+dynamic t1;
 ''');
   }
 
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index 61e3f65..3e99766 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -122,7 +122,7 @@
       out.writeln('const $className _$errorCode =');
       out.writeln('const $className(');
       out.writeln("'$errorCode',");
-      out.writeln('"${entry['template']}"');
+      out.writeln('r"${entry['template']}"');
       final tip = entry['tip'];
       if (tip is String) {
         out.writeln(',correction: "$tip"');
@@ -138,7 +138,7 @@
     for (Map entry in translatedEntries) {
       final name = nameForEntry(entry);
       final errorCode = name[1];
-      if (errorConverterSource.contains(errorCode)) {
+      if (errorConverterSource.contains('"$errorCode"')) {
         if (converterCount == 0) {
           print('');
           print('The following ParserErrorCodes could be removed'
diff --git a/pkg/analyzer/tool/summary/build_sdk_summaries.dart b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
index 78642c2..aec1b06 100644
--- a/pkg/analyzer/tool/summary/build_sdk_summaries.dart
+++ b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
@@ -4,7 +4,7 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/summary/summary_file_builder.dart';
 
-main(List<String> args) {
+void main(List<String> args) {
   String command;
   String outFilePath;
   String sdkPath;
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 4d18427..2e9ce1b 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -485,6 +485,11 @@
     List list = pop();
     return list != null ? new List<T>.from(list) : null;
   }
+
+  List popList(int n, List list) {
+    if (n == 0) return null;
+    return stack.popList(n, list, null);
+  }
 }
 
 /// Parser intended for use with [MiniAstBuilder].
diff --git a/pkg/analyzer_cli/bin/fix.dart b/pkg/analyzer_cli/bin/fix.dart
new file mode 100644
index 0000000..2ef38e4
--- /dev/null
+++ b/pkg/analyzer_cli/bin/fix.dart
@@ -0,0 +1,14 @@
+#!/usr/bin/env dart
+// 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:analyzer_cli/src/fix/driver.dart';
+
+/// The entry point for dartfix.
+main(List<String> args) async {
+  Driver starter = new Driver();
+
+  // Wait for the starter to complete.
+  await starter.start(args);
+}
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index db9192d..4390547 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -28,6 +28,7 @@
 import 'package:analyzer/src/source/sdk_ext.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/summary/summary_file_builder.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/yaml.dart';
@@ -210,6 +211,22 @@
       }
     }
 
+    // When training a snapshot, in addition to training regular analysis
+    // (above), we train build mode as well.
+    if (options.trainSnapshot) {
+      // TODO(devoncarew): Iterate on this training to make it more
+      // representative of what we see internally; call into _buildModeAnalyze()
+      // with some appropriate options.
+      print('\nGenerating strong mode summary...');
+      final Stopwatch stopwatch = new Stopwatch()..start();
+
+      new SummaryBuilder.forSdk(options.dartSdkPath).build();
+      new SummaryBuilder.forSdk(options.dartSdkPath).build();
+      new SummaryBuilder.forSdk(options.dartSdkPath).build();
+
+      print('Done in ${stopwatch.elapsedMilliseconds} ms.');
+    }
+
     if (analysisDriver != null) {
       _analyzedFileCount += analysisDriver.knownFiles.length;
     }
@@ -564,8 +581,9 @@
     // If we have the analysis driver, and the new analysis options are the
     // same, we can reuse this analysis driver.
     if (analysisDriver != null &&
-        _equalAnalysisOptions(
-            analysisDriver.analysisOptions, analysisOptions)) {
+        AnalysisOptions.signaturesEqual(
+            analysisDriver.analysisOptions.signature,
+            analysisOptions.signature)) {
       return;
     }
 
@@ -645,21 +663,6 @@
     return null;
   }
 
-  /// Return whether [a] and [b] options are equal for the purpose of
-  /// command line analysis.
-  bool _equalAnalysisOptions(AnalysisOptions a, AnalysisOptions b) {
-    return a.enableLazyAssignmentOperators == b.enableLazyAssignmentOperators &&
-        a.enableSuperMixins == b.enableSuperMixins &&
-        a.enableTiming == b.enableTiming &&
-        a.generateImplicitErrors == b.generateImplicitErrors &&
-        a.generateSdkErrors == b.generateSdkErrors &&
-        a.hint == b.hint &&
-        a.lint == b.lint &&
-        AnalysisOptionsImpl.compareLints(a.lintRules, b.lintRules) &&
-        a.preserveComments == b.preserveComments &&
-        a.useFastaParser == b.useFastaParser;
-  }
-
   _PackageInfo _findPackages(CommandLineOptions options) {
     if (packageResolverProvider != null) {
       // The resolver provider will do all the work later.
diff --git a/pkg/analyzer_cli/lib/src/fix/driver.dart b/pkg/analyzer_cli/lib/src/fix/driver.dart
new file mode 100644
index 0000000..5888e26
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/fix/driver.dart
@@ -0,0 +1,212 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+
+import 'package:analyzer_cli/src/fix/options.dart';
+import 'package:analyzer_cli/src/fix/server.dart';
+import 'package:analysis_server/src/protocol/protocol_internal.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+
+class Driver {
+  static const timeout = const Duration(seconds: 5);
+
+  final Server server = new Server();
+
+  Completer serverConnected;
+  Completer analysisComplete;
+  bool verbose;
+
+  Future start(List<String> args) async {
+    final options = Options.parse(args);
+
+    /// Only happens in testing.
+    if (options == null) {
+      return null;
+    }
+    verbose = options.verbose;
+
+    serverConnected = new Completer();
+    analysisComplete = new Completer();
+
+    await startServer(options);
+    outSink.writeln('Analyzing...');
+    await setupAnalysis(options);
+
+    // TODO(danrubel): Request fixes rather than waiting for analysis complete
+    await analysisComplete.future;
+
+    outSink.writeln('Analysis complete.');
+    await stopServer(server);
+  }
+
+  Future startServer(Options options) async {
+    if (options.verbose) {
+      server.debugStdio();
+    }
+    verboseOut('Starting...');
+    await server.start(sdkPath: options.sdkPath);
+    server.listenToOutput(dispatchNotification);
+    return serverConnected.future.timeout(timeout, onTimeout: () {
+      printAndFail('Failed to connect to server');
+    });
+  }
+
+  Future setupAnalysis(Options options) async {
+    verboseOut('Setup analysis');
+
+    await server.send("server.setSubscriptions",
+        new ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
+
+    await server.send(
+        "analysis.setAnalysisRoots",
+        new AnalysisSetAnalysisRootsParams(
+          options.analysisRoots,
+          const [],
+        ).toJson());
+  }
+
+  Future stopServer(Server server) async {
+    verboseOut('Stopping...');
+    await server.send("server.shutdown", null);
+    await server.exitCode.timeout(const Duration(seconds: 5), onTimeout: () {
+      return server.kill('server failed to exit');
+    });
+  }
+
+  /**
+   * Dispatch the notification named [event], and containing parameters
+   * [params], to the appropriate stream.
+   */
+  void dispatchNotification(String event, params) {
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    switch (event) {
+      case "server.connected":
+        onServerConnected(
+            new ServerConnectedParams.fromJson(decoder, 'params', params));
+        break;
+//      case "server.error":
+//        outOfTestExpect(params, isServerErrorParams);
+//        _onServerError
+//            .add(new ServerErrorParams.fromJson(decoder, 'params', params));
+//        break;
+      case "server.status":
+        onServerStatus(
+            new ServerStatusParams.fromJson(decoder, 'params', params));
+        break;
+//      case "analysis.analyzedFiles":
+//        outOfTestExpect(params, isAnalysisAnalyzedFilesParams);
+//        _onAnalysisAnalyzedFiles.add(new AnalysisAnalyzedFilesParams.fromJson(
+//            decoder, 'params', params));
+//        break;
+//      case "analysis.closingLabels":
+//        outOfTestExpect(params, isAnalysisClosingLabelsParams);
+//        _onAnalysisClosingLabels.add(new AnalysisClosingLabelsParams.fromJson(
+//            decoder, 'params', params));
+//        break;
+      case "analysis.errors":
+        onAnalysisErrors(
+            new AnalysisErrorsParams.fromJson(decoder, 'params', params));
+        break;
+//      case "analysis.flushResults":
+//        outOfTestExpect(params, isAnalysisFlushResultsParams);
+//        _onAnalysisFlushResults.add(
+//            new AnalysisFlushResultsParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.folding":
+//        outOfTestExpect(params, isAnalysisFoldingParams);
+//        _onAnalysisFolding
+//            .add(new AnalysisFoldingParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.highlights":
+//        outOfTestExpect(params, isAnalysisHighlightsParams);
+//        _onAnalysisHighlights.add(
+//            new AnalysisHighlightsParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.implemented":
+//        outOfTestExpect(params, isAnalysisImplementedParams);
+//        _onAnalysisImplemented.add(
+//            new AnalysisImplementedParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.invalidate":
+//        outOfTestExpect(params, isAnalysisInvalidateParams);
+//        _onAnalysisInvalidate.add(
+//            new AnalysisInvalidateParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.navigation":
+//        outOfTestExpect(params, isAnalysisNavigationParams);
+//        _onAnalysisNavigation.add(
+//            new AnalysisNavigationParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.occurrences":
+//        outOfTestExpect(params, isAnalysisOccurrencesParams);
+//        _onAnalysisOccurrences.add(
+//            new AnalysisOccurrencesParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.outline":
+//        outOfTestExpect(params, isAnalysisOutlineParams);
+//        _onAnalysisOutline
+//            .add(new AnalysisOutlineParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "analysis.overrides":
+//        outOfTestExpect(params, isAnalysisOverridesParams);
+//        _onAnalysisOverrides.add(
+//            new AnalysisOverridesParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "completion.results":
+//        outOfTestExpect(params, isCompletionResultsParams);
+//        _onCompletionResults.add(
+//            new CompletionResultsParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "search.results":
+//        outOfTestExpect(params, isSearchResultsParams);
+//        _onSearchResults
+//            .add(new SearchResultsParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "execution.launchData":
+//        outOfTestExpect(params, isExecutionLaunchDataParams);
+//        _onExecutionLaunchData.add(
+//            new ExecutionLaunchDataParams.fromJson(decoder, 'params', params));
+//        break;
+//      case "flutter.outline":
+//        outOfTestExpect(params, isFlutterOutlineParams);
+//        _onFlutterOutline
+//            .add(new FlutterOutlineParams.fromJson(decoder, 'params', params));
+//        break;
+//      default:
+//        printAndFail('Unexpected notification: $event');
+//        break;
+    }
+  }
+
+  void onAnalysisErrors(AnalysisErrorsParams params) {
+    List<AnalysisError> errors = params.errors;
+    if (errors.isNotEmpty) {
+      outSink.writeln(params.file);
+      for (AnalysisError error in errors) {
+        Location loc = error.location;
+        outSink.writeln('  ${error.message}'
+            ' at ${loc.startLine}:${loc.startColumn}');
+      }
+    }
+  }
+
+  void onServerConnected(ServerConnectedParams params) {
+    verboseOut('Connected to server');
+    serverConnected.complete();
+  }
+
+  void onServerStatus(ServerStatusParams params) {
+    if (params.analysis != null && !params.analysis.isAnalyzing) {
+      verboseOut('Analysis complete');
+      analysisComplete.complete();
+    }
+  }
+
+  void verboseOut(String message) {
+    if (verbose) {
+      outSink.writeln(message);
+    }
+  }
+}
diff --git a/pkg/analyzer_cli/lib/src/fix/options.dart b/pkg/analyzer_cli/lib/src/fix/options.dart
new file mode 100644
index 0000000..0cb29c0
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/fix/options.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:io';
+
+import 'package:analyzer/src/util/sdk.dart';
+import 'package:args/args.dart';
+import 'package:meta/meta.dart';
+
+@visibleForTesting
+StringSink errorSink = stderr;
+
+@visibleForTesting
+StringSink outSink = stdout;
+
+@visibleForTesting
+ExitHandler exitHandler = exit;
+
+@visibleForTesting
+typedef void ExitHandler(int code);
+
+/// Command line options for `dartfix`.
+class Options {
+  String sdkPath;
+  List<String> analysisRoots;
+  bool verbose;
+
+  static Options parse(List<String> args,
+      {printAndFail(String msg) = printAndFail}) {
+    final parser = new ArgParser(allowTrailingOptions: true);
+
+    parser
+      ..addOption(_sdkPathOption, help: 'The path to the Dart SDK.')
+      ..addFlag(_helpOption,
+          abbr: 'h',
+          help:
+              'Display this help message. Add --verbose to show hidden options.',
+          defaultsTo: false,
+          negatable: false)
+      ..addFlag(_verboseOption,
+          abbr: 'v',
+          defaultsTo: false,
+          help: 'Verbose output.',
+          negatable: false);
+
+    ArgResults results;
+    try {
+      results = parser.parse(args);
+    } on FormatException catch (e) {
+      errorSink.writeln(e.message);
+      _showUsage(parser);
+      exitHandler(15);
+      return null; // Only reachable in testing.
+    }
+
+    if (results[_helpOption] as bool) {
+      _showUsage(parser);
+      exitHandler(0);
+      return null; // Only reachable in testing.
+    }
+
+    Options options = new Options._fromArgs(results);
+
+    // Check Dart SDK, and infer if unspecified.
+    options.sdkPath ??= getSdkPath(args);
+    String sdkPath = options.sdkPath;
+    if (sdkPath == null) {
+      errorSink.writeln('No Dart SDK found.');
+      _showUsage(parser);
+      return null; // Only reachable in testing.
+    }
+    if (!(new Directory(sdkPath)).existsSync()) {
+      printAndFail('Invalid Dart SDK path: $sdkPath');
+      return null; // Only reachable in testing.
+    }
+
+    // Check for files and/or directories to analyze.
+    if (options.analysisRoots == null || options.analysisRoots.isEmpty) {
+      errorSink.writeln('Expected at least one file or directory to analyze.');
+      _showUsage(parser);
+      exitHandler(15);
+      return null; // Only reachable in testing.
+    }
+
+    return options;
+  }
+
+  Options._fromArgs(ArgResults results)
+      : analysisRoots = results.rest,
+        sdkPath = results[_sdkPathOption] as String,
+        verbose = results[_verboseOption] as bool;
+
+  static _showUsage(ArgParser parser) {
+    errorSink.writeln(
+        'Usage: $_binaryName [options...] <directory or list of files>');
+    errorSink.writeln('');
+    errorSink.writeln(parser.usage);
+  }
+}
+
+const _binaryName = 'dartfix';
+const _helpOption = 'help';
+const _sdkPathOption = 'dart-sdk';
+const _verboseOption = 'verbose';
+
+/// Print the given [message] to stderr and exit with the given [exitCode].
+void printAndFail(String message, {int exitCode: 15}) {
+  errorSink.writeln(message);
+  exitHandler(exitCode);
+}
diff --git a/pkg/analyzer_cli/lib/src/fix/server.dart b/pkg/analyzer_cli/lib/src/fix/server.dart
new file mode 100644
index 0000000..66f031c
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/fix/server.dart
@@ -0,0 +1,345 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart';
+
+/**
+ * Type of callbacks used to process notifications.
+ */
+typedef void NotificationProcessor(String event, params);
+
+/**
+ * Instances of the class [Server] manage a connection to a server process, and
+ * facilitate communication to and from the server.
+ */
+class Server {
+  /**
+   * Server process object, or null if server hasn't been started yet.
+   */
+  Process _process;
+
+  /**
+   * Commands that have been sent to the server but not yet acknowledged, and
+   * the [Completer] objects which should be completed when acknowledgement is
+   * received.
+   */
+  final Map<String, Completer<Map<String, dynamic>>> _pendingCommands =
+      <String, Completer<Map<String, dynamic>>>{};
+
+  /**
+   * Number which should be used to compute the 'id' to send in the next command
+   * sent to the server.
+   */
+  int _nextId = 0;
+
+  /**
+   * Messages which have been exchanged with the server; we buffer these
+   * up until the test finishes, so that they can be examined in the debugger
+   * or printed out in response to a call to [debugStdio].
+   */
+  final List<String> _recordedStdio = <String>[];
+
+  /**
+   * True if we are currently printing out messages exchanged with the server.
+   */
+  bool _debuggingStdio = false;
+
+  /**
+   * True if we've received bad data from the server, and we are aborting the
+   * test.
+   */
+  bool _receivedBadDataFromServer = false;
+
+  /**
+   * Stopwatch that we use to generate timing information for debug output.
+   */
+  Stopwatch _time = new Stopwatch();
+
+  /**
+   * The [currentElapseTime] at which the last communication was received from the server
+   * or `null` if no communication has been received.
+   */
+  double lastCommunicationTime;
+
+  /**
+   * The current elapse time (seconds) since the server was started.
+   */
+  double get currentElapseTime => _time.elapsedTicks / _time.frequency;
+
+  /**
+   * Future that completes when the server process exits.
+   */
+  Future<int> get exitCode => _process.exitCode;
+
+  /**
+   * Print out any messages exchanged with the server.  If some messages have
+   * already been exchanged with the server, they are printed out immediately.
+   */
+  void debugStdio() {
+    if (_debuggingStdio) {
+      return;
+    }
+    _debuggingStdio = true;
+    for (String line in _recordedStdio) {
+      print(line);
+    }
+  }
+
+  /**
+   * Find the root directory of the analysis_server package by proceeding
+   * upward to the 'test' dir, and then going up one more directory.
+   */
+  String findRoot(String pathname) {
+    while (!['benchmark', 'test'].contains(basename(pathname))) {
+      String parent = dirname(pathname);
+      if (parent.length >= pathname.length) {
+        throw new Exception("Can't find root directory");
+      }
+      pathname = parent;
+    }
+    return dirname(pathname);
+  }
+
+  /**
+   * Return a future that will complete when all commands that have been sent
+   * to the server so far have been flushed to the OS buffer.
+   */
+  Future flushCommands() {
+    return _process.stdin.flush();
+  }
+
+  /**
+   * Stop the server.
+   */
+  Future<int> kill(String reason) {
+    debugStdio();
+    _recordStdio('FORCIBLY TERMINATING PROCESS: $reason');
+    _process.kill();
+    return _process.exitCode;
+  }
+
+  /**
+   * Start listening to output from the server, and deliver notifications to
+   * [notificationProcessor].
+   */
+  void listenToOutput(NotificationProcessor notificationProcessor) {
+    _process.stdout
+        .transform(utf8.decoder)
+        .transform(new LineSplitter())
+        .listen((String line) {
+      lastCommunicationTime = currentElapseTime;
+      String trimmedLine = line.trim();
+
+      // Guard against lines like:
+      //   {"event":"server.connected","params":{...}}Observatory listening on ...
+      final String observatoryMessage = 'Observatory listening on ';
+      if (trimmedLine.contains(observatoryMessage)) {
+        trimmedLine = trimmedLine
+            .substring(0, trimmedLine.indexOf(observatoryMessage))
+            .trim();
+      }
+      if (trimmedLine.isEmpty) {
+        return;
+      }
+
+      _recordStdio('<== $trimmedLine');
+      var message;
+      try {
+        message = json.decoder.convert(trimmedLine);
+      } catch (exception) {
+        _badDataFromServer('JSON decode failure: $exception');
+        return;
+      }
+      Map messageAsMap = message;
+      if (messageAsMap.containsKey('id')) {
+        String id = message['id'];
+        Completer<Map<String, dynamic>> completer = _pendingCommands[id];
+        if (completer == null) {
+          throw 'Unexpected response from server: id=$id';
+        } else {
+          _pendingCommands.remove(id);
+        }
+        if (messageAsMap.containsKey('error')) {
+          completer.completeError(new ServerErrorMessage(messageAsMap));
+        } else {
+          Map<String, dynamic> result = messageAsMap['result'];
+          completer.complete(result);
+        }
+      } else {
+        String event = messageAsMap['event'];
+        notificationProcessor(event, messageAsMap['params']);
+      }
+    });
+    _process.stderr
+        .transform((new Utf8Codec()).decoder)
+        .transform(new LineSplitter())
+        .listen((String line) {
+      String trimmedLine = line.trim();
+      _recordStdio('ERR:  $trimmedLine');
+      _badDataFromServer('Message received on stderr', silent: true);
+    });
+  }
+
+  /**
+   * Send a command to the server.  An 'id' will be automatically assigned.
+   * The returned [Future] will be completed when the server acknowledges the
+   * command with a response.  If the server acknowledges the command with a
+   * normal (non-error) response, the future will be completed with the 'result'
+   * field from the response.  If the server acknowledges the command with an
+   * error response, the future will be completed with an error.
+   */
+  Future<Map<String, dynamic>> send(
+      String method, Map<String, dynamic> params) {
+    String id = '${_nextId++}';
+    Map<String, dynamic> command = <String, dynamic>{
+      'id': id,
+      'method': method
+    };
+    if (params != null) {
+      command['params'] = params;
+    }
+    Completer<Map<String, dynamic>> completer =
+        new Completer<Map<String, dynamic>>();
+    _pendingCommands[id] = completer;
+    String line = json.encode(command);
+    _recordStdio('==> $line');
+    _process.stdin.add(utf8.encoder.convert("$line\n"));
+    return completer.future;
+  }
+
+  /**
+   * Start the server. If [profileServer] is `true`, the server will be started
+   * with "--observe" and "--pause-isolates-on-exit", allowing the observatory
+   * to be used.
+   */
+  Future start({
+    int diagnosticPort,
+    String instrumentationLogFile,
+    bool profileServer: false,
+    String sdkPath,
+    int servicesPort,
+    bool useAnalysisHighlight2: false,
+  }) async {
+    if (_process != null) {
+      throw new Exception('Process already started');
+    }
+    _time.start();
+    String dartBinary = Platform.executable;
+
+    // The integration tests run 3x faster when run from snapshots (you need to
+    // run test.py with --use-sdk).
+    final bool useSnapshot = true;
+    String serverPath;
+
+    if (useSnapshot) {
+      // Look for snapshots/analysis_server.dart.snapshot.
+      serverPath = normalize(join(dirname(Platform.resolvedExecutable),
+          'snapshots', 'analysis_server.dart.snapshot'));
+
+      if (!FileSystemEntity.isFileSync(serverPath)) {
+        // Look for dart-sdk/bin/snapshots/analysis_server.dart.snapshot.
+        serverPath = normalize(join(dirname(Platform.resolvedExecutable),
+            'dart-sdk', 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
+      }
+    } else {
+      String rootDir =
+          findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
+      serverPath = normalize(join(rootDir, 'bin', 'server.dart'));
+    }
+
+    List<String> arguments = [];
+    //
+    // Add VM arguments.
+    //
+    if (profileServer) {
+      if (servicesPort == null) {
+        arguments.add('--observe');
+      } else {
+        arguments.add('--observe=$servicesPort');
+      }
+      arguments.add('--pause-isolates-on-exit');
+    } else if (servicesPort != null) {
+      arguments.add('--enable-vm-service=$servicesPort');
+    }
+    if (Platform.packageConfig != null) {
+      arguments.add('--packages=${Platform.packageConfig}');
+    }
+    //
+    // Add the server executable.
+    //
+    arguments.add(serverPath);
+    //
+    // Add server arguments.
+    //
+    arguments.add('--suppress-analytics');
+    if (diagnosticPort != null) {
+      arguments.add('--port');
+      arguments.add(diagnosticPort.toString());
+    }
+    if (instrumentationLogFile != null) {
+      arguments.add('--instrumentation-log-file=$instrumentationLogFile');
+    }
+    if (sdkPath != null) {
+      arguments.add('--sdk=$sdkPath');
+    }
+    if (useAnalysisHighlight2) {
+      arguments.add('--useAnalysisHighlight2');
+    }
+    _process = await Process.start(dartBinary, arguments);
+    _process.exitCode.then((int code) {
+      if (code != 0) {
+        _badDataFromServer('server terminated with exit code $code');
+      }
+    });
+  }
+
+  /**
+   * Deal with bad data received from the server.
+   */
+  void _badDataFromServer(String details, {bool silent: false}) {
+    if (!silent) {
+      _recordStdio('BAD DATA FROM SERVER: $details');
+    }
+    if (_receivedBadDataFromServer) {
+      // We're already dealing with it.
+      return;
+    }
+    _receivedBadDataFromServer = true;
+    debugStdio();
+    // Give the server 1 second to continue outputting bad data
+    // such as outputting a stacktrace.
+    new Future.delayed(new Duration(seconds: 1), () {
+      throw 'Bad data received from server: $details';
+    });
+  }
+
+  /**
+   * Record a message that was exchanged with the server, and print it out if
+   * [debugStdio] has been called.
+   */
+  void _recordStdio(String line) {
+    double elapsedTime = currentElapseTime;
+    line = "$elapsedTime: $line";
+    if (_debuggingStdio) {
+      print(line);
+    }
+    _recordedStdio.add(line);
+  }
+}
+
+/**
+ * An error result from a server request.
+ */
+class ServerErrorMessage {
+  final Map message;
+
+  ServerErrorMessage(this.message);
+
+  dynamic get error => message['error'];
+
+  String toString() => message.toString();
+}
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 7667945..3c1fb51 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -157,6 +157,10 @@
   /// Use ANSI color codes for output.
   final bool color;
 
+  /// Whether we should analyze the given source for the purposes of training a
+  /// Dart analyzer snapshot.
+  final bool trainSnapshot;
+
   /// Initialize options from the given parsed [args].
   CommandLineOptions._fromArgs(ArgResults args)
       : buildAnalysisOutput = cast(args['build-analysis-output']),
@@ -199,6 +203,7 @@
         lintsAreFatal = cast(args['fatal-lints']),
         implicitCasts = cast(args[implicitCastsFlag]),
         implicitDynamic = !cast<bool>(args['no-implicit-dynamic']),
+        trainSnapshot = cast(args['train-snapshot']),
         verbose = cast(args['verbose']),
         color = cast(args['color']);
 
@@ -510,7 +515,12 @@
           help: 'Enable the Dart 2.0 preview.',
           defaultsTo: true,
           hide: hide,
-          negatable: true);
+          negatable: true)
+      ..addFlag('train-snapshot',
+          help: "Analyze the given source for the purposes of training a "
+              "dartanalyzer snapshot.",
+          hide: hide,
+          negatable: false);
 
     try {
       if (args.contains('--$ignoreUnrecognizedFlagsFlag')) {
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 7b88142..32c08eb 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -74,6 +74,7 @@
         expect(options.strongMode, isTrue);
         expect(options.lintsAreFatal, isFalse);
         expect(options.previewDart2, isTrue);
+        expect(options.trainSnapshot, isFalse);
       });
 
       test('batch', () {
@@ -242,6 +243,12 @@
             CommandLineOptions.parse(['--preview-dart-2', 'foo.dart']);
         expect(options.previewDart2, isTrue);
       });
+
+      test('--train-snapshot', () {
+        CommandLineOptions options =
+            CommandLineOptions.parse(['--train-snapshot', 'foo.dart']);
+        expect(options.trainSnapshot, isTrue);
+      });
     });
   });
   defineReflectiveTests(CommandLineOptionsTest);
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index da0506a..2bbd9c2 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -34,6 +34,7 @@
   static const String previewDart2 = '--preview-dart-2';
 
   static const String omitImplicitChecks = '--omit-implicit-checks';
+  static const String omitAsCasts = '--omit-as-casts';
   static const String laxRuntimeTypeToString = '--lax-runtime-type-to-string';
 
   static const String platformBinaries = '--platform-binaries=.+';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index a16065a..195fb6d 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -10,22 +10,587 @@
 import 'constants/expressions.dart' show ConstantExpression;
 import 'constants/values.dart';
 import 'elements/entities.dart';
-import 'elements/names.dart' show PublicName;
 import 'elements/types.dart';
 import 'js_backend/backend.dart' show JavaScriptBackend;
 import 'js_backend/constant_system_javascript.dart';
 import 'js_backend/native_data.dart' show NativeBasicData;
 import 'native/native.dart';
 import 'types/abstract_value_domain.dart';
-import 'universe/call_structure.dart' show CallStructure;
 import 'universe/selector.dart' show Selector;
-import 'universe/call_structure.dart';
 
 /// The common elements and types in Dart.
-class CommonElements {
+abstract class CommonElements {
+  /// The `Object` class defined in 'dart:core'.
+  ClassEntity get objectClass;
+
+  /// The `bool` class defined in 'dart:core'.
+  ClassEntity get boolClass;
+
+  /// The `num` class defined in 'dart:core'.
+  ClassEntity get numClass;
+
+  /// The `int` class defined in 'dart:core'.
+  ClassEntity get intClass;
+
+  /// The `double` class defined in 'dart:core'.
+  ClassEntity get doubleClass;
+
+  /// The `String` class defined in 'dart:core'.
+  ClassEntity get stringClass;
+
+  /// The `Function` class defined in 'dart:core'.
+  ClassEntity get functionClass;
+
+  /// The `Resource` class defined in 'dart:core'.
+  ClassEntity get resourceClass;
+
+  /// The `Symbol` class defined in 'dart:core'.
+  ClassEntity get symbolClass;
+
+  /// The `Null` class defined in 'dart:core'.
+  ClassEntity get nullClass;
+
+  /// The `Type` class defined in 'dart:core'.
+  ClassEntity get typeClass;
+
+  /// The `StackTrace` class defined in 'dart:core';
+  ClassEntity get stackTraceClass;
+
+  /// The `List` class defined in 'dart:core';
+  ClassEntity get listClass;
+
+  /// The `Map` class defined in 'dart:core';
+  ClassEntity get mapClass;
+
+  /// The `Iterable` class defined in 'dart:core';
+  ClassEntity get iterableClass;
+
+  /// The `Future` class defined in 'async';.
+  ClassEntity get futureClass;
+
+  /// The `Stream` class defined in 'async';
+  ClassEntity get streamClass;
+
+  /// The dart:core library.
+  LibraryEntity get coreLibrary;
+
+  /// The dart:async library.
+  LibraryEntity get asyncLibrary;
+
+  /// The dart:mirrors library.
+  LibraryEntity get mirrorsLibrary;
+
+  /// The dart:typed_data library.
+  LibraryEntity get typedDataLibrary;
+
+  /// The dart:_js_helper library.
+  LibraryEntity get jsHelperLibrary;
+
+  /// The dart:_interceptors library.
+  LibraryEntity get interceptorsLibrary;
+
+  /// The dart:_foreign_helper library.
+  LibraryEntity get foreignLibrary;
+
+  /// The dart:_internal library.
+  LibraryEntity get internalLibrary;
+
+  /// The `NativeTypedData` class from dart:typed_data.
+  ClassEntity get typedDataClass;
+
+  /// Constructor of the `Symbol` class in dart:internal. This getter will
+  /// ensure that `Symbol` is resolved and lookup the constructor on demand.
+  ConstructorEntity get symbolConstructorTarget;
+
+  /// Whether [element] is the same as [symbolConstructor]. Used to check
+  /// for the constructor without computing it until it is likely to be seen.
+  bool isSymbolConstructor(ConstructorEntity element);
+
+  /// The function `identical` in dart:core.
+  FunctionEntity get identicalFunction;
+
+  /// Whether [element] is the `Function.apply` method. This will not
+  /// resolve the apply method if it hasn't been seen yet during compilation.
+  bool isFunctionApplyMethod(MemberEntity element);
+
+  /// The `dynamic` type.
+  DynamicType get dynamicType;
+
+  /// The `Object` type defined in 'dart:core'.
+  InterfaceType get objectType;
+
+  /// The `bool` type defined in 'dart:core'.
+  InterfaceType get boolType;
+
+  /// The `num` type defined in 'dart:core'.
+  InterfaceType get numType;
+
+  /// The `int` type defined in 'dart:core'.
+  InterfaceType get intType;
+
+  /// The `double` type defined in 'dart:core'.
+  InterfaceType get doubleType;
+
+  /// The `Resource` type defined in 'dart:core'.
+  InterfaceType get resourceType;
+
+  /// The `String` type defined in 'dart:core'.
+  InterfaceType get stringType;
+
+  /// The `Symbol` type defined in 'dart:core'.
+  InterfaceType get symbolType;
+
+  /// The `Function` type defined in 'dart:core'.
+  InterfaceType get functionType;
+
+  /// The `Null` type defined in 'dart:core'.
+  InterfaceType get nullType;
+
+  /// The `Type` type defined in 'dart:core'.
+  InterfaceType get typeType;
+
+  InterfaceType get typeLiteralType;
+
+  /// The `StackTrace` type defined in 'dart:core';
+  InterfaceType get stackTraceType;
+
+  /// Returns an instance of the `List` type defined in 'dart:core' with
+  /// [elementType] as its type argument.
+  ///
+  /// If no type argument is provided, the canonical raw type is returned.
+  InterfaceType listType([DartType elementType]);
+
+  /// Returns an instance of the `Map` type defined in 'dart:core' with
+  /// [keyType] and [valueType] as its type arguments.
+  ///
+  /// If no type arguments are provided, the canonical raw type is returned.
+  InterfaceType mapType([DartType keyType, DartType valueType]);
+
+  /// Returns an instance of the `Iterable` type defined in 'dart:core' with
+  /// [elementType] as its type argument.
+  ///
+  /// If no type argument is provided, the canonical raw type is returned.
+  InterfaceType iterableType([DartType elementType]);
+
+  /// Returns an instance of the `Future` type defined in 'dart:async' with
+  /// [elementType] as its type argument.
+  ///
+  /// If no type argument is provided, the canonical raw type is returned.
+  InterfaceType futureType([DartType elementType]);
+
+  /// Returns an instance of the `Stream` type defined in 'dart:async' with
+  /// [elementType] as its type argument.
+  ///
+  /// If no type argument is provided, the canonical raw type is returned.
+  InterfaceType streamType([DartType elementType]);
+
+  /// Returns `true` if [element] is a superclass of `String` or `num`.
+  bool isNumberOrStringSupertype(ClassEntity element);
+
+  /// Returns `true` if [element] is a superclass of `String`.
+  bool isStringOnlySupertype(ClassEntity element);
+
+  /// Returns `true` if [element] is a superclass of `List`.
+  bool isListSupertype(ClassEntity element);
+
+  InterfaceType getConstantMapTypeFor(InterfaceType sourceType,
+      {bool hasProtoKey: false, bool onlyStringKeys: false});
+
+  FieldEntity get symbolField;
+
+  InterfaceType get symbolImplementationType;
+
+  // From dart:core
+  ClassEntity get mapLiteralClass;
+
+  ConstructorEntity get mapLiteralConstructor;
+
+  ConstructorEntity get mapLiteralConstructorEmpty;
+
+  FunctionEntity get mapLiteralUntypedMaker;
+
+  FunctionEntity get mapLiteralUntypedEmptyMaker;
+
+  FunctionEntity get objectNoSuchMethod;
+
+  bool isDefaultNoSuchMethodImplementation(FunctionEntity element);
+
+  // From dart:async
+  FunctionEntity get asyncHelperStart;
+  FunctionEntity get asyncHelperStartSync;
+  FunctionEntity get asyncHelperAwait;
+  FunctionEntity get asyncHelperReturn;
+  FunctionEntity get asyncHelperRethrow;
+
+  FunctionEntity get wrapBody;
+
+  FunctionEntity get yieldStar;
+
+  FunctionEntity get yieldSingle;
+
+  FunctionEntity get syncStarUncaughtError;
+
+  FunctionEntity get asyncStarHelper;
+
+  FunctionEntity get streamOfController;
+
+  FunctionEntity get endOfIteration;
+
+  ClassEntity get syncStarIterable;
+
+  ClassEntity get futureImplementation;
+
+  ClassEntity get controllerStream;
+
+  ClassEntity get streamIterator;
+
+  ConstructorEntity get streamIteratorConstructor;
+
+  FunctionEntity get syncStarIterableFactory;
+
+  FunctionEntity get asyncAwaitCompleterFactory;
+
+  FunctionEntity get syncCompleterFactory;
+
+  FunctionEntity get asyncStarStreamControllerFactory;
+
+  ClassEntity get jsInterceptorClass;
+
+  ClassEntity get jsStringClass;
+
+  ClassEntity get jsArrayClass;
+
+  ClassEntity get jsNumberClass;
+
+  ClassEntity get jsIntClass;
+
+  ClassEntity get jsDoubleClass;
+
+  ClassEntity get jsNullClass;
+
+  ClassEntity get jsBoolClass;
+
+  ClassEntity get jsPlainJavaScriptObjectClass;
+
+  ClassEntity get jsUnknownJavaScriptObjectClass;
+
+  ClassEntity get jsJavaScriptFunctionClass;
+
+  ClassEntity get jsJavaScriptObjectClass;
+
+  ClassEntity get jsIndexableClass;
+
+  ClassEntity get jsMutableIndexableClass;
+
+  ClassEntity get jsMutableArrayClass;
+
+  ClassEntity get jsFixedArrayClass;
+
+  ClassEntity get jsExtendableArrayClass;
+
+  ClassEntity get jsUnmodifiableArrayClass;
+
+  ClassEntity get jsPositiveIntClass;
+
+  ClassEntity get jsUInt32Class;
+
+  ClassEntity get jsUInt31Class;
+
+  /// Returns `true` member is the 'findIndexForNativeSubclassType' method
+  /// declared in `dart:_interceptors`.
+  bool isFindIndexForNativeSubclassType(MemberEntity member);
+
+  FunctionEntity get getNativeInterceptorMethod;
+
+  ConstructorEntity get jsArrayTypedConstructor;
+
+  // From dart:_js_helper
+  // TODO(johnniwinther): Avoid the need for this (from [CheckedModeHelper]).
+  FunctionEntity findHelperFunction(String name);
+
+  ClassEntity get closureClass;
+
+  ClassEntity get boundClosureClass;
+
+  ClassEntity get typeLiteralClass;
+
+  ClassEntity get constMapLiteralClass;
+
+  ClassEntity get typeVariableClass;
+
+  ClassEntity get jsInvocationMirrorClass;
+
+  MemberEntity get invocationTypeArgumentGetter;
+
+  /// Interface used to determine if an object has the JavaScript
+  /// indexing behavior. The interface is only visible to specific libraries.
+  ClassEntity get jsIndexingBehaviorInterface;
+
+  ClassEntity get stackTraceHelperClass;
+
+  ClassEntity get constantMapClass;
+  ClassEntity get constantStringMapClass;
+  ClassEntity get constantProtoMapClass;
+  ClassEntity get generalConstantMapClass;
+
+  ClassEntity get annotationCreatesClass;
+
+  ClassEntity get annotationReturnsClass;
+
+  ClassEntity get annotationJSNameClass;
+
+  /// The class for native annotations defined in dart:_js_helper.
+  ClassEntity get nativeAnnotationClass;
+
+  ConstructorEntity get typeVariableConstructor;
+
+  FunctionEntity get assertTest;
+
+  FunctionEntity get assertThrow;
+
+  FunctionEntity get assertHelper;
+
+  FunctionEntity get assertUnreachableMethod;
+
+  /// Holds the method "getIsolateAffinityTag" when dart:_js_helper has been
+  /// loaded.
+  FunctionEntity get getIsolateAffinityTagMarker;
+
+  /// Holds the method "requiresPreamble" in _js_helper.
+  FunctionEntity get requiresPreambleMarker;
+
+  FunctionEntity get loadLibraryWrapper;
+
+  FunctionEntity get loadDeferredLibrary;
+
+  FunctionEntity get boolConversionCheck;
+
+  FunctionEntity get traceHelper;
+
+  FunctionEntity get closureFromTearOff;
+
+  FunctionEntity get isJsIndexable;
+
+  FunctionEntity get throwIllegalArgumentException;
+
+  FunctionEntity get throwIndexOutOfRangeException;
+
+  FunctionEntity get exceptionUnwrapper;
+
+  FunctionEntity get throwRuntimeError;
+
+  FunctionEntity get throwUnsupportedError;
+
+  FunctionEntity get throwTypeError;
+
+  FunctionEntity get throwAbstractClassInstantiationError;
+
+  FunctionEntity get checkConcurrentModificationError;
+
+  FunctionEntity get throwConcurrentModificationError;
+
+  FunctionEntity get stringInterpolationHelper;
+
+  FunctionEntity get wrapExceptionHelper;
+
+  FunctionEntity get throwExpressionHelper;
+
+  FunctionEntity get closureConverter;
+
+  FunctionEntity get traceFromException;
+
+  FunctionEntity get setRuntimeTypeInfo;
+
+  FunctionEntity get getRuntimeTypeInfo;
+
+  FunctionEntity get getTypeArgumentByIndex;
+
+  FunctionEntity get computeSignature;
+
+  FunctionEntity get getRuntimeTypeArguments;
+
+  FunctionEntity get getRuntimeTypeArgument;
+
+  FunctionEntity get getRuntimeTypeArgumentIntercepted;
+
+  FunctionEntity get assertIsSubtype;
+
+  FunctionEntity get checkSubtype;
+
+  FunctionEntity get assertSubtype;
+
+  FunctionEntity get subtypeCast;
+
+  FunctionEntity get functionTypeTest;
+
+  FunctionEntity get futureOrTest;
+
+  FunctionEntity get checkSubtypeOfRuntimeType;
+
+  FunctionEntity get assertSubtypeOfRuntimeType;
+
+  FunctionEntity get subtypeOfRuntimeTypeCast;
+
+  FunctionEntity get checkDeferredIsLoaded;
+
+  FunctionEntity get throwNoSuchMethod;
+
+  FunctionEntity get createRuntimeType;
+
+  FunctionEntity get fallThroughError;
+
+  FunctionEntity get createInvocationMirror;
+
+  FunctionEntity get createUnmangledInvocationMirror;
+
+  FunctionEntity get cyclicThrowHelper;
+
+  FunctionEntity get defineProperty;
+
+  bool isExtractTypeArguments(FunctionEntity member);
+
+  ClassEntity getInstantiationClass(int typeArgumentCount);
+
+  FunctionEntity getInstantiateFunction(int typeArgumentCount);
+
+  FunctionEntity get instantiatedGenericFunctionType;
+
+  FunctionEntity get extractFunctionTypeObjectFromInternal;
+
+  // From dart:_internal
+
+  ClassEntity get symbolImplementationClass;
+
+  /// Used to annotate items that have the keyword "native".
+  ClassEntity get externalNameClass;
+
+  InterfaceType get externalNameType;
+
+  ConstructorEntity get symbolValidatedConstructor;
+
+  // From dart:_js_embedded_names
+
+  ClassEntity get jsGetNameEnum;
+
+  ClassEntity get expectNoInlineClass;
+
+  ClassEntity get expectTrustTypeAnnotationsClass;
+
+  ClassEntity get expectAssumeDynamicClass;
+
+  /// Returns `true` if [member] is a "foreign helper", that is, a member whose
+  /// semantics is defined synthetically and not through Dart code.
+  ///
+  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
+  bool isForeignHelper(MemberEntity member);
+
+  ClassEntity getDefaultSuperclass(
+      ClassEntity cls, NativeBasicData nativeBasicData);
+}
+
+abstract class KCommonElements implements CommonElements {
+  // From package:js
+  ClassEntity get jsAnnotationClass;
+
+  ClassEntity get jsAnonymousClass;
+
+  ClassEntity get noSideEffectsClass;
+
+  ClassEntity get noThrowsClass;
+
+  ClassEntity get noInlineClass;
+
+  ClassEntity get forceInlineClass;
+
+  bool isCreateInvocationMirrorHelper(MemberEntity member);
+
+  bool isSymbolValidatedConstructor(ConstructorEntity element);
+
+  ClassEntity get metaNoInlineClass;
+
+  ClassEntity get metaTryInlineClass;
+
+  /// Returns `true` if [function] is allowed to be external.
+  ///
+  /// This returns `true` for foreign helpers, from environment constructors and
+  /// members of libraries that support native.
+  ///
+  /// This returns `false` for JS interop members which therefore must be
+  /// allowed to be external through the JS interop annotation handling.
+  bool isExternalAllowed(FunctionEntity function);
+}
+
+abstract class JCommonElements implements CommonElements {
+  /// Returns `true` if [element] is the unnamed constructor of `List`. This
+  /// will not resolve the constructor if it hasn't been seen yet during
+  /// compilation.
+  bool isUnnamedListConstructor(ConstructorEntity element);
+
+  /// Returns `true` if [element] is the 'filled' constructor of `List`. This
+  /// will not resolve the constructor if it hasn't been seen yet during
+  /// compilation.
+  bool isFilledListConstructor(ConstructorEntity element);
+
+  bool isDefaultEqualityImplementation(MemberEntity element);
+
+  /// Returns `true` if [selector] applies to `JSIndexable.length`.
+  bool appliesToJsIndexableLength(Selector selector);
+
+  FunctionEntity get jsArrayRemoveLast;
+
+  FunctionEntity get jsArrayAdd;
+
+  bool isJsStringSplit(MemberEntity member);
+
+  /// Returns `true` if [selector] applies to `JSString.split` on [receiver]
+  /// in the given [world].
+  ///
+  /// Returns `false` if `JSString.split` is not available.
+  bool appliesToJsStringSplit(Selector selector, AbstractValue receiver,
+      AbstractValueDomain abstractValueDomain);
+
+  FunctionEntity get jsStringSplit;
+
+  FunctionEntity get jsStringToString;
+
+  FunctionEntity get jsStringOperatorAdd;
+
+  ClassEntity get jsConstClass;
+
+  /// Return `true` if [member] is the 'checkInt' function defined in
+  /// dart:_js_helpers.
+  bool isCheckInt(MemberEntity member);
+
+  /// Return `true` if [member] is the 'checkNum' function defined in
+  /// dart:_js_helpers.
+  bool isCheckNum(MemberEntity member);
+
+  /// Return `true` if [member] is the 'checkString' function defined in
+  /// dart:_js_helpers.
+  bool isCheckString(MemberEntity member);
+
+  bool isInstantiationClass(ClassEntity cls);
+
+  // From dart:_native_typed_data
+
+  ClassEntity get typedArrayOfIntClass;
+
+  ClassEntity get typedArrayOfDoubleClass;
+
+  ClassEntity get jsBuiltinEnum;
+
+  bool isForeign(MemberEntity element);
+
+  /// Returns `true` if the implementation of the 'operator ==' [function] is
+  /// known to handle `null` as argument.
+  bool operatorEqHandlesNullArgument(FunctionEntity function);
+}
+
+class CommonElementsImpl
+    implements CommonElements, KCommonElements, JCommonElements {
   final ElementEnvironment _env;
 
-  CommonElements(this._env);
+  CommonElementsImpl(this._env);
 
   /// The `Object` class defined in 'dart:core'.
   ClassEntity _objectClass;
@@ -193,57 +758,12 @@
         element == _symbolConstructorTarget;
   }
 
-  /// The `MirrorSystem` class in dart:mirrors.
-  ClassEntity _mirrorSystemClass;
-  ClassEntity get mirrorSystemClass => _mirrorSystemClass ??=
-      _findClass(mirrorsLibrary, 'MirrorSystem', required: false);
-
-  /// Whether [element] is `MirrorClass.getName`. Used to check for the use of
-  /// that static method without forcing the resolution of the `MirrorSystem`
-  /// class until it is necessary.
-  FunctionEntity _mirrorSystemGetNameFunction;
-  bool isMirrorSystemGetNameFunction(MemberEntity element) {
-    if (_mirrorSystemGetNameFunction == null) {
-      if (!element.isFunction || mirrorsLibrary == null) return false;
-      ClassEntity cls = mirrorSystemClass;
-      if (element.enclosingClass != cls) return false;
-      if (cls != null) {
-        _mirrorSystemGetNameFunction =
-            _findClassMember(cls, 'getName', required: false);
-      }
-    }
-    return element == _mirrorSystemGetNameFunction;
-  }
-
-  /// The `MirrorsUsed` annotation in dart:mirrors.
-  ClassEntity _mirrorsUsedClass;
-  ClassEntity get mirrorsUsedClass => _mirrorsUsedClass ??=
-      _findClass(mirrorsLibrary, 'MirrorsUsed', required: false);
-
-  /// Whether [element] is the constructor of the `MirrorsUsed` class. Used to
-  /// check for the constructor without forcing the resolution of the
-  /// `MirrorsUsed` class until it is necessary.
-  bool isMirrorsUsedConstructor(ConstructorEntity element) =>
-      mirrorsLibrary != null && mirrorsUsedClass == element.enclosingClass;
-
-  /// The `DeferredLibrary` annotation in dart:async that was used before the
-  /// deferred import syntax was introduced.
-  // TODO(sigmund): drop support for this old syntax?
-  ClassEntity _deferredLibraryClass;
-  ClassEntity get deferredLibraryClass =>
-      _deferredLibraryClass ??= _findClass(asyncLibrary, "DeferredLibrary");
-
   /// The function `identical` in dart:core.
   FunctionEntity _identicalFunction;
   FunctionEntity get identicalFunction =>
       _identicalFunction ??= _findLibraryMember(coreLibrary, 'identical');
 
-  /// The method `Function.apply`.
-  FunctionEntity _functionApplyMethod;
-  FunctionEntity get functionApplyMethod =>
-      _functionApplyMethod ??= _findClassMember(functionClass, 'apply');
-
-  /// Whether [element] is the same as [functionApplyMethod]. This will not
+  /// Whether [element] is the `Function.apply` method. This will not
   /// resolve the apply method if it hasn't been seen yet during compilation.
   bool isFunctionApplyMethod(MemberEntity element) =>
       element.name == 'apply' && element.enclosingClass == functionClass;
@@ -436,32 +956,6 @@
   }
 
   // From dart:core
-  FunctionEntity get malformedTypeError =>
-      _cachedCoreHelper('_malformedTypeError');
-  FunctionEntity get genericNoSuchMethod =>
-      _cachedCoreHelper('_genericNoSuchMethod');
-  FunctionEntity get unresolvedConstructorError =>
-      _cachedCoreHelper('_unresolvedConstructorError');
-  FunctionEntity get unresolvedStaticGetterError =>
-      _cachedCoreHelper('_unresolvedStaticGetterError');
-  FunctionEntity get unresolvedStaticSetterError =>
-      _cachedCoreHelper('_unresolvedStaticSetterError');
-  FunctionEntity get unresolvedStaticMethodError =>
-      _cachedCoreHelper('_unresolvedStaticMethodError');
-  FunctionEntity get unresolvedTopLevelGetterError =>
-      _cachedCoreHelper('_unresolvedTopLevelGetterError');
-  FunctionEntity get unresolvedTopLevelSetterError =>
-      _cachedCoreHelper('_unresolvedTopLevelSetterError');
-  FunctionEntity get unresolvedTopLevelMethodError =>
-      _cachedCoreHelper('_unresolvedTopLevelMethodError');
-
-  Map<String, FunctionEntity> _cachedCoreHelpers = <String, FunctionEntity>{};
-  FunctionEntity _cachedCoreHelper(String name) => _cachedCoreHelpers[name] ??=
-      _env.lookupLibraryMember(coreLibrary, name, required: true);
-
-  FunctionEntity _objectEquals;
-  FunctionEntity get objectEquals =>
-      _objectEquals ??= _findClassMember(objectClass, '==');
 
   ClassEntity _mapLiteralClass;
   ClassEntity get mapLiteralClass {
@@ -595,19 +1089,6 @@
       _asyncStarStreamControllerFactory ??=
           _findAsyncHelperFunction('_makeAsyncStarStreamController');
 
-  /// Holds the method "preserveNames" in js_mirrors when
-  /// dart:mirrors has been loaded.
-  FunctionEntity _preserveNamesMarker;
-  FunctionEntity get preserveNamesMarker {
-    if (_preserveNamesMarker == null) {
-      LibraryEntity library = _env.lookupLibrary(Uris.dart__js_names);
-      if (library != null) {
-        _preserveNamesMarker = _findLibraryMember(library, 'preserveNames');
-      }
-    }
-    return _preserveNamesMarker;
-  }
-
   // From dart:_interceptors
   ClassEntity _findInterceptorsClass(String name) =>
       _findClass(interceptorsLibrary, name);
@@ -730,14 +1211,14 @@
   FunctionEntity get jsArrayAdd =>
       _jsArrayAdd ??= _findClassMember(jsArrayClass, 'add');
 
-  bool isJsStringClass(ClassEntity cls) {
+  bool _isJsStringClass(ClassEntity cls) {
     return cls.name == 'JSString' && cls.library == interceptorsLibrary;
   }
 
   bool isJsStringSplit(MemberEntity member) {
     return member.name == 'split' &&
         member.isInstanceMember &&
-        isJsStringClass(member.enclosingClass);
+        _isJsStringClass(member.enclosingClass);
   }
 
   /// Returns `true` if [selector] applies to `JSString.split` on [receiver]
@@ -840,10 +1321,6 @@
   ClassEntity get forceInlineClass =>
       _forceInlineClass ??= _findHelperClass('ForceInline');
 
-  ClassEntity _irRepresentationClass;
-  ClassEntity get irRepresentationClass =>
-      _irRepresentationClass ??= _findHelperClass('IrRepresentation');
-
   ClassEntity _jsInvocationMirrorClass;
   ClassEntity get jsInvocationMirrorClass =>
       _jsInvocationMirrorClass ??= _findHelperClass('JSInvocationMirror');
@@ -860,8 +1337,6 @@
       _jsIndexingBehaviorInterface ??=
           _findHelperClass('JavaScriptIndexingBehavior');
 
-  ClassEntity get VoidRuntimeType => _findHelperClass('VoidRuntimeType');
-
   ClassEntity get stackTraceHelperClass => _findHelperClass('_StackTrace');
 
   ClassEntity get constantMapClass =>
@@ -879,11 +1354,6 @@
 
   ClassEntity get annotationJSNameClass => _findHelperClass('JSName');
 
-  /// The class for patch annotations defined in dart:_js_helper.
-  ClassEntity _patchAnnotationClass;
-  ClassEntity get patchAnnotationClass =>
-      _patchAnnotationClass ??= _findHelperClass('_Patch');
-
   /// The class for native annotations defined in dart:_js_helper.
   ClassEntity _nativeAnnotationClass;
   ClassEntity get nativeAnnotationClass =>
@@ -921,13 +1391,6 @@
   FunctionEntity get requiresPreambleMarker =>
       _requiresPreambleMarker ??= _findHelperFunction('requiresPreamble');
 
-  FunctionEntity get badMain => _findHelperFunction('badMain');
-
-  FunctionEntity get missingMain => _findHelperFunction('missingMain');
-
-  FunctionEntity get mainHasTooManyParameters =>
-      _findHelperFunction('mainHasTooManyParameters');
-
   FunctionEntity get loadLibraryWrapper =>
       _findHelperFunction("_loadLibraryWrapper");
 
@@ -1095,20 +1558,11 @@
 
   FunctionEntity get defineProperty => _findHelperFunction('defineProperty');
 
-  FunctionEntity get convertRtiToRuntimeType =>
-      _findHelperFunction('convertRtiToRuntimeType');
-
   bool isExtractTypeArguments(FunctionEntity member) {
     return member.name == 'extractTypeArguments' &&
         member.library == internalLibrary;
   }
 
-  FunctionEntity get toStringForNativeObject =>
-      _findHelperFunction('toStringForNativeObject');
-
-  FunctionEntity get hashCodeForNativeObject =>
-      _findHelperFunction('hashCodeForNativeObject');
-
   // TODO(johnniwinther,sra): Support arbitrary type argument count.
   void _checkTypeArgumentCount(int typeArgumentCount) {
     assert(typeArgumentCount > 0);
@@ -1154,12 +1608,9 @@
       _externalNameClass ??= _findClass(internalLibrary, 'ExternalName');
   InterfaceType get externalNameType => _getRawType(externalNameClass);
 
-  final Selector symbolValidatedConstructorSelector =
-      new Selector.call(const PublicName('validated'), CallStructure.ONE_ARG);
-
   ConstructorEntity get symbolValidatedConstructor =>
-      _symbolValidatedConstructor ??= _findConstructor(
-          symbolImplementationClass, symbolValidatedConstructorSelector.name);
+      _symbolValidatedConstructor ??=
+          _findConstructor(symbolImplementationClass, 'validated');
 
   /// Returns the field that holds the internal name in the implementation class
   /// for `Symbol`.
@@ -1178,11 +1629,6 @@
 
   // From dart:_native_typed_data
 
-  ClassEntity _typedArrayClass;
-  ClassEntity get typedArrayClass => _typedArrayClass ??= _findClass(
-      _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
-      'NativeTypedArray');
-
   ClassEntity _typedArrayOfIntClass;
   ClassEntity get typedArrayOfIntClass => _typedArrayOfIntClass ??= _findClass(
       _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
@@ -1406,9 +1852,6 @@
   /// Calls [f] for each class member declared in [cls].
   void forEachLocalClassMember(ClassEntity cls, void f(MemberEntity member));
 
-  /// Calls [f] for each class member added to [cls] during compilation.
-  void forEachInjectedClassMember(ClassEntity cls, void f(MemberEntity member));
-
   /// Calls [f] for each class member declared or inherited in [cls] together
   /// with the class that declared the member.
   ///
@@ -1421,18 +1864,8 @@
   ///
   /// Will ensure that the class and all constructors are resolved if
   /// [ensureResolved] is `true`.
-  // TODO(redemption): Remove the 'ensureResolved' parameter
   void forEachConstructor(
-      ClassEntity cls, void f(ConstructorEntity constructor),
-      {bool ensureResolved: true});
-
-  /// Calls [f] for every constructor body in [cls].
-  void forEachConstructorBody(
-      ClassEntity cls, void f(ConstructorBodyEntity constructorBody));
-
-  /// Calls [f] for each nested closure in [member].
-  void forEachNestedClosure(
-      MemberEntity member, void f(FunctionEntity closure));
+      ClassEntity cls, void f(ConstructorEntity constructor));
 
   /// Returns the superclass of [cls].
   ///
@@ -1453,10 +1886,6 @@
   /// Calls [f] for each supertype of [cls].
   void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype));
 
-  /// Calls [f] for each class that is mixed into [cls] or one of its
-  /// superclasses.
-  void forEachMixin(ClassEntity cls, void f(ClassEntity mixin));
-
   /// Create the instantiation of [cls] with the given [typeArguments].
   InterfaceType createInterfaceType(
       ClassEntity cls, List<DartType> typeArguments);
@@ -1481,6 +1910,78 @@
   /// Returns `true` if [cls] is an unnamed mixin application.
   bool isUnnamedMixinApplication(ClassEntity cls);
 
+  /// The upper bound on the [typeVariable]. If not explicitly declared, this is
+  /// `Object`.
+  DartType getTypeVariableBound(TypeVariableEntity typeVariable);
+
+  /// Returns the type of [function].
+  FunctionType getFunctionType(FunctionEntity function);
+
+  /// Returns the function type variables defined on [function].
+  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function);
+
+  /// Returns the 'element' type of a function with an async, async* or sync*
+  /// marker. The return type of the method is inspected to determine the type
+  /// parameter of the Future, Stream or Iterable.
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function);
+
+  /// Returns the 'element' type of a function with the async, async* or sync*
+  /// marker [marker]. [returnType] is the return type marked function.
+  DartType getAsyncOrSyncStarElementType(
+      AsyncMarker marker, DartType returnType);
+
+  /// Returns the type of the [local] function.
+  FunctionType getLocalFunctionType(Local local);
+
+  /// Returns the 'unaliased' type of [type]. For typedefs this is the function
+  /// type it is an alias of, for other types it is the type itself.
+  ///
+  /// Use this during resolution to ensure that the alias has been computed.
+  // TODO(johnniwinther): Remove this when the resolver is removed.
+  DartType getUnaliasedType(DartType type);
+
+  /// Returns `true` if [cls] is a Dart enum class.
+  bool isEnumClass(ClassEntity cls);
+}
+
+abstract class KElementEnvironment extends ElementEnvironment {
+  /// Calls [f] for each class that is mixed into [cls] or one of its
+  /// superclasses.
+  void forEachMixin(ClassEntity cls, void f(ClassEntity mixin));
+
+  /// Gets the constant value of [field], or `null` if [field] is non-const.
+  ConstantExpression getFieldConstantForTesting(FieldEntity field);
+
+  /// Returns `true` if [member] a the synthetic getter `loadLibrary` injected
+  /// on deferred libraries.
+  bool isDeferredLoadLibraryGetter(MemberEntity member);
+
+  /// Returns the imports seen in [library]
+  Iterable<ImportEntity> getImports(LibraryEntity library);
+
+  /// Returns the metadata constants declared on [library].
+  Iterable<ConstantValue> getLibraryMetadata(LibraryEntity library);
+
+  /// Returns the metadata constants declared on [cls].
+  Iterable<ConstantValue> getClassMetadata(ClassEntity cls);
+
+  /// Returns the metadata constants declared on [member].
+  Iterable<ConstantValue> getMemberMetadata(MemberEntity member,
+      {bool includeParameterMetadata: false});
+}
+
+abstract class JElementEnvironment extends ElementEnvironment {
+  /// Calls [f] for each class member added to [cls] during compilation.
+  void forEachInjectedClassMember(ClassEntity cls, void f(MemberEntity member));
+
+  /// Calls [f] for every constructor body in [cls].
+  void forEachConstructorBody(
+      ClassEntity cls, void f(ConstructorBodyEntity constructorBody));
+
+  /// Calls [f] for each nested closure in [member].
+  void forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure));
+
   /// Returns `true` if [cls] is a mixin application that mixes in methods with
   /// super calls.
   bool isSuperMixinApplication(ClassEntity cls);
@@ -1502,65 +2003,12 @@
   /// _effective_ mixin class of both is `A`.
   ClassEntity getEffectiveMixinClass(ClassEntity cls);
 
-  /// The upper bound on the [typeVariable]. If not explicitly declared, this is
-  /// `Object`.
-  DartType getTypeVariableBound(TypeVariableEntity typeVariable);
-
   /// The default type of the [typeVariable].
   ///
   /// This is the type used as the default type argument when no explicit type
   /// argument is passed.
   DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable);
 
-  /// Returns the type of [function].
-  FunctionType getFunctionType(FunctionEntity function);
-
-  /// Returns the function type variables defined on [function].
-  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function);
-
-  /// Returns the 'element' type of a function with an async, async* or sync*
-  /// marker. The return type of the method is inspected to determine the type
-  /// parameter of the Future, Stream or Iterable.
-  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function);
-
-  /// Returns the 'element' type of a function with the async, async* or sync*
-  /// marker [marker]. [returnType] is the return type marked function.
-  DartType getAsyncOrSyncStarElementType(
-      AsyncMarker marker, DartType returnType);
-
   /// Returns the type of [field].
   DartType getFieldType(FieldEntity field);
-
-  /// Returns the type of the [local] function.
-  FunctionType getLocalFunctionType(Local local);
-
-  /// Gets the constant value of [field], or `null` if [field] is non-const.
-  ConstantExpression getFieldConstant(FieldEntity field);
-
-  /// Returns the 'unaliased' type of [type]. For typedefs this is the function
-  /// type it is an alias of, for other types it is the type itself.
-  ///
-  /// Use this during resolution to ensure that the alias has been computed.
-  // TODO(johnniwinther): Remove this when the resolver is removed.
-  DartType getUnaliasedType(DartType type);
-
-  /// Returns `true` if [member] a the synthetic getter `loadLibrary` injected
-  /// on deferred libraries.
-  bool isDeferredLoadLibraryGetter(MemberEntity member);
-
-  /// Returns the metadata constants declared on [library].
-  Iterable<ConstantValue> getLibraryMetadata(LibraryEntity library);
-
-  /// Returns the imports seen in [library]
-  Iterable<ImportEntity> getImports(LibraryEntity library);
-
-  /// Returns the metadata constants declared on [cls].
-  Iterable<ConstantValue> getClassMetadata(ClassEntity cls);
-
-  /// Returns the metadata constants declared on [member].
-  Iterable<ConstantValue> getMemberMetadata(MemberEntity member,
-      {bool includeParameterMetadata: false});
-
-  /// Returns `true` if [cls] is a Dart enum class.
-  bool isEnumClass(ClassEntity cls);
 }
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index f261270..9fbf28a 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -353,6 +353,7 @@
     new OptionHandler('--strong', ignoreOption),
     new OptionHandler(Flags.previewDart2, ignoreOption),
     new OptionHandler(Flags.omitImplicitChecks, passThrough),
+    new OptionHandler(Flags.omitAsCasts, passThrough),
     new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
 
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index c176d1d..5da90be 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -8,7 +8,7 @@
 
 import 'common/tasks.dart' show CompilerTask;
 import 'common.dart';
-import 'common_elements.dart' show ElementEnvironment;
+import 'common_elements.dart' show KElementEnvironment;
 import 'compiler.dart' show Compiler;
 import 'constants/values.dart'
     show
@@ -147,7 +147,7 @@
     allOutputUnits.add(mainOutputUnit);
   }
 
-  ElementEnvironment get elementEnvironment =>
+  KElementEnvironment get elementEnvironment =>
       compiler.frontendStrategy.elementEnvironment;
   DiagnosticReporter get reporter => compiler.reporter;
 
@@ -359,10 +359,14 @@
             case TypeUseKind.INSTANTIATION:
             case TypeUseKind.NATIVE_INSTANTIATION:
             case TypeUseKind.IS_CHECK:
-            case TypeUseKind.AS_CAST:
             case TypeUseKind.CATCH_TYPE:
               _collectTypeDependencies(type, dependencies);
               break;
+            case TypeUseKind.AS_CAST:
+              if (!compiler.options.omitAsCasts) {
+                _collectTypeDependencies(type, dependencies);
+              }
+              break;
             case TypeUseKind.IMPLICIT_CAST:
               if (compiler.options.implicitDowncastCheckPolicy.isEmitted) {
                 _collectTypeDependencies(type, dependencies);
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index e6f6948..fc1c3c2 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -13,7 +13,7 @@
 import 'common/names.dart';
 import 'common/tasks.dart' show CompilerTask;
 import 'common.dart';
-import 'common_elements.dart';
+import 'common_elements.dart' show JElementEnvironment;
 import 'compiler.dart' show Compiler;
 import 'constants/values.dart' show ConstantValue, InterceptorConstantValue;
 import 'deferred_load.dart' show OutputUnit;
@@ -33,7 +33,7 @@
   final JClosedWorld closedWorld;
   final GlobalTypeInferenceResults _globalInferenceResults;
 
-  ElementEnvironment get environment => closedWorld.elementEnvironment;
+  JElementEnvironment get environment => closedWorld.elementEnvironment;
   CodegenWorldBuilder get codegenWorldBuilder => compiler.codegenWorldBuilder;
 
   final AllInfo result = new AllInfo();
@@ -207,7 +207,7 @@
           size += closureInfo.size;
         }
       }
-    }, ensureResolved: false);
+    });
 
     classInfo.size = size;
 
diff --git a/pkg/compiler/lib/src/elements/indexed.dart b/pkg/compiler/lib/src/elements/indexed.dart
index 28545af..f20a4ffab 100644
--- a/pkg/compiler/lib/src/elements/indexed.dart
+++ b/pkg/compiler/lib/src/elements/indexed.dart
@@ -13,16 +13,19 @@
 abstract class IndexedLibrary extends _Indexed implements LibraryEntity {
   /// Library index used for fast lookup in [KernelToElementMapBase].
   int get libraryIndex => _index;
+  int get hashCode => 7 * _index + 2;
 }
 
 abstract class IndexedClass extends _Indexed implements ClassEntity {
   /// Class index used for fast lookup in [KernelToElementMapBase].
   int get classIndex => _index;
+  int get hashCode => 7 * _index + 1;
 }
 
 abstract class IndexedMember extends _Indexed implements MemberEntity {
   /// Member index used for fast lookup in [KernelToElementMapBase].
   int get memberIndex => _index;
+  int get hashCode => 7 * _index;
 }
 
 abstract class IndexedFunction extends _Indexed
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index fa58347..3cef111 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -367,10 +367,14 @@
             nativeUsage: true, globalDependency: true);
         break;
       case TypeUseKind.IS_CHECK:
-      case TypeUseKind.AS_CAST:
       case TypeUseKind.CATCH_TYPE:
         _registerIsCheck(type);
         break;
+      case TypeUseKind.AS_CAST:
+        if (!_options.omitAsCasts) {
+          _registerIsCheck(type);
+        }
+        break;
       case TypeUseKind.IMPLICIT_CAST:
         if (_options.implicitDowncastCheckPolicy.isEmitted) {
           _registerIsCheck(type);
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 08f5f29..6597fcd 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -1278,7 +1278,7 @@
   KernelTypeSystemStrategy(
       this._elementMap, this._globalLocalsMap, this._closureDataLookup);
 
-  ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
+  JElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
 
   @override
   bool checkClassEntity(ClassEntity cls) => true;
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
new file mode 100644
index 0000000..0833c83
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -0,0 +1,543 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+
+/// Visitor that computes the static type of an expression.
+///
+/// This visitor doesn't traverse subtrees that are not needed for computing
+/// the static type.
+// TODO(johnniwinther): Add improved type promotion to handle negative
+// reasoning.
+abstract class StaticTypeVisitor extends ir.Visitor<ir.DartType> {
+  ir.TypeEnvironment _typeEnvironment;
+
+  StaticTypeVisitor(this._typeEnvironment);
+
+  fail(String message) => message;
+
+  ir.TypeEnvironment get typeEnvironment => _typeEnvironment;
+
+  /// Returns the static type of the expression as an instantiation of
+  /// [superclass].
+  ///
+  /// Should only be used on code compiled in strong mode, as this method
+  /// assumes the IR is strongly typed.
+  ///
+  /// This method furthermore assumes that the type of the expression actually
+  /// is a subtype of (some instantiation of) the given [superclass].
+  /// If this is not the case the raw type of [superclass] is returned.
+  ///
+  /// This method is derived from `ir.Expression.getStaticTypeAsInstanceOf`.
+  ir.InterfaceType getTypeAsInstanceOf(ir.DartType type, ir.Class superclass) {
+    // This method assumes the program is correctly typed, so if the superclass
+    // is not generic, we can just return its raw type without computing the
+    // type of this expression.  It also ensures that all types are considered
+    // subtypes of Object (not just interface types), and function types are
+    // considered subtypes of Function.
+    if (superclass.typeParameters.isEmpty) {
+      return superclass.rawType;
+    }
+    while (type is ir.TypeParameterType) {
+      type = (type as ir.TypeParameterType).parameter.bound;
+    }
+    if (type is ir.InterfaceType) {
+      ir.InterfaceType upcastType =
+          typeEnvironment.hierarchy.getTypeAsInstanceOf(type, superclass);
+      if (upcastType != null) return upcastType;
+    } else if (type is ir.BottomType) {
+      return superclass.bottomType;
+    }
+    return superclass.rawType;
+  }
+
+  @override
+  ir.DartType defaultNode(ir.Node node) {
+    return null;
+  }
+
+  ir.DartType visitNode(ir.Node node) {
+    return node?.accept(this);
+  }
+
+  Null visitNodes(List<ir.Node> nodes) {
+    for (ir.Node node in nodes) {
+      visitNode(node);
+    }
+  }
+
+  ir.DartType defaultExpression(ir.Expression node) {
+    throw fail('Unhandled node $node (${node.runtimeType})');
+  }
+
+  @override
+  ir.DartType visitAsExpression(ir.AsExpression node) {
+    return node.type;
+  }
+
+  @override
+  ir.DartType visitAwaitExpression(ir.AwaitExpression node) {
+    return typeEnvironment.unfutureType(visitNode(node.operand));
+  }
+
+  @override
+  ir.DartType visitBoolLiteral(ir.BoolLiteral node) => typeEnvironment.boolType;
+
+  @override
+  ir.DartType visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded node) =>
+      typeEnvironment.objectType;
+
+  @override
+  ir.DartType visitStringLiteral(ir.StringLiteral node) =>
+      typeEnvironment.stringType;
+
+  @override
+  ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
+    return typeEnvironment.stringType;
+  }
+
+  @override
+  ir.DartType visitNullLiteral(ir.NullLiteral node) => const ir.BottomType();
+
+  @override
+  ir.DartType visitIntLiteral(ir.IntLiteral node) => typeEnvironment.intType;
+
+  @override
+  ir.DartType visitDoubleLiteral(ir.DoubleLiteral node) =>
+      typeEnvironment.doubleType;
+
+  @override
+  ir.DartType visitSymbolLiteral(ir.SymbolLiteral node) =>
+      typeEnvironment.symbolType;
+
+  @override
+  ir.DartType visitListLiteral(ir.ListLiteral node) {
+    return typeEnvironment.literalListType(node.typeArgument);
+  }
+
+  @override
+  ir.DartType visitMapLiteral(ir.MapLiteral node) {
+    return typeEnvironment.literalMapType(node.keyType, node.valueType);
+  }
+
+  @override
+  ir.DartType visitVariableGet(ir.VariableGet node) =>
+      node.promotedType ?? node.variable.type;
+
+  @override
+  ir.DartType visitVariableSet(ir.VariableSet node) {
+    return visitNode(node.value);
+  }
+
+  ir.DartType computePropertyGetType(
+      ir.PropertyGet node, ir.DartType receiverType) {
+    ir.Member interfaceTarget = node.interfaceTarget;
+    if (interfaceTarget != null) {
+      ir.Class superclass = interfaceTarget.enclosingClass;
+      receiverType = getTypeAsInstanceOf(receiverType, superclass);
+      return ir.Substitution.fromInterfaceType(receiverType)
+          .substituteType(interfaceTarget.getterType);
+    }
+    // Treat the properties of Object specially.
+    String nameString = node.name.name;
+    if (nameString == 'hashCode') {
+      return typeEnvironment.intType;
+    } else if (nameString == 'runtimeType') {
+      return typeEnvironment.typeType;
+    }
+    return const ir.DynamicType();
+  }
+
+  @override
+  ir.DartType visitPropertyGet(ir.PropertyGet node) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    return computePropertyGetType(node, receiverType);
+  }
+
+  @override
+  ir.DartType visitPropertySet(ir.PropertySet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    ir.Class superclass = node.target.enclosingClass;
+    receiverType = getTypeAsInstanceOf(receiverType, superclass);
+    return ir.Substitution.fromInterfaceType(receiverType)
+        .substituteType(node.target.getterType);
+  }
+
+  @override
+  ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    if (typeEnvironment.isOverloadedArithmeticOperator(node.target)) {
+      ir.DartType argumentType = visitNode(node.arguments.positional[0]);
+      return typeEnvironment.getTypeOfOverloadedArithmetic(
+          receiverType, argumentType);
+    }
+    ir.Class superclass = node.target.enclosingClass;
+    receiverType = getTypeAsInstanceOf(receiverType, superclass);
+    ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
+        .substituteType(node.target.function.returnType);
+    return ir.Substitution.fromPairs(
+            node.target.function.typeParameters, node.arguments.types)
+        .substituteType(returnType);
+  }
+
+  @override
+  ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitThisExpression(ir.ThisExpression node) =>
+      typeEnvironment.thisType;
+
+  /// Returns `true` if [interfaceTarget] is an arithmetic operator whose result
+  /// type is computed using both the receiver type and the argument type.
+  ///
+  /// Visitors that subclass the [StaticTypeVisitor] must special case this
+  /// target as to avoid visiting the argument twice.
+  bool isSpecialCasedBinaryOperator(ir.Member interfaceTarget) {
+    return interfaceTarget is ir.Procedure &&
+        typeEnvironment.isOverloadedArithmeticOperator(interfaceTarget);
+  }
+
+  ir.DartType computeMethodInvocationType(
+      ir.MethodInvocation node, ir.DartType receiverType) {
+    ir.Member interfaceTarget = node.interfaceTarget;
+    if (interfaceTarget != null) {
+      if (isSpecialCasedBinaryOperator(interfaceTarget)) {
+        ir.DartType argumentType = visitNode(node.arguments.positional[0]);
+        return typeEnvironment.getTypeOfOverloadedArithmetic(
+            receiverType, argumentType);
+      }
+      ir.Class superclass = interfaceTarget.enclosingClass;
+      receiverType = getTypeAsInstanceOf(receiverType, superclass);
+      ir.DartType getterType = ir.Substitution.fromInterfaceType(receiverType)
+          .substituteType(interfaceTarget.getterType);
+      if (getterType is ir.FunctionType) {
+        return ir.Substitution.fromPairs(
+                getterType.typeParameters, node.arguments.types)
+            .substituteType(getterType.returnType);
+      } else {
+        return const ir.DynamicType();
+      }
+    }
+    if (node.name.name == 'call') {
+      if (receiverType is ir.FunctionType) {
+        if (receiverType.typeParameters.length != node.arguments.types.length) {
+          return const ir.BottomType();
+        }
+        return ir.Substitution.fromPairs(
+                receiverType.typeParameters, node.arguments.types)
+            .substituteType(receiverType.returnType);
+      }
+    }
+    if (node.name.name == '==') {
+      // We use this special case to simplify generation of '==' checks.
+      return typeEnvironment.boolType;
+    }
+    return const ir.DynamicType();
+  }
+
+  @override
+  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    return computeMethodInvocationType(node, receiverType);
+  }
+
+  @override
+  ir.DartType visitStaticGet(ir.StaticGet node) => node.target.getterType;
+
+  @override
+  ir.DartType visitStaticSet(ir.StaticSet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitStaticInvocation(ir.StaticInvocation node) {
+    return ir.Substitution.fromPairs(
+            node.target.function.typeParameters, node.arguments.types)
+        .substituteType(node.target.function.returnType);
+  }
+
+  @override
+  ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) {
+    return node.arguments.types.isEmpty
+        ? node.target.enclosingClass.rawType
+        : new ir.InterfaceType(
+            node.target.enclosingClass, node.arguments.types);
+  }
+
+  @override
+  ir.DartType visitSuperPropertyGet(ir.SuperPropertyGet node) {
+    if (node.interfaceTarget == null) {
+      // TODO(johnniwinther): Resolve and set the target here.
+      return const ir.DynamicType();
+    }
+    ir.Class declaringClass = node.interfaceTarget.enclosingClass;
+    if (declaringClass.typeParameters.isEmpty) {
+      return node.interfaceTarget.getterType;
+    }
+    ir.DartType receiver = typeEnvironment.hierarchy
+        .getTypeAsInstanceOf(typeEnvironment.thisType, declaringClass);
+    return ir.Substitution.fromInterfaceType(receiver)
+        .substituteType(node.interfaceTarget.getterType);
+  }
+
+  @override
+  ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+    if (node.interfaceTarget == null) {
+      // TODO(johnniwinther): Resolve and set the target here.
+      return const ir.DynamicType();
+    }
+    ir.Class superclass = node.interfaceTarget.enclosingClass;
+    ir.InterfaceType receiverType = typeEnvironment.hierarchy
+        .getTypeAsInstanceOf(typeEnvironment.thisType, superclass);
+    ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
+        .substituteType(node.interfaceTarget.function.returnType);
+    return ir.Substitution.fromPairs(
+            node.interfaceTarget.function.typeParameters, node.arguments.types)
+        .substituteType(returnType);
+  }
+
+  @override
+  ir.DartType visitThrow(ir.Throw node) => const ir.BottomType();
+
+  @override
+  ir.DartType visitRethrow(ir.Rethrow node) => const ir.BottomType();
+
+  @override
+  ir.DartType visitLogicalExpression(ir.LogicalExpression node) =>
+      typeEnvironment.boolType;
+
+  @override
+  ir.DartType visitNot(ir.Not node) {
+    return typeEnvironment.boolType;
+  }
+
+  @override
+  ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
+    return node.staticType;
+  }
+
+  @override
+  ir.DartType visitIsExpression(ir.IsExpression node) {
+    return typeEnvironment.boolType;
+  }
+
+  @override
+  ir.DartType visitTypeLiteral(ir.TypeLiteral node) => typeEnvironment.typeType;
+
+  @override
+  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
+    return node.function.functionType;
+  }
+
+  @override
+  ir.DartType visitLet(ir.Let node) {
+    return visitNode(node.body);
+  }
+
+  ir.DartType computeInstantiationType(
+      ir.Instantiation node, ir.FunctionType expressionType) {
+    return ir.Substitution.fromPairs(
+            expressionType.typeParameters, node.typeArguments)
+        .substituteType(expressionType.withoutTypeParameters);
+  }
+
+  @override
+  ir.DartType visitInstantiation(ir.Instantiation node) {
+    ir.FunctionType expressionType = visitNode(node.expression);
+    return computeInstantiationType(node, expressionType);
+  }
+
+  @override
+  ir.DartType visitInvalidExpression(ir.InvalidExpression node) =>
+      const ir.BottomType();
+
+  @override
+  ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
+    return typeEnvironment.futureType(const ir.DynamicType());
+  }
+}
+
+/// Visitor that computes the static type of an expression using a cache to
+/// avoid recomputations.
+class CachingStaticTypeVisitor extends StaticTypeVisitor {
+  Map<ir.Expression, ir.DartType> _cache = {};
+
+  CachingStaticTypeVisitor(ir.TypeEnvironment typeEnvironment)
+      : super(typeEnvironment);
+
+  @override
+  ir.DartType visitNode(ir.Node node) {
+    ir.DartType result;
+    if (node is ir.Expression) {
+      result = _cache[node];
+      if (result != null) return result;
+      result = super.visitNode(node);
+      _cache[node] = result;
+    } else {
+      result = super.visitNode(node);
+    }
+    return result;
+  }
+}
+
+/// Visitor that traverse the whole tree while returning the static type of
+/// expressions.
+abstract class StaticTypeTraversalVisitor extends StaticTypeVisitor {
+  StaticTypeTraversalVisitor(ir.TypeEnvironment typeEnvironment)
+      : super(typeEnvironment);
+
+  @override
+  ir.DartType defaultNode(ir.Node node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  Null defaultMember(ir.Member node) {
+    typeEnvironment.thisType =
+        node.enclosingClass != null ? node.enclosingClass.thisType : null;
+    node.visitChildren(this);
+    typeEnvironment.thisType = null;
+    return null;
+  }
+
+  ir.DartType visitExpressionStatement(ir.ExpressionStatement node) {
+    visitNode(node.expression);
+    return null;
+  }
+
+  @override
+  ir.DartType visitAsExpression(ir.AsExpression node) {
+    visitNode(node.operand);
+    return super.visitAsExpression(node);
+  }
+
+  @override
+  ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
+    visitNodes(node.expressions);
+    return super.visitStringConcatenation(node);
+  }
+
+  @override
+  ir.DartType visitListLiteral(ir.ListLiteral node) {
+    visitNodes(node.expressions);
+    return super.visitListLiteral(node);
+  }
+
+  @override
+  ir.DartType visitMapLiteral(ir.MapLiteral node) {
+    visitNodes(node.entries);
+    return super.visitMapLiteral(node);
+  }
+
+  @override
+  ir.DartType visitPropertySet(ir.PropertySet node) {
+    visitNode(node.receiver);
+    return super.visitPropertySet(node);
+  }
+
+  @override
+  ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+    return super.visitDirectMethodInvocation(node);
+  }
+
+  @override
+  ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
+    visitNode(node.receiver);
+    return super.visitDirectPropertySet(node);
+  }
+
+  @override
+  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
+    if (isSpecialCasedBinaryOperator(node.interfaceTarget)) {
+      return super.visitMethodInvocation(node);
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+    return super.visitMethodInvocation(node);
+  }
+
+  @override
+  ir.DartType visitStaticInvocation(ir.StaticInvocation node) {
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+    return super.visitStaticInvocation(node);
+  }
+
+  @override
+  ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) {
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+    return super.visitConstructorInvocation(node);
+  }
+
+  @override
+  ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+    return super.visitSuperMethodInvocation(node);
+  }
+
+  @override
+  ir.DartType visitThrow(ir.Throw node) {
+    visitNode(node.expression);
+    return super.visitThrow(node);
+  }
+
+  @override
+  ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
+    visitNode(node.left);
+    visitNode(node.right);
+    return super.visitLogicalExpression(node);
+  }
+
+  @override
+  ir.DartType visitNot(ir.Not node) {
+    visitNode(node.operand);
+    return super.visitNot(node);
+  }
+
+  @override
+  ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
+    visitNode(node.condition);
+    visitNode(node.then);
+    visitNode(node.otherwise);
+    return super.visitConditionalExpression(node);
+  }
+
+  @override
+  ir.DartType visitIsExpression(ir.IsExpression node) {
+    visitNode(node.operand);
+    return super.visitIsExpression(node);
+  }
+
+  @override
+  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
+    visitNode(node.function.body);
+    return super.visitFunctionExpression(node);
+  }
+
+  @override
+  ir.DartType visitLet(ir.Let node) {
+    visitNode(node.variable.initializer);
+    return super.visitLet(node);
+  }
+}
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index 3e97494..5cc478d 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -3,6 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
 import '../constants/constructors.dart';
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index a36eea2..f2e11f2 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -4,7 +4,7 @@
 
 library js_backend.backend.annotations;
 
-import '../common_elements.dart';
+import '../common_elements.dart' show KCommonElements, KElementEnvironment;
 import '../constants/values.dart';
 import '../diagnostics/diagnostic_listener.dart';
 import '../diagnostics/messages.dart';
@@ -14,8 +14,8 @@
 const VERBOSE_OPTIMIZER_HINTS = false;
 
 /// Returns `true` if inlining is disabled for [element].
-bool _noInline(ElementEnvironment elementEnvironment,
-    CommonElements commonElements, MemberEntity element) {
+bool _noInline(KElementEnvironment elementEnvironment,
+    KCommonElements commonElements, MemberEntity element) {
   if (_hasAnnotation(
       elementEnvironment, element, commonElements.metaNoInlineClass)) {
     return true;
@@ -30,8 +30,8 @@
 }
 
 /// Returns `true` if inlining is requested for [element].
-bool _tryInline(ElementEnvironment elementEnvironment,
-    CommonElements commonElements, MemberEntity element) {
+bool _tryInline(KElementEnvironment elementEnvironment,
+    KCommonElements commonElements, MemberEntity element) {
   if (_hasAnnotation(
       elementEnvironment, element, commonElements.metaTryInlineClass)) {
     return true;
@@ -41,22 +41,22 @@
 
 /// Returns `true` if parameter and returns types should be trusted for
 /// [element].
-bool _trustTypeAnnotations(ElementEnvironment elementEnvironment,
-    CommonElements commonElements, MemberEntity element) {
+bool _trustTypeAnnotations(KElementEnvironment elementEnvironment,
+    KCommonElements commonElements, MemberEntity element) {
   return _hasAnnotation(elementEnvironment, element,
       commonElements.expectTrustTypeAnnotationsClass);
 }
 
 /// Returns `true` if inference of parameter types is disabled for [element].
-bool _assumeDynamic(ElementEnvironment elementEnvironment,
-    CommonElements commonElements, MemberEntity element) {
+bool _assumeDynamic(KElementEnvironment elementEnvironment,
+    KCommonElements commonElements, MemberEntity element) {
   return _hasAnnotation(
       elementEnvironment, element, commonElements.expectAssumeDynamicClass);
 }
 
 /// Returns `true` if [element] is annotated with [annotationClass].
-bool _hasAnnotation(ElementEnvironment elementEnvironment, MemberEntity element,
-    ClassEntity annotationClass) {
+bool _hasAnnotation(KElementEnvironment elementEnvironment,
+    MemberEntity element, ClassEntity annotationClass) {
   if (annotationClass == null) return false;
   for (ConstantValue value in elementEnvironment.getMemberMetadata(element)) {
     if (value.isConstructedObject) {
@@ -73,8 +73,8 @@
 // TODO(johnniwinther): Merge this with [AnnotationProcessor].
 AnnotationsData processAnnotations(
     DiagnosticReporter reporter,
-    CommonElements commonElements,
-    ElementEnvironment elementEnvironment,
+    KCommonElements commonElements,
+    KElementEnvironment elementEnvironment,
     Iterable<MemberEntity> processedMembers) {
   AnnotationsDataBuilder annotationsDataBuilder = new AnnotationsDataBuilder();
 
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 75186d5..b3e02ac 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -115,7 +115,7 @@
 
   BackendUsageBuilderImpl(this._frontendStrategy);
 
-  CommonElements get _commonElements => _frontendStrategy.commonElements;
+  KCommonElements get _commonElements => _frontendStrategy.commonElements;
 
   @override
   void registerBackendFunctionUse(FunctionEntity element) {
@@ -160,10 +160,6 @@
         element == _commonElements.stringClass) {
       // TODO(johnniwinther): Avoid these.
       return true;
-    } else if (element == _commonElements.genericNoSuchMethod ||
-        element == _commonElements.unresolvedConstructorError ||
-        element == _commonElements.malformedTypeError) {
-      return true;
     }
     return false;
   }
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 709b64f..2d2ddea 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -36,7 +36,7 @@
       new RegExp(r'''^ *(//.*)?\n|  *//[^''"\n]*$''', multiLine: true);
 
   final CompilerOptions _options;
-  final CommonElements _commonElements;
+  final JCommonElements _commonElements;
   final CodegenWorldBuilder _worldBuilder;
   final RuntimeTypesNeed _rtiNeed;
   final RuntimeTypesEncoder _rtiEncoder;
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 361a39b..44c9b93 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -180,10 +180,14 @@
         _registerInstantiatedType(type, nativeUsage: true);
         break;
       case TypeUseKind.IS_CHECK:
-      case TypeUseKind.AS_CAST:
       case TypeUseKind.CATCH_TYPE:
         _registerIsCheck(type);
         break;
+      case TypeUseKind.AS_CAST:
+        if (!_options.omitAsCasts) {
+          _registerIsCheck(type);
+        }
+        break;
       case TypeUseKind.IMPLICIT_CAST:
         if (_options.implicitDowncastCheckPolicy.isEmitted) {
           _registerIsCheck(type);
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 8876430..282086e 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -160,8 +160,10 @@
           onIsCheck(type, transformed);
           break;
         case TypeUseKind.AS_CAST:
-          onIsCheck(type, transformed);
-          hasAsCast = true;
+          if (!_options.omitAsCasts) {
+            onIsCheck(type, transformed);
+            hasAsCast = true;
+          }
           break;
         case TypeUseKind.IMPLICIT_CAST:
           if (_options.implicitDowncastCheckPolicy.isEmitted) {
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index f621411..f4db4d7 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -5,7 +5,8 @@
 library js_backend.interceptor_data;
 
 import '../common/names.dart' show Identifiers;
-import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../common_elements.dart'
+    show CommonElements, KCommonElements, KElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../js/js.dart' as jsAst;
@@ -219,8 +220,8 @@
 
 class InterceptorDataBuilderImpl implements InterceptorDataBuilder {
   final NativeBasicData _nativeData;
-  final ElementEnvironment _elementEnvironment;
-  final CommonElements _commonElements;
+  final KElementEnvironment _elementEnvironment;
+  final KCommonElements _commonElements;
 
   /// The members of instantiated interceptor classes: maps a member name to the
   /// list of members that have that name. This map is used by the codegen to
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index e73e773..aef92595 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -5,7 +5,7 @@
 library js_backend.backend.resolution_listener;
 
 import '../common/names.dart' show Identifiers;
-import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../common_elements.dart' show KCommonElements, KElementEnvironment;
 import '../constants/values.dart';
 import '../deferred_load.dart';
 import '../elements/entities.dart';
@@ -32,8 +32,8 @@
   final DeferredLoadTask _deferredLoadTask;
 
   final CompilerOptions _options;
-  final ElementEnvironment _elementEnvironment;
-  final CommonElements _commonElements;
+  final KElementEnvironment _elementEnvironment;
+  final KCommonElements _commonElements;
   final BackendImpacts _impacts;
 
   final NativeBasicData _nativeData;
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index d2ff93c..0faa130 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -6,7 +6,12 @@
 
 import '../common.dart';
 import '../common/names.dart' show Identifiers;
-import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../common_elements.dart'
+    show
+        CommonElements,
+        ElementEnvironment,
+        JCommonElements,
+        JElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
@@ -286,7 +291,8 @@
   JClosedWorld get _closedWorld;
   TypeChecks get _requiredChecks;
 
-  ElementEnvironment get _elementEnvironment => _closedWorld.elementEnvironment;
+  JElementEnvironment get _elementEnvironment =>
+      _closedWorld.elementEnvironment;
   DartTypes get _types => _closedWorld.dartTypes;
   RuntimeTypesNeed get _rtiNeed => _closedWorld.rtiNeed;
 
@@ -1719,9 +1725,6 @@
         });
         localFunctionsNeedingSignature.addAll(localFunctions);
       }
-      for (FunctionEntity function in resolutionWorldBuilder.genericMethods) {
-        potentiallyNeedTypeArguments(function);
-      }
       for (FunctionEntity function
           in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
         methodsNeedingSignature.add(function);
@@ -1852,8 +1855,9 @@
 
   RuntimeTypesImpl(this._closedWorld) : super(_closedWorld.dartTypes);
 
-  CommonElements get _commonElements => _closedWorld.commonElements;
-  ElementEnvironment get _elementEnvironment => _closedWorld.elementEnvironment;
+  JCommonElements get _commonElements => _closedWorld.commonElements;
+  JElementEnvironment get _elementEnvironment =>
+      _closedWorld.elementEnvironment;
   RuntimeTypesNeed get _rtiNeed => _closedWorld.rtiNeed;
 
   @override
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 4b4b1c4..6592f68 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -12,8 +12,8 @@
  */
 class Collector {
   final CompilerOptions _options;
-  final CommonElements _commonElements;
-  final ElementEnvironment _elementEnvironment;
+  final JCommonElements _commonElements;
+  final JElementEnvironment _elementEnvironment;
   final OutputUnitData _outputUnitData;
   final CodegenWorldBuilder _worldBuilder;
   // TODO(floitsch): the code-emitter task should not need a namer.
@@ -116,7 +116,7 @@
 
   // Return the classes that are just helpers for the backend's type system.
   static Iterable<ClassEntity> getBackendTypeHelpers(
-      CommonElements commonElements) {
+      JCommonElements commonElements) {
     return <ClassEntity>[
       commonElements.jsMutableArrayClass,
       commonElements.jsFixedArrayClass,
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
index ae7de9e..c5f8d9a 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
@@ -27,8 +27,8 @@
 
 class FieldVisitor {
   final CompilerOptions _options;
-  final ElementEnvironment _elementEnvironment;
-  final CommonElements _commonElements;
+  final JElementEnvironment _elementEnvironment;
+  final JCommonElements _commonElements;
   final CodegenWorldBuilder _codegenWorldBuilder;
   final NativeData _nativeData;
   final Namer _namer;
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index de9d367..519a395 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -11,7 +11,7 @@
 import '../../common/names.dart' show Names, Selectors;
 import '../../constants/values.dart'
     show ConstantValue, InterceptorConstantValue;
-import '../../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../../common_elements.dart' show JCommonElements, JElementEnvironment;
 import '../../deferred_load.dart'
     show DeferredLoadTask, OutputUnit, OutputUnitData;
 import '../../elements/entities.dart';
@@ -61,8 +61,8 @@
 class ProgramBuilder {
   final CompilerOptions _options;
   final DiagnosticReporter _reporter;
-  final ElementEnvironment _elementEnvironment;
-  final CommonElements _commonElements;
+  final JElementEnvironment _elementEnvironment;
+  final JCommonElements _commonElements;
   final DeferredLoadTask _deferredLoadTask;
   final OutputUnitData _outputUnitData;
   final CodegenWorldBuilder _worldBuilder;
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index 32e0c66..2195bc8 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -6,7 +6,7 @@
 
 import '../common.dart';
 import '../constants/values.dart';
-import '../common_elements.dart';
+import '../common_elements.dart' show JCommonElements, JElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
 import '../elements/names.dart';
@@ -28,7 +28,7 @@
 /// global type inference and building the SSA graph for members.
 abstract class JsToElementMap {
   /// Access to the commonly used elements and types.
-  CommonElements get commonElements;
+  JCommonElements get commonElements;
 
   /// Access to the [DartTypes] object.
   DartTypes get types;
@@ -126,7 +126,7 @@
   DartType getStaticType(ir.Expression node);
 
   /// [ElementEnvironment] for library, class and member lookup.
-  ElementEnvironment get elementEnvironment;
+  JElementEnvironment get elementEnvironment;
 
   /// Returns the list of [DartType]s corresponding to [types].
   List<DartType> getDartTypes(List<ir.DartType> types);
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 4bb698f..5d2fb0c 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
 import '../constants/values.dart';
-import '../common_elements.dart';
+import '../common_elements.dart' show KCommonElements, KElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
@@ -21,15 +22,17 @@
 /// Interface that translates between Kernel IR nodes and entities used for
 /// computing the [WorldImpact] for members.
 abstract class KernelToElementMap {
-  ElementEnvironment get elementEnvironment;
+  KElementEnvironment get elementEnvironment;
   NativeBasicData get nativeBasicData;
 
   /// Access to the commonly used elements and types.
-  CommonElements get commonElements;
+  KCommonElements get commonElements;
 
   /// Access to the [DartTypes] object.
   DartTypes get types;
 
+  ir.TypeEnvironment get typeEnvironment;
+
   /// Returns the [DartType] corresponding to [type].
   DartType getDartType(ir.DartType type);
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index d09ed9c..5fd5bfb 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
@@ -68,8 +69,8 @@
 abstract class KernelToElementMapBase implements IrToElementMap {
   final CompilerOptions options;
   final DiagnosticReporter reporter;
-  CommonElements _commonElements;
-  ElementEnvironment _elementEnvironment;
+  CommonElementsImpl _commonElements;
+  KernelElementEnvironment _elementEnvironment;
   DartTypeConverter _typeConverter;
   KernelConstantEnvironment _constantEnvironment;
   KernelDartTypes _types;
@@ -91,7 +92,7 @@
 
   KernelToElementMapBase(this.options, this.reporter, Environment environment) {
     _elementEnvironment = new KernelElementEnvironment(this);
-    _commonElements = new CommonElements(_elementEnvironment);
+    _commonElements = new CommonElementsImpl(_elementEnvironment);
     _constantEnvironment = new KernelConstantEnvironment(this, environment);
     _typeConverter = new DartTypeConverter(this);
     _types = new KernelDartTypes(this);
@@ -101,10 +102,10 @@
 
   DartTypes get types => _types;
 
-  ElementEnvironment get elementEnvironment => _elementEnvironment;
+  KernelElementEnvironment get elementEnvironment => _elementEnvironment;
 
   @override
-  CommonElements get commonElements => _commonElements;
+  CommonElementsImpl get commonElements => _commonElements;
 
   /// NativeBasicData is need for computation of the default super class.
   NativeBasicData get nativeBasicData;
@@ -130,10 +131,12 @@
       } else if (spannable is IndexedClass &&
           spannable.classIndex < classes.length) {
         ClassData data = classes.getData(spannable);
+        assert(data != null, "No data for $spannable in $this");
         return data.definition.location;
       } else if (spannable is IndexedMember &&
           spannable.memberIndex < members.length) {
         MemberData data = members.getData(spannable);
+        assert(data != null, "No data for $spannable in $this");
         return data.definition.location;
       } else if (spannable is KLocalFunction) {
         return getSourceSpan(spannable.memberContext, currentElement);
@@ -284,7 +287,47 @@
           return supertype;
         }
 
-        InterfaceType supertype = processSupertype(node.supertype);
+        InterfaceType supertype;
+        LinkBuilder<InterfaceType> linkBuilder =
+            new LinkBuilder<InterfaceType>();
+        if (node.isMixinDeclaration) {
+          // A mixin declaration
+          //
+          //   mixin M on A, B, C {}
+          //
+          // is encoded by CFE as
+          //
+          //   abstract class M extends A with B, C {}
+          //
+          // but we encode it as
+          //
+          //   abstract class M extends Object implements A, B, C {}
+          //
+          // so we need to collect the non-Object superclasses and add them
+          // to the interfaces of M.
+
+          ir.Class superclass = node.superclass;
+          while (superclass != null) {
+            if (superclass.isAnonymousMixin) {
+              // Add second to last mixed in superclasses. `B` and `C` in the
+              // example above.
+              ir.DartType mixinType = typeEnvironment.hierarchy
+                  .getTypeAsInstanceOf(node.thisType, superclass.mixedInClass);
+              linkBuilder.addLast(getDartType(mixinType));
+            } else {
+              // Add first mixed in superclass. `A` in the example above.
+              ir.DartType mixinType = typeEnvironment.hierarchy
+                  .getTypeAsInstanceOf(node.thisType, superclass);
+              linkBuilder.addLast(getDartType(mixinType));
+              break;
+            }
+            superclass = superclass.superclass;
+          }
+          // Set superclass to `Object`.
+          supertype = _commonElements.objectType;
+        } else {
+          supertype = processSupertype(node.supertype);
+        }
         if (supertype == _commonElements.objectType) {
           ClassEntity defaultSuperclass =
               _commonElements.getDefaultSuperclass(cls, nativeBasicData);
@@ -292,8 +335,6 @@
         } else {
           data.supertype = supertype;
         }
-        LinkBuilder<InterfaceType> linkBuilder =
-            new LinkBuilder<InterfaceType>();
         if (node.mixedInType != null) {
           data.isMixinApplication = true;
           linkBuilder
@@ -709,20 +750,24 @@
     return data.imports[node];
   }
 
-  DartType getStaticType(ir.Expression node) {
+  ir.TypeEnvironment get typeEnvironment {
     if (_typeEnvironment == null) {
       _typeEnvironment ??= new ir.TypeEnvironment(
           new ir.CoreTypes(env.mainComponent),
           new ir.ClassHierarchy(env.mainComponent));
     }
+    return _typeEnvironment;
+  }
+
+  DartType getStaticType(ir.Expression node) {
     ir.TreeNode enclosingClass = node;
     while (enclosingClass != null && enclosingClass is! ir.Class) {
       enclosingClass = enclosingClass.parent;
     }
     try {
-      _typeEnvironment.thisType =
+      typeEnvironment.thisType =
           enclosingClass is ir.Class ? enclosingClass.thisType : null;
-      return getDartType(node.getStaticType(_typeEnvironment));
+      return getDartType(node.getStaticType(typeEnvironment));
     } catch (e) {
       // The static type computation crashes on type errors. Use `dynamic`
       // as static type.
@@ -1717,7 +1762,8 @@
   }
 }
 
-class KernelElementEnvironment extends ElementEnvironment {
+class KernelElementEnvironment extends ElementEnvironment
+    implements KElementEnvironment, JElementEnvironment {
   final KernelToElementMapBase elementMap;
 
   KernelElementEnvironment(this.elementMap);
@@ -1855,7 +1901,7 @@
   }
 
   @override
-  ConstantExpression getFieldConstant(FieldEntity field) {
+  ConstantExpression getFieldConstantForTesting(FieldEntity field) {
     return elementMap._getFieldConstantExpression(field);
   }
 
@@ -1930,8 +1976,7 @@
 
   @override
   void forEachConstructor(
-      ClassEntity cls, void f(ConstructorEntity constructor),
-      {bool ensureResolved: true}) {
+      ClassEntity cls, void f(ConstructorEntity constructor)) {
     elementMap._forEachConstructor(cls, f);
   }
 
@@ -2128,9 +2173,9 @@
 
 class KClosedWorldImpl extends ClosedWorldRtiNeedMixin implements KClosedWorld {
   final KernelToElementMapImpl elementMap;
-  final ElementEnvironment elementEnvironment;
+  final KElementEnvironment elementEnvironment;
   final DartTypes dartTypes;
-  final CommonElements commonElements;
+  final KCommonElements commonElements;
   final NativeData nativeData;
   final InterceptorData interceptorData;
   final BackendUsage backendUsage;
@@ -2200,7 +2245,7 @@
       this.elementMap, this.nativeBasicData, this.nativeDataBuilder);
 
   @override
-  ElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
+  KElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
 
   @override
   CommonElements get commonElements => elementMap.commonElements;
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index e0f5e9e..5aa12e1 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -12,8 +12,8 @@
   KernelAnnotationProcessor(this.elementMap, this._nativeBasicDataBuilder);
 
   void extractNativeAnnotations(LibraryEntity library) {
-    ElementEnvironment elementEnvironment = elementMap.elementEnvironment;
-    CommonElements commonElements = elementMap.commonElements;
+    KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
+    KCommonElements commonElements = elementMap.commonElements;
 
     elementEnvironment.forEachClass(library, (ClassEntity cls) {
       String annotationName;
@@ -34,7 +34,7 @@
 
   String getJsInteropName(
       Spannable spannable, Iterable<ConstantValue> metadata) {
-    CommonElements commonElements = elementMap.commonElements;
+    KCommonElements commonElements = elementMap.commonElements;
     String annotationName;
     for (ConstantValue value in metadata) {
       String name = readAnnotationName(
@@ -61,8 +61,8 @@
 
   void extractJsInteropAnnotations(LibraryEntity library) {
     DiagnosticReporter reporter = elementMap.reporter;
-    ElementEnvironment elementEnvironment = elementMap.elementEnvironment;
-    CommonElements commonElements = elementMap.commonElements;
+    KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
+    KCommonElements commonElements = elementMap.commonElements;
 
     String libraryName = getJsInteropName(
         library, elementEnvironment.getLibraryMetadata(library));
@@ -244,8 +244,8 @@
   void processJsInteropAnnotations(
       NativeBasicData nativeBasicData, NativeDataBuilder nativeDataBuilder) {
     DiagnosticReporter reporter = elementMap.reporter;
-    ElementEnvironment elementEnvironment = elementMap.elementEnvironment;
-    CommonElements commonElements = elementMap.commonElements;
+    KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
+    KCommonElements commonElements = elementMap.commonElements;
 
     for (LibraryEntity library in elementEnvironment.libraries) {
       // Error checking for class inheritance must happen after the first pass
diff --git a/pkg/compiler/lib/src/native/resolver.dart b/pkg/compiler/lib/src/native/resolver.dart
index a404474..31936b5 100644
--- a/pkg/compiler/lib/src/native/resolver.dart
+++ b/pkg/compiler/lib/src/native/resolver.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../common.dart';
-import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../common_elements.dart' show CommonElements, KElementEnvironment;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../js_backend/native_data.dart';
@@ -18,7 +18,7 @@
 abstract class NativeMemberResolverBase implements NativeMemberResolver {
   static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
 
-  ElementEnvironment get elementEnvironment;
+  KElementEnvironment get elementEnvironment;
   CommonElements get commonElements;
   NativeBasicData get nativeBasicData;
   NativeDataBuilder get nativeDataBuilder;
@@ -150,7 +150,7 @@
 }
 
 class BaseNativeClassFinder implements NativeClassFinder {
-  final ElementEnvironment _elementEnvironment;
+  final KElementEnvironment _elementEnvironment;
   final NativeBasicData _nativeBasicData;
 
   Map<String, ClassEntity> _tagOwner = new Map<String, ClassEntity>();
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 7583e78..9dbf70e 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -182,6 +182,9 @@
   /// Whether to omit implicit strong mode checks.
   bool omitImplicitChecks = false;
 
+  /// Whether to omit as casts.
+  bool omitAsCasts = false;
+
   /// Whether to omit class type arguments only needed for `toString` on
   /// `Object.runtimeType`.
   bool laxRuntimeTypeToString = false;
@@ -294,6 +297,7 @@
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
+      ..omitAsCasts = _hasOption(options, Flags.omitAsCasts)
       ..laxRuntimeTypeToString =
           _hasOption(options, Flags.laxRuntimeTypeToString)
       ..testMode = _hasOption(options, Flags.testMode)
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 7305936..185ea5b 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -154,7 +154,7 @@
 
   KernelToLocalsMap get localsMap => _currentFrame.localsMap;
 
-  CommonElements get _commonElements => _elementMap.commonElements;
+  JCommonElements get _commonElements => _elementMap.commonElements;
 
   KernelToTypeInferenceMap get _typeInferenceMap =>
       _currentFrame.typeInferenceMap;
@@ -2066,7 +2066,8 @@
     }
 
     DartType type = _elementMap.getDartType(node.type);
-    if (!node.isTypeError || options.implicitDowncastCheckPolicy.isEmitted) {
+    if ((!node.isTypeError && !options.omitAsCasts) ||
+        options.implicitDowncastCheckPolicy.isEmitted) {
       HInstruction converted = typeBuilder.buildTypeConversion(
           expressionInstruction,
           localsHandler.substInContext(type),
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index a628953..c01289d 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -13,7 +13,7 @@
 import '../common/tasks.dart' show CompilerTask;
 import '../constants/constant_system.dart';
 import '../constants/values.dart';
-import '../common_elements.dart' show CommonElements;
+import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
 import '../elements/types.dart';
@@ -238,7 +238,7 @@
 
   CodegenRegistry get _registry => _work.registry;
 
-  CommonElements get _commonElements => _closedWorld.commonElements;
+  JCommonElements get _commonElements => _closedWorld.commonElements;
 
   ConstantSystem get _constantSystem => _closedWorld.constantSystem;
 
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index d004ddb..5c53a0b 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -63,7 +63,7 @@
 
   CompilerOptions get options => compiler.options;
 
-  CommonElements get commonElements => closedWorld.commonElements;
+  JCommonElements get commonElements => closedWorld.commonElements;
 
   CodeEmitterTask get emitter => backend.emitter;
 
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 0f34e16..2128638 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.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.
 
-import '../common_elements.dart' show CommonElements;
+import '../common_elements.dart' show JCommonElements;
 import '../constants/constant_system.dart';
 import '../constants/values.dart';
 import '../elements/entities.dart';
@@ -39,7 +39,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     return null;
   }
@@ -51,7 +51,7 @@
   }
 
   Selector renameToOptimizedSelector(
-      String name, Selector selector, CommonElements commonElements) {
+      String name, Selector selector, JCommonElements commonElements) {
     if (selector.name == name) return selector;
     return new Selector.call(new Name(name, commonElements.interceptorsLibrary),
         new CallStructure(selector.argumentCount));
@@ -121,7 +121,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.inputs[1];
     HInstruction index = instruction.inputs[2];
@@ -152,7 +152,7 @@
       HInvokeDynamic instruction,
       HInstruction receiver,
       HInstruction value,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     // Handle typed arrays by recognizing the exact implementation of `[]=` and
     // checking if [value] has the appropriate type.
@@ -185,7 +185,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     if (!instruction.inputs[1]
         .isIndexablePrimitive(closedWorld.abstractValueDomain)) {
@@ -233,7 +233,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld.abstractValueDomain)) {
@@ -280,7 +280,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld.abstractValueDomain)) {
@@ -319,7 +319,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld.abstractValueDomain)) {
@@ -368,7 +368,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     if (isBuiltin(instruction, closedWorld)) {
       HInstruction builtin =
@@ -697,7 +697,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction right = instruction.inputs[2];
     if (isBuiltin(instruction, closedWorld)) {
@@ -788,7 +788,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
@@ -841,7 +841,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
@@ -1012,7 +1012,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
@@ -1035,7 +1035,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
@@ -1139,7 +1139,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index
     // bounds checking optimizations as for HIndex.
@@ -1167,7 +1167,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     // `compareTo` has no side-effect (other than throwing) and can be GVN'ed
@@ -1199,7 +1199,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     if (receiver.isStringOrNull(closedWorld.abstractValueDomain)) {
@@ -1227,7 +1227,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     HInstruction pattern = instruction.inputs[2];
@@ -1253,7 +1253,7 @@
       HGraph graph,
       GlobalTypeInferenceResults results,
       CompilerOptions options,
-      CommonElements commonElements,
+      JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     if (receiver.isNumberOrNull(closedWorld.abstractValueDomain)) {
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index c88565b..3b4b976 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -13,6 +13,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../ir/static_type.dart';
 import '../ir/util.dart';
 import '../js_backend/native_data.dart';
 import '../kernel/element_map.dart';
@@ -42,20 +43,18 @@
   throw new UnsupportedError("Unsupported member: $member");
 }
 
-class KernelImpactBuilder extends ir.Visitor {
+class KernelImpactBuilder extends StaticTypeVisitor {
   final ResolutionWorldImpactBuilder impactBuilder;
   final KernelToElementMap elementMap;
   final DiagnosticReporter reporter;
   final CompilerOptions _options;
   final MemberEntity currentMember;
-  _ClassEnsurer classEnsurer;
 
   KernelImpactBuilder(
       this.elementMap, this.currentMember, this.reporter, this._options)
       : this.impactBuilder =
-            new ResolutionWorldImpactBuilder('${currentMember}') {
-    this.classEnsurer = new _ClassEnsurer(this, this.elementMap.types);
-  }
+            new ResolutionWorldImpactBuilder('${currentMember}'),
+        super(elementMap.typeEnvironment);
 
   CommonElements get commonElements => elementMap.commonElements;
 
@@ -79,23 +78,16 @@
     return type;
   }
 
-  void registerSeenClasses(ir.DartType irType) {
-    DartType type = elementMap.getDartType(irType);
-    classEnsurer.ensureClassesInType(type);
-  }
-
   /// Add checked-mode type use for the parameter type and constant for the
   /// default value of [parameter].
   void handleParameter(ir.VariableDeclaration parameter) {
     checkType(parameter.type, TypeUseKind.PARAMETER_CHECK);
-    registerSeenClasses(parameter.type);
     visitNode(parameter.initializer);
   }
 
   /// Add checked-mode type use for parameter and return types, and add
   /// constants for default values.
   void handleSignature(ir.FunctionNode node) {
-    registerSeenClasses(node.returnType);
     node.positionalParameters.forEach(handleParameter);
     node.namedParameters.forEach(handleParameter);
     for (ir.TypeParameter parameter in node.typeParameters) {
@@ -104,8 +96,8 @@
   }
 
   ResolutionImpact buildField(ir.Field field) {
+    typeEnvironment.thisType = field.enclosingClass?.thisType;
     checkType(field.type, TypeUseKind.PARAMETER_CHECK);
-    registerSeenClasses(field.type);
     if (field.initializer != null) {
       visitNode(field.initializer);
       if (!field.isInstanceMember &&
@@ -126,10 +118,12 @@
       impactBuilder
           .registerNativeData(elementMap.getNativeBehaviorForFieldStore(field));
     }
+    typeEnvironment.thisType = null;
     return impactBuilder;
   }
 
   ResolutionImpact buildConstructor(ir.Constructor constructor) {
+    typeEnvironment.thisType = constructor.enclosingClass.thisType;
     handleSignature(constructor.function);
     visitNodes(constructor.initializers);
     visitNode(constructor.function.body);
@@ -139,6 +133,7 @@
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(constructor, isJsInterop: isJsInterop));
     }
+    typeEnvironment.thisType = null;
     return impactBuilder;
   }
 
@@ -185,6 +180,7 @@
   }
 
   ResolutionImpact buildProcedure(ir.Procedure procedure) {
+    typeEnvironment.thisType = procedure.enclosingClass?.thisType;
     handleSignature(procedure.function);
     visitNode(procedure.function.body);
     handleAsyncMarker(procedure.function);
@@ -194,118 +190,119 @@
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(procedure, isJsInterop: isJsInterop));
     }
+    typeEnvironment.thisType = null;
     return impactBuilder;
   }
 
-  void visitNode(ir.Node node) => node?.accept(this);
+  @override
+  Null visitBlock(ir.Block node) => visitNodes(node.statements);
 
-  void visitNodes(Iterable<ir.Node> nodes) {
-    nodes.forEach(visitNode);
+  @override
+  Null visitExpressionStatement(ir.ExpressionStatement node) {
+    visitNode(node.expression);
   }
 
   @override
-  void visitBlock(ir.Block block) => visitNodes(block.statements);
-
-  @override
-  void visitExpressionStatement(ir.ExpressionStatement exprStatement) {
-    visitNode(exprStatement.expression);
+  Null visitReturnStatement(ir.ReturnStatement node) {
+    visitNode(node.expression);
   }
 
   @override
-  void visitReturnStatement(ir.ReturnStatement returnStatement) {
-    visitNode(returnStatement.expression);
+  Null visitIfStatement(ir.IfStatement node) {
+    visitNode(node.condition);
+    visitNode(node.then);
+    visitNode(node.otherwise);
   }
 
   @override
-  void visitIfStatement(ir.IfStatement ifStatement) {
-    visitNode(ifStatement.condition);
-    visitNode(ifStatement.then);
-    visitNode(ifStatement.otherwise);
+  ir.DartType visitIntLiteral(ir.IntLiteral node) {
+    impactBuilder.registerConstantLiteral(
+        new IntConstantExpression(new BigInt.from(node.value).toUnsigned(64)));
+    return super.visitIntLiteral(node);
   }
 
   @override
-  void visitIntLiteral(ir.IntLiteral literal) {
-    impactBuilder.registerConstantLiteral(new IntConstantExpression(
-        new BigInt.from(literal.value).toUnsigned(64)));
-  }
-
-  @override
-  void visitDoubleLiteral(ir.DoubleLiteral literal) {
+  ir.DartType visitDoubleLiteral(ir.DoubleLiteral node) {
     impactBuilder
-        .registerConstantLiteral(new DoubleConstantExpression(literal.value));
+        .registerConstantLiteral(new DoubleConstantExpression(node.value));
+    return super.visitDoubleLiteral(node);
   }
 
   @override
-  void visitBoolLiteral(ir.BoolLiteral literal) {
+  ir.DartType visitBoolLiteral(ir.BoolLiteral node) {
     impactBuilder
-        .registerConstantLiteral(new BoolConstantExpression(literal.value));
+        .registerConstantLiteral(new BoolConstantExpression(node.value));
+    return super.visitBoolLiteral(node);
   }
 
   @override
-  void visitStringLiteral(ir.StringLiteral literal) {
+  ir.DartType visitStringLiteral(ir.StringLiteral node) {
     impactBuilder
-        .registerConstantLiteral(new StringConstantExpression(literal.value));
+        .registerConstantLiteral(new StringConstantExpression(node.value));
+    return super.visitStringLiteral(node);
   }
 
   @override
-  void visitSymbolLiteral(ir.SymbolLiteral literal) {
-    impactBuilder.registerConstSymbolName(literal.value);
+  ir.DartType visitSymbolLiteral(ir.SymbolLiteral node) {
+    impactBuilder.registerConstSymbolName(node.value);
+    return super.visitSymbolLiteral(node);
   }
 
   @override
-  void visitNullLiteral(ir.NullLiteral literal) {
+  ir.DartType visitNullLiteral(ir.NullLiteral node) {
     impactBuilder.registerConstantLiteral(new NullConstantExpression());
+    return super.visitNullLiteral(node);
   }
 
   @override
-  void visitListLiteral(ir.ListLiteral literal) {
-    visitNodes(literal.expressions);
-    DartType elementType = elementMap.getDartType(literal.typeArgument);
-    registerSeenClasses(literal.typeArgument);
+  ir.DartType visitListLiteral(ir.ListLiteral node) {
+    visitNodes(node.expressions);
+    DartType elementType = elementMap.getDartType(node.typeArgument);
 
     impactBuilder.registerListLiteral(new ListLiteralUse(
         commonElements.listType(elementType),
-        isConstant: literal.isConst,
-        isEmpty: literal.expressions.isEmpty));
+        isConstant: node.isConst,
+        isEmpty: node.expressions.isEmpty));
+    return super.visitListLiteral(node);
   }
 
   @override
-  void visitMapLiteral(ir.MapLiteral literal) {
-    visitNodes(literal.entries);
-    DartType keyType = elementMap.getDartType(literal.keyType);
-    DartType valueType = elementMap.getDartType(literal.valueType);
-    registerSeenClasses(literal.keyType);
-    registerSeenClasses(literal.valueType);
+  ir.DartType visitMapLiteral(ir.MapLiteral node) {
+    visitNodes(node.entries);
+    DartType keyType = elementMap.getDartType(node.keyType);
+    DartType valueType = elementMap.getDartType(node.valueType);
     impactBuilder.registerMapLiteral(new MapLiteralUse(
         commonElements.mapType(keyType, valueType),
-        isConstant: literal.isConst,
-        isEmpty: literal.entries.isEmpty));
+        isConstant: node.isConst,
+        isEmpty: node.entries.isEmpty));
+    return super.visitMapLiteral(node);
   }
 
   @override
-  void visitMapEntry(ir.MapEntry entry) {
+  Null visitMapEntry(ir.MapEntry entry) {
     visitNode(entry.key);
     visitNode(entry.value);
   }
 
   @override
-  void visitConditionalExpression(ir.ConditionalExpression node) {
+  ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
     visitNode(node.condition);
     visitNode(node.then);
     visitNode(node.otherwise);
-    // Don't visit the static type.
+    return super.visitConditionalExpression(node);
   }
 
   List<DartType> _visitArguments(ir.Arguments arguments) {
-    arguments.positional.forEach(visitNode);
-    arguments.named.forEach(visitNode);
+    visitNodes(arguments.positional);
+    visitNodes(arguments.named);
     if (arguments.types.isEmpty) return null;
     return arguments.types.map(elementMap.getDartType).toList();
   }
 
   @override
-  void visitConstructorInvocation(ir.ConstructorInvocation node) {
+  ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) {
     handleNew(node, node.target, isConst: node.isConst);
+    return super.visitConstructorInvocation(node);
   }
 
   void handleNew(ir.InvocationExpression node, ir.Member target,
@@ -326,7 +323,6 @@
 
     InterfaceType type = elementMap.createInterfaceType(
         target.enclosingClass, node.arguments.types);
-    classEnsurer.ensureClassesInType(type);
     CallStructure callStructure = elementMap.getCallStructure(node.arguments);
     impactBuilder.registerStaticUse(isConst
         ? new StaticUse.constConstructorInvoke(constructor, callStructure, type)
@@ -352,7 +348,7 @@
   }
 
   @override
-  void visitSuperInitializer(ir.SuperInitializer node) {
+  Null visitSuperInitializer(ir.SuperInitializer node) {
     // TODO(johnniwinther): Maybe rewrite `node.target` to point to a
     // synthesized unnamed mixin constructor when needed. This would require us
     // to consider impact building a required pre-step for inference and
@@ -365,7 +361,7 @@
   }
 
   @override
-  void visitStaticInvocation(ir.StaticInvocation node) {
+  ir.DartType visitStaticInvocation(ir.StaticInvocation node) {
     if (node.target.kind == ir.ProcedureKind.Factory) {
       // TODO(johnniwinther): We should not mark the type as instantiated but
       // rather follow the type arguments directly.
@@ -395,7 +391,7 @@
       List<DartType> typeArguments = _visitArguments(node.arguments);
       if (commonElements.isExtractTypeArguments(target)) {
         _handleExtractTypeArguments(node, target, typeArguments);
-        return;
+        return super.visitStaticInvocation(node);
       }
       impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
           target, elementMap.getCallStructure(node.arguments), typeArguments));
@@ -423,6 +419,7 @@
       case ForeignKind.NONE:
         break;
     }
+    return super.visitStaticInvocation(node);
   }
 
   void _handleExtractTypeArguments(ir.StaticInvocation node,
@@ -454,9 +451,8 @@
   }
 
   @override
-  void visitStaticGet(ir.StaticGet node) {
+  ir.DartType visitStaticGet(ir.StaticGet node) {
     ir.Member target = node.target;
-    registerSeenClasses(target.getterType);
     if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
       FunctionEntity method = elementMap.getMethod(target);
       impactBuilder.registerStaticUse(new StaticUse.staticTearOff(method));
@@ -464,14 +460,14 @@
       MemberEntity member = elementMap.getMember(target);
       impactBuilder.registerStaticUse(new StaticUse.staticGet(member));
     }
+    return super.visitStaticGet(node);
   }
 
   @override
-  void visitStaticSet(ir.StaticSet node) {
-    visitNode(node.value);
+  ir.DartType visitStaticSet(ir.StaticSet node) {
     MemberEntity member = elementMap.getMember(node.target);
-    registerSeenClasses(node.target.setterType);
     impactBuilder.registerStaticUse(new StaticUse.staticSet(member));
+    return super.visitStaticSet(node);
   }
 
   void handleSuperInvocation(ir.Name name, ir.Node target, ir.Node arguments) {
@@ -490,7 +486,7 @@
   }
 
   @override
-  void visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
+  ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
     List<DartType> typeArguments = _visitArguments(node.arguments);
     MemberEntity member = elementMap.getMember(node.target);
     // TODO(johnniwinther): Restrict the dynamic use to only match the known
@@ -503,13 +499,15 @@
             member.memberName, elementMap.getCallStructure(node.arguments)),
         constraint,
         typeArguments));
+    return super.visitDirectMethodInvocation(node);
   }
 
   @override
-  void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+  ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
     // TODO(johnniwinther): Should we support this or always use the
     // [MixinFullResolution] transformer?
     handleSuperInvocation(node.name, node.interfaceTarget, node.arguments);
+    return super.visitSuperMethodInvocation(node);
   }
 
   void handleSuperGet(ir.Name name, ir.Member target) {
@@ -530,20 +528,21 @@
   }
 
   @override
-  void visitDirectPropertyGet(ir.DirectPropertyGet node) {
+  ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) {
     // TODO(johnniwinther): Restrict the dynamic use to only match the known
     // target.
     impactBuilder.registerDynamicUse(new DynamicUse(
         new Selector.getter(elementMap.getMember(node.target).memberName)));
+    return super.visitDirectPropertyGet(node);
   }
 
   @override
-  void visitSuperPropertyGet(ir.SuperPropertyGet node) {
+  ir.DartType visitSuperPropertyGet(ir.SuperPropertyGet node) {
     handleSuperGet(node.name, node.interfaceTarget);
+    return super.visitSuperPropertyGet(node);
   }
 
   void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) {
-    visitNode(value);
     MemberEntity member =
         elementMap.getSuperMember(currentMember, name, target, setter: true);
     if (member != null) {
@@ -561,23 +560,30 @@
   }
 
   @override
-  void visitDirectPropertySet(ir.DirectPropertySet node) {
-    visitNode(node.value);
+  ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
     // TODO(johnniwinther): Restrict the dynamic use to only match the known
     // target.
     impactBuilder.registerDynamicUse(new DynamicUse(
         new Selector.setter(elementMap.getMember(node.target).memberName)));
+    return super.visitDirectPropertySet(node);
   }
 
   @override
-  void visitSuperPropertySet(ir.SuperPropertySet node) {
+  ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
     handleSuperSet(node.name, node.interfaceTarget, node.value);
+    return super.visitSuperPropertySet(node);
   }
 
   @override
-  void visitMethodInvocation(ir.MethodInvocation node) {
+  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
     Selector selector = elementMap.getSelector(node);
-    List<DartType> typeArguments = _visitArguments(node.arguments);
+    List<DartType> typeArguments;
+    if (isSpecialCasedBinaryOperator(node.interfaceTarget)) {
+      typeArguments = <DartType>[];
+    } else {
+      typeArguments = _visitArguments(node.arguments);
+    }
+    ir.DartType receiverType = visitNode(node.receiver);
     var receiver = node.receiver;
     if (receiver is ir.VariableGet &&
         receiver.variable.isFinal &&
@@ -594,7 +600,7 @@
       impactBuilder.registerDynamicUse(
           new ConstrainedDynamicUse(selector, null, typeArguments));
     } else {
-      visitNode(node.receiver);
+      DartType receiverDartType = elementMap.getDartType(receiverType);
 
       ir.Member interfaceTarget = node.interfaceTarget;
       if (interfaceTarget == null) {
@@ -608,10 +614,9 @@
         }
       } else {
         Object constraint;
-        DartType receiverType = elementMap.getStaticType(node.receiver);
-        if (receiverType is InterfaceType) {
+        if (receiverDartType is InterfaceType) {
           constraint = new StrongModeConstraint(
-              commonElements, _nativeBasicData, receiverType.element);
+              commonElements, _nativeBasicData, receiverDartType.element);
         }
 
         if (interfaceTarget is ir.Field ||
@@ -639,16 +644,17 @@
         }
       }
     }
+    return computeMethodInvocationType(node, receiverType);
   }
 
   @override
-  void visitPropertyGet(ir.PropertyGet node) {
-    visitNode(node.receiver);
+  ir.DartType visitPropertyGet(ir.PropertyGet node) {
     Object constraint;
-    DartType receiverType = elementMap.getStaticType(node.receiver);
-    if (receiverType is InterfaceType) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    DartType receiverDartType = elementMap.getDartType(receiverType);
+    if (receiverDartType is InterfaceType) {
       constraint = new StrongModeConstraint(
-          commonElements, _nativeBasicData, receiverType.element);
+          commonElements, _nativeBasicData, receiverDartType.element);
     }
     impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
         new Selector.getter(elementMap.getName(node.name)),
@@ -678,14 +684,13 @@
       }
       impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
     }
+    return computePropertyGetType(node, receiverType);
   }
 
   @override
-  void visitPropertySet(ir.PropertySet node) {
-    visitNode(node.receiver);
-    visitNode(node.value);
+  ir.DartType visitPropertySet(ir.PropertySet node) {
     Object constraint;
-    DartType receiverType = elementMap.getStaticType(node.receiver);
+    DartType receiverType = elementMap.getDartType(visitNode(node.receiver));
     if (receiverType is InterfaceType) {
       constraint = new StrongModeConstraint(
           commonElements, _nativeBasicData, receiverType.element);
@@ -693,10 +698,11 @@
     impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
         new Selector.setter(elementMap.getName(node.name)),
         constraint, const <DartType>[]));
+    return super.visitPropertySet(node);
   }
 
   @override
-  void visitAssertStatement(ir.AssertStatement node) {
+  Null visitAssertStatement(ir.AssertStatement node) {
     impactBuilder.registerFeature(
         node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT);
     visitNode(node.condition);
@@ -704,23 +710,25 @@
   }
 
   @override
-  void visitInstantiation(ir.Instantiation node) {
+  ir.DartType visitInstantiation(ir.Instantiation node) {
     // TODO(johnniwinther): Track which arities are used in instantiation.
+    ir.FunctionType expressionType = visitNode(node.expression);
     impactBuilder.registerInstantiation(new GenericInstantiation(
-        elementMap.getStaticType(node.expression),
+        elementMap.getDartType(expressionType),
         node.typeArguments.map(elementMap.getDartType).toList()));
-    node.visitChildren(this);
+    return computeInstantiationType(node, expressionType);
   }
 
   @override
-  void visitStringConcatenation(ir.StringConcatenation node) {
+  ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
     impactBuilder.registerFeature(Feature.STRING_INTERPOLATION);
     impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION);
     visitNodes(node.expressions);
+    return super.visitStringConcatenation(node);
   }
 
   @override
-  void visitFunctionDeclaration(ir.FunctionDeclaration node) {
+  Null visitFunctionDeclaration(ir.FunctionDeclaration node) {
     Local function = elementMap.getLocalFunction(node);
     impactBuilder.registerStaticUse(new StaticUse.closure(function));
     handleSignature(node.function);
@@ -729,17 +737,17 @@
   }
 
   @override
-  void visitFunctionExpression(ir.FunctionExpression node) {
+  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
     Local function = elementMap.getLocalFunction(node);
     impactBuilder.registerStaticUse(new StaticUse.closure(function));
     handleSignature(node.function);
     handleAsyncMarker(node.function);
     visitNode(node.function.body);
+    return super.visitFunctionExpression(node);
   }
 
   @override
-  void visitVariableDeclaration(ir.VariableDeclaration node) {
-    registerSeenClasses(node.type);
+  Null visitVariableDeclaration(ir.VariableDeclaration node) {
     if (node.initializer != null) {
       visitNode(node.initializer);
     } else {
@@ -748,33 +756,34 @@
   }
 
   @override
-  void visitIsExpression(ir.IsExpression node) {
+  ir.DartType visitIsExpression(ir.IsExpression node) {
     impactBuilder.registerTypeUse(
         new TypeUse.isCheck(elementMap.getDartType(node.type)));
-    registerSeenClasses(node.type);
     visitNode(node.operand);
+    return super.visitIsExpression(node);
   }
 
   @override
-  void visitAsExpression(ir.AsExpression node) {
+  ir.DartType visitAsExpression(ir.AsExpression node) {
     DartType type = elementMap.getDartType(node.type);
     if (node.isTypeError) {
       impactBuilder.registerTypeUse(new TypeUse.implicitCast(type));
     } else {
       impactBuilder.registerTypeUse(new TypeUse.asCast(type));
     }
-    registerSeenClasses(node.type);
     visitNode(node.operand);
+    return super.visitAsExpression(node);
   }
 
   @override
-  void visitThrow(ir.Throw node) {
+  ir.DartType visitThrow(ir.Throw node) {
     impactBuilder.registerFeature(Feature.THROW_EXPRESSION);
     visitNode(node.expression);
+    return super.visitThrow(node);
   }
 
   @override
-  void visitForInStatement(ir.ForInStatement node) {
+  Null visitForInStatement(ir.ForInStatement node) {
     visitNode(node.variable);
     visitNode(node.iterable);
     visitNode(node.body);
@@ -792,13 +801,13 @@
   }
 
   @override
-  void visitTryCatch(ir.TryCatch node) {
+  Null visitTryCatch(ir.TryCatch node) {
     visitNode(node.body);
     visitNodes(node.catches);
   }
 
   @override
-  void visitCatch(ir.Catch node) {
+  Null visitCatch(ir.Catch node) {
     impactBuilder.registerFeature(Feature.CATCH_STATEMENT);
     if (node.stackTrace != null) {
       impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH);
@@ -811,13 +820,13 @@
   }
 
   @override
-  void visitTryFinally(ir.TryFinally node) {
+  Null visitTryFinally(ir.TryFinally node) {
     visitNode(node.body);
     visitNode(node.finalizer);
   }
 
   @override
-  void visitTypeLiteral(ir.TypeLiteral node) {
+  ir.DartType visitTypeLiteral(ir.TypeLiteral node) {
     impactBuilder.registerTypeUse(
         new TypeUse.typeLiteral(elementMap.getDartType(node.type)));
     if (node.type is ir.FunctionType) {
@@ -827,17 +836,18 @@
       // We need to ensure that the typedef is live.
       elementMap.getTypedefType(functionType.typedef);
     }
+    return super.visitTypeLiteral(node);
   }
 
   @override
-  void visitFieldInitializer(ir.FieldInitializer node) {
+  Null visitFieldInitializer(ir.FieldInitializer node) {
     impactBuilder.registerStaticUse(
         new StaticUse.fieldInit(elementMap.getField(node.field)));
     visitNode(node.value);
   }
 
   @override
-  void visitRedirectingInitializer(ir.RedirectingInitializer node) {
+  Null visitRedirectingInitializer(ir.RedirectingInitializer node) {
     _visitArguments(node.arguments);
     ConstructorEntity target = elementMap.getConstructor(node.target);
     impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
@@ -845,64 +855,94 @@
   }
 
   @override
-  void visitLoadLibrary(ir.LoadLibrary node) {
+  ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
+    visitNode(node.left);
+    visitNode(node.right);
+    return super.visitLogicalExpression(node);
+  }
+
+  ir.DartType visitNot(ir.Not node) {
+    visitNode(node.operand);
+    return super.visitNot(node);
+  }
+
+  @override
+  ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
     impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
         commonElements.loadDeferredLibrary, CallStructure.ONE_ARG));
     impactBuilder.registerFeature(Feature.LOAD_LIBRARY);
+    return super.visitLoadLibrary(node);
   }
 
+  @override
+  Null visitEmptyStatement(ir.EmptyStatement node) {}
+
+  @override
+  Null visitForStatement(ir.ForStatement node) {
+    visitNodes(node.variables);
+    visitNode(node.condition);
+    visitNodes(node.updates);
+    visitNode(node.body);
+  }
+
+  @override
+  Null visitDoStatement(ir.DoStatement node) {
+    visitNode(node.body);
+    visitNode(node.condition);
+  }
+
+  @override
+  Null visitWhileStatement(ir.WhileStatement node) {
+    visitNode(node.condition);
+    visitNode(node.body);
+  }
+
+  @override
+  Null visitSwitchStatement(ir.SwitchStatement node) {
+    visitNode(node.expression);
+    visitNodes(node.cases);
+  }
+
+  @override
+  Null visitSwitchCase(ir.SwitchCase node) {
+    visitNodes(node.expressions);
+    visitNode(node.body);
+  }
+
+  @override
+  Null visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {}
+
+  @override
+  Null visitLabeledStatement(ir.LabeledStatement node) {
+    visitNode(node.body);
+  }
+
+  @override
+  Null visitBreakStatement(ir.BreakStatement node) {}
+
+  @override
+  Null visitYieldStatement(ir.YieldStatement node) {
+    visitNode(node.expression);
+  }
+
+  @override
+  ir.DartType visitLet(ir.Let node) {
+    visitNode(node.variable);
+    return super.visitLet(node);
+  }
+
+  @override
+  Null visitAssertInitializer(ir.AssertInitializer node) {
+    visitNode(node.statement);
+  }
+
+  @override
+  ir.DartType visitNamedExpression(ir.NamedExpression node) =>
+      visitNode(node.value);
+
   // TODO(johnniwinther): Make this throw and visit child nodes explicitly
   // instead to ensure that we don't visit unwanted parts of the ir.
   @override
-  void defaultNode(ir.Node node) => node.visitChildren(this);
-}
-
-class _ClassEnsurer extends BaseDartTypeVisitor<dynamic, Null> {
-  final KernelImpactBuilder builder;
-  final DartTypes types;
-  final seenTypes = new Set<InterfaceType>();
-
-  _ClassEnsurer(this.builder, this.types);
-
-  void ensureClassesInType(DartType type) {
-    seenTypes.clear();
-    type.accept(this, null);
-  }
-
-  @override
-  visitType(DartType type, _) {}
-
-  @override
-  visitFunctionType(FunctionType type, _) {
-    type.returnType.accept(this, null);
-    type.parameterTypes.forEach((t) {
-      t.accept(this, null);
-    });
-    type.optionalParameterTypes.forEach((t) {
-      t.accept(this, null);
-    });
-    type.namedParameterTypes.forEach((t) {
-      t.accept(this, null);
-    });
-  }
-
-  @override
-  visitInterfaceType(InterfaceType type, _) {
-    if (!seenTypes.add(type)) {
-      return;
-    }
-    builder.impactBuilder.registerSeenClass(type.element);
-    type.typeArguments.forEach((t) {
-      t.accept(this, null);
-    });
-    var supertype = types.getSupertype(type.element);
-    supertype?.accept(this, null);
-  }
-
-  @override
-  visitTypedefType(TypedefType type, _) {
-    type.typeArguments.forEach((t) {
-      t.accept(this, null);
-    });
-  }
+  ir.DartType defaultNode(ir.Node node) =>
+      throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
 }
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 9a5f781..104c919 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -8,7 +8,7 @@
 import '../compiler.dart' show Compiler;
 import '../constants/constant_system.dart';
 import '../constants/values.dart';
-import '../common_elements.dart' show CommonElements;
+import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../js/js.dart' as js;
@@ -192,7 +192,7 @@
   SsaInstructionSimplifier(this._globalInferenceResults, this._options,
       this._rtiSubstitutions, this._closedWorld, this._registry);
 
-  CommonElements get commonElements => _closedWorld.commonElements;
+  JCommonElements get commonElements => _closedWorld.commonElements;
 
   ConstantSystem get constantSystem => _closedWorld.constantSystem;
 
@@ -2400,6 +2400,11 @@
 
       if (!instructions.isEmpty) {
         List<HInstruction> list = instructions.toList();
+        // Sort by instruction 'id' for more stable ordering under changes to
+        // unrelated source code. 'id' is a function of the operations of
+        // compiling the current method, whereas the ValueSet order is dependent
+        // hashCodes that are a function of the whole program.
+        list.sort((insn1, insn2) => insn1.id.compareTo(insn2.id));
         for (HInstruction instruction in list) {
           // Move the instruction to the current block.
           instruction.block.detach(instruction);
@@ -2416,6 +2421,10 @@
           }
         }
       }
+      // TODO(sra): There are some non-gvn-able instructions that we could move,
+      // e.g. allocations. We should probably not move instructions that can
+      // directly or indirectly throw since the reported location might be in
+      // the 'wrong' branch.
     }
 
     // Don't try to merge instructions to a dominator if we have
@@ -2445,6 +2454,8 @@
         if (input.block == block) {
           canBeMoved = false;
           break;
+          // TODO(sra): We could move trees of instructions provided we move the
+          // roots before the leaves.
         }
       }
       if (!canBeMoved) continue;
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 9685e13..dcafd11 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -8,7 +8,12 @@
 
 import 'common.dart';
 import 'common/names.dart';
-import 'common_elements.dart' show CommonElements, ElementEnvironment;
+import 'common_elements.dart'
+    show
+        JCommonElements,
+        JElementEnvironment,
+        KCommonElements,
+        KElementEnvironment;
 import 'constants/constant_system.dart';
 import 'diagnostics/diagnostic_listener.dart';
 import 'elements/entities.dart';
@@ -52,11 +57,11 @@
 
   InterceptorData get interceptorData;
 
-  ElementEnvironment get elementEnvironment;
+  JElementEnvironment get elementEnvironment;
 
   DartTypes get dartTypes;
 
-  CommonElements get commonElements;
+  JCommonElements get commonElements;
 
   /// Returns the [AbstractValueDomain] used in the global type inference.
   AbstractValueDomain get abstractValueDomain;
@@ -243,9 +248,9 @@
   final Map<ClassEntity, Map<ClassEntity, bool>> _subtypeCoveredByCache =
       <ClassEntity, Map<ClassEntity, bool>>{};
 
-  final ElementEnvironment elementEnvironment;
+  final JElementEnvironment elementEnvironment;
   final DartTypes dartTypes;
-  final CommonElements commonElements;
+  final JCommonElements commonElements;
 
   // TODO(johnniwinther): Can this be derived from [ClassSet]s?
   final Set<ClassEntity> _implementedClasses;
@@ -617,8 +622,8 @@
   BackendUsage get backendUsage;
   NativeData get nativeData;
   InterceptorData get interceptorData;
-  ElementEnvironment get elementEnvironment;
-  CommonElements get commonElements;
+  KElementEnvironment get elementEnvironment;
+  KCommonElements get commonElements;
   ClassHierarchy get classHierarchy;
 
   /// Returns `true` if [cls] is implemented by an instantiated class.
diff --git a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
index b2a2cfe..f08b46c 100644
--- a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
@@ -64,6 +64,16 @@
 }
 
 ErrorSeverity errorSeverity(AnalysisContext context, AnalysisError error) {
+  var errorCode = error.errorCode;
+  if (errorCode == StrongModeCode.TOP_LEVEL_FUNCTION_LITERAL_BLOCK ||
+      errorCode == StrongModeCode.TOP_LEVEL_INSTANCE_GETTER ||
+      errorCode == StrongModeCode.TOP_LEVEL_INSTANCE_METHOD) {
+    // These are normally hints, but they should be errors when running DDC, so
+    // that users won't be surprised by behavioral differences between DDC and
+    // dart2js.
+    return ErrorSeverity.ERROR;
+  }
+
   // TODO(jmesserly): this Analyzer API totally bonkers, but it's what
   // analyzer_cli and server use.
   //
@@ -74,7 +84,7 @@
   // * it requires an AnalysisContext
   return ErrorProcessor.getProcessor(context.analysisOptions, error)
           ?.severity ??
-      error.errorCode.errorSeverity;
+      errorCode.errorSeverity;
 }
 
 const invalidImportDartMirrors = StrongModeCode(
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 970cc7a..5d1aa99 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -559,7 +559,7 @@
     _emitVirtualFieldSymbols(c, body);
     _emitClassSignature(c, className, body);
     _initExtensionSymbols(c);
-    if (!isMixinDeclaration(c)) {
+    if (!c.isMixinDeclaration) {
       _defineExtensionMembers(className, body);
     }
     _emitClassMetadata(c.annotations, className, body);
@@ -863,7 +863,7 @@
       baseClass = mixinId;
     }
 
-    if (isMixinDeclaration(c)) {
+    if (c.isMixinDeclaration) {
       _emitMixinStatement(c, className, baseClass, methods, body);
     } else {
       body.add(_emitClassStatement(c, className, baseClass, methods));
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 7d1beb2..27b4e85 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -234,6 +234,3 @@
   }
   return sc;
 }
-
-// TODO(jmesserly): replace with a flag on Class once Kernel supports it.
-bool isMixinDeclaration(Class c) => false;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
index 358b884..3ee1721 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
@@ -37,6 +37,8 @@
 final Function(Object) getOwnPropertySymbols =
     JS('', 'Object.getOwnPropertySymbols');
 
+final Function(Object) getPrototypeOf = JS('', 'Object.getPrototypeOf');
+
 /// This error indicates a strong mode specific failure, other than a type
 /// assertion failure (TypeError) or CastError.
 void throwTypeError(String message) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index 492291a..86592dc 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -106,7 +106,7 @@
 
     if (!walkPrototypeChain) break;
 
-    sig = safeGetProperty(sig, '__proto__');
+    sig = dart.getPrototypeOf(sig);
   }
 }
 
@@ -462,6 +462,7 @@
       IterableSpanFormatter(),
       MapEntryFormatter(),
       StackTraceFormatter(),
+      ErrorAndExceptionFormatter(),
       FunctionFormatter(),
       HeritageClauseFormatter(),
       LibraryModuleFormatter(),
@@ -802,7 +803,7 @@
   accept(object, config) => object is IterableSpan;
 
   String preview(object) {
-    return '[${object.start}...${object.end-1}]';
+    return '[${object.start}...${object.end - 1}]';
   }
 
   bool hasChildren(object) => true;
@@ -810,6 +811,45 @@
   List<NameValuePair> children(object) => object.children();
 }
 
+/// Formatter for Dart Errors and Exceptions.
+class ErrorAndExceptionFormatter extends ObjectFormatter {
+  static final RegExp _pattern = RegExp(r'\d+\:\d+');
+
+  accept(object, config) => object is Error || object is Exception;
+
+  bool hasChildren(object) => true;
+
+  String preview(object) {
+    var trace = dart.stackTrace(object);
+    // TODO(vsm): Pull our stack mapping logic here.  We should aim to
+    // provide the first meaningful stack frame.
+    var line = '$trace'.split('\n').firstWhere(
+        (l) =>
+            l.contains(_pattern) &&
+            !l.contains('dart:sdk') &&
+            !l.contains('dart_sdk'),
+        orElse: () => null);
+    return line != null ? '${object} at ${line}' : '${object}';
+  }
+
+  List<NameValuePair> children(object) {
+    var trace = dart.stackTrace(object);
+    var entries = LinkedHashSet<NameValuePair>();
+    entries.add(NameValuePair(name: 'stackTrace', value: trace));
+    addInstanceMembers(object, entries);
+    addMetadataChildren(object, entries);
+    return entries.toList();
+  }
+
+  // Add an ObjectFormatter view underneath.
+  void addInstanceMembers(object, Set<NameValuePair> ret) {
+    ret.add(NameValuePair(
+        name: "[[instance members]]",
+        value: object,
+        config: JsonMLConfig.asObject));
+  }
+}
+
 class StackTraceFormatter implements Formatter {
   accept(object, config) => object is StackTrace;
 
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index eef20ee..768d05c 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -21,14 +21,16 @@
   factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint,
       [Uri initializeFromDillUri]) {
     return new IncrementalCompiler(
-        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        new CompilerContext(
+            new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFromDillUri);
   }
 
   factory IncrementalKernelGenerator.fromComponent(
       CompilerOptions options, Uri entryPoint, Component component) {
     return new IncrementalCompiler.fromComponent(
-        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        new CompilerContext(
+            new ProcessedOptions(options: options, inputs: [entryPoint])),
         component);
   }
 
diff --git a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
index 98d8ded..9b44f9a 100644
--- a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
@@ -43,7 +43,7 @@
 /// an error is reported.
 // TODO(sigmund): rename to kernelForScript?
 Future<Component> kernelForProgram(Uri source, CompilerOptions options) async {
-  var pOptions = new ProcessedOptions(options, [source]);
+  var pOptions = new ProcessedOptions(options: options, inputs: [source]);
   return await CompilerContext.runWithOptions(pOptions, (context) async {
     var component = (await generateKernelInternal())?.component;
     if (component == null) return null;
@@ -80,6 +80,7 @@
 /// summaries.
 Future<Component> kernelForComponent(
     List<Uri> sources, CompilerOptions options) async {
-  return (await generateKernel(new ProcessedOptions(options, sources)))
+  return (await generateKernel(
+          new ProcessedOptions(options: options, inputs: sources)))
       ?.component;
 }
diff --git a/pkg/front_end/lib/src/api_prototype/summary_generator.dart b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
index e230731..9103689 100644
--- a/pkg/front_end/lib/src/api_prototype/summary_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
@@ -31,7 +31,10 @@
 /// The return value is a list of bytes to write to the summary file.
 Future<List<int>> summaryFor(List<Uri> sources, CompilerOptions options,
     {bool truncate: false}) async {
-  return (await generateKernel(new ProcessedOptions(options, sources),
-          buildSummary: true, buildComponent: false, truncateSummary: truncate))
+  return (await generateKernel(
+          new ProcessedOptions(options: options, inputs: sources),
+          buildSummary: true,
+          buildComponent: false,
+          truncateSummary: truncate))
       ?.summary;
 }
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 267347f..969bd01 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -44,7 +44,7 @@
     ..target = target
     ..fileSystem = fileSystem;
 
-  ProcessedOptions processedOpts = new ProcessedOptions(options, []);
+  ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
   return new InitializedCompilerState(options, processedOpts);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 3ce7148..f90e4f1 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -47,7 +47,7 @@
     ..librariesSpecificationUri = librariesSpecificationUri
     ..packagesFileUri = packagesFileUri;
 
-  ProcessedOptions processedOpts = new ProcessedOptions(options, []);
+  ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
   return new InitializedCompilerState(options, processedOpts);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index cb26a1b..6dfcb2b 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -69,7 +69,7 @@
     ..fileSystem = fileSystem ?? StandardFileSystem.instance
     ..reportMessages = true;
 
-  ProcessedOptions processedOpts = new ProcessedOptions(options, []);
+  ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
   return new InitializedCompilerState(options, processedOpts);
 }
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 89060a67..b2d161d 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -176,12 +176,12 @@
   final Uri output;
 
   /// Initializes a [ProcessedOptions] object wrapping the given [rawOptions].
-  ProcessedOptions(CompilerOptions rawOptions,
-      [this.inputs = const [], this.output])
-      : this._raw = rawOptions,
+  ProcessedOptions({CompilerOptions options, List<Uri> inputs, this.output})
+      : this._raw = options ?? new CompilerOptions(),
+        this.inputs = inputs ?? <Uri>[],
         // TODO(sigmund, ahe): create ticker even earlier or pass in a stopwatch
         // collecting time since the start of the VM.
-        ticker = new Ticker(isVerbose: rawOptions.verbose);
+        this.ticker = new Ticker(isVerbose: options?.verbose ?? false);
 
   /// The logger to report compilation progress.
   PerformanceLog get logger {
@@ -247,10 +247,10 @@
 
   /// Runs various validations checks on the input options. For instance,
   /// if an option is a path to a file, it checks that the file exists.
-  Future<bool> validateOptions() async {
+  Future<bool> validateOptions({bool errorOnMissingInput: true}) async {
     if (verbose) print(debugString());
 
-    if (inputs.isEmpty) {
+    if (errorOnMissingInput && inputs.isEmpty) {
       reportWithoutLocation(messageMissingInput, Severity.error);
       return false;
     }
diff --git a/pkg/front_end/lib/src/fasta/builder/builder.dart b/pkg/front_end/lib/src/fasta/builder/builder.dart
index 2efbcb9..5abea63 100644
--- a/pkg/front_end/lib/src/fasta/builder/builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builder.dart
@@ -24,7 +24,7 @@
 
 export 'dynamic_type_builder.dart' show DynamicTypeBuilder;
 
-export 'enum_builder.dart' show EnumBuilder;
+export 'enum_builder.dart' show EnumBuilder, EnumConstantInfo;
 
 export 'field_builder.dart' show FieldBuilder;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index d2b9c0f..6c2bb49 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -240,6 +240,22 @@
   }
 
   void prepareTopLevelInference() {}
+
+  /// Find the first member of this class with [name]. This method isn't
+  /// suitable for scope lookups as it will throw an error if the name isn't
+  /// declared. The [scope] should be used for that. This method is used to
+  /// find a member that is known to exist and it wil pick the first
+  /// declaration if the name is ambiguous.
+  ///
+  /// For example, this method is convenient for use when building synthetic
+  /// members, such as those of an enum.
+  MemberBuilder firstMemberNamed(String name) {
+    Declaration declaration = this[name];
+    while (declaration.next != null) {
+      declaration = declaration.next;
+    }
+    return declaration;
+  }
 }
 
 class ConstructorRedirection {
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index fb24b9c..f456149 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -4,9 +4,18 @@
 
 library fasta.enum_builder;
 
-import 'builder.dart' show ClassBuilder, TypeBuilder;
+import 'builder.dart' show ClassBuilder, MetadataBuilder, TypeBuilder;
 
 abstract class EnumBuilder<T extends TypeBuilder, R>
     implements ClassBuilder<T, R> {
-  List<Object> get constantNamesAndOffsetsAndDocs;
+  List<EnumConstantInfo> get enumConstantInfos;
+}
+
+class EnumConstantInfo {
+  final List<MetadataBuilder<TypeBuilder>> metadata;
+  final String name;
+  final int charOffset;
+  final String documentationComment;
+  const EnumConstantInfo(
+      this.metadata, this.name, this.charOffset, this.documentationComment);
 }
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 b1d0382..c631b0e 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -98,7 +98,8 @@
   }
 
   /// Returns true if the export scope was modified.
-  bool addToExportScope(String name, Declaration member) {
+  bool addToExportScope(String name, Declaration member,
+      [int charOffset = -1]) {
     if (name.startsWith("_")) return false;
     if (member is PrefixBuilder) return false;
     Map<String, Declaration> map =
@@ -107,7 +108,7 @@
     if (existing == member) return false;
     if (existing != null) {
       Declaration result = computeAmbiguousDeclaration(
-          name, existing, member, -1,
+          name, existing, member, charOffset,
           isExport: true);
       map[name] = result;
       return result != existing;
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 73020a5..aeb7fd1 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -117,8 +117,10 @@
   }
 
   FormalParameterBuilder getFormal(String name) {
-    for (FormalParameterBuilder formal in formals) {
-      if (formal.name == name) return formal;
+    if (formals != null) {
+      for (FormalParameterBuilder formal in formals) {
+        if (formal.name == name) return formal;
+      }
     }
     return null;
   }
diff --git a/pkg/front_end/lib/src/fasta/compiler_context.dart b/pkg/front_end/lib/src/fasta/compiler_context.dart
index 1f34a05..ff507b3 100644
--- a/pkg/front_end/lib/src/fasta/compiler_context.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_context.dart
@@ -8,8 +8,6 @@
 
 import 'package:kernel/ast.dart' show Source;
 
-import '../api_prototype/compiler_options.dart' show CompilerOptions;
-
 import '../api_prototype/file_system.dart' show FileSystem;
 
 import '../base/processed_options.dart' show ProcessedOptions;
@@ -124,18 +122,18 @@
   /// Perform [action] in a [Zone] where [options] will be available as
   /// `CompilerContext.current.options`.
   static Future<T> runWithOptions<T>(
-      ProcessedOptions options, Future<T> action(CompilerContext c)) {
+      ProcessedOptions options, Future<T> action(CompilerContext c),
+      {bool errorOnMissingInput: true}) {
     return new CompilerContext(options)
         .runInContext<T>((CompilerContext c) async {
-      await options.validateOptions();
+      await options.validateOptions(errorOnMissingInput: errorOnMissingInput);
       return action(c);
     });
   }
 
   static Future<T> runWithDefaultOptions<T>(
       Future<T> action(CompilerContext c)) {
-    return new CompilerContext(new ProcessedOptions(new CompilerOptions()))
-        .runInContext<T>(action);
+    return new CompilerContext(new ProcessedOptions()).runInContext<T>(action);
   }
 
   static bool get enableColors {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index 2838eb7..355da1a 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -23,7 +23,7 @@
 import '../fasta_codes.dart'
     show
         Message,
-        templateDuplicatedDefinition,
+        templateDuplicatedDeclaration,
         templateTypeNotFound,
         templateUnspecified;
 
@@ -154,7 +154,7 @@
     if (builder.parent == this) return builder;
     return new KernelInvalidTypeBuilder(
         name,
-        templateDuplicatedDefinition
+        templateDuplicatedDeclaration
             .withArguments(name)
             .withLocation(fileUri, charOffset, name.length));
   }
diff --git a/pkg/front_end/lib/src/fasta/export.dart b/pkg/front_end/lib/src/fasta/export.dart
index 2284a12..476de4c 100644
--- a/pkg/front_end/lib/src/fasta/export.dart
+++ b/pkg/front_end/lib/src/fasta/export.dart
@@ -30,6 +30,6 @@
         if (combinator.isHide && combinator.names.contains(name)) return false;
       }
     }
-    return exporter.addToExportScope(name, member);
+    return exporter.addToExportScope(name, member, charOffset);
   }
 }
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 2217a24..2989503 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1977,22 +1977,62 @@
     tip: r"""Try removing all but one prefix.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedDefinition =
+const Template<Message Function(String name)> templateDuplicatedDeclaration =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Duplicated definition of '#name'.""",
-        withArguments: _withArgumentsDuplicatedDefinition);
+        messageTemplate: r"""'#name' is already declared in this scope.""",
+        withArguments: _withArgumentsDuplicatedDeclaration);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedDefinition =
+const Code<Message Function(String name)> codeDuplicatedDeclaration =
     const Code<Message Function(String name)>(
-  "DuplicatedDefinition",
-  templateDuplicatedDefinition,
+        "DuplicatedDeclaration", templateDuplicatedDeclaration,
+        analyzerCode: "DUPLICATE_DEFINITION");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedDeclaration(String name) {
+  return new Message(codeDuplicatedDeclaration,
+      message: """'${name}' is already declared in this scope.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateDuplicatedDeclarationCause =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""Previous declaration of '#name'.""",
+        withArguments: _withArgumentsDuplicatedDeclarationCause);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDuplicatedDeclarationCause =
+    const Code<Message Function(String name)>(
+        "DuplicatedDeclarationCause", templateDuplicatedDeclarationCause,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedDeclarationCause(String name) {
+  return new Message(codeDuplicatedDeclarationCause,
+      message: """Previous declaration of '${name}'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateDuplicatedDeclarationUse =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Can't use '#name' because it is declared more than once.""",
+        withArguments: _withArgumentsDuplicatedDeclarationUse);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDuplicatedDeclarationUse =
+    const Code<Message Function(String name)>(
+  "DuplicatedDeclarationUse",
+  templateDuplicatedDeclarationUse,
 );
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedDefinition(String name) {
-  return new Message(codeDuplicatedDefinition,
-      message: """Duplicated definition of '${name}'.""",
+Message _withArgumentsDuplicatedDeclarationUse(String name) {
+  return new Message(codeDuplicatedDeclarationUse,
+      message: """Can't use '${name}' because it is declared more than once.""",
       arguments: {'name': name});
 }
 
@@ -2009,7 +2049,7 @@
     codeDuplicatedExport =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
         "DuplicatedExport", templateDuplicatedExport,
-        analyzerCode: "AMBIGUOUS_EXPORT", severity: Severity.ignored);
+        analyzerCode: "AMBIGUOUS_EXPORT");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedExport(String name, Uri uri_, Uri uri2_) {
@@ -2094,6 +2134,86 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateDuplicatedLibraryExport =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""A library with name '#name' is exported more than once.""",
+        withArguments: _withArgumentsDuplicatedLibraryExport);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDuplicatedLibraryExport =
+    const Code<Message Function(String name)>(
+        "DuplicatedLibraryExport", templateDuplicatedLibraryExport,
+        analyzerCode: "EXPORT_DUPLICATED_LIBRARY_NAMED");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedLibraryExport(String name) {
+  return new Message(codeDuplicatedLibraryExport,
+      message: """A library with name '${name}' is exported more than once.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateDuplicatedLibraryExportContext =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""'#name' is also exported here.""",
+        withArguments: _withArgumentsDuplicatedLibraryExportContext);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDuplicatedLibraryExportContext =
+    const Code<Message Function(String name)>("DuplicatedLibraryExportContext",
+        templateDuplicatedLibraryExportContext,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedLibraryExportContext(String name) {
+  return new Message(codeDuplicatedLibraryExportContext,
+      message: """'${name}' is also exported here.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateDuplicatedLibraryImport =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""A library with name '#name' is imported more than once.""",
+        withArguments: _withArgumentsDuplicatedLibraryImport);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDuplicatedLibraryImport =
+    const Code<Message Function(String name)>(
+        "DuplicatedLibraryImport", templateDuplicatedLibraryImport,
+        analyzerCode: "IMPORT_DUPLICATED_LIBRARY_NAMED");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedLibraryImport(String name) {
+  return new Message(codeDuplicatedLibraryImport,
+      message: """A library with name '${name}' is imported more than once.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateDuplicatedLibraryImportContext =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""'#name' is also imported here.""",
+        withArguments: _withArgumentsDuplicatedLibraryImportContext);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDuplicatedLibraryImportContext =
+    const Code<Message Function(String name)>("DuplicatedLibraryImportContext",
+        templateDuplicatedLibraryImportContext,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedLibraryImportContext(String name) {
+  return new Message(codeDuplicatedLibraryImportContext,
+      message: """'${name}' is also imported here.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""The modifier '#lexeme' was already specified.""",
@@ -2116,44 +2236,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedName =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is already declared in this scope.""",
-        withArguments: _withArgumentsDuplicatedName);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedName =
-    const Code<Message Function(String name)>(
-        "DuplicatedName", templateDuplicatedName,
-        analyzerCode: "DUPLICATE_DEFINITION");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedName(String name) {
-  return new Message(codeDuplicatedName,
-      message: """'${name}' is already declared in this scope.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedNameCause =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""Previous declaration of '#name'.""",
-        withArguments: _withArgumentsDuplicatedNameCause);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedNameCause =
-    const Code<Message Function(String name)>(
-        "DuplicatedNameCause", templateDuplicatedNameCause,
-        severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedNameCause(String name) {
-  return new Message(codeDuplicatedNameCause,
-      message: """Previous declaration of '${name}'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
@@ -2372,7 +2454,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedAnInitializer = const MessageCode(
     "ExpectedAnInitializer",
-    analyzerCode: "MISSING_INITIALIZER",
+    index: 36,
     message: r"""Expected an initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2916,6 +2998,75 @@
     message: r"""Factory bodies can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, int count)>
+    templateFactoryRedirecteeHasTooFewPositionalParameters =
+    const Template<Message Function(String name, int count)>(
+        messageTemplate:
+            r"""Redirection target '#name' accepts fewer arguments ('#count') than the redirecting factory can provide.""",
+        tipTemplate: r"""Try redirecting to a different constructor.""",
+        withArguments:
+            _withArgumentsFactoryRedirecteeHasTooFewPositionalParameters);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, int count)>
+    codeFactoryRedirecteeHasTooFewPositionalParameters =
+    const Code<Message Function(String name, int count)>(
+        "FactoryRedirecteeHasTooFewPositionalParameters",
+        templateFactoryRedirecteeHasTooFewPositionalParameters,
+        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsFactoryRedirecteeHasTooFewPositionalParameters(
+    String name, int count) {
+  return new Message(codeFactoryRedirecteeHasTooFewPositionalParameters,
+      message:
+          """Redirection target '${name}' accepts fewer arguments ('${count}') than the redirecting factory can provide.""",
+      tip: """Try redirecting to a different constructor.""",
+      arguments: {'name': name, 'count': count});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        String name,
+        DartType
+            _type2)> templateFactoryRedirecteeInvalidReturnType = const Template<
+        Message Function(DartType _type, String name, DartType _type2)>(
+    messageTemplate:
+        r"""The return type '#type' of the constructor '#name' isn't a subtype of '#type2'.""",
+    tipTemplate: r"""Try redirecting to a different constructor.""",
+    withArguments: _withArgumentsFactoryRedirecteeInvalidReturnType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, String name, DartType _type2)>
+    codeFactoryRedirecteeInvalidReturnType =
+    const Code<Message Function(DartType _type, String name, DartType _type2)>(
+        "FactoryRedirecteeInvalidReturnType",
+        templateFactoryRedirecteeInvalidReturnType,
+        analyzerCode: "REDIRECT_TO_INVALID_RETURN_TYPE");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsFactoryRedirecteeInvalidReturnType(
+    DartType _type, String name, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer;
+  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(codeFactoryRedirecteeInvalidReturnType,
+      message:
+          """The return type '${type}' of the constructor '${name}' isn't a subtype of '${type2}'.""",
+      tip: """Try redirecting to a different constructor.""",
+      arguments: {'type': _type, 'name': name, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFactoryTopLevelDeclaration =
     messageFactoryTopLevelDeclaration;
 
@@ -4626,7 +4777,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidHexEscape = const MessageCode(
     "InvalidHexEscape",
-    analyzerCode: "INVALID_HEX_ESCAPE",
+    index: 40,
     message:
         r"""An escape sequence starting with '\x' must be followed by 2 hexadecimal digits.""");
 
@@ -4664,7 +4815,7 @@
 const Code<Message Function(Token token)> codeInvalidOperator =
     const Code<Message Function(Token token)>(
         "InvalidOperator", templateInvalidOperator,
-        analyzerCode: "INVALID_OPERATOR");
+        index: 39);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidOperator(Token token) {
@@ -4712,7 +4863,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidUnicodeEscape = const MessageCode(
     "InvalidUnicodeEscape",
-    analyzerCode: "INVALID_UNICODE_ESCAPE",
+    index: 38,
     message:
         r"""An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.""");
 
@@ -4788,7 +4939,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLibraryDirectiveNotFirst = const MessageCode(
     "LibraryDirectiveNotFirst",
-    analyzerCode: "LIBRARY_DIRECTIVE_NOT_FIRST",
+    index: 37,
     message:
         r"""The library directive must appear before all other directives.""",
     tip: r"""Try moving the library directive before any other directives.""");
@@ -4950,7 +5101,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingAssignableSelector = const MessageCode(
     "MissingAssignableSelector",
-    analyzerCode: "MISSING_ASSIGNABLE_SELECTOR",
+    index: 35,
     message: r"""Missing selector such as '.<identifier>' or '[0]'.""",
     tip: r"""Try adding a selector.""");
 
@@ -4961,7 +5112,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingAssignmentInInitializer = const MessageCode(
     "MissingAssignmentInInitializer",
-    analyzerCode: "MISSING_ASSIGNMENT_IN_INITIALIZER",
+    index: 34,
     message: r"""Expected an assignment after the field name.""",
     tip: r"""To initialize a field, use the syntax 'name = value'.""");
 
@@ -4972,7 +5123,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingConstFinalVarOrType = const MessageCode(
     "MissingConstFinalVarOrType",
-    analyzerCode: "MISSING_CONST_FINAL_VAR_OR_TYPE",
+    index: 33,
     message:
         r"""Variables must be declared using the keywords 'const', 'final', 'var' or a type name.""",
     tip:
@@ -5015,7 +5166,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingExpressionInThrow = const MessageCode(
     "MissingExpressionInThrow",
-    analyzerCode: "MISSING_EXPRESSION_IN_THROW",
+    index: 32,
     message: r"""Missing expression after 'throw'.""",
     tip:
         r"""Add an expression after 'throw' or use 'rethrow' to throw a caught exception""");
@@ -5125,7 +5276,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingOperatorKeyword = const MessageCode(
     "MissingOperatorKeyword",
-    analyzerCode: "MISSING_KEYWORD_OPERATOR",
+    index: 31,
     message:
         r"""Operator declarations must be preceeded by the keyword 'operator'.""",
     tip: r"""Try adding the keyword 'operator'.""");
@@ -6328,6 +6479,182 @@
         r"""Try removing the body, or not making this a redirecting constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, DartType _type2)>
+    templateRedirectingFactoryIncompatibleTypeArgument =
+    const Template<Message Function(DartType _type, DartType _type2)>(
+        messageTemplate: r"""The type '#type' doesn't extend '#type2'.""",
+        tipTemplate: r"""Try using a different type as argument.""",
+        withArguments:
+            _withArgumentsRedirectingFactoryIncompatibleTypeArgument);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, DartType _type2)>
+    codeRedirectingFactoryIncompatibleTypeArgument =
+    const Code<Message Function(DartType _type, DartType _type2)>(
+        "RedirectingFactoryIncompatibleTypeArgument",
+        templateRedirectingFactoryIncompatibleTypeArgument,
+        analyzerCode: "TYPE_ARGUMENT_NOT_MATCHING_BOUNDS");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsRedirectingFactoryIncompatibleTypeArgument(
+    DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer;
+  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(codeRedirectingFactoryIncompatibleTypeArgument,
+      message: """The type '${type}' doesn't extend '${type2}'.""",
+      tip: """Try using a different type as argument.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, DartType _type, DartType _type2)>
+    templateRedirectingFactoryInvalidNamedParameterType = const Template<
+            Message Function(String name, DartType _type, DartType _type2)>(
+        messageTemplate:
+            r"""The type of the named parameter '#name' (#type) is not a subtype of the redirection target's corresponding named parameter type (#type2).""",
+        tipTemplate:
+            r"""Try changing either the type of the parameter or the redirection target.""",
+        withArguments:
+            _withArgumentsRedirectingFactoryInvalidNamedParameterType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, DartType _type, DartType _type2)>
+    codeRedirectingFactoryInvalidNamedParameterType =
+    const Code<Message Function(String name, DartType _type, DartType _type2)>(
+        "RedirectingFactoryInvalidNamedParameterType",
+        templateRedirectingFactoryInvalidNamedParameterType,
+        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsRedirectingFactoryInvalidNamedParameterType(
+    String name, DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer;
+  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(codeRedirectingFactoryInvalidNamedParameterType,
+      message:
+          """The type of the named parameter '${name}' (${type}) is not a subtype of the redirection target's corresponding named parameter type (${type2}).""",
+      tip: """Try changing either the type of the parameter or the redirection target.""",
+      arguments: {'name': name, 'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, DartType _type, DartType _type2)>
+    templateRedirectingFactoryInvalidPositionalParameterType = const Template<
+            Message Function(String name, DartType _type, DartType _type2)>(
+        messageTemplate:
+            r"""The type of parameter '#name' (#type) is not a subtype of the redirection target's corresponding parameter type (#type2).""",
+        tipTemplate:
+            r"""Try changing either the type of the parameter or the redirection target.""",
+        withArguments:
+            _withArgumentsRedirectingFactoryInvalidPositionalParameterType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, DartType _type, DartType _type2)>
+    codeRedirectingFactoryInvalidPositionalParameterType =
+    const Code<Message Function(String name, DartType _type, DartType _type2)>(
+        "RedirectingFactoryInvalidPositionalParameterType",
+        templateRedirectingFactoryInvalidPositionalParameterType,
+        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsRedirectingFactoryInvalidPositionalParameterType(
+    String name, DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer;
+  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(codeRedirectingFactoryInvalidPositionalParameterType,
+      message:
+          """The type of parameter '${name}' (${type}) is not a subtype of the redirection target's corresponding parameter type (${type2}).""",
+      tip: """Try changing either the type of the parameter or the redirection target.""",
+      arguments: {'name': name, 'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, String name2)>
+    templateRedirectingFactoryMissingNamedParameter =
+    const Template<Message Function(String name, String name2)>(
+        messageTemplate:
+            r"""The constructor '#name' does not have a named parameter '#name2'.""",
+        tipTemplate:
+            r"""Try adding '#name2' as a named parameter to '#name'.""",
+        withArguments: _withArgumentsRedirectingFactoryMissingNamedParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeRedirectingFactoryMissingNamedParameter =
+    const Code<Message Function(String name, String name2)>(
+        "RedirectingFactoryMissingNamedParameter",
+        templateRedirectingFactoryMissingNamedParameter,
+        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsRedirectingFactoryMissingNamedParameter(
+    String name, String name2) {
+  return new Message(codeRedirectingFactoryMissingNamedParameter,
+      message:
+          """The constructor '${name}' does not have a named parameter '${name2}'.""",
+      tip: """Try adding '${name2}' as a named parameter to '${name}'.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(String name, int count, String name2, int count2)>
+    templateRedirectingFactoryProvidesTooFewRequiredParameters = const Template<
+            Message Function(String name, int count, String name2, int count2)>(
+        messageTemplate:
+            r"""Redirecting factory '#name' can provide less arguments ('#count') than required by the redirection target '#name2' ('#count2').""",
+        tipTemplate: r"""Try redirecting to a different constructor.""",
+        withArguments:
+            _withArgumentsRedirectingFactoryProvidesTooFewRequiredParameters);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, int count, String name2, int count2)>
+    codeRedirectingFactoryProvidesTooFewRequiredParameters = const Code<
+            Message Function(String name, int count, String name2, int count2)>(
+        "RedirectingFactoryProvidesTooFewRequiredParameters",
+        templateRedirectingFactoryProvidesTooFewRequiredParameters,
+        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsRedirectingFactoryProvidesTooFewRequiredParameters(
+    String name, int count, String name2, int count2) {
+  return new Message(codeRedirectingFactoryProvidesTooFewRequiredParameters,
+      message:
+          """Redirecting factory '${name}' can provide less arguments ('${count}') than required by the redirection target '${name2}' ('${count2}').""",
+      tip: """Try redirecting to a different constructor.""",
+      arguments: {
+        'name': name,
+        'count': count,
+        'name2': name2,
+        'count2': count2
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeRedirectionInNonFactory = messageRedirectionInNonFactory;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/get_dependencies.dart b/pkg/front_end/lib/src/fasta/get_dependencies.dart
index c7b7ba3..8903d3f 100644
--- a/pkg/front_end/lib/src/fasta/get_dependencies.dart
+++ b/pkg/front_end/lib/src/fasta/get_dependencies.dart
@@ -36,7 +36,7 @@
     ..packagesFileUri = packages
     ..sdkSummary = platform
     ..sdkRoot = sdk;
-  var pOptions = new ProcessedOptions(options, <Uri>[script]);
+  var pOptions = new ProcessedOptions(options: options, inputs: <Uri>[script]);
   return await CompilerContext.runWithOptions(pOptions,
       (CompilerContext c) async {
     FileSystem fileSystem = c.options.fileSystem;
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index b1ed5a3..c599b61 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -303,9 +303,13 @@
         userCode = userCodeOld;
       }
 
+      Map<Uri, Source> optionalUriToSource = context.options.embedSourceText
+          ? uriToSource
+          : uriToSource.map((uri, source) => MapEntry<Uri, Source>(
+              uri, new Source(source.lineStarts, const <int>[])));
       // This is the incremental component.
-      return context.options.target.configureComponent(
-          new Component(libraries: outputLibraries, uriToSource: uriToSource))
+      return context.options.target.configureComponent(new Component(
+          libraries: outputLibraries, uriToSource: optionalUriToSource))
         ..mainMethod = mainMethod;
     });
   }
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 fee5680..64a2e04 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -31,8 +31,7 @@
         offsetForToken,
         optional;
 
-import '../problems.dart'
-    show internalProblem, unexpected, unhandled, unsupported;
+import '../problems.dart' show unexpected, unhandled, unsupported;
 
 import '../quote.dart'
     show
@@ -52,7 +51,13 @@
 import '../severity.dart' show Severity;
 
 import '../source/scope_listener.dart'
-    show JumpTargetKind, NullValue, ScopeListener;
+    show
+        FixedNullableList,
+        GrowableList,
+        JumpTargetKind,
+        NullValue,
+        ParserRecovery,
+        ScopeListener;
 
 import '../type_inference/type_inferrer.dart' show TypeInferrer;
 
@@ -70,7 +75,7 @@
         IncompletePropertyAccessGenerator,
         IncompleteSendGenerator,
         IndexedAccessGenerator,
-        LargeIntAccessGenerator,
+        IntAccessGenerator,
         LoadLibraryGenerator,
         ParenthesizedExpressionGenerator,
         PrefixUseGenerator,
@@ -131,8 +136,6 @@
 
   final bool stringExpectedAfterNative;
 
-  final bool errorOnUnexactWebIntLiterals;
-
   /// Whether to ignore an unresolved reference to `main` within the body of
   /// `_getMainClosure` when compiling the current library.
   ///
@@ -226,8 +229,6 @@
             library.loader.target.backendTarget.enableNative(library.uri),
         stringExpectedAfterNative =
             library.loader.target.backendTarget.nativeExtensionExpectsString,
-        errorOnUnexactWebIntLiterals =
-            library.loader.target.backendTarget.errorOnUnexactWebIntLiterals,
         ignoreMainInGetMainClosure = library.uri.scheme == 'dart' &&
             (library.uri.path == "_builtin" || library.uri.path == "ui"),
         needsImplicitSuperInitializer =
@@ -323,10 +324,10 @@
   }
 
   Statement popBlock(int count, Token openBrace, Token closeBrace) {
-    List<Statement> statements =
-        new List<Statement>.filled(count, null, growable: true);
-    popList(count, statements);
-    return forest.block(openBrace, statements, closeBrace);
+    return forest.block(
+        openBrace,
+        const GrowableList<Statement>().pop(stack, count) ?? <Statement>[],
+        closeBrace);
   }
 
   Statement popStatementIfNotNull(Object value) {
@@ -387,8 +388,8 @@
       // This reports an error for duplicated declarations in the same scope:
       // `{ var x; var x; }`
       wrapVariableInitializerInError(
-          variable, fasta.templateDuplicatedName, <LocatedMessage>[
-        fasta.templateDuplicatedNameCause
+          variable, fasta.templateDuplicatedDeclaration, <LocatedMessage>[
+        fasta.templateDuplicatedDeclarationCause
             .withArguments(name)
             .withLocation(uri, existing.charOffset, name.length)
       ]);
@@ -469,9 +470,12 @@
   @override
   void endMetadataStar(int count) {
     debugEvent("MetadataStar");
-    push(popList(
-            count, new List<Expression>.filled(count, null, growable: true)) ??
-        NullValue.Metadata);
+    if (count == 0) {
+      push(NullValue.Metadata);
+    } else {
+      push(const GrowableList<Expression>().pop(stack, count) ??
+          NullValue.Metadata /* Ignore parser recovery */);
+    }
   }
 
   @override
@@ -497,11 +501,17 @@
       Expression initializer = pop();
       Identifier identifier = pop();
       String name = identifier.name;
-      FieldBuilder<Object> field;
+      Declaration declaration;
       if (classBuilder != null) {
-        field = classBuilder[name];
+        declaration = classBuilder[name];
       } else {
-        field = library[name];
+        declaration = library[name];
+      }
+      FieldBuilder<Object> field;
+      if (declaration.isField && declaration.next == null) {
+        field = declaration;
+      } else {
+        continue;
       }
       fields.add(field);
       if (initializer != null) {
@@ -1084,8 +1094,13 @@
   @override
   void endArguments(int count, Token beginToken, Token endToken) {
     debugEvent("Arguments");
-    List<Object> arguments = new List<Object>(count);
-    popList(count, arguments);
+    List<Object> arguments = count == 0
+        ? <Object>[]
+        : const FixedNullableList<Object>().pop(stack, count);
+    if (arguments == null) {
+      push(new ParserRecovery(beginToken.charOffset));
+      return;
+    }
     int firstNamedArgumentIndex = arguments.length;
     for (int i = 0; i < arguments.length; i++) {
       Object node = arguments[i];
@@ -1726,7 +1741,11 @@
       push(forest.literalString(value, token));
     } else {
       int count = 1 + interpolationCount * 2;
-      List<Object> parts = popList(count, new List<Object>(count));
+      List<Object> parts = const FixedNullableList<Object>().pop(stack, count);
+      if (parts == null) {
+        push(new ParserRecovery(endToken.charOffset));
+        return;
+      }
       Token first = parts.first;
       Token last = parts.last;
       Quote quote = analyzeQuote(first.lexeme);
@@ -1801,15 +1820,7 @@
   @override
   void handleLiteralInt(Token token) {
     debugEvent("LiteralInt");
-    int value = int.parse(token.lexeme, onError: (_) => null);
-    if (value == null) {
-      push(new LargeIntAccessGenerator(this, token));
-    } else {
-      if (errorOnUnexactWebIntLiterals) {
-        checkWebIntLiteralsErrorIfUnexact(value, token);
-      }
-      push(forest.literalInt(value, token));
-    }
+    push(IntAccessGenerator.parseIntLiteral(this, token));
   }
 
   @override
@@ -1975,14 +1986,16 @@
       }
       push(variable);
     } else {
-      List<VariableDeclarationJudgment> variables = popList(
-          count,
-          new List<VariableDeclarationJudgment>.filled(count, null,
-              growable: true));
+      List<VariableDeclaration> variables =
+          const FixedNullableList<VariableDeclaration>().pop(stack, count);
       constantContext = pop();
       currentLocalVariableType = pop();
       currentLocalVariableModifiers = pop();
       List<Expression> annotations = pop();
+      if (variables == null) {
+        push(new ParserRecovery(endToken.charOffset));
+        return;
+      }
       if (annotations != null) {
         bool isFirstVariable = true;
         for (VariableDeclarationJudgment variable in variables) {
@@ -2195,8 +2208,7 @@
       int count, Token leftBrace, Token constKeyword, Token rightBrace) {
     debugEvent("LiteralMap");
     List<MapEntry> entries =
-        new List<MapEntry>.filled(count, null, growable: true);
-    popList(count, entries);
+        const GrowableList<MapEntry>().pop(stack, count) ?? <MapEntry>[];
     List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
     DartType keyType;
     DartType valueType;
@@ -2255,7 +2267,11 @@
       push(forest.literalSymbolSingluar(value, hashToken, part));
     } else {
       List<Identifier> parts =
-          popList(identifierCount, new List<Identifier>(identifierCount));
+          const FixedNullableList<Identifier>().pop(stack, identifierCount);
+      if (parts == null) {
+        push(new ParserRecovery(hashToken.charOffset));
+        return;
+      }
       value = symbolPartToString(parts.first);
       for (int i = 1; i < parts.length; i++) {
         value += ".${symbolPartToString(parts[i])}";
@@ -2295,6 +2311,13 @@
       if (result == null) {
         unhandled("null", "result", beginToken.charOffset, uri);
       }
+    } else if (name is ProblemBuilder) {
+      // TODO(ahe): Arguments could be passed here.
+      result = new KernelNamedTypeBuilder(name.name, null)
+        ..bind(new KernelInvalidTypeBuilder(
+            name.name,
+            name.message.withLocation(
+                name.fileUri, name.charOffset, name.name.length)));
     } else {
       unhandled(
           "${name.runtimeType}", "handleType", beginToken.charOffset, uri);
@@ -2320,10 +2343,7 @@
         if (existing == null) {
           scopeBuilder.addMember(name, builder);
         } else {
-          addProblem(fasta.templateDuplicatedName.withArguments(name),
-              builder.charOffset, name.length);
-          addProblem(fasta.templateDuplicatedNameCause.withArguments(name),
-              existing.charOffset, name.length);
+          reportDuplicatedDeclaration(existing, name, builder.charOffset);
         }
       }
     }
@@ -2474,6 +2494,10 @@
       modifiers |= finalMask;
     }
     List<Expression> annotations = pop();
+    if (nameToken.isSynthetic) {
+      push(new ParserRecovery(nameToken.charOffset));
+      return;
+    }
     KernelFormalParameterBuilder parameter;
     if (!inCatchClause &&
         functionNestingLevel == 0 &&
@@ -2481,11 +2505,8 @@
       ProcedureBuilder<TypeBuilder> member = this.member;
       parameter = member.getFormal(name.name);
       if (parameter == null) {
-        internalProblem(
-            fasta.templateInternalProblemNotFoundIn
-                .withArguments(name.name, "formals"),
-            offsetForToken(nameToken),
-            uri);
+        push(new ParserRecovery(nameToken.charOffset));
+        return;
       }
     } else {
       parameter = new KernelFormalParameterBuilder(null, modifiers,
@@ -2529,12 +2550,16 @@
     // case, however, then [beginOptionalFormalParameters] wouldn't always be
     // matched by this method.
     List<KernelFormalParameterBuilder> parameters =
-        new List<KernelFormalParameterBuilder>(count);
-    popList(count, parameters);
-    for (KernelFormalParameterBuilder parameter in parameters) {
-      parameter.kind = kind;
+        const FixedNullableList<KernelFormalParameterBuilder>()
+            .pop(stack, count);
+    if (parameters == null) {
+      push(new ParserRecovery(offsetForToken(beginToken)));
+    } else {
+      for (KernelFormalParameterBuilder parameter in parameters) {
+        parameter.kind = kind;
+      }
+      push(parameters);
     }
-    push(parameters);
   }
 
   @override
@@ -2603,15 +2628,13 @@
       count--;
       optionalsCount = optionals.length;
     }
-    List<KernelFormalParameterBuilder> parameters;
-    if (count + optionalsCount > 0) {
-      parameters =
-          new List<KernelFormalParameterBuilder>(count + optionalsCount);
-      popList(count, parameters);
-      if (optionals != null) {
-        parameters.setRange(count, count + optionalsCount, optionals);
-      }
+    List<KernelFormalParameterBuilder> parameters =
+        const FixedNullableList<KernelFormalParameterBuilder>()
+            .popPadded(stack, count, optionalsCount);
+    if (optionals != null && parameters != null) {
+      parameters.setRange(count, count + optionalsCount, optionals);
     }
+    assert(parameters?.isNotEmpty ?? true);
     FormalParameters formals = new FormalParameters(parameters,
         offsetForToken(beginToken), lengthOfSpan(beginToken, endToken), uri);
     constantContext = pop();
@@ -2653,7 +2676,7 @@
     KernelFormalParameterBuilder exception;
     KernelFormalParameterBuilder stackTrace;
     List<Statement> compileTimeErrors;
-    if (catchParameters != null) {
+    if (catchParameters?.parameters != null) {
       int parameterCount = catchParameters.parameters.length;
       if (parameterCount > 0) {
         exception = catchParameters.parameters[0];
@@ -2700,7 +2723,7 @@
     List<Statement> compileTimeErrors;
     if (catchCount != 0) {
       List<Object> catchBlocksAndErrors =
-          popList(catchCount * 2, new List<Object>(catchCount * 2));
+          const FixedNullableList<Object>().pop(stack, catchCount * 2);
       catchBlocks = new List<Catch>.filled(catchCount, null, growable: true);
       for (int i = 0; i < catchCount; i++) {
         catchBlocks[i] = catchBlocksAndErrors[i * 2];
@@ -2759,14 +2782,8 @@
       if (optional("-", token)) {
         operator = "unary-";
 
-        if (receiver is LargeIntAccessGenerator) {
-          int value = int.tryParse("-" + receiver.token.lexeme);
-          if (value != null) {
-            receiverValue = forest.literalInt(value, receiver.token);
-            if (errorOnUnexactWebIntLiterals) {
-              checkWebIntLiteralsErrorIfUnexact(value, token);
-            }
-          }
+        if (receiver is IntAccessGenerator) {
+          receiverValue = receiver.buildNegatedRead();
         }
       }
       bool isSuper = false;
@@ -3260,7 +3277,9 @@
   @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
-    push(popList(count, new List<UnresolvedType<KernelTypeBuilder>>(count)));
+    push(const FixedNullableList<UnresolvedType<KernelTypeBuilder>>()
+            .pop(stack, count) ??
+        NullValue.TypeArguments);
   }
 
   @override
@@ -3309,10 +3328,12 @@
         forSyntheticToken: nameToken.isSynthetic,
         isFinal: true,
         isLocalFunction: true)
-      ..fileOffset = offsetForToken(nameToken);
-    if (scope.local[variable.name] != null) {
-      addProblem(fasta.templateDuplicatedName.withArguments(variable.name),
-          name.charOffset, nameToken.length);
+      ..fileOffset = name.charOffset;
+    // TODO(ahe): Why are we looking up in local scope, but declaring in parent
+    // scope?
+    Declaration existing = scope.local[name.name];
+    if (existing != null) {
+      reportDuplicatedDeclaration(existing, name.name, name.charOffset);
     }
     push(new FunctionDeclarationJudgment(
         variable,
@@ -3579,13 +3600,15 @@
   @override
   void beginLabeledStatement(Token token, int labelCount) {
     debugEvent("beginLabeledStatement");
-    List<Label> labels = new List<Label>(labelCount);
-    popList(labelCount, labels);
+    List<Label> labels =
+        const FixedNullableList<Label>().pop(stack, labelCount);
     enterLocalScope(null, scope.createNestedLabelScope());
     LabelTarget target =
-        new LabelTarget(labels, member, functionNestingLevel, token.charOffset);
-    for (Label label in labels) {
-      scope.declareLabel(label.name, target);
+        new LabelTarget(member, functionNestingLevel, token.charOffset);
+    if (labels != null) {
+      for (Label label in labels) {
+        scope.declareLabel(label.name, target);
+      }
     }
     push(target);
   }
@@ -3708,36 +3731,43 @@
   void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
     debugEvent("beginSwitchCase");
     int count = labelCount + expressionCount;
-    List<Object> labelsAndExpressions = popList(count, new List<Object>(count));
-    List<Label> labels = <Label>[];
-    List<Expression> expressions = <Expression>[];
+    List<Object> labelsAndExpressions =
+        const FixedNullableList<Object>().pop(stack, count);
+    List<Label> labels = labelCount == 0 ? null : new List<Label>(labelCount);
+    List<Expression> expressions =
+        new List<Expression>.filled(expressionCount, null, growable: true);
+    int labelIndex = 0;
+    int expressionIndex = 0;
     if (labelsAndExpressions != null) {
       for (Object labelOrExpression in labelsAndExpressions) {
         if (labelOrExpression is Label) {
-          labels.add(labelOrExpression);
+          labels[labelIndex++] = labelOrExpression;
         } else {
-          expressions.add(labelOrExpression);
+          expressions[expressionIndex++] = labelOrExpression;
         }
       }
     }
     assert(scope == switchScope);
-    for (Label label in labels) {
-      String labelName = label.name;
-      if (scope.hasLocalLabel(labelName)) {
-        // TODO(ahe): Should validate this is a goto target.
-        if (!scope.claimLabel(labelName)) {
-          addProblem(
-              fasta.templateDuplicateLabelInSwitchStatement
-                  .withArguments(labelName),
-              label.charOffset,
-              labelName.length);
+    if (labels != null) {
+      for (Label label in labels) {
+        String labelName = label.name;
+        if (scope.hasLocalLabel(labelName)) {
+          // TODO(ahe): Should validate this is a goto target.
+          if (!scope.claimLabel(labelName)) {
+            addProblem(
+                fasta.templateDuplicateLabelInSwitchStatement
+                    .withArguments(labelName),
+                label.charOffset,
+                labelName.length);
+          }
+        } else {
+          scope.declareLabel(
+              labelName, createGotoTarget(firstToken.charOffset));
         }
-      } else {
-        scope.declareLabel(labelName, createGotoTarget(firstToken.charOffset));
       }
     }
     push(expressions);
-    push(labels);
+    push(labels ?? NullValue.Labels);
     enterLocalScope("switch case");
   }
 
@@ -3765,7 +3795,7 @@
     push(new SwitchCaseJudgment(expressions, expressionOffsets, block,
         isDefault: defaultKeyword != null)
       ..fileOffset = firstToken.charOffset);
-    push(labels);
+    push(labels ?? NullValue.Labels);
   }
 
   @override
@@ -3794,10 +3824,12 @@
     for (int i = caseCount - 1; i >= 0; i--) {
       List<Label> labels = pop();
       SwitchCase current = cases[i] = pop();
-      for (Label label in labels) {
-        JumpTarget target = switchScope.lookupLabel(label.name);
-        if (target != null) {
-          target.resolveGotos(forest, current);
+      if (labels != null) {
+        for (Label label in labels) {
+          JumpTarget target = switchScope.lookupLabel(label.name);
+          if (target != null) {
+            target.resolveGotos(forest, current);
+          }
         }
       }
     }
@@ -3956,7 +3988,7 @@
     debugEvent("handleTypeVariablesDefined");
     assert(count > 0);
     List<KernelTypeVariableBuilder> typeVariables =
-        popList(count, new List<KernelTypeVariableBuilder>(count));
+        const FixedNullableList<KernelTypeVariableBuilder>().pop(stack, count);
     enterFunctionTypeScope(typeVariables);
     push(typeVariables);
   }
@@ -4458,6 +4490,22 @@
   }
 
   @override
+  void reportDuplicatedDeclaration(
+      Declaration existing, String name, int charOffset) {
+    List<LocatedMessage> context = existing.isSynthetic
+        ? null
+        : <LocatedMessage>[
+            fasta.templateDuplicatedDeclarationCause
+                .withArguments(name)
+                .withLocation(
+                    existing.fileUri, existing.charOffset, name.length)
+          ];
+    addProblem(fasta.templateDuplicatedDeclaration.withArguments(name),
+        charOffset, name.length,
+        context: context);
+  }
+
+  @override
   void debugEvent(String name) {
     // printEvent('BodyBuilder: $name');
   }
@@ -4486,26 +4534,6 @@
         forest.isErroneousNode(node);
   }
 
-  void checkWebIntLiteralsErrorIfUnexact(int value, Token token) {
-    BigInt asInt = new BigInt.from(value).toUnsigned(64);
-    BigInt asDouble = new BigInt.from(asInt.toDouble());
-    if (asInt != asDouble) {
-      String nearest;
-      if (token.lexeme.startsWith("0x") || token.lexeme.startsWith("0X")) {
-        nearest = '0x${asDouble.toRadixString(16)}';
-      } else {
-        nearest = '$asDouble';
-      }
-      library.addProblem(
-          fasta.templateWebLiteralCannotBeRepresentedExactly
-              .withArguments(token.lexeme, nearest),
-          token.charOffset,
-          token.charCount,
-          uri,
-          wasHandled: true);
-    }
-  }
-
   @override
   DartType buildDartType(UnresolvedType<KernelTypeBuilder> unresolvedType,
       {bool nonInstanceAccessIsError: false}) {
@@ -4610,8 +4638,6 @@
 }
 
 class LabelTarget extends Declaration implements JumpTarget {
-  final List<Label> labels;
-
   @override
   final MemberBuilder parent;
 
@@ -4624,8 +4650,7 @@
   @override
   final int charOffset;
 
-  LabelTarget(
-      this.labels, this.parent, this.functionNestingLevel, this.charOffset)
+  LabelTarget(this.parent, this.functionNestingLevel, this.charOffset)
       : breakTarget = new JumpTarget(
             JumpTargetKind.Break, functionNestingLevel, parent, charOffset),
         continueTarget = new JumpTarget(
@@ -4739,16 +4764,8 @@
     for (KernelFormalParameterBuilder parameter in parameters) {
       Declaration existing = local[parameter.name];
       if (existing != null) {
-        helper.addProblem(
-            fasta.templateDuplicatedName.withArguments(parameter.name),
-            parameter.charOffset,
-            parameter.name.length,
-            context: <LocatedMessage>[
-              fasta.templateDuplicatedNameCause
-                  .withArguments(parameter.name)
-                  .withLocation(existing.fileUri, existing.charOffset,
-                      parameter.name.length)
-            ]);
+        helper.reportDuplicatedDeclaration(
+            existing, parameter.name, parameter.charOffset);
       } else {
         local[parameter.name] = parameter;
       }
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 f81b7ef..ba11d9f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -25,7 +25,8 @@
         templateMissingExplicitTypeArguments,
         templateNotAPrefixInTypeAnnotation,
         templateNotAType,
-        templateUnresolvedPrefixInTypeAnnotation;
+        templateUnresolvedPrefixInTypeAnnotation,
+        templateWebLiteralCannotBeRepresentedExactly;
 
 import '../names.dart'
     show
@@ -663,10 +664,9 @@
   String get debugName => "ReadOnlyAccessGenerator";
 }
 
-abstract class LargeIntAccessGenerator implements Generator {
-  factory LargeIntAccessGenerator(
-      ExpressionGeneratorHelper helper, Token token) {
-    return helper.forest.largeIntAccessGenerator(helper, token);
+abstract class IntAccessGenerator implements Generator {
+  factory IntAccessGenerator(ExpressionGeneratorHelper helper, Token token) {
+    return helper.forest.intAccessGenerator(helper, token);
   }
 
   // TODO(ahe): This should probably be calling unhandled.
@@ -674,7 +674,66 @@
   String get plainNameForRead => null;
 
   @override
-  String get debugName => "LargeIntAccessGenerator";
+  String get debugName => "IntAccessGenerator";
+
+  static void checkWebIntLiteralsErrorIfUnexact(
+      ExpressionGeneratorHelper helper, int value, Token token) {
+    if (value >= 0 && value <= (1 << 53)) return;
+    if (!helper.library.loader.target.backendTarget
+        .errorOnUnexactWebIntLiterals) return;
+    BigInt asInt = new BigInt.from(value).toUnsigned(64);
+    BigInt asDouble = new BigInt.from(asInt.toDouble());
+    if (asInt != asDouble) {
+      String nearest;
+      if (token.lexeme.startsWith("0x") || token.lexeme.startsWith("0X")) {
+        nearest = '0x${asDouble.toRadixString(16)}';
+      } else {
+        nearest = '$asDouble';
+      }
+      helper.addProblem(
+          templateWebLiteralCannotBeRepresentedExactly.withArguments(
+              token.lexeme, nearest),
+          token.charOffset,
+          token.charCount);
+    }
+  }
+
+  static Object parseIntLiteral(ExpressionGeneratorHelper helper, Token token) {
+    int value = int.tryParse(token.lexeme);
+    // Postpone parsing of literals resulting in a negative value
+    // (hex literals >= 2^63). These are only allowed when not negated.
+    if (value == null || value < 0) {
+      return new IntAccessGenerator(helper, token);
+    } else {
+      checkWebIntLiteralsErrorIfUnexact(helper, value, token);
+      return helper.forest.literalInt(value, token);
+    }
+  }
+
+  Expression parseOrError(String literal, Token token) {
+    int value = int.tryParse(literal);
+    if (value != null) {
+      checkWebIntLiteralsErrorIfUnexact(helper, value, token);
+      return helper.forest.literalInt(value, token);
+    } else {
+      return buildError();
+    }
+  }
+
+  @override
+  Expression buildSimpleRead() {
+    // Called when literal that previously failed to parse, or resulted in
+    // a negative value (hex literals >= 2^63), is not negated.
+    // Try parsing again, this time accepting negative values.
+    return parseOrError(token.lexeme, token);
+  }
+
+  Expression buildNegatedRead() {
+    // Called when literal that previously failed to parse, or resulted in
+    // a negative value (hex literals >= 2^63), is negated.
+    // Try parsing with a '-' in front.
+    return parseOrError("-" + token.lexeme, token);
+  }
 
   SyntheticExpressionJudgment buildError() {
     return helper.buildProblem(
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 4c8a138..6629dba 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
@@ -23,7 +23,7 @@
 import 'forest.dart' show Forest;
 
 import 'kernel_builder.dart'
-    show KernelTypeBuilder, PrefixBuilder, UnresolvedType;
+    show Declaration, KernelTypeBuilder, PrefixBuilder, UnresolvedType;
 
 import 'kernel_ast_api.dart'
     show
@@ -150,4 +150,7 @@
 
   List<DartType> buildDartTypeArguments(
       List<UnresolvedType<KernelTypeBuilder>> unresolvedTypes);
+
+  void reportDuplicatedDeclaration(
+      Declaration existing, String name, int charOffset);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 6183be9..f0f16e5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -44,7 +44,7 @@
         KernelDelayedAssignment,
         KernelDelayedPostfixIncrement,
         KernelIndexedAccessGenerator,
-        KernelLargeIntAccessGenerator,
+        KernelIntAccessGenerator,
         KernelLoadLibraryGenerator,
         KernelNullAwarePropertyAccessGenerator,
         KernelPrefixUseGenerator,
@@ -491,7 +491,8 @@
   @override
   Statement wrapVariables(Statement statement) {
     if (statement is _VariablesDeclaration) {
-      return new BlockJudgment(statement.declarations)
+      return new BlockJudgment(
+          new List<Statement>.from(statement.declarations, growable: true))
         ..fileOffset = statement.fileOffset;
     } else if (statement is VariableDeclaration) {
       return new BlockJudgment(<Statement>[statement])
@@ -696,9 +697,9 @@
   }
 
   @override
-  KernelLargeIntAccessGenerator largeIntAccessGenerator(
+  KernelIntAccessGenerator intAccessGenerator(
       ExpressionGeneratorHelper helper, Token token) {
-    return new KernelLargeIntAccessGenerator(helper, token);
+    return new KernelIntAccessGenerator(helper, token);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 86f4e31..ffb30fa 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -386,7 +386,7 @@
   Generator readOnlyAccessGenerator(ExpressionGeneratorHelper helper,
       Token location, Expression expression, String plainNameForRead);
 
-  Generator largeIntAccessGenerator(
+  Generator intAccessGenerator(
       ExpressionGeneratorHelper helper, Token location);
 
   Generator unresolvedNameGenerator(
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 10c696a..3ad8c9c 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
@@ -31,6 +31,9 @@
         Arguments,
         VariableDeclaration;
 
+import 'package:kernel/ast.dart'
+    show FunctionType, NamedType, TypeParameterType;
+
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/clone.dart' show CloneWithoutBody;
@@ -53,6 +56,8 @@
         messagePatchDeclarationMismatch,
         messagePatchDeclarationOrigin,
         noLength,
+        templateFactoryRedirecteeHasTooFewPositionalParameters,
+        templateFactoryRedirecteeInvalidReturnType,
         templateImplementsRepeated,
         templateImplementsSuperClass,
         templateMissingImplementationCause,
@@ -65,6 +70,11 @@
         templateOverrideTypeMismatchParameter,
         templateOverrideTypeMismatchReturnType,
         templateOverrideTypeVariablesMismatch,
+        templateRedirectingFactoryIncompatibleTypeArgument,
+        templateRedirectingFactoryInvalidNamedParameterType,
+        templateRedirectingFactoryInvalidPositionalParameterType,
+        templateRedirectingFactoryMissingNamedParameter,
+        templateRedirectingFactoryProvidesTooFewRequiredParameters,
         templateRedirectionTargetNotFound,
         templateTypeArgumentMismatch;
 
@@ -80,6 +90,7 @@
         ConstructorReferenceBuilder,
         Declaration,
         KernelLibraryBuilder,
+        KernelFunctionBuilder,
         KernelProcedureBuilder,
         KernelRedirectingFactoryBuilder,
         KernelNamedTypeBuilder,
@@ -92,7 +103,8 @@
         Scope,
         TypeVariableBuilder;
 
-import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
+import 'redirecting_factory_body.dart'
+    show getRedirectingFactoryBody, RedirectingFactoryBody;
 
 import 'kernel_target.dart' show KernelTarget;
 
@@ -1176,4 +1188,294 @@
     }
     return declaration;
   }
+
+  // Computes the function type of a given redirection target. Returns [null] if
+  // the type of actual target could not be computed.
+  FunctionType computeRedirecteeType(KernelRedirectingFactoryBuilder factory,
+      TypeEnvironment typeEnvironment) {
+    ConstructorReferenceBuilder redirectionTarget = factory.redirectionTarget;
+    FunctionNode target;
+    bool isConstructor = false;
+    Class targetClass; // Used when the redirection target is a constructor.
+    if (redirectionTarget.target is KernelFunctionBuilder) {
+      KernelFunctionBuilder targetBuilder = redirectionTarget.target;
+      target = targetBuilder.function;
+      isConstructor = targetBuilder.isConstructor;
+      if (isConstructor) {
+        targetClass = targetBuilder.parent.target;
+      }
+    } else if (redirectionTarget.target is DillMemberBuilder &&
+        (redirectionTarget.target.isConstructor ||
+            redirectionTarget.target.isFactory)) {
+      DillMemberBuilder targetBuilder = redirectionTarget.target;
+      // It seems that the [redirectionTarget.target] is an instance of
+      // [DillMemberBuilder] whenever the redirectee is an implicit constructor,
+      // e.g.
+      //
+      //   class A {
+      //     factory A() = B;
+      //   }
+      //   class B implements A {}
+      //
+      target = targetBuilder.member.function;
+      isConstructor = targetBuilder.isConstructor;
+      if (isConstructor) {
+        targetClass = targetBuilder.member.enclosingClass;
+      }
+    } else {
+      return null;
+    }
+
+    List<DartType> typeArguments =
+        getRedirectingFactoryBody(factory.target).typeArguments;
+    FunctionType targetFunctionType = target.functionType;
+    if (typeArguments != null &&
+        targetFunctionType.typeParameters.length != typeArguments.length) {
+      addProblem(
+          templateTypeArgumentMismatch
+              .withArguments(targetFunctionType.typeParameters.length),
+          redirectionTarget.charOffset,
+          noLength);
+      return null;
+    }
+
+    // Compute the substitution of the target class type parameters if
+    // [redirectionTarget] has any type arguments.
+    Substitution substitution;
+    bool hasProblem = false;
+    if (typeArguments != null && typeArguments.length > 0) {
+      substitution = Substitution.fromPairs(
+          targetFunctionType.typeParameters, typeArguments);
+      for (int i = 0; i < targetFunctionType.typeParameters.length; i++) {
+        TypeParameter typeParameter = targetFunctionType.typeParameters[i];
+        DartType typeParameterBound =
+            substitution.substituteType(typeParameter.bound);
+        DartType typeArgument = typeArguments[i];
+        // Check whether the [typeArgument] respects the bounds of [typeParameter].
+        if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound)) {
+          addProblem(
+              templateRedirectingFactoryIncompatibleTypeArgument.withArguments(
+                  typeArgument, typeParameterBound),
+              redirectionTarget.charOffset,
+              noLength);
+          hasProblem = true;
+        }
+      }
+    } else if (typeArguments == null &&
+        targetFunctionType.typeParameters.length > 0) {
+      // TODO(hillerstrom): In this case, we need to perform type inference on
+      // the redirectee to obtain actual type arguments which would allow the
+      // following program to type check:
+      //
+      //    class A<T> {
+      //       factory A() = B;
+      //    }
+      //    class B<T> implements A<T> {
+      //       B();
+      //    }
+      //
+      return null;
+    }
+
+    FunctionType redirecteeType;
+    // If the target is a constructor then we need to patch the return type of
+    // [targetFunctionType], because constructors always have return type to be
+    // "void", whereas the return type of a factory is its enclosing
+    // class. TODO(hillerstrom): It may be worthwhile to change the typing of
+    // constructors such that the return type is its enclosing class.
+    if (isConstructor) {
+      DartType returnType =
+          new InterfaceType(targetClass, typeArguments ?? const <DartType>[]);
+
+      redirecteeType = new FunctionType(
+          targetFunctionType.positionalParameters, returnType,
+          namedParameters: targetFunctionType.namedParameters,
+          typeParameters: targetFunctionType.typeParameters,
+          requiredParameterCount: targetFunctionType.requiredParameterCount);
+    } else {
+      redirecteeType = targetFunctionType;
+    }
+
+    // Substitute if necessary.
+    redirecteeType = substitution == null
+        ? redirecteeType
+        : (substitution.substituteType(redirecteeType.withoutTypeParameters)
+            as FunctionType);
+
+    return hasProblem ? null : redirecteeType;
+  }
+
+  String computeRedirecteeName(ConstructorReferenceBuilder redirectionTarget) {
+    String targetName = redirectionTarget.fullNameForErrors;
+    if (targetName == "") {
+      return redirectionTarget.target.parent.fullNameForErrors;
+    } else {
+      return targetName;
+    }
+  }
+
+  void checkRedirectingFactory(KernelRedirectingFactoryBuilder factory,
+      TypeEnvironment typeEnvironment) {
+    // The factory type cannot contain any type parameters other than those of
+    // its enclosing class, because constructors cannot specify type parameters
+    // of their own.
+    FunctionType factoryType =
+        factory.procedure.function.functionType.withoutTypeParameters;
+    FunctionType redirecteeType =
+        computeRedirecteeType(factory, typeEnvironment);
+
+    // TODO(hillerstrom): It would be preferable to know whether a failure
+    // happened during [_computeRedirecteeType].
+    if (redirecteeType == null) return;
+
+    // Check whether [redirecteeType] <: [factoryType]. In the following let
+    //     [factoryType    = (S_1, ..., S_i, {S_(i+1), ..., S_n}) -> S']
+    //     [redirecteeType = (T_1, ..., T_j, {T_(j+1), ..., T_m}) -> T'].
+
+    // Ensure that any extra parameters that [redirecteeType] might have are
+    // optional.
+    if (redirecteeType.requiredParameterCount >
+        factoryType.requiredParameterCount) {
+      addProblem(
+          templateRedirectingFactoryProvidesTooFewRequiredParameters
+              .withArguments(
+                  factory.fullNameForErrors,
+                  factoryType.requiredParameterCount,
+                  computeRedirecteeName(factory.redirectionTarget),
+                  redirecteeType.requiredParameterCount),
+          factory.charOffset,
+          noLength);
+      return;
+    }
+    if (redirecteeType.positionalParameters.length <
+        factoryType.positionalParameters.length) {
+      String targetName = computeRedirecteeName(factory.redirectionTarget);
+      addProblem(
+          templateFactoryRedirecteeHasTooFewPositionalParameters.withArguments(
+              targetName, redirecteeType.positionalParameters.length),
+          factory.redirectionTarget.charOffset,
+          noLength);
+      return;
+    }
+
+    // For each 0 < k < i check S_k <: T_k.
+    for (int i = 0; i < factoryType.positionalParameters.length; ++i) {
+      var factoryParameterType = factoryType.positionalParameters[i];
+      var redirecteeParameterType = redirecteeType.positionalParameters[i];
+      if (!typeEnvironment.isSubtypeOf(
+          factoryParameterType, redirecteeParameterType)) {
+        final factoryParameter =
+            factory.target.function.positionalParameters[i];
+        addProblem(
+            templateRedirectingFactoryInvalidPositionalParameterType
+                .withArguments(factoryParameter.name, factoryParameterType,
+                    redirecteeParameterType),
+            factoryParameter.fileOffset,
+            factoryParameter.name.length);
+        return;
+      }
+    }
+
+    // For each i < k < n check that the named parameter S_k has a corresponding
+    // named parameter T_l in [redirecteeType] for some j < l < m.
+    int factoryTypeNameIndex = 0; // k.
+    int redirecteeTypeNameIndex = 0; // l.
+
+    // The following code makes use of the invariant that [namedParameters] are
+    // already sorted (i.e. it's a monotonic sequence) to determine in a linear
+    // pass whether [factory.namedParameters] is a subset of
+    // [redirectee.namedParameters]. In the comments below the symbol <= stands
+    // for the usual lexicographic relation on strings.
+    while (factoryTypeNameIndex < factoryType.namedParameters.length) {
+      // If we have gone beyond the bound of redirectee's named parameters, then
+      // signal a missing named parameter error.
+      if (redirecteeTypeNameIndex == redirecteeType.namedParameters.length) {
+        reportRedirectingFactoryMissingNamedParameter(
+            factory, factoryType.namedParameters[factoryTypeNameIndex]);
+        break;
+      }
+
+      int result = redirecteeType.namedParameters[redirecteeTypeNameIndex].name
+          .compareTo(factoryType.namedParameters[factoryTypeNameIndex].name);
+      if (result < 0) {
+        // T_l.name <= S_k.name.
+        redirecteeTypeNameIndex++;
+      } else if (result == 0) {
+        // S_k.name <= T_l.name.
+        NamedType factoryParameterType =
+            factoryType.namedParameters[factoryTypeNameIndex];
+        NamedType redirecteeParameterType =
+            redirecteeType.namedParameters[redirecteeTypeNameIndex];
+        // Check S_k <: T_l.
+        if (!typeEnvironment.isSubtypeOf(
+            factoryParameterType.type, redirecteeParameterType.type)) {
+          var factoryFormal =
+              factory.target.function.namedParameters[redirecteeTypeNameIndex];
+          addProblem(
+              templateRedirectingFactoryInvalidNamedParameterType.withArguments(
+                  factoryParameterType.name,
+                  factoryParameterType.type,
+                  redirecteeParameterType.type),
+              factoryFormal.fileOffset,
+              factoryFormal.name.length);
+          return;
+        }
+        redirecteeTypeNameIndex++;
+        factoryTypeNameIndex++;
+      } else {
+        // S_k.name <= T_l.name. By appealing to the monotinicity of
+        // [namedParameters] and the transivity of <= it follows that for any
+        // l', such that l < l', it must be the case that S_k <= T_l'. Thus the
+        // named parameter is missing from the redirectee's parameter list.
+        reportRedirectingFactoryMissingNamedParameter(
+            factory, factoryType.namedParameters[factoryTypeNameIndex]);
+
+        // Continue with the next factory named parameter.
+        factoryTypeNameIndex++;
+      }
+    }
+
+    // Report any unprocessed factory named parameters as missing.
+    if (factoryTypeNameIndex < factoryType.namedParameters.length) {
+      for (int i = factoryTypeNameIndex;
+          i < factoryType.namedParameters.length;
+          i++) {
+        reportRedirectingFactoryMissingNamedParameter(
+            factory, factoryType.namedParameters[factoryTypeNameIndex]);
+      }
+    }
+
+    // Check that T' <: S'.
+    if (!typeEnvironment.isSubtypeOf(
+        redirecteeType.returnType, factoryType.returnType)) {
+      String targetName = computeRedirecteeName(factory.redirectionTarget);
+      addProblem(
+          templateFactoryRedirecteeInvalidReturnType.withArguments(
+              redirecteeType.returnType, targetName, factoryType.returnType),
+          factory.redirectionTarget.charOffset,
+          noLength);
+      return;
+    }
+  }
+
+  void reportRedirectingFactoryMissingNamedParameter(
+      KernelRedirectingFactoryBuilder factory, NamedType missingParameter) {
+    addProblem(
+        templateRedirectingFactoryMissingNamedParameter.withArguments(
+            computeRedirecteeName(factory.redirectionTarget),
+            missingParameter.name),
+        factory.redirectionTarget.charOffset,
+        noLength);
+  }
+
+  void checkRedirectingFactories(TypeEnvironment typeEnvironment) {
+    Map<String, MemberBuilder> constructors = this.constructors.local;
+    Iterable<String> names = constructors.keys;
+    for (String name in names) {
+      Declaration constructor = constructors[name];
+      if (constructor is KernelRedirectingFactoryBuilder) {
+        checkRedirectingFactory(constructor, typeEnvironment);
+      }
+    }
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index 9cdc301..908aa05 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -30,9 +30,10 @@
 
 import '../fasta_codes.dart'
     show
+        LocatedMessage,
         messageNoUnnamedConstructorInObject,
-        noLength,
-        templateDuplicatedName,
+        templateDuplicatedDeclaration,
+        templateDuplicatedDeclarationCause,
         templateEnumConstantSameNameAsEnclosing;
 
 import '../modifier.dart' show constMask, finalMask, staticMask;
@@ -43,6 +44,7 @@
     show
         Declaration,
         EnumBuilder,
+        EnumConstantInfo,
         FormalParameterBuilder,
         KernelClassBuilder,
         KernelConstructorBuilder,
@@ -61,7 +63,8 @@
 
 class KernelEnumBuilder extends SourceClassBuilder
     implements EnumBuilder<KernelTypeBuilder, InterfaceType> {
-  final List<Object> constantNamesAndOffsetsAndDocs;
+  @override
+  final List<EnumConstantInfo> enumConstantInfos;
 
   final KernelNamedTypeBuilder intType;
 
@@ -77,7 +80,7 @@
       Scope scope,
       Scope constructors,
       ShadowClass cls,
-      this.constantNamesAndOffsetsAndDocs,
+      this.enumConstantInfos,
       this.intType,
       this.listType,
       this.objectType,
@@ -86,17 +89,18 @@
       int startCharOffset,
       int charOffset)
       : super(metadata, 0, name, null, null, null, scope, constructors, parent,
-            null, startCharOffset, charOffset, TreeNode.noOffset, cls);
+            null, startCharOffset, charOffset, TreeNode.noOffset,
+            cls: cls);
 
   factory KernelEnumBuilder(
       MetadataCollector metadataCollector,
       List<MetadataBuilder> metadata,
       String name,
-      List<Object> constantNamesAndOffsetsAndDocs,
+      List<EnumConstantInfo> enumConstantInfos,
       KernelLibraryBuilder parent,
       int charOffset,
       int charEndOffset) {
-    constantNamesAndOffsetsAndDocs ??= const <Object>[];
+    assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
     // TODO(ahe): These types shouldn't be looked up in scope, they come
     // directly from dart:core.
     KernelTypeBuilder intType = new KernelNamedTypeBuilder("int", null);
@@ -161,38 +165,47 @@
         charEndOffset);
     members["toString"] = toStringBuilder;
     String className = name;
-    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 4) {
-      List<MetadataBuilder> metadata = constantNamesAndOffsetsAndDocs[i];
-      String name = constantNamesAndOffsetsAndDocs[i + 1];
-      int charOffset = constantNamesAndOffsetsAndDocs[i + 2];
-      String documentationComment = constantNamesAndOffsetsAndDocs[i + 3];
-      if (members.containsKey(name)) {
-        parent.addProblem(templateDuplicatedName.withArguments(name),
-            charOffset, noLength, parent.fileUri);
-        constantNamesAndOffsetsAndDocs[i + 1] = null;
-        continue;
-      }
-      if (name == className) {
-        parent.addProblem(
-            templateEnumConstantSameNameAsEnclosing.withArguments(name),
+    if (enumConstantInfos != null) {
+      for (int i = 0; i < enumConstantInfos.length; i++) {
+        EnumConstantInfo enumConstantInfo = enumConstantInfos[i];
+        List<MetadataBuilder> metadata = enumConstantInfo.metadata;
+        String name = enumConstantInfo.name;
+        int charOffset = enumConstantInfo.charOffset;
+        String documentationComment = enumConstantInfo.documentationComment;
+        MemberBuilder existing = members[name];
+        if (existing != null) {
+          List<LocatedMessage> context = existing.isSynthetic
+              ? null
+              : <LocatedMessage>[
+                  templateDuplicatedDeclarationCause
+                      .withArguments(name)
+                      .withLocation(
+                          parent.fileUri, existing.charOffset, name.length)
+                ];
+          parent.addProblem(templateDuplicatedDeclaration.withArguments(name),
+              charOffset, name.length, parent.fileUri,
+              context: context);
+          enumConstantInfos[i] = null;
+        } else if (name == className) {
+          parent.addProblem(
+              templateEnumConstantSameNameAsEnclosing.withArguments(name),
+              charOffset,
+              name.length,
+              parent.fileUri);
+        }
+        KernelFieldBuilder fieldBuilder = new KernelFieldBuilder(
+            metadata,
+            selfType,
+            name,
+            constMask | staticMask,
+            parent,
             charOffset,
-            noLength,
-            parent.fileUri);
-        constantNamesAndOffsetsAndDocs[i + 1] = null;
-        continue;
+            null,
+            true);
+        metadataCollector?.setDocumentationComment(
+            fieldBuilder.target, documentationComment);
+        members[name] = fieldBuilder..next = existing;
       }
-      KernelFieldBuilder fieldBuilder = new KernelFieldBuilder(
-          metadata,
-          selfType,
-          name,
-          constMask | staticMask,
-          parent,
-          charOffset,
-          null,
-          true);
-      metadataCollector?.setDocumentationComment(
-          fieldBuilder.target, documentationComment);
-      members[name] = fieldBuilder;
     }
     final int startCharOffset =
         metadata == null ? charOffset : metadata.first.charOffset;
@@ -204,7 +217,7 @@
         new Scope(constructors, null, null, "constructors",
             isModifiable: false),
         cls,
-        constantNamesAndOffsetsAndDocs,
+        enumConstantInfos,
         intType,
         listType,
         objectType,
@@ -212,10 +225,11 @@
         parent,
         startCharOffset,
         charOffset);
-    // TODO(sigmund): dynamic should be `covariant MemberBuilder`.
-    void setParent(String name, dynamic b) {
-      MemberBuilder builder = b;
-      builder.parent = enumBuilder;
+    void setParent(String name, MemberBuilder builder) {
+      do {
+        builder.parent = enumBuilder;
+        builder = builder.next;
+      } while (builder != null);
     }
 
     members.forEach(setParent);
@@ -242,22 +256,26 @@
         coreLibrary.scope, charOffset, fileUri, libraryBuilder);
     listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
 
-    KernelFieldBuilder indexFieldBuilder = this["index"];
+    KernelFieldBuilder indexFieldBuilder = firstMemberNamed("index");
     Field indexField = indexFieldBuilder.build(libraryBuilder);
-    KernelFieldBuilder nameFieldBuilder = this["_name"];
+    KernelFieldBuilder nameFieldBuilder = firstMemberNamed("_name");
     Field nameField = nameFieldBuilder.build(libraryBuilder);
-    KernelProcedureBuilder toStringBuilder = this["toString"];
+    KernelProcedureBuilder toStringBuilder = firstMemberNamed("toString");
     toStringBuilder.body = new ReturnStatement(
         new DirectPropertyGet(new ThisExpression(), nameField));
     List<Expression> values = <Expression>[];
-    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 4) {
-      String name = constantNamesAndOffsetsAndDocs[i + 1];
-      if (name != null) {
-        KernelFieldBuilder builder = this[name];
-        values.add(new StaticGet(builder.build(libraryBuilder)));
+    if (enumConstantInfos != null) {
+      for (EnumConstantInfo enumConstantInfo in enumConstantInfos) {
+        if (enumConstantInfo != null) {
+          Declaration declaration = firstMemberNamed(enumConstantInfo.name);
+          if (declaration.isField) {
+            KernelFieldBuilder field = declaration;
+            values.add(new StaticGet(field.build(libraryBuilder)));
+          }
+        }
       }
     }
-    KernelFieldBuilder valuesBuilder = this["values"];
+    KernelFieldBuilder valuesBuilder = firstMemberNamed("values");
     valuesBuilder.build(libraryBuilder);
     valuesBuilder.initializer =
         new ListLiteral(values, typeArgument: cls.rawType, isConst: true);
@@ -281,24 +299,32 @@
       // unnamed constructor requires no arguments. But that information isn't
       // always available at this point, and it's not really a situation that
       // can happen unless you start modifying the SDK sources.
-      addProblem(messageNoUnnamedConstructorInObject, -1, noLength);
+      library.addProblem(messageNoUnnamedConstructorInObject,
+          objectClass.charOffset, objectClass.name.length, objectClass.fileUri);
     } else {
       constructor.initializers.add(
           new SuperInitializer(superConstructor.target, new Arguments.empty())
             ..parent = constructor);
     }
     int index = 0;
-    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 4) {
-      String constant = constantNamesAndOffsetsAndDocs[i + 1];
-      if (constant != null) {
-        KernelFieldBuilder field = this[constant];
-        field.build(libraryBuilder);
-        Arguments arguments = new Arguments(<Expression>[
-          new IntLiteral(index++),
-          new StringLiteral("$name.$constant")
-        ]);
-        field.initializer =
-            new ConstructorInvocation(constructor, arguments, isConst: true);
+    if (enumConstantInfos != null) {
+      for (EnumConstantInfo enumConstantInfo in enumConstantInfos) {
+        if (enumConstantInfo != null) {
+          String constant = enumConstantInfo.name;
+          Declaration declaration = firstMemberNamed(constant);
+          KernelFieldBuilder field;
+          if (declaration.isField) {
+            field = declaration;
+          } else {
+            continue;
+          }
+          Arguments arguments = new Arguments(<Expression>[
+            new IntLiteral(index++),
+            new StringLiteral("$name.$constant")
+          ]);
+          field.initializer =
+              new ConstructorInvocation(constructor, arguments, isConst: true);
+        }
       }
     }
     return super.build(libraryBuilder, coreLibrary);
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 403b63e..b7ac953 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
@@ -31,6 +31,8 @@
 
 import '../problems.dart' show unhandled, unsupported;
 
+import '../scope.dart' show AmbiguousBuilder;
+
 import 'body_builder.dart' show noLocation;
 
 import 'constness.dart' show Constness;
@@ -45,7 +47,7 @@
         ExpressionGenerator,
         Generator,
         IndexedAccessGenerator,
-        LargeIntAccessGenerator,
+        IntAccessGenerator,
         LoadLibraryGenerator,
         NullAwarePropertyAccessGenerator,
         PrefixUseGenerator,
@@ -1296,7 +1298,7 @@
     if (declaration is KernelClassBuilder) {
       KernelClassBuilder declaration = this.declaration;
       Declaration member = declaration.findStaticBuilder(
-          name.name, offsetForToken(token), uri, helper.library);
+          name.name, offsetForToken(send.token), uri, helper.library);
 
       Generator generator;
       if (member == null) {
@@ -1314,6 +1316,9 @@
               token.charOffset,
               Constness.implicit);
         }
+      } else if (member is AmbiguousBuilder) {
+        return helper.buildProblem(
+            member.message, member.charOffset, name.name.length);
       } else {
         Declaration setter;
         if (member.isSetter) {
@@ -1390,9 +1395,8 @@
   }
 }
 
-class KernelLargeIntAccessGenerator extends KernelGenerator
-    with LargeIntAccessGenerator {
-  KernelLargeIntAccessGenerator(ExpressionGeneratorHelper helper, Token token)
+class KernelIntAccessGenerator extends KernelGenerator with IntAccessGenerator {
+  KernelIntAccessGenerator(ExpressionGeneratorHelper helper, Token token)
       : super(helper, token);
 
   @override
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 37562af..cae832e 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
@@ -62,7 +62,11 @@
 import '../loader.dart' show Loader;
 
 import '../modifier.dart'
-    show abstractMask, namedMixinApplicationMask, staticMask;
+    show
+        abstractMask,
+        mixinDeclarationMask,
+        namedMixinApplicationMask,
+        staticMask;
 
 import '../problems.dart' show unexpected, unhandled;
 
@@ -79,6 +83,7 @@
         ConstructorReferenceBuilder,
         Declaration,
         DynamicTypeBuilder,
+        EnumConstantInfo,
         FormalParameterBuilder,
         InvalidTypeBuilder,
         KernelClassBuilder,
@@ -216,6 +221,11 @@
     // library scope.
     Scope constructorScope = new Scope(constructors, null, null, "constructors",
         isModifiable: false);
+    bool isMixinDeclaration = false;
+    if (modifiers & mixinDeclarationMask != 0) {
+      isMixinDeclaration = true;
+      modifiers = (modifiers & ~mixinDeclarationMask) | abstractMask;
+    }
     ClassBuilder cls = new SourceClassBuilder(
         metadata,
         modifiers,
@@ -230,7 +240,8 @@
         new List<ConstructorReferenceBuilder>.from(constructorReferences),
         startCharOffset,
         charOffset,
-        charEndOffset);
+        charEndOffset,
+        isMixinDeclaration: isMixinDeclaration);
     loader.target.metadataCollector
         ?.setDocumentationComment(cls.target, documentationComment);
 
@@ -470,8 +481,7 @@
             startCharOffset,
             charOffset,
             TreeNode.noOffset,
-            null,
-            mixin);
+            mixedInType: mixin);
         if (isNamedMixinApplication) {
           loader.target.metadataCollector?.setDocumentationComment(
               application.target, documentationComment);
@@ -691,22 +701,17 @@
     }
   }
 
+  @override
   void addEnum(
       String documentationComment,
       List<MetadataBuilder> metadata,
       String name,
-      List<Object> constantNamesAndOffsets,
+      List<EnumConstantInfo> enumConstantInfos,
       int charOffset,
       int charEndOffset) {
     MetadataCollector metadataCollector = loader.target.metadataCollector;
-    KernelEnumBuilder builder = new KernelEnumBuilder(
-        metadataCollector,
-        metadata,
-        name,
-        constantNamesAndOffsets,
-        this,
-        charOffset,
-        charEndOffset);
+    KernelEnumBuilder builder = new KernelEnumBuilder(metadataCollector,
+        metadata, name, enumConstantInfos, this, charOffset, charEndOffset);
     addBuilder(name, builder, charOffset);
     metadataCollector?.setDocumentationComment(
         builder.target, documentationComment);
@@ -796,11 +801,24 @@
       return;
     }
     if (cls != null) {
+      if (declaration.next != null) {
+        int count = 0;
+        Declaration current = declaration.next;
+        while (current != null) {
+          count++;
+          current = current.next;
+        }
+        cls.name += "#$count";
+      }
       library.addClass(cls);
     } else if (member != null) {
-      library.addMember(member);
+      if (declaration.next == null) {
+        library.addMember(member);
+      }
     } else if (typedef != null) {
-      library.addTypedef(typedef);
+      if (declaration.next == null) {
+        library.addTypedef(typedef);
+      }
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
index 95d3634..5356ee7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
@@ -27,7 +27,8 @@
 
   KernelMixinApplicationBuilder(
       KernelTypeBuilder supertype, List<KernelTypeBuilder> mixins)
-      : super(supertype, mixins);
+      : assert(mixins != null),
+        super(supertype, mixins);
 
   @override
   InterfaceType build(LibraryBuilder library) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 5daa713..bf3f19e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -69,6 +69,8 @@
 
 import '../severity.dart' show Severity;
 
+import '../scope.dart' show AmbiguousBuilder;
+
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 
 import '../source/source_loader.dart' show SourceLoader;
@@ -261,6 +263,7 @@
           loader.checkSupertypes(myClasses);
           loader.checkOverrides(myClasses);
           loader.checkAbstractMembers(myClasses);
+          loader.checkRedirectingFactories(myClasses);
           loader.addNoSuchMethodForwarders(myClasses);
           return component;
         },
@@ -404,6 +407,10 @@
       // TODO(sigmund): do only for full program
       Declaration declaration =
           loader.first.exportScope.lookup("main", -1, null);
+      if (declaration is AmbiguousBuilder) {
+        AmbiguousBuilder problem = declaration;
+        declaration = problem.getFirstDeclaration();
+      }
       if (declaration is KernelProcedureBuilder) {
         component.mainMethod = declaration.procedure;
       } else if (declaration is DillMemberBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 239709c..30686ba 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -9,7 +9,15 @@
 import 'package:kernel/clone.dart' show CloneVisitor;
 
 import 'package:kernel/ast.dart'
-    show Library, Component, Procedure, Class, TypeParameter, Supertype;
+    show
+        DartType,
+        Library,
+        Component,
+        Procedure,
+        Class,
+        TypeParameter,
+        TypeParameterType,
+        Supertype;
 
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
 
@@ -70,9 +78,18 @@
   if (procedure.parent is Class) {
     Class realClass = procedure.parent;
 
-    CloneVisitor cloner = new CloneVisitor();
-
     Class fakeClass = new Class(name: kDebugClassName);
+    Map<TypeParameter, TypeParameter> typeParams =
+        <TypeParameter, TypeParameter>{};
+    Map<TypeParameter, DartType> typeSubstitution = <TypeParameter, DartType>{};
+    for (TypeParameter typeParam in realClass.typeParameters) {
+      var newNode = new TypeParameter(typeParam.name);
+      typeParams[typeParam] = newNode;
+      typeSubstitution[typeParam] = new TypeParameterType(newNode);
+    }
+    CloneVisitor cloner = new CloneVisitor(
+        typeSubstitution: typeSubstitution, typeParams: typeParams);
+
     for (TypeParameter typeParam in realClass.typeParameters) {
       fakeClass.typeParameters.add(typeParam.accept(cloner));
     }
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 4c4cb84..52f7017 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -32,6 +32,10 @@
 
 const int namedMixinApplicationMask = staticMask << 1;
 
+/// Not a modifier, used for mixins declared explicitly by using the `mixin`
+/// keyword.
+const int mixinDeclarationMask = namedMixinApplicationMask << 1;
+
 /// Not a real modifier, and by setting it to zero, it is automatically ignored
 /// by [Modifier.validate] below.
 const int varMask = 0;
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index bb2982e..760424c 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -488,7 +488,7 @@
       reportRecoverableError(next, fasta.messageTopLevelOperator);
       // Insert a synthetic identifier
       // and continue parsing as a top level function.
-      rewriter.insertTokenAfter(
+      rewriter.insertToken(
           next,
           new SyntheticStringToken(
               TokenType.IDENTIFIER,
@@ -1099,7 +1099,7 @@
           withKeyword, fasta.templateExpectedButGot.withArguments('with'));
       withKeyword =
           new SyntheticKeywordToken(Keyword.WITH, withKeyword.charOffset);
-      rewriter.insertTokenAfter(token, withKeyword);
+      rewriter.insertToken(token, withKeyword);
       if (!isValidTypeReference(withKeyword.next)) {
         rewriter.insertSyntheticIdentifier(withKeyword);
       }
@@ -1203,7 +1203,7 @@
               next.next.kind == IDENTIFIER_TOKEN) {
             // Looks like a missing comma
             Token comma = new SyntheticToken(TokenType.COMMA, next.charOffset);
-            token = rewriter.insertTokenAfter(token, comma).next;
+            token = rewriter.insertToken(token, comma);
             continue;
           } else {
             token = ensureCloseParen(token, begin);
@@ -1324,10 +1324,9 @@
       if (!optional('.', next)) {
         // Recover from a missing period by inserting one.
         next = rewriteAndRecover(
-                token,
-                fasta.templateExpectedButGot.withArguments('.'),
-                new SyntheticToken(TokenType.PERIOD, next.charOffset))
-            .next;
+            token,
+            fasta.templateExpectedButGot.withArguments('.'),
+            new SyntheticToken(TokenType.PERIOD, next.charOffset));
       }
       periodAfterThis = token = next;
       next = token.next;
@@ -1476,7 +1475,7 @@
       token = next;
     }
     if (parameterCount == 0) {
-      token = rewriteAndRecover(
+      rewriteAndRecover(
           token,
           fasta.messageEmptyOptionalParameterList,
           new SyntheticStringToken(
@@ -1527,7 +1526,7 @@
       token = next;
     }
     if (parameterCount == 0) {
-      token = rewriteAndRecover(
+      rewriteAndRecover(
           token,
           fasta.messageEmptyNamedParameterList,
           new SyntheticStringToken(
@@ -1971,10 +1970,8 @@
         if (!errorReported) {
           reportRecoverableErrorWithToken(next, fasta.templateExpectedString);
         }
-        next = rewriter
-            .insertTokenAfter(token,
-                new SyntheticStringToken(TokenType.STRING, '', next.charOffset))
-            .next;
+        next = rewriter.insertToken(token,
+            new SyntheticStringToken(TokenType.STRING, '', next.charOffset));
       }
     }
     listener.handleStringPart(next);
@@ -2114,7 +2111,7 @@
               token = next;
               next = token.next;
               if (optional('(', next.next)) {
-                rewriter.insertTokenAfter(
+                rewriter.insertToken(
                     next,
                     new SyntheticStringToken(
                         TokenType.IDENTIFIER,
@@ -2423,33 +2420,48 @@
         // `this.<fieldname>=` is expected.
         reportRecoverableError(
             next, fasta.templateExpectedButGot.withArguments('.'));
-        rewriter.insertTokenAfter(
+        rewriter.insertToken(
             token, new SyntheticToken(TokenType.PERIOD, next.offset));
         token = rewriter.insertSyntheticIdentifier(token.next);
         next = token.next;
       }
       // Fall through to recovery
     } else if (next.isIdentifier) {
-      if (optional('=', next.next)) {
+      Token next2 = next.next;
+      if (optional('=', next2)) {
         return parseInitializerExpressionRest(token);
       }
-      // Fall through to recovery
+      // Recovery: If this looks like an expression,
+      // then fall through to insert the LHS and `=` of the assignment,
+      // otherwise insert an `=` and synthetic identifier.
+      if (!next2.isOperator && !optional('.', next2)) {
+        token = rewriter.insertToken(
+            next, new SyntheticToken(TokenType.EQ, next2.offset));
+        token = insertSyntheticIdentifier(token, IdentifierContext.expression,
+            message: fasta.messageMissingAssignmentInInitializer,
+            messageOnToken: next);
+        return parseInitializerExpressionRest(beforeExpression);
+      }
     } else {
-      // Recovery
-      insertSyntheticIdentifier(token, IdentifierContext.fieldInitializer,
+      // Recovery: Insert a synthetic assignment.
+      token = insertSyntheticIdentifier(
+          token, IdentifierContext.fieldInitializer,
           message: fasta.messageExpectedAnInitializer, messageOnToken: token);
+      token = rewriter.insertToken(
+          token, new SyntheticToken(TokenType.EQ, token.offset));
+      token = rewriter.insertSyntheticIdentifier(token);
       return parseInitializerExpressionRest(beforeExpression);
     }
-    // Recovery
-    // Insert a sythetic assignment to ensure that the expression is indeed
-    // an assignment. Failing to do so causes this test to fail:
+    // Recovery:
+    // Insert a synthetic identifier and assignment operator
+    // to ensure that the expression is indeed an assignment.
+    // Failing to do so causes this test to fail:
     // pkg/front_end/testcases/regress/issue_31192.dart
     // TODO(danrubel): Investigate better recovery.
     token = insertSyntheticIdentifier(
         beforeExpression, IdentifierContext.fieldInitializer,
         message: fasta.messageMissingAssignmentInInitializer);
-    rewriter.insertTokenAfter(
-        token, new SyntheticToken(TokenType.EQ, token.offset));
+    rewriter.insertToken(token, new SyntheticToken(TokenType.EQ, token.offset));
     return parseInitializerExpressionRest(beforeExpression);
   }
 
@@ -2516,11 +2528,12 @@
 
   Token insertBlock(Token token) {
     Token next = token.next;
-    Token replacement = link(
-        new SyntheticBeginToken(TokenType.OPEN_CURLY_BRACKET, next.offset),
+    BeginToken beginGroup = rewriter.insertToken(token,
+        new SyntheticBeginToken(TokenType.OPEN_CURLY_BRACKET, next.offset));
+    Token endGroup = rewriter.insertToken(beginGroup,
         new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, next.offset));
-    rewriter.insertTokenAfter(token, replacement);
-    return replacement;
+    beginGroup.endGroup = endGroup;
+    return beginGroup;
   }
 
   /// If the next token is a closing parenthesis, return it.
@@ -2554,7 +2567,7 @@
     if (optional(':', next)) return next;
     Message message = fasta.templateExpectedButGot.withArguments(':');
     Token newToken = new SyntheticToken(TokenType.COLON, next.charOffset);
-    return rewriteAndRecover(token, message, newToken).next;
+    return rewriteAndRecover(token, message, newToken);
   }
 
   /// If the token after [token] is a not literal string,
@@ -2592,11 +2605,10 @@
   }
 
   /// Report an error at the token after [token] that has the given [message].
-  /// Insert the [newToken] after [token] and return [token].
+  /// Insert the [newToken] after [token] and return [newToken].
   Token rewriteAndRecover(Token token, Message message, Token newToken) {
     reportRecoverableError(token.next, message);
-    rewriter.insertTokenAfter(token, newToken);
-    return token;
+    return rewriter.insertToken(token, newToken);
   }
 
   /// Replace the token after [token] with `[` followed by `]`
@@ -3289,10 +3301,8 @@
       // If `return` used instead of `=>`, then report an error and continue
       if (optional('return', next)) {
         reportRecoverableError(next, fasta.messageExpectedBody);
-        next = rewriter
-            .insertTokenAfter(next,
-                new SyntheticToken(TokenType.FUNCTION, next.next.charOffset))
-            .next;
+        next = rewriter.insertToken(
+            next, new SyntheticToken(TokenType.FUNCTION, next.next.charOffset));
         return parseExpressionFunctionBody(next, ofFunctionExpression);
       }
       // If there is a stray simple identifier in the function expression
@@ -4126,10 +4136,9 @@
         // This looks like the start of an expression.
         // Report an error, insert the comma, and continue parsing.
         next = rewriteAndRecover(
-                token,
-                fasta.templateExpectedButGot.withArguments(','),
-                new SyntheticToken(TokenType.COMMA, next.offset))
-            .next;
+            token,
+            fasta.templateExpectedButGot.withArguments(','),
+            new SyntheticToken(TokenType.COMMA, next.offset));
       }
       token = next;
     }
@@ -4174,10 +4183,9 @@
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           next = rewriteAndRecover(
-                  token,
-                  fasta.templateExpectedButGot.withArguments(','),
-                  new SyntheticToken(TokenType.COMMA, next.offset))
-              .next;
+              token,
+              fasta.templateExpectedButGot.withArguments(','),
+              new SyntheticToken(TokenType.COMMA, next.offset));
         } else {
           reportRecoverableError(
               next, fasta.templateExpectedButGot.withArguments('}'));
@@ -4242,7 +4250,7 @@
       // TODO(danrubel): Improve this error message.
       reportRecoverableError(
           next, fasta.templateExpectedButGot.withArguments('['));
-      rewriter.insertTokenAfter(
+      rewriter.insertToken(
           token, new SyntheticToken(TokenType.INDEX, next.charOffset));
     }
     return parseLiteralListSuffix(token, constKeyword);
@@ -4607,10 +4615,9 @@
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           next = rewriteAndRecover(
-                  token,
-                  fasta.templateExpectedButGot.withArguments(','),
-                  new SyntheticToken(TokenType.COMMA, next.offset))
-              .next;
+              token,
+              fasta.templateExpectedButGot.withArguments(','),
+              new SyntheticToken(TokenType.COMMA, next.offset));
         } else {
           token = ensureCloseParen(token, begin);
           break;
@@ -5150,10 +5157,8 @@
     if (!optional('while', whileToken)) {
       reportRecoverableError(
           whileToken, fasta.templateExpectedButGot.withArguments('while'));
-      whileToken = rewriter
-          .insertTokenAfter(token,
-              new SyntheticKeywordToken(Keyword.WHILE, whileToken.charOffset))
-          .next;
+      whileToken = rewriter.insertToken(token,
+          new SyntheticKeywordToken(Keyword.WHILE, whileToken.charOffset));
     }
     token = parseParenthesizedCondition(whileToken);
     token = ensureSemicolon(token);
@@ -5238,7 +5243,7 @@
       // checking the next token as we are doing here.
       reportRecoverableError(
           throwToken.next, fasta.messageMissingExpressionInThrow);
-      rewriter.insertTokenAfter(
+      rewriter.insertToken(
           throwToken,
           new SyntheticStringToken(
               TokenType.STRING, '""', throwToken.next.charOffset, 0));
@@ -5708,7 +5713,7 @@
       next = next.next;
     } else {
       reportRecoverableError(next, fasta.messageMissingOperatorKeyword);
-      rewriter.insertTokenAfter(
+      rewriter.insertToken(
           beforeName, new SyntheticToken(Keyword.OPERATOR, next.offset));
     }
 
@@ -5803,7 +5808,7 @@
     reportRecoverableError(next, fasta.messageStackOverflow);
 
     next = new SyntheticToken(TokenType.SEMICOLON, token.offset);
-    rewriter.insertTokenAfter(token, next);
+    rewriter.insertToken(token, next);
     listener.handleEmptyStatement(next);
 
     while (notEofOrValue('}', next)) {
@@ -5814,22 +5819,22 @@
   }
 
   void reportRecoverableError(Token token, Message message) {
+    // Find a non-synthetic token on which to report the error.
+    token = findNonZeroLengthToken(token);
     if (token is ErrorToken) {
       reportErrorToken(token);
     } else {
-      // Find a non-synthetic token on which to report the error.
-      token = findNonZeroLengthToken(token);
       listener.handleRecoverableError(message, token, token);
     }
   }
 
   void reportRecoverableErrorWithToken(
       Token token, Template<_MessageWithArgument<Token>> template) {
+    // Find a non-synthetic token on which to report the error.
+    token = findNonZeroLengthToken(token);
     if (token is ErrorToken) {
       reportErrorToken(token);
     } else {
-      // Find a non-synthetic token on which to report the error.
-      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 cc01a67..86170d4 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
@@ -80,18 +80,6 @@
     return newToken;
   }
 
-  /// Insert the chain of tokens starting at the [insertedToken] immediately
-  /// after the [previousToken]. Return the [previousToken].
-  Token insertTokenAfter(Token previousToken, Token insertedToken) {
-    Token afterToken = previousToken.next;
-    previousToken.setNext(insertedToken);
-
-    Token lastReplacement = _lastTokenInChain(insertedToken);
-    lastReplacement.setNext(afterToken);
-
-    return previousToken;
-  }
-
   /// Move [endGroup] (a synthetic `)`, `]`, or `}` token) and associated
   /// error token after [token] in the token stream and return [endGroup].
   Token moveSynthetic(Token token, Token endGroup) {
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index a03b174..a8d2025 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -12,7 +12,7 @@
         Message,
         messageInternalProblemExtendingUnmodifiableScope,
         templateAccessError,
-        templateDuplicatedName,
+        templateDuplicatedDeclarationUse,
         templateDuplicatedNamePreviouslyUsedCause;
 
 import 'problems.dart' show internalProblem, unsupported;
@@ -351,5 +351,15 @@
 
   Declaration get parent => null;
 
-  Message get message => templateDuplicatedName.withArguments(name);
+  Message get message => templateDuplicatedDeclarationUse.withArguments(name);
+
+  // TODO(ahe): Also provide context.
+
+  Declaration getFirstDeclaration() {
+    Declaration declaration = builder;
+    while (declaration.next != null) {
+      declaration = declaration.next;
+    }
+    return declaration;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 763fce3..facfdae 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -27,13 +27,12 @@
 
 import '../crash.dart' show Crash;
 
-import '../deprecated_problems.dart'
-    show deprecated_InputError, deprecated_inputError;
+import '../deprecated_problems.dart' show deprecated_InputError;
 
 import '../fasta_codes.dart'
     show
-        LocatedMessage,
         Code,
+        LocatedMessage,
         Message,
         messageExpectedBlockToSkip,
         templateInternalProblemNotFound;
@@ -56,7 +55,8 @@
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
-import 'stack_listener.dart' show NullValue, StackListener;
+import 'stack_listener.dart'
+    show FixedNullableList, NullValue, ParserRecovery, StackListener;
 
 import '../quote.dart' show unescapeString;
 
@@ -78,6 +78,8 @@
 
   ClassBuilder currentClass;
 
+  bool currentClassIsParserRecovery = false;
+
   /// For top-level declarations, this is the library scope. For class members,
   /// this is the instance scope of [currentClass].
   Scope memberScope;
@@ -95,18 +97,15 @@
         stringExpectedAfterNative =
             library.loader.target.backendTarget.nativeExtensionExpectsString;
 
-  void discard(int n) {
-    for (int i = 0; i < n; i++) {
-      pop();
-    }
-  }
-
   @override
   void endMetadataStar(int count) {
     debugEvent("MetadataStar");
-    push(popList(count, new List<Token>.filled(count, null, growable: true))
-            ?.first ??
-        NullValue.Metadata);
+    if (count > 0) {
+      discard(count - 1);
+      push(pop(NullValue.Metadata));
+    } else {
+      push(NullValue.Metadata);
+    }
   }
 
   @override
@@ -232,8 +231,10 @@
     debugEvent("FunctionTypeAlias");
 
     if (equals == null) pop(); // endToken
-    String name = pop();
+    Object name = pop();
     Token metadata = pop();
+    checkEmpty(typedefKeyword.charOffset);
+    if (name is ParserRecovery) return;
 
     Declaration typedefBuilder = lookupBuilder(typedefKeyword, null, name);
     parseMetadata(typedefBuilder, metadata, typedefBuilder.target);
@@ -289,9 +290,11 @@
   void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
     debugEvent("TopLevelMethod");
     Token bodyToken = pop();
-    String name = pop();
+    Object name = pop();
     Token metadata = pop();
     checkEmpty(beginToken.charOffset);
+    if (name is ParserRecovery) return;
+
     final StackListener listener =
         createFunctionListener(lookupBuilder(beginToken, getOrSet, name));
     buildFunctionBody(listener, bodyToken, metadata, MemberKind.TopLevelMethod);
@@ -327,10 +330,16 @@
   @override
   void handleQualified(Token period) {
     debugEvent("handleQualified");
-    String suffix = pop();
-    var prefix = pop();
-    assert(identical(suffix, period.next.lexeme));
-    push(new QualifiedName(prefix, period.next));
+    Object suffix = pop();
+    Object prefix = pop();
+    if (prefix is ParserRecovery) {
+      push(prefix);
+    } else if (suffix is ParserRecovery) {
+      push(suffix);
+    } else {
+      assert(identical(suffix, period.next.lexeme));
+      push(new QualifiedName(prefix, period.next));
+    }
   }
 
   @override
@@ -430,9 +439,11 @@
   @override
   void endImport(Token importKeyword, Token semicolon) {
     debugEvent("Import");
-    pop(NullValue.Prefix);
+    Object name = pop(NullValue.Prefix);
 
     Token metadata = pop();
+    checkEmpty(importKeyword.charOffset);
+    if (name is ParserRecovery) return;
 
     // Native imports must be skipped because they aren't assigned corresponding
     // LibraryDependency nodes.
@@ -504,6 +515,7 @@
     Object name = pop();
     Token metadata = pop();
     checkEmpty(beginToken.charOffset);
+    if (name is ParserRecovery || currentClassIsParserRecovery) return;
 
     ProcedureBuilder builder = lookupConstructor(beginToken, name);
     if (bodyToken == null || optional("=", bodyToken.endGroup.next)) {
@@ -552,6 +564,7 @@
     Object name = pop();
     Token metadata = pop();
     checkEmpty(beginToken.charOffset);
+    if (name is ParserRecovery || currentClassIsParserRecovery) return;
     ProcedureBuilder builder;
     if (name is QualifiedName ||
         (getOrSet == null && name == currentClass.name)) {
@@ -610,16 +623,14 @@
     final StackListener listener = createFunctionListener(builder);
     try {
       Parser parser = new Parser(listener);
-
       if (metadata != null) {
         parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
-        listener.pop();
+        listener.pop(); // Pops metadata constants.
       }
 
       token = parser.parseFormalParametersOpt(
           parser.syntheticPreviousToken(token), MemberKind.Factory);
-
-      listener.pop();
+      listener.pop(); // Pops formal parameters.
       listener.checkEmpty(token.next.charOffset);
     } on DebugAbort {
       rethrow;
@@ -631,10 +642,12 @@
   }
 
   void buildFields(int count, Token token, bool isTopLevel) {
-    List<String> names =
-        popList(count, new List<String>.filled(count, null, growable: true));
-    Declaration declaration = lookupBuilder(token, null, names.first);
+    List<String> names = const FixedNullableList<String>().pop(stack, count);
     Token metadata = pop();
+    checkEmpty(token.charOffset);
+    if (names == null || currentClassIsParserRecovery) return;
+
+    Declaration declaration = lookupBuilder(token, null, names.first);
     // TODO(paulberry): don't re-parse the field if we've already parsed it
     // for type inference.
     parseFields(
@@ -642,6 +655,7 @@
         token,
         metadata,
         isTopLevel);
+    checkEmpty(token.charOffset);
   }
 
   @override
@@ -664,14 +678,31 @@
   }
 
   @override
+  void beginMixinDeclaration(Token mixinKeyword, Token name) {
+    debugEvent("beginMixinDeclaration");
+    push(mixinKeyword);
+  }
+
+  @override
+  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+    debugEvent("beginClassDeclaration");
+    push(begin);
+  }
+
+  @override
   void beginClassOrMixinBody(Token token) {
-    debugEvent("beginClassBody");
-    String name = pop();
+    debugEvent("beginClassOrMixinBody");
+    Token beginToken = pop();
+    Object name = pop();
     Token metadata = pop();
     assert(currentClass == null);
     assert(memberScope == library.scope);
+    if (name is ParserRecovery) {
+      currentClassIsParserRecovery = true;
+      return;
+    }
 
-    Declaration classBuilder = lookupBuilder(token, null, name);
+    Declaration classBuilder = lookupBuilder(beginToken, null, name);
     parseMetadata(classBuilder, metadata, classBuilder.target);
 
     currentClass = classBuilder;
@@ -682,6 +713,7 @@
   void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
     debugEvent("ClassOrMixinBody");
     currentClass = null;
+    currentClassIsParserRecovery = false;
     memberScope = library.scope;
   }
 
@@ -700,21 +732,23 @@
   @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     debugEvent("Enum");
-
-    List metadataAndValues = new List.filled(count * 2, null, growable: true);
-    popList(count * 2, metadataAndValues);
-
-    String name = pop();
+    List<Object> metadataAndValues =
+        const FixedNullableList<Object>().pop(stack, count * 2);
+    Object name = pop();
     Token metadata = pop();
+    checkEmpty(enumKeyword.charOffset);
+    if (name is ParserRecovery) return;
 
     ClassBuilder enumBuilder = lookupBuilder(enumKeyword, null, name);
     parseMetadata(enumBuilder, metadata, enumBuilder.target);
-    for (int i = 0; i < metadataAndValues.length; i += 2) {
-      Token metadata = metadataAndValues[i];
-      String valueName = metadataAndValues[i + 1];
-      Declaration declaration = enumBuilder.scope.local[valueName];
-      if (metadata != null) {
-        parseMetadata(declaration, metadata, declaration.target);
+    if (metadataAndValues != null) {
+      for (int i = 0; i < metadataAndValues.length; i += 2) {
+        Token metadata = metadataAndValues[i];
+        String valueName = metadataAndValues[i + 1];
+        Declaration declaration = enumBuilder.scope.local[valueName];
+        if (metadata != null) {
+          parseMetadata(declaration, metadata, declaration.target);
+        }
       }
     }
 
@@ -726,13 +760,20 @@
       Token equals, Token implementsKeyword, Token endToken) {
     debugEvent("NamedMixinApplication");
 
-    String name = pop();
+    Object name = pop();
     Token metadata = pop();
-
-    Declaration classBuilder = lookupBuilder(classKeyword, null, name);
-    parseMetadata(classBuilder, metadata, classBuilder.target);
-
     checkEmpty(beginToken.charOffset);
+    if (name is ParserRecovery) return;
+
+    Declaration classBuilder = library.scopeBuilder[name];
+    if (classBuilder != null) {
+      // TODO(ahe): We shouldn't have to check for null here. The problem is
+      // that we don't create a named mixin application if the mixins or
+      // supertype are missing. Could we create a class instead? The nested
+      // declarations wouldn't match up.
+      parseMetadata(classBuilder, metadata, classBuilder.target);
+      checkEmpty(beginToken.charOffset);
+    }
   }
 
   AsyncMarker getAsyncMarker(StackListener listener) => listener.pop();
@@ -827,6 +868,7 @@
     } else {
       declaration = library.scopeBuilder[name];
     }
+    declaration = handleDuplicatedName(declaration, token);
     checkBuilder(token, declaration, name);
     return declaration;
   }
@@ -841,18 +883,37 @@
       suffix = nameOrQualified == currentClass.name ? "" : nameOrQualified;
     }
     declaration = currentClass.constructors.local[suffix];
+    declaration = handleDuplicatedName(declaration, token);
     checkBuilder(token, declaration, nameOrQualified);
     return declaration;
   }
 
+  Declaration handleDuplicatedName(Declaration declaration, Token token) {
+    int offset = token.charOffset;
+    if (declaration?.next == null) {
+      return declaration;
+    } else {
+      Declaration nearestDeclaration;
+      int minDistance = -1;
+      do {
+        int distance = declaration.charOffset - offset;
+        if (distance >= 0) {
+          if (minDistance == -1 || distance < minDistance) {
+            minDistance = distance;
+            nearestDeclaration = declaration;
+          }
+        }
+        declaration = declaration.next;
+      } while (declaration != null);
+      return nearestDeclaration;
+    }
+  }
+
   void checkBuilder(Token token, Declaration declaration, Object name) {
     if (declaration == null) {
       internalProblem(templateInternalProblemNotFound.withArguments("$name"),
           token.charOffset, uri);
     }
-    if (declaration.next != null) {
-      deprecated_inputError(uri, token.charOffset, "Duplicated name: $name");
-    }
     if (uri != declaration.fileUri) {
       unexpected("$uri", "${declaration.fileUri}", declaration.charOffset,
           declaration.fileUri);
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 96e5a23..73bb7c4 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -42,7 +42,6 @@
 // TODO(ahe): The outline isn't supposed to import kernel-specific builders.
 import '../kernel/kernel_builder.dart'
     show
-        KernelFormalParameterBuilder,
         KernelMixinApplicationBuilder,
         KernelNamedTypeBuilder,
         KernelTypeBuilder;
@@ -60,6 +59,7 @@
         constMask,
         covariantMask,
         externalMask,
+        mixinDeclarationMask,
         staticMask;
 
 import '../operator.dart'
@@ -85,9 +85,10 @@
 
 import '../scanner.dart' show Token;
 
-import 'source_library_builder.dart' show SourceLibraryBuilder;
+import 'source_library_builder.dart' show FieldInfo, SourceLibraryBuilder;
 
-import 'stack_listener.dart' show NullValue, StackListener;
+import 'stack_listener.dart'
+    show FixedNullableList, NullValue, ParserRecovery, StackListener;
 
 enum MethodBody {
   Abstract,
@@ -120,12 +121,18 @@
 
   List<String> popIdentifierList(int count) {
     if (count == 0) return null;
-    List<String> list = new List<String>.filled(count, null, growable: true);
+    List<String> list = new List<String>(count);
+    bool isParserRecovery = false;
     for (int i = count - 1; i >= 0; i--) {
       popCharOffset();
-      list[i] = pop();
+      Object identifier = pop();
+      if (identifier is ParserRecovery) {
+        isParserRecovery = true;
+      } else {
+        list[i] = identifier;
+      }
     }
-    return list;
+    return isParserRecovery ? null : list;
   }
 
   @override
@@ -143,22 +150,24 @@
     } else {
       int charOffset = pop();
       Object typeName = pop();
-      push(new MetadataBuilder.fromConstructor(
-          library.addConstructorReference(
-              typeName, typeArguments, postfix, charOffset),
-          arguments,
-          library,
-          beginToken.charOffset));
+      if (typeName is ParserRecovery) {
+        push(typeName);
+      } else {
+        push(new MetadataBuilder.fromConstructor(
+            library.addConstructorReference(
+                typeName, typeArguments, postfix, charOffset),
+            arguments,
+            library,
+            beginToken.charOffset));
+      }
     }
   }
 
   @override
   void endMetadataStar(int count) {
     debugEvent("MetadataStar");
-    push(popList(
-            count,
-            new List<ExpressionMetadataBuilder<TypeBuilder>>.filled(count, null,
-                growable: true)) ??
+    push(const FixedNullableList<ExpressionMetadataBuilder<TypeBuilder>>()
+            .pop(stack, count) ??
         NullValue.Metadata);
   }
 
@@ -171,22 +180,29 @@
   @override
   void endHide(Token hideKeyword) {
     debugEvent("Hide");
-    List<String> names = pop();
-    push(new Combinator.hide(names, hideKeyword.charOffset, library.fileUri));
+    Object names = pop();
+    if (names is ParserRecovery) {
+      push(names);
+    } else {
+      push(new Combinator.hide(names, hideKeyword.charOffset, library.fileUri));
+    }
   }
 
   @override
   void endShow(Token showKeyword) {
     debugEvent("Show");
-    List<String> names = pop();
-    push(new Combinator.show(names, showKeyword.charOffset, library.fileUri));
+    Object names = pop();
+    if (names is ParserRecovery) {
+      push(names);
+    } else {
+      push(new Combinator.show(names, showKeyword.charOffset, library.fileUri));
+    }
   }
 
   @override
   void endCombinators(int count) {
     debugEvent("Combinators");
-    push(popList(
-            count, new List<Combinator>.filled(count, null, growable: true)) ??
+    push(const FixedNullableList<Combinator>().pop(stack, count) ??
         NullValue.Combinators);
   }
 
@@ -221,11 +237,13 @@
     List<Combinator> combinators = pop();
     bool isDeferred = pop();
     int prefixOffset = pop();
-    String prefix = pop(NullValue.Prefix);
+    Object prefix = pop(NullValue.Prefix);
     List<Configuration> configurations = pop();
     int uriOffset = popCharOffset();
     String uri = pop(); // For a conditional import, this is the default URI.
     List<MetadataBuilder> metadata = pop();
+    checkEmpty(importKeyword.charOffset);
+    if (prefix is ParserRecovery) return;
     library.addImport(
         metadata,
         uri,
@@ -237,14 +255,12 @@
         prefixOffset,
         uriOffset,
         importIndex++);
-    checkEmpty(importKeyword.charOffset);
   }
 
   @override
   void endConditionalUris(int count) {
     debugEvent("EndConditionalUris");
-    push(popList(count,
-            new List<Configuration>.filled(count, null, growable: true)) ??
+    push(const FixedNullableList<Configuration>().pop(stack, count) ??
         NullValue.ConditionalUris);
   }
 
@@ -255,14 +271,23 @@
     String uri = pop();
     if (equalSign != null) popCharOffset();
     String condition = popIfNotNull(equalSign) ?? "true";
-    String dottedName = pop();
-    push(new Configuration(charOffset, dottedName, condition, uri));
+    Object dottedName = pop();
+    if (dottedName is ParserRecovery) {
+      push(dottedName);
+    } else {
+      push(new Configuration(charOffset, dottedName, condition, uri));
+    }
   }
 
   @override
   void handleDottedName(int count, Token firstIdentifier) {
     debugEvent("DottedName");
-    push(popIdentifierList(count).join('.'));
+    List<String> names = popIdentifierList(count);
+    if (names == null) {
+      push(new ParserRecovery(firstIdentifier.charOffset));
+    } else {
+      push(names.join('.'));
+    }
   }
 
   @override
@@ -302,10 +327,14 @@
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
     if (context == IdentifierContext.enumValueDeclaration) {
-      super.handleIdentifier(token, context);
-      push(token.charOffset);
-      String documentationComment = getDocumentationComment(token);
-      push(documentationComment ?? NullValue.DocumentationComment);
+      debugEvent("handleIdentifier");
+      List<MetadataBuilder> metadata = pop();
+      if (token.isSynthetic) {
+        push(new ParserRecovery(token.charOffset));
+      } else {
+        push(new EnumConstantInfo(metadata, token.lexeme, token.charOffset,
+            getDocumentationComment(token)));
+      }
     } else {
       super.handleIdentifier(token, context);
       push(token.charOffset);
@@ -351,7 +380,12 @@
     if (hasName) {
       // Pop the native clause which in this case is a StringLiteral.
       pop(); // Char offset.
-      nativeMethodName = pop(); // String.
+      Object name = pop();
+      if (name is ParserRecovery) {
+        nativeMethodName = '';
+      } else {
+        nativeMethodName = name; // String.
+      }
     } else {
       nativeMethodName = '';
     }
@@ -360,8 +394,7 @@
   @override
   void handleStringJuxtaposition(int literalCount) {
     debugEvent("StringJuxtaposition");
-    List<String> list =
-        new List<String>.filled(literalCount, null, growable: false);
+    List<String> list = new List<String>(literalCount);
     int charOffset = -1;
     for (int i = literalCount - 1; i >= 0; i--) {
       charOffset = pop();
@@ -374,19 +407,26 @@
   @override
   void handleIdentifierList(int count) {
     debugEvent("endIdentifierList");
-    push(popIdentifierList(count) ?? NullValue.IdentifierList);
+    push(popIdentifierList(count) ??
+        (count == 0 ? NullValue.IdentifierList : new ParserRecovery(-1)));
   }
 
   @override
   void handleQualified(Token period) {
     debugEvent("handleQualified");
     int suffixOffset = pop();
-    String suffix = pop();
-    assert(identical(suffix, period.next.lexeme));
-    assert(suffixOffset == period.next.charOffset);
+    Object suffix = pop();
     int offset = pop();
-    var prefix = pop();
-    push(new QualifiedName(prefix, period.next));
+    Object prefix = pop();
+    if (prefix is ParserRecovery) {
+      push(prefix);
+    } else if (suffix is ParserRecovery) {
+      push(suffix);
+    } else {
+      assert(identical(suffix, period.next.lexeme));
+      assert(suffixOffset == period.next.charOffset);
+      push(new QualifiedName(prefix, period.next));
+    }
     push(offset);
   }
 
@@ -398,7 +438,9 @@
     Object name = pop();
     List<MetadataBuilder> metadata = pop();
     library.documentationComment = documentationComment;
-    library.name = flattenName(name, offsetForToken(libraryKeyword), uri);
+    if (name is! ParserRecovery) {
+      library.name = flattenName(name, offsetForToken(libraryKeyword), uri);
+    }
     library.metadata = metadata;
   }
 
@@ -447,11 +489,9 @@
   @override
   void handleClassOrMixinImplements(
       Token implementsKeyword, int interfacesCount) {
-    debugEvent("handleClassImplements");
-    push(popList(
-            interfacesCount,
-            new List<KernelNamedTypeBuilder>.filled(interfacesCount, null,
-                growable: true)) ??
+    debugEvent("ClassOrMixinImplements");
+    push(const FixedNullableList<KernelNamedTypeBuilder>()
+            .pop(stack, interfacesCount) ??
         NullValue.TypeBuilderList);
   }
 
@@ -479,11 +519,9 @@
   @override
   void handleMixinOn(Token onKeyword, int typeCount) {
     debugEvent("handleMixinOn");
-    var supertypeConstraints = new List<KernelNamedTypeBuilder>.filled(
-        typeCount, null,
-        growable: true);
-    popList(typeCount, supertypeConstraints);
-    push(supertypeConstraints);
+    push(const FixedNullableList<KernelNamedTypeBuilder>()
+            .pop(stack, typeCount) ??
+        new ParserRecovery(offsetForToken(onKeyword)));
   }
 
   @override
@@ -492,15 +530,20 @@
     String documentationComment = getDocumentationComment(beginToken);
     List<TypeBuilder> interfaces = pop(NullValue.TypeBuilderList);
     int supertypeOffset = pop();
-    TypeBuilder supertype = pop();
+    TypeBuilder supertype = nullIfParserRecovery(pop());
     int modifiers = pop();
     List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
-    String name = pop();
+    Object name = pop();
     if (typeVariables != null && supertype is MixinApplicationBuilder) {
       supertype.typeVariables = typeVariables;
     }
     List<MetadataBuilder> metadata = pop();
+    checkEmpty(beginToken.charOffset);
+    if (name is ParserRecovery) {
+      library.endNestedDeclaration("<syntax-error>");
+      return;
+    }
 
     final int startCharOffset =
         metadata == null ? beginToken.charOffset : metadata.first.charOffset;
@@ -517,7 +560,10 @@
         charOffset,
         endToken.charOffset,
         supertypeOffset);
-    checkEmpty(beginToken.charOffset);
+  }
+
+  Object nullIfParserRecovery(Object node) {
+    return node is ParserRecovery ? null : node;
   }
 
   @override
@@ -525,14 +571,18 @@
     debugEvent("endMixinDeclaration");
     String documentationComment = getDocumentationComment(mixinToken);
     List<TypeBuilder> interfaces = pop(NullValue.TypeBuilderList);
-    List<KernelTypeBuilder> supertypeConstraints = pop();
+    List<KernelTypeBuilder> supertypeConstraints = nullIfParserRecovery(pop());
     List<TypeVariableBuilder> typeVariables = pop(NullValue.TypeVariables);
     int nameOffset = pop();
-    String name = pop();
+    Object name = pop();
     List<MetadataBuilder> metadata = pop(NullValue.Metadata);
+    checkEmpty(mixinToken.charOffset);
+    if (name is ParserRecovery) {
+      library.endNestedDeclaration("<syntax-error>");
+      return;
+    }
     int startOffset =
         metadata == null ? mixinToken.charOffset : metadata.first.charOffset;
-
     TypeBuilder supertype;
     if (supertypeConstraints != null && supertypeConstraints.isNotEmpty) {
       if (supertypeConstraints.length == 1) {
@@ -545,7 +595,7 @@
     library.addClass(
         documentationComment,
         metadata,
-        abstractMask,
+        mixinDeclarationMask,
         name,
         typeVariables,
         supertype,
@@ -554,7 +604,6 @@
         nameOffset,
         endToken.charOffset,
         -1);
-    checkEmpty(mixinToken.charOffset);
   }
 
   ProcedureKind computeProcedureKind(Token token) {
@@ -579,7 +628,7 @@
     int formalsOffset = pop();
     List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
-    String name = pop();
+    Object name = pop();
     TypeBuilder returnType = pop();
     bool isAbstract = kind == MethodBody.Abstract;
     if (getOrSet != null && optional("set", getOrSet)) {
@@ -594,13 +643,14 @@
       modifiers |= abstractMask;
     }
     List<MetadataBuilder> metadata = pop();
-    String documentationComment = getDocumentationComment(beginToken);
     checkEmpty(beginToken.charOffset);
     library
         .endNestedDeclaration("#method")
         .resolveTypes(typeVariables, library);
+    if (name is ParserRecovery) return;
     final int startCharOffset =
         metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+    String documentationComment = getDocumentationComment(beginToken);
     library.addProcedure(
         documentationComment,
         metadata,
@@ -664,8 +714,9 @@
       Token varFinalOrConst, Token getOrSet, Token name) {
     inConstructor =
         name?.lexeme == library.currentDeclaration.name && getOrSet == null;
-    List<Modifier> modifiers = <Modifier>[];
+    List<Modifier> modifiers;
     if (externalToken != null) {
+      modifiers ??= <Modifier>[];
       modifiers.add(External);
     }
     if (staticToken != null) {
@@ -673,24 +724,29 @@
         handleRecoverableError(
             messageStaticConstructor, staticToken, staticToken);
       } else {
+        modifiers ??= <Modifier>[];
         modifiers.add(Static);
       }
     }
     if (covariantToken != null) {
+      modifiers ??= <Modifier>[];
       modifiers.add(Covariant);
     }
     if (varFinalOrConst != null) {
       String lexeme = varFinalOrConst.lexeme;
       if (identical('var', lexeme)) {
+        modifiers ??= <Modifier>[];
         modifiers.add(Var);
       } else if (identical('final', lexeme)) {
+        modifiers ??= <Modifier>[];
         modifiers.add(Final);
       } else {
+        modifiers ??= <Modifier>[];
         modifiers.add(Const);
       }
     }
     push(varFinalOrConst?.charOffset ?? -1);
-    push(modifiers);
+    push(modifiers ?? NullValue.Modifiers);
     library.beginNestedDeclaration("#method", hasMembers: false);
   }
 
@@ -707,7 +763,7 @@
     int formalsOffset = pop();
     List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
-    dynamic nameOrOperator = pop();
+    Object nameOrOperator = pop();
     if (Operator.subtract == nameOrOperator && formals == null) {
       nameOrOperator = Operator.unaryMinus;
     }
@@ -776,6 +832,11 @@
     library
         .endNestedDeclaration("#method")
         .resolveTypes(typeVariables, library);
+    if (name is ParserRecovery) {
+      nativeMethodName = null;
+      inConstructor = false;
+      return;
+    }
     String constructorName =
         kind == ProcedureKind.Getter || kind == ProcedureKind.Setter
             ? null
@@ -837,10 +898,16 @@
   @override
   void handleNamedMixinApplicationWithClause(Token withKeyword) {
     debugEvent("NamedMixinApplicationWithClause");
-    List<TypeBuilder> mixins = pop();
-    TypeBuilder supertype = pop();
-    push(
-        library.addMixinApplication(supertype, mixins, withKeyword.charOffset));
+    Object mixins = pop();
+    Object supertype = pop();
+    if (mixins is ParserRecovery) {
+      push(mixins);
+    } else if (supertype is ParserRecovery) {
+      push(supertype);
+    } else {
+      push(library.addMixinApplication(
+          supertype, mixins, withKeyword.charOffset));
+    }
   }
 
   @override
@@ -849,22 +916,25 @@
     debugEvent("endNamedMixinApplication");
     String documentationComment = getDocumentationComment(beginToken);
     List<TypeBuilder> interfaces = popIfNotNull(implementsKeyword);
-    TypeBuilder mixinApplication = pop();
+    Object mixinApplication = pop();
     int modifiers = pop();
     List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
-    String name = pop();
+    Object name = pop();
     List<MetadataBuilder> metadata = pop();
+    checkEmpty(beginToken.charOffset);
+    if (name is ParserRecovery || mixinApplication is ParserRecovery) {
+      library.endNestedDeclaration("<syntax-error>");
+      return;
+    }
     library.addNamedMixinApplication(documentationComment, metadata, name,
         typeVariables, modifiers, mixinApplication, interfaces, charOffset);
-    checkEmpty(beginToken.charOffset);
   }
 
   @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
-    push(popList(count,
-            new List<KernelTypeBuilder>.filled(count, null, growable: true)) ??
+    push(const FixedNullableList<KernelTypeBuilder>().pop(stack, count) ??
         NullValue.TypeArguments);
   }
 
@@ -879,17 +949,18 @@
     List<TypeBuilder> arguments = pop();
     int charOffset = pop();
     Object name = pop();
-    push(library.addNamedType(name, arguments, charOffset));
+    if (name is ParserRecovery) {
+      push(name);
+    } else {
+      push(library.addNamedType(name, arguments, charOffset));
+    }
   }
 
   @override
   void endTypeList(int count) {
     debugEvent("TypeList");
-    push(popList(
-            count,
-            new List<KernelNamedTypeBuilder>.filled(count, null,
-                growable: true)) ??
-        NullValue.TypeList);
+    push(const FixedNullableList<KernelNamedTypeBuilder>().pop(stack, count) ??
+        new ParserRecovery(-1));
   }
 
   @override
@@ -916,12 +987,16 @@
       Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
     debugEvent("FormalParameter");
     int charOffset = pop();
-    String name = pop();
-    TypeBuilder type = pop();
+    Object name = pop();
+    TypeBuilder type = nullIfParserRecovery(pop());
     int modifiers = pop();
     List<MetadataBuilder> metadata = pop();
-    push(library.addFormalParameter(
-        metadata, modifiers, type, name, thisKeyword != null, charOffset));
+    if (name is ParserRecovery) {
+      push(name);
+    } else {
+      push(library.addFormalParameter(
+          metadata, modifiers, type, name, thisKeyword != null, charOffset));
+    }
   }
 
   @override
@@ -958,13 +1033,16 @@
     // 0. It might be simpler if the parser didn't call this method in that
     // case, however, then [beginOptionalFormalParameters] wouldn't always be
     // matched by this method.
-    List<KernelFormalParameterBuilder> parameters =
-        new List<KernelFormalParameterBuilder>(count);
-    popList(count, parameters);
-    for (KernelFormalParameterBuilder parameter in parameters) {
-      parameter.kind = kind;
+    List<FormalParameterBuilder> parameters =
+        const FixedNullableList<FormalParameterBuilder>().pop(stack, count);
+    if (parameters == null) {
+      push(new ParserRecovery(offsetForToken(beginToken)));
+    } else {
+      for (FormalParameterBuilder parameter in parameters) {
+        parameter.kind = kind;
+      }
+      push(parameters);
     }
-    push(parameters);
   }
 
   @override
@@ -973,28 +1051,35 @@
     debugEvent("FormalParameters");
     List<FormalParameterBuilder> formals;
     if (count == 1) {
-      var last = pop();
-      if (last is List) {
-        formals = new List<FormalParameterBuilder>.from(last);
-      } else {
-        formals = <FormalParameterBuilder>[last];
+      Object last = pop();
+      if (last is List<FormalParameterBuilder>) {
+        formals = last;
+      } else if (last is! ParserRecovery) {
+        assert(last != null);
+        formals = new List<FormalParameterBuilder>(1);
+        formals[0] = last;
       }
     } else if (count > 1) {
-      var last = pop();
+      Object last = pop();
       count--;
-      if (last is List<FormalParameterBuilder>) {
-        formals = new List<FormalParameterBuilder>.filled(
-            count + last.length, null,
-            growable: true);
-        formals.setRange(count, formals.length, last);
+      if (last is ParserRecovery) {
+        discard(count);
+      } else if (last is List<FormalParameterBuilder>) {
+        formals = const FixedNullableList<FormalParameterBuilder>()
+            .popPadded(stack, count, last.length);
+        if (formals != null) {
+          formals.setRange(count, formals.length, last);
+        }
       } else {
-        formals = new List<FormalParameterBuilder>.filled(count + 1, null,
-            growable: true);
-        formals[count] = last;
+        formals = const FixedNullableList<FormalParameterBuilder>()
+            .popPadded(stack, count, 1);
+        if (formals != null) {
+          formals[count] = last;
+        }
       }
-      popList(count, formals);
     }
     if (formals != null) {
+      assert(formals.isNotEmpty);
       if (formals.length == 2) {
         // The name may be null for generalized function types.
         if (formals[0].name != null && formals[0].name == formals[1].name) {
@@ -1050,15 +1135,17 @@
 
   @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
+    debugEvent("Enum");
     String documentationComment = getDocumentationComment(enumKeyword);
-    List<Object> constantNamesAndOffsets = popList(
-        count * 4, new List<Object>.filled(count * 4, null, growable: true));
+    List<EnumConstantInfo> enumConstantInfos =
+        const FixedNullableList<EnumConstantInfo>().pop(stack, count);
     int charOffset = pop();
-    String name = pop();
+    Object name = pop();
     List<MetadataBuilder> metadata = pop();
-    library.addEnum(documentationComment, metadata, name,
-        constantNamesAndOffsets, charOffset, leftBrace?.endGroup?.charOffset);
     checkEmpty(enumKeyword.charOffset);
+    if (name is ParserRecovery) return;
+    library.addEnum(documentationComment, metadata, name, enumConstantInfos,
+        charOffset, leftBrace?.endGroup?.charOffset);
   }
 
   @override
@@ -1106,7 +1193,7 @@
     debugEvent("endFunctionTypeAlias");
     String documentationComment = getDocumentationComment(typedefKeyword);
     List<TypeVariableBuilder> typeVariables;
-    String name;
+    Object name;
     int charOffset;
     FunctionTypeBuilder functionType;
     if (equals == null) {
@@ -1118,6 +1205,11 @@
       TypeBuilder returnType = pop();
       // Create a nested declaration that is ended below by
       // `library.addFunctionType`.
+      if (name is ParserRecovery) {
+        pop(); // Metadata.
+        library.endNestedDeclaration("<syntax-error>");
+        return;
+      }
       library.beginNestedDeclaration("#function_type", hasMembers: false);
       functionType =
           library.addFunctionType(returnType, null, formals, charOffset);
@@ -1126,6 +1218,11 @@
       typeVariables = pop();
       charOffset = pop();
       name = pop();
+      if (name is ParserRecovery) {
+        pop(); // Metadata.
+        library.endNestedDeclaration("<syntax-error>");
+        return;
+      }
       if (type is FunctionTypeBuilder) {
         // TODO(ahe): We need to start a nested declaration when parsing the
         // formals and return type so we can correctly bind
@@ -1139,34 +1236,33 @@
       }
     }
     List<MetadataBuilder> metadata = pop();
+    checkEmpty(typedefKeyword.charOffset);
     library.addFunctionTypeAlias(documentationComment, metadata, name,
         typeVariables, functionType, charOffset);
-    checkEmpty(typedefKeyword.charOffset);
   }
 
   @override
   void endTopLevelFields(Token staticToken, Token covariantToken,
       Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("endTopLevelFields");
-    List<Object> fieldsInfo = popList(
-        count * 4, new List<Object>.filled(count * 4, null, growable: true));
-    TypeBuilder type = pop();
+    List<FieldInfo> fieldInfos = popFieldInfos(count);
+    TypeBuilder type = nullIfParserRecovery(pop());
     int modifiers = (staticToken != null ? staticMask : 0) |
         (covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
     List<MetadataBuilder> metadata = pop();
+    checkEmpty(beginToken.charOffset);
+    if (fieldInfos == null) return;
     String documentationComment = getDocumentationComment(beginToken);
     library.addFields(
-        documentationComment, metadata, modifiers, type, fieldsInfo);
-    checkEmpty(beginToken.charOffset);
+        documentationComment, metadata, modifiers, type, fieldInfos);
   }
 
   @override
   void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
       int count, Token beginToken, Token endToken) {
     debugEvent("Fields");
-    List<Object> fieldsInfo = popList(
-        count * 4, new List<Object>.filled(count * 4, null, growable: true));
+    List<FieldInfo> fieldInfos = popFieldInfos(count);
     TypeBuilder type = pop();
     int modifiers = (staticToken != null ? staticMask : 0) |
         (covariantToken != null ? covariantMask : 0) |
@@ -1179,38 +1275,63 @@
       modifiers &= ~constMask;
     }
     List<MetadataBuilder> metadata = pop();
+    if (fieldInfos == null) return;
     String documentationComment = getDocumentationComment(beginToken);
     library.addFields(
-        documentationComment, metadata, modifiers, type, fieldsInfo);
+        documentationComment, metadata, modifiers, type, fieldInfos);
+  }
+
+  List<FieldInfo> popFieldInfos(int count) {
+    if (count == 0) return null;
+    List<FieldInfo> fieldInfos = new List<FieldInfo>(count);
+    bool isParserRecovery = false;
+    for (int i = count - 1; i != -1; i--) {
+      Token beforeLast = pop();
+      Token initializerTokenForInference = pop();
+      int charOffset = pop();
+      Object name = pop(NullValue.Identifier);
+      if (name is ParserRecovery) {
+        isParserRecovery = true;
+      } else {
+        fieldInfos[i] = new FieldInfo(
+            name, charOffset, initializerTokenForInference, beforeLast);
+      }
+    }
+    return isParserRecovery ? null : fieldInfos;
   }
 
   @override
   void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
     int charOffset = pop();
-    String name = pop();
+    Object name = pop();
     // TODO(paulberry): type variable metadata should not be ignored.  See
     // dartbug.com/28981.
     /* List<MetadataBuilder> metadata = */ pop();
-
-    push(library.addTypeVariable(name, null, charOffset));
+    if (name is ParserRecovery) {
+      push(name);
+    } else {
+      push(library.addTypeVariable(name, null, charOffset));
+    }
   }
 
   @override
   void handleTypeVariablesDefined(Token token, int count) {
     debugEvent("TypeVariablesDefined");
     assert(count > 0);
-    push(popList(count, new List<TypeVariableBuilder>(count)));
+    push(const FixedNullableList<TypeVariableBuilder>().pop(stack, count) ??
+        NullValue.TypeVariables);
   }
 
   @override
   void endTypeVariable(Token token, int index, Token extendsOrSuper) {
     debugEvent("endTypeVariable");
-    TypeBuilder bound = pop();
+    TypeBuilder bound = nullIfParserRecovery(pop());
     // Peek to leave type parameters on top of stack.
-    List typeParameters = peek();
-
-    typeParameters[index].bound = bound;
+    List<TypeVariableBuilder> typeParameters = peek();
+    if (typeParameters != null) {
+      typeParameters[index].bound = bound;
+    }
   }
 
   @override
@@ -1218,48 +1339,50 @@
     debugEvent("endTypeVariables");
 
     // Peek to leave type parameters on top of stack.
-    List typeParameters = peek();
+    List<TypeVariableBuilder> typeParameters = peek();
 
     Map<String, TypeVariableBuilder> typeVariablesByName;
-    for (TypeVariableBuilder builder in typeParameters) {
-      if (builder.bound != null) {
-        if (typeVariablesByName == null) {
-          typeVariablesByName = new Map<String, TypeVariableBuilder>();
-          for (TypeVariableBuilder builder in typeParameters) {
-            typeVariablesByName[builder.name] = builder;
+    if (typeParameters != null) {
+      for (TypeVariableBuilder builder in typeParameters) {
+        if (builder.bound != null) {
+          if (typeVariablesByName == null) {
+            typeVariablesByName = new Map<String, TypeVariableBuilder>();
+            for (TypeVariableBuilder builder in typeParameters) {
+              typeVariablesByName[builder.name] = builder;
+            }
           }
-        }
 
-        // Find cycle: If there's no cycle we can at most step through all
-        // `typeParameters` (at which point the last builders bound will be
-        // null).
-        // If there is a cycle with `builder` 'inside' the steps to get back to
-        // it will also be bound by `typeParameters.length`.
-        // If there is a cycle without `builder` 'inside' we will just ignore it
-        // for now. It will be reported when processing one of the `builder`s
-        // that is in fact `inside` the cycle. This matches the cyclic class
-        // hierarchy error.
-        TypeVariableBuilder bound = builder;
-        for (int steps = 0;
-            bound.bound != null && steps < typeParameters.length;
-            ++steps) {
-          bound = typeVariablesByName[bound.bound.name];
-          if (bound == null || bound == builder) break;
-        }
-        if (bound == builder && bound.bound != null) {
-          // Write out cycle.
-          List<String> via = new List<String>();
-          bound = typeVariablesByName[builder.bound.name];
-          while (bound != builder) {
-            via.add(bound.name);
+          // Find cycle: If there's no cycle we can at most step through all
+          // `typeParameters` (at which point the last builders bound will be
+          // null).
+          // If there is a cycle with `builder` 'inside' the steps to get back to
+          // it will also be bound by `typeParameters.length`.
+          // If there is a cycle without `builder` 'inside' we will just ignore it
+          // for now. It will be reported when processing one of the `builder`s
+          // that is in fact `inside` the cycle. This matches the cyclic class
+          // hierarchy error.
+          TypeVariableBuilder bound = builder;
+          for (int steps = 0;
+              bound.bound != null && steps < typeParameters.length;
+              ++steps) {
             bound = typeVariablesByName[bound.bound.name];
+            if (bound == null || bound == builder) break;
           }
-          String involvedString = via.join("', '");
-          addProblem(
-              templateCycleInTypeVariables.withArguments(
-                  builder.name, involvedString),
-              builder.charOffset,
-              builder.name.length);
+          if (bound == builder && bound.bound != null) {
+            // Write out cycle.
+            List<String> via = new List<String>();
+            bound = typeVariablesByName[builder.bound.name];
+            while (bound != builder) {
+              via.add(bound.name);
+              bound = typeVariablesByName[bound.bound.name];
+            }
+            String involvedString = via.join("', '");
+            addProblem(
+                templateCycleInTypeVariables.withArguments(
+                    builder.name, involvedString),
+                builder.charOffset,
+                builder.name.length);
+          }
         }
       }
     }
@@ -1295,8 +1418,12 @@
     List<TypeBuilder> typeArguments = pop();
     int charOffset = pop();
     Object name = pop();
-    push(library.addConstructorReference(
-        name, typeArguments, suffix, charOffset));
+    if (name is ParserRecovery) {
+      push(name);
+    } else {
+      push(library.addConstructorReference(
+          name, typeArguments, suffix, charOffset));
+    }
   }
 
   @override
@@ -1315,7 +1442,7 @@
     MethodBody kind = pop();
     ConstructorReferenceBuilder redirectionTarget;
     if (kind == MethodBody.RedirectingFactoryBody) {
-      redirectionTarget = pop();
+      redirectionTarget = nullIfParserRecovery(pop());
     }
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
@@ -1324,6 +1451,10 @@
     Object name = pop();
     int modifiers = pop();
     List<MetadataBuilder> metadata = pop();
+    if (name is ParserRecovery) {
+      library.endNestedDeclaration("<syntax-error>");
+      return;
+    }
     String documentationComment = getDocumentationComment(beginToken);
     library.addFactoryMethod(
         documentationComment,
@@ -1401,12 +1532,15 @@
   void handleClassWithClause(Token withKeyword) {
     debugEvent("ClassWithClause");
 
-    List<TypeBuilder> mixins = pop();
+    Object mixins = pop();
     int extendsOffset = pop();
-    TypeBuilder supertype = pop();
-
-    push(
-        library.addMixinApplication(supertype, mixins, withKeyword.charOffset));
+    Object supertype = pop();
+    if (supertype is ParserRecovery || mixins is ParserRecovery) {
+      push(new ParserRecovery(withKeyword.charOffset));
+    } else {
+      push(library.addMixinApplication(
+          supertype, mixins, withKeyword.charOffset));
+    }
     push(extendsOffset);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/scope_listener.dart b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
index e9a61e3..c49ce08 100644
--- a/pkg/front_end/lib/src/fasta/source/scope_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
@@ -10,7 +10,8 @@
 
 import 'stack_listener.dart' show NullValue, StackListener;
 
-export 'stack_listener.dart' show NullValue;
+export 'stack_listener.dart'
+    show FixedNullableList, GrowableList, NullValue, ParserRecovery;
 
 enum JumpTargetKind {
   Break,
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 8df5e4a..16ee2a6 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
@@ -80,6 +80,8 @@
 
   KernelTypeBuilder mixedInType;
 
+  bool isMixinDeclaration;
+
   SourceClassBuilder(
       List<MetadataBuilder> metadata,
       int modifiers,
@@ -94,8 +96,9 @@
       int startCharOffset,
       int charOffset,
       int charEndOffset,
-      [ShadowClass cls,
-      this.mixedInType])
+      {Class cls,
+      this.mixedInType,
+      this.isMixinDeclaration = false})
       : actualCls = initializeClass(cls, typeVariables, name, parent,
             startCharOffset, charOffset, charEndOffset),
         super(metadata, modifiers, name, typeVariables, supertype, interfaces,
@@ -113,18 +116,23 @@
     void buildBuilders(String name, Declaration declaration) {
       do {
         if (declaration.parent != this) {
-          unexpected(
-              "$fileUri", "${declaration.parent.fileUri}", charOffset, fileUri);
+          if (fileUri != declaration.parent.fileUri) {
+            unexpected("$fileUri", "${declaration.parent.fileUri}", charOffset,
+                fileUri);
+          } else {
+            unexpected(fullNameForErrors, declaration.parent?.fullNameForErrors,
+                charOffset, fileUri);
+          }
         } else if (declaration is KernelFieldBuilder) {
           // TODO(ahe): It would be nice to have a common interface for the
           // build method to avoid duplicating these two cases.
           Member field = declaration.build(library);
-          if (!declaration.isPatch) {
+          if (!declaration.isPatch && declaration.next == null) {
             cls.addMember(field);
           }
         } else if (declaration is KernelFunctionBuilder) {
           Member function = declaration.build(library);
-          if (!declaration.isPatch) {
+          if (!declaration.isPatch && declaration.next == null) {
             cls.addMember(function);
           }
         } else {
@@ -141,6 +149,7 @@
         supertype?.buildSupertype(library, charOffset, fileUri);
     actualCls.mixedInType =
         mixedInType?.buildMixedInType(library, charOffset, fileUri);
+    actualCls.isMixinDeclaration = isMixinDeclaration;
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
     cls.isAbstract = isAbstract;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 7d81a1a..cd86540 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -17,6 +17,7 @@
         ClassBuilder,
         ConstructorReferenceBuilder,
         Declaration,
+        EnumConstantInfo,
         FormalParameterBuilder,
         FunctionTypeBuilder,
         LibraryBuilder,
@@ -57,7 +58,8 @@
         templateCouldNotParseUri,
         templateDeferredPrefixDuplicated,
         templateDeferredPrefixDuplicatedCause,
-        templateDuplicatedDefinition,
+        templateDuplicatedDeclaration,
+        templateDuplicatedDeclarationCause,
         templateMissingPartOf,
         templateNotAPrefixInTypeAnnotation,
         templatePartOfInLibrary,
@@ -178,7 +180,8 @@
     assert(
         (name?.startsWith(currentDeclaration.name) ??
                 (name == currentDeclaration.name)) ||
-            currentDeclaration.name == "operator",
+            currentDeclaration.name == "operator" ||
+            identical(name, "<syntax-error>"),
         "${name} != ${currentDeclaration.name}");
     DeclarationBuilder<T> previous = currentDeclaration;
     currentDeclaration = currentDeclaration.parent;
@@ -384,15 +387,15 @@
       bool hasInitializer);
 
   void addFields(String documentationComment, List<MetadataBuilder> metadata,
-      int modifiers, T type, List<Object> fieldsInfo) {
-    for (int i = 0; i < fieldsInfo.length; i += 4) {
-      String name = fieldsInfo[i];
-      int charOffset = fieldsInfo[i + 1];
-      bool hasInitializer = fieldsInfo[i + 2] != null;
+      int modifiers, T type, List<FieldInfo> fieldInfos) {
+    for (FieldInfo info in fieldInfos) {
+      String name = info.name;
+      int charOffset = info.charOffset;
+      bool hasInitializer = info.initializerTokenForInference != null;
       Token initializerTokenForInference =
-          type == null ? fieldsInfo[i + 2] : null;
+          type == null ? info.initializerTokenForInference : null;
       if (initializerTokenForInference != null) {
-        Token beforeLast = fieldsInfo[i + 3];
+        Token beforeLast = info.beforeLast;
         beforeLast.setNext(new Token.eof(beforeLast.next.offset));
       }
       addField(documentationComment, metadata, modifiers, type, name,
@@ -435,7 +438,7 @@
       String documentationComment,
       List<MetadataBuilder> metadata,
       String name,
-      List<Object> constantNamesAndOffsets,
+      List<EnumConstantInfo> enumConstantInfos,
       int charOffset,
       int charEndOffset);
 
@@ -475,6 +478,9 @@
     // TODO(ahe): Set the parent correctly here. Could then change the
     // implementation of MemberBuilder.isTopLevel to test explicitly for a
     // LibraryBuilder.
+    if (name == null) {
+      unhandled("null", "name", charOffset, fileUri);
+    }
     if (currentDeclaration == libraryDeclaration) {
       if (declaration is MemberBuilder) {
         declaration.parent = this;
@@ -528,14 +534,18 @@
           return computeAmbiguousDeclaration(
               name, existing, member, charOffset);
         });
-    } else if (isDuplicatedDefinition(existing, declaration)) {
-      addProblem(templateDuplicatedDefinition.withArguments(name), charOffset,
-          noLength, fileUri);
+    } else if (isDuplicatedDeclaration(existing, declaration)) {
+      addProblem(templateDuplicatedDeclaration.withArguments(name), charOffset,
+          name.length, fileUri,
+          context: <LocatedMessage>[
+            templateDuplicatedDeclarationCause.withArguments(name).withLocation(
+                existing.fileUri, existing.charOffset, name.length)
+          ]);
     }
     return members[name] = declaration;
   }
 
-  bool isDuplicatedDefinition(Declaration existing, Declaration other) {
+  bool isDuplicatedDeclaration(Declaration existing, Declaration other) {
     if (existing == null) return false;
     Declaration next = existing.next;
     if (next == null) {
@@ -918,3 +928,13 @@
     return new Scope(members, setters, parent, name, isModifiable: false);
   }
 }
+
+class FieldInfo {
+  final String name;
+  final int charOffset;
+  final Token initializerTokenForInference;
+  final Token beforeLast;
+
+  const FieldInfo(this.name, this.charOffset, this.initializerTokenForInference,
+      this.beforeLast);
+}
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 d318a5a..ac9aedb 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -49,6 +49,8 @@
 
 import '../export.dart' show Export;
 
+import '../import.dart' show Import;
+
 import '../fasta_codes.dart'
     show
         LocatedMessage,
@@ -60,6 +62,10 @@
         templateAmbiguousSupertypes,
         templateCantReadFile,
         templateCyclicClassHierarchy,
+        templateDuplicatedLibraryExport,
+        templateDuplicatedLibraryExportContext,
+        templateDuplicatedLibraryImport,
+        templateDuplicatedLibraryImportContext,
         templateExtendingEnum,
         templateExtendingRestricted,
         templateIllegalMixin,
@@ -650,6 +656,80 @@
       }
     }
     ticker.logMs("Checked restricted supertypes");
+
+    // Check imports and exports for duplicate names.
+    // This is rather silly, e.g. it makes importing 'foo' and exporting another
+    // 'foo' ok.
+    builders.forEach((Uri uri, LibraryBuilder library) {
+      if (library is SourceLibraryBuilder && library.loader == this) {
+        // Check exports.
+        if (library.exports.isNotEmpty) {
+          Map<String, List<Export>> nameToExports;
+          bool errorExports = false;
+          for (Export export in library.exports) {
+            String name = export.exported?.name ?? '';
+            if (name != '') {
+              nameToExports ??= new Map<String, List<Export>>();
+              List<Export> exports = nameToExports[name] ??= <Export>[];
+              exports.add(export);
+              if (exports[0].exported != export.exported) errorExports = true;
+            }
+          }
+          if (errorExports) {
+            for (String name in nameToExports.keys) {
+              List<Export> exports = nameToExports[name];
+              if (exports.length < 2) continue;
+              List<LocatedMessage> context = <LocatedMessage>[];
+              for (Export export in exports.skip(1)) {
+                context.add(templateDuplicatedLibraryExportContext
+                    .withArguments(name)
+                    .withLocation(uri, export.charOffset, noLength));
+              }
+              library.addProblem(
+                  templateDuplicatedLibraryExport.withArguments(name),
+                  exports[0].charOffset,
+                  noLength,
+                  uri,
+                  context: context);
+            }
+          }
+        }
+
+        // Check imports.
+        if (library.imports.isNotEmpty) {
+          Map<String, List<Import>> nameToImports;
+          bool errorImports;
+          for (Import import in library.imports) {
+            String name = import.imported?.name ?? '';
+            if (name != '') {
+              nameToImports ??= new Map<String, List<Import>>();
+              List<Import> imports = nameToImports[name] ??= <Import>[];
+              imports.add(import);
+              if (imports[0].imported != import.imported) errorImports = true;
+            }
+          }
+          if (errorImports != null) {
+            for (String name in nameToImports.keys) {
+              List<Import> imports = nameToImports[name];
+              if (imports.length < 2) continue;
+              List<LocatedMessage> context = <LocatedMessage>[];
+              for (Import import in imports.skip(1)) {
+                context.add(templateDuplicatedLibraryImportContext
+                    .withArguments(name)
+                    .withLocation(uri, import.charOffset, noLength));
+              }
+              library.addProblem(
+                  templateDuplicatedLibraryImport.withArguments(name),
+                  imports[0].charOffset,
+                  noLength,
+                  uri,
+                  context: context);
+            }
+          }
+        }
+      }
+    });
+    ticker.logMs("Checked imports and exports for duplicate names");
   }
 
   void buildComponent() {
@@ -776,6 +856,17 @@
     ticker.logMs("Checked abstract members");
   }
 
+  void checkRedirectingFactories(List<SourceClassBuilder> sourceClasses) {
+    if (!target.strongMode) return;
+    for (SourceClassBuilder builder in sourceClasses) {
+      if (builder.library.loader == this) {
+        builder.checkRedirectingFactories(
+            typeInferenceEngine.typeSchemaEnvironment);
+      }
+    }
+    ticker.logMs("Checked redirecting factories");
+  }
+
   void addNoSuchMethodForwarders(List<SourceClassBuilder> sourceClasses) {
     if (!target.backendTarget.enableNoSuchMethodForwarders) return;
 
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index e388982..34dc2c8 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -54,6 +54,7 @@
   Identifier,
   IdentifierList,
   Initializers,
+  Labels,
   Metadata,
   Modifiers,
   ParameterDefaultValue,
@@ -76,6 +77,12 @@
   @override
   Uri get uri;
 
+  void discard(int n) {
+    for (int i = 0; i < n; i++) {
+      pop();
+    }
+  }
+
   // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
   // and ast_builder.dart.
   void finishFunction(covariant List<Object> annotations, covariant formals,
@@ -124,16 +131,12 @@
     return value == null ? null : pop();
   }
 
-  List popList(int n, List list) {
-    if (n == 0) return null;
-    return stack.popList(n, list);
-  }
-
   void debugEvent(String name) {
     // printEvent(name);
   }
 
   void printEvent(String name) {
+    print('\n------------------');
     for (Object o in stack.values) {
       String s = "  $o";
       int index = s.indexOf("\n");
@@ -142,8 +145,7 @@
       }
       print(s);
     }
-    print(name);
-    print('------------------\n');
+    print("  >> $name");
   }
 
   @override
@@ -155,7 +157,14 @@
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
     debugEvent("handleIdentifier");
-    push(token.lexeme);
+    if (!token.isSynthetic) {
+      push(token.lexeme);
+    } else {
+      // This comes from a synthetic token which is inserted by the parser in
+      // an attempt to recover.  This almost always means that the parser has
+      // gotten very confused and we need to ignore the results.
+      push(new ParserRecovery(token.charOffset));
+    }
   }
 
   @override
@@ -326,14 +335,6 @@
   }
 
   @override
-  void handleStringJuxtaposition(int literalCount) {
-    debugEvent("StringJuxtaposition");
-    push(popList(literalCount,
-            new List<Expression>.filled(literalCount, null, growable: true))
-        .join(""));
-  }
-
-  @override
   void handleDirectivesOnly() {
     pop(); // Discard the metadata.
   }
@@ -386,7 +387,7 @@
 }
 
 class Stack {
-  List array = new List(8);
+  List<Object> array = new List<Object>(8);
   int arrayLength = 0;
 
   bool get isNotEmpty => arrayLength > 0;
@@ -405,7 +406,7 @@
     }
   }
 
-  Object pop([NullValue nullValue]) {
+  Object pop(NullValue nullValue) {
     assert(arrayLength > 0);
     final Object value = array[--arrayLength];
     array[arrayLength] = null;
@@ -418,32 +419,80 @@
     }
   }
 
-  List popList(int count, List list) {
+  List<Object> popList(int count, List<Object> list, NullValue nullValue) {
     assert(arrayLength >= count);
-
-    final table = array;
-    final length = arrayLength;
-
-    final startIndex = length - count;
+    final List<Object> array = this.array;
+    final int length = arrayLength;
+    final int startIndex = length - count;
+    bool isParserRecovery = false;
     for (int i = 0; i < count; i++) {
-      final value = table[startIndex + i];
-      list[i] = value is NullValue ? null : value;
-      table[startIndex + i] = null;
+      int arrayIndex = startIndex + i;
+      final Object value = array[arrayIndex];
+      array[arrayIndex] = null;
+      if (value is NullValue && nullValue == null ||
+          identical(value, nullValue)) {
+        list[i] = null;
+      } else if (value is ParserRecovery) {
+        isParserRecovery = true;
+      } else {
+        if (value is NullValue) {
+          print(value);
+        }
+        list[i] = value;
+      }
     }
     arrayLength -= count;
 
-    return list;
+    return isParserRecovery ? null : list;
   }
 
-  List get values {
-    final List list = new List(arrayLength);
-    list.setRange(0, arrayLength, array);
+  List<Object> get values {
+    final int length = arrayLength;
+    final List<Object> list = new List<Object>(length);
+    list.setRange(0, length, array);
     return list;
   }
 
   void _grow() {
-    final List newTable = new List(array.length * 2);
-    newTable.setRange(0, array.length, array, 0);
-    array = newTable;
+    final int length = array.length;
+    final List<Object> newArray = new List<Object>(length * 2);
+    newArray.setRange(0, length, array, 0);
+    array = newArray;
   }
 }
+
+/// Helper constant for popping a list of the top of a [Stack].  This helper
+/// returns null instead of empty lists, and the lists returned are of fixed
+/// length.
+class FixedNullableList<T> {
+  const FixedNullableList();
+
+  List<T> pop(Stack stack, int count, [NullValue nullValue]) {
+    if (count == 0) return null;
+    return stack.popList(count, new List<T>(count), nullValue);
+  }
+
+  List<T> popPadded(Stack stack, int count, int padding,
+      [NullValue nullValue]) {
+    if (count + padding == 0) return null;
+    return stack.popList(count, new List<T>(count + padding), nullValue);
+  }
+}
+
+/// Helper constant for popping a list of the top of a [Stack].  This helper
+/// returns growable lists (also when empty).
+class GrowableList<T> {
+  const GrowableList();
+
+  List<T> pop(Stack stack, int count, [NullValue nullValue]) {
+    return stack.popList(
+        count, new List<T>.filled(count, null, growable: true), nullValue);
+  }
+}
+
+class ParserRecovery {
+  final int charOffset;
+  ParserRecovery(this.charOffset);
+
+  String toString() => "ParserRecovery(charOffset)";
+}
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
index b7132d0..433632f 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -30,9 +30,8 @@
 import 'package:testing/testing.dart'
     show ChainContext, Result, StdioProcess, Step, TestDescription;
 
-import '../../api_prototype/compilation_message.dart' show CompilationMessage;
-
-import '../../api_prototype/compiler_options.dart' show CompilerOptions;
+import '../../api_prototype/compiler_options.dart'
+    show CompilerOptions, FormattedMessage, Severity;
 
 import '../../api_prototype/kernel_generator.dart' show kernelForProgram;
 
@@ -45,6 +44,8 @@
 
 import '../kernel/verifier.dart' show verifyComponent;
 
+import '../messages.dart' show LocatedMessage;
+
 class Print extends Step<Component, Component, ChainContext> {
   const Print();
 
@@ -73,17 +74,27 @@
 
   Future<Result<Component>> run(
       Component component, ChainContext context) async {
-    var options = new ProcessedOptions(new CompilerOptions());
+    StringBuffer problems = new StringBuffer();
+    ProcessedOptions options = new ProcessedOptions(
+        options: new CompilerOptions()
+          ..onProblem = (FormattedMessage problem, Severity severity,
+              List<FormattedMessage> context) {
+            if (problems.isNotEmpty) {
+              problems.write("\n");
+            }
+            problems.write(problem.formatted);
+          });
     return await CompilerContext.runWithOptions(options, (_) async {
-      var errors = verifyComponent(component,
+      List<LocatedMessage> verificationErrors = verifyComponent(component,
           isOutline: !fullCompile, skipPlatform: true);
-      if (errors.isEmpty) {
+      assert(verificationErrors.isEmpty || problems.isNotEmpty);
+      if (problems.isEmpty) {
         return pass(component);
       } else {
-        return new Result<Component>(
-            null, context.expectationSet["VerificationError"], errors, null);
+        return new Result<Component>(null,
+            context.expectationSet["VerificationError"], "$problems", null);
       }
-    });
+    }, errorOnMissingInput: false);
   }
 }
 
@@ -123,17 +134,26 @@
 
   String get name => "match expectations";
 
-  Future<Result<Component>> run(Component component, _) async {
+  Future<Result<Component>> run(Component component, dynamic context) async {
+    StringBuffer problems = context.componentToProblems[component];
     Library library = component.libraries
         .firstWhere((Library library) => library.importUri.scheme != "dart");
     Uri uri = library.importUri;
     Uri base = uri.resolve(".");
     Uri dartBase = Uri.base;
     StringBuffer buffer = new StringBuffer();
+    if (problems.isNotEmpty) {
+      buffer.write("// Formatted problems:\n//");
+      for (String line in "${problems}".split("\n")) {
+        buffer.write("\n// $line".trimRight());
+      }
+      buffer.write("\n\n");
+      problems.clear();
+    }
     for (Field field in library.fields) {
       if (field.name.name != "#errors") continue;
       ListLiteral list = field.initializer;
-      buffer.write("// Errors:");
+      buffer.write("// Unhandled errors:");
       for (StringLiteral string in list.expressions) {
         buffer.write("\n//");
         for (String line in string.value.split("\n")) {
@@ -240,17 +260,16 @@
   Future<Result<Component>> run(
       TestDescription description, CompileContext context) async {
     Result<Component> result;
-    reportError(CompilationMessage error) {
-      result ??= fail(null, error.message);
-    }
-
     Uri sdk = Uri.base.resolve("sdk/");
     var options = new CompilerOptions()
       ..sdkRoot = sdk
       ..compileSdk = true
       ..packagesFileUri = Uri.base.resolve('.packages')
       ..strongMode = context.strongMode
-      ..onError = reportError;
+      ..onProblem = (FormattedMessage problem, Severity severity,
+          List<FormattedMessage> context) {
+        result ??= fail(null, problem.formatted);
+      };
     if (context.target != null) {
       options.target = context.target;
       // Do not link platform.dill, but recompile the platform libraries. This
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 362a67a..879e18f 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
@@ -786,7 +786,7 @@
         //     method to infer from and the signatures are compatible, it is
         //     treated as dynamic (e.g. overriding a one parameter method with a
         //     method that takes a second optional parameter).  Note: if there
-        //     is no corresponding parameter position in the overriden method to
+        //     is no corresponding parameter position in the overridden method to
         //     infer from and the signatures are incompatible (e.g. overriding a
         //     one parameter method with a method that takes a second
         //     non-optional parameter), the inference result is not defined and
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 96ef8c84..fc2c472 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -99,6 +99,9 @@
 DirectiveAfterDeclaration/script2: Fail
 DuplicateDeferred/example: Fail
 DuplicatePrefix/example: Fail
+DuplicatedDeclarationUse/analyzerCode: Fail # No corresponding analyzer code.
+DuplicatedDeclarationUse/script1: Fail # This test can't pass.
+DuplicatedDeclarationUse/script2: Fail # Wrong error.
 DuplicatedDefinition/analyzerCode: Fail
 DuplicatedDefinition/example: Fail
 DuplicatedExportInType/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index ba5e7d6..1ccc260 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -385,16 +385,18 @@
   analyzerCode: EXPECTED_TYPE_NAME
 
 MissingExpressionInThrow:
+  index: 32
   template: "Missing expression after 'throw'."
   tip: "Add an expression after 'throw' or use 'rethrow' to throw a caught exception"
-  analyzerCode: MISSING_EXPRESSION_IN_THROW
+  analyzerCode: ParserErrorCode.MISSING_EXPRESSION_IN_THROW
   statement:
     - "throw;"
 
 MissingConstFinalVarOrType:
+  index: 33
   template: "Variables must be declared using the keywords 'const', 'final', 'var' or a type name."
   tip: "Try adding the name of the type of the variable or the keyword 'var'."
-  analyzerCode: MISSING_CONST_FINAL_VAR_OR_TYPE
+  analyzerCode: ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
   script:
     - "class C { static f; }"
 
@@ -897,15 +899,17 @@
     - "'\\u{110000}'"
 
 InvalidHexEscape:
+  index: 40
   template: "An escape sequence starting with '\\x' must be followed by 2 hexadecimal digits."
-  analyzerCode: INVALID_HEX_ESCAPE
+  analyzerCode: ParserErrorCode.INVALID_HEX_ESCAPE
   expression:
     - "'\\x0'"
     - "'\\x0y'"
 
 InvalidUnicodeEscape:
+  index: 38
   template: "An escape sequence starting with '\\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'."
-  analyzerCode: INVALID_UNICODE_ESCAPE
+  analyzerCode: ParserErrorCode.INVALID_UNICODE_ESCAPE
   expression:
     - "'\\u'"
     - "'\\u0F'"
@@ -1573,8 +1577,23 @@
 
 DuplicatedExport:
   template: "'#name' is exported from both '#uri' and '#uri2'."
-  severity: IGNORED
   analyzerCode: AMBIGUOUS_EXPORT
+  script:
+    lib1.dart: "class A {}"
+    lib2.dart: "class A {}"
+    main.dart: "export 'lib1.dart'; export 'lib2.dart';"
+
+DuplicatedLibraryExport:
+  template: "A library with name '#name' is exported more than once."
+  analyzerCode: EXPORT_DUPLICATED_LIBRARY_NAMED
+  script:
+    lib1.dart: "library foo;"
+    lib2.dart: "library foo;"
+    main.dart: "export 'lib1.dart'; export 'lib2.dart';"
+
+DuplicatedLibraryExportContext:
+  template: "'#name' is also exported here."
+  severity: CONTEXT
 
 DuplicatedExportInType:
   template: "'#name' is exported from both '#uri' and '#uri2'."
@@ -1584,6 +1603,18 @@
   template: "'#name' is imported from both '#uri' and '#uri2'."
   severity: IGNORED
 
+DuplicatedLibraryImport:
+  template: "A library with name '#name' is imported more than once."
+  analyzerCode: IMPORT_DUPLICATED_LIBRARY_NAMED
+  script:
+    lib1.dart: "library foo;"
+    lib2.dart: "library foo;"
+    main.dart: "import 'lib1.dart'; import 'lib2.dart';"
+
+DuplicatedLibraryImportContext:
+  template: "'#name' is also imported here."
+  severity: CONTEXT
+
 DuplicatedImportInType:
   template: "'#name' is imported from both '#uri' and '#uri2'."
   severity: ERROR_LEGACY_WARNING
@@ -1884,9 +1915,10 @@
   analyzerCode: INVALID_GENERIC_FUNCTION_TYPE
 
 LibraryDirectiveNotFirst:
+  index: 37
   template: "The library directive must appear before all other directives."
   tip: "Try moving the library directive before any other directives."
-  analyzerCode: LIBRARY_DIRECTIVE_NOT_FIRST
+  analyzerCode: ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST
   script:
     - "class Foo{} library l;"
     - "import 'x.dart'; library l;"
@@ -2089,17 +2121,60 @@
   script:
     - "dynamic<T>(x) => 0"
 
-DuplicatedDefinition:
-  template: "Duplicated definition of '#name'."
-
-DuplicatedName:
+# Use this message when a duplicated declaration is introduced.  For example:
+#
+#    class C {} // First declaration (related information points here).
+#    class C {} // Duplicated declaration (error here).
+#    main() {
+#      new C(); // Use of duplicated declaration.
+#    }
+#
+# We follow the convention from C that a definition is the unique element that
+# provides the implementation of a name, and a declaration may not be unique
+# (for example, forward declaration). Using this terminology, one could argue
+# that a method that is abstract or external is a declaration, not a
+# definition. Similarly, imported names are declarations, not
+# definitions. Consequently, it is more convenient to use the word
+# "declaration" instead of "definition" as the former implies less.
+DuplicatedDeclaration:
   template: "'#name' is already declared in this scope."
   analyzerCode: DUPLICATE_DEFINITION
+  script: |
+    class C {} // First declaration (related information points here).
+    class C {} // Duplicated declaration (error here).
+    main() {
+      // The following line is commented out as it would lead to an extraneous
+      // diagnostic.
+      // new C(); // Use of duplicated declaration.
+    }
 
-DuplicatedNameCause:
+DuplicatedDeclarationCause:
   template: "Previous declaration of '#name'."
   severity: CONTEXT
 
+# Use this message when a duplicated declaration is used.
+DuplicatedDeclarationUse:
+  template: "Can't use '#name' because it is declared more than once."
+  script:
+    - main.dart: |
+        // This test can't pass as tests must produce only one error message.
+        class C {} // First declaration (related information points here).
+        class C {} // Duplicated declaration (error here).
+        main() {
+          new C(); // Use of duplicated declaration.
+        }
+    - main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+
+        main() {
+          new C(); // Use of duplicated declaration.
+        }
+      lib1.dart: |
+        class C {}
+      lib2.dart: |
+        class C {}
+
 DuplicatedNamePreviouslyUsed:
   template: "Can't declare '#name' because it was already used in this scope."
   analyzerCode: REFERENCED_BEFORE_DECLARATION
@@ -2130,15 +2205,17 @@
   analyzerCode: ENUM_CONSTANT_WITH_ENUM_NAME
 
 MissingOperatorKeyword:
+  index: 31
   template: "Operator declarations must be preceeded by the keyword 'operator'."
   tip: "Try adding the keyword 'operator'."
-  analyzerCode: MISSING_KEYWORD_OPERATOR
+  analyzerCode: ParserErrorCode.MISSING_KEYWORD_OPERATOR
   script:
     - "class C { +(x) {} }"
 
 InvalidOperator:
+  index: 39
   template: "The string '#lexeme' isn't a user-definable operator."
-  analyzerCode: INVALID_OPERATOR
+  analyzerCode: ParserErrorCode.INVALID_OPERATOR
   script:
     - "class C { void operator %=(x) {} }"
 
@@ -2380,15 +2457,17 @@
   template: "This can't be used as metadata; metadata should be a reference to a compile-time constant variable, or a call to a constant constructor."
 
 ExpectedAnInitializer:
+  index: 36
   template: "Expected an initializer."
-  analyzerCode: MISSING_INITIALIZER
+  analyzerCode: ParserErrorCode.MISSING_INITIALIZER
   script:
     - "class C { C() : {} }"
 
 MissingAssignmentInInitializer:
+  index: 34
   template: "Expected an assignment after the field name."
   tip: "To initialize a field, use the syntax 'name = value'."
-  analyzerCode: MISSING_ASSIGNMENT_IN_INITIALIZER
+  analyzerCode: ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER
   script:
     - "class C { C() : x(3) {} }"
 
@@ -2419,9 +2498,10 @@
     - "main(){ f()++; }"
 
 MissingAssignableSelector:
+  index: 35
   template: "Missing selector such as '.<identifier>' or '[0]'."
   tip: "Try adding a selector."
-  analyzerCode: MISSING_ASSIGNABLE_SELECTOR
+  analyzerCode: ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR
   script:
     - "main(){ ++f(); }"
 
@@ -2831,7 +2911,7 @@
     - >-
       class A {
         factory A.f({int x = 42}) = A.g;
-        A.g() {}
+        A.g({int x = 40}) {}
       }
 
 UntranslatableUri:
@@ -2856,3 +2936,82 @@
 PackagesFileFormat:
   template: "Problem in packages configuration file: #string"
   external: test/packages_format_error_test.dart
+
+FactoryRedirecteeInvalidReturnType:
+  template: "The return type '#type' of the constructor '#name' isn't a subtype of '#type2'."
+  tip: "Try redirecting to a different constructor."
+  analyzerCode: REDIRECT_TO_INVALID_RETURN_TYPE
+  script:
+    - >-
+      class A {
+        factory A() = B;
+      }
+      class B {
+        B();
+      }
+
+FactoryRedirecteeHasTooFewPositionalParameters:
+  template: "Redirection target '#name' accepts fewer arguments ('#count') than the redirecting factory can provide."
+  tip: "Try redirecting to a different constructor."
+  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
+  script:
+    - >-
+      class A {
+        factory A.one(int x) = A.zero;
+        A.zero() {}
+      }
+
+RedirectingFactoryInvalidPositionalParameterType:
+  template: "The type of parameter '#name' (#type) is not a subtype of the redirection target's corresponding parameter type (#type2)."
+  tip: "Try changing either the type of the parameter or the redirection target."
+  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
+  script:
+    - >-
+      class A {
+        factory A.i(int x) = A.s;
+        A.s(String x) { }
+      }
+
+RedirectingFactoryMissingNamedParameter:
+  template: "The constructor '#name' does not have a named parameter '#name2'."
+  tip: "Try adding '#name2' as a named parameter to '#name'."
+  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
+  script:
+    - >-
+      class A {
+        factory A.f({int x}) = A.g;
+        A.g({int y}) { }
+      }
+
+RedirectingFactoryInvalidNamedParameterType:
+  template: "The type of the named parameter '#name' (#type) is not a subtype of the redirection target's corresponding named parameter type (#type2)."
+  tip: "Try changing either the type of the parameter or the redirection target."
+  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
+  script:
+    - >-
+      class A {
+        factory A.f({int x}) = A.g;
+        A.g({String x}) { }
+      }
+
+RedirectingFactoryProvidesTooFewRequiredParameters:
+  template: "Redirecting factory '#name' can provide less arguments ('#count') than required by the redirection target '#name2' ('#count2')."
+  tip: "Try redirecting to a different constructor."
+  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
+  script:
+    - >-
+      class A {
+        factory A.f(int x) = A.g;
+        A.g(int x, int y) {}
+      }
+
+RedirectingFactoryIncompatibleTypeArgument:
+  template: "The type '#type' doesn't extend '#type2'."
+  tip: "Try using a different type as argument."
+  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+  script:
+    - >-
+      class A<T extends int> {
+         factory A() = B<T, int>;
+      }
+      class B<T extends int, S extends String> implements A<T> {}
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index ebe6423..2eeba80 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -46,7 +46,8 @@
 
 import '../../lib/src/fasta/testing/kernel_chain.dart' show runDiff, openWrite;
 
-import '../../lib/src/fasta/kernel/utils.dart' show writeComponentToFile;
+import '../../lib/src/fasta/kernel/utils.dart'
+    show writeComponentToFile, serializeProcedure;
 
 const JsonEncoder json = const JsonEncoder.withIndent("  ");
 
@@ -284,6 +285,37 @@
 
   String get name => "compile expression";
 
+  // Compile [test.expression], update [test.errors] with results.
+  // As a side effect - verify that generated procedure can be serialized.
+  void compileExpression(TestCase test, IncrementalCompiler compiler,
+      Component component, Context context) async {
+    Map<String, DartType> definitions = {};
+    for (String name in test.definitions) {
+      definitions[name] = new DynamicType();
+    }
+    List<TypeParameter> typeParams = [];
+    for (String name in test.typeDefinitions) {
+      typeParams.add(new TypeParameter(name, new DynamicType()));
+    }
+
+    Procedure compiledProcedure = await compiler.compileExpression(
+        test.expression,
+        definitions,
+        typeParams,
+        "debugExpr",
+        test.library,
+        test.className,
+        test.isStaticMethod);
+    List<CompilationMessage> errors = context.takeErrors();
+    test.results.add(new CompilationResult(compiledProcedure, errors));
+    if (compiledProcedure != null) {
+      // Confirm we can serialize generated procedure.
+      component.computeCanonicalNames();
+      List<int> list = serializeProcedure(compiledProcedure);
+      assert(list.length > 0);
+    }
+  }
+
   Future<Result<List<TestCase>>> run(
       List<TestCase> tests, Context context) async {
     for (var test in tests) {
@@ -305,39 +337,19 @@
         context.fileSystem.entityForUri(dillFileUri).writeAsBytesSync(
             await new File.fromUri(dillFileUri).readAsBytes());
       }
+      compileExpression(test, sourceCompiler, component, context);
 
       var dillCompiler =
           new IncrementalCompiler(context.compilerContext, dillFileUri);
-      await dillCompiler.computeDelta(entryPoint: test.entryPoint);
+      component = await dillCompiler.computeDelta(entryPoint: test.entryPoint);
+      component.computeCanonicalNames();
       await dillFile.delete();
 
       errors = context.takeErrors();
-
       // Since it compiled successfully from source, the bootstrap-from-Dill
       // should also succeed without errors.
       assert(errors.isEmpty);
-
-      Map<String, DartType> definitions = {};
-      for (String name in test.definitions) {
-        definitions[name] = new DynamicType();
-      }
-      List<TypeParameter> typeParams = [];
-      for (String name in test.typeDefinitions) {
-        typeParams.add(new TypeParameter(name, new DynamicType()));
-      }
-
-      for (var compiler in [sourceCompiler, dillCompiler]) {
-        Procedure compiledProcedure = await compiler.compileExpression(
-            test.expression,
-            definitions,
-            typeParams,
-            "debugExpr",
-            test.library,
-            test.className,
-            test.isStaticMethod);
-        var errors = context.takeErrors();
-        test.results.add(new CompilationResult(compiledProcedure, errors));
-      }
+      compileExpression(test, dillCompiler, component, context);
     }
     return new Result.pass(tests);
   }
@@ -377,7 +389,7 @@
     };
 
   final ProcessedOptions options =
-      new ProcessedOptions(optionBuilder, [entryPoint]);
+      new ProcessedOptions(options: optionBuilder, inputs: [entryPoint]);
 
   final ExternalStateSnapshot snapshot =
       new ExternalStateSnapshot(await options.loadSdkSummary(null));
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 b8baa33..cd77f74 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -59,7 +59,7 @@
         KernelDelayedAssignment,
         KernelDelayedPostfixIncrement,
         KernelIndexedAccessGenerator,
-        KernelLargeIntAccessGenerator,
+        KernelIntAccessGenerator,
         KernelLoadLibraryGenerator,
         KernelNullAwarePropertyAccessGenerator,
         KernelPrefixUseGenerator,
@@ -222,8 +222,8 @@
         "ReadOnlyAccessGenerator(offset: 4, expression: expression,"
         " plainNameForRead: foo, value: null)",
         new KernelReadOnlyAccessGenerator(helper, token, expression, "foo"));
-    check("LargeIntAccessGenerator(offset: 4, lexeme: myToken)",
-        new KernelLargeIntAccessGenerator(helper, token));
+    check("IntAccessGenerator(offset: 4, lexeme: myToken)",
+        new KernelIntAccessGenerator(helper, token));
     check(
         "ParenthesizedExpressionGenerator(offset: 4, expression: expression,"
         " plainNameForRead: null, value: null)",
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index bd0929e..ff7c678 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -55,7 +55,7 @@
   final Uri helloDart = Uri.base.resolve("pkg/front_end/testcases/hello.dart");
 
   final ProcessedOptions options =
-      new ProcessedOptions(optionBuilder, [helloDart]);
+      new ProcessedOptions(options: optionBuilder, inputs: [helloDart]);
 
   IncrementalCompiler compiler =
       new IncrementalCompiler(new CompilerContext(options));
diff --git a/pkg/front_end/test/fasta/incremental_test.dart b/pkg/front_end/test/fasta/incremental_test.dart
index 3609b70..34f0a73 100644
--- a/pkg/front_end/test/fasta/incremental_test.dart
+++ b/pkg/front_end/test/fasta/incremental_test.dart
@@ -226,7 +226,7 @@
     };
 
   final ProcessedOptions options =
-      new ProcessedOptions(optionBuilder, [entryPoint]);
+      new ProcessedOptions(options: optionBuilder, inputs: [entryPoint]);
 
   final ExternalStateSnapshot snapshot =
       new ExternalStateSnapshot(await options.loadSdkSummary(null));
diff --git a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
index ed8df9c..f47b461 100644
--- a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
+++ b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
@@ -22,46 +22,30 @@
   /// Indicates whether the tests should set up [Token.previous].
   bool get setPrevious;
 
-  void test_insertTokenAfter_end_single() {
+  void test_insertToken_end() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
     var eof = _link([a]);
     var rewriter = new TokenStreamRewriter();
-    expect(rewriter.insertTokenAfter(a, b), same(a));
+    expect(rewriter.insertToken(a, b), same(b));
     expect(a.next, same(b));
     expect(b.next, same(eof));
     expect(eof.previous, same(b));
     expect(b.previous, same(a));
   }
 
-  void test_insertTokenAfter_middle_multiple() {
-    var a = _makeToken(0, 'a');
-    var b = _makeToken(1, 'b');
-    var c = _makeToken(2, 'c');
-    var d = _makeToken(3, 'd');
-    var e = _makeToken(4, 'e');
-    _link([a, b, e]);
-    _link([c, d]);
-    var rewriter = new TokenStreamRewriter();
-    rewriter.insertTokenAfter(b, c);
-    expect(a.next, same(b));
-    expect(b.next, same(c));
-    expect(c.next, same(d));
-    expect(d.next, same(e));
-  }
-
-  void test_insertTokenAfter_middle_single() {
+  void test_insertToken_middle() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
     var c = _makeToken(2, 'c');
     _link([a, c]);
     var rewriter = new TokenStreamRewriter();
-    rewriter.insertTokenAfter(a, b);
+    rewriter.insertToken(a, b);
     expect(a.next, same(b));
     expect(b.next, same(c));
   }
 
-  void test_insertTokenAfter_second_insertion_earlier_in_stream() {
+  void test_insertToken_second_insertion_earlier_in_stream() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
     var c = _makeToken(2, 'c');
@@ -69,12 +53,12 @@
     var e = _makeToken(4, 'e');
     _link([a, c, e]);
     var rewriter = new TokenStreamRewriter();
-    rewriter.insertTokenAfter(c, d);
+    rewriter.insertToken(c, d);
     expect(c.next, same(d));
     expect(d.next, same(e));
     // The next call to rewriter should be able to find the insertion point
     // even though it is before the insertion point used above.
-    rewriter.insertTokenAfter(a, b);
+    rewriter.insertToken(a, b);
     expect(a.next, same(b));
     expect(b.next, same(c));
   }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 02bf15a..c3bde5b 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -34,7 +34,7 @@
 import 'package:vm/target/vm.dart' show VmTarget;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
+    show CompilerOptions, FormattedMessage, Severity;
 
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
     show StandardFileSystem;
@@ -102,6 +102,8 @@
   final bool onlyCrashes;
   final Map<Component, KernelTarget> componentToTarget =
       <Component, KernelTarget>{};
+  final Map<Component, StringBuffer> componentToProblems =
+      <Component, StringBuffer>{};
   final Uri platformBinaries;
   Uri platformUri;
   Component platform;
@@ -137,6 +139,7 @@
     if (strongMode) {
       steps.add(const TypeCheck());
     }
+    steps.add(const EnsureNoErrors());
     if (fullCompile && !skipVm) {
       steps.add(const Transform());
       if (!ignoreExpectations) {
@@ -146,6 +149,7 @@
                 : ".outline.transformed.expect",
             updateExpectations: updateExpectations));
       }
+      steps.add(const EnsureNoErrors());
       steps.add(const WriteDill());
       steps.add(const Run());
     }
@@ -185,9 +189,14 @@
     Uri sdk = Uri.base.resolve("sdk/");
     Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
     Uri packages = Uri.base.resolve(".packages");
-    var options = new ProcessedOptions(new CompilerOptions()
-      ..sdkRoot = sdk
-      ..packagesFileUri = packages);
+    var options = new ProcessedOptions(
+        options: new CompilerOptions()
+          ..onProblem = (FormattedMessage problem, Severity severity,
+              List<FormattedMessage> context) {
+            throw problem.formatted;
+          }
+          ..sdkRoot = sdk
+          ..packagesFileUri = packages);
     UriTranslator uriTranslator = await options.getUriTranslator();
     bool strongMode = environment.containsKey(STRONG_MODE);
     bool onlyCrashes = environment["onlyCrashes"] == "true";
@@ -264,7 +273,21 @@
 
   Future<Result<Component>> run(
       TestDescription description, FastaContext context) async {
-    var options = new ProcessedOptions(new CompilerOptions());
+    StringBuffer errors = new StringBuffer();
+    ProcessedOptions options = new ProcessedOptions(
+        options: new CompilerOptions()
+          ..onProblem = (FormattedMessage problem, Severity severity,
+              List<FormattedMessage> context) {
+            if (errors.isNotEmpty) {
+              errors.write("\n\n");
+            }
+            errors.write(problem.formatted);
+            for (FormattedMessage c in context) {
+              errors.write("\n");
+              errors.write(c.formatted);
+            }
+          },
+        inputs: <Uri>[description.uri]);
     return await CompilerContext.runWithOptions(options, (_) async {
       // Disable colors to ensure that expectation files are the same across
       // platforms and independent of stdin/stderr.
@@ -309,6 +332,7 @@
       }
       context.componentToTarget.clear();
       context.componentToTarget[p] = sourceTarget;
+      context.componentToProblems[p] = errors;
       return pass(p);
     });
   }
@@ -354,3 +378,17 @@
     }
   }
 }
+
+class EnsureNoErrors extends Step<Component, Component, FastaContext> {
+  const EnsureNoErrors();
+
+  String get name => "check errors";
+
+  Future<Result<Component>> run(
+      Component component, FastaContext context) async {
+    StringBuffer buffer = context.componentToProblems[component];
+    return buffer.isEmpty
+        ? pass(component)
+        : fail(component, """Unexpected errors:\n$buffer""");
+  }
+}
diff --git a/pkg/front_end/test/fasta/tool_test.dart b/pkg/front_end/test/fasta/tool_test.dart
index 21805d7..d94ba75 100644
--- a/pkg/front_end/test/fasta/tool_test.dart
+++ b/pkg/front_end/test/fasta/tool_test.dart
@@ -15,18 +15,15 @@
 
 const List<String> subtools = const <String>[
   "abcompile",
-  "analyzer-compile",
   "compile",
   "compile-platform",
   "log",
   "logd",
   "outline",
   "parser",
-  "run",
   "scanner",
   "dump-partial",
   "dump-ir",
-  "kernel-service",
   "testing",
   "generate-messages",
 ];
@@ -65,12 +62,6 @@
 """,
       "stderr": "",
     },
-    "analyzer-compile": {
-      "exitCode": 2,
-      "stdout": "",
-      "stderr": "'analyzer-compile' isn't supported anymore,"
-          " please use 'compile' instead.\n",
-    },
     "compile": {
       "exitCode": 1,
       "stdout": """
@@ -120,12 +111,6 @@
       "stdout": "",
       "stderr": "",
     },
-    "run": {
-      "exitCode": 2,
-      "stdout": "",
-      "stderr": "'run' isn't supported anymore,"
-          " please use 'kernel-service' instead.\n",
-    },
     "scanner": {
       "exitCode": 0,
       "stderr": "",
@@ -141,10 +126,6 @@
       "stdout": "",
       "stderr": "Usage: dump-ir dillfile [output]\n",
     },
-    "kernel-service": {
-      "exitCode": 255,
-      "stdout": "",
-    },
   };
 
   for (String subtool in testedSubtools) {
@@ -167,11 +148,6 @@
         Expect.stringEquals(expectation["stderr"], result.stderr);
         break;
 
-      case "kernel-service":
-        Expect.stringEquals(expectation["stdout"], result.stdout);
-        Expect.isTrue(result.stderr.startsWith("Usage: dart ["));
-        break;
-
       default:
         Expect.stringEquals(expectation["stdout"], result.stdout);
         Expect.stringEquals(expectation["stderr"], result.stderr);
diff --git a/pkg/front_end/test/fasta/unlinked_scope_test.dart b/pkg/front_end/test/fasta/unlinked_scope_test.dart
index 3b1fd5e..b7820d0 100644
--- a/pkg/front_end/test/fasta/unlinked_scope_test.dart
+++ b/pkg/front_end/test/fasta/unlinked_scope_test.dart
@@ -100,7 +100,7 @@
 
 main() {
   CompilerContext context = new CompilerContext(new ProcessedOptions(
-      new CompilerOptions()
+      options: new CompilerOptions()
         ..onProblem = (FormattedMessage problem, Severity severity,
             List<FormattedMessage> context) {
           handler(problem, severity, context);
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 68f91f0..ba72579 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -483,7 +483,9 @@
 
   TestIncrementalCompiler(CompilerOptions options, this.entryPoint,
       [Uri initializeFrom])
-      : super(new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+      : super(
+            new CompilerContext(
+                new ProcessedOptions(options: options, inputs: [entryPoint])),
             initializeFrom);
 
   @override
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index deced6f..2903688 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -67,7 +67,8 @@
     formattedErrors.clear();
     formattedWarnings.clear();
     IncrementalCompiler compiler = new IncrementalCompiler(
-        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        new CompilerContext(
+            new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
     await compiler.computeDelta();
     if (compiler.initializedFromDill) {
@@ -128,7 +129,8 @@
 
   Future<Null> test() async {
     IncrementalCompiler compiler = new IncrementalCompiler(
-        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        new CompilerContext(
+            new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
 
     Component componentGood = await compiler.computeDelta();
@@ -137,7 +139,8 @@
 
     // Initialize from good dill file should be ok.
     compiler = new IncrementalCompiler(
-        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        new CompilerContext(
+            new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
     compiler.invalidate(entryPoint);
     Component component = await compiler.computeDelta();
diff --git a/pkg/front_end/test/packages_format_error_test.dart b/pkg/front_end/test/packages_format_error_test.dart
index f960378..e776b71 100644
--- a/pkg/front_end/test/packages_format_error_test.dart
+++ b/pkg/front_end/test/packages_format_error_test.dart
@@ -23,8 +23,8 @@
   Uri packages = root.resolve(".packages");
   fs.entityForUri(packages).writeAsStringSync("bad\n");
   List<FormattedMessage> messages = <FormattedMessage>[];
-  CompilerContext c =
-      new CompilerContext(new ProcessedOptions(new CompilerOptions()
+  CompilerContext c = new CompilerContext(new ProcessedOptions(
+      options: new CompilerOptions()
         ..fileSystem = fs
         ..onProblem = (message, severity, context) {
           messages.add(message);
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index 13c42fa..ec9cf42 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.dart
@@ -38,7 +38,7 @@
   test_compileSdk_false() {
     for (var value in [false, true]) {
       var raw = new CompilerOptions()..compileSdk = value;
-      var processed = new ProcessedOptions(raw);
+      var processed = new ProcessedOptions(options: raw);
       expect(processed.compileSdk, value);
     }
   }
@@ -49,21 +49,21 @@
     var raw = new CompilerOptions()
       ..sdkRoot = Uri.parse('org-dartlang-test:///sdk/dir/')
       ..compileSdk = false;
-    expect(new ProcessedOptions(raw).sdkSummary,
+    expect(new ProcessedOptions(options: raw).sdkSummary,
         Uri.parse('org-dartlang-test:///sdk/dir/vm_platform_strong.dill'));
 
     // But it is left null when compile-sdk is true
     raw = new CompilerOptions()
       ..sdkRoot = Uri.parse('org-dartlang-test:///sdk/dir/')
       ..compileSdk = true;
-    expect(new ProcessedOptions(raw).sdkSummary, null);
+    expect(new ProcessedOptions(options: raw).sdkSummary, null);
   }
 
   test_fileSystem_noBazelRoots() {
     // When no bazel roots are specified, the filesystem should be passed
     // through unmodified.
     var raw = new CompilerOptions()..fileSystem = fileSystem;
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     expect(processed.fileSystem, same(fileSystem));
   }
 
@@ -75,7 +75,7 @@
     var raw = new CompilerOptions()
       ..fileSystem = fileSystem
       ..sdkSummary = uri;
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
 
     var bytes = await processed.loadSdkSummaryBytes();
     expect(bytes, isNotEmpty);
@@ -100,7 +100,7 @@
   }
 
   Future<Null> checkMockSummary(CompilerOptions raw) async {
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var sdkSummary = await processed.loadSdkSummary(new CanonicalName.root());
     expect(sdkSummary.libraries.single.importUri,
         mockSummary.libraries.single.importUri);
@@ -118,7 +118,7 @@
       ..fileSystem = fileSystem
       ..librariesSpecificationUri =
           Uri.parse('org-dartlang-test:///libraries.json');
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     expect(uriTranslator.dartLibraries.libraryInfoFor('foo').uri.path,
         '/bar.dart');
@@ -137,7 +137,7 @@
       ..packagesFileUri = Uri.parse('org-dartlang-test:///.packages')
       ..compileSdk = true
       ..sdkRoot = Uri.parse('org-dartlang-test:///mysdk/');
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     expect(uriTranslator.dartLibraries.libraryInfoFor('foo').uri.path,
         '/mysdk/lib/bar.dart');
@@ -156,7 +156,7 @@
       ..packagesFileUri = Uri.parse('org-dartlang-test:///.packages')
       ..compileSdk = false // libraries.json is only inferred if true
       ..sdkRoot = Uri.parse('org-dartlang-test:///mysdk/');
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     expect(uriTranslator.dartLibraries.libraryInfoFor('foo'), isNull);
   }
@@ -180,7 +180,7 @@
     var raw = new CompilerOptions()
       ..fileSystem = fileSystem
       ..packagesFileUri = Uri.parse('org-dartlang-test:///explicit.packages');
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     checkPackageExpansion('foo', 'baz', uriTranslator.packages);
   }
@@ -199,7 +199,7 @@
       ..fileSystem = fileSystem
       ..packagesFileUri =
           Uri.parse('org-dartlang-test:///base/location/explicit.packages');
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     checkPackageExpansion('foo', 'base/location/baz', uriTranslator.packages);
   }
@@ -216,7 +216,7 @@
     var raw = new CompilerOptions()
       ..fileSystem = fileSystem
       ..packagesFileUri = Uri.parse('org-dartlang-test:///explicit.packages');
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     checkPackageExpansion('foo', 'baz', uriTranslator.packages);
   }
@@ -240,7 +240,8 @@
         .writeAsStringSync('foo:baz\n');
     var raw = new CompilerOptions()..fileSystem = fileSystem;
     var processed = new ProcessedOptions(
-        raw, [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
+        options: raw,
+        inputs: [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
     var uriTranslator = await processed.getUriTranslator();
     checkPackageExpansion('foo', 'base/location/baz', uriTranslator.packages);
   }
@@ -260,7 +261,8 @@
         .writeAsStringSync('foo:baz\n');
     var raw = new CompilerOptions()..fileSystem = fileSystem;
     var processed = new ProcessedOptions(
-        raw, [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
+        options: raw,
+        inputs: [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
     var uriTranslator = await processed.getUriTranslator();
     checkPackageExpansion('foo', 'base/baz', uriTranslator.packages);
   }
@@ -284,7 +286,8 @@
         .writeAsStringSync('foo:baz\n');
     var raw = new CompilerOptions()..fileSystem = fileSystem;
     var processed = new ProcessedOptions(
-        raw, [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
+        options: raw,
+        inputs: [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
     var uriTranslator = await processed.getUriTranslator();
     checkPackageExpansion('foo', 'base/baz', uriTranslator.packages);
   }
@@ -300,7 +303,8 @@
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
     var processed = new ProcessedOptions(
-        raw, [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
+        options: raw,
+        inputs: [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
     var uriTranslator = await processed.getUriTranslator();
     expect(errors, isEmpty);
     expect(uriTranslator.packages.asMap(), isEmpty);
@@ -316,7 +320,7 @@
       ..fileSystem = fileSystem
       ..packagesFileUri = new Uri()
       ..onError = (e) => errors.add(e);
-    var processed = new ProcessedOptions(raw);
+    var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     expect(uriTranslator.packages.asMap(), isEmpty);
     expect(errors.single.message,
@@ -331,7 +335,7 @@
     var raw = new CompilerOptions()
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw);
+    var options = new ProcessedOptions(options: raw);
     var result = await options.validateOptions();
     expect(errors.single.message, messageMissingInput.message);
     expect(result, isFalse);
@@ -342,7 +346,8 @@
     var raw = new CompilerOptions()
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     var result = await options.validateOptions();
     expect(errors, isEmpty);
     expect(result, isTrue);
@@ -367,7 +372,8 @@
       ..sdkRoot = sdkRoot
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     var result = await options.validateOptions();
     // Note: we check this first so test failures show the cause directly.
     expect(errors, isEmpty);
@@ -384,7 +390,8 @@
       ..sdkRoot = sdkRoot
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     expect(await options.validateOptions(), isFalse);
     expect(errors.first.message,
         startsWith(_stringPrefixOf(templateSdkRootNotFound)));
@@ -402,7 +409,8 @@
       ..sdkSummary = sdkSummary
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     var result = await options.validateOptions();
     expect(errors, isEmpty);
     expect(result, isTrue);
@@ -418,7 +426,8 @@
       ..sdkSummary = sdkSummary
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     expect(await options.validateOptions(), isFalse);
     expect(errors.single.message,
         startsWith(_stringPrefixOf(templateSdkSummaryNotFound)));
@@ -439,7 +448,8 @@
       ..sdkRoot = sdkRoot
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     var result = await options.validateOptions();
     expect(errors, isEmpty);
     expect(result, isTrue);
@@ -457,7 +467,8 @@
       ..sdkSummary = sdkSummary
       ..fileSystem = fileSystem
       ..onError = (e) => errors.add(e);
-    var options = new ProcessedOptions(raw, [Uri.parse('foo.dart')]);
+    var options =
+        new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     expect(await options.validateOptions(), isFalse);
     expect(errors.single.message,
         startsWith(_stringPrefixOf(templateSdkSummaryNotFound)));
diff --git a/pkg/front_end/test/src/incremental/kernel_driver_test.dart b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
index 0b33811..2769682 100644
--- a/pkg/front_end/test/src/incremental/kernel_driver_test.dart
+++ b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
@@ -1008,8 +1008,8 @@
       ..strongMode = true
       ..target = new NoneTarget(new TargetFlags(strongMode: true));
 
-    driver = new KernelDriver(
-        new ProcessedOptions(options), uriTranslator, new KernelErrorListener(),
+    driver = new KernelDriver(new ProcessedOptions(options: options),
+        uriTranslator, new KernelErrorListener(),
         sdkOutlineBytes: sdkOutlineBytes, fileAddedFn: fileAddedFn);
   }
 
diff --git a/pkg/front_end/test/whole_program_test.dart b/pkg/front_end/test/whole_program_test.dart
index d342a04..9c63521 100644
--- a/pkg/front_end/test/whole_program_test.dart
+++ b/pkg/front_end/test/whole_program_test.dart
@@ -56,7 +56,6 @@
 
   final List<String> arguments = <String>[
     '--packages=${packagesFile.toFilePath()}',
-    '--no_preview_dart_2',
     '-c',
     compiler.toFilePath(),
     '--platform=${platformDill.toFilePath()}',
diff --git a/pkg/front_end/testcases/accessors.dart.direct.expect b/pkg/front_end/testcases/accessors.dart.direct.expect
index 342baaf..4f83131 100644
--- a/pkg/front_end/testcases/accessors.dart.direct.expect
+++ b/pkg/front_end/testcases/accessors.dart.direct.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:40:11: Warning: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.direct.expect b/pkg/front_end/testcases/ambiguous_exports.dart.direct.expect
index b45d2fc..c3c8517 100644
--- a/pkg/front_end/testcases/ambiguous_exports.dart.direct.expect
+++ b/pkg/front_end/testcases/ambiguous_exports.dart.direct.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.direct.transformed.expect b/pkg/front_end/testcases/ambiguous_exports.dart.direct.transformed.expect
index b45d2fc..b993c56 100644
--- a/pkg/front_end/testcases/ambiguous_exports.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/ambiguous_exports.dart.direct.transformed.expect
@@ -1,3 +1,9 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect b/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect
index b45d2fc..dc412d7 100644
--- a/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect
+++ b/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect b/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect
index b45d2fc..c3c8517 100644
--- a/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect
+++ b/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect b/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect
index b45d2fc..b993c56 100644
--- a/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect
@@ -1,3 +1,9 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
+// export 'map.dart' show main;
+// ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/annotation_eof.dart.direct.expect b/pkg/front_end/testcases/annotation_eof.dart.direct.expect
index ff821dc..5acfc4b 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.direct.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.direct.expect
@@ -1,4 +1,8 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
 
diff --git a/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
index ff821dc..1be62d2 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
 
diff --git a/pkg/front_end/testcases/annotation_eof.dart.outline.expect b/pkg/front_end/testcases/annotation_eof.dart.outline.expect
index e4f3929..464bbee 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.outline.expect
@@ -1,6 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 
 static method main() → dynamic
   ;
-
diff --git a/pkg/front_end/testcases/annotation_eof.dart.strong.expect b/pkg/front_end/testcases/annotation_eof.dart.strong.expect
index ff821dc..5acfc4b 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.strong.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.strong.expect
@@ -1,4 +1,8 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
 
diff --git a/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
index ff821dc..1be62d2 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
 
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect b/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
index 5f3f9aa..df4ee91 100644
--- a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
+++ b/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/argument_mismatch.dart:10:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   /*@warning=MethodNotFound*/ foo(null);
+//                                  ^
+// pkg/front_end/testcases/argument_mismatch.dart:7:29: Warning: Found this candidate, but the arguments don't match.
+// /*@context=CandidateFound*/ foo() {}
+//                             ^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
index f7bb244..e33f013 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
@@ -1,4 +1,44 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+// set b();
+//      ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+// set c(x, y);
+//      ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Warning: The class 'B' is abstract and can't be instantiated.
+//     new B();
+//         ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
index f7bb244..6c9d767 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
index 1f7abc8..062086d 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
index 1d77ca6..07155ae 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
@@ -1,4 +1,44 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+// set b();
+//      ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+// set c(x, y);
+//      ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.
+//     new B();
+//         ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
index 5876551..de4fa240 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/bug21938.dart.strong.expect b/pkg/front_end/testcases/bug21938.dart.strong.expect
index cc7a72b..4417d30 100644
--- a/pkg/front_end/testcases/bug21938.dart.strong.expect
+++ b/pkg/front_end/testcases/bug21938.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   x /*@error=UndefinedMethod*/ ();
+//    ^
+//
+// pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   x /*@error=UndefinedMethod*/ (3);
+//    ^
+//
+// pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   x. /*@error=UndefinedMethod*/ call();
+//                                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/bug30695.dart.direct.expect b/pkg/front_end/testcases/bug30695.dart.direct.expect
index b07b4f4..db1bcbd 100644
--- a/pkg/front_end/testcases/bug30695.dart.direct.expect
+++ b/pkg/front_end/testcases/bug30695.dart.direct.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Warning: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^
+// pkg/front_end/testcases/bug30695.dart:6:7: Warning: This is the inherited member.
+//   var foo = 42;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/bug30695.dart.outline.expect b/pkg/front_end/testcases/bug30695.dart.outline.expect
index 2771dbb..2f3f34e 100644
--- a/pkg/front_end/testcases/bug30695.dart.outline.expect
+++ b/pkg/front_end/testcases/bug30695.dart.outline.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Warning: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^
+// pkg/front_end/testcases/bug30695.dart:6:7: Warning: This is the inherited member.
+//   var foo = 42;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/bug30695.dart.strong.expect b/pkg/front_end/testcases/bug30695.dart.strong.expect
index 070f366..1375e22 100644
--- a/pkg/front_end/testcases/bug30695.dart.strong.expect
+++ b/pkg/front_end/testcases/bug30695.dart.strong.expect
@@ -1,4 +1,13 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^
+// pkg/front_end/testcases/bug30695.dart:6:7: Error: This is the inherited member.
+//   var foo = 42;
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
 //   foo() => 42;
diff --git a/pkg/front_end/testcases/bug31124.dart.direct.expect b/pkg/front_end/testcases/bug31124.dart.direct.expect
index e470ed2..559f7d8 100644
--- a/pkg/front_end/testcases/bug31124.dart.direct.expect
+++ b/pkg/front_end/testcases/bug31124.dart.direct.expect
@@ -1,8 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/bug31124.dart:1:5: Error: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+
 library;
 import self as self;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/bug31124.dart:1:1: Error: Duplicated name: a
-var a = () => 'b';a();
-^";
-}
+static field dynamic a;
diff --git a/pkg/front_end/testcases/bug31124.dart.direct.transformed.expect b/pkg/front_end/testcases/bug31124.dart.direct.transformed.expect
index e470ed2..b75686c 100644
--- a/pkg/front_end/testcases/bug31124.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug31124.dart.direct.transformed.expect
@@ -1,8 +1,15 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+
 library;
 import self as self;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/bug31124.dart:1:1: Error: Duplicated name: a
-var a = () => 'b';a();
-^";
-}
+static field dynamic a;
diff --git a/pkg/front_end/testcases/bug31124.dart.outline.expect b/pkg/front_end/testcases/bug31124.dart.outline.expect
index 59b88ac..ef07e67 100644
--- a/pkg/front_end/testcases/bug31124.dart.outline.expect
+++ b/pkg/front_end/testcases/bug31124.dart.outline.expect
@@ -1,5 +1,18 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/bug31124.dart:1:5: Error: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+
 library;
 import self as self;
 
 static field dynamic a;
-static abstract method a() → dynamic;
diff --git a/pkg/front_end/testcases/bug31124.dart.strong.expect b/pkg/front_end/testcases/bug31124.dart.strong.expect
index e470ed2..559f7d8 100644
--- a/pkg/front_end/testcases/bug31124.dart.strong.expect
+++ b/pkg/front_end/testcases/bug31124.dart.strong.expect
@@ -1,8 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/bug31124.dart:1:5: Error: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+
 library;
 import self as self;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/bug31124.dart:1:1: Error: Duplicated name: a
-var a = () => 'b';a();
-^";
-}
+static field dynamic a;
diff --git a/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect b/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
index e470ed2..b75686c 100644
--- a/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
@@ -1,8 +1,15 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+
 library;
 import self as self;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/bug31124.dart:1:1: Error: Duplicated name: a
-var a = () => 'b';a();
-^";
-}
+static field dynamic a;
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.expect b/pkg/front_end/testcases/bug32414a.dart.strong.expect
index 052c06d..bef880c 100644
--- a/pkg/front_end/testcases/bug32414a.dart.strong.expect
+++ b/pkg/front_end/testcases/bug32414a.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' 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'.
+//   b = 42;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.expect b/pkg/front_end/testcases/bug33298.dart.strong.expect
index e1f9aaf..5c96b04 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) → #lib1::C::call::T' can't be assigned to the parameter type '(dart.core::String) → dynamic'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::String) → dynamic'.
+//   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+//                                            ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
index d17f162..199b7b0 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Warning: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   x as lib.C;
+//        ^^^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
index 9360419..8ec92a4 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   x as lib.C;
+//        ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
index 9360419..102d021 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
index 8fa0c48..c56363b 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Warning: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   print(x is lib.C);
+//              ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
index 75dd8d4..03bc9f5 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   print(x is lib.C);
+//              ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
index 75dd8d4..1d4f45e 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
index fe4fe2e..23dbb5f 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Warning: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   lib.C x = null;
+//   ^^^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
index 98139b2..f05771b 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   lib.C x = null;
+//   ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
index 98139b2..a29a189 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
index 6bcb407..47de836 100644
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
+++ b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
+// Specify the type explicitly.
+//   C._circular(this.f);
+//   ^^^^^^^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect
index 6bcb407..1d27680 100644
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
index 7b807bd..0e2fda7 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
@@ -1,8 +1,38 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:7: Error: Previous declaration of 'A'.
+// class A {
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:9: Error: Duplicated name: A
-class A {
-        ^";
+class A extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
 }
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
index 7b807bd..a2f8868 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
@@ -1,8 +1,25 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:9: Error: Duplicated name: A
-class A {
-        ^";
+class A extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
 }
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect
index 2b25f5b..c818405 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect
@@ -1,3 +1,16 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:7: Error: Previous declaration of 'A'.
+// class A {
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,7 +23,5 @@
   synthetic constructor •() → void
     ;
 }
-static method A() → dynamic
-  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect
index 7b807bd..0e2fda7 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect
@@ -1,8 +1,38 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:7: Error: Previous declaration of 'A'.
+// class A {
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:9: Error: Duplicated name: A
-class A {
-        ^";
+class A extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
 }
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
index 7b807bd..a2f8868 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
@@ -1,8 +1,25 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:9: Error: Duplicated name: A
-class A {
-        ^";
+class A extends core::Object {
+  const constructor •() → void
+    : super core::Object::•()
+    ;
 }
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 8f7efbe..44960a5 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -8,9 +8,8 @@
 
 DeltaBlue: Fail # Fasta and dartk disagree on static initializers
 ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-bug31124: RuntimeError # Test has an intentional error
+bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
 call: Fail # Test can't run.
-co19_language_metadata_syntax_t04: RuntimeError # Fasta doesn't recover well
 constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
 external_import: RuntimeError # Expected -- test uses import which doesn't exist.
 fallthrough: Fail # Missing FallThroughError.
@@ -20,14 +19,12 @@
 inference/constructors_too_many_positional_arguments: Fail
 inference/downwards_inference_annotations_locals: Fail # Issue #30031
 inference/future_then_explicit_future: Fail
-inference/generic_methods_infer_js_builtin: Fail
+inference/generic_methods_infer_js_builtin: RuntimeError # Test attempts to access platform-private library leading to NSM.
 inference/infer_assign_to_index: Fail
 inference/infer_assign_to_property: Fail
 inference/infer_assign_to_property_custom: Fail
 inference/infer_type_cast: Fail
 inference/infer_typed_list_literal: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: RuntimeError
 instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # May be related to Issue 33479
@@ -99,8 +96,8 @@
 redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
 redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
 regress/issue_29975: Fail # Issue 29975.
-regress/issue_29976: RuntimeError # Issue 29976.
-regress/issue_29982: Fail # Issue 29982.
+regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_30836: RuntimeError # Issue 30836.
 regress/issue_32972: RuntimeError
 regress/issue_33452: RuntimeError # Test has an intentional error
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect b/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
index 9bb081d..b589a24 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
 // Try to have all constructors eventually redirect to a non-redirecting constructor.
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
index 9bb081d..765d352 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
 // Try to have all constructors eventually redirect to a non-redirecting constructor.
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.strong.expect b/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
index 9bb081d..b589a24 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
 // Try to have all constructors eventually redirect to a non-redirecting constructor.
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
index 9bb081d..765d352 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
 // Try to have all constructors eventually redirect to a non-redirecting constructor.
diff --git a/pkg/front_end/testcases/cycles.dart.direct.expect b/pkg/front_end/testcases/cycles.dart.direct.expect
index 25d9423..ca01a6a 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.expect
@@ -1,4 +1,18 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
+// class C extends B implements D {}
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
 // class A implements C {}
diff --git a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
index 25d9423..4f1f53a 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
 // class A implements C {}
diff --git a/pkg/front_end/testcases/cycles.dart.outline.expect b/pkg/front_end/testcases/cycles.dart.outline.expect
index 9c6a6f2..1c9d1e5 100644
--- a/pkg/front_end/testcases/cycles.dart.outline.expect
+++ b/pkg/front_end/testcases/cycles.dart.outline.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
+// class C extends B implements D {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect
index 8e7b027..1f6def8 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Warning: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
+// bad(d.C x) {}
+//     ^^^
+
 library;
 import self as self;
 import "./deferred_lib.dart" as def;
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
index c92a44c..8a311e1 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
+// bad(d.C x) {}
+//     ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
index c92a44c..61ff935 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
 // Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart b/pkg/front_end/testcases/duplicated_declarations.dart
new file mode 100644
index 0000000..d971623
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef Typedef = void Function();
+
+typedef Typedef = Object Function();
+
+typedef void OldTypedef();
+
+typedef Object OldTypedef();
+
+var field = "1st";
+
+var field = "2nd";
+
+main() {
+  "1st";
+}
+
+main() {
+  "2nd";
+}
+
+foo() {
+  main();
+  print(field);
+  C.s();
+}
+
+class C {
+  C(a);
+  C(a, b);
+  var field = "1st";
+
+  var field = "2nd";
+
+  m() {
+    "1st";
+  }
+
+  m() {
+    "2nd";
+  }
+
+  static s() {
+    "1st";
+  }
+
+  static s() {
+    "2nd";
+  }
+
+  static f() => s;
+}
+
+class Sub extends C {
+  Sub() : super(null);
+  m() => super.m();
+}
+
+class C {
+  C._();
+}
+
+enum Enum {
+  Enum,
+  a,
+  a,
+  b,
+}
+
+enum Enum {
+  a,
+  b,
+  c,
+}
+
+enum AnotherEnum {
+  a,
+  b,
+  c,
+  _name,
+  index,
+  toString,
+  values,
+}
+
+useAnotherEnum() {
+  <String, Object>{
+    "AnotherEnum.a": AnotherEnum.a,
+    "AnotherEnum.b": AnotherEnum.b,
+    "AnotherEnum.c": AnotherEnum.c,
+    "AnotherEnum._name": AnotherEnum._name,
+    "AnotherEnum.index": AnotherEnum.index,
+    "AnotherEnum.toString": AnotherEnum.toString,
+    "AnotherEnum.values": AnotherEnum.values,
+  };
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect b/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
new file mode 100644
index 0000000..df7e42f
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
@@ -0,0 +1,325 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Error: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Error: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Error: Previous declaration of 'field'.
+// var field = "1st";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Error: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Error: Previous declaration of ''.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Error: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Error: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Error: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Error: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Error: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Error: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of '_name'.
+// enum AnotherEnum {
+//      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'index'.
+// enum AnotherEnum {
+//      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'toString'.
+// enum AnotherEnum {
+//      ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'values'.
+// enum AnotherEnum {
+//      ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+//   main();
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+//   print(field);
+//         ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+//   C.s();
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:58:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Sub() : super(null);
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:59:16: Warning: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+//     "AnotherEnum._name": AnotherEnum._name,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+//     "AnotherEnum.index": AnotherEnum.index,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+//     "AnotherEnum.toString": AnotherEnum.toString,
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+//     "AnotherEnum.values": AnotherEnum.values,
+//                                       ^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
+// class Sub extends C {
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C#1 extends core::Object {
+  constructor _() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic field;
+  constructor •(dynamic a) → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → void
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#1 extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+  main();
+  ^".call();
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+  print(field);
+        ^");
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+  C.s();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+    \"AnotherEnum.toString\": AnotherEnum.toString,
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
new file mode 100644
index 0000000..f583777
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
@@ -0,0 +1,169 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
+// class Sub extends C {
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C#1 extends core::Object {
+  constructor _() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic field;
+  constructor •(dynamic a) → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → void
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#1 extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+  main();
+  ^".call();
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+  print(field);
+        ^");
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+  C.s();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+    \"AnotherEnum.toString\": AnotherEnum.toString,
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
new file mode 100644
index 0000000..aa488b8
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
@@ -0,0 +1,188 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Error: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Error: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Error: Previous declaration of 'field'.
+// var field = "1st";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Error: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Error: Previous declaration of ''.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Error: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Error: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Error: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Error: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Error: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Error: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of '_name'.
+// enum AnotherEnum {
+//      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'index'.
+// enum AnotherEnum {
+//      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'toString'.
+// enum AnotherEnum {
+//      ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'values'.
+// enum AnotherEnum {
+//      ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
+// class Sub extends C {
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C#1 extends core::Object {
+  constructor _() → void
+    ;
+}
+class C extends core::Object {
+  field dynamic field;
+  constructor •(dynamic a) → void
+    ;
+  method m() → dynamic
+    ;
+  static method s() → dynamic
+    ;
+  static method f() → dynamic
+    ;
+}
+class Sub extends core::Object {
+  constructor •() → void
+    ;
+  method m() → dynamic
+    ;
+}
+class Enum#1 extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic
+  ;
+static method foo() → dynamic
+  ;
+static method useAnotherEnum() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
new file mode 100644
index 0000000..7e56c2c
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
@@ -0,0 +1,334 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Error: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Error: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Error: Previous declaration of 'field'.
+// var field = "1st";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Error: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Error: Previous declaration of ''.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Error: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Error: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Error: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Error: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Error: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Error: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of '_name'.
+// enum AnotherEnum {
+//      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'index'.
+// enum AnotherEnum {
+//      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'toString'.
+// enum AnotherEnum {
+//      ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'values'.
+// enum AnotherEnum {
+//      ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+//   main();
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+//   print(field);
+//         ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+//   C.s();
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:58:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Sub() : super(null);
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:59:16: Error: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+//     "AnotherEnum._name": AnotherEnum._name,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+//     "AnotherEnum.index": AnotherEnum.index,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+//     "AnotherEnum.toString": AnotherEnum.toString,
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+//     "AnotherEnum.values": AnotherEnum.values,
+//                                       ^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:58:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Sub() : super(null);
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:59:16: Error: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C#1 extends core::Object {
+  constructor _() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic field;
+  constructor •(dynamic a) → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → void
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#1 extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → void
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int index, core::String _name) → void
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+  main();
+  ^".call();
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+  print(field);
+        ^");
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+  C.s();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+    \"AnotherEnum.toString\": AnotherEnum.toString,
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.strong.transformed.expect b/pkg/front_end/testcases/duplicated_declarations.dart.strong.transformed.expect
new file mode 100644
index 0000000..a61366d
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.strong.transformed.expect
@@ -0,0 +1,76 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: Duplicated definition of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: Duplicated definition of 'OldTypedef'.
+// typedef Object OldTypedef();
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: Duplicated definition of 'field'.
+// var field = "2nd";
+//     ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: Duplicated definition of 'main'.
+// main() {
+// ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: Duplicated definition of ''.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: Duplicated definition of 'field'.
+//   var field = "2nd";
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: Duplicated definition of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: Duplicated definition of 's'.
+//   static s() {
+//          ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C extends core::Object {
+  field dynamic field = null;
+  constructor •(dynamic a) → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: 's' is already declared in this scope.
+  static f() => s;
+                ^";
+}
+class Sub extends self::C {
+  constructor •() → void
+    : super self::C::•(null)
+    ;
+  method m() → dynamic
+    return super.{self::C::m}();
+}
+static field dynamic field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: 'main' is already declared in this scope.
+  main();
+  ^".call();
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: 'field' is already declared in this scope.
+  print(field);
+        ^");
+  self::C::s();
+}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
index e95737c..b9f36ee 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
+//   C.m(a: 1, a: 2, a: 3);
+//             ^
+//
+// pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
+//   C.m(a: 1, a: 2, a: 3);
+//                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
index e95737c..b9f36ee 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
+//   C.m(a: 1, a: 2, a: 3);
+//             ^
+//
+// pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
+//   C.m(a: 1, a: 2, a: 3);
+//                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.direct.expect b/pkg/front_end/testcases/dynamic_and_void.dart.direct.expect
index 4b7b5f6..aad29f6 100644
--- a/pkg/front_end/testcases/dynamic_and_void.dart.direct.expect
+++ b/pkg/front_end/testcases/dynamic_and_void.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/dynamic_and_void.dart:12:27: Warning: Type 'dynamic' not found.
+// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
+//                           ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect b/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect
index 61f4199..3b6e18a 100644
--- a/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect
+++ b/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/dynamic_and_void.dart:12:27: Warning: Type 'dynamic' not found.
+// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
+//                           ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/expression/class_type_param_circular_reference.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_circular_reference.expression.yaml
new file mode 100644
index 0000000..086d26f
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_type_param_circular_reference.expression.yaml
@@ -0,0 +1,9 @@
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#MiddlewareApi"
+expression: |
+  toString()
diff --git a/pkg/front_end/testcases/expression/class_type_param_circular_reference.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_circular_reference.expression.yaml.expect
new file mode 100644
index 0000000..e380b76
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_type_param_circular_reference.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return this.{dart.core::Object::toString}();
\ No newline at end of file
diff --git a/pkg/front_end/testcases/expression/main.dart b/pkg/front_end/testcases/expression/main.dart
index 66153cb..a889b39 100644
--- a/pkg/front_end/testcases/expression/main.dart
+++ b/pkg/front_end/testcases/expression/main.dart
@@ -48,6 +48,13 @@
   }
 }
 
+abstract class Built<V extends Built<V, B>, B extends Builder<V, B>> {}
+
+abstract class Builder<V extends Built<V, B>, B extends Builder<V, B>> {}
+
+class MiddlewareApi<State extends Built<State, StateBuilder>,
+    StateBuilder extends Builder<State, StateBuilder>> {}
+
 main() {
   exit(0);
 }
diff --git a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
index 285eca0..b18dd26 100644
--- a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return main::hasBound<main::debugExpr::T>();
+  return main::hasBound<#lib1::debugExpr::T>();
diff --git a/pkg/front_end/testcases/expressions.dart.direct.expect b/pkg/front_end/testcases/expressions.dart.direct.expect
index 7fece02..158f1ec 100644
--- a/pkg/front_end/testcases/expressions.dart.direct.expect
+++ b/pkg/front_end/testcases/expressions.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/expressions.dart:74:16: Warning: Method not found: 'int.toString'.
+//     print(int?.toString());
+//                ^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/expressions.dart.direct.transformed.expect b/pkg/front_end/testcases/expressions.dart.direct.transformed.expect
index 7fece02..04022a3 100644
--- a/pkg/front_end/testcases/expressions.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/expressions.dart.direct.transformed.expect
@@ -42,7 +42,7 @@
   core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
   core::print(new core::Object::•());
   core::print(const core::Object::•());
-  core::print(core::List::•<core::String>(2).runtimeType);
+  core::print(core::_List::•<core::String>(2).runtimeType);
   self::foo(fisk: "Blorp gulp");
   function f() → dynamic {
     core::print("f was called");
diff --git a/pkg/front_end/testcases/expressions.dart.strong.expect b/pkg/front_end/testcases/expressions.dart.strong.expect
index ccd9621..264936d 100644
--- a/pkg/front_end/testcases/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/expressions.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
+//     print(int?.toString());
+//                ^^^^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
 //     print(int?.toString());
diff --git a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
index 8f2bfb4..aa3ea16 100644
--- a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
 //     print(int?.toString());
@@ -48,7 +48,7 @@
   core::print(let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3);
   core::print(new core::Object::•());
   core::print(const core::Object::•());
-  core::print(core::List::•<core::String>(2).{core::Object::runtimeType});
+  core::print(core::_List::•<core::String>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
   function f() → core::Null {
     core::print("f was called");
diff --git a/pkg/front_end/testcases/function_type_recovery.dart.outline.expect b/pkg/front_end/testcases/function_type_recovery.dart.outline.expect
index 9081604..244b4eb 100644
--- a/pkg/front_end/testcases/function_type_recovery.dart.outline.expect
+++ b/pkg/front_end/testcases/function_type_recovery.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/function_type_recovery.dart:8:31: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+// typedef F = int Function(int f(String x));
+//                               ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
index f2605ca..1364b6c 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
 //   var x = void f<T>(T t) {};
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
index f2605ca..72e3e66 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
 //   var x = void f<T>(T t) {};
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
index 8c8bdd6..0fbf026 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
 //   var x = void f<T>(T t) {};
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
index 8c8bdd6..0f485bc 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
 //   var x = void f<T>(T t) {};
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
index b4865bb..246c806 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
 //   print(void f() {});
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
index b4865bb..1cf55b6 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
 //   print(void f() {});
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
index 1bb53e4..eb14ed2 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
 //   print(void f() {});
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
index 1bb53e4..546d092 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
 //   print(void f() {});
diff --git a/pkg/front_end/testcases/implicit_new.dart.direct.expect b/pkg/front_end/testcases/implicit_new.dart.direct.expect
index 4262af7..8e0c23c 100644
--- a/pkg/front_end/testcases/implicit_new.dart.direct.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.direct.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/implicit_new.dart:19:10: Warning: Method not found: 'Bar'.
+//   prefix.Bar();
+//          ^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.expect b/pkg/front_end/testcases/implicit_new.dart.strong.expect
index 0326d11..721c891 100644
--- a/pkg/front_end/testcases/implicit_new.dart.strong.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/implicit_new.dart:19:10: Error: Method not found: 'Bar'.
+//   prefix.Bar();
+//          ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
 //   var y = prefix.Bar();
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
index 0326d11..0cdd17e 100644
--- a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
 //   var y = prefix.Bar();
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
index 4624781..8f3319f 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/abstract_class_instantiation.dart:15:27: Warning: The class 'C' is abstract and can't be instantiated.
+//   var /*@type=C*/ x = new C();
+//                           ^
+//
+// pkg/front_end/testcases/inference/abstract_class_instantiation.dart:16:50: Warning: The class 'D' is abstract and can't be instantiated.
+//   var /*@type=D<int>*/ y = new /*@typeArgs=int*/ D(1);
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/abstract_class_instantiation.dart:17:48: Warning: The class 'D' is abstract and can't be instantiated.
+//   D<List<int>> z = new /*@typeArgs=List<int>*/ D(/*@typeArgs=int*/ []);
+//                                                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
index 644c45e..f258371 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' 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'.
+//     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
+//                                             ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
index 5e2379c..30ce298 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:35:44: Warning: Must explicitly return a value from a non-void function.
+//       /*@warning=ReturnWithoutExpression*/ return;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:65:44: Warning: Must explicitly return a value from a non-void function.
+//       /*@warning=ReturnWithoutExpression*/ return;
+//                                            ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect
index 5d462fc..3ed3a13 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/call_corner_cases.dart:27:69: Error: 'fieldB' isn't a function or method and can't be invoked.
+//   var /*@type=dynamic*/ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/call_corner_cases.dart:28:65: Error: 'getB' isn't a function or method and can't be invoked.
+//   var /*@type=dynamic*/ callGetB = new D(). /*@target=D::getB*/ getB();
+//                                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
index 147f052..708cd81 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
 // abstract class A extends B {
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
index 147f052..011cb62 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
 // abstract class A extends B {
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
index 0f349ae..3c9369a 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
index 147f052..708cd81 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
 // abstract class A extends B {
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
index 147f052..011cb62 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
 // abstract class A extends B {
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
index 77eedf0..a71159f 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
index 77eedf0..adfe785 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
index 83cae8a..3bf5411 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
index 83cae8a..6ac80a6 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
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 c37d0e9..a51a200 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,4 +1,48 @@
-// Errors:
+// Formatted problems:
+//
+// 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*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
+//                                                                                                                                                                   ^
+//
+// 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*/ /*@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:17:12: Error: This is the overridden method ('a').
+//   final I1 a = null;
+//            ^
+//
+// 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:21:12: Error: This is the overridden method ('a').
+//   final I2 a = null;
+//            ^
+//
+// 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:21:12: Error: This is the overridden method ('a').
+//   final I2 a = null;
+//            ^
+//
+// 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 =>
+//                                                                                                                                                                   ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Error: This is the overridden method ('a').
+//   final I1 a = null;
+//            ^
+
+// Unhandled errors:
 //
 // 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.
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 746541f..920dfc8 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,4 +1,27 @@
-// Errors:
+// Formatted problems:
+//
+// 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*/ /*@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:22:12: Error: This is the overridden method ('a').
+//   final I1 a = null;
+//            ^
+//
+// 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 =>
+//                                                                                                                                                                   ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Error: This is the overridden method ('a').
+//   final I2 a = null;
+//            ^
+
+// Unhandled errors:
 //
 // 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.
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index e3df93c..09066dc 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' 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'.
+//   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
+//                                                        ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
index 5808a55..1d034f2 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' 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'.
+//   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
+//                                                        ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
index 3374e4c..c4053e2 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
+// Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
+//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
+//                                                                                                              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
 // Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
index 3374e4c..33b8e13 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
 // Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
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 d3420e5..a17cf91 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,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// 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;
+//                                                 ^
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:9:13: Error: This is the overridden method ('x').
+//   final int x = 2;
+//             ^
+
+// Unhandled 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.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
index a31f14b..1789c32 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' 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'.
+//   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
+//                                                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
index 8248a92..f2e2c5c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
@@ -1,3 +1,55 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' 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'.
+//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' 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'.
+//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
index 7c0032b..cb21af9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
@@ -1,3 +1,55 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' 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'.
+//   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' 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'.
+//   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' 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'.
+//   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' 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'.
+//   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' 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'.
+//   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 81fd737..6b359eb 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -1,3 +1,60 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) → dart.core::String' can't be assigned to a variable of type '(dart.core::int) → dart.core::String'.
+// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::String'.
+//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
+//                                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' 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'.
+//         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
+//                                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' 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'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' 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'.
+//             3;
+//             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' 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'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' 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'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ x;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) → dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) → dart.core::List<dart.core::String>'.
+// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::List<dart.core::String>'.
+//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' 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'.
+//               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                          ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' 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'.
+//         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' 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'.
+//             x;
+//             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'substring'.
+//             .substring(3);
+//              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
index bd656ad..bc0d5a9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
@@ -1,3 +1,55 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' 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'.
+//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' 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'.
+//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' 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'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' 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'.
+//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index c873221..302c6ca 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -1,3 +1,60 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) → dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::String'.
+// Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::String'.
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' 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'.
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' 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'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' 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'.
+//         3;
+//         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' 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'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' 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'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ x;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) → dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::List<dart.core::String>'.
+// Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::List<dart.core::String>'.
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' 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'.
+//           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' 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'.
+//         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' 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'.
+//         x;
+//         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'substring'.
+//         .substring(3);
+//          ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
index 32aa1b3..5c41272 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
@@ -1,3 +1,130 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+// Change the type of the object being constructed or the context in which it is used.
+//         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, "hello");
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+// Change the type of the object being constructed or the context in which it is used.
+//         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+//         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>("hello", 3);
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+//         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+//     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
+//                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+//     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
+//                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+//         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>("hello");
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+//         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' 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'.
+//           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' 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'.
+//           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
index 56be18e..49c6469 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
@@ -1,3 +1,70 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
+//                                                                                         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                                                         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' 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'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                                                         ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
index 58ac3bf..c422b68 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
@@ -1,3 +1,85 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' 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'.
+//       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' 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'.
+//           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' 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'.
+//       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' 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'.
+//       "hello": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": 3
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// Change the type of the map literal or the context in which it is used.
+//     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// Change the type of the map literal or the context in which it is used.
+//     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// Change the type of the map literal or the context in which it is used.
+//     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' 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'.
+//       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' 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'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' 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'.
+//           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                                                       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
index 5b85710..3c303a7 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
@@ -64,7 +64,7 @@
         [yield] true;
       }
       {
-        :iterator.{core::_SyncIterator::_current} = core::List::•<dynamic>();
+        :iterator.{core::_SyncIterator::_current} = core::_GrowableList::•<dynamic>(0);
         [yield] true;
       }
       {
@@ -72,7 +72,7 @@
         [yield] true;
       }
       {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::List::•<dynamic>();
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::•<dynamic>(0);
         [yield] true;
       }
     }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index a5a751e..48fb3e0 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
+//                                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};
+//                                                                         ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
index 1081803..d424341 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+//       d. /*@target=Object::hashCode*/ hashCode();
+//                                       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index 8c13443..c8c5654 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+//   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+//                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index 5983869..8c60a46 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.
+//   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+//                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index a6d1069..64a5480 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+//   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+//                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index 732664a..dade3e7 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
+// Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+//         new /*@typeArgs=int*/ Future.value('hi'));
+//                                            ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index 86a7783..5b56228 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
+// Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+//         new /*@typeArgs=int*/ Future.value('hi'));
+//                                            ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index b5c11d3..107dc5a3 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -1,3 +1,35 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//       /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//       /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
+//       /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
+//       /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hi",
+//                                              ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "there"));
+//                                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
index 5d1b277..a521d4f 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
@@ -1,4 +1,25 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+// /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
+//                                                                ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Error: This is the overridden method ('m').
+//   T m<T>(T x) => x;
+//     ^
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).
+// Change to a subtype of test::C::m::T.
+// /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
+//                                                                ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Error: This is the overridden method ('m').
+//   T m<T>(T x) => x;
+//     ^
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:21:106: Error: Expected 0 type arguments.
+//       . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D::m*/ /*@error=TypeArgumentMismatch*/ m<
+//                                                                                                          ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
index 9a823d0..f83fd7b 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' 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'.
+//           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
+//                                                                            ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
index f688995..b77c625 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
@@ -1,3 +1,19 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Warning: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
+//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Warning: This is the overridden method ('m').
+//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
+//                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Warning: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
+//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
+//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Warning: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
index 46b8e3f..c5fed39 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
@@ -1,4 +1,36 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
+//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Error: This is the overridden method ('m').
+//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
+//                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).
+// Change to a supertype of dynamic (or, for a covariant parameter, a subtype).
+//           T /*@error=OverrideTypeMismatchParameter*/ x) =>
+//                                                      ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Error: This is the overridden method ('m').
+//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
+//                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
+//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
+//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Error: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).
+// Change to a supertype of dart.core::int (or, for a covariant parameter, a subtype).
+//           T /*@error=OverrideTypeMismatchParameter*/ x) =>
+//                                                      ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Error: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index 4c1af02..fe2ca89 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -1,3 +1,35 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) → dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) → dart.core::int'.
+//       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
+//                                                                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) → dart.core::double'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) → dart.core::double'.
+//       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
+//                                                                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) → dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) → dart.core::int'.
+//   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) → dart.core::double'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) → dart.core::double'.
+//   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) → dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) → dart.core::int'.
+//           . /*@target=C::m*/ m);
+//                              ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) → dart.core::double'.
+// Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) → dart.core::double'.
+//           . /*@target=C::m*/ m);
+//                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect
index 2d25757..5b0e517 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect
@@ -1,6 +1,38 @@
-library;
-import self as self;
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:11:43: Warning: Method not found: 'JS'.
+//   String x = /*error:INVALID_ASSIGNMENT*/ JS('int', '42');
+//                                           ^^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:12:28: Warning: Method not found: 'JS'.
+//   var /*@type=String*/ y = JS('String', '"hello"');
+//                            ^^
 
-static method #main() → dynamic {
-  throw "dart:_foreign_helper: Error: Not found: dart:_foreign_helper.";
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::String x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  y = "world";
+  y = 42;
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.transformed.expect
new file mode 100644
index 0000000..89adde8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::String x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  y = "world";
+  y = 42;
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.outline.expect
new file mode 100644
index 0000000..ce6b792
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.outline.expect
@@ -0,0 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
index 032f49a..8bb727b 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' 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'.
+//           1.0);
+//           ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 0af21f3..80c8abf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'dart.async::FutureOr<dart.core::String>'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
+//                                                                                                                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type '(dart.core::String, dart.core::int) → dart.core::String' can't be assigned to the parameter type '(dart.async::FutureOr<dart.core::String>, dart.core::int) → dart.async::FutureOr<dart.core::String>'.
+// Try changing the type of the parameter, or casting the argument to '(dart.async::FutureOr<dart.core::String>, dart.core::int) → dart.async::FutureOr<dart.core::String>'.
+//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
+//                                                                                                            ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index cdf4cc7..9eca0a5 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' 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'.
+//   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
+//                                                              ^
+//
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' 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'.
+//   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
+//                                                              ^
+//
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' 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'.
+//   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
+//                                                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
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 ec15c8d..983f71c 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,4 +1,69 @@
-// Errors:
+// Formatted problems:
+//
+// 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*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// 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*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+//                                                                                                                                                                   ^
+//
+// 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*/ /*@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:9:11: Error: This is the overridden method ('x').
+//   int get 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:17:11: Error: This is the overridden method ('x').
+//   num get 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:9:11: Error: This is the overridden method ('x').
+//   int get 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:21:14: Error: This is the overridden method ('x').
+//   double get 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:17:11: Error: This is the overridden method ('x').
+//   num get 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;
+//                                                                                                                                                                   ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Error: This is the overridden method ('x').
+//   double get x;
+//              ^
+
+// Unhandled errors:
 //
 // 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.
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
index 8876de4..6859457 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Warning: Getter not found: 'x'.
+// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Warning: Getter not found: 'x'.
+//   /*error:UNDEFINED_IDENTIFIER*/ x
+//                                  ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 5d55e92..2d9e2de 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -1,4 +1,74 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
+// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
+//   /*error:UNDEFINED_IDENTIFIER*/ x
+//                                  ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+//   a = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+//   b = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
+//   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
+//   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.
+//   d = /*error:INVALID_ASSIGNMENT*/ 3;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+//   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' 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'.
+//   f = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' 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'.
+//   g = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+//   h = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+//   j = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+//   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
+//                                                          ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
 // var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index fa5b98d..579e8e2 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
 // var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index 8b50c96..7e3bee0 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' 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'.
+//   x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' 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'.
+//   y = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+
 library test;
 import self as self;
 import "./infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index ea8e666..7090357 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' 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'.
+//   A.x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' 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'.
+//   B.y = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
index 9071805..e5b0d6e 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
@@ -1,3 +1,16 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Warning: Method not found: 'g'.
+//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                          ^
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+//   g() => 0;
+//   ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Previous use of 'g'.
+//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                          ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
index c939a0a..12d4a27 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
@@ -1,4 +1,17 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
+//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                          ^
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+//   g() => 0;
+//   ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Previous use of 'g'.
+//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                          ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
 //   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect
index c939a0a..dc3bf25 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
 //   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
index 80a5e2b..25d9b0f 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
+//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
+//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Warning: This is the overridden method ('f').
+//   int f(int x);
+//       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
index f5fbe09..b2900dc 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
+//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
+//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Warning: This is the overridden method ('f').
+//   int f(int x);
+//       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
index 56fdbc9..09b21ca 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -1,4 +1,28 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.
+// Specify the type explicitly.
+//       /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
+// Specify the type explicitly.
+//       {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
+//                                                                                ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
+// Specify the type explicitly.
+//       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
+//                                                                                ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
+//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
+//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Error: This is the overridden method ('f').
+//   int f(int x);
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
index 35575d7..6b24c06 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' 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'.
+//   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
+//                                                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
index e45a825..3d2ac1b 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' 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'.
+//   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
+//                                                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
index 693987c..67fece6 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' 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'.
+//   x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
index f42a486..71ad907 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' 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'.
+//   x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
index 4296aaf..bea0734 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' 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'.
+//     a = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' 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'.
+//     b = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' 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'.
+//     c = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
index 1da00c1..21d3ddd 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' 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'.
+//   a = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' 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'.
+//   b = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' 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'.
+//   c = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 3344f00..eed50dc 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' 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'.
+//   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
+//                                                                     ^
+
 library test;
 import self as self;
 import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
index cc75323..5e68253 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' 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'.
+//   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
+//                                                                     ^
+
 library;
 import self as self;
 import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index 22a1397..61cebb7 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' 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'.
+//   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
+//                                                              ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' 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'.
+//   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
+//                                                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
index efe5253..93b9420 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' 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'.
+//   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
+//                                                                          ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
index 5c0a1e4..2ad57bf 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' 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'.
+//       . /*@target=B::m*/ m(null, null);
+//                          ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index e92f2a3..e7c2714 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' 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'.
+//       . /*@target=A::value*/ value;
+//                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index 83c90ce..eae7652 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' 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'.
+//       . /*@target=A::value*/ value;
+//                              ^
+
 library;
 import self as self;
 import "dart:core" as core;
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 9b83615..3bc8090 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,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// 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;
+//                                                 ^
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Error: This is the overridden method ('x').
+//   final T x = null;
+//           ^
+
+// Unhandled 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.
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 f79f8f4..c82d4fe 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
@@ -1,3 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' 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'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' 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'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: 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'.
+//     String y = /*error:INVALID_ASSIGNMENT*/ x;
+//                                             ^
+//
+// 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 variable.
+//   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
+//               ^
+//
+// 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) {
+//                                                                    ^
+
 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_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index a915514..c7b0dde 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
@@ -1,3 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' 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'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' 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'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: 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'.
+//     String y = /*error:INVALID_ASSIGNMENT*/ x;
+//                                             ^
+//
+// 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 variable.
+//   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
+//                     ^
+//
+// 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) {
+//                                                                          ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index fcd2925..f4c80be 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' 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'.
+//   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
+//                                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index 0ef38ce..1cd0d49 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+//   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index f2f1e31..dadf046 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+//   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
+// Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+//   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                        ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
index 08af811..2841354 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) → dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
+//     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
+//                                    ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index e539f33..82c5211 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -1,3 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' 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'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' 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'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
+//                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' 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'.
+//   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+//   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                             ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index af7a290..358d35f 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -1,3 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' 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'.
+//   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' 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'.
+//   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' 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'.
+//   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+//   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+//   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
index 5f6695d..29c18e5 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
index 6f5d53c..632df5b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index 79c34df..8408785 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index 5f6695d..29c18e5 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
index be9b974..baad424 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
index 940281a..7287640 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
index 9c4a906..193de30 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
index be9b974..baad424 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
index 9d11b4f..87ea24c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
index 69991d5..9dee1ed 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index 558e05a..53cd60a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index 9d11b4f..87ea24c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
index a944e9f..037f589 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
index 7c37439..55e34e4 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index 0486b4b..f54fe8d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index a944e9f..037f589 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+//                                      ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
 // class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
index 6ed5cbf..592da28 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' 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'.
+//   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                                         ^
+//
+// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' 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'.
+//   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                                         ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
index 48cc6c8..0a6b99f 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
+//   void set x() {}
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
index d34e8a8..0b9f2cd 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
+//   void set x() {}
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
index c48a4c4..baf4a8c 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) → dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
+//   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
+//                                  ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
index 7b6dfaa..80fb1bd 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Warning: Superclass has no method named 'foo'.
+//     var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:13:38: Warning: Superclass has no getter named 'bar'.
+//     var /*@type=dynamic*/ v2 = super.bar;
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:14:37: Warning: Superclass has no method named '[]'.
+//     var /*@type=dynamic*/ v3 = super[0];
+//                                     ^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:15:38: Warning: Superclass has no setter named 'bar'.
+//     var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Warning: Superclass has no method named '[]='.
+//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
+//                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
index 2fff017..f9ec341 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
@@ -1,4 +1,26 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Error: Superclass has no method named 'foo'.
+//     var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:13:38: Error: Superclass has no getter named 'bar'.
+//     var /*@type=dynamic*/ v2 = super.bar;
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:14:37: Error: Superclass has no method named '[]'.
+//     var /*@type=dynamic*/ v3 = super[0];
+//                                     ^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:15:38: Error: Superclass has no setter named 'bar'.
+//     var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
+//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
+//                                     ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Error: Superclass has no method named 'foo'.
 //     var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
index 84e190d..fcb3945 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
@@ -8,3 +8,4 @@
 List<T> f<T>(T g()) => <T>[g()];
 var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
 
+main() {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
index 999be87..3cdb4282 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
@@ -1,6 +1,36 @@
-library;
-import self as self;
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                       ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                        ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Warning: Getter not found: ''.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                        ^
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: Unexpected token '>'.\nvar /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });\n                                      ^";
-}
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                       ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                        ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v = self::f.<(dynamic).>(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect
new file mode 100644
index 0000000..1b87566
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                       ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                        ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v = self::f.<(dynamic).>(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
new file mode 100644
index 0000000..03bbeef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
@@ -0,0 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                       ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                        ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Warning: Getter not found: ''.
+// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+//                                        ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v;
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
index 48fff69a..761fe2a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
@@ -8,3 +8,4 @@
 List<T> f<T>(T g()) => <T>[g()];
 var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
 
+main() {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
index f26e722..461a75a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
@@ -1,6 +1,36 @@
-library;
-import self as self;
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                   ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                    ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Warning: Getter not found: ''.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                    ^
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: Unexpected token '>'.\nvar /*@topType=dynamic*/v = (f<int>)(() { return 1; });\n                                  ^";
-}
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                   ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                    ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v = self::f.<(core::int).>(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect
new file mode 100644
index 0000000..2af1d54
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                   ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                    ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v = self::f.<(core::int).>(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
new file mode 100644
index 0000000..88141c9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
@@ -0,0 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: An equality expression can't be an operand of another equality expression.
+// Try re-writing the expression.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                   ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                    ^
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Warning: Getter not found: ''.
+// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+//                                    ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v;
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
index fb9dc87..6de5297 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
index fb9dc87..08a2efb 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
index 4d4101b..5820a4e 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
+//                                                                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
index 4d4101b..085c83e 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
index 0454a7c..4722264 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
+//                                                                     ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
index 0454a7c..9862ea2 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
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 9e2999f..ac08e1d 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
@@ -1,3 +1,21 @@
+// Formatted problems:
+//
+// 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) {}
+//                                                     ^
+//
+// 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) {}
+//                                                           ^
+//
+// 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) {}
+//                                                 ^
+//
+// 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) {}
+//                                                       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
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 9ac5ea0..b31b52c 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
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// 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) {}
+//                                                       ^
+//
+// 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) {}
+//                                                             ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
index d231fbe..8d562e5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
@@ -1,3 +1,40 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//     var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+//                                                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//     var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
+//                             ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//     var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+//                                                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
+//                                ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+//                                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index 06f2a25..aa0ec5f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -1,3 +1,40 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//     var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
+//                                                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//     var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
+//                             ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//     var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
+//                                                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
+//                                ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' 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'.
+//     var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
+//                                                                 ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
index abc6e6b..907b43b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
@@ -1,3 +1,40 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//   var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+//                                                        ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//   var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
+//                           ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+//   var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+//                                                        ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' 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'.
+//   var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+//                                                           ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' 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'.
+//   var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+//                                                           ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' 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'.
+//   var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
+//                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' 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'.
+//   var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+//                                                           ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index c06c05f..d471225 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
+//                                     ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
+//                                        ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
+//                                                               ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
+//                                                               ^
+
 library test;
 import self as self;
 import "dart:core" as core;
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 dcef35c..d0acf00 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,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// 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;
+//                        ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Error: This is the overridden method ('x').
+//   void set x(double value);
+//            ^
+
+// Unhandled 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.
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 d765039..501efd7 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,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// 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;
+//                        ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Error: This is the overridden method ('x').
+//   void set x(num value);
+//            ^
+
+// Unhandled 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.
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
index db4967d..97e21fd 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
index db4967d..6485531 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 81e4b1f..eb2c4e2 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' 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'.
+// var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
+//                                                              ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
index 419ba0e..e40ce71 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
index 419ba0e..322965f 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
index d068e62..f4996ec 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
+// Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
+// var y = new B();
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
 // Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
index d068e62..66a3752 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
 // Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
index 964c88f..9385afe 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
@@ -1,4 +1,26 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//         ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:22: Error: Type 'U' is a bound of itself via 'Y', 'Z', 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//                      ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:42:28: Error: Type 'Y' is a bound of itself via 'Z', 'T', 'U'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//     X extends Function(V), Y extends Z, Z extends T> {}
+//                            ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:42:41: Error: Type 'Z' is a bound of itself via 'T', 'U', 'Y'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//     X extends Function(V), Y extends Z, Z extends T> {}
+//                                         ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
 // Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
index 964c88f..7e40579 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
 // Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
index c917def..96233c8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//         ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:22: Error: Type 'U' is a bound of itself via 'Y', 'Z', 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//                      ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:42:28: Error: Type 'Y' is a bound of itself via 'Z', 'T', 'U'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//     X extends Function(V), Y extends Z, Z extends T> {}
+//                            ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:42:41: Error: Type 'Z' is a bound of itself via 'T', 'U', 'Y'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//     X extends Function(V), Y extends Z, Z extends T> {}
+//                                         ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
index b442329..3722939 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
@@ -1,4 +1,26 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//         ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:22: Error: Type 'U' is a bound of itself via 'Y', 'Z', 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//                      ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:42:28: Error: Type 'Y' is a bound of itself via 'Z', 'T', 'U'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//     X extends Function(V), Y extends Z, Z extends T> {}
+//                            ^
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:42:41: Error: Type 'Z' is a bound of itself via 'T', 'U', 'Y'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//     X extends Function(V), Y extends Z, Z extends T> {}
+//                                         ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
 // Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
index b442329..d4f8227 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
 // Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
index 693def5..b7a35b1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:10:16: Error: Bound of this variable references variable 'TypeT' from the same declaration.
+// class A<TypeT, TypeS extends TypeT> {}
+//                ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'A' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
index 693def5..4bf21ae 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'A' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
index ba808e0..f8cdb5a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:9:16: Error: Bound of this variable references variable 'TypeT' from the same declaration.
+// class A<TypeT, TypeS extends TypeT> {}
+//                ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'A' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
index ba808e0..4ae9aec 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'A' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
index 6649d48..6269fa0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
@@ -1,4 +1,17 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// typedef Fisk = void Function<TypeY extends Hest>();
+//         ^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:30: Error: Bound of this variable references raw type 'Hest'.
+// typedef Fisk = void Function<TypeY extends Hest>();
+//                              ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Error: Bound of this variable references raw type 'Fisk'.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
index 6649d48..5d686fd 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
index af1c74a..1ac7a60 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
@@ -1,4 +1,17 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// typedef void Fisk<TypeY extends Hest>();
+//              ^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:19: Error: Bound of this variable references raw type 'Hest'.
+// typedef void Fisk<TypeY extends Hest>();
+//                   ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:8:12: Error: Bound of this variable references raw type 'Fisk'.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
index af1c74a..bd13c95 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
index 41104fc..178bf7a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
index 41104fc..f990bcc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
index 4163521..c4264ab 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//                                ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
index 4163521..f4b3391 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
index 2616a8e..60c725c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Map<Hest, Hest>> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
index 2616a8e..8073742 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
index 435843c..16965b6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//                                ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
index 435843c..05da9c9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
index a835974..7e93861 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'LinkedListEntry' here.
+// class Hest<X extends LinkedListEntry> {}
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'LinkedListEntry' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
index a835974..52cc742 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'LinkedListEntry' here.
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 c807c38..91a7c9c 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,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// 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)> {}
+//            ^^^^^
+
+// Unhandled 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)> {}
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 c807c38..b2e39a8 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,4 +1,4 @@
-// Errors:
+// Unhandled 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)> {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
index c4f448b..4cac409 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:8:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Fisk' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:10:12: Error: Bound of this variable references variable 'TypeY' from the same declaration.
+// class Fisk<TypeY extends Fisk<TypeY>> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
index c4f448b..7bb7234 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
index 6d5ff15..8e28663 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
@@ -1,4 +1,17 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// class Hest<TypeX extends lib.Hest> {}
+//       ^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:12: Error: Bound of this variable references raw type 'Hest'.
+// class Hest<TypeX extends lib.Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:16:12: Error: Bound of this variable references raw type 'Hest'.
+// class Hest<TypeY extends lib.Hest> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
index 6d5ff15..f8fe191 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
index 11e9935..03e702c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Map<Hest, Hest>> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
index 11e9935..26843e1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
index a7a478f..2331e87 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
index a7a478f..92649f4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
index 16fb364..e0630b5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:10:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
index 16fb364..f34f645 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'Hest' here.
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
index 32ac9fb..b20f7cd 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' 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'.
+//   i = /*@error=InvalidAssignment*/ s;
+//                                    ^
+//
+// pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' 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'.
+//   i ??= /*@error=InvalidAssignment*/ s;
+//                                      ^
+//
+// pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
+// Try changing the type of the left hand side, or casting the right hand side to '#lib1::A'.
+//   a /*@error=InvalidAssignment*/ += 1;
+//                                  ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
index 9c249ad..8f11e81 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
@@ -1,3 +1,50 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// Change the type of the list literal or the context in which it is used.
+//   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
+//                                                            ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// Change the type of the map literal or the context in which it is used.
+//   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
+//                                                                          ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// Change the type of the map literal or the context in which it is used.
+//   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
+//                                                                       ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) → dart.core::int' isn't of expected type '(dart.core::Object) → dart.core::int'.
+// Change the type of the function expression or the context in which it is used.
+//   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
+//                                                               ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+// Change the type of the object being constructed or the context in which it is used.
+//   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
+//                                           ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+// Change the type of the object being constructed or the context in which it is used.
+//   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
+//                                           ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) → void' that isn't of expected type '(dart.core::Object) → void'.
+// Change the type of the method or the context in which it is used.
+//       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
+//                                             ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) → void' that isn't of expected type '(dart.core::Object) → void'.
+// Change the type of the function or the context in which it is used.
+//       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
+//                                                  ^
+//
+// pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) → void' that isn't of expected type '(dart.core::Object) → void'.
+// Change the type of the function or the context in which it is used.
+//   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
+//                                                                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.expect b/pkg/front_end/testcases/magic_const.dart.direct.expect
index 2f1ef5a..d0beacd 100644
--- a/pkg/front_end/testcases/magic_const.dart.direct.expect
+++ b/pkg/front_end/testcases/magic_const.dart.direct.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// 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();
+//         ^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.expect b/pkg/front_end/testcases/magic_const.dart.strong.expect
index b47780b..1fdf754 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// 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();
+//         ^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/named_function_scope.dart b/pkg/front_end/testcases/named_function_scope.dart
index 010ffc7..97888e3 100644
--- a/pkg/front_end/testcases/named_function_scope.dart
+++ b/pkg/front_end/testcases/named_function_scope.dart
@@ -58,8 +58,8 @@
     // the function-type scope.
     var x =
         /*@error=NamedFunctionExpression*/
-        /*@error=DuplicatedName*/
-        T< /*@context=DuplicatedNameCause*/ T>() {};
+        /*@error=DuplicatedDeclaration*/
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
   }
   {
     /*@context=DuplicatedNamePreviouslyUsedCause*/
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
index 60bcdea..6a0a469 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
@@ -1,4 +1,85 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
+//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//                                                 ^
+// pkg/front_end/testcases/named_function_scope.dart:31:52: Error: Previous use of 'V'.
+//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
+//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
+//                                                 ^
+// pkg/front_end/testcases/named_function_scope.dart:36:52: Error: Previous use of 'V'.
+//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+//         T() {};
+//         ^
+// pkg/front_end/testcases/named_function_scope.dart:45:9: Error: Previous use of 'T'.
+//         T
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
+//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:54:5: Error: Previous use of 'V'.
+//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+// pkg/front_end/testcases/named_function_scope.dart:62:52: Error: Previous declaration of 'T'.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:66:5: Error: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:71:5: Error: Previous use of 'T'.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:75:5: Error: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:80:5: Error: Previous use of 'T'.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:83:32: Warning: 'T' isn't a type.
+//     void T(/*@error=NotAType*/ T t) {}
+//                                ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
 //     var x = /*@error=NamedFunctionExpression*/ T() {};
@@ -9,7 +90,7 @@
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //         ^
 
 library;
@@ -63,7 +144,7 @@
   }
   {
     dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
         ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
index 60bcdea..02bf73d 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
 //     var x = /*@error=NamedFunctionExpression*/ T() {};
@@ -9,7 +9,7 @@
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //         ^
 
 library;
@@ -63,7 +63,7 @@
   }
   {
     dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
         ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
index 0dde266..38d058b 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
@@ -1,4 +1,85 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
+//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//                                                 ^
+// pkg/front_end/testcases/named_function_scope.dart:31:52: Error: Previous use of 'V'.
+//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
+//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
+//                                                 ^
+// pkg/front_end/testcases/named_function_scope.dart:36:52: Error: Previous use of 'V'.
+//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+//         T() {};
+//         ^
+// pkg/front_end/testcases/named_function_scope.dart:45:9: Error: Previous use of 'T'.
+//         T
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
+//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:54:5: Error: Previous use of 'V'.
+//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+// pkg/front_end/testcases/named_function_scope.dart:62:52: Error: Previous declaration of 'T'.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:66:5: Error: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:71:5: Error: Previous use of 'T'.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:75:5: Error: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:80:5: Error: Previous use of 'T'.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
+//     void T(/*@error=NotAType*/ T t) {}
+//                                ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
 //     var x = /*@error=NamedFunctionExpression*/ T() {};
@@ -9,7 +90,7 @@
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
@@ -67,7 +148,7 @@
   }
   {
     dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
         ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
index c427566..bffb97c 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
 //     var x = /*@error=NamedFunctionExpression*/ T() {};
@@ -9,7 +9,7 @@
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
@@ -67,7 +67,7 @@
   }
   {
     dynamic x = let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
         ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
index 081ba63..99cfce5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Warning: Can't declare a member that conflicts with an inherited one.
+//   void foo(int x) {}
+//        ^
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Warning: This is the inherited member.
+//   void set 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.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
index f4edc47..94996d7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Warning: Can't declare a member that conflicts with an inherited one.
+//   void foo(int x) {}
+//        ^
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Warning: This is the inherited member.
+//   void set 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.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
index 26812a7..8facc2b 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,4 +1,13 @@
-// Errors:
+// Formatted problems:
+//
+// 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) {}
+//        ^
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: This is the inherited member.
+//   void set foo(int x);
+//            ^
+
+// Unhandled 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) {}
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 26812a7..d158aa5 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,4 +1,4 @@
-// Errors:
+// Unhandled 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) {}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 1159e1b..aeed5cf 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -87,7 +87,6 @@
 inference/generic_methods_infer_generic_function_return_type: Fail
 inference/generic_methods_infer_generic_instantiation: Fail
 inference/generic_methods_infer_generic_method_type: Fail
-inference/generic_methods_infer_js_builtin: Fail
 inference/generic_methods_inference_error: Fail
 inference/generic_methods_iterable_and_future: Fail
 inference/generic_methods_nested_generic_instantiation: Fail
@@ -226,10 +225,8 @@
 inference/unsafe_block_closure_inference_constructor_call_implicit_type_param: Fail
 inference/unsafe_block_closure_inference_constructor_call_no_type_param: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_type_param: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Fail
 inference/unsafe_block_closure_inference_function_call_implicit_type_param: Fail
 inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr: Fail
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
index b8c3f6f..d517d97 100644
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).
+// Change to a subtype of #lib1::B.
+//   A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+//                                                   ^
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:18:7: Error: This is the overridden method ('y').
+//   get y => null; // Inferred type: B
+//       ^
+//
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
+//                                                         ^
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:17:12: Error: This is the overridden method ('x').
+//   void set x(value) {} // Inferred type: A
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).
 // Change to a subtype of #lib1::B.
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
index 1079542..cdc0223 100644
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
+// Change to a subtype of #lib1::A.
+//   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+//                                                        ^
+// pkg/front_end/testcases/override_check_accessor_basic.dart:13:9: Error: This is the overridden method ('y').
+//   A get y => null;
+//         ^
+//
+// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
+//                                                         ^
+// pkg/front_end/testcases/override_check_accessor_basic.dart:12:12: Error: This is the overridden method ('x').
+//   void set x(A value) {}
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
 // Change to a subtype of #lib1::A.
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
index a16ec7c..0a4e4f0 100644
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
+//                                                  ^
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:15:12: Error: This is the overridden method ('x4').
+//   void set x4(A value) {}
+//            ^
+//
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
+//                                                                 ^
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:16:12: Error: This is the overridden method ('x5').
+//   void set x5(covariant A value) {}
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
index 118eae6..bc8edb9 100644
--- a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
+//                                                     ^
+// pkg/front_end/testcases/override_check_after_inference.dart:16:8: Error: This is the overridden method ('f').
+//   void f(x) {} // Inferred type: (A) -> void
+//        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
diff --git a/pkg/front_end/testcases/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
index 14ce8e1..8b4f9db 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
@@ -1,4 +1,38 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
+// Change to a subtype of #lib1::A.
+//   Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
+//                                                    ^
+// pkg/front_end/testcases/override_check_basic.dart:15:5: Error: This is the overridden method ('f4').
+//   A f4() {}
+//     ^
+//
+// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E::f3' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
+//                                                       ^
+// pkg/front_end/testcases/override_check_basic.dart:14:8: Error: This is the overridden method ('f3').
+//   void f3({A x}) {}
+//        ^
+//
+// pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E::f1' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
+//                                                      ^
+// pkg/front_end/testcases/override_check_basic.dart:12:8: Error: This is the overridden method ('f1').
+//   void f1(A x) {}
+//        ^
+//
+// pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E::f2' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
+//                                                       ^
+// pkg/front_end/testcases/override_check_basic.dart:13:8: Error: This is the overridden method ('f2').
+//   void f2([A x]) {}
+//        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
 // Change to a subtype of #lib1::A.
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
index 1ce77e1..cdddc5d 100644
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
+//                                                                     ^
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:16:8: Error: This is the overridden method ('f5').
+//   void f5(covariant A x) {}
+//        ^
+//
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D::f4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
+//                                                      ^
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:15:8: Error: This is the overridden method ('f4').
+//   void f4(A x) {}
+//        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index b5e33b4..c507585 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -1,4 +1,25 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+// pkg/front_end/testcases/qualified.dart:11:7: Error: The name of the enclosing class is 'Bad'.
+// class Bad extends lib.Missing {
+//       ^^^
+//
+// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+//
+// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
 //   factory WrongName() {}
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
index 3ffad7c..bc19cfd 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
 //   factory WrongName() {}
diff --git a/pkg/front_end/testcases/qualified.dart.outline.expect b/pkg/front_end/testcases/qualified.dart.outline.expect
index f72c9c6..ae38d0d 100644
--- a/pkg/front_end/testcases/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/qualified.dart.outline.expect
@@ -1,3 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+// pkg/front_end/testcases/qualified.dart:11:7: Error: The name of the enclosing class is 'Bad'.
+// class Bad extends lib.Missing {
+//       ^^^
+//
+// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+//
+// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+
 library test.qualified.main;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index f1a7aea..81c5a97 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -1,4 +1,25 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+// pkg/front_end/testcases/qualified.dart:11:7: Error: The name of the enclosing class is 'Bad'.
+// class Bad extends lib.Missing {
+//       ^^^
+//
+// pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+//
+// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
 //   factory WrongName() {}
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index 34c0697..35303f8 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
 //   factory WrongName() {}
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.outline.expect
index 6a28c0d..b9d119d 100644
--- a/pkg/front_end/testcases/rasta/bad_interpolation.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.outline.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
index 0f04f62..ca1dccd 100644
--- a/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   Foo() = Bar;
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
index 8c80f82..5bae75e 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
@@ -1,3 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Warning: Couldn't find constructor 'Missing'.
+//   factory D() = Missing;
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Warning: Redirection constructor target not found: 'Missing'
+//   factory D() = Missing;
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
index 1033641..2bee7a2 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Warning: Couldn't find constructor 'Missing'.
+//   factory A.c() = Missing;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Warning: Redirection constructor target not found: 'Missing'
+//   factory A.c() = Missing;
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
index a6165ac..530ae8d 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
@@ -1,3 +1,22 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:4: Error: Constructors can't have type parameters.
+//   C<
+//    ^^...
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:3: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   C<
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected '{' before this.
+// }
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
index 0f7997f..1ad775d 100644
--- a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Warning: Method not found: 'JS'.
+// @JS()
+//  ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
index 9cdc3c0..ca492a1 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
index 2f20ccb..1486b02 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
index ccf680c..d32fcc1 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/issue_000036.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000036.dart.outline.expect
index 6a28c0d..b1d01f2 100644
--- a/pkg/front_end/testcases/rasta/issue_000036.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000036.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got '-'.
+// main() => a. - 5;
+//              ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
index 58b020e..2c2bacee 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
 // Try removing '+'.
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
index c34187e..5a7b5f6 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
 // Try removing '+'.
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
index 3058134..a542560 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
@@ -1,3 +1,28 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// a b(c) = d;
+//        ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Warning: Type 'a' not found.
+// a b(c) = d;
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Warning: Couldn't find constructor 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
index 3ea2923b..935af28 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A::U> field;
   constructor •(self::A::N n, self::A::S s) → void
-    : self::A::field = core::List::•<self::A::U>(), super core::Object::•() {
+    : self::A::field = core::_GrowableList::•<self::A::U>(0), super core::Object::•() {
     exp::Expect::isTrue(n is self::A::N);
     exp::Expect::isTrue(s is self::A::S);
   }
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
index 16a1f84..36343aa 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
 //     : x = 'foo'
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
index 8c3bb35..5002235 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
@@ -1,3 +1,23 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:6:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A()
+//   ^^^^^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a class member, but got ':'.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:7: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//     : x = 'foo'
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
index be30e1a..fe2d820 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
 // typedef Handle Handle(String command);
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
index be30e1a..88fea44 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
 // typedef Handle Handle(String command);
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
index 3951999..2cff7f8 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.outline.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.outline.expect
index 26f7900..fde9d1b 100644
--- a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:16: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+// main(arguments = [x]) {
+//                ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
index 0da6aee..7994ea9 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
 //   foo() => super.foo() + f();
diff --git a/pkg/front_end/testcases/rasta/static.dart.direct.expect b/pkg/front_end/testcases/rasta/static.dart.direct.expect
index 2154f49..4702749 100644
--- a/pkg/front_end/testcases/rasta/static.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.direct.expect
@@ -1,3 +1,141 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/static.dart:28:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:29:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:31:9: Warning: Setter not found: 'staticConstant'.
+//     Foo.staticConstant++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:32:13: Warning: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:35:9: Warning: Setter not found: 'staticFunction'.
+//     Foo.staticFunction++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:36:13: Warning: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:37:9: Warning: Setter not found: 'staticGetter'.
+//     Foo.staticGetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:38:13: Warning: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:39:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:40:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:42:11: Warning: Setter not found: 'staticConstant'.
+//     ++Foo.staticConstant;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:43:15: Warning: Setter not found: 'staticConstant'.
+//     use(++Foo.staticConstant);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:46:11: Warning: Setter not found: 'staticFunction'.
+//     ++Foo.staticFunction;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:47:15: Warning: Setter not found: 'staticFunction'.
+//     use(++Foo.staticFunction);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:48:11: Warning: Setter not found: 'staticGetter'.
+//     ++Foo.staticGetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:49:15: Warning: Setter not found: 'staticGetter'.
+//     use(++Foo.staticGetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:50:11: Warning: Getter not found: 'staticSetter'.
+//     ++Foo.staticSetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:51:15: Warning: Getter not found: 'staticSetter'.
+//     use(++Foo.staticSetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:61:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter();
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:62:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter());
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:64:9: Warning: Setter not found: 'staticConstant'.
+//     Foo.staticConstant = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:65:13: Warning: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:68:9: Warning: Setter not found: 'staticFunction'.
+//     Foo.staticFunction = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:69:13: Warning: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:70:9: Warning: Setter not found: 'staticGetter'.
+//     Foo.staticGetter = 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:71:13: Warning: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter = 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:75:9: Warning: Setter not found: 'staticConstant'.
+//     Foo.staticConstant ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:76:13: Warning: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:79:9: Warning: Setter not found: 'staticFunction'.
+//     Foo.staticFunction ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:80:13: Warning: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:81:9: Warning: Setter not found: 'staticGetter'.
+//     Foo.staticGetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:82:13: Warning: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter ??= 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:83:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:84:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter ??= 87);
+//             ^^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.expect b/pkg/front_end/testcases/rasta/super.dart.direct.expect
index 6f3fd55..412e093 100644
--- a/pkg/front_end/testcases/rasta/super.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.direct.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
 // Try removing '+'.
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
index 6f3fd55..412e093 100644
--- a/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
 // Try removing '+'.
diff --git a/pkg/front_end/testcases/rasta/super.dart.outline.expect b/pkg/front_end/testcases/rasta/super.dart.outline.expect
index 6bfb282..f81146c 100644
--- a/pkg/front_end/testcases/rasta/super.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.outline.expect
@@ -1,3 +1,12 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/super.dart:26:8: Warning: Can't declare a member that conflicts with an inherited one.
+//   void n() {}
+//        ^
+// pkg/front_end/testcases/rasta/super.dart:27:7: Warning: This is the inherited member.
+//   set n(_) {}
+//       ^
+
 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 9b12575..db43639 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
 //   void n() {}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
index f43c8b5..adf016a 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Warning: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
index 1cd4858..3037992 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
 //   foo() => super.foo() + f();
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.expect
index 8c84e9b..fbd4248 100644
--- a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Warning: Switch case may fall through to the next case.
+//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Warning: Switch case may fall through to the next case.
+//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Warning: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.expect
index bbdd5fa..d2d8a68 100644
--- a/pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:7:5: Warning: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:13:5: Warning: Switch case may fall through to the next case.
+//     case 2:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:20:5: Warning: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:26:5: Warning: Switch case may fall through to the next case.
+//     case 4:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:31:5: Warning: Switch case may fall through to the next case.
+//     case 5:
+//     ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
index d5f0745..ed58703 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
@@ -1,4 +1,78 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Warning: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Warning: Setter not found: 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Warning: Setter not found: 'Fisk'.
+//     for (Fisk in x) {
+//          ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+//       print(collection);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+//     for (collection in x) {
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Warning: Setter not found: 'VoidFunction'.
+//     for (VoidFunction in x) {
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Warning: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Warning: Getter not found: 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Warning: Setter not found: 'key'.
+//   for (key in arguments) {
+//        ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Warning: Setter not found: 'Fisk'.
+//   for (Fisk in arguments) {
+//        ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+//     print(collection);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+//   for (collection in arguments) {
+//        ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Warning: Setter not found: 'VoidFunction'.
+//   for (VoidFunction in arguments) {
+//        ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Warning: Getter not found: 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in arguments) {
+//        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
 //     for (1 in x) {
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
index d5f0745..a8e8265 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
 //     for (1 in x) {
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.expect
index 0c3e32a..c6efc4b 100644
--- a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
+// import 'dart:html';
+//        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
 // import 'dart:html';
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.transformed.expect
index 0c3e32a..b3ae1f4 100644
--- a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
 // import 'dart:html';
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.outline.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.outline.expect
index 6a28c0d..9edee97 100644
--- a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
+// import 'dart:html';
+//        ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.expect
index 0c3e32a..c6efc4b 100644
--- a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
+// import 'dart:html';
+//        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
 // import 'dart:html';
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.transformed.expect
index 0c3e32a..b3ae1f4 100644
--- a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
 // import 'dart:html';
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
index 6ec2d0c..e03cc64 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type '#lib1::Foo::T'.
+// Try changing the type of the parameter, or casting the argument to '#lib1::Foo::T'.
+//   Foo.from(String _init) : this._internal(x: _init);
+//                                              ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
index 52e72a3..be87a73 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
 //   [f() {}];
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
index 52e72a3..3232e26 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
 //   [f() {}];
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
index adc4090..6872ff5 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
 //   [f() {}];
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
index adc4090..87fc344 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
 //   [f() {}];
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29940.dart.direct.expect
index b13d5e8..4a7fdf3 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29940.dart:7:3: Warning: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
+//   a.b c = null;
+//   ^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
index f07748e..00641a9 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
+//   a.b c = null;
+//   ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
 //   a.b c = null;
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
index f07748e..0d0ae79 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
 //   a.b c = null;
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
index eea6787..7d8e0ac 100644
--- a/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '""'.
+//   a."";
+//     ^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
index 5c24424..8d219da 100644
--- a/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '""'.
+//   a."";
+//     ^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
index 63a61b7..f278bcd 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
@@ -1,4 +1,15 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
index 63a61b7..b45be16 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29942.dart.outline.expect
index 3e9bfb4..cedaf70 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.outline.expect
@@ -1,3 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
index ec26782..39a4246 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
@@ -1,4 +1,15 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
index ec26782..ef6dd3f 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
index 69b4062..163bc19 100644
--- a/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.
+//   x.(null);
+//     ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect
index 69b4062..163bc19 100644
--- a/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.
+//   x.(null);
+//     ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
index be4cec3..7fa8fb7 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
 //   var C;
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
index be4cec3..af5fa11 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
 //   var C;
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
index 49b1b59..22ab63f 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
index be4cec3..7fa8fb7 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
 //   var C;
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect
index be4cec3..af5fa11 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
 //   var C;
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29945.dart.direct.expect
index 186616b..34da2814 100644
--- a/pkg/front_end/testcases/regress/issue_29945.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29945.dart:6:3: Warning: 's.bool' can't be used as a type because 's' isn't defined.
+//   s.bool x = null;
+//   ^^^^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
index aecaa47..0215a73 100644
--- a/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
+//   s.bool x = null;
+//   ^^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
 //   s.bool x = null;
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect
index aecaa47..da35f2c 100644
--- a/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
 //   s.bool x = null;
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
index 55032f9..2d292e2 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.
 // typedef void F();
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
index 486b2d7..5343ae7 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
@@ -1,7 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: 'F' is already declared in this scope.
+// typedef void F();
+//              ^
+// pkg/front_end/testcases/regress/issue_29975.dart:5:14: Error: Previous declaration of 'F'.
+// typedef void F();
+//              ^
+
 library;
 import self as self;
 
 typedef F = () → void;
-typedef F = () → void;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
index 55032f9..2d292e2 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.
 // typedef void F();
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart b/pkg/front_end/testcases/regress/issue_29976.dart
index 94e1cc1..3d2a10c 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart
+++ b/pkg/front_end/testcases/regress/issue_29976.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+get x => null;
+
 void main() {
   f(
     "x${x*"'"é'}x
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 7c0169a..b2fd9b3 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
@@ -1,31 +1,66 @@
-// Errors:
+// Formatted problems:
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
 //     "x${x*"'"é'}x
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
 //     "x${x*"'"é'}x
 //               ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '${'.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
 //     "x${x*"'"é'}x
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with " must end with ".
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
 //     "x${x*"'"é'}x
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected ';' after this.
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Warning: Method not found: 'f'.
+//   f(
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
 //   )
 //   ^
 
@@ -33,6 +68,8 @@
 import self as self;
 import "dart:core" as core;
 
+static get x() → dynamic
+  return null;
 static method main() → void {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
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 7c0169a..d89579f 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
@@ -1,31 +1,31 @@
-// Errors:
+// Unhandled errors:
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
 //     "x${x*"'"é'}x
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
 //     "x${x*"'"é'}x
 //               ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '${'.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
 //     "x${x*"'"é'}x
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with " must end with ".
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
 //     "x${x*"'"é'}x
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected ';' after this.
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
 //   )
 //   ^
 
@@ -33,6 +33,8 @@
 import self as self;
 import "dart:core" as core;
 
+static get x() → dynamic
+  return null;
 static method main() → void {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29976.dart.outline.expect
index 2982c48..eb72274 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.outline.expect
@@ -1,5 +1,26 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 
+static get x() → dynamic
+  ;
 static method main() → void
   ;
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 8ed52a2..381ef02 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
@@ -1,39 +1,70 @@
-// Errors:
+// Formatted problems:
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
 //     "x${x*"'"é'}x
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
 //     "x${x*"'"é'}x
 //               ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '${'.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
 //     "x${x*"'"é'}x
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with " must end with ".
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:7:9: Error: Getter not found: 'x'.
-//     "x${x*"'"é'}x
-//         ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
 //     "x${x*"'"é'}x
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:6:3: Error: Method not found: 'f'.
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
 //   f(
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected ';' after this.
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
+//   f(
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
 //   )
 //   ^
 
@@ -41,6 +72,8 @@
 import self as self;
 import "dart:core" as core;
 
+static get x() → dynamic
+  return null;
 static method main() → void {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect
index d2f376d..080428d 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect
@@ -1,8 +1,44 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
+//   f(
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
-  )
-  ^";
+static get x() → dynamic
+  return null;
+static method main() → void {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
index 2e710dd..2e676e4 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
 //   Invalid MIME type.
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
index 2e710dd..262ff05 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
 //   Invalid MIME type.
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29977.dart.outline.expect
index 6a28c0d..33e2d4e 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect
index 2e710dd..2e676e4 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
 //   Invalid MIME type.
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect
index 2e710dd..262ff05 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
 //   Invalid MIME type.
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
index e7d6daa..e883dbf 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
 //   foo(null, f() {});
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
index e7d6daa..62cb849 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
 //   foo(null, f() {});
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
index 8056564..a15db2b 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
 //   foo(null, f() {});
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
index 8056564..6a94d34 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
 //   foo(null, f() {});
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
index c6c9753..2df3c7c 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
 //   (f() {})();
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
index c6c9753..f556c17 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
 //   (f() {})();
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
index 14197c3..e9dc062 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
 //   (f() {})();
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
index 14197c3..aafb742 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
 //   (f() {})();
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29980.dart.direct.expect
index 15d1958..c2b6598 100644
--- a/pkg/front_end/testcases/regress/issue_29980.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29980.dart:6:3: Warning: 'x.y' can't be used as a type because 'x' isn't defined.
+//   x.y z;
+//   ^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
index 4a6574c..d313908 100644
--- a/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
+//   x.y z;
+//   ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
 //   x.y z;
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect
index 4a6574c..c271e3e 100644
--- a/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
 //   x.y z;
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
index dad6a74..c031f86 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29981.dart:6:3: Warning: Expected 1 type arguments.
+//   C<String, String> field;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
index f2f6961..a99b77c 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: Expected 1 type arguments.
+//   C<String, String> field;
+//   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: Expected 1 type arguments.
 //   C<String, String> field;
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
index f2f6961..f41e053 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: Expected 1 type arguments.
 //   C<String, String> field;
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect
index f8f0cc4..2a74ae4 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect
@@ -1,6 +1,74 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Warning: Getter not found: 'éh'.
+//   print('${eh[éh']}');
+//               ^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.\n  print('\${eh[\u0233h']}');\n                ^";
+static method main() → dynamic {
+  dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
+  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
 }
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29982.dart.direct.transformed.expect
new file mode 100644
index 0000000..e608ced
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.direct.transformed.expect
@@ -0,0 +1,39 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
+  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29982.dart.outline.expect
index 6a28c0d..8e9ae53 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.outline.expect
@@ -1,3 +1,22 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
index f8f0cc4..3cf1dab 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
@@ -1,6 +1,78 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Getter not found: 'éh'.
+//   print('${eh[éh']}');
+//               ^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Getter not found: 'éh'.
+//   print('${eh[éh']}');
+//               ^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
 library;
 import self as self;
+import "dart:core" as core;
 
-static method #main() → dynamic {
-  throw "pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.\n  print('\${eh[\u0233h']}');\n                ^";
+static method main() → dynamic {
+  core::Map<core::String, core::String> eh = <core::String, core::String>{"\u0233h": "\u0233h"};
+  core::print("${eh.{core::Map::[]}(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
 }
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect
new file mode 100644
index 0000000..02e6e5f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: String starting with ' must end with '.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Getter not found: 'éh'.
+//   print('${eh[éh']}');
+//               ^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Map<core::String, core::String> eh = <core::String, core::String>{"\u0233h": "\u0233h"};
+  core::print("${eh.{core::Map::[]}(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
index 9c66143..0043c08 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
@@ -1,3 +1,21 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:7:10: Warning: Getter not found: 'missing'.
+//   return missing;
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
+//   return missing;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Warning: Getter not found: 'dummy'.
+// g() sync* => dummy;
+//              ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
+// g() sync* => dummy;
+//              ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
index 324e30a..5af7027 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
@@ -1,4 +1,22 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Getter not found: 'missing'.
+//   return missing;
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
+//   return missing;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: Getter not found: 'dummy'.
+// g() sync* => dummy;
+//              ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
+// g() sync* => dummy;
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Getter not found: 'missing'.
 //   return missing;
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
index 688f612..6fcb220 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Getter not found: 'missing'.
 //   return missing;
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
index 01ccbc1..9c9464b 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
@@ -1,3 +1,16 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Warning: Getter not found: 'i'.
+//   for (int i = i;; false) {}
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+//   for (int i = i;; false) {}
+//            ^
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.
+//   for (int i = i;; false) {}
+//                ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
index 689db8c..ca8ca48 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -1,4 +1,17 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
+//   for (int i = i;; false) {}
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+//   for (int i = i;; false) {}
+//            ^
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.
+//   for (int i = i;; false) {}
+//                ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
 //   for (int i = i;; false) {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
index 7db28e0..03506c1 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
 //   for (int i = i;; false) {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
index d87258e..d6e6130 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
@@ -1,4 +1,19 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Warning: Getter not found: '🔛'.
+//   🔛
+//   ^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
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 d87258e..52f90dd 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
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29985.dart.outline.expect
index 81debf2..355a2a5 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+
 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 2ec7cc8..0a05af8 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
@@ -1,4 +1,19 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// 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: '🔛'.
+//   🔛
+//   ^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
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 2ec7cc8..0d94ae5 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
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
index aa0c741..095bbbf 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
index aa0c741..7c524d5 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29986.dart.outline.expect
index d2eac43..2fe2ce6 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect
index aa0c741..095bbbf 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect
@@ -1,4 +1,16 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect
index aa0c741..7c524d5 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
 // Try adding {}.
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
index bd8fdba..6273432 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
 //   Illegal scheme character.
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
index bd8fdba..99b37bf 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
 //   Illegal scheme character.
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29987.dart.outline.expect
index 6a28c0d..d226574 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect
index bd8fdba..6273432 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
 //   Illegal scheme character.
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect
index bd8fdba..99b37bf 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
 //   Illegal scheme character.
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
index a07ea78..e7243ad 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   set A(v) {}
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   set A(v) {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
index a07ea78..6b3d9f4 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   set A(v) {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
index c591247..d2f5b89 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   set A(v) {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
index 729a604..41ead93 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   set A(v) {}
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   set A(v) {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect
index 729a604..5b18f1e 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   set A(v) {}
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
index a55281a..981475d 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
index a55281a..686b6ba 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
index a55281a..981475d 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
@@ -1,4 +1,11 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
index a55281a..686b6ba 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
index 37bfe50..3f2e7c5 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   get A {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
index 37bfe50..f9a4f7b 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   get A {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
index f1cbbf4..b7d5e6b 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
index 37bfe50..3f2e7c5 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   get A {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect
index 37bfe50..f9a4f7b 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
 //   get A {
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
index a31a78a..ce9d891 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
@@ -1,4 +1,34 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
 // part '$foo';
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
index a31a78a..9fa56bb 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
 // part '$foo';
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30994.dart.outline.expect
index 11351ee..849db7f 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.outline.expect
@@ -1,3 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
 library lib;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect
index a31a78a..ce9d891 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect
@@ -1,4 +1,34 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
 // part '$foo';
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect
index a31a78a..9fa56bb 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
 // part '$foo';
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 d785e40..fbe631b 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -1,4 +1,28 @@
-// Errors:
+// Formatted problems:
+//
+// 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'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
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 d785e40..78c1a61 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
index 5b7edf4..526a82b 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -1,3 +1,27 @@
+// Formatted problems:
+//
+// 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'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+
 library;
 import self as self;
 import "dart:core" as core;
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 3b1594e..23f4fbd 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -1,4 +1,33 @@
-// Errors:
+// Formatted problems:
+//
+// 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'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+//   var f = Map<A, B> {};
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
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 868d241..d572835 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31155.dart:11:18: Error: Expected ';' after this.
 //   var f = Map<A, B> {};
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
index 895f75f..8a84bd6 100644
--- a/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.
+//   return null?.(1);
+//                ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect
index 895f75f..8a84bd6 100644
--- a/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.
+//   return null?.(1);
+//                ^
+
 library;
 import self as self;
 
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 49b38eb..f3cb890 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
@@ -1,4 +1,18 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T =
+//           ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
 // 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 49b38eb..f86e25c4 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
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
 // typedef F = Map<String, dynamic> Function();
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
index b3a684f..b3c6998 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T =
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
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 49b38eb..f3cb890 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -1,4 +1,18 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T =
+//           ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
 // 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 49b38eb..f86e25c4 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
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
 // typedef F = Map<String, dynamic> Function();
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
index 624821f2..1223575 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31180.dart:6:16: Error: Expected an identifier, but got '['.
+//   return null?.[1];
+//                ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
index 624821f2..1223575 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31180.dart:6:16: Error: Expected an identifier, but got '['.
+//   return null?.[1];
+//                ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
index c09214e..dfeec4e 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
@@ -1,4 +1,15 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
 //   operator unary- => 0;
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
index c09214e..3ffea36 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
 //   operator unary- => 0;
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
index 626dcfc..2de1a4b 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
@@ -1,3 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
index c09214e..dfeec4e 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
@@ -1,4 +1,15 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
 //   operator unary- => 0;
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect
index c09214e..3ffea36 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
 //   operator unary- => 0;
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 0e18d33..8528783 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
@@ -1,4 +1,25 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
+//   for (int i = 0, i > 10; i++) {}
+//                   ^
+// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Error: Previous declaration of 'i'.
+//   for (int i = 0, i > 10; i++) {}
+//            ^
+//
+// 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++) {}
+//                     ^
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Warning: Getter not found: ''.
+//   for (int i = 0, i > 10; i++) {}
+//                     ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
 //   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 0e18d33..fd614a7 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
 //   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 b3ffbf8..a72fee1 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -1,4 +1,25 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
+//   for (int i = 0, i > 10; i++) {}
+//                   ^
+// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Error: Previous declaration of 'i'.
+//   for (int i = 0, i > 10; i++) {}
+//            ^
+//
+// 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++) {}
+//                     ^
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Getter not found: ''.
+//   for (int i = 0, i > 10; i++) {}
+//                     ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
 //   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 d3a912f..bc5ace6 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
@@ -1,4 +1,18 @@
-// Errors:
+// Formatted problems:
+//
+// 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:14: Error: Expected ';' after this.
+//   return (i) ++ (i);
+//              ^^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
+//   return (i) ++ (i);
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
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 d3a912f..4494677 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
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 f26aee4..3255194 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
@@ -1,4 +1,18 @@
-// Errors:
+// Formatted problems:
+//
+// 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:14: Error: Expected ';' after this.
+//   return (i) ++ (i);
+//              ^^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
+//   return (i) ++ (i);
+//            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
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 1e08909..9b0d784 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
 //   return i ++ (i);
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
index db52098..79db460 100644
--- a/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.
+//   return null?.true;
+//                ^^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect
index db52098..79db460 100644
--- a/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.
+//   return null?.true;
+//                ^^^^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
index df2ebb4..4b86241 100644
--- a/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.
+//   return null?.1;
+//                ^
+
 library;
 import self as self;
 
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect
index df2ebb4..4b86241 100644
--- a/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.
+//   return null?.1;
+//                ^
+
 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 eb3888b..4877df5 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
@@ -1,4 +1,26 @@
-// Errors:
+// Formatted problems:
+//
+// 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>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: Type 'type' not found.
+// type T = Map<A, B>
+// ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Warning: Getter not found: 'A'.
+// type T = Map<A, B>
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: 'type' isn't a type.
+// type T = Map<A, B>
+// ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // 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 eb3888b..17bbd41 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // type T = Map<A, B>
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
index c8bd468..96028d3 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// 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>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: Type 'type' not found.
+// type T = Map<A, B>
+// ^
+
 library;
 import self as self;
 
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 968f42b..5e7a651 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -1,4 +1,31 @@
-// Errors:
+// Formatted problems:
+//
+// 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>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+// type T = Map<A, B>
+// ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+// type T = Map<A, B>
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// type T = Map<A, B>
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+// type T = Map<A, B>
+// ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // 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 2d9d977..6757514 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,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
 // type T = Map<A, B>
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
index 808b453..6c4525d 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
@@ -1,3 +1,16 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:1: Warning: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Warning: 'U' isn't a type.
+//   T<U> v;
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Warning: Expected 0 type arguments.
+//   T<U> v;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
index b7201fd..3961a70 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
@@ -1,3 +1,8 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:1: Warning: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
index d69d0be..a02febd 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
@@ -1,4 +1,17 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.
+//   T<U> v;
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: Expected 0 type arguments.
+//   T<U> v;
+//   ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
 // Try removing the type arguments.
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
index d69d0be..4f5ca69 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
 // Try removing the type arguments.
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
index 94c1472..7729a31 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
@@ -1,4 +1,19 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Can't access 'this' in a field initializer to read 'x'.
+//   Increment() : x++ {}
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
+//   Increment() : x++ {}
+//                 ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
 // To initialize a field, use the syntax 'name = value'.
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
index 94c1472..3a2498d 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
 // To initialize a field, use the syntax 'name = value'.
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
index 9ebe466..2ce48d5 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
index 94c1472..7729a31 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
@@ -1,4 +1,19 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Can't access 'this' in a field initializer to read 'x'.
+//   Increment() : x++ {}
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
+//   Increment() : x++ {}
+//                 ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
 // To initialize a field, use the syntax 'name = value'.
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect
index 94c1472..3a2498d 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
 // To initialize a field, use the syntax 'name = value'.
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
index 6421b2c..008a259 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
@@ -1,3 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//   B(): super().foo() {}
+//        ^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:8:16: Error: Expected an initializer.
+//   B(): super().foo() {}
+//                ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
index 6421b2c..008a259 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
@@ -1,3 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//   B(): super().foo() {}
+//        ^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:8:16: Error: Expected an initializer.
+//   B(): super().foo() {}
+//                ^
+
 library;
 import self as self;
 import "dart:core" as core;
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 30d4403..6385681 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Warning: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   new A.foo(1, 2);
+//            ^
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Warning: Found this candidate, but the arguments don't match.
+//   A.foo() : m = 2;
+//   ^^^
+
 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 11b7715..b103d7c 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -1,4 +1,18 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   new A.foo(1, 2);
+//            ^
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Found this candidate, but the arguments don't match.
+//   A.foo() : m = 2;
+//   ^^^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
+//   new A().foo();
+//              ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
 // Try removing the extra positional arguments.
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
index 9857054..14469fb9 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_32200.dart:8:3: Warning: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
+//   self.Foo self;
+//   ^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
index 4253658..ff1f016 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
+//   self.Foo self;
+//   ^^^^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
 //   self.Foo self;
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
index 4253658..40183e6 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
 //   self.Foo self;
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index 057aa3f..90e7da0 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -1,4 +1,34 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//   'foo'.
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C extends A implements B {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:10:3: Error: 'foo' is defined here.
+//   foo(int x, {int y}) => y;
+//   ^^^
+//
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The non-abstract class 'E' is missing implementations for these members:
+//   'foo'.
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class E extends D {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Error: 'foo' is defined here.
+//   foo(int x, {int y});
+//   ^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The non-abstract class 'C' is missing implementations for these members:
 //   'foo'.
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
index 720e78e..eb7d14d 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
@@ -1,3 +1,26 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:22:3: Warning: Expected 1 type arguments.
+//   foo<String, String>("hello world");
+//   ^
+// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Warning: Found this candidate, but the arguments don't match.
+// void foo<X>(X i) {
+//      ^^^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:24:7: Warning: Expected 1 type arguments.
+//   Foo.foo<int, int>(42);
+//       ^
+// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Warning: Found this candidate, but the arguments don't match.
+//   static foo<X>(X i) {
+//          ^^^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Warning: Expected 2 type arguments.
+//   new Bar<String>();
+//       ^
+// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Warning: The class 'Bar' has a constructor that takes no arguments.
+// class Bar<X, Y> {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
index 11825b0..bf43955 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
@@ -1,4 +1,31 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
+//   foo<String, String>("hello world");
+//   ^
+// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Error: Found this candidate, but the arguments don't match.
+// void foo<X>(X i) {
+//      ^^^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
+//   Foo.foo<int, int>(42);
+//       ^
+// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Error: Found this candidate, but the arguments don't match.
+//   static foo<X>(X i) {
+//          ^^^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
+//   new Bar<String>();
+//       ^
+// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Error: The class 'Bar' has a constructor that takes no arguments.
+// class Bar<X, Y> {}
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
+//   f.bar<double, double>(42.42);
+//     ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
 //   foo<String, String>("hello world");
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
index edcd349..65a098c 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
@@ -1,3 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   var x = new ExistingClass.nonExistingConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Warning: Method not found: 'ExistingClass'.
+//   x = new ExistingClass();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Warning: Method not found: 'ExistingClass'.
+//   x = new ExistingClass<String>();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String>.nonExistingConstructor();
+//                                 ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String, String>.nonExistingConstructor();
+//                                         ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Warning: Method not found: 'NonExistingClass'.
+//   x = new NonExistingClass();
+//           ^^^^^^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
index 8b82c2c..b93ac6e 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
@@ -1,4 +1,30 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   var x = new ExistingClass.nonExistingConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Method not found: 'ExistingClass'.
+//   x = new ExistingClass();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Method not found: 'ExistingClass'.
+//   x = new ExistingClass<String>();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String>.nonExistingConstructor();
+//                                 ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String, String>.nonExistingConstructor();
+//                                         ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Method not found: 'NonExistingClass'.
+//   x = new NonExistingClass();
+//           ^^^^^^^^^^^^^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
 //   var x = new ExistingClass.nonExistingConstructor();
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
index 8b82c2c..69ac3ff 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
 //   var x = new ExistingClass.nonExistingConstructor();
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
index 7c48338..e783015 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
@@ -1,4 +1,14 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
+//   static set C(v) {} //# 01: compile-time error
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:10:7: Error: A class member can't have the same name as the enclosing class.
+//   set D(v) {} //# 02: compile-time error
+//       ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
 //   static set C(v) {} //# 01: compile-time error
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
index 7c48338..db5adcb 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
 //   static set C(v) {} //# 01: compile-time error
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
index 3625d24..f78eb0b 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
@@ -1,3 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
+//   static set C(v) {} //# 01: compile-time error
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:10:7: Error: A class member can't have the same name as the enclosing class.
+//   set D(v) {} //# 02: compile-time error
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
index 90b0ea1..76bcc00 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
@@ -1,4 +1,19 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
+//   static set C(v) {} //# 01: compile-time error
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:10:7: Error: A class member can't have the same name as the enclosing class.
+//   set D(v) {} //# 02: compile-time error
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class '#lib1::C'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
+//   c.C = 5;
+//     ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
 //   static set C(v) {} //# 01: compile-time error
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
index 45d4bcd..4b9ee03 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
 //   static set C(v) {} //# 01: compile-time error
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
index 8d80aa8..b4234d1 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34291.dart:9:1: Error: Expected 0 type arguments.
+// lib.A<B> foo() {}
+// ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_34291.dart:9:1: Error: Expected 0 type arguments.
 // lib.A<B> foo() {}
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect
index 8d80aa8..98d11ba 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_34291.dart:9:1: Error: Expected 0 type arguments.
 // lib.A<B> foo() {}
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
index 8bd0c4b..31e819a 100644
--- 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
@@ -1,4 +1,10 @@
-// Errors:
+// Formatted problems:
+//
+// 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)> {}
+//            ^^^^^
+
+// Unhandled 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)> {}
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
index 8bd0c4b..77b3db2 100644
--- 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
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled 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)> {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
index 5f06fd8..09a6b38 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'test::C::g1::U'.
+// Try changing the type of the parameter, or casting the argument to 'test::C::g1::U'.
+//     this.f<U>(1.5);
+//               ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 974e021..2eb1e5fa 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) → dart.core::num' can't be assigned to a variable of type '(dart.core::int) → dart.core::int'.
+// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::int'.
+//   d.value /*@checkReturn=(num) -> num*/ += 1;
+//                                         ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) → dart.core::num' can't be assigned to a variable of type '(dart.core::int) → dart.core::int'.
+// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::int'.
+//     d.value /*@checkReturn=(num) -> num*/ += 1;
+//                                           ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index 6bc4680..6cb51fa 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+//   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
+//                                                 ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+//   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
+//                                                         ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+//   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
+//                                                  ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
+// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+//   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
+//                                                          ^
+
 library test;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index c1ac933..70bdfe0 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -8,12 +8,13 @@
 
 DeltaBlue: Fail
 accessors: Fail
+ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
 argument_mismatch: Fail # Test assumes Dart 1.0 semantics
 async_function: Fail
 await: Fail
 bug21938: TypeCheckError
 bug30695: TypeCheckError
-bug31124: RuntimeError # Test has an intentional error
+bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
 bug32629: Fail # Test has an intentional error
 call: Fail
 cascade: Fail
@@ -23,9 +24,11 @@
 covariant_generic: Fail
 cycles: Fail
 default_values: Fail
+duplicated_declarations: TypeCheckError
 dynamic_and_void: Fail # Test assumes Dart 1.0 semantics
 escape: Fail
 external: Fail
+external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
 fallthrough: Fail
 fibonacci: Fail
 for_in_scope: Fail
@@ -34,41 +37,7 @@
 functions: Fail
 hello: Fail
 implicit_this: Fail
-invocations: Fail
-literals: Fail
-map: Fail
-micro: Fail
-named_parameters: Fail
-null_aware: Fail
-operators: Fail
-optional: Fail
-override_check_accessor_after_inference: TypeCheckError # Issue #31620
-override_check_accessor_basic: TypeCheckError # Issue #31620
-override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
-override_check_after_inference: TypeCheckError # Issue #31620
-override_check_basic: TypeCheckError # Issue #31620
-override_check_with_covariant_modifier: TypeCheckError # Issue #31620
-platform: Fail
-prefer_baseclass: Fail
-redirecting_constructor: Fail
-redirecting_factory: Fail
-redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
-statements: Fail
-stringliteral: Fail
-super_rasta_copy: Fail
-top_level_accessors: Fail
-type_variable_as_super: Fail
-type_variable_prefix: RuntimeError
-typedef: Fail
-uninitialized_fields: Fail
-unused_methods: Fail
-void_methods: Fail
-warn_unresolved_sends: Fail # Test assumes Dart 1.0 semantics
-
+incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
 inference/abstract_class_instantiation: Fail # Issue #30040
 inference/conflicts_can_happen: TypeCheckError
 inference/conflicts_can_happen2: TypeCheckError
@@ -109,10 +78,24 @@
 inference_new/infer_assign_to_index_upwards: TypeCheckError
 inference_new/infer_field_getter_setter_mismatch: TypeCheckError
 inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
-
 instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
 instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
-
+invocations: Fail
+literals: Fail
+map: Fail
+micro: Fail
+named_parameters: Fail
+null_aware: Fail
+operators: Fail
+optional: Fail
+override_check_accessor_after_inference: TypeCheckError # Issue #31620
+override_check_accessor_basic: TypeCheckError # Issue #31620
+override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
+override_check_after_inference: TypeCheckError # Issue #31620
+override_check_basic: TypeCheckError # Issue #31620
+override_check_with_covariant_modifier: TypeCheckError # Issue #31620
+platform: Fail
+prefer_baseclass: Fail
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
 rasta/bad_continue: Fail
@@ -130,8 +113,11 @@
 rasta/constant_get_and_invoke: Fail
 rasta/deferred_lib: Fail
 rasta/deferred_load: Fail
+rasta/duplicated_mixin: RuntimeError # Expected, this file has no main method.
 rasta/enum: Fail
+rasta/export: RuntimeError # Expected, this file has no main method.
 rasta/external_factory_redirection: Fail
+rasta/foo: RuntimeError # Expected, this file has no main method.
 rasta/for_loop: Fail
 rasta/generic_factory: Fail
 rasta/hello: Fail
@@ -190,18 +176,23 @@
 rasta/unresolved_constructor: Fail
 rasta/unresolved_for_in: Fail
 rasta/unresolved_recovery: Fail
-
+redirecting_constructor: Fail
+redirecting_factory: Fail
+redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
 regress/issue_29975: Fail # Issue 29975.
-regress/issue_29976: TypeCheckError # Issue 29976.
-regress/issue_29982: Fail # Issue 29982.
+regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_30836: RuntimeError # Issue 30836.
 regress/issue_31184: TypeCheckError
 regress/issue_31299: TypeCheckError
+regress/issue_32660: TypeCheckError # Test has an intentional error
 regress/issue_32972: TypeCheckError
 regress/issue_33452: RuntimeError # Test has an intentional error
-regress/issue_32660: TypeCheckError # Test has an intentional error
 regress/issue_34225: RuntimeError
-
 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
@@ -210,14 +201,14 @@
 runtime_checks_new/stub_from_interface_covariantImpl_from_super: TypeCheckError
 runtime_checks_new/stub_from_interface_covariantInterface_from_class: TypeCheckError
 runtime_checks_new/stub_from_interface_covariant_from_super: TypeCheckError
-
-ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-rasta/duplicated_mixin: RuntimeError # Expected, this file has no main method.
-rasta/export: RuntimeError # Expected, this file has no main method.
-rasta/foo: RuntimeError # Expected, this file has no main method.
-
-incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
-
-co19_language_metadata_syntax_t04: RuntimeError # Fasta doesn't recover well
-
-external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
+statements: Fail
+stringliteral: Fail
+super_rasta_copy: Fail
+top_level_accessors: Fail
+type_variable_as_super: Fail
+type_variable_prefix: RuntimeError
+typedef: Fail
+uninitialized_fields: Fail
+unused_methods: Fail
+void_methods: Fail
+warn_unresolved_sends: Fail # Test assumes Dart 1.0 semantics
diff --git a/pkg/front_end/testcases/super_call.dart.direct.expect b/pkg/front_end/testcases/super_call.dart.direct.expect
index d97a5e2..e803acb 100644
--- a/pkg/front_end/testcases/super_call.dart.direct.expect
+++ b/pkg/front_end/testcases/super_call.dart.direct.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     return super(5);
+//            ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/super_call.dart.strong.expect b/pkg/front_end/testcases/super_call.dart.strong.expect
index be03ad0..c2176cd 100644
--- a/pkg/front_end/testcases/super_call.dart.strong.expect
+++ b/pkg/front_end/testcases/super_call.dart.strong.expect
@@ -1,3 +1,10 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     return super(5);
+//            ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
index 91b673f..aeab753 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
@@ -1,4 +1,226 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:60:11: Warning: Superclass has no getter named 'g'.
+//     super.g;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:61:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:79:11: Warning: Superclass has no setter named 'e'.
+//     super.e++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:80:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:81:11: Warning: Superclass has no setter named 'f'.
+//     super.f++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:82:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:83:11: Warning: Superclass has no getter named 'g'.
+//     super.g++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:84:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:91:11: Warning: Superclass has no setter named 'm'.
+//     super.m++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:92:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:102:13: Warning: Superclass has no setter named 'e'.
+//     ++super.e;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:103:17: Warning: Superclass has no setter named 'e'.
+//     use(++super.e);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:104:13: Warning: Superclass has no setter named 'f'.
+//     ++super.f;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:105:17: Warning: Superclass has no setter named 'f'.
+//     use(++super.f);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:106:13: Warning: Superclass has no getter named 'g'.
+//     ++super.g;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:107:17: Warning: Superclass has no getter named 'g'.
+//     use(++super.g);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:114:13: Warning: Superclass has no setter named 'm'.
+//     ++super.m;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:115:17: Warning: Superclass has no setter named 'm'.
+//     use(++super.m);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:129:11: Warning: Superclass has no method named 'g'.
+//     super.g();
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:130:15: Warning: Superclass has no method named 'g'.
+//     use(super.g());
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:150:11: Warning: Superclass has no setter named 'e'.
+//     super.e = 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:151:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e = 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:152:11: Warning: Superclass has no setter named 'f'.
+//     super.f = 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:153:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f = 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:162:11: Warning: Superclass has no setter named 'm'.
+//     super.m = 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:163:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m = 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:173:11: Warning: Superclass has no setter named 'e'.
+//     super.e ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:174:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:175:11: Warning: Superclass has no setter named 'f'.
+//     super.f ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:176:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:177:11: Warning: Superclass has no getter named 'g'.
+//     super.g ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:178:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:185:11: Warning: Superclass has no setter named 'm'.
+//     super.m ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:186:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:196:11: Warning: Superclass has no setter named 'e'.
+//     super.e += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:197:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:198:11: Warning: Superclass has no setter named 'f'.
+//     super.f += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:199:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:200:11: Warning: Superclass has no getter named 'g'.
+//     super.g += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:201:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:208:11: Warning: Superclass has no setter named 'm'.
+//     super.m += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:209:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:219:11: Warning: Superclass has no setter named 'e'.
+//     super.e -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:220:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:221:11: Warning: Superclass has no setter named 'f'.
+//     super.f -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:222:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:223:11: Warning: Superclass has no getter named 'g'.
+//     super.g -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:224:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:231:11: Warning: Superclass has no setter named 'm'.
+//     super.m -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:232:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:139:12: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     super.m(87);
+//            ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:140:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     use(super.m(87));
+//                ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
index 91b673f..c327223 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index a923b10..f818b59 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/super_rasta_copy.dart:60:11: Error: Superclass has no getter named 'g'.
 //     super.g;
diff --git a/pkg/front_end/testcases/tabs.dart.direct.expect b/pkg/front_end/testcases/tabs.dart.direct.expect
index b542e17..a304f47 100644
--- a/pkg/front_end/testcases/tabs.dart.direct.expect
+++ b/pkg/front_end/testcases/tabs.dart.direct.expect
@@ -1,3 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/tabs.dart:9:8: Warning: Getter not found: 'one'.
+// 	print(one);
+// 	      ^^^
+//
+// pkg/front_end/testcases/tabs.dart:10:9: Warning: Getter not found: 'two'.
+// 		print(two);
+// 		      ^^^
+//
+// pkg/front_end/testcases/tabs.dart:11:11: Warning: Getter not found: 'three'.
+// 		  print(three);
+// 		        ^^^^^
+//
+// pkg/front_end/testcases/tabs.dart:12:12: Warning: Getter not found: 'four'.
+// 	   	print(four);
+// 	   	      ^^^^
+//
+// pkg/front_end/testcases/tabs.dart:13:14: Warning: Getter not found: 'five'.
+// 	   	  print(five);
+// 	   	        ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/tabs.dart.strong.expect b/pkg/front_end/testcases/tabs.dart.strong.expect
index e1519f3..e7be999 100644
--- a/pkg/front_end/testcases/tabs.dart.strong.expect
+++ b/pkg/front_end/testcases/tabs.dart.strong.expect
@@ -1,4 +1,26 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
+// 	print(one);
+// 	      ^^^
+//
+// pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
+// 		print(two);
+// 		      ^^^
+//
+// pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
+// 		  print(three);
+// 		        ^^^^^
+//
+// pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
+// 	   	print(four);
+// 	   	      ^^^^
+//
+// pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
+// 	   	  print(five);
+// 	   	        ^^^^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
 // 	print(one);
diff --git a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
index e1519f3..47ecc13 100644
--- a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
 // 	print(one);
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect b/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
index 770190e..f794c73 100644
--- a/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
 // abstract class A<T> extends T {}
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
index 5df44e4..5c17d4e 100644
--- a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
@@ -1,3 +1,17 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class A<T> extends T {}
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:7:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class B<T> extends T {
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
+// class C<T> extends T {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect b/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
index 515d754..c7067eb 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Warning: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
+//   T.String method() => "Hello, World!";
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
index be7fb5e..7e5d61a 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Warning: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
+//   T.String method() => "Hello, World!";
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
index 837254e..8ff0020 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -1,4 +1,20 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
+//   T.String method() => "Hello, World!";
+//   ^
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
+// Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
+//   T.String method() => "Hello, World!";
+//                        ^
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+//   T.String s = new C().method();
+//                        ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
 //   T.String method() => "Hello, World!";
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
index 9c9e30c..485e406 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
 //   T.String method() => "Hello, World!";
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.direct.expect b/pkg/front_end/testcases/type_variable_uses.dart.direct.expect
index d9bcae3..0356bbd 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.direct.expect
@@ -1,4 +1,66 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+//   static C<T> staticMethod() {
+//               ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:8:11: Warning: Type variables can't be used in static members.
+//     print(T);
+//           ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:9:5: Warning: Type variables can't be used in static members.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:10:7: Warning: Type variables can't be used in static members.
+//     C<T> l;
+//       ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:11:9: Warning: Type variables can't be used in static members.
+//     C<C<T>> ll;
+//         ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:12:13: Warning: Type variables can't be used in static members.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:13:12: Warning: Type variables can't be used in static members.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:14:14: Warning: Type variables can't be used in static members.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:15:20: Warning: Type variables can't be used in static members.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:16:28: Warning: Type variables can't be used in static members.
+//     const <Object>[const C<T>()];
+//                            ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:28:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()];
+//                            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
 //     const C<T>();
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect b/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
index d9bcae3..ddc705b 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
 //     const C<T>();
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.outline.expect b/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
index c58ea8f..45094c8 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
@@ -1,3 +1,9 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+//   static C<T> staticMethod() {
+//               ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.strong.expect b/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
index 705fe6b..945078a 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
@@ -1,4 +1,66 @@
-// Errors:
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
+//   static C<T> staticMethod() {
+//               ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
+//     print(T);
+//           ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
+//     C<T> l;
+//       ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
+//     C<C<T>> ll;
+//         ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()];
+//                            ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/type_variable_uses.dart:28:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()];
+//                            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
 //   static C<T> staticMethod() {
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
index 705fe6b..a14fdb5 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
@@ -1,4 +1,4 @@
-// Errors:
+// Unhandled errors:
 //
 // pkg/front_end/testcases/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
 //   static C<T> staticMethod() {
diff --git a/pkg/front_end/testcases/undefined.dart.strong.expect b/pkg/front_end/testcases/undefined.dart.strong.expect
index 9ccfc9e..06632af 100644
--- a/pkg/front_end/testcases/undefined.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined.dart.strong.expect
@@ -1,3 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class '#lib1::C'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
+//   c. /*@error=UndefinedGetter*/ y;
+//                                 ^
+//
+// pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class '#lib1::C'.
+// Try correcting the name to the name of an existing method, or defining a method named 'g'.
+//   c. /*@error=UndefinedMethod*/ g();
+//                                 ^
+//
+// pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class '#lib1::C'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
+//   c. /*@error=UndefinedSetter*/ y = null;
+//                                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
index 661a043..407c01c 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
+//   c. /*@error=UndefinedGetter*/ x += 1;
+//                                 ^
+//
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
+//   c. /*@error=UndefinedGetter*/ x ??= 1;
+//                                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
index 5750f13..65c4883 100644
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
+++ b/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
@@ -1,3 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Getter not found: 'missingField'.
+//     this. /*@warning=GetterNotFound*/ missingField;
+//                                       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Setter not found: 'missingField'.
+//     this. /*@warning=SetterNotFound*/ missingField = 0;
+//                                       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/warn_unresolved_sends.dart:51:39: Warning: Method not found: 'missingMethod'.
+//     this. /*@warning=MethodNotFound*/ missingMethod();
+//                                       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Getter not found: 'missingField'.
+//     /*@warning=GetterNotFound*/ missingField;
+//                                 ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Setter not found: 'missingField'.
+//     /*@warning=SetterNotFound*/ missingField = 0;
+//                                 ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/warn_unresolved_sends.dart:55:33: Warning: Method not found: 'missingMethod'.
+//     /*@warning=MethodNotFound*/ missingMethod();
+//                                 ^^^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/tool/_fasta/bulk_compile.dart b/pkg/front_end/tool/_fasta/bulk_compile.dart
index 770ad9d..6476b32 100644
--- a/pkg/front_end/tool/_fasta/bulk_compile.dart
+++ b/pkg/front_end/tool/_fasta/bulk_compile.dart
@@ -35,7 +35,7 @@
 
   BulkCompiler(CompilerOptions options)
       : options = new ProcessedOptions(
-            options
+            options: options
               ..packagesFileUri ??= Uri.base.resolve(".packages")
               ..linkedDependencies = <Uri>[
                 computePlatformBinariesLocation().resolve("vm_platform.dill")
@@ -43,7 +43,7 @@
               ..fileSystem = (new FileBackedMemoryFileSystem()
                 ..entities[mainUri.path] =
                     (new MemoryFileSystemEntity(mainUri)..bytes = <int>[])),
-            <Uri>[mainUri]);
+            inputs: <Uri>[mainUri]);
 
   Future<Null> compile(String source) {
     defineSource(mainUri.path, source);
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index f5a391f..2ea3064 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -335,7 +335,7 @@
     }
 
     return new ProcessedOptions(
-        new CompilerOptions()
+        options: new CompilerOptions()
           ..sdkSummary = options["--platform"]
           ..librariesSpecificationUri =
               resolveInputUri(arguments[1], extraSchemes: extraSchemes)
@@ -351,8 +351,8 @@
           ..verbose = verbose
           ..verify = verify
           ..bytecode = bytecode,
-        <Uri>[Uri.parse(arguments[0])],
-        resolveInputUri(arguments[3], extraSchemes: extraSchemes));
+        inputs: <Uri>[Uri.parse(arguments[0])],
+        output: resolveInputUri(arguments[3], extraSchemes: extraSchemes));
   } else if (arguments.isEmpty) {
     return throw new CommandLineProblem.deprecated("No Dart file specified.");
   }
@@ -367,7 +367,8 @@
   final Uri platform = compileSdk
       ? null
       : (options["--platform"] ??
-          computePlatformBinariesLocation().resolve("vm_platform.dill"));
+          computePlatformBinariesLocation().resolve(
+              strongMode ? "vm_platform_strong.dill" : "vm_platform.dill"));
 
   CompilerOptions compilerOptions = new CompilerOptions()
     ..compileSdk = compileSdk
@@ -392,7 +393,8 @@
       inputs.add(resolveInputUri(argument, extraSchemes: extraSchemes));
     }
   }
-  return new ProcessedOptions(compilerOptions, inputs, output);
+  return new ProcessedOptions(
+      options: compilerOptions, inputs: inputs, output: output);
 }
 
 Future<T> withGlobalOptions<T>(
@@ -416,7 +418,7 @@
     options = analyzeCommandLine(
         programName, parsedArguments, areRestArgumentsInputs, verbose);
   } on CommandLineProblem catch (e) {
-    options = new ProcessedOptions(new CompilerOptions());
+    options = new ProcessedOptions();
     problem = e;
   }
 
diff --git a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
index 2f00335..90a9f5f 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
@@ -22,7 +22,6 @@
       Uri platformDill = tmp.resolve("vm_platform.dill");
       Uri outlineDill = tmp.resolve("vm_outline_strong.dill");
       ProcessResult result = await Process.run(dartVm.toFilePath(), <String>[
-        "--no_preview_dart_2",
         compilePlatform.toFilePath(),
         "-v",
         "dart:core",
diff --git a/pkg/front_end/tool/_fasta/compile_platform_test.dart b/pkg/front_end/tool/_fasta/compile_platform_test.dart
index d36b852..b528f4e 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_test.dart
@@ -22,7 +22,6 @@
       Uri platformDill = tmp.resolve("vm_platform.dill");
       Uri outlineDill = tmp.resolve("vm_outline_strong.dill");
       ProcessResult result = await Process.run(dartVm.toFilePath(), <String>[
-        "--no_preview_dart_2",
         compilePlatform.toFilePath(),
         "-v",
         "--strong",
diff --git a/pkg/front_end/tool/_fasta/dump_partial.dart b/pkg/front_end/tool/_fasta/dump_partial.dart
index 9f8bef0..875e62b 100644
--- a/pkg/front_end/tool/_fasta/dump_partial.dart
+++ b/pkg/front_end/tool/_fasta/dump_partial.dart
@@ -4,9 +4,17 @@
 
 /// Utility to dump a truncated .dill file generated by the incremental kernel
 /// generator or by the VM's kernel service.
-import 'dart:io';
-import 'package:kernel/kernel.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart';
+
+import 'dart:io' show File, exitCode;
+
+import 'package:kernel/kernel.dart'
+    show
+        Component,
+        loadComponentFromBinary,
+        loadComponentFromBytes,
+        writeComponentToText;
+
+import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
 main(List<String> args) {
   if (args.length == 0) {
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 9eab27d..3c7af38 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -147,7 +147,9 @@
 
   Future<bool> batchCompile(CompilerOptions options, Uri input, Uri output) {
     return CompilerContext.runWithOptions(
-        new ProcessedOptions(options, <Uri>[input], output), batchCompileImpl);
+        new ProcessedOptions(
+            options: options, inputs: <Uri>[input], output: output),
+        batchCompileImpl);
   }
 
   Future<bool> batchCompileImpl(CompilerContext c) async {
diff --git a/pkg/front_end/tool/fasta b/pkg/front_end/tool/fasta
index 32485f4..2567a4e 100755
--- a/pkg/front_end/tool/fasta
+++ b/pkg/front_end/tool/fasta
@@ -25,18 +25,12 @@
 
 case "${1//_/-}" in
   abcompile) SCRIPT="${TOOL_DIR}/abcompile.dart";;
-  analyzer-compile)
-    stop "'$1' isn't supported anymore, please use 'compile' instead."
-    ;;
   compile) SCRIPT="${TOOL_DIR}/compile.dart";;
   compile-platform) SCRIPT="${TOOL_DIR}/compile_platform.dart";;
   log) SCRIPT="${TOOL_DIR}/log_analyzer.dart";;
   logd) SCRIPT="${TOOL_DIR}/log_collector.dart";;
   outline) SCRIPT="${TOOL_DIR}/outline.dart";;
   parser) SCRIPT="${TOOL_DIR}/parser.dart";;
-  run)
-    stop "'$1' isn't supported anymore, please use 'kernel-service' instead."
-    ;;
   scanner) SCRIPT="${TOOL_DIR}/scanner.dart";;
   dump-partial) SCRIPT="${TOOL_DIR}/dump_partial.dart";;
   dump-ir)
@@ -49,13 +43,6 @@
       stop "Usage: $1 dillfile [output]"
     fi
     ;;
-  kernel-service)
-    shift
-    PATCHED_SDK_DIR=$(
-      ls -d {xcodebuild,out}/${DART_CONFIGURATION} 2>/dev/null \
-        | head -1)
-    exec "${DART_VM}" --preview_dart_2 -DDFE_VERBOSE=true "$@"
-    ;;
   testing)
     SCRIPT="${REPO_DIR}/pkg/testing/bin/testing.dart"
     set -- "$@" "--config=${REPO_DIR}/pkg/front_end/testing.json"
@@ -68,4 +55,4 @@
 
 shift
 
-exec "${DART_VM}" --no_preview_dart_2 -c "${SCRIPT}" "$@"
+exec "${DART_VM}" -c "${SCRIPT}" "$@"
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 4b9fb26..aa76831 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -98,7 +98,7 @@
     ..compileSdk = true
     ..packagesFileUri = Uri.base.resolve('.packages')
     ..target = createTarget(isFlutter: false, strongMode: strongMode);
-  uriResolver = await new ProcessedOptions(options).getUriTranslator();
+  uriResolver = await new ProcessedOptions(options: options).getUriTranslator();
 }
 
 /// Scan [contents] and return the first token produced by the scanner.
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index 0f8f161..8a28dc5 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -127,7 +127,8 @@
   var dir = Directory.systemTemp.createTempSync("ikg-cache");
   compilerOptions.byteStore = createByteStore(cache, dir.path);
 
-  final processedOptions = new ProcessedOptions(compilerOptions, [entryUri]);
+  final processedOptions =
+      new ProcessedOptions(options: compilerOptions, inputs: [entryUri]);
   final UriTranslator uriTranslator = await processedOptions.getUriTranslator();
 
   collector.start("Initial compilation");
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 9aa8b60..97faf8b 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -291,7 +291,7 @@
   FileOffset fileOffset; // Offset of the name of the class.
   FileOffset fileEndOffset;
   Byte flags (levelBit0, levelBit1, isAbstract, isEnum, isAnonymousMixin,
-              isEliminatedMixin); // Where level is index into ClassLevel
+              isEliminatedMixin, isMixinDeclaration); // Where level is index into ClassLevel
   StringReference name;
   List<Expression> annotations;
   List<TypeParameter> typeParameters;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 03a709a..90aa8c7 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -728,6 +728,7 @@
   static const int FlagEnum = 1 << 3;
   static const int FlagAnonymousMixin = 1 << 4;
   static const int FlagEliminatedMixin = 1 << 5;
+  static const int FlagMixinDeclaration = 1 << 6;
 
   int flags = 0;
 
@@ -774,6 +775,38 @@
         value ? (flags | FlagEliminatedMixin) : (flags & ~FlagEliminatedMixin);
   }
 
+  /// True if this class was a mixin declaration in Dart.
+  ///
+  /// Mixins are declared in Dart with the `mixin` keyword.  They are compiled
+  /// to Kernel classes.
+  bool get isMixinDeclaration => flags & FlagMixinDeclaration != 0;
+
+  void set isMixinDeclaration(bool value) {
+    flags = value
+        ? (flags | FlagMixinDeclaration)
+        : (flags & ~FlagMixinDeclaration);
+  }
+
+  List<Supertype> superclassConstraints() {
+    var constraints = <Supertype>[];
+
+    // Not a mixin declaration.
+    if (!isMixinDeclaration) return constraints;
+
+    Class previous = this;
+    Class current = supertype.classNode;
+
+    // Otherwise we have a left-linear binary tree (subtrees are supertype and
+    // mixedInType) of constraints, where all the interior nodes are anonymous
+    // mixin applications.
+    while (current != null && current.isAnonymousMixin) {
+      constraints.add(current.mixedInType);
+      previous = current;
+      current = current.supertype.classNode;
+    }
+    return constraints..add(previous.supertype);
+  }
+
   /// The URI of the source file this class was loaded from.
   Uri fileUri;
 
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 2fae8ce..137b71a3 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -20,6 +20,7 @@
       <LabeledStatement, LabeledStatement>{};
   final Map<SwitchCase, SwitchCase> switchCases = <SwitchCase, SwitchCase>{};
   final Map<TypeParameter, DartType> typeSubstitution;
+  final Map<TypeParameter, TypeParameter> typeParams;
   bool cloneAnnotations;
 
   /// Creates an instance of the cloning visitor for Kernel ASTs.
@@ -29,8 +30,10 @@
   /// annotations in procedure bodies are cloned unconditionally.
   CloneVisitor(
       {Map<TypeParameter, DartType> typeSubstitution,
+      Map<TypeParameter, TypeParameter> typeParams,
       this.cloneAnnotations = true})
-      : this.typeSubstitution = ensureMutable(typeSubstitution);
+      : this.typeSubstitution = ensureMutable(typeSubstitution),
+        this.typeParams = typeParams ?? <TypeParameter, TypeParameter>{};
 
   static Map<TypeParameter, DartType> ensureMutable(
       Map<TypeParameter, DartType> map) {
@@ -460,8 +463,11 @@
   }
 
   visitTypeParameter(TypeParameter node) {
-    var newNode = new TypeParameter(node.name);
-    typeSubstitution[node] = new TypeParameterType(newNode);
+    TypeParameter newNode = typeParams[node];
+    if (newNode == null) {
+      newNode = new TypeParameter(node.name);
+      typeSubstitution[node] = new TypeParameterType(newNode);
+    }
     newNode.bound = visitType(node.bound);
     if (node.defaultType != null) {
       newNode.defaultType = visitType(node.defaultType);
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 7d2f6bd..0346f89 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -127,7 +127,7 @@
 
   /// Whether a library is allowed to import a platform private library.
   ///
-  /// By default only `dart:*` libraries are allowed. May be overriden for
+  /// By default only `dart:*` libraries are allowed. May be overridden for
   /// testing purposes.
   bool allowPlatformPrivateLibraryAccess(Uri importer, Uri imported) =>
       imported.scheme != "dart" ||
@@ -200,6 +200,9 @@
 
   Class concreteMapLiteralClass(CoreTypes coreTypes) => null;
   Class concreteConstMapLiteralClass(CoreTypes coreTypes) => null;
+
+  Class concreteIntLiteralClass(CoreTypes coreTypes, int value) => null;
+  Class concreteStringLiteralClass(CoreTypes coreTypes, String value) => null;
 }
 
 class NoneTarget extends Target {
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 9e1581e..50d244a 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -44,8 +44,6 @@
   ..addFlag('enable-constant-evaluation',
       help: 'Whether kernel constant evaluation will be enabled.',
       defaultsTo: true)
-  ..addMultiOption('entry-points',
-      help: 'Path to JSON file with the list of entry points')
   ..addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false)
   ..addFlag('drop-ast',
       help: 'Drop AST for members with bytecode', defaultsTo: false);
@@ -95,14 +93,6 @@
     return _badUsageExitCode;
   }
 
-  final List<String> entryPoints = options['entry-points'] ?? <String>[];
-  if (entryPoints.isEmpty) {
-    entryPoints.addAll([
-      'pkg/vm/lib/transformations/type_flow/entry_points.json',
-      'pkg/vm/lib/transformations/type_flow/entry_points_extra.json',
-    ]);
-  }
-
   final errorPrinter = new ErrorPrinter();
   final errorDetector = new ErrorDetector(previousErrorHandler: errorPrinter);
 
@@ -124,7 +114,6 @@
       Uri.base.resolveUri(inputUri), compilerOptions,
       aot: aot,
       useGlobalTypeFlowAnalysis: tfa,
-      entryPoints: entryPoints,
       environmentDefines: environmentDefines,
       genBytecode: genBytecode,
       dropAST: dropAST,
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 7de7ecd..24b30f5 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -81,6 +81,8 @@
   List<Label> yieldPoints;
   Map<TreeNode, int> contextLevels;
   List<ClosureBytecode> closures;
+  Set<Field> initializedFields;
+  List<Reference> nullableFields;
   ConstantPool cp;
   ConstantEmitter constantEmitter;
   BytecodeAssembler asm;
@@ -263,20 +265,35 @@
       libraryIndex.getTopLevelMember('dart:_internal', 'unsafeCast');
 
   void _genConstructorInitializers(Constructor node) {
-    bool isRedirecting =
+    final bool isRedirecting =
         node.initializers.any((init) => init is RedirectingInitializer);
+
     if (!isRedirecting) {
+      initializedFields = new Set<Field>();
       for (var field in node.enclosingClass.fields) {
         if (!field.isStatic && field.initializer != null) {
           _genFieldInitializer(field, field.initializer);
         }
       }
     }
+
     visitList(node.initializers, this);
+
+    if (!isRedirecting) {
+      nullableFields = <Reference>[];
+      for (var field in node.enclosingClass.fields) {
+        if (!field.isStatic && !initializedFields.contains(field)) {
+          nullableFields.add(field.reference);
+        }
+      }
+      initializedFields = null; // No more initialized fields, please.
+    }
   }
 
   void _genFieldInitializer(Field field, Expression initializer) {
-    if (initializer is NullLiteral) {
+    assert(!field.isStatic);
+
+    if (initializer is NullLiteral && !initializedFields.contains(field)) {
       return;
     }
 
@@ -285,6 +302,8 @@
 
     final int cpIndex = cp.add(new ConstantInstanceField(field));
     asm.emitStoreFieldTOS(cpIndex);
+
+    initializedFields.add(field);
   }
 
   void _genArguments(Expression receiver, Arguments arguments) {
@@ -677,6 +696,8 @@
     yieldPoints = null; // Initialized when entering sync-yielding closure.
     contextLevels = <TreeNode, int>{};
     closures = <ClosureBytecode>[];
+    initializedFields = null; // Tracked for constructors only.
+    nullableFields = const <Reference>[];
     cp = new ConstantPool();
     constantEmitter = new ConstantEmitter(cp);
     asm = new BytecodeAssembler();
@@ -716,8 +737,8 @@
 
   void end(Member node) {
     if (!hasErrors) {
-      metadata.mapping[node] =
-          new BytecodeMetadata(cp, asm.bytecode, asm.exceptionsTable, closures);
+      metadata.mapping[node] = new BytecodeMetadata(
+          cp, asm.bytecode, asm.exceptionsTable, nullableFields, closures);
     }
 
     enclosingClass = null;
@@ -737,6 +758,8 @@
     yieldPoints = null;
     contextLevels = null;
     closures = null;
+    initializedFields = null;
+    nullableFields = null;
     cp = null;
     constantEmitter = null;
     asm = null;
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index f8ea33f..00cfb12 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -56,8 +56,6 @@
       help:
           'Enable global type flow analysis and related transformations in AOT mode.',
       defaultsTo: false)
-  ..addMultiOption('entry-points',
-      help: 'Path to JSON file with the list of entry points')
   ..addFlag('link-platform',
       help:
           'When in batch mode, link platform kernel file into result kernel file.'
@@ -103,7 +101,15 @@
       help: 'Includes sources into generated dill file. Having sources'
           ' allows to effectively use observatory to debug produced'
           ' application, produces better stack traces on exceptions.',
-      defaultsTo: true);
+      defaultsTo: true)
+  ..addFlag('unsafe-package-serialization',
+      help: 'Potentially unsafe: Does not allow for invalidating packages, '
+          'additionally the output dill file might include more libraries than '
+          'needed. The use case is test-runs, where invalidation is not really '
+          'used, and where dill filesize does not matter, and the gain is '
+          'improved speed.',
+      defaultsTo: false,
+      hide: true);
 
 String usage = '''
 Usage: server [options] [input.dart]
@@ -203,7 +209,7 @@
 /// Class that for test mocking purposes encapsulates creation of [BinaryPrinter].
 class BinaryPrinterFactory {
   /// Creates new [BinaryPrinter] to write to [targetSink].
-  BinaryPrinter newBinaryPrinter(IOSink targetSink) {
+  BinaryPrinter newBinaryPrinter(Sink<List<int>> targetSink) {
     return new LimitedBinaryPrinter(targetSink, (_) => true /* predicate */,
         false /* excludeUriToSource */);
   }
@@ -211,13 +217,16 @@
 
 class FrontendCompiler implements CompilerInterface {
   FrontendCompiler(this._outputStream,
-      {this.printerFactory, this.transformer}) {
+      {this.printerFactory,
+      this.transformer,
+      this.unsafePackageSerialization}) {
     _outputStream ??= stdout;
     printerFactory ??= new BinaryPrinterFactory();
   }
 
   StringSink _outputStream;
   BinaryPrinterFactory printerFactory;
+  bool unsafePackageSerialization;
 
   CompilerOptions _compilerOptions;
   Uri _mainSource;
@@ -349,7 +358,6 @@
           _mainSource, compilerOptions,
           aot: options['aot'],
           useGlobalTypeFlowAnalysis: options['tfa'],
-          entryPoints: options['entry-points'],
           environmentDefines: environmentDefines));
     }
     if (component != null) {
@@ -391,6 +399,9 @@
         return "${r1.canonicalName}".compareTo("${r2.canonicalName}");
       });
     }
+    if (unsafePackageSerialization == true) {
+      writePackagesToSinkAndTrimComponent(component, sink);
+    }
 
     printer.writeComponentFile(component);
     await sink.close();
@@ -498,6 +509,63 @@
     _outputStream.writeln(boundaryKey);
   }
 
+  /// Map of already serialized dill data. All uris in a serialized component
+  /// maps to the same blob of data. Used by
+  /// [writePackagesToSinkAndTrimComponent].
+  Map<Uri, List<int>> cachedPackageLibraries = new Map<Uri, List<int>>();
+
+  writePackagesToSinkAndTrimComponent(
+      Component deltaProgram, Sink<List<int>> ioSink) {
+    if (deltaProgram == null) return;
+
+    List<Library> packageLibraries = new List<Library>();
+    List<Library> libraries = new List<Library>();
+    deltaProgram.computeCanonicalNames();
+
+    for (var lib in deltaProgram.libraries) {
+      Uri uri = lib.importUri;
+      if (uri.scheme == "package") {
+        packageLibraries.add(lib);
+      } else {
+        libraries.add(lib);
+      }
+    }
+    deltaProgram.libraries
+      ..clear()
+      ..addAll(libraries);
+
+    Map<String, List<Library>> newPackages = new Map<String, List<Library>>();
+    Set<List<int>> alreadyAdded = new Set<List<int>>();
+    for (Library lib in packageLibraries) {
+      List<int> data = cachedPackageLibraries[lib.fileUri];
+      if (data != null) {
+        if (alreadyAdded.add(data)) {
+          ioSink.add(data);
+        }
+      } else {
+        String package = lib.importUri.pathSegments.first;
+        newPackages[package] ??= <Library>[];
+        newPackages[package].add(lib);
+      }
+    }
+
+    for (String package in newPackages.keys) {
+      List<Library> libraries = newPackages[package];
+      Component singleLibrary = new Component(
+          libraries: libraries,
+          uriToSource: deltaProgram.uriToSource,
+          nameRoot: deltaProgram.root);
+      ByteSink byteSink = new ByteSink();
+      final BinaryPrinter printer = printerFactory.newBinaryPrinter(byteSink);
+      printer.writeComponentFile(singleLibrary);
+      List<int> data = byteSink.builder.takeBytes();
+      for (Library lib in libraries) {
+        cachedPackageLibraries[lib.fileUri] = data;
+      }
+      ioSink.add(data);
+    }
+  }
+
   @override
   void acceptLastDelta() {
     _generator.accept();
@@ -561,6 +629,17 @@
   }
 }
 
+/// A [Sink] that directly writes data into a byte builder.
+class ByteSink implements Sink<List<int>> {
+  final BytesBuilder builder = new BytesBuilder();
+
+  void add(List<int> data) {
+    builder.add(data);
+  }
+
+  void close() {}
+}
+
 String _escapePath(String path) {
   return path.replaceAll(r'\', r'\\').replaceAll(r' ', r'\ ');
 }
@@ -761,10 +840,9 @@
     }
   }
 
-  compiler ??= new FrontendCompiler(
-    output,
-    printerFactory: binaryPrinterFactory,
-  );
+  compiler ??= new FrontendCompiler(output,
+      printerFactory: binaryPrinterFactory,
+      unsafePackageSerialization: options["unsafe-package-serialization"]);
 
   if (options.rest.isNotEmpty) {
     return await compiler.compile(options.rest[0], options,
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 3b86390..941890e 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -45,7 +45,6 @@
 Future<Component> compileToKernel(Uri source, CompilerOptions options,
     {bool aot: false,
     bool useGlobalTypeFlowAnalysis: false,
-    List<String> entryPoints,
     Map<String, String> environmentDefines,
     bool genBytecode: false,
     bool dropAST: false,
@@ -66,7 +65,6 @@
         component,
         options.strongMode,
         useGlobalTypeFlowAnalysis,
-        entryPoints,
         environmentDefines,
         enableAsserts,
         enableConstantEvaluation,
@@ -94,7 +92,6 @@
     Component component,
     bool strongMode,
     bool useGlobalTypeFlowAnalysis,
-    List<String> entryPoints,
     Map<String, String> environmentDefines,
     bool enableAsserts,
     bool enableConstantEvaluation,
@@ -122,7 +119,7 @@
 
     if (useGlobalTypeFlowAnalysis) {
       globalTypeFlow.transformComponent(
-          compilerOptions.target, coreTypes, component, entryPoints);
+          compilerOptions.target, coreTypes, component);
     } else {
       devirtualization.transformComponent(coreTypes, component);
     }
@@ -135,7 +132,8 @@
 /// be able to report compile-time errors.
 Future<T> runWithFrontEndCompilerContext<T>(Uri source,
     CompilerOptions compilerOptions, Component component, T action()) async {
-  final processedOptions = new ProcessedOptions(compilerOptions, [source]);
+  final processedOptions =
+      new ProcessedOptions(options: compilerOptions, inputs: [source]);
 
   // Run within the context, so we have uri source tokens...
   return await CompilerContext.runWithOptions(processedOptions,
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
index aae9218..40c664c 100644
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -14,9 +14,18 @@
 /// In kernel binary, bytecode metadata is encoded as following:
 ///
 /// type BytecodeMetadata {
+///   UInt flags (HasExceptionsTable, HasNullableFields, HasClosures)
+///
 ///   ConstantPool constantPool
 ///   List<Byte> bytecodes
+///
+///   (optional, present if HasExceptionsTable)
 ///   ExceptionsTable exceptionsTable
+///
+///   (optional, present if HasNullableFields)
+///   List<CanonicalName> nullableFields
+///
+///   (optional, present if HasClosures)
 ///   List<ClosureBytecode> closures
 /// }
 ///
@@ -33,13 +42,27 @@
 /// pkg/vm/lib/bytecode/constant_pool.dart.
 ///
 class BytecodeMetadata {
+  static const hasExceptionsTableFlag = 1 << 0;
+  static const hasNullableFieldsFlag = 1 << 1;
+  static const hasClosuresFlag = 1 << 2;
+
   final ConstantPool constantPool;
   final List<int> bytecodes;
   final ExceptionsTable exceptionsTable;
+  final List<Reference> nullableFields;
   final List<ClosureBytecode> closures;
 
-  BytecodeMetadata(
-      this.constantPool, this.bytecodes, this.exceptionsTable, this.closures);
+  bool get hasExceptionsTable => exceptionsTable.blocks.isNotEmpty;
+  bool get hasNullableFields => nullableFields.isNotEmpty;
+  bool get hasClosures => closures.isNotEmpty;
+
+  int get flags =>
+      (hasExceptionsTable ? hasExceptionsTableFlag : 0) |
+      (hasNullableFields ? hasNullableFieldsFlag : 0) |
+      (hasClosures ? hasClosuresFlag : 0);
+
+  BytecodeMetadata(this.constantPool, this.bytecodes, this.exceptionsTable,
+      this.nullableFields, this.closures);
 
   // TODO(alexmarkov): Consider printing constant pool before bytecode.
   @override
@@ -47,6 +70,7 @@
       "Bytecode {\n"
       "${new BytecodeDisassembler().disassemble(bytecodes, exceptionsTable)}}\n"
       "$exceptionsTable"
+      "${nullableFields.isEmpty ? '' : 'Nullable fields: ${nullableFields.map((ref) => ref.asField).toList()}\n'}"
       "$constantPool"
       "${closures.join('\n')}";
 }
@@ -97,22 +121,44 @@
 
   @override
   void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
+    sink.writeUInt30(metadata.flags);
     metadata.constantPool.writeToBinary(node, sink);
     sink.writeByteList(metadata.bytecodes);
-    metadata.exceptionsTable.writeToBinary(sink);
-    sink.writeUInt30(metadata.closures.length);
-    metadata.closures.forEach((c) => c.writeToBinary(sink));
+    if (metadata.hasExceptionsTable) {
+      metadata.exceptionsTable.writeToBinary(sink);
+    }
+    if (metadata.hasNullableFields) {
+      sink.writeUInt30(metadata.nullableFields.length);
+      metadata.nullableFields.forEach((ref) => sink
+          .writeCanonicalNameReference(getCanonicalNameOfMember(ref.asField)));
+    }
+    if (metadata.hasClosures) {
+      sink.writeUInt30(metadata.closures.length);
+      metadata.closures.forEach((c) => c.writeToBinary(sink));
+    }
   }
 
   @override
   BytecodeMetadata readFromBinary(Node node, BinarySource source) {
+    int flags = source.readUInt();
     final ConstantPool constantPool =
         new ConstantPool.readFromBinary(node, source);
     final List<int> bytecodes = source.readByteList();
-    final exceptionsTable = new ExceptionsTable.readFromBinary(source);
-    final List<ClosureBytecode> closures = new List<ClosureBytecode>.generate(
-        source.readUInt(), (_) => new ClosureBytecode.readFromBinary(source));
+    final exceptionsTable =
+        ((flags & BytecodeMetadata.hasExceptionsTableFlag) != 0)
+            ? new ExceptionsTable.readFromBinary(source)
+            : new ExceptionsTable();
+    final List<Reference> nullableFields =
+        ((flags & BytecodeMetadata.hasNullableFieldsFlag) != 0)
+            ? new List<Reference>.generate(source.readUInt(),
+                (_) => source.readCanonicalNameReference().getReference())
+            : const <Reference>[];
+    final List<ClosureBytecode> closures =
+        ((flags & BytecodeMetadata.hasClosuresFlag) != 0)
+            ? new List<ClosureBytecode>.generate(source.readUInt(),
+                (_) => new ClosureBytecode.readFromBinary(source))
+            : const <ClosureBytecode>[];
     return new BytecodeMetadata(
-        constantPool, bytecodes, exceptionsTable, closures);
+        constantPool, bytecodes, exceptionsTable, nullableFields, closures);
   }
 }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 8b75174..6dd942a 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -15,6 +15,8 @@
     show transformLibraries, transformProcedure;
 
 import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
+import '../transformations/list_factory_specializer.dart'
+    as listFactorySpecializer;
 
 /// Specializes the kernel IR to the Dart VM.
 class VmTarget extends Target {
@@ -24,6 +26,9 @@
   Class _immutableList;
   Class _internalLinkedHashMap;
   Class _immutableMap;
+  Class _oneByteString;
+  Class _twoByteString;
+  Class _smi;
 
   VmTarget(this.flags);
 
@@ -74,6 +79,8 @@
     transformAsync.transformLibraries(coreTypes, libraries, flags.syncAsync);
     logger?.call("Transformed async methods");
 
+    listFactorySpecializer.transformLibraries(libraries, coreTypes);
+
     callSiteAnnotator.transformLibraries(
         component, libraries, coreTypes, hierarchy);
     logger?.call("Annotated call sites");
@@ -321,4 +328,31 @@
     return _immutableMap ??=
         coreTypes.index.getClass('dart:core', '_ImmutableMap');
   }
+
+  @override
+  Class concreteIntLiteralClass(CoreTypes coreTypes, int value) {
+    const int bitsPerInt32 = 32;
+    const int smiBits32 = bitsPerInt32 - 2;
+    const int smiMin32 = -(1 << smiBits32);
+    const int smiMax32 = (1 << smiBits32) - 1;
+    if ((smiMin32 <= value) && (value <= smiMax32)) {
+      // Value fits into Smi on all platforms.
+      return _smi ??= coreTypes.index.getClass('dart:core', '_Smi');
+    }
+    // Otherwise, class could be either _Smi or _Mint depending on a platform.
+    return null;
+  }
+
+  @override
+  Class concreteStringLiteralClass(CoreTypes coreTypes, String value) {
+    const int maxLatin1 = 0xff;
+    for (int i = 0; i < value.length; ++i) {
+      if (value.codeUnitAt(i) > maxLatin1) {
+        return _twoByteString ??=
+            coreTypes.index.getClass('dart:core', '_TwoByteString');
+      }
+    }
+    return _oneByteString ??=
+        coreTypes.index.getClass('dart:core', '_OneByteString');
+  }
 }
diff --git a/pkg/vm/lib/transformations/list_factory_specializer.dart b/pkg/vm/lib/transformations/list_factory_specializer.dart
new file mode 100644
index 0000000..ca9df25
--- /dev/null
+++ b/pkg/vm/lib/transformations/list_factory_specializer.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.transformations.list_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+/// Replaces new List() and new List(n) with VM-specific
+/// new _GrowableList(0) and new _List(n).
+void transformLibraries(List<Library> libraries, CoreTypes coreTypes) {
+  final transformer = new _ListFactorySpecializer(coreTypes);
+  libraries.forEach(transformer.visitLibrary);
+}
+
+class _ListFactorySpecializer extends Transformer {
+  final Procedure _listFactory;
+  final Procedure _growableListFactory;
+  final Procedure _fixedListFactory;
+
+  _ListFactorySpecializer(CoreTypes coreTypes)
+      : _listFactory = coreTypes.index.getMember('dart:core', 'List', ''),
+        _growableListFactory =
+            coreTypes.index.getMember('dart:core', '_GrowableList', ''),
+        _fixedListFactory =
+            coreTypes.index.getMember('dart:core', '_List', '') {
+    assert(_listFactory.isFactory);
+    assert(_growableListFactory.isFactory);
+    assert(_fixedListFactory.isFactory);
+  }
+
+  @override
+  visitStaticInvocation(StaticInvocation node) {
+    super.visitStaticInvocation(node);
+
+    if (node.target == _listFactory) {
+      if (node.arguments.positional.isEmpty) {
+        return new StaticInvocation(_growableListFactory,
+            new Arguments([new IntLiteral(0)], types: node.arguments.types))
+          ..parent = node.parent
+          ..fileOffset = node.fileOffset;
+      } else {
+        return new StaticInvocation(_fixedListFactory, node.arguments)
+          ..parent = node.parent
+          ..fileOffset = node.fileOffset;
+      }
+    }
+
+    return node;
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index d11f83c..ee93bf3 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -1191,7 +1191,7 @@
 
   TypeFlowAnalysis(this.target, Component component, CoreTypes coreTypes,
       ClosedWorldClassHierarchy hierarchy, this.environment, this.libraryIndex,
-      {List<String> entryPointsJSONFiles, PragmaAnnotationParser matcher})
+      {PragmaAnnotationParser matcher})
       : annotationMatcher =
             matcher ?? new ConstantPragmaAnnotationParser(coreTypes) {
     nativeCodeOracle = new NativeCodeOracle(libraryIndex, annotationMatcher);
@@ -1201,10 +1201,6 @@
     _invocationsCache = new _InvocationsCache(this);
     workList = new _WorkList(this);
 
-    if (entryPointsJSONFiles != null) {
-      nativeCodeOracle.processEntryPointsJSONFiles(entryPointsJSONFiles, this);
-    }
-
     component.accept(new PragmaEntryPointsVisitor(
         this, nativeCodeOracle, annotationMatcher));
   }
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 2c38d28..6d6fe93 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -5,9 +5,7 @@
 /// Handling of native code and entry points.
 library vm.transformations.type_flow.native_code;
 
-import 'dart:convert' show json;
 import 'dart:core' hide Type;
-import 'dart:io' show File;
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart' show CoreTypes;
@@ -281,20 +279,4 @@
       return new Type.fromStatic(member.function.returnType);
     }
   }
-
-  /// Reads JSON files [jsonFiles] describing entry points and native methods.
-  /// Currently just checks that JSON file is empty as it is deprecated.
-  void processEntryPointsJSONFiles(
-      List<String> jsonFiles, EntryPointsListener entryPointsListener) {
-    for (var file in jsonFiles) {
-      String jsonString = new File(file).readAsStringSync();
-      final jsonObject = json.decode(jsonString);
-
-      final roots = jsonObject['roots'];
-      if (roots != null && roots.isNotEmpty) {
-        throw "Error: Found non-empty entry points JSON file $file."
-            " Use the @pragma('vm:entry-point') annotation instead.";
-      }
-    }
-  }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 984521d..c4a8931 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -554,6 +554,22 @@
 
   Class get _superclass => _environment.thisType.classNode.superclass;
 
+  Type _intLiteralType(int value) {
+    Class concreteClass =
+        target.concreteIntLiteralClass(_environment.coreTypes, value);
+    return concreteClass != null
+        ? _entryPointsListener.addAllocatedClass(concreteClass)
+        : _intType;
+  }
+
+  Type _stringLiteralType(String value) {
+    Class concreteClass =
+        target.concreteStringLiteralClass(_environment.coreTypes, value);
+    return concreteClass != null
+        ? _entryPointsListener.addAllocatedClass(concreteClass)
+        : _stringType;
+  }
+
   void _handleNestedFunctionNode(FunctionNode node) {
     var oldReturn = _returnValue;
     var oldVariables = _variables;
@@ -589,7 +605,7 @@
 
   @override
   TypeExpr visitIntLiteral(IntLiteral node) {
-    return _intType;
+    return _intLiteralType(node.value);
   }
 
   @override
@@ -892,7 +908,7 @@
 
   @override
   TypeExpr visitStringLiteral(StringLiteral node) {
-    return _stringType;
+    return _stringLiteralType(node.value);
   }
 
   @override
@@ -1234,7 +1250,7 @@
 
   @override
   Type visitIntConstant(IntConstant constant) {
-    return summaryCollector._intType;
+    return summaryCollector._intLiteralType(constant.value);
   }
 
   @override
@@ -1244,7 +1260,7 @@
 
   @override
   Type visitStringConstant(StringConstant constant) {
-    return summaryCollector._stringType;
+    return summaryCollector._stringLiteralType(constant.value);
   }
 
   @override
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index fcfd575..6233e44 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -32,8 +32,8 @@
 
 /// Whole-program type flow analysis and transformation.
 /// Assumes strong mode and closed world.
-Component transformComponent(Target target, CoreTypes coreTypes,
-    Component component, List<String> entryPoints,
+Component transformComponent(
+    Target target, CoreTypes coreTypes, Component component,
     [PragmaAnnotationParser matcher]) {
   void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
   final hierarchy = new ClassHierarchy(component,
@@ -52,7 +52,7 @@
 
   final typeFlowAnalysis = new TypeFlowAnalysis(
       target, component, coreTypes, hierarchy, types, libraryIndex,
-      entryPointsJSONFiles: entryPoints, matcher: matcher);
+      matcher: matcher);
 
   Procedure main = component.mainMethod;
   final Selector mainSelector = new DirectSelector(main);
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 5011141..fead08b 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -57,6 +57,31 @@
               '\n'
               'static method main() → dynamic {}\n'));
     });
+
+    test('compile exclude sources', () async {
+      var systemTempDir = Directory.systemTemp;
+      var file = new File('${systemTempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("main() {}\n");
+
+      CompilerOptions optionsExcludeSources = options..embedSourceText = false;
+      IncrementalCompiler compiler =
+          new IncrementalCompiler(optionsExcludeSources, file.uri);
+      Component component = await compiler.compile();
+
+      for (Source source in component.uriToSource.values) {
+        expect(source.source.length, equals(0));
+      }
+
+      final StringBuffer buffer = new StringBuffer();
+      new Printer(buffer, showExternal: false, showMetadata: true)
+          .writeLibraryFile(component.mainMethod.enclosingLibrary);
+      expect(
+          buffer.toString(),
+          equals('library;\n'
+              'import self as self;\n'
+              '\n'
+              'static method main() → dynamic {}\n'));
+    });
   });
 
   group('multiple kernels', () {
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index 3f8da8d..ccd5956 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -24,7 +24,7 @@
 
   final coreTypes = new CoreTypes(component);
 
-  component = transformComponent(target, coreTypes, component, [],
+  component = transformComponent(target, coreTypes, component,
       new ExpressionPragmaAnnotationParser(coreTypes));
 
   final actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 10f84a5..af62c71 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -496,6 +496,7 @@
   PushNull
   ReturnTOS
 }
+Nullable fields: [#lib::B::foo]
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index 5268d47..16ddfcb 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -31,6 +31,7 @@
   PushNull
   ReturnTOS
 }
+Nullable fields: [#lib::A::foo1, #lib::A::foo2]
 ConstantPool {
   [0] = InstanceField #lib::A::foo3
   [1] = Reserved
@@ -69,6 +70,7 @@
   PushNull
   ReturnTOS
 }
+Nullable fields: [#lib::A::foo2, #lib::A::foo4]
 ConstantPool {
   [0] = InstanceField #lib::A::foo3
   [1] = Reserved
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart b/pkg/vm/testcases/bytecode/instance_creation.dart
index 05a745b..8bfa5d7 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart
@@ -79,6 +79,10 @@
 
 class TestTypeArgReuse<P, Q> extends Base<P, Q> implements K<P, Q> {}
 
+foo6() => new List<String>();
+
+foo7(int n) => new List<int>(n);
+
 main() {
   foo1();
   foo2();
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index 127251d..e0d510a 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -48,6 +48,7 @@
   PushNull
   ReturnTOS
 }
+Nullable fields: [#lib::Base::t1, #lib::Base::t2]
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
@@ -563,6 +564,44 @@
 Bytecode {
   Entry                0
   CheckStack
+  PushConstant         CP#0
+  PushInt              0
+  PushConstant         CP#2
+  IndirectStaticCall   2, CP#1
+  ReturnTOS
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsForInstanceAllocation dart.core::_GrowableList [dart.core::String]
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::_GrowableList::', arg-desc CP#1
+}
+]static method foo6() → dynamic
+  return core::_GrowableList::•<core::String>(0);
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  Push                 FP[-5]
+  PushConstant         CP#2
+  IndirectStaticCall   2, CP#1
+  ReturnTOS
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsForInstanceAllocation dart.core::_List [dart.core::int]
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::_List::', arg-desc CP#1
+}
+]static method foo7(core::int n) → dynamic
+  return core::_List::•<core::int>(n);
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
   PushConstant         CP#1
   IndirectStaticCall   0, CP#0
   Drop1
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index b36ef8c..d4deb68 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -7,9 +7,9 @@
 ------------ #lib::bool_expressions ------------
 t0* = _Call direct [#lib::foo] ()
 t1* = _Call direct [#lib::bar] ()
-t2* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::int)+)
-i = _Join [dart.core::int] (_T (dart.core::int)+, t2)
-t4* = _Call [dart.core::num::<] (i, _T (dart.core::int)+)
+t2* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int] (_T (dart.core::_Smi), t2)
+t4* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
 t5* = _Call direct [#lib::bar] ()
 x = _Join [dart.core::bool] (t5, _T (dart.core::bool)+)
 t7* = _Call direct [#lib::foo] ()
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect
index 35081b4..770e1df 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect
@@ -1,4 +1,4 @@
 ------------ #lib::main ------------
 %args = _Parameter #0 [_T (dart.core::List<dynamic>)+?]
-t1 = _Call direct [dart.core::print] (_T (dart.core::String)+)
+t1 = _Call direct [dart.core::print] (_T (dart.core::_OneByteString))
 RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
index 1f8da63..9a3e510 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
@@ -19,7 +19,7 @@
 RESULT: _T (#lib::T)
 ------------ #lib::return2 ------------
 %i = _Parameter #0 [_T (dart.core::int)+?]
-t1* = _Call [dart.core::num::-] (%i, _T (dart.core::int)+)
+t1* = _Call [dart.core::num::-] (%i, _T (dart.core::_Smi))
 t2* = _Call direct [#lib::return2] (t1)
 RESULT: t2
 ------------ #lib::return3 ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
index 2cad426..8fa3835 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
@@ -12,7 +12,7 @@
 t2* = _Call direct get [#lib::someStatic] ()
 t3 = _Call direct [#lib::A::] (_T (#lib::A))
 a1 = _Join [dart.core::Object] (%a1, _T (#lib::A), _T (#lib::B))
-t5 = _Call direct [#lib::bar] (a1, _T (dart.core::int)+)
+t5 = _Call direct [#lib::bar] (a1, _T (dart.core::_Smi))
 t6 = _Call direct [#lib::B::] (_T (#lib::B))
 t7* = _Call [dart.core::Object::==] (a1, %a2)
 t8 = _Join [dart.core::Object] (a1, %a2)
@@ -23,8 +23,8 @@
 %a2 = _Parameter #1 [_T (dart.core::int)+?]
 t2 = _Narrow (%a1 to _T (dart.core::int)+)
 t3* = _Call [dart.core::num::+] (t2, %a2)
-t4* = _Call [dart.core::num::*] (t3, _T (dart.core::int)+)
-t5* = _Call [dart.core::int::unary-] (_T (dart.core::int)+)
+t4* = _Call [dart.core::num::*] (t3, _T (dart.core::_Smi))
+t5* = _Call [dart.core::int::unary-] (_T (dart.core::_Smi))
 %result = _Join [dart.core::int] (t4, t5)
 RESULT: %result
 ------------ #lib::loop1 ------------
@@ -35,10 +35,10 @@
 RESULT: x
 ------------ #lib::loop2 ------------
 %x = _Parameter #0 [_T (dart.core::int)+?]
-t1* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::int)+)
-i = _Join [dart.core::int] (_T (dart.core::int)+, t1)
-t3* = _Call [dart.core::num::<] (i, _T (dart.core::int)+)
-t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::int)+)
+t1* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int] (_T (dart.core::_Smi), t1)
+t3* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
+t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
 x = _Join [dart.core::int] (%x, t4)
 RESULT: x
 ------------ #lib::main ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index 46769b4..8347032 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -11,7 +11,7 @@
   }
   return true;
 }
-static method nThPrimeNumber([@vm.inferred-type.metadata=int] core::int n) → core::int {
+static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi] core::int n) → core::int {
   core::int counter = 0;
   for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index e158e50..5831363 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -4,20 +4,20 @@
 import "dart:typed_data" as typ;
 
 class _Vector extends core::Object {
-[@vm.inferred-type.metadata=int]  final field core::int _offset;
-[@vm.inferred-type.metadata=int]  final field core::int _length;
+[@vm.inferred-type.metadata=dart.core::_Smi]  final field core::int _offset;
+[@vm.inferred-type.metadata=dart.core::_Smi]  final field core::int _length;
 [@vm.inferred-type.metadata=dart.typed_data::_Float64List]  final field core::List<core::double> _elements;
-  constructor •([@vm.inferred-type.metadata=int] core::int size) → void
+  constructor •([@vm.inferred-type.metadata=dart.core::_Smi] core::int size) → void
     : self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
     ;
   operator [](core::int i) → core::double
-    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=int] this.{self::_Vector::_offset}));
-  operator []=([@vm.inferred-type.metadata=!] core::int i, core::double value) → void {
-    let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=int] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
+    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
+  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
+    let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
   operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
     core::double result = 0.0;
-    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=int] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1))
+    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1))
       result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
     return result;
   }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index 0e43e97..aebe06c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -48,7 +48,7 @@
 static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A aa) → void {
   [@vm.direct-call.metadata=#lib::C::foo??] aa.{self::A::foo}();
 }
-static method callerE1([@vm.inferred-type.metadata=!] dynamic x) → void {
+static method callerE1([@vm.inferred-type.metadata=dart.core::_OneByteString] dynamic x) → void {
   [@vm.direct-call.metadata=dart.core::_StringBase::toString] x.{core::Object::toString}();
 }
 static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index 64585aa..d265afa 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -51,7 +51,7 @@
     return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
   no-such-method-forwarder method foo() → dynamic
     return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
-  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=int] dynamic a1, [@vm.inferred-type.metadata=int] dynamic a2, [@vm.inferred-type.metadata=int] dynamic a3, [[@vm.inferred-type.metadata=int] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
+  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
     return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("bazz", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 abstract class C extends core::Object {
@@ -70,7 +70,7 @@
     return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
   no-such-method-forwarder method foo() → dynamic
     return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
-  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=int] dynamic a1, [@vm.inferred-type.metadata=int] dynamic a2, [@vm.inferred-type.metadata=int] dynamic a3, [[@vm.inferred-type.metadata=int] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
+  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
     return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("bazz", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class E extends core::Object implements self::A {
@@ -103,7 +103,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method foo({[@vm.inferred-type.metadata=int] dynamic left = null, [@vm.inferred-type.metadata=int] dynamic right = null}) → dynamic
+  method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = null, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = null}) → dynamic
     return new self::T6::•();
   method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T7::•();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index 8ef426f..6c49846 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -16,7 +16,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
+  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
     [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = a5 as{TypeError} self::T1;
   }
 }
@@ -39,7 +39,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=int?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
+  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
     [@vm.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
   }
 }
@@ -72,7 +72,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=int?] dynamic a5 = null, [@vm.inferred-type.metadata=int?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
+  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
     [@vm.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
   }
 }
@@ -95,7 +95,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=int?] dynamic a4 = null, [@vm.inferred-type.metadata=int?] dynamic a5 = null, [@vm.inferred-type.metadata=int?] dynamic a6 = null, [@vm.inferred-type.metadata=int?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
+  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
     [@vm.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
   }
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
index 4cf2073..1b2f0e8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
@@ -13,7 +13,7 @@
     : super self::A::•()
     ;
   method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar() as{TypeError} core::num) as{TypeError} core::int;
   method bar() → core::int
     return 3;
 }
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index 9dae451..2339405 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -89,9 +89,6 @@
 export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
 BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
 
-ENTRY_POINTS="--entry-points ${BIN_DIR}/gen/runtime/bin/precompiler_entry_points.json \
-              --entry-points ${SDK_DIR}/pkg/vm/lib/transformations/type_flow/entry_points_extra.json"
-
 # Step 1: Generate Kernel binary from the input Dart source.
 "$BIN_DIR"/dart                                                                \
      "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart"                                   \
@@ -99,7 +96,6 @@
      --aot                                                                     \
      "${GEN_KERNEL_OPTIONS[@]}"                                                \
      $PACKAGES                                                                 \
-     $ENTRY_POINTS                                                             \
      -o "$SNAPSHOT_FILE.dill"                                                  \
      "$SOURCE_FILE"
 
diff --git a/pkg/vm/tool/test_bytecode b/pkg/vm/tool/test_bytecode
index b939757..9f800ab 100755
--- a/pkg/vm/tool/test_bytecode
+++ b/pkg/vm/tool/test_bytecode
@@ -11,9 +11,9 @@
 
 set -e
 
-# Pick the architecture and mode to build and test.
-BUILD_FLAGS="-m debug -a x64 --bytecode"
-BUILD_SUBDIR="DebugX64KBC"
+# Pick the architecture and mode to test.
+BUILD_FLAGS="-m release -a x64"
+BUILD_SUBDIR="ReleaseX64"
 
 function follow_links() {
   file="$1"
@@ -33,23 +33,9 @@
 SDK_DIR="$CUR_DIR/../../.."
 BUILD_DIR="$SDK_DIR/out/$BUILD_SUBDIR"
 
-# Verify that the VM supports the interpreter, if not, rebuild it.
-REBUILD=0
-if [ -f $BUILD_DIR/dart ]
-then
-  $BUILD_DIR/dart --trace-interpreter-after=-1 \
-    $SDK_DIR/runtime/tests/vm/dart/hello_world_test.dart > /dev/null 2>&1 \
-    || REBUILD=1
-else
-  REBUILD=1
-fi
-if [ $REBUILD -ne 0 ]
-then
-  echo "Rebuilding VM to support interpreter"
-  rm -rf $BUILD_DIR
-  $SDK_DIR/tools/gn.py $BUILD_FLAGS
-  $SDK_DIR/tools/build.py $BUILD_FLAGS runtime
-fi
+# Regenerate vm_platform_strong.dill to contain bytecode if needed:
+# $SDK_DIR/tools/gn.py $BUILD_FLAGS --bytecode
+# $SDK_DIR/tools/build.py $BUILD_FLAGS runtime
 
 # Generate dill file containing bytecode for input dart source.
 $CUR_DIR/gen_kernel --platform $BUILD_DIR/vm_platform_strong.dill \
@@ -63,10 +49,11 @@
 # $BUILD_DIR/dart $SDK_DIR/pkg/vm/bin/dump_kernel.dart \
 #   $BUILD_DIR/test_bytecode.dill $BUILD_DIR/test_bytecode.txt
 
-# Required flags.
-DART_VM_FLAGS="--optimization-counter-threshold=-1 $DART_VM_FLAGS"
+# Required flag.
+DART_VM_FLAGS="--enable-interpreter $DART_VM_FLAGS"
 
 # Optional flags examples. Uncomment as needed.
+# DART_VM_FLAGS="--compilation-counter-threshold=-1 $DART_VM_FLAGS"
 # DART_VM_FLAGS="--force-log-flush --isolate-log-filter=\"\" $DART_VM_FLAGS"
 # DART_VM_FLAGS="--dump-kernel-bytecode $DART_VM_FLAGS"
 # DART_VM_FLAGS="--trace-interpreter-after=0 $DART_VM_FLAGS"
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 242e976..856dcae 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -6,7 +6,6 @@
 import("../../sdk/lib/_http/http_sources.gni")
 import("../../sdk/lib/io/io_sources.gni")
 import("../../sdk/lib/cli/cli_sources.gni")
-import("../../utils/generate_entry_points_json.gni")
 import("../runtime_args.gni")
 import("../vm/heap/heap_sources.gni")
 import("../vm/compiler/compiler_sources.gni")
@@ -661,13 +660,6 @@
   ]
   args = [
     "--deterministic",
-
-    # TODO(asiva) remove these flags once the core snapshot is switched to
-    # dart 2.
-    "--no-strong",
-    "--no-sync-async",
-    "--reify-generic-functions",
-
     "--snapshot_kind=" + dart_core_snapshot_kind,
     "--vm_snapshot_data=" + rebase_path(vm_snapshot_data, root_build_dir),
     "--vm_snapshot_instructions=" +
@@ -1122,6 +1114,42 @@
   ]
 }
 
+prebuilt_dart_action("gen_kernel_bytecode_dill") {
+  if (target_os == "fuchsia") {
+    testonly = true
+  }
+
+  deps = [
+    "../vm:vm_platform",
+  ]
+  platform_dill = "$root_out_dir/vm_platform_strong.dill"
+
+  output = "$root_out_dir/gen_kernel_bytecode.dill"
+  outputs = [
+    output,
+  ]
+
+  script = "../../pkg/vm/bin/gen_kernel.dart"
+
+  depfile = "$target_gen_dir/gen_kernel_bytecode.dill.d"
+  abs_depfile = rebase_path(depfile)
+  rebased_output = rebase_path(output, root_out_dir)
+  vm_args = [
+    "--depfile=$abs_depfile",
+    "--depfile_output_filename=$rebased_output",
+  ]
+
+  args = [
+    "--gen-bytecode",
+    "--no-embed-sources",
+    "--platform",
+    rebase_path(platform_dill),
+    "--output",
+    rebase_path(output),
+    rebase_path(script),
+  ]
+}
+
 executable("run_vm_tests") {
   if (target_os == "fuchsia") {
     testonly = true
@@ -1140,6 +1168,7 @@
   deps = [
     ":dart_kernel_platform_cc",
     ":dart_snapshot_cc",
+    ":gen_kernel_bytecode_dill",
     ":generate_snapshot_test_dat_file",
     ":libdart_builtin",
     ":standalone_dart_io",
@@ -1239,11 +1268,3 @@
     ldflags = [ "/LIBPATH:$abs_root_out_dir" ]
   }
 }
-
-generate_entry_points_json_with_dart_bootstrap(
-    "precompiler_entry_points_json") {
-  # Dart script to precompile (any valid script would suffice).
-  input = "../tests/vm/dart/hello_world_test.dart"
-
-  output = "$target_gen_dir/precompiler_entry_points.json"
-}
diff --git a/runtime/bin/dart_io_entries.txt b/runtime/bin/dart_io_entries.txt
deleted file mode 100644
index b0f5fe4..0000000
--- a/runtime/bin/dart_io_entries.txt
+++ /dev/null
@@ -1,3 +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.
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 1a93dd0..690cf4d 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -81,10 +81,6 @@
 // of a generic snapshot that contains only the corelibs).
 static char* app_script_name = NULL;
 
-// Global state that captures the entry point manifest files specified on the
-// command line.
-static CommandLineOptions* entry_points_files = NULL;
-
 // The environment provided through the command line using -D options.
 static dart::SimpleHashMap* environment = NULL;
 
@@ -138,8 +134,12 @@
 #undef BOOL_OPTION_DEFINITION
 
 DEFINE_ENUM_OPTION(snapshot_kind, SnapshotKind, snapshot_kind);
-DEFINE_STRING_OPTION_CB(embedder_entry_points_manifest,
-                        { entry_points_files->AddArgument(value); });
+DEFINE_STRING_OPTION_CB(embedder_entry_points_manifest, {
+  Log::PrintErr(
+      "Option --embedder_entry_points_manifest is no longer supported."
+      " Use @pragma(\'vm:entry-point\') instead.\n");
+  exit(kErrorExitCode);
+});
 DEFINE_STRING_OPTION_CB(url_mapping,
                         { DartUtils::url_mapping->AddArgument(value); });
 DEFINE_CB_OPTION(ProcessEnvironmentOption);
@@ -203,7 +203,6 @@
 "--vm_snapshot_instructions=<output-file>                                    \n"
 "--isolate_snapshot_data=<output-file>                                       \n"
 "--isolate_snapshot_instructions=<output-file>                               \n"
-"{--embedder_entry_points_manifest=<input-file>}                             \n"
 "[--obfuscate]                                                               \n"
 "[--save-obfuscation-map=<map-filename>]                                     \n"
 " <dart-script-file>                                                         \n"
@@ -212,22 +211,10 @@
 "as a static or dynamic library:                                             \n"
 "--snapshot_kind=app-aot-assembly                                            \n"
 "--assembly=<output-file>                                                    \n"
-"{--embedder_entry_points_manifest=<input-file>}                             \n"
 "[--obfuscate]                                                               \n"
 "[--save-obfuscation-map=<map-filename>]                                     \n"
 "<dart-script-file>                                                          \n"
 "                                                                            \n"
-"AOT snapshots require entry points manifest files, which list the places    \n"
-"in the Dart program the embedder calls from the C API (Dart_Invoke, etc).   \n"
-"Not specifying these may cause the tree shaker to remove them from the      \n"
-"program. The format of this manifest is as follows. Each line in the        \n"
-"manifest is a comma separated list of three elements. The first entry is    \n"
-"the library URI, the second entry is the class name and the final entry     \n"
-"the function name. The file must be terminated with a newline character.    \n"
-"                                                                            \n"
-"Example:                                                                    \n"
-"    dart:something,SomeClass,doSomething                                    \n"
-"                                                                            \n"
 "AOT snapshots can be obfuscated: that is all identifiers will be renamed    \n"
 "during compilation. This mode is enabled with --obfuscate flag. Mapping     \n"
 "between original and obfuscated names can be serialized as a JSON array     \n"
@@ -776,300 +763,6 @@
   return lib;
 }
 
-static void LoadEntryPoint(size_t lib_index,
-                           const Dart_QualifiedFunctionName* entry) {
-  if (strcmp(entry->library_uri, "::") == 0) {
-    return;  // Root library always loaded; can't `import '::';`.
-  }
-
-  Dart_Handle library_string = Dart_NewStringFromCString(entry->library_uri);
-  DART_CHECK_VALID(library_string);
-  Dart_Handle library = Dart_LookupLibrary(library_string);
-  // Embedder entry points may be setup in libraries that have not been
-  // explicitly loaded by the application script. In such cases, library lookup
-  // will fail. Manually load those libraries.
-  if (Dart_IsError(library)) {
-    static const uint32_t kLoadBufferMaxSize = 128;
-    char* load_buffer =
-        reinterpret_cast<char*>(calloc(kLoadBufferMaxSize, sizeof(char)));
-    snprintf(load_buffer, kLoadBufferMaxSize, "import '%s';",
-             DartUtils::GetStringValue(library_string));
-    Dart_Handle script_handle = Dart_NewStringFromCString(load_buffer);
-    memset(load_buffer, 0, kLoadBufferMaxSize);
-    snprintf(load_buffer, kLoadBufferMaxSize, "dart:_snapshot_%zu", lib_index);
-    Dart_Handle script_url = Dart_NewStringFromCString(load_buffer);
-    free(load_buffer);
-    Dart_Handle loaded =
-        Dart_LoadLibrary(script_url, Dart_Null(), script_handle, 0, 0);
-    DART_CHECK_VALID(loaded);
-
-    // Do a fresh lookup
-    library = Dart_LookupLibrary(library_string);
-  }
-
-  DART_CHECK_VALID(library);
-}
-
-static void ImportNativeEntryPointLibrariesIntoRoot(
-    const Dart_QualifiedFunctionName* entries) {
-  if (entries == NULL) {
-    return;
-  }
-
-  size_t index = 0;
-  while (true) {
-    Dart_QualifiedFunctionName entry = entries[index++];
-    if (entry.library_uri == NULL) {
-      // The termination sentinel has null members.
-      break;
-    }
-    if (strcmp(entry.library_uri, "::") != 0) {
-      Dart_Handle entry_library =
-          Dart_LookupLibrary(Dart_NewStringFromCString(entry.library_uri));
-      DART_CHECK_VALID(entry_library);
-      Dart_Handle import_result = Dart_LibraryImportLibrary(
-          entry_library, Dart_RootLibrary(), Dart_EmptyString());
-      DART_CHECK_VALID(import_result);
-    }
-  }
-}
-
-static void LoadEntryPoints(const Dart_QualifiedFunctionName* entries) {
-  if (entries == NULL) {
-    return;
-  }
-
-  // Setup native resolvers for all libraries found in the manifest.
-  size_t index = 0;
-  while (true) {
-    Dart_QualifiedFunctionName entry = entries[index++];
-    if (entry.library_uri == NULL) {
-      // The termination sentinel has null members.
-      break;
-    }
-    // Ensure library named in entry point is loaded.
-    LoadEntryPoint(index, &entry);
-  }
-}
-
-static void CleanupEntryPointItem(const Dart_QualifiedFunctionName* entry) {
-  if (entry == NULL) {
-    return;
-  }
-  // The allocation used for these entries is zero'ed. So even in error cases,
-  // references to some entries will be null. Calling this on an already cleaned
-  // up entry is programmer error.
-  free(const_cast<char*>(entry->library_uri));
-  free(const_cast<char*>(entry->class_name));
-  free(const_cast<char*>(entry->function_name));
-}
-
-static void CleanupEntryPointsCollection(Dart_QualifiedFunctionName* entries) {
-  if (entries == NULL) {
-    return;
-  }
-
-  size_t index = 0;
-  while (true) {
-    Dart_QualifiedFunctionName entry = entries[index++];
-    if (entry.library_uri == NULL) {
-      break;
-    }
-    CleanupEntryPointItem(&entry);
-  }
-  free(entries);
-}
-
-char* ParserErrorStringCreate(const char* format, ...) {
-  static const size_t kErrorBufferSize = 256;
-
-  char* error_buffer =
-      reinterpret_cast<char*>(calloc(kErrorBufferSize, sizeof(char)));
-  va_list args;
-  va_start(args, format);
-  vsnprintf(error_buffer, kErrorBufferSize, format, args);
-  va_end(args);
-
-  // In case of error, the buffer is released by the caller
-  return error_buffer;
-}
-
-const char* ParseEntryNameForIndex(uint8_t index) {
-  switch (index) {
-    case 0:
-      return "Library";
-    case 1:
-      return "Class";
-    case 2:
-      return "Function";
-    default:
-      return "Unknown";
-  }
-  return NULL;
-}
-
-static bool ParseEntryPointsManifestSingleLine(
-    const char* line,
-    Dart_QualifiedFunctionName* entry,
-    char** error) {
-  bool success = true;
-  size_t offset = 0;
-  for (uint8_t i = 0; i < 3; i++) {
-    const char* component = strchr(line + offset, i == 2 ? '\n' : ',');
-    if (component == NULL) {
-      success = false;
-      *error = ParserErrorStringCreate(
-          "Manifest entries must be comma separated and newline terminated. "
-          "Could not parse '%s' on line '%s'",
-          ParseEntryNameForIndex(i), line);
-      break;
-    }
-
-    int64_t chars_read = component - (line + offset);
-    if (chars_read <= 0) {
-      success = false;
-      *error =
-          ParserErrorStringCreate("There is no '%s' specified on line '%s'",
-                                  ParseEntryNameForIndex(i), line);
-      break;
-    }
-
-    if (entry != NULL) {
-      // These allocations are collected in |CleanupEntryPointsCollection|.
-      char* entry_item =
-          reinterpret_cast<char*>(calloc(chars_read + 1, sizeof(char)));
-      memmove(entry_item, line + offset, chars_read);
-
-      switch (i) {
-        case 0:  // library
-          entry->library_uri = entry_item;
-          break;
-        case 1:  // class
-          entry->class_name = entry_item;
-          break;
-        case 2:  // function
-          entry->function_name = entry_item;
-          break;
-        default:
-          free(entry_item);
-          success = false;
-          *error = ParserErrorStringCreate("Internal parser error\n");
-          break;
-      }
-    }
-
-    offset += chars_read + 1;
-  }
-  return success;
-}
-
-int64_t ParseEntryPointsManifestLines(FILE* file,
-                                      Dart_QualifiedFunctionName* collection) {
-  int64_t entries = 0;
-
-  static const int kManifestMaxLineLength = 1024;
-  char* line = reinterpret_cast<char*>(malloc(kManifestMaxLineLength));
-  size_t line_number = 0;
-  while (true) {
-    line_number++;
-    char* read_line = fgets(line, kManifestMaxLineLength, file);
-
-    if (read_line == NULL) {
-      if ((feof(file) != 0) && (ferror(file) != 0)) {
-        Log::PrintErr(
-            "Error while reading line number %zu. The manifest must be "
-            "terminated by a newline\n",
-            line_number);
-        entries = -1;
-      }
-      break;
-    }
-
-    if ((read_line[0] == '\n') || (read_line[0] == '#')) {
-      // Blank or comment line.
-      continue;
-    }
-
-    Dart_QualifiedFunctionName* entry =
-        collection != NULL ? collection + entries : NULL;
-
-    char* error_buffer = NULL;
-    if (!ParseEntryPointsManifestSingleLine(read_line, entry, &error_buffer)) {
-      CleanupEntryPointItem(entry);
-      Log::PrintErr("Parser error on line %zu: %s\n", line_number,
-                    error_buffer);
-      free(error_buffer);
-      entries = -1;
-      break;
-    }
-
-    entries++;
-  }
-
-  free(line);
-
-  return entries;
-}
-
-static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() {
-  // Total number of entries across all manifest files.
-  int64_t entry_count = 0;
-
-  // Parse the files once but don't store the results. This is done to first
-  // determine the number of entries in the manifest
-  for (intptr_t i = 0; i < entry_points_files->count(); i++) {
-    const char* path = entry_points_files->GetArgument(i);
-
-    FILE* file = fopen(path, "r");
-
-    if (file == NULL) {
-      Log::PrintErr("Could not open entry points manifest file `%s`\n", path);
-      return NULL;
-    }
-
-    int64_t entries = ParseEntryPointsManifestLines(file, NULL);
-    fclose(file);
-
-    if (entries < 0) {
-      Log::PrintErr("Manifest file `%s` specified is invalid\n", path);
-      return NULL;
-    }
-
-    entry_count += entries;
-  }
-
-  // Allocate enough storage for the entries in the file plus a termination
-  // sentinel and parse it again to populate the allocation
-  Dart_QualifiedFunctionName* entries =
-      reinterpret_cast<Dart_QualifiedFunctionName*>(
-          calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName)));
-
-  int64_t parsed_entry_count = 0;
-  for (intptr_t i = 0; i < entry_points_files->count(); i++) {
-    const char* path = entry_points_files->GetArgument(i);
-    FILE* file = fopen(path, "r");
-    parsed_entry_count +=
-        ParseEntryPointsManifestLines(file, &entries[parsed_entry_count]);
-    fclose(file);
-  }
-
-  ASSERT(parsed_entry_count == entry_count);
-
-  // The entries allocation must be explicitly cleaned up via
-  // |CleanupEntryPointsCollection|
-  return entries;
-}
-
-static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() {
-  Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles();
-  if ((entries == NULL) && IsSnapshottingForPrecompilation()) {
-    Log::PrintErr(
-        "Could not find native embedder entry points during precompilation\n");
-    exit(kErrorExitCode);
-  }
-  return entries;
-}
-
 static void LoadCompilationTrace() {
   if ((load_compilation_trace_filename != NULL) &&
       (snapshot_kind == kCoreJIT)) {
@@ -1201,13 +894,12 @@
   return std::unique_ptr<MappedMemory>(mapping);
 }
 
-static void CreateAndWritePrecompiledSnapshot(
-    Dart_QualifiedFunctionName* standalone_entry_points) {
+static void CreateAndWritePrecompiledSnapshot() {
   ASSERT(IsSnapshottingForPrecompilation());
   Dart_Handle result;
 
   // Precompile with specified embedder entry points
-  result = Dart_Precompile(standalone_entry_points);
+  result = Dart_Precompile();
   CHECK_RESULT(result);
 
   // Create a precompiled snapshot.
@@ -1352,6 +1044,10 @@
   return isolate;
 }
 
+static Dart_QualifiedFunctionName no_entry_points[] = {
+    {NULL, NULL, NULL}  // Must be terminated with NULL entries.
+};
+
 static int GenerateSnapshotFromKernel(const uint8_t* kernel_buffer,
                                       intptr_t kernel_buffer_size) {
   ASSERT(SnapshotKindAllowedFromKernel());
@@ -1366,11 +1062,9 @@
   Dart_IsolateFlags isolate_flags;
   Dart_IsolateFlagsInitialize(&isolate_flags);
 
-  Dart_QualifiedFunctionName* entry_points = NULL;
   if (IsSnapshottingForPrecompilation()) {
-    entry_points = ParseEntryPointsManifestIfPresent();
     isolate_flags.obfuscate = obfuscate;
-    isolate_flags.entry_points = entry_points;
+    isolate_flags.entry_points = no_entry_points;
   }
 
   // We need to capture the vmservice library in the core snapshot, so load it
@@ -1418,12 +1112,10 @@
         return kErrorExitCode;
       }
 
-      CreateAndWritePrecompiledSnapshot(entry_points);
+      CreateAndWritePrecompiledSnapshot();
 
       CreateAndWriteDependenciesFile();
 
-      CleanupEntryPointsCollection(entry_points);
-
       break;
     }
     case kCore:
@@ -1456,10 +1148,6 @@
   CommandLineOptions cmdline_url_mapping(argc);
   DartUtils::url_mapping = &cmdline_url_mapping;
 
-  // Initialize the entrypoints array.
-  CommandLineOptions entry_points_files_array(argc);
-  entry_points_files = &entry_points_files_array;
-
   // When running from the command line we assume that we are optimizing for
   // throughput, and therefore use a larger new gen semi space size and a faster
   // new gen growth factor unless others have been specified.
@@ -1594,9 +1282,6 @@
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
 
-  Dart_QualifiedFunctionName* entry_points =
-      ParseEntryPointsManifestIfPresent();
-
   IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root,
                                               commandline_packages_file, NULL);
   Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data,
@@ -1662,7 +1347,7 @@
 
     if (IsSnapshottingForPrecompilation()) {
       flags.obfuscate = obfuscate;
-      flags.entry_points = entry_points;
+      flags.entry_points = no_entry_points;
     }
 
     Dart_Isolate isolate = NULL;
@@ -1689,17 +1374,10 @@
 
     ASSERT(kernel_buffer == NULL);
 
-    // Load any libraries named in the entry points. Do this before loading the
-    // user's script to ensure conditional imports see the embedder-specific
-    // dart: libraries.
-    LoadEntryPoints(entry_points);
-
     // Load the specified script.
     library = LoadSnapshotCreationScript(app_script_name);
     CHECK_RESULT(library);
 
-    ImportNativeEntryPointLibrariesIntoRoot(entry_points);
-
     // Ensure that we mark all libraries as loaded.
     result = Dart_FinalizeLoading(false);
     CHECK_RESULT(result);
@@ -1718,7 +1396,7 @@
         break;
       case kAppAOTBlobs:
       case kAppAOTAssembly:
-        CreateAndWritePrecompiledSnapshot(entry_points);
+        CreateAndWritePrecompiledSnapshot();
         break;
       default:
         UNREACHABLE();
@@ -1729,8 +1407,6 @@
     Dart_ExitScope();
     Dart_ShutdownIsolate();
 
-    CleanupEntryPointsCollection(entry_points);
-
     Dart_EnterIsolate(UriResolverIsolateScope::isolate);
     Dart_ShutdownIsolate();
   } else {
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 992dd7f..133b9c7 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -165,18 +165,16 @@
     success &= file->Print("%s ", dep);
     free(dep);
   }
-  if (Options::preview_dart_2()) {
-    if (kernel_isolate_is_running) {
-      Dart_KernelCompilationResult result = Dart_KernelListDependencies();
-      if (result.status != Dart_KernelCompilationStatus_Ok) {
-        ErrorExit(
-            kErrorExitCode,
-            "Error: Failed to fetch dependencies from kernel service: %s\n\n",
-            result.error);
-      }
-      success &= file->WriteFully(result.kernel, result.kernel_size);
-      free(result.kernel);
+  if (kernel_isolate_is_running) {
+    Dart_KernelCompilationResult result = Dart_KernelListDependencies();
+    if (result.status != Dart_KernelCompilationStatus_Ok) {
+      ErrorExit(
+          kErrorExitCode,
+          "Error: Failed to fetch dependencies from kernel service: %s\n\n",
+          result.error);
     }
+    success &= file->WriteFully(result.kernel, result.kernel_size);
+    free(result.kernel);
   }
   success &= file->Print("\n");
   if (!success) {
@@ -300,8 +298,8 @@
   CHECK_RESULT(result);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (Options::preview_dart_2() && !isolate_run_app_snapshot &&
-      kernel_buffer == NULL && !Dart_IsKernelIsolate(isolate)) {
+  if (!isolate_run_app_snapshot && kernel_buffer == NULL &&
+      !Dart_IsKernelIsolate(isolate)) {
     if (!dfe.CanUseDartFrontend()) {
       const char* format = "Dart frontend unavailable to compile script %s.";
       intptr_t len = snprintf(NULL, 0, format, script_uri) + 1;
@@ -520,9 +518,6 @@
 #else
   // JIT: Service isolate uses the core libraries snapshot.
   bool skip_library_load = false;
-  const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
-  const uint8_t* isolate_snapshot_instructions =
-      core_isolate_snapshot_instructions;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   Dart_Isolate isolate = NULL;
@@ -540,36 +535,28 @@
   ASSERT(flags != NULL);
   flags->load_vmservice_library = true;
 
-  if (Options::preview_dart_2()) {
-    // If there is intention to use DFE, then we create the isolate
-    // from kernel only if we can.
-    const uint8_t* kernel_buffer = NULL;
-    intptr_t kernel_buffer_size = 0;
-    dfe.LoadPlatform(&kernel_buffer, &kernel_buffer_size);
-    if (kernel_buffer == NULL) {
-      dfe.application_kernel_buffer(&kernel_buffer, &kernel_buffer_size);
-    }
-
-    // TODO(sivachandra): When the platform program is unavailable, check if
-    // application kernel binary is self contained or an incremental binary.
-    // Isolate should be created only if it is a self contained kernel binary.
-    if (kernel_buffer != NULL) {
-      isolate = Dart_CreateIsolateFromKernel(script_uri, NULL, kernel_buffer,
-                                             kernel_buffer_size, flags,
-                                             isolate_data, error);
-    } else {
-      *error =
-          strdup("Platform kernel not available to create service isolate.");
-      delete isolate_data;
-      return NULL;
-    }
-    skip_library_load = true;
-  } else {
-    isolate = Dart_CreateIsolate(
-        script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
-        app_isolate_shared_data, app_isolate_shared_instructions, flags,
-        isolate_data, error);
+  // If there is intention to use DFE, then we create the isolate
+  // from kernel only if we can.
+  const uint8_t* kernel_buffer = NULL;
+  intptr_t kernel_buffer_size = 0;
+  dfe.LoadPlatform(&kernel_buffer, &kernel_buffer_size);
+  if (kernel_buffer == NULL) {
+    dfe.application_kernel_buffer(&kernel_buffer, &kernel_buffer_size);
   }
+
+  // TODO(sivachandra): When the platform program is unavailable, check if
+  // application kernel binary is self contained or an incremental binary.
+  // Isolate should be created only if it is a self contained kernel binary.
+  if (kernel_buffer != NULL) {
+    isolate = Dart_CreateIsolateFromKernel(script_uri, NULL, kernel_buffer,
+                                           kernel_buffer_size, flags,
+                                           isolate_data, error);
+  } else {
+    *error = strdup("Platform kernel not available to create service isolate.");
+    delete isolate_data;
+    return NULL;
+  }
+  skip_library_load = true;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   if (isolate == NULL) {
     delete isolate_data;
@@ -663,7 +650,7 @@
   Dart_Isolate isolate = NULL;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (Options::preview_dart_2() && !isolate_run_app_snapshot) {
+  if (!isolate_run_app_snapshot) {
     const uint8_t* platform_kernel_buffer = NULL;
     intptr_t platform_kernel_buffer_size = 0;
     dfe.LoadPlatform(&platform_kernel_buffer, &platform_kernel_buffer_size);
@@ -891,7 +878,7 @@
   }
 
   Dart_Isolate isolate = NULL;
-  if (Options::preview_dart_2() && Options::gen_snapshot_kind() == kAppAOT) {
+  if (Options::gen_snapshot_kind() == kAppAOT) {
     isolate = IsolateSetupHelperAotCompilationDart2(
         script_name, "main", Options::package_root(), Options::packages_file(),
         &flags, &error, &exit_code);
@@ -935,12 +922,8 @@
       // the core snapshot.
       Platform::Exit(kErrorExitCode);
     }
-    if (Options::preview_dart_2()) {
-      Snapshot::GenerateKernel(Options::snapshot_filename(), script_name,
-                               isolate_data->resolved_packages_config());
-    } else {
-      Snapshot::GenerateScript(Options::snapshot_filename());
-    }
+    Snapshot::GenerateKernel(Options::snapshot_filename(), script_name,
+                             isolate_data->resolved_packages_config());
   } else {
     // Lookup the library of the root script.
     Dart_Handle root_lib = Dart_RootLibrary();
@@ -974,7 +957,7 @@
     }
 
     if (Options::gen_snapshot_kind() == kAppAOT) {
-      result = Dart_Precompile(standalone_entry_points);
+      result = Dart_Precompile();
       CHECK_RESULT(result);
 
       if (Options::obfuscate() &&
@@ -1234,14 +1217,6 @@
     // Since we loaded the script anyway, save it.
     dfe.set_application_kernel_buffer(application_kernel_buffer,
                                       application_kernel_buffer_size);
-    // Since we saw a dill file, it means we have to turn on all the
-    // preview_dart_2 options.
-    if (Options::no_preview_dart_2()) {
-      Log::PrintErr(
-          "A kernel file is specified as the input, "
-          "--no-preview-dart-2 option is incompatible with it\n");
-      Platform::Exit(kErrorExitCode);
-    }
     Options::dfe()->set_use_dfe();
   }
 #endif
@@ -1262,9 +1237,8 @@
   init_params.entropy_source = DartUtils::EntropySource;
   init_params.get_service_assets = GetVMServiceAssetsArchiveCallback;
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  init_params.start_kernel_isolate = Options::preview_dart_2() &&
-                                     dfe.UseDartFrontend() &&
-                                     dfe.CanUseDartFrontend();
+  init_params.start_kernel_isolate =
+      dfe.UseDartFrontend() && dfe.CanUseDartFrontend();
 #else
   init_params.start_kernel_isolate = false;
 #endif
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index faf5a26..38e7fa6 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -63,17 +63,9 @@
 CB_OPTIONS_LIST(CB_OPTION_DEFINITION)
 #undef CB_OPTION_DEFINITION
 
-void Options::SetDart1Options(CommandLineOptions* vm_options) {
-  vm_options->AddArgument("--no-strong");
-  vm_options->AddArgument("--no-reify-generic-functions");
-  vm_options->AddArgument("--no-sync-async");
-}
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
 DFE* Options::dfe_ = NULL;
 
-// TODO(sivachandra): Make it an error to specify --dfe without
-// specifying --preview_dart_2.
 DEFINE_STRING_OPTION_CB(dfe, { Options::dfe()->set_frontend_filename(value); });
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -384,13 +376,9 @@
     }
   }
 
-  if (Options::no_preview_dart_2()) {
-    Options::SetDart1Options(vm_options);
-  } else {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    Options::dfe()->set_use_dfe();
+  Options::dfe()->set_use_dfe();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  }
   if (Options::deterministic()) {
     // Both an embedder and VM flag.
     vm_options->AddArgument("--deterministic");
@@ -469,9 +457,6 @@
   }
   if (checked_set) {
     vm_options->AddArgument("--enable-asserts");
-    if (Options::no_preview_dart_2()) {
-      vm_options->AddArgument("--enable-type-checks");
-    }
   }
 
   // If --snapshot is given without --snapshot-kind, default to script snapshot.
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index f5672eb..11681ae 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -45,7 +45,6 @@
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
   V(disable_exit, exit_disabled)                                               \
-  V(no_preview_dart_2, no_preview_dart_2)                                      \
   V(preview_dart_2, nop_option)
 
 // Boolean flags that have a short form.
@@ -111,8 +110,7 @@
   CB_OPTIONS_LIST(CB_OPTIONS_DECL)
 #undef CB_OPTIONS_DECL
 
-  static bool preview_dart_2() { return !no_preview_dart_2(); }
-  static void SetDart1Options(CommandLineOptions* vm_options);
+  static bool preview_dart_2() { return true; }
 
   static dart::SimpleHashMap* environment() { return environment_; }
 
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index 10da851..64d602d 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -94,6 +94,9 @@
     var file = new File.fromUri(uri);
     var parent_directory = file.parent;
     await parent_directory.create(recursive: true);
+    if (await file.exists()) {
+      await file.delete();
+    }
     var result = await file.writeAsBytes(bytes);
     completer.complete(null);
     WriteLimiter._writeCompleted();
@@ -143,6 +146,9 @@
   var file = new File.fromUri(path);
   var parent_directory = file.parent;
   await parent_directory.create(recursive: true);
+  if (await file.exists()) {
+    await file.delete();
+  }
   IOSink sink = await file.openWrite();
   await sink.addStream(bytes);
   await sink.close();
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c1c02df..a8df732 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3368,17 +3368,16 @@
  */
 
 /**
- * Compiles all functions reachable from the provided entry points and marks
+ * Compiles all functions reachable from entry points and marks
  * the isolate to disallow future compilation.
  *
- * \param entry_points A list of functions that may be invoked through the
- * embedding API, e.g. Dart_Invoke/GetField/SetField/New/InvokeClosure.
+ * Entry points should be specified using `@pragma("vm:entry-point")`
+ * annotation.
  *
  * \return An error handle if a compilation error or runtime error running const
  * constructors was encountered.
  */
-DART_EXPORT Dart_Handle
-Dart_Precompile(Dart_QualifiedFunctionName entry_points[]);
+DART_EXPORT Dart_Handle Dart_Precompile();
 
 typedef void (*Dart_StreamingWriteCallback)(void* callback_data,
                                             const uint8_t* buffer,
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index b401d37..9959ef4 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -169,6 +169,8 @@
  */
 DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
 
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_ReadAllBytecode();
+
 /**
  * Parses all loaded functions in the current isolate..
  *
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index edb8d93..c2927d9 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -137,6 +137,10 @@
     // hence do not have a token position, and therefore cannot be reparsed.
     has_extra_parameter_info = false;
   }
+  if (func.HasBytecode() && (func.kernel_offset() == 0)) {
+    // Anonymous closures in bytecode cannot be reparsed.
+    has_extra_parameter_info = false;
+  }
 
   Array& param_descriptor = Array::Handle();
   if (has_extra_parameter_info) {
diff --git a/runtime/observatory/lib/src/elements/debugger.dart b/runtime/observatory/lib/src/elements/debugger.dart
index 81ed77a..053bab8 100644
--- a/runtime/observatory/lib/src/elements/debugger.dart
+++ b/runtime/observatory/lib/src/elements/debugger.dart
@@ -2691,25 +2691,25 @@
 
   S.Script get script => _frame.location.script;
 
-  int _varsTop(varsDiv) {
+  int _varsTop(DivElement varsDiv) {
     const minTop = 0;
     if (varsDiv == null) {
       return minTop;
     }
-    final paddingTop = document.body.contentEdge.top;
-    final parent = varsDiv.parent.getBoundingClientRect();
-    final varsHeight = varsDiv.clientHeight;
-    final maxTop = parent.height - varsHeight;
-    final adjustedTop = paddingTop - parent.top;
-    return (max(minTop, min(maxTop, adjustedTop)));
+    final num paddingTop = document.body.contentEdge.top;
+    final Rectangle parent = varsDiv.parent.getBoundingClientRect();
+    final int varsHeight = varsDiv.clientHeight;
+    final int maxTop = (parent.height - varsHeight).toInt();
+    final int adjustedTop = (paddingTop - parent.top).toInt();
+    return max(minTop, min(maxTop, adjustedTop));
   }
 
   void _onScroll(event) {
     if (!_expanded || _varsDiv == null) {
       return;
     }
-    var currentTop = _varsDiv.style.top;
-    var newTop = _varsTop(_varsDiv);
+    String currentTop = _varsDiv.style.top;
+    int newTop = _varsTop(_varsDiv);
     if (currentTop != newTop) {
       _varsDiv.style.top = '${newTop}px';
     }
diff --git a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
index 998f4bb..9648807 100644
--- a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
@@ -28,11 +28,16 @@
   foo<T>() {
     debugger();
   }
+
+  bar<T>(T t) {
+    debugger();
+  }
 }
 
 void testMain() {
   topLevel<String>();
   (new A()).foo<int>();
+  (new A()).bar<dynamic>(42);
 }
 
 var tests = <IsolateTest>[
@@ -95,6 +100,22 @@
     print(result);
     expect(result.valueAsString, equals("int"));
   },
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  (Isolate isolate) async {
+    // Make sure we are in the right place.
+    var stack = await isolate.getStack();
+    var topFrame = 0;
+    expect(stack.type, equals('Stack'));
+    expect(await stack['frames'][topFrame].location.getLine(), 34);
+
+    Instance result = await isolate.evalFrame(topFrame, "T.toString()");
+    print(result);
+    expect(result.valueAsString, equals("dynamic"));
+    result = await isolate.evalFrame(topFrame, "t");
+    print(result);
+    expect(result.valueAsString, equals("42"));
+  },
 ];
 
 main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 0370264..ddff9c6 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -79,6 +79,9 @@
 [ $mode == debug && ($arch == simarm || $arch == simarm64) ]
 *: SkipSlow
 
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
+
 [ !$strong && ($compiler == dartk || $compiler == dartkp) ]
 *: Skip
 
diff --git a/runtime/tests/vm/dart/byte_array_optimized_test.dart b/runtime/tests/vm/dart/byte_array_optimized_test.dart
index 827b93c..ca3b432 100644
--- a/runtime/tests/vm/dart/byte_array_optimized_test.dart
+++ b/runtime/tests/vm/dart/byte_array_optimized_test.dart
@@ -899,9 +899,9 @@
     Expect.isTrue(copy is Uint64List);
     Expect.equals(4, region.length);
     Expect.listEquals([3, 4, 5, 6], region);
-    array.setRange(3, 7, [-0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
+    array.setRange(3, 7, [-0x8000000000000000, 0, 1, 0xFFFFFFFFFFFFFFFF]);
     Expect.listEquals(
-        [0, 1, 2, -0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
+        [0, 1, 2, -0x8000000000000000, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
         array);
   }
 
diff --git a/runtime/tests/vm/dart/byte_array_test.dart b/runtime/tests/vm/dart/byte_array_test.dart
index d3dc4b2..a476301 100644
--- a/runtime/tests/vm/dart/byte_array_test.dart
+++ b/runtime/tests/vm/dart/byte_array_test.dart
@@ -1022,9 +1022,9 @@
     Expect.isTrue(copy is Uint64List);
     Expect.equals(4, region.length);
     Expect.listEquals([3, 4, 5, 6], region);
-    array.setRange(3, 7, [-0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
+    array.setRange(3, 7, [-0x8000000000000000, 0, 1, 0xFFFFFFFFFFFFFFFF]);
     Expect.listEquals(
-        [0, 1, 2, -0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
+        [0, 1, 2, -0x8000000000000000, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
         array);
   }
 
diff --git a/runtime/tests/vm/dart/redirection_type_shuffling_test.dart b/runtime/tests/vm/dart/redirection_type_shuffling_test.dart
index c1db64c..b177334 100644
--- a/runtime/tests/vm/dart/redirection_type_shuffling_test.dart
+++ b/runtime/tests/vm/dart/redirection_type_shuffling_test.dart
@@ -7,7 +7,7 @@
 
 class G<A extends int, B extends String> {
   G();
-  factory G.swap() = G<B,A>;  /// 00: static type warning
+  factory G.swap() = G<B,A>;  /// 00: compile-time error
   factory G.retain() = G<A,B>;
 }
 
diff --git a/runtime/tests/vm/dart/snapshot_version_test.dart b/runtime/tests/vm/dart/snapshot_version_test.dart
index 7034458..2dcde10 100644
--- a/runtime/tests/vm/dart/snapshot_version_test.dart
+++ b/runtime/tests/vm/dart/snapshot_version_test.dart
@@ -6,10 +6,8 @@
 import "package:expect/expect.dart";
 
 main() {
-  var result = Process.runSync(Platform.executable, [
-    '--no-preview-dart-2',
-    Platform.script.resolve('./bad_snapshot').toFilePath()
-  ]);
+  var result = Process.runSync(Platform.executable,
+      [Platform.script.resolve('./bad_snapshot').toFilePath()]);
   print("=== stdout ===\n ${result.stdout}");
   print("=== stderr ===\n ${result.stderr}");
   Expect.equals(253, result.exitCode);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 400420b..6730986 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -1,6 +1,7 @@
 # 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.
+
 cc/AllocGeneric_Overflow: Crash, Fail # These tests are expected to crash on all platforms.
 cc/ArrayNew_Overflow_Crash: Crash, Fail # These tests are expected to crash on all platforms.
 cc/CodeImmutability: Crash, Fail # These tests are expected to crash on all platforms.
@@ -20,6 +21,7 @@
 cc/SNPrint_BadArgs: Crash, Fail # These tests are expected to crash on all platforms.
 dart/data_uri_import_test/none: SkipByDesign
 dart/entrypoints/*: Skip  # Only supported in Dart 2 JIT (hot-reload -> issue 34199).
+dart/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
 
 [ $builder_tag == asan ]
 cc/CodeImmutability: Fail, OK # Address Sanitizer turns a crash into a failure.
@@ -27,20 +29,11 @@
 [ $builder_tag == optimization_counter_threshold ]
 dart/appjit*: SkipByDesign # Test needs to a particular opt-counter value
 
-[ $compiler == app_jit ]
-dart/snapshot_version_test: Fail, OK # Expects to find script snapshot relative to Dart source.
-
 [ $compiler == app_jitk ]
 dart/data_uri_import_test/utf16: MissingRuntimeError
-dart/redirection_type_shuffling_test/00: RuntimeError
 dart/redirection_type_shuffling_test/none: RuntimeError
 dart/snapshot_version_test: RuntimeError
 
-[ $compiler == dart2analyzer ]
-dart/byte_array_optimized_test: CompileTimeError # int64
-dart/byte_array_test: CompileTimeError # int64
-dart/redirection_type_shuffling_test/00: CompileTimeError
-
 [ $compiler == dart2js ]
 dart/byte_array_optimized_test: Skip # compilers not aware of byte arrays
 dart/byte_array_test: Skip # compilers not aware of byte arrays
@@ -106,10 +99,15 @@
 cc/CorelibCompilerStats: Skip
 cc/Profiler_ContextAllocation: Fail, Pass # Flaky on Windows --- sometimes give "profiler_test.cc: 1107: error: expected: !walker.Down()"
 cc/Service_Profile: Skip
+cc/GenKernelKernelLoadKernel: Skip  # Issue 34542.
+cc/GenKernelKernelReadAllBytecode: Skip  # Issue 34393.
 
 [ !$strong ]
 dart/callee_side_type_checks_test: SkipByDesign
 
+[ !$checked && !$strong && $runtime == vm ]
+dart/redirection_type_shuffling_test/00: MissingCompileTimeError
+
 # Following tests are failing in a weird way on macos/ia32/debug builds
 # need to investigate.
 [ $runtime == vm && $system == macos ]
@@ -365,5 +363,5 @@
 dart/spawn_shutdown_test: Skip # We can shutdown an isolate before it reloads.
 dart/stack_overflow_shared_test: SkipSlow # Too slow with --slow-path-triggers-gc flag and not relevant outside precompiled.
 
-[ $arch == simdbc64 && $mode == debug && $no_preview_dart_2 ]
-cc/CustomIsolates: Crash  # http://dartbug.com/34424
+[ ($runtime == vm || $runtime == dart_precompiled) && !$preview_dart_2 ]
+*:SkipByDesign # Deprecating all Dart1 modes of execution
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 87c3a7d..599d17c 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -45,9 +45,6 @@
       action="store", type="string",
       help="output file name into which isolate snapshot in binary form " +
            "is generated")
-  result.add_option("--embedder_entry_points_manifest",
-      action="store", type="string",
-      help="input manifest with the vm entry points in a precompiled snapshot")
   result.add_option("--script",
       action="store", type="string",
       help="Dart script for which snapshot is to be generated")
@@ -146,11 +143,6 @@
     script_args.append(''.join([ "--isolate_snapshot_instructions=",
                                  options.isolate_instructions_output_bin ]))
 
-  # Specify the embedder entry points snapshot
-  if options.embedder_entry_points_manifest:
-    script_args.append(''.join([ "--embedder_entry_points_manifest=",
-                                 options.embedder_entry_points_manifest ]))
-
   # Next setup all url mapping options specified.
   for url_arg in options.url_mapping:
     url_mapping_argument = ''.join(["--url_mapping=", url_arg ])
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index 9ee5e38..ba2ce55 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -10,15 +10,15 @@
 
 How to run DartFuzz
 ===================
+To generate a single random Dart program, run
 
-    dart dartfuzz.dart [--help] [--seed SEED] [FILENAME]
+    dart dartfuzz.dart [--help] [--seed SEED] FILENAME
 
 where
 
     --help : prints help and exits
     --seed : defines random seed (system-set by default)
 
-If no FILENAME is given, DartFuzz sends all output to stdout.
 The tool provides a runnable main isolate. A typical single
 test run looks as:
 
@@ -27,6 +27,9 @@
 
 How to start DartFuzz testing
 =============================
+To start a fuzz testing session, run
+
+    dart dartfuzz_test.dart
 
     run_dartfuzz_test.py  [--help]
                           [--repeat REPEAT]
@@ -38,21 +41,26 @@
 
     --help            : prints help and exits
     --repeat          : number of tests to run (1000 by default)
-    --true_divergence : only report true divergences
+    --show-stats      : show session statistics (true by default)
+    --true-divergence : only report true divergences (true by default)
+    --dart-top        : sets DART_TOP explicitly through command line
     --mode1           : m1
     --mode2           : m2, and values one of
-        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
+        jit-[debug-]ia32  = Dart JIT (ia32)
+        jit-[debug-]x64   = Dart JIT (x64)
+        jit-[debug-]arm32 = Dart JIT (simarm)
+        jit-[debug-]arm64 = Dart JIT (simarm64)
+        aot-[debug-]x64   = Dart AOT (x64)
+        aot-[debug-]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).
+This fuzz testing tool must have access to the top of a Dart SDK
+development tree (DART_TOP) in which all proper binaries have been
+built already (for example, testing jit-ia32 will invoke the binary
+${DART_TOP}/out/ReleaseIA32/dart to start the Dart VM). The DART_TOP
+can be provided through the --dart-top option, as an environment
+variable, or, by default, as the current directory by invoking the
+fuzz testing tool from the Dart SDK top.
 
 Background
 ==========
@@ -73,9 +81,9 @@
 based fuzz testing constructs random, but properly formatted input data.
 Mutation-based fuzz testing applies small random changes to existing inputs
 in order to detect shortcomings in a system. Profile-guided or coverage-guided
-fuzzing adds a direction to the way these random changes are applied. Multi-
-layered approaches generate random inputs that are subsequently mutated at
-various stages of execution.
+fuzz testing adds a direction to the way these random changes are applied.
+Multi-layered approaches generate random inputs that are subsequently mutated
+at various stages of execution.
 
 The randomness of fuzz testing implies that the size and scope of testing is
 no longer bounded. Every new run can potentially discover bugs and crashes
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index d32766f..06790d0 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -92,9 +92,9 @@
 const fieldName = 'fld';
 const methodName = 'foo';
 
-// Class that generates a random, but runnable Dart program for fuzz testing.
+/// Class that generates a random, but runnable Dart program for fuzz testing.
 class DartFuzz {
-  DartFuzz(this.seed, this.sink);
+  DartFuzz(this.seed, this.file);
 
   void run() {
     // Initialize program variables.
@@ -842,23 +842,23 @@
 
   // Emits indented line to append to program.
   void emitLn(String line, {bool newline = true}) {
-    sink.write(' ' * indent);
+    file.writeStringSync(' ' * indent);
     emit(line, newline: newline);
   }
 
   // Emits text to append to program.
   void emit(String txt, {bool newline = false}) {
-    sink.write(txt);
+    file.writeStringSync(txt);
     if (newline) {
-      sink.write('\n');
+      file.writeStringSync('\n');
     }
   }
 
   // Random seed used to generate program.
   final int seed;
 
-  // Sink used for output.
-  final IOSink sink;
+  // File used for output.
+  final RandomAccessFile file;
 
   // Program variables.
   Random rand;
@@ -896,22 +896,19 @@
   return seed;
 }
 
-// Main driver when dartfuzz.dart is run stand-alone.
+/// Main driver when dartfuzz.dart is run stand-alone.
 main(List<String> arguments) {
   final parser = new ArgParser()
     ..addOption('seed',
-        abbr: 's',
-        help: 'random seed (0 forces time-based seed)',
-        defaultsTo: '0');
+        help: 'random seed (0 forces time-based seed)', defaultsTo: '0');
   try {
     final results = parser.parse(arguments);
     final seed = getSeed(results['seed']);
-    final sink = results.rest.isEmpty
-        ? stdout
-        : new File(results.rest.single).openWrite();
-    new DartFuzz(seed, sink).run();
+    final file = new File(results.rest.single).openSync(mode: FileMode.write);
+    new DartFuzz(seed, file).run();
+    file.closeSync();
   } catch (e) {
-    print('Usage: dart dartfuzz.dart [OPTIONS] [FILENAME]');
+    print('Usage: dart dartfuzz.dart [OPTIONS] FILENAME');
     print(parser.usage);
   }
 }
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
new file mode 100644
index 0000000..b6da502
--- /dev/null
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -0,0 +1,321 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+import 'dart:math';
+
+import 'package:args/args.dart';
+
+import 'dartfuzz.dart';
+
+const debug = false;
+const sigkill = 9;
+const timeout = 30; // in seconds
+
+// Exit code of running a test.
+enum ResultCode { success, timeout, error }
+
+/// Result of running a test.
+class TestResult {
+  TestResult(this.code, this.output);
+  ResultCode code;
+  String output;
+}
+
+/// Command runner.
+TestResult runCommand(List<String> cmd, Map<String, String> env) {
+  // TODO: use Dart API for some of the modes?
+  ProcessResult res = Process.runSync(
+      'timeout', ['-s', '$sigkill', '$timeout'] + cmd,
+      environment: env);
+  if (debug) {
+    print('\nrunning $cmd yields:\n'
+        '${res.exitCode}\n${res.stdout}\n${res.stderr}\n');
+  }
+  if (res.exitCode == -sigkill) {
+    return new TestResult(ResultCode.timeout, res.stdout);
+  } else if (res.exitCode != 0) {
+    return new TestResult(ResultCode.error, res.stdout);
+  }
+  return new TestResult(ResultCode.success, res.stdout);
+}
+
+/// Abstraction for running one test in a particular mode.
+abstract class TestRunner {
+  String description();
+  TestResult run(String fileName);
+
+  // Factory.
+  static TestRunner getTestRunner(
+      Map<String, String> env, String top, String mode) {
+    if (mode.startsWith('jit')) return new TestRunnerJIT(env, top, mode);
+    if (mode.startsWith('aot')) return new TestRunnerAOT(env, top, mode);
+    if (mode.startsWith('js')) return new TestRunnerJS(env, top, mode);
+    throw ('unknown mode: $mode');
+  }
+
+  // Convert mode to tag.
+  static String getTag(String mode) {
+    if (mode.endsWith('debug-ia32')) return 'DebugIA32';
+    if (mode.endsWith('debug-x64')) return 'DebugX64';
+    if (mode.endsWith('debug-arm32')) return 'DebugSIMARM';
+    if (mode.endsWith('debug-arm64')) return 'DebugSIMARM64';
+    if (mode.endsWith('ia32')) return 'ReleaseIA32';
+    if (mode.endsWith('x64')) return 'ReleaseX64';
+    if (mode.endsWith('arm32')) return 'ReleaseSIMARM';
+    if (mode.endsWith('arm64')) return 'ReleaseSIMARM64';
+    throw ('unknown tag in mode: $mode');
+  }
+}
+
+/// Concrete test runner of Dart JIT.
+class TestRunnerJIT implements TestRunner {
+  TestRunnerJIT(Map<String, String> e, String top, String mode) {
+    tag = TestRunner.getTag(mode);
+    env = Map<String, String>.from(e);
+    env['PATH'] = "$top/out/$tag:${env['PATH']}";
+  }
+  String description() {
+    return "JIT-${tag}";
+  }
+
+  TestResult run(String fileName) {
+    return runCommand(['dart', fileName], env);
+  }
+
+  String tag;
+  Map<String, String> env;
+}
+
+/// Concrete test runner of Dart AOT.
+class TestRunnerAOT implements TestRunner {
+  TestRunnerAOT(Map<String, String> e, String top, String mode) {
+    tag = TestRunner.getTag(mode);
+    env = Map<String, String>.from(e);
+    env['PATH'] = "$top/pkg/vm/tool:${env['PATH']}";
+    env['DART_CONFIGURATION'] = tag;
+  }
+  String description() {
+    return "AOT-${tag}";
+  }
+
+  TestResult run(String fileName) {
+    TestResult result = runCommand(['precompiler2', fileName, 'snapshot'], env);
+    if (result.code != ResultCode.success) {
+      return result;
+    }
+    return runCommand(['dart_precompiled_runtime2', 'snapshot'], env);
+  }
+
+  String tag;
+  Map<String, String> env;
+}
+
+/// Concrete test runner of Dart2JS.
+class TestRunnerJS implements TestRunner {
+  TestRunnerJS(Map<String, String> e, String top, String mode) {
+    env = Map<String, String>.from(e);
+    env['PATH'] = "$top/out/ReleaseX64/dart-sdk/bin:${env['PATH']}";
+  }
+  String description() {
+    return "Dart2JS";
+  }
+
+  TestResult run(String fileName) {
+    TestResult result = runCommand(['dart2js', fileName], env);
+    if (result.code != ResultCode.success) {
+      return result;
+    }
+    return runCommand(['nodejs', 'out.js'], env);
+  }
+
+  Map<String, String> env;
+}
+
+/// Class to run a fuzz testing session.
+class DartFuzzTest {
+  DartFuzzTest(this.env, this.repeat, this.trueDivergence, this.showStats,
+      this.top, this.mode1, this.mode2);
+
+  bool runSession() {
+    setupSession();
+
+    print('\n**\n**** Dart Fuzz Testing\n**\n');
+    print('Fuzz Version : ${version}');
+    print('#Tests       : ${repeat}');
+    print('Exec-Mode 1  : ${runner1.description()}');
+    print('Exec-Mode 2  : ${runner2.description()}');
+    print('Dart Dev     : ${top}');
+    print('Orig Dir     : ${orgDir.path}');
+    print('Temp Dir     : ${tmpDir.path}\n');
+
+    showStatistics();
+    for (int i = 0; i < repeat; i++) {
+      numTests++;
+      seed = rand.nextInt(1 << 32);
+      generateTest();
+      runTest();
+      showStatistics();
+    }
+
+    cleanupSession();
+    if (numDivergences != 0) {
+      print('\n\nfailure\n');
+      return false;
+    }
+    print('\n\nsuccess\n');
+    return true;
+  }
+
+  void setupSession() {
+    rand = new Random();
+    orgDir = Directory.current;
+    tmpDir = Directory.systemTemp.createTempSync('dart_fuzz');
+    Directory.current = tmpDir;
+    fileName = 'fuzz.dart';
+    runner1 = TestRunner.getTestRunner(env, top, mode1);
+    runner2 = TestRunner.getTestRunner(env, top, mode2);
+    numTests = 0;
+    numSuccess = 0;
+    numNotRun = 0;
+    numTimeOut = 0;
+    numDivergences = 0;
+  }
+
+  void cleanupSession() {
+    Directory.current = orgDir;
+    tmpDir.delete(recursive: true);
+  }
+
+  void showStatistics() {
+    if (showStats) {
+      stdout.write('\rTests: $numTests Success: $numSuccess Not-Run: '
+          '$numNotRun: Time-Out: $numTimeOut Divergences: $numDivergences');
+    }
+  }
+
+  void generateTest() {
+    final file = new File(fileName).openSync(mode: FileMode.write);
+    new DartFuzz(seed, file).run();
+    file.closeSync();
+  }
+
+  void runTest() {
+    TestResult result1 = runner1.run(fileName);
+    TestResult result2 = runner2.run(fileName);
+    checkDivergence(result1, result2);
+  }
+
+  void checkDivergence(TestResult result1, TestResult result2) {
+    if (result1.code == result2.code) {
+      // No divergence in result code.
+      switch (result1.code) {
+        case ResultCode.success:
+          // Both were successful, inspect output.
+          if (result1.output == result2.output) {
+            numSuccess++;
+          } else {
+            reportDivergence(result1, result2, true);
+          }
+          break;
+        case ResultCode.timeout:
+          // Both had a time out.
+          numTimeOut++;
+          break;
+        case ResultCode.error:
+          // Both had an error.
+          numNotRun++;
+          break;
+      }
+    } else {
+      // Divergence in result code.
+      if (trueDivergence) {
+        // When only true divergences are requested, any divergence
+        // with at least one time out is treated as a regular time out.
+        if (result1.code == ResultCode.timeout ||
+            result2.code == ResultCode.timeout) {
+          numTimeOut++;
+          return;
+        }
+      }
+      reportDivergence(result1, result2, false);
+    }
+  }
+
+  void reportDivergence(
+      TestResult result1, TestResult result2, bool outputDivergence) {
+    numDivergences++;
+    print('\n\nDIVERGENCE on generated program $version:$seed\n');
+    if (outputDivergence) {
+      print('out1:\n${result1.output}\n\nout2:\n${result2.output}\n');
+    }
+  }
+
+  // Context.
+  final Map<String, String> env;
+  final int repeat;
+  final bool trueDivergence;
+  final bool showStats;
+  final String top;
+  final String mode1;
+  final String mode2;
+
+  // Session.
+  Random rand;
+  Directory orgDir;
+  Directory tmpDir;
+  String fileName;
+  TestRunner runner1;
+  TestRunner runner2;
+  int seed;
+
+  // Stats.
+  int numTests;
+  int numSuccess;
+  int numNotRun;
+  int numTimeOut;
+  int numDivergences;
+}
+
+/// Main driver for a fuzz testing session.
+main(List<String> arguments) {
+  // Set up argument parser.
+  final parser = new ArgParser()
+    ..addOption('repeat', help: 'number of tests to run', defaultsTo: '1000')
+    ..addFlag('true-divergence',
+        negatable: true, help: 'only report true divergences', defaultsTo: true)
+    ..addFlag('show-stats',
+        negatable: true, help: 'show session statistics', defaultsTo: true)
+    ..addOption('dart-top',
+        help: 'explicit value for \$DART_TOP', defaultsTo: '')
+    ..addOption('mode1', help: 'execution mode 1', defaultsTo: 'jit-x64')
+    ..addOption('mode2', help: 'execution mode 2', defaultsTo: 'aot-x64');
+
+  // Start fuzz testing session.
+  try {
+    final env = Platform.environment;
+    final results = parser.parse(arguments);
+    final repeat = int.parse(results['repeat']);
+    final trueDivergence = results['true-divergence'];
+    final showStats = results['show-stats'];
+    final mode1 = results['mode1'];
+    final mode2 = results['mode2'];
+    var top = results['dart-top'];
+    if (top == null || top == '') {
+      top = env['DART_TOP'];
+    }
+    if (top == null || top == '') {
+      top = Directory.current.path;
+    }
+    final session = new DartFuzzTest(
+        env, repeat, trueDivergence, showStats, top, mode1, mode2);
+    if (!session.runSession()) {
+      exitCode = 1;
+    }
+  } catch (e) {
+    print('Usage: dart dartfuzz_test.dart [OPTIONS]\n${parser.usage}\n$e');
+    exitCode = 255;
+  }
+}
diff --git a/runtime/tools/dartfuzz/run_dartfuzz_test.py b/runtime/tools/dartfuzz/run_dartfuzz_test.py
deleted file mode 100755
index 8d33b49..0000000
--- a/runtime/tools/dartfuzz/run_dartfuzz_test.py
+++ /dev/null
@@ -1,423 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code == governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-import abc
-import argparse
-import os
-import shutil
-import signal
-import subprocess
-import sys
-
-from enum import Enum
-from enum import unique
-
-from subprocess import DEVNULL
-from subprocess import PIPE
-from subprocess import Popen
-from subprocess import STDOUT
-from subprocess import TimeoutExpired
-
-from tempfile import mkdtemp
-
-#
-# Helper methods to run commands.
-#
-
-@unique
-class RetCode(Enum):
-  """Enum representing return codes."""
-  SUCCESS = 0
-  TIMEOUT = 1
-  ERROR = 2
-
-class FatalError(Exception):
-  """Fatal error in script."""
-
-def RunCommandWithOutput(cmd, env, stdout, stderr, timeout=30):
-  """Runs command piping output to files, stderr, or stdout.
-
-  Args:
-    cmd: list of strings, command to run.
-    env: shell environment for command.
-    stdout: file handle for stdout.
-    stderr: file handle for stderr.
-    timeout: int, timeout in seconds.
-
-  Returns:
-    tuple (string, string, RetCode) out, err, return code.
-  """
-  proc = Popen(cmd, stdout=stdout, stderr=stderr, env=env,
-               universal_newlines=True, start_new_session=True)
-  try:
-    (out, err) = proc.communicate(timeout=timeout)
-    if proc.returncode == 0:
-      retcode = RetCode.SUCCESS
-    else:
-      retcode = RetCode.ERROR
-  except TimeoutExpired:
-    os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
-    (out, err) = proc.communicate()
-    retcode = RetCode.TIMEOUT
-  return (out, err, retcode)
-
-def RunCommand(cmd, out=None, err=None, timeout=30):
-  """Executes a command, and returns its return code.
-
-  Args:
-    cmd: list of strings, a command to execute.
-    out: string, file name to open for stdout (or None).
-    err: string, file name to open for stderr (or None).
-    timeout: int, time out in seconds.
-  Returns:
-    RetCode, return code of running command.
-  """
-  if out is not None:
-    outf = open(out, mode='w')
-  else:
-    outf = DEVNULL
-  if err is not None:
-    errf = open(err, mode='w')
-  else:
-    errf = DEVNULL
-  (_, _, retcode) = RunCommandWithOutput(cmd, None, outf, errf, timeout)
-  if outf != DEVNULL:
-    outf.close()
-  if errf != DEVNULL:
-    errf.close()
-  return retcode
-
-#
-# Execution modes.
-#
-
-class TestRunner(object):
-  """Abstraction for running a test in a particular execution mode."""
-  __meta_class__ = abc.ABCMeta
-
-  @abc.abstractproperty
-  def description(self):
-    """Returns a description string of the execution mode."""
-
-  @abc.abstractmethod
-  def RunTest(self):
-    """Run the generated test.
-
-    Ensures that the current fuzz.dart in the temporary directory is executed
-    under the current execution mode.
-
-    Most nonzero return codes are assumed non-divergent, since systems may
-    exit in different ways. This is enforced by normalizing return codes.
-
-    Returns:
-      tuple (string, string, RetCode) stdout-output, stderr-output, return code.
-    """
-
-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 ' + 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'], 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 ' + 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'],
-        self._env, PIPE, STDOUT, self._timeout)
-    if retcode != RetCode.SUCCESS:
-      return (out, err, retcode)
-    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'], self._env, PIPE, STDOUT)
-    if retcode != RetCode.SUCCESS:
-      return (out, err, retcode)
-    return RunCommandWithOutput(
-        ['nodejs', 'out.js'], self._env, PIPE, STDOUT)
-
-def GetExecutionModeRunner(mode):
-  """Returns a runner for the given execution mode.
-
-  Args:
-    mode: string, execution mode
-  Returns:
-    TestRunner with given execution mode
-  Raises:
-    FatalError: error for unknown execution mode
-  """
-  if mode.startswith('jit'):
-    return TestRunnerDartJIT(mode)
-  if mode.startswith('aot'):
-    return TestRunnerDartAOT(mode)
-  if mode == 'js':
-    return TestRunnerDart2JS()
-  raise FatalError('Unknown execution mode: ' + mode)
-
-#
-# DartFuzzTester class.
-#
-
-class DartFuzzTester(object):
-  """Tester that runs DartFuzz many times and report divergences."""
-
-  def  __init__(self, repeat, true_divergence, mode1, mode2):
-    """Constructor for the tester.
-
-    Args:
-      repeat: int, number of tests to run.
-      true_divergence: boolean, report true divergences only.
-      mode1: string, execution mode for first runner.
-      mode2: string, execution mode for second runner.
-    """
-    self._repeat = repeat
-    self._true_divergence = true_divergence
-    self._runner1 = GetExecutionModeRunner(mode1)
-    self._runner2 = GetExecutionModeRunner(mode2)
-
-  def __enter__(self):
-    """On entry, enters new temp directory after saving current directory.
-
-    Raises:
-      FatalError: error when temp directory cannot be constructed.
-    """
-    self._save_dir = os.getcwd()
-    self._tmp_dir = mkdtemp(dir='/tmp/')
-    if self._tmp_dir == None:
-      raise FatalError('Cannot obtain temp directory')
-    os.chdir(self._tmp_dir)
-    return self
-
-  def __exit__(self, etype, evalue, etraceback):
-    """On exit, re-enters previously saved current directory and cleans up."""
-    os.chdir(self._save_dir)
-    if self._num_divergences == 0:
-      shutil.rmtree(self._tmp_dir)
-      print('\n\nsuccess (no divergences)\n')
-    else:
-      print('\n\nfailure (divergences):', self._tmp_dir, '\n')
-
-  def Run(self):
-    """Runs DartFuzz many times and report divergences."""
-    self.Setup()
-    print()
-    print('**\n**** Dart Fuzz Testing\n**')
-    print()
-    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('Orig Dir    :', self._save_dir)
-    print('Temp Dir    :', self._tmp_dir)
-    print()
-    self.ShowStats()  # show all zeros on start
-    for self._test in range(1, self._repeat + 1):
-      self.RunTest()
-      self.ShowStats()
-
-  def Setup(self):
-    """Initial setup of the testing environment."""
-    # Fuzzer command.
-    self._dartfuzz = self._save_dir + '/dartfuzz.dart'
-    # Statistics.
-    self._test = 0
-    self._num_success = 0
-    self._num_not_run = 0
-    self._num_timed_out = 0
-    self._num_divergences = 0
-
-  def ShowStats(self):
-    """Shows current statistics (on same line) while tester is running."""
-    print('\rTests:', self._test,
-          'Success:', self._num_success,
-          'Not-run:', self._num_not_run,
-          'Timed-out:', self._num_timed_out,
-          'Divergences:', self._num_divergences,
-          end='')
-    sys.stdout.flush()
-
-  def RunTest(self):
-    """Runs a single fuzz test, comparing two execution modes."""
-    self.ConstructTest()
-    (out1, _, retcode1) = self._runner1.RunTest()
-    (out2, _, retcode2) = self._runner2.RunTest()
-    self.CheckForDivergence(out1, retcode1, out2, retcode2)
-    self.CleanupTest()
-
-  def ConstructTest(self):
-    """Use DartFuzz to generate next fuzz.dart test.
-
-    Raises:
-      FatalError: error when DartFuzz fails.
-    """
-    # Invoke dartfuzz script on command line rather than calling py code.
-    if (RunCommand(['dart', self._dartfuzz], out='fuzz.dart') != RetCode.SUCCESS):
-      raise FatalError('Unexpected error while running DartFuzz')
-
-  def CheckForDivergence(self, out1, retcode1, out2, retcode2):
-    """Checks for divergences and updates statistics.
-
-    Args:
-      out1: string, output for first runner.
-      retcode1: int, normalized return code of first runner.
-      out2: string, output for second runner.
-      retcode2: int, normalized return code of second runner.
-    """
-    if retcode1 == retcode2:
-      # No divergence in return code.
-      if retcode1 == RetCode.SUCCESS:
-        # Both compilations and runs were successful, inspect generated output.
-        if out1 == out2:
-          # No divergence in output.
-          self._num_success += 1
-        else:
-          # Divergence in output.
-          self.ReportDivergence(out1, retcode1, out2, retcode2, True)
-      elif retcode1 == RetCode.ERROR:
-        # Both did not run.
-        self._num_not_run += 1
-      elif retcode1 == RetCode.TIMEOUT:
-        # Both timed out.
-        self._num_timed_out += 1
-      else:
-       raise FatalError('Unknown return code')
-    else:
-      # Divergence in return code.
-      if self._true_divergence:
-        # When only true divergences are requested, any divergence in return
-        # code where one is a time out is treated as a regular time out.
-        if RetCode.TIMEOUT in (retcode1, retcode2):
-          self._num_timed_out += 1
-          return
-      self.ReportDivergence(out1, retcode1, out2, retcode2, False)
-
-  def ReportDivergence(self, out1, retcode1, out2, retcode2, is_output_divergence):
-    """Reports and saves a divergence.
-
-    Args:
-      out1: string, output for first runner.
-      retcode1: int, normalized return code of first runner.
-      out2: string, output for second runner.
-      retcode2: int, normalized return code of second runner.
-      is_output_divergence, boolean, denotes output divergence.
-      """
-    self._num_divergences += 1
-    print('\n#' + str(self._num_divergences), end='')
-    if is_output_divergence:
-      print(' divergence in output')
-    else:
-      print(' divergence in return code: '
-            + retcode1.name + ' vs. ' + retcode2.name)
-    print('->')
-    print(out1, end='')
-    print('<-')
-    print(out2, end='')
-    print('--')
-    # Save.
-    ddir = self._tmp_dir + '/divergence' + str(self._num_divergences)
-    os.mkdir(ddir)
-    shutil.copy('fuzz.dart', ddir)
-    # TODO: file bug report
-
-  def CleanupTest(self):
-    """Cleans up after a single test run."""
-    for file_name in os.listdir(self._tmp_dir):
-      file_path = os.path.join(self._tmp_dir, file_name)
-      if os.path.isfile(file_path):
-        os.unlink(file_path)
-      elif os.path.isdir(file_path):
-        pass  # keep the divergences directories
-
-#
-# Main driver.
-#
-
-def main():
-  # Handle arguments.
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--repeat', default=1000, type=int,
-                      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-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,
-                      args.mode1,
-                      args.mode2) as fuzzer:
-    fuzzer.Run()
-
-if __name__ == '__main__':
-  main()
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 3d5bf6f..e699f47 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -8,6 +8,7 @@
 #include "bin/file.h"
 #include "bin/isolate_data.h"
 #include "bin/process.h"
+#include "bin/reference_counting.h"
 
 #include "platform/assert.h"
 #include "platform/globals.h"
@@ -179,6 +180,100 @@
 
 #endif  // !PRODUCT
 
+// This file is created by the target //runtime/bin:gen_kernel_bytecode_dill
+// which is depended on by run_vm_tests.
+static char* ComputeGenKernelKernelPath(const char* arg) {
+  char buffer[2048];
+  char* gen_kernel_path = strdup(File::GetCanonicalPath(NULL, arg));
+  EXPECT(gen_kernel_path != NULL);
+  const char* compiler_path = "%s%sgen_kernel_bytecode.dill";
+  const char* path_separator = File::PathSeparator();
+  ASSERT(path_separator != NULL && strlen(path_separator) == 1);
+  char* ptr = strrchr(gen_kernel_path, *path_separator);
+  while (ptr != NULL) {
+    *ptr = '\0';
+    Utils::SNPrint(buffer, ARRAY_SIZE(buffer), compiler_path, gen_kernel_path,
+                   path_separator);
+    if (File::Exists(NULL, buffer)) {
+      break;
+    }
+    ptr = strrchr(gen_kernel_path, *path_separator);
+  }
+  free(gen_kernel_path);
+  if (ptr == NULL) {
+    return NULL;
+  }
+  return strdup(buffer);
+}
+
+BENCHMARK(GenKernelKernelLoadKernel) {
+  char* dill_path = ComputeGenKernelKernelPath(Benchmark::Executable());
+  File* file = File::Open(NULL, dill_path, File::kRead);
+  EXPECT(file != NULL);
+  bin::RefCntReleaseScope<File> rs(file);
+  intptr_t kernel_buffer_size = file->Length();
+  uint8_t* kernel_buffer =
+      reinterpret_cast<uint8_t*>(malloc(kernel_buffer_size));
+  EXPECT(kernel_buffer != NULL);
+  bool read_fully = file->ReadFully(kernel_buffer, kernel_buffer_size);
+  EXPECT(read_fully);
+
+  Timer timer(true, "GenKernelKernelLoadKernel benchmark");
+  timer.Start();
+
+  Dart_Handle result =
+      Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
+  EXPECT_VALID(result);
+
+  result = Dart_FinalizeLoading(false);
+  EXPECT_VALID(result);
+
+  timer.Stop();
+  int64_t elapsed_time = timer.TotalElapsedTime();
+  benchmark->set_score(elapsed_time);
+  free(dill_path);
+  free(kernel_buffer);
+}
+
+BENCHMARK(GenKernelKernelReadAllBytecode) {
+  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kCLILibrary);
+  char* dill_path = ComputeGenKernelKernelPath(Benchmark::Executable());
+  File* file = File::Open(NULL, dill_path, File::kRead);
+  EXPECT(file != NULL);
+  bin::RefCntReleaseScope<File> rs(file);
+  intptr_t kernel_buffer_size = file->Length();
+  uint8_t* kernel_buffer =
+      reinterpret_cast<uint8_t*>(malloc(kernel_buffer_size));
+  EXPECT(kernel_buffer != NULL);
+  bool read_fully = file->ReadFully(kernel_buffer, kernel_buffer_size);
+  EXPECT(read_fully);
+
+  bool enable_interpreter_orig = FLAG_enable_interpreter;
+  FLAG_enable_interpreter = true;
+
+  Dart_Handle result =
+      Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
+  EXPECT_VALID(result);
+
+  result = Dart_FinalizeLoading(false);
+  EXPECT_VALID(result);
+
+  Timer timer(true, "GenKernelKernelLoadKernel benchmark");
+  timer.Start();
+
+  result = Dart_ReadAllBytecode();
+  EXPECT_VALID(result);
+
+  timer.Stop();
+  int64_t elapsed_time = timer.TotalElapsedTime();
+  benchmark->set_score(elapsed_time);
+  FLAG_enable_interpreter = enable_interpreter_orig;
+  free(dill_path);
+  free(kernel_buffer);
+}
+
 //
 // Measure creation of core isolate from a snapshot.
 //
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index f0434a3..21ea84d 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -126,6 +126,14 @@
     if (top_ == capacity_) {
       // Grow the capacity of the class table.
       // TODO(koda): Add ClassTable::Grow to share code.
+
+#ifndef PRODUCT
+      // Wait for any marking tasks to complete. Allocation stats in the
+      // marker rely on the class table size not changing.
+      Thread* thread = Thread::Current();
+      thread->heap()->WaitForMarkerTasks(thread);
+#endif
+
       intptr_t new_capacity = capacity_ + capacity_increment_;
       ClassAndSize* new_table = reinterpret_cast<ClassAndSize*>(
           malloc(new_capacity * sizeof(ClassAndSize)));  // NOLINT
@@ -159,6 +167,14 @@
   if (index >= capacity_) {
     // Grow the capacity of the class table.
     // TODO(koda): Add ClassTable::Grow to share code.
+
+#ifndef PRODUCT
+    // Wait for any marking tasks to complete. Allocation stats in the
+    // marker rely on the class table size not changing.
+    Thread* thread = Thread::Current();
+    thread->heap()->WaitForMarkerTasks(thread);
+#endif
+
     intptr_t new_capacity = index + capacity_increment_;
     if (!Class::is_valid_id(index) || new_capacity < capacity_) {
       FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n",
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 560e686..b87d242 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -214,6 +214,7 @@
   }
 
   intptr_t NumCids() const { return top_; }
+  intptr_t Capacity() const { return capacity_; }
 
   // Used to drop recently added classes.
   void SetNumCids(intptr_t num_cids) {
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 84bc363..ba822e0 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -1675,15 +1675,12 @@
       s->Push(code->ptr()->inlined_id_to_function_);
       s->Push(code->ptr()->code_source_map_);
     }
-    if (s->kind() != Snapshot::kFullAOT) {
-      s->Push(code->ptr()->await_token_positions_);
-    }
-
     if (s->kind() == Snapshot::kFullJIT) {
       s->Push(code->ptr()->deopt_info_array_);
       s->Push(code->ptr()->static_calls_target_table_);
-      NOT_IN_PRODUCT(s->Push(code->ptr()->return_address_metadata_));
     }
+    NOT_IN_PRODUCT(s->Push(code->ptr()->await_token_positions_));
+    NOT_IN_PRODUCT(s->Push(code->ptr()->return_address_metadata_));
   }
 
   void WriteAlloc(Serializer* s) {
@@ -1739,14 +1736,12 @@
         s->WriteRef(code->ptr()->inlined_id_to_function_);
         s->WriteRef(code->ptr()->code_source_map_);
       }
-      if (s->kind() != Snapshot::kFullAOT) {
-        s->WriteRef(code->ptr()->await_token_positions_);
-      }
       if (s->kind() == Snapshot::kFullJIT) {
         s->WriteRef(code->ptr()->deopt_info_array_);
         s->WriteRef(code->ptr()->static_calls_target_table_);
-        NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_));
       }
+      NOT_IN_PRODUCT(s->WriteRef(code->ptr()->await_token_positions_));
+      NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_));
 
       s->Write<int32_t>(code->ptr()->state_bits_);
     }
@@ -1823,30 +1818,22 @@
           reinterpret_cast<RawCodeSourceMap*>(d->ReadRef());
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      code->ptr()->await_token_positions_ =
-          reinterpret_cast<RawArray*>(d->ReadRef());
-
       if (d->kind() == Snapshot::kFullJIT) {
         code->ptr()->deopt_info_array_ =
             reinterpret_cast<RawArray*>(d->ReadRef());
         code->ptr()->static_calls_target_table_ =
             reinterpret_cast<RawArray*>(d->ReadRef());
-#if defined(PRODUCT)
-        code->ptr()->return_address_metadata_ = Object::null();
-#else
-        code->ptr()->return_address_metadata_ = d->ReadRef();
-#endif
-      } else {
-        code->ptr()->deopt_info_array_ = Array::null();
-        code->ptr()->static_calls_target_table_ = Array::null();
-        code->ptr()->return_address_metadata_ = Object::null();
       }
+#endif  // !DART_PRECOMPILED_RUNTIME
 
+#if !defined(PRODUCT)
+      code->ptr()->await_token_positions_ =
+          reinterpret_cast<RawArray*>(d->ReadRef());
+      code->ptr()->return_address_metadata_ = d->ReadRef();
       code->ptr()->var_descriptors_ = LocalVarDescriptors::null();
       code->ptr()->comments_ = Array::null();
-
       code->ptr()->compile_timestamp_ = 0;
-#endif  // !DART_PRECOMPILED_RUNTIME
+#endif
 
       code->ptr()->state_bits_ = d->Read<int32_t>();
     }
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index ca7cd0e..dfa7d1e 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, write_protect_code, true, "Write protect jitted code");
+DEFINE_FLAG(bool, write_protect_code, false, "Write protect jitted code");
 
 WritableInstructionsScope::WritableInstructionsScope(uword address,
                                                      intptr_t size)
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 22be20e..3d978a3 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -4,6 +4,8 @@
 
 #include "vm/compilation_trace.h"
 
+#include "vm/globals.h"
+#include "vm/log.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
@@ -11,6 +13,10 @@
 
 namespace dart {
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+DEFINE_FLAG(bool, trace_compilation_trace, false, "Trace compilation trace.");
+
 CompilationTraceSaver::CompilationTraceSaver(Zone* zone)
     : buf_(zone, 4 * KB),
       func_name_(String::Handle(zone)),
@@ -152,17 +158,27 @@
   if (function_name_.Equals("_getMainClosure")) {
     // The scheme for invoking main relies on compiling _getMainClosure after
     // synthetically importing the root library.
+    if (FLAG_trace_compilation_trace) {
+      THR_Print("Compilation trace: skip %s,%s,%s\n", uri_.ToCString(),
+                class_name_.ToCString(), function_name_.ToCString());
+    }
     return Object::null();
   }
 
   lib_ = Library::LookupLibrary(thread_, uri_);
   if (lib_.IsNull()) {
     // Missing library.
+    if (FLAG_trace_compilation_trace) {
+      THR_Print("Compilation trace: missing library %s,%s,%s\n",
+                uri_.ToCString(), class_name_.ToCString(),
+                function_name_.ToCString());
+    }
     return Object::null();
   }
 
   bool is_getter = Field::IsGetterName(function_name_);
   bool add_closure = false;
+  bool processed = false;
 
   if (class_name_.Equals(Symbols::TopLevel())) {
     function_ = lib_.LookupFunctionAllowPrivate(function_name_);
@@ -178,11 +194,23 @@
     cls_ = lib_.SlowLookupClassAllowMultiPartPrivate(class_name_);
     if (cls_.IsNull()) {
       // Missing class.
+      if (FLAG_trace_compilation_trace) {
+        THR_Print("Compilation trace: missing class %s,%s,%s\n",
+                  uri_.ToCString(), class_name_.ToCString(),
+                  function_name_.ToCString());
+      }
       return Object::null();
     }
 
     error_ = cls_.EnsureIsFinalized(thread_);
     if (error_.IsError()) {
+      // Non-finalized class.
+      if (FLAG_trace_compilation_trace) {
+        THR_Print("Compilation trace: non-finalized class %s,%s,%s (%s)\n",
+                  uri_.ToCString(), class_name_.ToCString(),
+                  function_name_.ToCString(),
+                  Error::Cast(error_).ToErrorCString());
+      }
       return error_.raw();
     }
 
@@ -201,6 +229,14 @@
         if (!function2_.IsNull()) {
           error_ = CompileFunction(function2_);
           if (error_.IsError()) {
+            if (FLAG_trace_compilation_trace) {
+              THR_Print(
+                  "Compilation trace: error compiling extractor %s for "
+                  "%s,%s,%s (%s)\n",
+                  function2_.ToCString(), uri_.ToCString(),
+                  class_name_.ToCString(), function_name_.ToCString(),
+                  Error::Cast(error_).ToErrorCString());
+            }
             return error_.raw();
           }
         }
@@ -210,26 +246,53 @@
 
   if (!field_.IsNull() && field_.is_const() && field_.is_static() &&
       (field_.StaticValue() == Object::sentinel().raw())) {
+    processed = true;
     error_ = EvaluateInitializer(field_);
     if (error_.IsError()) {
+      if (FLAG_trace_compilation_trace) {
+        THR_Print(
+            "Compilation trace: error initializing field %s for %s,%s,%s "
+            "(%s)\n",
+            field_.ToCString(), uri_.ToCString(), class_name_.ToCString(),
+            function_name_.ToCString(), Error::Cast(error_).ToErrorCString());
+      }
       return error_.raw();
     }
   }
 
   if (!function_.IsNull()) {
+    processed = true;
     error_ = CompileFunction(function_);
     if (error_.IsError()) {
+      if (FLAG_trace_compilation_trace) {
+        THR_Print("Compilation trace: error compiling %s,%s,%s (%s)\n",
+                  uri_.ToCString(), class_name_.ToCString(),
+                  function_name_.ToCString(),
+                  Error::Cast(error_).ToErrorCString());
+      }
       return error_.raw();
     }
     if (add_closure) {
       function_ = function_.ImplicitClosureFunction();
       error_ = CompileFunction(function_);
       if (error_.IsError()) {
+        if (FLAG_trace_compilation_trace) {
+          THR_Print(
+              "Compilation trace: error compiling closure %s,%s,%s (%s)\n",
+              uri_.ToCString(), class_name_.ToCString(),
+              function_name_.ToCString(), Error::Cast(error_).ToErrorCString());
+        }
         return error_.raw();
       }
     }
   }
 
+  if (FLAG_trace_compilation_trace) {
+    if (!processed) {
+      THR_Print("Compilation trace: ignored %s,%s,%s\n", uri_.ToCString(),
+                class_name_.ToCString(), function_name_.ToCString());
+    }
+  }
   return Object::null();
 }
 
@@ -253,4 +316,6 @@
   return Object::null();
 }
 
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 5395c71..3607520 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -30,7 +30,6 @@
 #include "vm/flags.h"
 #include "vm/hash_table.h"
 #include "vm/isolate.h"
-#include "vm/json_writer.h"
 #include "vm/kernel_loader.h"  // For kernel::ParseStaticFieldInitializer.
 #include "vm/log.h"
 #include "vm/longjump.h"
@@ -93,11 +92,17 @@
  public:
   explicit DartPrecompilationPipeline(Zone* zone,
                                       FieldTypeMap* field_map = NULL)
-      : zone_(zone), result_type_(CompileType::None()), field_map_(field_map) {}
+      : zone_(zone),
+        result_type_(CompileType::None()),
+        field_map_(field_map),
+        class_(Class::Handle(zone)),
+        fields_(Array::Handle(zone)),
+        field_(Field::Handle(zone)) {}
 
   virtual void FinalizeCompilation(FlowGraph* flow_graph) {
     if ((field_map_ != NULL) &&
         flow_graph->function().IsGenerativeConstructor()) {
+      const Function& constructor = flow_graph->function();
       for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
            !block_it.Done(); block_it.Advance()) {
         ForwardInstructionIterator it(block_it.Current());
@@ -112,36 +117,34 @@
                           store->value()->Type()->ToCString());
               }
 #endif  // !PRODUCT
-              FieldTypePair* entry = field_map_->Lookup(&store->field());
-              if (entry == NULL) {
-                field_map_->Insert(FieldTypePair(
-                    &Field::Handle(zone_, store->field().raw()),  // Re-wrap.
-                    store->value()->Type()->ToCid()));
-#ifndef PRODUCT
-                if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                  THR_Print(" initial type = %s\n",
-                            store->value()->Type()->ToCString());
-                }
-#endif  // !PRODUCT
-                continue;
-              }
-              CompileType type = CompileType::FromCid(entry->cid_);
-#ifndef PRODUCT
-              if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                THR_Print(" old type = %s\n", type.ToCString());
-              }
-#endif  // !PRODUCT
-              type.Union(store->value()->Type());
-#ifndef PRODUCT
-              if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                THR_Print(" new type = %s\n", type.ToCString());
-              }
-#endif  // !PRODUCT
-              entry->cid_ = type.ToCid();
+              RecordFieldStore(constructor, store->field(),
+                               store->value()->Type());
             }
           }
         }
       }
+
+      // Final fields which were not initialized in this constructor are
+      // implicitly initialized with null.
+      class_ = flow_graph->function().Owner();
+      fields_ = class_.fields();
+      for (intptr_t i = 0; i < fields_.Length(); ++i) {
+        field_ ^= fields_.At(i);
+        if (!field_.is_static() && field_.is_final()) {
+          FieldTypePair* entry = field_map_->Lookup(&field_);
+          if ((entry == nullptr) ||
+              (entry->field_info.constructor != constructor.raw())) {
+#ifndef PRODUCT
+              if (FLAG_trace_precompiler && FLAG_support_il_printer) {
+                THR_Print("Implicit initialization %s <- null\n",
+                          field_.ToCString());
+              }
+#endif  // !PRODUCT
+              CompileType null_type = CompileType::Null();
+              RecordFieldStore(constructor, field_, &null_type);
+          }
+        }
+      }
     }
 
     CompileType result_type = CompileType::None();
@@ -158,12 +161,46 @@
     result_type_ = result_type;
   }
 
+  void RecordFieldStore(const Function& constructor,
+                        const Field& field,
+                        CompileType* value_type) {
+    FieldTypePair* entry = field_map_->Lookup(&field);
+    if (entry == NULL) {
+      field_map_->Insert(
+          FieldTypePair(&Field::Handle(zone_, field.raw()),  // Re-wrap.
+                        value_type->ToCid(), constructor.raw()));
+#ifndef PRODUCT
+      if (FLAG_trace_precompiler && FLAG_support_il_printer) {
+        THR_Print(" initial type = %s\n", value_type->ToCString());
+      }
+#endif  // !PRODUCT
+      return;
+    }
+    CompileType type = CompileType::FromCid(entry->field_info.cid);
+#ifndef PRODUCT
+    if (FLAG_trace_precompiler && FLAG_support_il_printer) {
+      THR_Print(" old type = %s\n", type.ToCString());
+    }
+#endif  // !PRODUCT
+    type.Union(value_type);
+#ifndef PRODUCT
+    if (FLAG_trace_precompiler && FLAG_support_il_printer) {
+      THR_Print(" new type = %s\n", type.ToCString());
+    }
+#endif  // !PRODUCT
+    entry->field_info.cid = type.ToCid();
+    entry->field_info.constructor = constructor.raw();
+  }
+
   CompileType result_type() { return result_type_; }
 
  private:
   Zone* zone_;
   CompileType result_type_;
   FieldTypeMap* field_map_;
+  Class& class_;
+  Array& fields_;
+  Field& field_;
 };
 
 class PrecompileParsedFunctionHelper : public ValueObject {
@@ -214,12 +251,11 @@
   }
 }
 
-RawError* Precompiler::CompileAll(
-    Dart_QualifiedFunctionName embedder_entry_points[]) {
+RawError* Precompiler::CompileAll() {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     Precompiler precompiler(Thread::Current());
-    precompiler.DoCompileAll(embedder_entry_points);
+    precompiler.DoCompileAll();
     return Error::null();
   } else {
     Thread* thread = Thread::Current();
@@ -259,8 +295,7 @@
       error_(Error::Handle()),
       get_runtime_type_is_unique_(false) {}
 
-void Precompiler::DoCompileAll(
-    Dart_QualifiedFunctionName embedder_entry_points[]) {
+void Precompiler::DoCompileAll() {
   ASSERT(I->compilation_allowed());
 
   {
@@ -315,7 +350,7 @@
         CollectDynamicFunctionNames();
 
         // Start with the allocations and invocations that happen from C++.
-        AddRoots(embedder_entry_points);
+        AddRoots();
         AddAnnotatedRoots();
 
         // Compile newly found targets and add their callees until we reach a
@@ -481,187 +516,21 @@
   FieldTypeMap::Iterator it(field_type_map_.GetIterator());
   for (FieldTypePair* current = it.Next(); current != NULL;
        current = it.Next()) {
-    const intptr_t cid = current->cid_;
-    current->field_->set_guarded_cid(cid);
-    current->field_->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
+    const intptr_t cid = current->field_info.cid;
+    current->field->set_guarded_cid(cid);
+    current->field->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
     // TODO(vegorov) we can actually compute the length in the same way we
     // compute cids.
-    current->field_->set_guarded_list_length(Field::kNoFixedLength);
+    current->field->set_guarded_list_length(Field::kNoFixedLength);
     if (FLAG_trace_precompiler) {
       THR_Print(
-          "Field %s <- Type %s\n", current->field_->ToCString(),
+          "Field %s <- Type %s\n", current->field->ToCString(),
           Class::Handle(T->isolate()->class_table()->At(cid)).ToCString());
     }
   }
 }
 
-static Dart_QualifiedFunctionName vm_entry_points[] = {
-    // Fields
-    {NULL, NULL, NULL}  // Must be terminated with NULL entries.
-};
-
-class PrecompilerEntryPointsPrinter : public ValueObject {
- public:
-  explicit PrecompilerEntryPointsPrinter(Zone* zone);
-
-  void AddInstantiatedClass(const Class& cls);
-  void AddEntryPoint(const Object& entry_point);
-
-  void Print();
-
- private:
-  Zone* zone() const { return zone_; }
-
-  void DescribeClass(JSONWriter* writer, const Class& cls);
-
-  Zone* zone_;
-  const GrowableObjectArray& instantiated_classes_;
-  const GrowableObjectArray& entry_points_;
-};
-
-PrecompilerEntryPointsPrinter::PrecompilerEntryPointsPrinter(Zone* zone)
-    : zone_(zone),
-      instantiated_classes_(GrowableObjectArray::Handle(
-          zone,
-          FLAG_print_precompiler_entry_points ? GrowableObjectArray::New()
-                                              : GrowableObjectArray::null())),
-      entry_points_(GrowableObjectArray::Handle(
-          zone,
-          FLAG_print_precompiler_entry_points ? GrowableObjectArray::New()
-                                              : GrowableObjectArray::null())) {}
-
-void PrecompilerEntryPointsPrinter::AddInstantiatedClass(const Class& cls) {
-  if (!FLAG_print_precompiler_entry_points) {
-    return;
-  }
-
-  if (!cls.is_abstract()) {
-    instantiated_classes_.Add(cls);
-  }
-}
-
-void PrecompilerEntryPointsPrinter::AddEntryPoint(const Object& entry_point) {
-  ASSERT(entry_point.IsFunction() || entry_point.IsField());
-
-  if (!FLAG_print_precompiler_entry_points) {
-    return;
-  }
-  entry_points_.Add(entry_point);
-}
-
-// Prints precompiler entry points as JSON.
-// The format is described in [entry_points_json.md].
-void PrecompilerEntryPointsPrinter::Print() {
-  if (!FLAG_print_precompiler_entry_points) {
-    return;
-  }
-
-  JSONWriter writer;
-
-  writer.OpenObject();
-
-  writer.OpenArray("roots");
-
-  for (intptr_t i = 0; i < instantiated_classes_.Length(); ++i) {
-    const Class& cls = Class::CheckedHandle(Z, instantiated_classes_.At(i));
-
-    writer.OpenObject();
-    DescribeClass(&writer, cls);
-    writer.PrintProperty("action", "create-instance");
-    writer.CloseObject();
-  }
-
-  for (intptr_t i = 0; i < entry_points_.Length(); ++i) {
-    const Object& entry_point = Object::Handle(Z, entry_points_.At(i));
-
-    if (entry_point.IsFunction()) {
-      const Function& func = Function::Cast(entry_point);
-
-      writer.OpenObject();
-      DescribeClass(&writer, Class::Handle(Z, func.Owner()));
-
-      String& name = String::Handle(Z);
-      if (func.IsGetterFunction() || func.IsImplicitGetterFunction() ||
-          (func.kind() == RawFunction::kImplicitStaticFinalGetter)) {
-        name = func.name();
-        name = Field::NameFromGetter(name);
-        name = String::ScrubName(name);
-        writer.PrintPropertyStr("name", name);
-        writer.PrintProperty("action", "get");
-      } else if (func.IsSetterFunction() || func.IsImplicitSetterFunction()) {
-        name = func.name();
-        name = Field::NameFromSetter(name);
-        name = String::ScrubName(name);
-        writer.PrintPropertyStr("name", name);
-        writer.PrintProperty("action", "set");
-      } else {
-        name = func.UserVisibleName();
-        writer.PrintPropertyStr("name", name);
-        writer.PrintProperty("action", "call");
-      }
-      writer.CloseObject();
-    } else {
-      const Field& field = Field::Cast(entry_point);
-      const Class& owner = Class::Handle(Z, field.Owner());
-      const String& name = String::Handle(Z, field.UserVisibleName());
-
-      {
-        writer.OpenObject();
-        DescribeClass(&writer, owner);
-        writer.PrintPropertyStr("name", name);
-        writer.PrintProperty("action", "get");
-        writer.CloseObject();
-      }
-
-      {
-        writer.OpenObject();
-        DescribeClass(&writer, owner);
-        writer.PrintPropertyStr("name", name);
-        writer.PrintProperty("action", "set");
-        writer.CloseObject();
-      }
-    }
-  }
-
-  writer.CloseArray();  // roots
-  writer.CloseObject();  // top-level
-
-  const char* contents = writer.ToCString();
-
-  Dart_FileOpenCallback file_open = Dart::file_open_callback();
-  Dart_FileWriteCallback file_write = Dart::file_write_callback();
-  Dart_FileCloseCallback file_close = Dart::file_close_callback();
-  if ((file_open == NULL) || (file_write == NULL) || (file_close == NULL)) {
-    FATAL(
-        "Unable to print precompiler entry points:"
-        " file callbacks are not provided by embedder");
-  }
-
-  void* out_stream =
-      file_open(FLAG_print_precompiler_entry_points, /* write = */ true);
-  if (out_stream == NULL) {
-    FATAL1(
-        "Unable to print precompiler entry points:"
-        " failed to open file \"%s\" for writing",
-        FLAG_print_precompiler_entry_points);
-  }
-  file_write(contents, strlen(contents), out_stream);
-  file_close(out_stream);
-}
-
-void PrecompilerEntryPointsPrinter::DescribeClass(JSONWriter* writer,
-                                                  const Class& cls) {
-  const Library& library = Library::Handle(Z, cls.library());
-  writer->PrintPropertyStr("library", String::Handle(Z, library.url()));
-
-  if (!cls.IsTopLevel()) {
-    writer->PrintPropertyStr("class", String::Handle(Z, cls.ScrubbedName()));
-  }
-}
-
-void Precompiler::AddRoots(Dart_QualifiedFunctionName embedder_entry_points[]) {
-  PrecompilerEntryPointsPrinter entry_points_printer(zone());
-
+void Precompiler::AddRoots() {
   // Note that <rootlibrary>.main is not a root. The appropriate main will be
   // discovered through _getMainClosure.
 
@@ -669,11 +538,6 @@
 
   AddSelector(Symbols::Call());  // For speed, not correctness.
 
-  AddEntryPoints(vm_entry_points, &entry_points_printer);
-  AddEntryPoints(embedder_entry_points, &entry_points_printer);
-
-  entry_points_printer.Print();
-
   const Library& lib = Library::Handle(I->object_store()->root_library());
   if (lib.IsNull()) {
     const String& msg = String::Handle(
@@ -704,90 +568,6 @@
   }
 }
 
-void Precompiler::AddEntryPoints(
-    Dart_QualifiedFunctionName entry_points[],
-    PrecompilerEntryPointsPrinter* entry_points_printer) {
-  Library& lib = Library::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  Function& func = Function::Handle(Z);
-  Field& field = Field::Handle(Z);
-  String& library_uri = String::Handle(Z);
-  String& class_name = String::Handle(Z);
-  String& function_name = String::Handle(Z);
-
-  for (intptr_t i = 0; entry_points[i].library_uri != NULL; i++) {
-    library_uri = Symbols::New(thread(), entry_points[i].library_uri);
-    class_name = Symbols::New(thread(), entry_points[i].class_name);
-    function_name = Symbols::New(thread(), entry_points[i].function_name);
-
-    if (library_uri.raw() == Symbols::TopLevel().raw()) {
-      lib = I->object_store()->root_library();
-    } else {
-      lib = Library::LookupLibrary(T, library_uri);
-    }
-    if (lib.IsNull()) {
-      String& msg = String::Handle(
-          Z, String::NewFormatted("Cannot find entry point '%s'\n",
-                                  entry_points[i].library_uri));
-      Jump(Error::Handle(Z, ApiError::New(msg)));
-      UNREACHABLE();
-    }
-
-    if (class_name.raw() == Symbols::TopLevel().raw()) {
-      if (Library::IsPrivate(function_name)) {
-        function_name = lib.PrivateName(function_name);
-      }
-      func = lib.LookupLocalFunction(function_name);
-      field = lib.LookupLocalField(function_name);
-    } else {
-      if (Library::IsPrivate(class_name)) {
-        class_name = lib.PrivateName(class_name);
-      }
-      cls = lib.LookupLocalClass(class_name);
-      if (cls.IsNull()) {
-        String& msg = String::Handle(
-            Z, String::NewFormatted("Cannot find entry point '%s' '%s'\n",
-                                    entry_points[i].library_uri,
-                                    entry_points[i].class_name));
-        Jump(Error::Handle(Z, ApiError::New(msg)));
-        UNREACHABLE();
-      }
-
-      ASSERT(!cls.IsNull());
-      func = cls.LookupFunctionAllowPrivate(function_name);
-      field = cls.LookupFieldAllowPrivate(function_name);
-    }
-
-    if (func.IsNull() && field.IsNull()) {
-      String& msg = String::Handle(
-          Z, String::NewFormatted("Cannot find entry point '%s' '%s' '%s'\n",
-                                  entry_points[i].library_uri,
-                                  entry_points[i].class_name,
-                                  entry_points[i].function_name));
-      Jump(Error::Handle(Z, ApiError::New(msg)));
-      UNREACHABLE();
-    }
-
-    if (!func.IsNull()) {
-      AddFunction(func);
-      entry_points_printer->AddEntryPoint(func);
-      if (func.IsGenerativeConstructor()) {
-        // Allocation stubs are referenced from the call site of the
-        // constructor, not in the constructor itself. So compiling the
-        // constructor isn't enough for us to discover the class is
-        // instantiated if the class isn't otherwise instantiated from Dart
-        // code and only instantiated from C++.
-        AddInstantiatedClass(cls);
-        entry_points_printer->AddInstantiatedClass(cls);
-      }
-    }
-    if (!field.IsNull()) {
-      AddField(field);
-      entry_points_printer->AddEntryPoint(field);
-    }
-  }
-}
-
 void Precompiler::Iterate() {
   Function& function = Function::Handle(Z);
 
@@ -1348,8 +1128,8 @@
                                           parsed_function,
                                           /* optimized = */ false);
     helper.Compile(&pipeline);
-    Code::Handle(func.unoptimized_code())
-        .set_var_descriptors(Object::empty_var_descriptors());
+    NOT_IN_PRODUCT(Code::Handle(func.unoptimized_code())
+                       .set_var_descriptors(Object::empty_var_descriptors()));
 
     const Object& result = PassiveObject::Handle(
         DartEntry::InvokeFunction(func, Object::empty_array()));
@@ -3044,7 +2824,6 @@
 void Obfuscator::InitializeRenamingMap(Isolate* isolate) {
   // Prevent renaming of classes and method names mentioned in the
   // entry points lists.
-  PreventRenaming(vm_entry_points);
   PreventRenaming(isolate->embedder_entry_points());
 
 // Prevent renaming of all pseudo-keywords and operators.
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 5bb7053..cfa8b7e 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -229,30 +229,46 @@
 
 typedef DirectChainedHashMap<InstanceKeyValueTrait> InstanceSet;
 
+struct PrecompilerFieldInfo {
+  intptr_t cid;
+
+  // The most recently compiled constructor which stored the field.
+  // Used in DartPrecompilationPipeline::FinalizeCompilation to find out if
+  // this field was not initialized in the constructor being compiled.
+  const RawFunction* constructor;
+
+  bool operator==(const PrecompilerFieldInfo& other) const {
+    return (cid == other.cid) && (constructor == other.constructor);
+  }
+
+  bool operator!=(const PrecompilerFieldInfo& other) const {
+    return !(*this == other);
+  }
+};
+
 struct FieldTypePair {
   // Typedefs needed for the DirectChainedHashMap template.
   typedef const Field* Key;
-  typedef intptr_t Value;
+  typedef PrecompilerFieldInfo Value;
   typedef FieldTypePair Pair;
 
-  static Key KeyOf(Pair kv) { return kv.field_; }
+  static Key KeyOf(Pair kv) { return kv.field; }
 
-  static Value ValueOf(Pair kv) { return kv.cid_; }
+  static Value ValueOf(Pair kv) { return kv.field_info; }
 
   static inline intptr_t Hashcode(Key key) { return key->token_pos().value(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
-    return pair.field_->raw() == key->raw();
+    return pair.field->raw() == key->raw();
   }
 
-  FieldTypePair(const Field* f, intptr_t cid) : field_(f), cid_(cid) {}
+  FieldTypePair(const Field* f, intptr_t cid, const RawFunction* constructor)
+      : field(f), field_info({cid, constructor}) {}
 
-  FieldTypePair() : field_(NULL), cid_(-1) {}
+  FieldTypePair() : field(nullptr), field_info({-1, nullptr}) {}
 
-  void Print() const;
-
-  const Field* field_;
-  intptr_t cid_;
+  const Field* field;
+  PrecompilerFieldInfo field_info;
 };
 
 typedef DirectChainedHashMap<FieldTypePair> FieldTypeMap;
@@ -322,8 +338,7 @@
 
 class Precompiler : public ValueObject {
  public:
-  static RawError* CompileAll(
-      Dart_QualifiedFunctionName embedder_entry_points[]);
+  static RawError* CompileAll();
 
   static RawError* CompileFunction(Precompiler* precompiler,
                                    Thread* thread,
@@ -347,11 +362,9 @@
  private:
   explicit Precompiler(Thread* thread);
 
-  void DoCompileAll(Dart_QualifiedFunctionName embedder_entry_points[]);
-  void AddRoots(Dart_QualifiedFunctionName embedder_entry_points[]);
+  void DoCompileAll();
+  void AddRoots();
   void AddAnnotatedRoots();
-  void AddEntryPoints(Dart_QualifiedFunctionName entry_points[],
-                      PrecompilerEntryPointsPrinter* entry_points_printer);
   void Iterate();
 
   void AddType(const AbstractType& type);
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index a027b8a..3a87672 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -128,9 +128,12 @@
   }
 
   intptr_t CurrentContextEnvIndex() const {
-    return FLAG_use_bytecode_compiler
-               ? -1
-               : EnvIndex(parsed_function().current_context_var());
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    if (function().HasBytecode()) {
+      return -1;
+    }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+    return EnvIndex(parsed_function().current_context_var());
   }
 
   intptr_t RawTypeArgumentEnvIndex() const {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index efb9313..d5ce4e7 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1037,8 +1037,11 @@
 }
 
 void FlowGraphCompiler::FinalizeVarDescriptors(const Code& code) {
+#if defined(PRODUCT)
+  // No debugger: no var descriptors.
+#else
   // TODO(alexmarkov): revise local vars descriptors when compiling bytecode
-  if (code.is_optimized() || FLAG_use_bytecode_compiler) {
+  if (code.is_optimized() || flow_graph().function().HasBytecode()) {
     // Optimized code does not need variable descriptors. They are
     // only stored in the unoptimized version.
     code.set_var_descriptors(Object::empty_var_descriptors());
@@ -1062,6 +1065,7 @@
     var_descs.SetVar(0, Symbols::CurrentContextVar(), &info);
   }
   code.set_var_descriptors(var_descs);
+#endif
 }
 
 void FlowGraphCompiler::FinalizeCatchEntryMovesMap(const Code& code) {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 63fc9df..0dd586c 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3057,12 +3057,25 @@
   return this;
 }
 
+// Tests for a FP comparison that cannot be negated
+// (to preserve NaN semantics).
+static bool IsFpCompare(ComparisonInstr* comp) {
+  if (comp->IsRelationalOp()) {
+    return comp->operation_cid() == kDoubleCid;
+  }
+  return false;
+}
+
 Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) {
   Definition* defn = value()->definition();
+  // Convert e.g. !(x > y) into (x <= y) for non-FP x, y.
   if (defn->IsComparison() && defn->HasOnlyUse(value()) &&
       defn->Type()->ToCid() == kBoolCid) {
-    defn->AsComparison()->NegateComparison();
-    return defn;
+    ComparisonInstr* comp = defn->AsComparison();
+    if (!IsFpCompare(comp)) {
+      comp->NegateComparison();
+      return defn;
+    }
   }
   return this;
 }
@@ -3128,15 +3141,21 @@
   if ((kind == Token::kNE_STRICT) && (constant.raw() == Bool::True().raw()) &&
       other_defn->IsComparison() && can_merge &&
       other_defn->HasOnlyUse(other)) {
-    *negated = true;
-    return other_defn;
+    ComparisonInstr* comp = other_defn->AsComparison();
+    if (!IsFpCompare(comp)) {
+      *negated = true;
+      return other_defn;
+    }
   }
   // Handle e === false.
   if ((kind == Token::kEQ_STRICT) && (constant.raw() == Bool::False().raw()) &&
       other_defn->IsComparison() && can_merge &&
       other_defn->HasOnlyUse(other)) {
-    *negated = true;
-    return other_defn;
+    ComparisonInstr* comp = other_defn->AsComparison();
+    if (!IsFpCompare(comp)) {
+      *negated = true;
+      return other_defn;
+    }
   }
   return compare;
 }
@@ -3972,7 +3991,7 @@
   }
 
 #if !defined(TARGET_ARCH_DBC)
-  if ((compiler->is_optimizing() || FLAG_use_bytecode_compiler) &&
+  if ((compiler->is_optimizing() || compiler->function().HasBytecode()) &&
       HasICData()) {
     ASSERT(HasICData());
     if (ic_data()->NumberOfUsedChecks() > 0) {
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 67ac074..6f63f4d 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -938,7 +938,7 @@
     return CompileType::Dynamic();
   }
 
-  if (FLAG_use_bytecode_compiler &&
+  if (function.HasBytecode() &&
       graph_entry->parsed_function().node_sequence() == nullptr) {
     // TODO(alexmarkov): Consider adding node_sequence() and scope.
     return CompileType::Dynamic();
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index e9587e6..8f311c6 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -231,6 +231,15 @@
   INVOKE_PASS(ConstantPropagation);
   INVOKE_PASS(OptimisticallySpecializeSmiPhis);
   INVOKE_PASS(TypePropagation);
+#if defined(DART_PRECOMPILER)
+  if (mode == kAOT) {
+    // The extra call specialization pass in AOT is able to specialize more
+    // calls after ConstantPropagation, which removes unreachable code, and
+    // TypePropagation, which can infer more accurate types after removing
+    // unreachable code.
+    INVOKE_PASS(ApplyICData);
+  }
+#endif
   INVOKE_PASS(WidenSmiToInt32);
   INVOKE_PASS(SelectRepresentations);
   INVOKE_PASS(CSE);
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 6cacf81..2499872 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -1303,10 +1303,8 @@
 }
 
 FlowGraph* BytecodeFlowGraphBuilder::BuildGraph() {
-  if (function().is_native()) {
-    // Use default flow graph builder for native methods.
-    return nullptr;
-  }
+  // Use default flow graph builder for native methods.
+  ASSERT(!function().is_native());
 
   const Code& bytecode = Code::Handle(Z, function().Bytecode());
 
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index bac50ed..ac4d998 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -10,6 +10,7 @@
 #include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/constants_kbc.h"
 #include "vm/dart_entry.h"
+#include "vm/longjump.h"
 #include "vm/object_store.h"
 #include "vm/timeline.h"
 
@@ -48,6 +49,15 @@
   AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
                               md_offset);
 
+  const int kHasExceptionsTableFlag = 1 << 0;
+  const int kHasNullableFieldsFlag = 1 << 1;
+  const int kHasClosuresFlag = 1 << 2;
+
+  const intptr_t flags = helper_->reader_.ReadUInt();
+  const bool has_exceptions_table = (flags & kHasExceptionsTableFlag) != 0;
+  const bool has_nullable_fields = (flags & kHasNullableFieldsFlag) != 0;
+  const bool has_closures = (flags & kHasClosuresFlag) != 0;
+
   // Create object pool and read pool entries.
   const intptr_t obj_count = helper_->reader_.ReadListLength();
   const ObjectPool& pool =
@@ -68,30 +78,51 @@
   function.AttachBytecode(bytecode);
 
   // Read exceptions table.
-  ReadExceptionsTable(bytecode);
+  ReadExceptionsTable(bytecode, has_exceptions_table);
 
   if (FLAG_dump_kernel_bytecode) {
     KernelBytecodeDisassembler::Disassemble(function);
   }
 
+  // Initialization of fields with null literal is elided from bytecode.
+  // Record the corresponding stores if field guards are enabled.
+  if (has_nullable_fields) {
+    ASSERT(function.IsGenerativeConstructor());
+    const intptr_t num_fields = helper_->ReadListLength();
+    if (I->use_field_guards()) {
+      Field& field = Field::Handle(helper_->zone_);
+      for (intptr_t i = 0; i < num_fields; i++) {
+        NameIndex name_index = helper_->ReadCanonicalNameReference();
+        field = H.LookupFieldByKernelField(name_index);
+        field.RecordStore(Object::null_object());
+      }
+    } else {
+      for (intptr_t i = 0; i < num_fields; i++) {
+        helper_->SkipCanonicalNameReference();
+      }
+    }
+  }
+
   // Read closures.
-  Function& closure = Function::Handle(helper_->zone_);
-  Code& closure_bytecode = Code::Handle(helper_->zone_);
-  intptr_t num_closures = helper_->ReadListLength();
-  for (intptr_t i = 0; i < num_closures; i++) {
-    intptr_t closure_index = helper_->ReadUInt();
-    ASSERT(closure_index < obj_count);
-    closure ^= pool.ObjectAt(closure_index);
+  if (has_closures) {
+    Function& closure = Function::Handle(helper_->zone_);
+    Code& closure_bytecode = Code::Handle(helper_->zone_);
+    const intptr_t num_closures = helper_->ReadListLength();
+    for (intptr_t i = 0; i < num_closures; i++) {
+      intptr_t closure_index = helper_->ReadUInt();
+      ASSERT(closure_index < obj_count);
+      closure ^= pool.ObjectAt(closure_index);
 
-    // Read closure bytecode and attach to closure function.
-    closure_bytecode = ReadBytecode(pool);
-    closure.AttachBytecode(closure_bytecode);
+      // Read closure bytecode and attach to closure function.
+      closure_bytecode = ReadBytecode(pool);
+      closure.AttachBytecode(closure_bytecode);
 
-    // Read closure exceptions table.
-    ReadExceptionsTable(closure_bytecode);
+      // Read closure exceptions table.
+      ReadExceptionsTable(closure_bytecode);
 
-    if (FLAG_dump_kernel_bytecode) {
-      KernelBytecodeDisassembler::Disassemble(closure);
+      if (FLAG_dump_kernel_bytecode) {
+        KernelBytecodeDisassembler::Disassemble(closure);
+      }
     }
   }
 }
@@ -579,13 +610,15 @@
                                 pool);
 }
 
-void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
+void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode,
+                                                 bool has_exceptions_table) {
 #if !defined(PRODUCT)
   TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
                             "BytecodeMetadataHelper::ReadExceptionsTable");
 #endif  // !defined(PRODUCT)
 
-  const intptr_t try_block_count = helper_->reader_.ReadListLength();
+  const intptr_t try_block_count =
+      has_exceptions_table ? helper_->reader_.ReadListLength() : 0;
   if (try_block_count > 0) {
     const ObjectPool& pool =
         ObjectPool::Handle(helper_->zone_, bytecode.object_pool());
@@ -711,6 +744,57 @@
   return NativeEntryData::New(kind, trampoline, native_function, argc_tag);
 }
 
+RawError* BytecodeReader::ReadFunctionBytecode(Thread* thread,
+                                               const Function& function) {
+  ASSERT(!FLAG_precompiled_mode);
+  ASSERT(!function.HasBytecode());
+  ASSERT(thread->sticky_error() == Error::null());
+
+  LongJumpScope jump;
+  if (setjmp(*jump.Set()) == 0) {
+    StackZone stack_zone(thread);
+    Zone* const zone = stack_zone.GetZone();
+    HANDLESCOPE(thread);
+    CompilerState compiler_state(thread);
+
+    const Script& script = Script::Handle(zone, function.script());
+    TranslationHelper translation_helper(thread);
+    translation_helper.InitFromScript(script);
+
+    KernelReaderHelper reader_helper(
+        zone, &translation_helper, script,
+        ExternalTypedData::Handle(zone, function.KernelData()),
+        function.KernelDataProgramOffset());
+    ActiveClass active_class;
+    TypeTranslator type_translator(&reader_helper, &active_class,
+                                   /* finalize= */ true);
+
+    BytecodeMetadataHelper bytecode_metadata_helper(
+        &reader_helper, &type_translator, &active_class);
+
+    // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
+    // e.g. for type translation.
+    const Class& klass = Class::Handle(zone, function.Owner());
+    Function& outermost_function =
+        Function::Handle(zone, function.GetOutermostFunction());
+
+    ActiveClassScope active_class_scope(&active_class, &klass);
+    ActiveMemberScope active_member(&active_class, &outermost_function);
+    ActiveTypeParametersScope active_type_params(&active_class, function, zone);
+
+    bytecode_metadata_helper.ReadMetadata(function);
+
+    return Error::null();
+  } else {
+    StackZone stack_zone(thread);
+    Error& error = Error::Handle();
+    // We got an error during bytecode reading.
+    error = thread->sticky_error();
+    thread->clear_sticky_error();
+    return error.raw();
+  }
+}
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index 769ad61..f422003 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -31,7 +31,8 @@
                            const ObjectPool& pool,
                            intptr_t from_index);
   RawCode* ReadBytecode(const ObjectPool& pool);
-  void ReadExceptionsTable(const Code& bytecode);
+  void ReadExceptionsTable(const Code& bytecode,
+                           bool has_exceptions_table = true);
   RawTypedData* NativeEntry(const Function& function,
                             const String& external_name);
 
@@ -41,6 +42,14 @@
   DISALLOW_COPY_AND_ASSIGN(BytecodeMetadataHelper);
 };
 
+class BytecodeReader : public AllStatic {
+ public:
+  // Reads bytecode for the given function and sets its bytecode field.
+  // Returns error (if any), or null.
+  static RawError* ReadFunctionBytecode(Thread* thread,
+                                        const Function& function);
+};
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index e8b948c..38a9a18 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -9,6 +9,7 @@
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For dart::FlowGraphBuilder::SimpleInstanceOfType.
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
+#include "vm/kernel.h"  // For IsFieldInitializer.
 #include "vm/object_store.h"
 #include "vm/stack_frame.h"
 
@@ -1908,44 +1909,18 @@
 
   SetOffset(kernel_offset);
 
-  if (FLAG_enable_interpreter || FLAG_use_bytecode_compiler) {
-    // TODO(regis): For now, we skip bytecode loading for functions that were
-    // synthesized and that do not have bytecode. Since they inherited the
-    // kernel offset of a concrete function, the wrong bytecode would be loaded.
-    switch (function.kind()) {
-      case RawFunction::kImplicitGetter:
-      case RawFunction::kImplicitSetter:
-      case RawFunction::kMethodExtractor:
-      case RawFunction::kNoSuchMethodDispatcher:
-      case RawFunction::kInvokeFieldDispatcher:
-      case RawFunction::kDynamicInvocationForwarder:
-      case RawFunction::kImplicitClosureFunction:
-        break;
-      case RawFunction::kImplicitStaticFinalGetter:
-        if (!IsFieldInitializer(function, Z)) {
-          break;
-        }
-        // Fallthrough.
-      default: {
-        // TODO(regis): Clean up this logic of when to compile.
-        // If the bytecode was previously loaded, we really want to compile.
-        if (!function.HasBytecode()) {
-          bytecode_metadata_helper_.ReadMetadata(function);
-        }
-        if (function.HasBytecode()) {
-          if (FLAG_use_bytecode_compiler) {
-            BytecodeFlowGraphBuilder bytecode_compiler(
-                flow_graph_builder_, parsed_function(),
-                &(flow_graph_builder_->ic_data_array_));
-            FlowGraph* flow_graph = bytecode_compiler.BuildGraph();
-            if (flow_graph != nullptr) {
-              return flow_graph;
-            }
-          } else {
-            return nullptr;
-          }
-        }
-      }
+  if ((FLAG_use_bytecode_compiler || FLAG_enable_interpreter) &&
+      function.IsBytecodeAllowed(Z) && !function.is_native()) {
+    if (!function.HasBytecode()) {
+      bytecode_metadata_helper_.ReadMetadata(function);
+    }
+    if (function.HasBytecode()) {
+      BytecodeFlowGraphBuilder bytecode_compiler(
+          flow_graph_builder_, parsed_function(),
+          &(flow_graph_builder_->ic_data_array_));
+      FlowGraph* flow_graph = bytecode_compiler.BuildGraph();
+      ASSERT(flow_graph != nullptr);
+      return flow_graph;
     }
   }
 
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index da11764..a6f15f9 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -5,6 +5,7 @@
 #include "vm/compiler/frontend/scope_builder.h"
 
 #include "vm/compiler/backend/il.h"  // For CompileType.
+#include "vm/kernel.h"               // For IsFieldInitializer.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -16,12 +17,6 @@
 #define T (type_translator_)
 #define I Isolate::Current()
 
-bool IsFieldInitializer(const Function& function, Zone* zone) {
-  return (function.kind() == RawFunction::kImplicitStaticFinalGetter) &&
-         String::Handle(zone, function.name())
-             .StartsWith(Symbols::InitPrefix());
-}
-
 // Returns true if the given method can skip type checks for all arguments
 // that are not covariant or generic covariant in its implementation.
 bool MethodCanSkipTypeChecksForNonCovariantArguments(
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
index 210c51b..12521be 100644
--- a/runtime/vm/compiler/frontend/scope_builder.h
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -228,8 +228,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScopeBuildingResult);
 };
 
-bool IsFieldInitializer(const Function& function, Zone* zone);
-
 // Returns true if the given method can skip type checks for all arguments
 // that are not covariant or generic covariant in its implementation.
 bool MethodCanSkipTypeChecksForNonCovariantArguments(
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 50ff623..40d64b8 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -24,6 +24,7 @@
 #include "vm/compiler/cha.h"
 #include "vm/compiler/compiler_pass.h"
 #include "vm/compiler/compiler_state.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/jit_call_specializer.h"
@@ -139,8 +140,7 @@
 
 bool UseKernelFrontEndFor(ParsedFunction* parsed_function) {
   const Function& function = parsed_function->function();
-  return (function.kernel_offset() > 0) ||
-         (FLAG_use_bytecode_compiler && function.HasBytecode()) ||
+  return (function.kernel_offset() > 0) || function.HasBytecode() ||
          (function.kind() == RawFunction::kNoSuchMethodDispatcher) ||
          (function.kind() == RawFunction::kInvokeFieldDispatcher);
 }
@@ -164,8 +164,7 @@
                                      /* not inlining */ NULL, optimized,
                                      osr_id);
     FlowGraph* graph = builder.BuildGraph();
-    ASSERT((graph != NULL) || (FLAG_enable_interpreter &&
-                               parsed_function->function().HasBytecode()));
+    ASSERT(graph != NULL);
     return graph;
   }
   FlowGraphBuilder builder(*parsed_function, *ic_data_array,
@@ -249,9 +248,28 @@
 //   Arg0: function object.
 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) {
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
-  ASSERT(!function.HasCode());
-  const Object& result =
-      Object::Handle(Compiler::CompileFunction(thread, function));
+  Object& result = Object::Handle(zone);
+
+  if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
+    if (!function.HasBytecode()) {
+      result = kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
+      if (!result.IsNull()) {
+        Exceptions::PropagateError(Error::Cast(result));
+      }
+    }
+    if (function.HasBytecode()) {
+      // If interpreter is enabled and there is bytecode, LazyCompile stub
+      // (which calls CompileFunction) should proceed to InterpretCall in order
+      // to enter interpreter. In such case, compilation is postponed and
+      // triggered by interpreter later via OptimizeInvokedFunction.
+      return;
+    }
+    // No bytecode, fall back to compilation.
+  } else {
+    ASSERT(!function.HasCode());
+  }
+
+  result = Compiler::CompileFunction(thread, function);
   if (result.IsError()) {
     if (result.IsLanguageError()) {
       Exceptions::ThrowCompileTimeError(LanguageError::Cast(result));
@@ -259,13 +277,6 @@
     }
     Exceptions::PropagateError(Error::Cast(result));
   }
-  // TODO(regis): Revisit.
-  if (FLAG_enable_interpreter && !function.HasCode() &&
-      function.HasBytecode()) {
-    // Function was not actually compiled, but its bytecode was loaded.
-    // Verify that InterpretCall stub code was installed.
-    ASSERT(function.CurrentCode() == StubCode::InterpretCall_entry()->code());
-  }
 }
 
 bool Compiler::CanOptimizeFunction(Thread* thread, const Function& function) {
@@ -830,12 +841,6 @@
             zone, parsed_function(), ic_data_array, osr_id(), optimized());
       }
 
-      // TODO(regis): Revisit.
-      if (FLAG_enable_interpreter && (flow_graph == NULL) &&
-          function.HasBytecode()) {
-        return Code::null();
-      }
-
       const bool print_flow_graph =
           (FLAG_print_flow_graph ||
            (optimized() && FLAG_print_flow_graph_optimized)) &&
@@ -1005,7 +1010,7 @@
     CompileParsedFunctionHelper helper(parsed_function, optimized, osr_id);
 
     if (Compiler::IsBackgroundCompilation()) {
-      ASSERT(optimized && function.is_background_optimizable());
+      ASSERT(function.is_background_optimizable());
       if (isolate->IsTopLevelParsing() ||
           (loading_invalidation_gen_at_start !=
            isolate->loading_invalidation_gen())) {
@@ -1019,58 +1024,54 @@
 
     const Code& result = Code::Handle(helper.Compile(pipeline));
 
-    // TODO(regis): Revisit.
-    if (FLAG_enable_interpreter && result.IsNull() && function.HasBytecode()) {
-      return Object::null();
-    }
-
     if (!result.IsNull()) {
       if (!optimized) {
         function.SetWasCompiled(true);
       }
     } else {
-      if (optimized) {
-        if (Compiler::IsBackgroundCompilation()) {
-          // Try again later, background compilation may abort because of
-          // state change during compilation.
-          if (FLAG_trace_compiler) {
-            THR_Print("Aborted background compilation: %s\n",
-                      function.ToFullyQualifiedCString());
-          }
-          {
-            // If it was a bailout, then disable optimization.
-            Error& error = Error::Handle();
-            // We got an error during compilation.
-            error = thread->sticky_error();
-            thread->clear_sticky_error();
-
-            if (error.raw() == Object::background_compilation_error().raw()) {
-              if (FLAG_trace_compiler) {
-                THR_Print(
-                    "--> disabling background optimizations for '%s' (will "
-                    "try to re-compile on isolate thread again)\n",
+      if (Compiler::IsBackgroundCompilation()) {
+        // Try again later, background compilation may abort because of
+        // state change during compilation.
+        if (FLAG_trace_compiler) {
+          THR_Print("Aborted background compilation: %s\n",
                     function.ToFullyQualifiedCString());
-              }
-
-              // Ensure we don't attempt to re-compile the function on the
-              // background compiler.
-              function.set_is_background_optimizable(false);
-
-              // Trigger another optimization soon on the main thread.
-              function.SetUsageCounter(FLAG_optimization_counter_threshold);
-            } else if ((error.IsLanguageError() &&
-                        LanguageError::Cast(error).kind() ==
-                            Report::kBailout) ||
-                       error.IsUnhandledException()) {
-              if (FLAG_trace_compiler) {
-                THR_Print("--> disabling optimizations for '%s'\n",
-                          function.ToFullyQualifiedCString());
-              }
-              function.SetIsOptimizable(false);
-            }
-          }
-          return Error::null();
         }
+        {
+          // If it was a bailout, then disable optimization.
+          Error& error = Error::Handle();
+          // We got an error during compilation.
+          error = thread->sticky_error();
+          thread->clear_sticky_error();
+
+          if (error.raw() == Object::background_compilation_error().raw()) {
+            if (FLAG_trace_compiler) {
+              THR_Print(
+                  "--> disabling background optimizations for '%s' (will "
+                  "try to re-compile on isolate thread again)\n",
+                  function.ToFullyQualifiedCString());
+            }
+
+            // Ensure we don't attempt to re-compile the function on the
+            // background compiler.
+            function.set_is_background_optimizable(false);
+
+            // Trigger another optimization soon on the main thread.
+            function.SetUsageCounter(optimized
+                                         ? FLAG_optimization_counter_threshold
+                                         : FLAG_compilation_counter_threshold);
+          } else if ((error.IsLanguageError() &&
+                      LanguageError::Cast(error).kind() == Report::kBailout) ||
+                     error.IsUnhandledException()) {
+            if (FLAG_trace_compiler) {
+              THR_Print("--> disabling optimizations for '%s'\n",
+                        function.ToFullyQualifiedCString());
+            }
+            function.SetIsOptimizable(false);
+          }
+        }
+        return Error::null();
+      }
+      if (optimized) {
         // Optimizer bailed out. Disable optimizations and never try again.
         if (trace_compiler) {
           THR_Print("--> disabling optimizations for '%s'\n",
@@ -1254,10 +1255,6 @@
 
 RawError* Compiler::EnsureUnoptimizedCode(Thread* thread,
                                           const Function& function) {
-  if (FLAG_enable_interpreter && function.HasBytecode()) {
-    // TODO(regis): This may not be sufficient when deoptimizing. Revisit then.
-    return Error::null();
-  }
   if (function.unoptimized_code() != Object::null()) {
     return Error::null();
   }
@@ -1273,9 +1270,6 @@
   if (result.IsError()) {
     return Error::Cast(result).raw();
   }
-  if (FLAG_enable_interpreter && function.HasBytecode()) {
-    return Error::null();
-  }
   // Since CompileFunctionHelper replaces the current code, re-attach the
   // the original code if the function was already compiled.
   if (!original_code.IsNull() && result.raw() == function.CurrentCode() &&
@@ -1303,9 +1297,14 @@
   } else {
     event_name = "CompileFunctionOptimized";
   }
+  // TODO(alexmarkov): Consider adding a separate event for unoptimized
+  // compilation triggered from interpreter
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
 #endif  // !defined(PRODUCT)
 
+  // If running with interpreter, do the unoptimized compilation first.
+  const bool optimized = !FLAG_enable_interpreter || function.WasCompiled();
+
   // If we are in the optimizing in the mutator/Dart thread, then
   // this is either an OSR compilation or background compilation is
   // not currently allowed.
@@ -1315,8 +1314,7 @@
          !function.is_background_optimizable());
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
-  return CompileFunctionHelper(pipeline, function, true, /* optimized */
-                               osr_id);
+  return CompileFunctionHelper(pipeline, function, optimized, osr_id);
 }
 
 // This is only used from unit tests.
@@ -1411,9 +1409,6 @@
     func ^= functions.At(i);
     ASSERT(!func.IsNull());
     if (!func.HasCode() &&
-        // TODO(regis): Revisit.
-        // Do not compile function if its bytecode is already loaded.
-        (!FLAG_enable_interpreter || !func.HasBytecode()) &&
         !func.is_abstract() && !func.IsRedirectingFactory()) {
       if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) &&
           func.HasOptionalParameters()) {
@@ -1424,10 +1419,35 @@
       if (result.IsError()) {
         return Error::Cast(result).raw();
       }
-      // TODO(regis): Revisit.
-      // The compiler may load bytecode and return Code::null().
-      ASSERT(!result.IsNull() ||
-             (FLAG_enable_interpreter && func.HasBytecode()));
+      ASSERT(!result.IsNull());
+    }
+  }
+  return Error::null();
+}
+
+RawError* Compiler::ReadAllBytecode(const Class& cls) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread));
+  ASSERT(error.IsNull());
+  Array& functions = Array::Handle(zone, cls.functions());
+  Function& func = Function::Handle(zone);
+  // Class dynamic lives in the vm isolate. Its array fields cannot be set to
+  // an empty array.
+  if (functions.IsNull()) {
+    ASSERT(cls.IsDynamicClass());
+    return Error::null();
+  }
+  // Compile all the regular functions.
+  for (int i = 0; i < functions.Length(); i++) {
+    func ^= functions.At(i);
+    ASSERT(!func.IsNull());
+    if (func.IsBytecodeAllowed(zone) && !func.HasBytecode()) {
+      RawError* error =
+          kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
+      if (error != Error::null()) {
+        return error;
+      }
     }
   }
   return Error::null();
@@ -1508,19 +1528,30 @@
         parsed_function = Parser::ParseStaticFieldInitializer(field);
         parsed_function->AllocateVariables();
       }
+      const Function& initializer = parsed_function->function();
+
+      if (FLAG_enable_interpreter) {
+        ASSERT(initializer.IsBytecodeAllowed(zone));
+        if (!initializer.HasBytecode()) {
+          RawError* error =
+              kernel::BytecodeReader::ReadFunctionBytecode(thread, initializer);
+          if (error != Error::null()) {
+            return error;
+          }
+        }
+        if (initializer.HasBytecode()) {
+          return DartEntry::InvokeFunction(initializer, Object::empty_array());
+        }
+      }
 
       // Non-optimized code generator.
       DartCompilationPipeline pipeline;
       CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId);
       const Code& code = Code::Handle(helper.Compile(&pipeline));
-      const Function& initializer = parsed_function->function();
 
       if (!code.IsNull()) {
-        code.set_var_descriptors(Object::empty_var_descriptors());
-        return DartEntry::InvokeFunction(initializer, Object::empty_array());
-      } else if (FLAG_enable_interpreter && initializer.HasBytecode()) {
-        // In case the initializer has bytecode, the compilation step above only
-        // loaded the bytecode without generating code.
+        NOT_IN_PRODUCT(
+            code.set_var_descriptors(Object::empty_var_descriptors()));
         return DartEntry::InvokeFunction(initializer, Object::empty_array());
       }
     }
@@ -1595,7 +1626,7 @@
     CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId);
     const Code& code = Code::Handle(helper.Compile(&pipeline));
     if (!code.IsNull()) {
-      code.set_var_descriptors(Object::empty_var_descriptors());
+      NOT_IN_PRODUCT(code.set_var_descriptors(Object::empty_var_descriptors()));
       const Object& result = PassiveObject::Handle(
           DartEntry::InvokeFunction(func, Object::empty_array()));
       return result.raw();
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index 1636109..5d5d3bd 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -112,6 +112,9 @@
                                          const Function& function);
 
   // Generates optimized code for function.
+  // If interpreter is used and function was not compiled yet, then
+  // generates unoptimized code (it's basically the first round of
+  // optimization).
   //
   // Returns the code object if compilation succeeds.  Returns an Error if
   // there is a compilation error.  If optimization fails, but there is no
@@ -151,6 +154,9 @@
   static RawError* CompileAllFunctions(const Class& cls);
   static RawError* ParseAllFunctions(const Class& cls);
 
+  // Eagerly read all bytecode.
+  static RawError* ReadAllBytecode(const Class& cls);
+
   // Notify the compiler that background (optimized) compilation has failed
   // because the mutator thread changed the state (e.g., deoptimization,
   // deferred loading). The background compilation may retry to compile
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 18bb9b2..dcc1ac8 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -94,7 +94,7 @@
   CHECK_OFFSET(Thread::stack_limit_offset(), 4);
   CHECK_OFFSET(Thread::object_null_offset(), 64);
   CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 14);
-  CHECK_OFFSET(Isolate::object_store_offset(), 28);
+  CHECK_OFFSET(Isolate::object_store_offset(), 20);
   NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 168));
 #endif
 #if defined(TARGET_ARCH_ARM64)
@@ -103,7 +103,7 @@
   CHECK_OFFSET(Thread::stack_limit_offset(), 8);
   CHECK_OFFSET(Thread::object_null_offset(), 112);
   CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 26);
-  CHECK_OFFSET(Isolate::object_store_offset(), 56);
+  CHECK_OFFSET(Isolate::object_store_offset(), 40);
   NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 288));
 #endif
 #undef CHECK_OFFSET
@@ -136,12 +136,6 @@
   }
 #endif
 
-  if (FLAG_use_bytecode_compiler) {
-    // Interpreter is not able to trigger compilation yet.
-    // TODO(alexmarkov): Revise
-    FLAG_enable_interpreter = false;
-  }
-
   if (FLAG_enable_interpreter) {
 #if defined(USING_SIMULATOR) || defined(TARGET_ARCH_DBC)
     return strdup(
@@ -494,6 +488,7 @@
   IdleNotifier::Cleanup();
 
   TargetCPUFeatures::Cleanup();
+  MarkingStack::ShutDown();
   StoreBuffer::ShutDown();
 
   // Delete the current thread's TLS and set it's TLS to null.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 717daf3..7a079a0 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6368,8 +6368,7 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-DART_EXPORT Dart_Handle
-Dart_Precompile(Dart_QualifiedFunctionName entry_points[]) {
+DART_EXPORT Dart_Handle Dart_Precompile() {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("AOT compilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
@@ -6388,7 +6387,7 @@
     return result;
   }
   CHECK_CALLBACK_STATE(T);
-  const Error& error = Error::Handle(Precompiler::CompileAll(entry_points));
+  const Error& error = Error::Handle(Precompiler::CompileAll());
   if (!error.IsNull()) {
     return Api::NewHandle(T, error.raw());
   }
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index a49749d..5708a0d 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -6,6 +6,7 @@
 
 #include "platform/safe_stack.h"
 #include "vm/class_finalizer.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/debugger.h"
 #include "vm/heap/safepoint.h"
@@ -130,29 +131,35 @@
   ScopedIsolateStackLimits stack_limit(thread, current_sp);
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (!function.HasCode()) {
-    // There's no native code. If we're not using the interpreter, then we
-    // compile to native code. If we are using the interpreter, but there's no
-    // native code and no bytecode, then we invoke the compiler to extract the
-    // bytecode.
-    if (!FLAG_enable_interpreter || !function.HasBytecode()) {
-      const Object& result =
-          Object::Handle(zone, Compiler::CompileFunction(thread, function));
-      if (result.IsError()) {
-        return Error::Cast(result).raw();
+    if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
+      if (!function.HasBytecode()) {
+        RawError* error =
+            kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
+        if (error != Error::null()) {
+          return error;
+        }
       }
+
+      // If we have bytecode but no native code then invoke the interpreter.
+      if (function.HasBytecode()) {
+        ASSERT(thread->no_callback_scope_depth() == 0);
+        SuspendLongJumpScope suspend_long_jump_scope(thread);
+        TransitionToGenerated transition(thread);
+        return Interpreter::Current()->Call(function, arguments_descriptor,
+                                            arguments, thread);
+      }
+
+      // No bytecode, fall back to compilation.
     }
 
-    // At this point we should have either native code or bytecode.
-    ASSERT(function.HasCode() || function.HasBytecode());
-
-    // If we have bytecode but no native code then invoke the interpreter.
-    if (!function.HasCode() && function.HasBytecode()) {
-      ASSERT(thread->no_callback_scope_depth() == 0);
-      SuspendLongJumpScope suspend_long_jump_scope(thread);
-      TransitionToGenerated transition(thread);
-      return Interpreter::Current()->Call(function, arguments_descriptor,
-                                          arguments, thread);
+    const Object& result =
+        Object::Handle(zone, Compiler::CompileFunction(thread, function));
+    if (result.IsError()) {
+      return Error::Cast(result).raw();
     }
+
+    // At this point we should have native code.
+    ASSERT(function.HasCode());
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 30f52a8..6827707 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -319,6 +319,8 @@
   // Extract the function and the code from the asynchronous activation.
   function_ = async_activation.function();
 #if !defined(DART_PRECOMPILED_RUNTIME)
+  // TODO(regis): Revise debugger functionality when running a mix of
+  // interpreted and compiled code.
   if (!FLAG_enable_interpreter || !function_.HasBytecode()) {
     function_.EnsureHasCompiledUnoptimizedCode();
   }
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index 8b2b14c..7ab10b9 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -484,7 +484,7 @@
   Print(".Llineheader_start:\n");
 
   u1(1);   // 4. minimum_instruction_length
-  u1(0);   // 5. default_is_stmt
+  u1(1);   // 5. default_is_stmt (true for compatibility with dsymutil).
   u1(0);   // 6. line_base
   u1(1);   // 7. line_range
   u1(13);  // 8. opcode_base (12 standard opcodes in Dwarf 2)
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 8ce163e..61e06aa 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -65,6 +65,9 @@
     "Collects all dynamic function names to identify unique targets")          \
   P(compactor_tasks, int, 2,                                                   \
     "The number of tasks to use for parallel compaction.")                     \
+  P(compilation_counter_threshold, int, 10,                                    \
+    "Function's usage-counter value before interpreted function is compiled, " \
+    "-1 means never")                                                          \
   P(concurrent_sweep, bool, USING_MULTICORE,                                   \
     "Concurrent sweep for old generation.")                                    \
   R(dedup_instructions, true, bool, false,                                     \
@@ -114,7 +117,7 @@
     "Load deferred libraries eagerly.")                                        \
   R(log_marker_tasks, false, bool, false,                                      \
     "Log debugging information for old gen GC marking tasks.")                 \
-  R(marker_tasks, USING_MULTICORE ? 2 : 0, int, USING_MULTICORE ? 2 : 0,       \
+  P(marker_tasks, int, USING_MULTICORE ? 2 : 0,                                \
     "The number of tasks to spawn during old gen GC marking (0 means "         \
     "perform all marking on main thread).")                                    \
   P(max_polymorphic_checks, int, 4,                                            \
@@ -138,9 +141,6 @@
   P(polymorphic_with_deopt, bool, true,                                        \
     "Polymorphic calls with deoptimization / megamorphic call")                \
   P(precompiled_mode, bool, false, "Precompilation compiler mode")             \
-  P(print_precompiler_entry_points, charp, NULL,                               \
-    "Print entry points and info about recognized methods used by "            \
-    "precompiler.")                                                            \
   P(print_snapshot_sizes, bool, false, "Print sizes of generated snapshots.")  \
   P(print_snapshot_sizes_verbose, bool, false,                                 \
     "Print cluster sizes of generated snapshots.")                             \
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index 59bf1ff..8dfad74 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -277,8 +277,8 @@
   Heap* heap = isolate->heap();
 
   // Clear the store buffer; will be rebuilt as we forward the heap.
-  isolate->PrepareForGC();  // Have all threads flush their store buffers.
-  isolate->store_buffer()->Reset();  // Drop all store buffers.
+  isolate->ReleaseStoreBuffers();
+  isolate->store_buffer()->Reset();
 
   ForwardPointersVisitor pointer_visitor(thread);
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 2b319e2..7e8072c 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -204,15 +204,25 @@
       old_space_(heap_->old_space()),
       writable_(writable) {
   {
-    // It's not yet safe to iterate over a paged space while it's concurrently
-    // sweeping, so wait for any such task to complete first.
+    // It's not safe to iterate over old space when concurrent marking or
+    // sweeping is in progress, or another thread is iterating the heap, so wait
+    // for any such task to complete first.
     MonitorLocker ml(old_space_->tasks_lock());
 #if defined(DEBUG)
     // We currently don't support nesting of HeapIterationScopes.
     ASSERT(old_space_->iterating_thread_ != thread);
 #endif
-    while (old_space_->tasks() > 0) {
-      ml.WaitWithSafepointCheck(thread);
+    while ((old_space_->tasks() > 0) ||
+           (old_space_->phase() != PageSpace::kDone)) {
+      if (old_space_->phase() == PageSpace::kAwaitingFinalization) {
+        ml.Exit();
+        heap_->CollectOldSpaceGarbage(thread, Heap::kMarkSweep,
+                                      Heap::kFinalize);
+        ml.Enter();
+      }
+      while (old_space_->tasks() > 0) {
+        ml.WaitWithSafepointCheck(thread);
+      }
     }
 #if defined(DEBUG)
     ASSERT(old_space_->iterating_thread_ == NULL);
@@ -407,8 +417,12 @@
       NOT_IN_PRODUCT(PrintStatsToTimeline(&tds, reason));
       EndNewSpaceGC();
     }
-    if ((reason == kNewSpace) && old_space_.NeedsGarbageCollection()) {
-      CollectOldSpaceGarbage(thread, kMarkSweep, kPromotion);
+    if (reason == kNewSpace) {
+      if (old_space_.NeedsGarbageCollection()) {
+        CollectOldSpaceGarbage(thread, kMarkSweep, kPromotion);
+      } else {
+        CheckStartConcurrentMarking(thread, kPromotion);
+      }
     }
   }
 }
@@ -425,7 +439,7 @@
     RecordBeforeGC(type, reason);
     VMTagScope tagScope(thread, VMTag::kGCOldSpaceTagId);
     TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "CollectOldGeneration");
-    old_space_.CollectGarbage(type == kMarkCompact);
+    old_space_.CollectGarbage(type == kMarkCompact, true /* finish */);
     RecordAfterGC(type);
     PrintStats();
     NOT_IN_PRODUCT(PrintStatsToTimeline(&tds, reason));
@@ -477,6 +491,49 @@
       thread, reason == kLowMemory ? kMarkCompact : kMarkSweep, reason);
 }
 
+void Heap::CheckStartConcurrentMarking(Thread* thread, GCReason reason) {
+  {
+    MonitorLocker ml(old_space_.tasks_lock());
+    if (old_space_.phase() != PageSpace::kDone) {
+      return;  // Busy.
+    }
+  }
+
+  if (old_space_.AlmostNeedsGarbageCollection()) {
+    if (BeginOldSpaceGC(thread)) {
+      TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "StartConcurrentMarking");
+      old_space_.CollectGarbage(kMarkSweep, false /* finish */);
+      EndOldSpaceGC();
+    }
+  }
+}
+
+void Heap::CheckFinishConcurrentMarking(Thread* thread) {
+  bool ready;
+  {
+    MonitorLocker ml(old_space_.tasks_lock());
+    ready = old_space_.phase() == PageSpace::kAwaitingFinalization;
+  }
+  if (ready) {
+    CollectOldSpaceGarbage(thread, Heap::kMarkSweep, Heap::kFinalize);
+  }
+}
+
+void Heap::WaitForMarkerTasks(Thread* thread) {
+  MonitorLocker ml(old_space_.tasks_lock());
+  while ((old_space_.phase() == PageSpace::kMarking) ||
+         (old_space_.phase() == PageSpace::kAwaitingFinalization)) {
+    while (old_space_.phase() == PageSpace::kMarking) {
+      ml.WaitWithSafepointCheck(thread);
+    }
+    if (old_space_.phase() == PageSpace::kAwaitingFinalization) {
+      ml.Exit();
+      CollectOldSpaceGarbage(thread, Heap::kMarkSweep, Heap::kFinalize);
+      ml.Enter();
+    }
+  }
+}
+
 void Heap::WaitForSweeperTasks(Thread* thread) {
   MonitorLocker ml(old_space_.tasks_lock());
   while (old_space_.tasks() > 0) {
@@ -656,6 +713,8 @@
       return "promotion";
     case kOldSpace:
       return "old space";
+    case kFinalize:
+      return "finalize";
     case kFull:
       return "full";
     case kExternal:
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 7f2689d..d2d90dd 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -51,6 +51,7 @@
     kNewSpace,   // New space is full.
     kPromotion,  // Old space limit crossed after a scavenge.
     kOldSpace,   // Old space limit crossed.
+    kFinalize,   // Concurrent marking finished.
     kFull,       // Heap::CollectAllGarbage
     kExternal,   // Dart_NewWeakPersistentHandle
     kIdle,       // Dart_NotifyIdle
@@ -132,6 +133,10 @@
   bool NeedsGarbageCollection() const {
     return old_space_.NeedsGarbageCollection();
   }
+
+  void CheckStartConcurrentMarking(Thread* thread, GCReason reason);
+  void CheckFinishConcurrentMarking(Thread* thread);
+  void WaitForMarkerTasks(Thread* thread);
   void WaitForSweeperTasks(Thread* thread);
 
   // Enables growth control on the page space heaps.  This should be
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index c332320..ad51e2f 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -382,21 +382,30 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  old.SetAt(0, neu);
-  old = Array::null();
-  neu = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    old.SetAt(0, neu);
+    old = Array::null();
+    neu = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  EXPECT(size_before == size_after);
+  EXPECT_EQ(size_before, size_after);
 }
 
 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadNewToOld) {
@@ -404,21 +413,30 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  neu.SetAt(0, old);
-  old = Array::null();
-  neu = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    neu.SetAt(0, old);
+    old = Array::null();
+    neu = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  EXPECT(size_before == size_after);
+  EXPECT_EQ(size_before, size_after);
 }
 
 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadGenCycle) {
@@ -426,22 +444,31 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  neu.SetAt(0, old);
-  old.SetAt(0, neu);
-  old = Array::null();
-  neu = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    neu.SetAt(0, old);
+    old.SetAt(0, neu);
+    old = Array::null();
+    neu = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  EXPECT(size_before == size_after);
+  EXPECT_EQ(size_before, size_after);
 }
 
 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOld) {
@@ -449,15 +476,24 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  neu.SetAt(0, old);
-  old = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    neu.SetAt(0, old);
+    old = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
@@ -470,15 +506,24 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  old.SetAt(0, neu);
-  neu = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    old.SetAt(0, neu);
+    neu = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
@@ -491,15 +536,24 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  neu = Array::null();
-  old.SetAt(0, old);
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    neu = Array::null();
+    old.SetAt(0, old);
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
@@ -512,15 +566,24 @@
   Heap* heap = isolate->heap();
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  old = Array::null();
-  neu.SetAt(0, neu);
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    old = Array::null();
+    neu.SetAt(0, neu);
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
+  heap->WaitForMarkerTasks(thread);  // Finalize marking to get live size.
 
   intptr_t size_after =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
@@ -536,13 +599,20 @@
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& old2 = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  old.SetAt(0, old2);
-  neu.SetAt(0, old);
-  old = Array::null();
-  old2 = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& old2 = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    old.SetAt(0, old2);
+    neu.SetAt(0, old);
+    old = Array::null();
+    old2 = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
 
@@ -560,13 +630,20 @@
   intptr_t size_before =
       heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
 
-  Array& old = Array::Handle(Array::New(1, Heap::kOld));
-  Array& neu = Array::Handle(Array::New(1, Heap::kNew));
-  Array& neu2 = Array::Handle(Array::New(1, Heap::kOld));
-  neu.SetAt(0, neu2);
-  old.SetAt(0, neu);
-  neu = Array::null();
-  neu2 = Array::null();
+  {
+    // Prevent allocation from starting marking, otherwise the incremental write
+    // barrier will keep these objects live.
+    NoHeapGrowthControlScope force_growth;
+    EXPECT(!thread->is_marking());
+    Array& old = Array::Handle(Array::New(1, Heap::kOld));
+    Array& neu = Array::Handle(Array::New(1, Heap::kNew));
+    Array& neu2 = Array::Handle(Array::New(1, Heap::kOld));
+    neu.SetAt(0, neu2);
+    old.SetAt(0, neu);
+    neu = Array::null();
+    neu2 = Array::null();
+    EXPECT(!thread->is_marking());
+  }
 
   heap->CollectAllGarbage();
 
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 44012b8..fed194b 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -21,16 +21,29 @@
 
 namespace dart {
 
-class SkippedCodeFunctions : public ZoneAllocated {
+// Collects a list of RawFunction whose code_ or unoptimized_code_ slots were
+// treated as weak (not visited) during marking because they had low usage.
+// These slots (and the corresponding entry_point_ caches) must be cleared after
+// marking if the target RawCode were not otherwise marked. (--collect-code)
+class SkippedCodeFunctions {
  public:
   SkippedCodeFunctions() {}
 
-  void Add(RawFunction* func) { skipped_code_functions_.Add(func); }
+  void Add(RawFunction* func) {
+    // With concurrent mark, we hold raw pointers across safepoints.
+    ASSERT(func->IsOldObject());
+
+    skipped_code_functions_.Add(func);
+  }
 
   void DetachCode() {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
+    Thread* thread = Thread::Current();
+    StackZone zone(thread);  // For log prints.
+    HANDLESCOPE(thread);
+
     intptr_t unoptimized_code_count = 0;
     intptr_t current_code_count = 0;
     for (int i = 0; i < skipped_code_functions_.length(); i++) {
@@ -81,7 +94,7 @@
   }
 
  private:
-  GrowableArray<RawFunction*> skipped_code_functions_;
+  MallocGrowableArray<RawFunction*> skipped_code_functions_;
 
   DISALLOW_COPY_AND_ASSIGN(SkippedCodeFunctions);
 };
@@ -110,6 +123,8 @@
       }
       marking_stack_->PushBlock(work_);
       work_ = new_work;
+      // Generated code appends to marking stacks; tell MemorySanitizer.
+      MSAN_UNPOISON(work_, sizeof(*work_));
     }
     return work_->Pop();
   }
@@ -132,6 +147,12 @@
     marking_stack_ = NULL;
   }
 
+  void AbandonWork() {
+    marking_stack_->PushBlock(work_);
+    work_ = NULL;
+    marking_stack_ = NULL;
+  }
+
  private:
   MarkingStack::Block* work_;
   MarkingStack* marking_stack_;
@@ -147,26 +168,36 @@
       : ObjectPointerVisitor(isolate),
         thread_(Thread::Current()),
 #ifndef PRODUCT
-        class_stats_count_(isolate->class_table()->NumCids()),
-        class_stats_size_(isolate->class_table()->NumCids()),
+        num_classes_(isolate->class_table()->Capacity()),
+        class_stats_count_(new intptr_t[num_classes_]),
+        class_stats_size_(new intptr_t[num_classes_]),
 #endif  // !PRODUCT
         page_space_(page_space),
         work_list_(marking_stack),
         delayed_weak_properties_(NULL),
         skipped_code_functions_(skipped_code_functions),
-        marked_bytes_(0) {
+        marked_bytes_(0),
+        marked_micros_(0) {
     ASSERT(thread_->isolate() == isolate);
 #ifndef PRODUCT
-    class_stats_count_.SetLength(isolate->class_table()->NumCids());
-    class_stats_size_.SetLength(isolate->class_table()->NumCids());
-    for (intptr_t i = 0; i < class_stats_count_.length(); ++i) {
+    for (intptr_t i = 0; i < num_classes_; i++) {
       class_stats_count_[i] = 0;
       class_stats_size_[i] = 0;
     }
 #endif  // !PRODUCT
   }
 
+  ~MarkingVisitorBase() {
+    delete skipped_code_functions_;
+#ifndef PRODUCT
+    delete[] class_stats_count_;
+    delete[] class_stats_size_;
+#endif  // !PRODUCT
+  }
+
   uintptr_t marked_bytes() const { return marked_bytes_; }
+  int64_t marked_micros() const { return marked_micros_; }
+  void AddMicros(int64_t micros) { marked_micros_ += micros; }
 
 #ifndef PRODUCT
   intptr_t live_count(intptr_t class_id) {
@@ -298,12 +329,12 @@
     }
   }
 
+  void AbandonWork() { work_list_.AbandonWork(); }
+
  private:
   void PushMarked(RawObject* raw_obj) {
     ASSERT(raw_obj->IsHeapObject());
-    ASSERT((FLAG_verify_gc_contains)
-               ? page_space_->Contains(RawObject::ToAddr(raw_obj))
-               : true);
+    ASSERT(raw_obj->IsOldObject());
 
     // Push the marked object on the marking stack.
     ASSERT(raw_obj->IsMarked());
@@ -312,8 +343,9 @@
 
   static bool TryAcquireMarkBit(RawObject* raw_obj) {
     // While it might seem this is redundant with TryAcquireMarkBit, we must
-    // do this check first to avoid attempting an AMO on the read-only
-    // vm-isolate or image pages.
+    // do this check first to avoid attempting an atomic::fetch_and on the
+    // read-only vm-isolate or image pages, which can fault even if there is no
+    // change in the value.
     if (raw_obj->IsMarked()) return false;
 
     if (!sync) {
@@ -330,6 +362,8 @@
       return;
     }
 
+    ASSERT(raw_obj->GetClassId() != kFreeListElement);
+
     if (!TryAcquireMarkBit(raw_obj)) {
       // Already marked.
       return;
@@ -340,8 +374,7 @@
 
 #ifndef PRODUCT
   void UpdateLiveOld(intptr_t class_id, intptr_t size) {
-    // TODO(koda): Support growing the array once mutator runs concurrently.
-    ASSERT(class_id < class_stats_count_.length());
+    ASSERT(class_id < num_classes_);
     class_stats_count_[class_id] += 1;
     class_stats_size_[class_id] += size;
   }
@@ -349,14 +382,16 @@
 
   Thread* thread_;
 #ifndef PRODUCT
-  GrowableArray<intptr_t> class_stats_count_;
-  GrowableArray<intptr_t> class_stats_size_;
+  intptr_t num_classes_;
+  intptr_t* class_stats_count_;
+  intptr_t* class_stats_size_;
 #endif  // !PRODUCT
   PageSpace* page_space_;
   MarkerWorkList work_list_;
   RawWeakProperty* delayed_weak_properties_;
   SkippedCodeFunctions* skipped_code_functions_;
   uintptr_t marked_bytes_;
+  int64_t marked_micros_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitorBase);
 };
@@ -407,13 +442,13 @@
   DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor);
 };
 
-void GCMarker::Prologue(Isolate* isolate) {
-  isolate->PrepareForGC();
+void GCMarker::Prologue() {
+  isolate_->ReleaseStoreBuffers();
 }
 
-void GCMarker::Epilogue(Isolate* isolate) {
+void GCMarker::Epilogue() {
   // Filter collected objects from the remembered set.
-  StoreBuffer* store_buffer = isolate->store_buffer();
+  StoreBuffer* store_buffer = isolate_->store_buffer();
   StoreBufferBlock* reading = store_buffer->Blocks();
   StoreBufferBlock* writing = store_buffer->PopNonFullBlock();
   while (reading != NULL) {
@@ -440,15 +475,14 @@
   store_buffer->PushBlock(writing, StoreBuffer::kIgnoreThreshold);
 }
 
-void GCMarker::IterateRoots(Isolate* isolate,
-                            ObjectPointerVisitor* visitor,
+void GCMarker::IterateRoots(ObjectPointerVisitor* visitor,
                             intptr_t slice_index,
                             intptr_t num_slices) {
   ASSERT(0 <= slice_index && slice_index < num_slices);
   if ((slice_index == 0) || (num_slices <= 1)) {
     TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ProcessRoots");
-    isolate->VisitObjectPointers(visitor,
-                                 ValidationPolicy::kDontValidateFrames);
+    isolate_->VisitObjectPointers(visitor,
+                                  ValidationPolicy::kDontValidateFrames);
   }
   if ((slice_index == 1) || (num_slices <= 1)) {
     TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ProcessNewSpace");
@@ -459,10 +493,10 @@
   // slices are empty.
 }
 
-void GCMarker::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) {
-  ApiState* state = isolate->api_state();
+void GCMarker::IterateWeakRoots(HandleVisitor* visitor) {
+  ApiState* state = isolate_->api_state();
   ASSERT(state != NULL);
-  isolate->VisitWeakPersistentHandles(visitor);
+  isolate_->VisitWeakPersistentHandles(visitor);
 }
 
 void GCMarker::ProcessWeakTables(PageSpace* page_space) {
@@ -499,13 +533,13 @@
   }
 };
 
-void GCMarker::ProcessObjectIdTable(Isolate* isolate) {
+void GCMarker::ProcessObjectIdTable() {
 #ifndef PRODUCT
   if (!FLAG_support_service) {
     return;
   }
-  ObjectIdRingClearPointerVisitor visitor(isolate);
-  ObjectIdRing* ring = isolate->object_id_ring();
+  ObjectIdRingClearPointerVisitor visitor(isolate_);
+  ObjectIdRing* ring = isolate_->object_id_ring();
   ASSERT(ring != NULL);
   ring->VisitPointers(&visitor);
 #endif  // !PRODUCT
@@ -515,21 +549,17 @@
  public:
   MarkTask(GCMarker* marker,
            Isolate* isolate,
-           Heap* heap,
-           PageSpace* page_space,
            MarkingStack* marking_stack,
            ThreadBarrier* barrier,
-           bool collect_code,
+           SyncMarkingVisitor* visitor,
            intptr_t task_index,
            intptr_t num_tasks,
            uintptr_t* num_busy)
       : marker_(marker),
         isolate_(isolate),
-        heap_(heap),
-        page_space_(page_space),
         marking_stack_(marking_stack),
         barrier_(barrier),
-        collect_code_(collect_code),
+        visitor_(visitor),
         task_index_(task_index),
         num_tasks_(num_tasks),
         num_busy_(num_busy) {}
@@ -539,21 +569,16 @@
         Thread::EnterIsolateAsHelper(isolate_, Thread::kMarkerTask, true);
     ASSERT(result);
     {
-      Thread* thread = Thread::Current();
-      TIMELINE_FUNCTION_GC_DURATION(thread, "MarkTask");
-      StackZone stack_zone(thread);
-      Zone* zone = stack_zone.GetZone();
-      SkippedCodeFunctions* skipped_code_functions =
-          collect_code_ ? new (zone) SkippedCodeFunctions() : NULL;
-      SyncMarkingVisitor visitor(isolate_, page_space_, marking_stack_,
-                                 skipped_code_functions);
+      TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "MarkTask");
+      int64_t start = OS::GetCurrentMonotonicMicros();
+
       // Phase 1: Iterate over roots and drain marking stack in tasks.
-      marker_->IterateRoots(isolate_, &visitor, task_index_, num_tasks_);
+      marker_->IterateRoots(visitor_, task_index_, num_tasks_);
 
       bool more_to_mark = false;
       do {
         do {
-          visitor.DrainMarkingStack();
+          visitor_->DrainMarkingStack();
 
           // I can't find more work right now. If no other task is busy,
           // then there will never be more work (NB: 1 is *before* decrement).
@@ -583,7 +608,7 @@
 #endif
         // Check if we have any pending properties with marked keys.
         // Those might have been marked by another marker.
-        more_to_mark = visitor.ProcessPendingWeakProperties();
+        more_to_mark = visitor_->ProcessPendingWeakProperties();
         if (more_to_mark) {
           // We have more work to do. Notify others.
           AtomicOperations::FetchAndIncrement(num_busy_);
@@ -607,11 +632,16 @@
       barrier_->Sync();
 
       // Phase 3: Finalize results from all markers (detach code, etc.).
+      int64_t stop = OS::GetCurrentMonotonicMicros();
+      visitor_->AddMicros(stop - start);
       if (FLAG_log_marker_tasks) {
-        THR_Print("Task %" Pd " marked %" Pd " bytes.\n", task_index_,
-                  visitor.marked_bytes());
+        THR_Print("Task %" Pd " marked %" Pd " bytes in %" Pd64 " micros.\n",
+                  task_index_, visitor_->marked_bytes(),
+                  visitor_->marked_micros());
       }
-      marker_->FinalizeResultsFrom(&visitor);
+      marker_->FinalizeResultsFrom(visitor_);
+
+      delete visitor_;
     }
     Thread::ExitIsolateAsHelper(true);
 
@@ -622,11 +652,9 @@
  private:
   GCMarker* marker_;
   Isolate* isolate_;
-  Heap* heap_;
-  PageSpace* page_space_;
   MarkingStack* marking_stack_;
   ThreadBarrier* barrier_;
-  bool collect_code_;
+  SyncMarkingVisitor* visitor_;
   const intptr_t task_index_;
   const intptr_t num_tasks_;
   uintptr_t* num_busy_;
@@ -634,11 +662,91 @@
   DISALLOW_COPY_AND_ASSIGN(MarkTask);
 };
 
+class ConcurrentMarkTask : public ThreadPool::Task {
+ public:
+  ConcurrentMarkTask(GCMarker* marker,
+                     Isolate* isolate,
+                     PageSpace* page_space,
+                     SyncMarkingVisitor* visitor,
+                     intptr_t task_index,
+                     intptr_t num_tasks,
+                     Monitor* roots_monitor,
+                     intptr_t* root_tasks_remaining)
+      : marker_(marker),
+        isolate_(isolate),
+        page_space_(page_space),
+        visitor_(visitor),
+        task_index_(task_index),
+        num_tasks_(num_tasks),
+        roots_monitor_(roots_monitor),
+        root_tasks_remaining_(root_tasks_remaining) {
+#if defined(DEBUG)
+    MonitorLocker ml(page_space_->tasks_lock());
+    ASSERT(page_space_->phase() == PageSpace::kMarking);
+#endif
+  }
+
+  virtual void Run() {
+    bool result =
+        Thread::EnterIsolateAsHelper(isolate_, Thread::kMarkerTask, true);
+    ASSERT(result);
+    {
+      TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ConcurrentMarkTask");
+      int64_t start = OS::GetCurrentMonotonicMicros();
+
+      marker_->IterateRoots(visitor_, task_index_, num_tasks_);
+      {
+        MonitorLocker ml(roots_monitor_);
+        (*root_tasks_remaining_)--;
+        ml.Notify();
+      }
+
+      visitor_->DrainMarkingStack();
+      int64_t stop = OS::GetCurrentMonotonicMicros();
+      visitor_->AddMicros(stop - start);
+      if (FLAG_log_marker_tasks) {
+        THR_Print("Task %" Pd " marked %" Pd " bytes in %" Pd64 " micros.\n",
+                  task_index_, visitor_->marked_bytes(),
+                  visitor_->marked_micros());
+      }
+    }
+
+    isolate_->ScheduleInterrupts(Thread::kVMInterrupt);
+    // Exit isolate cleanly *before* notifying it, to avoid shutdown race.
+    Thread::ExitIsolateAsHelper(true);
+    // This marker task is done. Notify the original isolate.
+    {
+      MonitorLocker ml(page_space_->tasks_lock());
+      page_space_->set_tasks(page_space_->tasks() - 1);
+      page_space_->set_concurrent_marker_tasks(
+          page_space_->concurrent_marker_tasks() - 1);
+      ASSERT(page_space_->phase() == PageSpace::kMarking);
+      if (page_space_->concurrent_marker_tasks() == 0) {
+        page_space_->set_phase(PageSpace::kAwaitingFinalization);
+      }
+      ml.NotifyAll();
+    }
+  }
+
+ private:
+  GCMarker* marker_;
+  Isolate* isolate_;
+  PageSpace* page_space_;
+  SyncMarkingVisitor* visitor_;
+  const intptr_t task_index_;
+  const intptr_t num_tasks_;
+  Monitor* const roots_monitor_;
+  intptr_t* root_tasks_remaining_;
+
+  DISALLOW_COPY_AND_ASSIGN(ConcurrentMarkTask);
+};
+
 template <class MarkingVisitorType>
 void GCMarker::FinalizeResultsFrom(MarkingVisitorType* visitor) {
   {
     MutexLocker ml(&stats_mutex_);
     marked_bytes_ += visitor->marked_bytes();
+    marked_micros_ += visitor->marked_micros();
 #ifndef PRODUCT
     // Class heap stats are not themselves thread-safe yet, so we update the
     // stats while holding stats_mutex_.
@@ -655,34 +763,116 @@
   visitor->Finalize();
 }
 
-void GCMarker::MarkObjects(Isolate* isolate,
-                           PageSpace* page_space,
-                           bool collect_code) {
-  Prologue(isolate);
-  // The API prologue/epilogue may create/destroy zones, so we must not
-  // depend on zone allocations surviving beyond the epilogue callback.
+intptr_t GCMarker::MarkedWordsPerMicro() const {
+  intptr_t marked_words_per_job_micro;
+  if (marked_micros_ == 0) {
+    marked_words_per_job_micro = marked_words();  // Prevent division by zero.
+  } else {
+    marked_words_per_job_micro = marked_words() / marked_micros_;
+  }
+  if (marked_words_per_job_micro == 0) {
+    marked_words_per_job_micro = 1;  // Prevent division by zero.
+  }
+  intptr_t jobs = FLAG_marker_tasks;
+  if (jobs == 0) {
+    jobs = 1;  // Marking on main thread is still one job.
+  }
+  return marked_words_per_job_micro * jobs;
+}
+
+GCMarker::GCMarker(Isolate* isolate, Heap* heap)
+    : isolate_(isolate),
+      heap_(heap),
+      marking_stack_(),
+      visitors_(),
+      marked_bytes_(0),
+      marked_micros_(0) {
+  visitors_ = new SyncMarkingVisitor*[FLAG_marker_tasks];
+  for (intptr_t i = 0; i < FLAG_marker_tasks; i++) {
+    visitors_[i] = NULL;
+  }
+}
+
+GCMarker::~GCMarker() {
+  // Cleanup in case isolate shutdown happens after starting the concurrent
+  // marker and before finalizing.
+  if (isolate_->marking_stack() != NULL) {
+    isolate_->DisableIncrementalBarrier();
+    for (intptr_t i = 0; i < FLAG_marker_tasks; i++) {
+      visitors_[i]->AbandonWork();
+      delete visitors_[i];
+    }
+  }
+  delete[] visitors_;
+}
+
+void GCMarker::StartConcurrentMark(PageSpace* page_space, bool collect_code) {
+  isolate_->EnableIncrementalBarrier(&marking_stack_);
+
+  const intptr_t num_tasks = FLAG_marker_tasks;
+
+  {
+    // Bulk increase task count before starting any task, instead of
+    // incrementing as each task is started, to prevent a task which
+    // races ahead from falsly beleiving it was the last task to complete.
+    MonitorLocker ml(page_space->tasks_lock());
+    ASSERT(page_space->phase() == PageSpace::kDone);
+    page_space->set_phase(PageSpace::kMarking);
+    page_space->set_tasks(page_space->tasks() + num_tasks);
+    page_space->set_concurrent_marker_tasks(
+        page_space->concurrent_marker_tasks() + num_tasks);
+  }
+
+  Monitor roots_monitor;
+  intptr_t root_tasks_remaining = num_tasks;
+  for (intptr_t i = 0; i < num_tasks; i++) {
+    ASSERT(visitors_[i] == NULL);
+    SkippedCodeFunctions* skipped_code_functions =
+        collect_code ? new SkippedCodeFunctions() : NULL;
+    visitors_[i] = new SyncMarkingVisitor(isolate_, page_space, &marking_stack_,
+                                          skipped_code_functions);
+
+    // Begin marking on a helper thread.
+    bool result = Dart::thread_pool()->Run(new ConcurrentMarkTask(
+        this, isolate_, page_space, visitors_[i], i, num_tasks, &roots_monitor,
+        &root_tasks_remaining));
+    ASSERT(result);
+  }
+
+  // Wait for roots to be marked before exiting safepoint.
+  MonitorLocker ml(&roots_monitor);
+  while (root_tasks_remaining > 0) {
+    ml.Wait();
+  }
+}
+
+void GCMarker::MarkObjects(PageSpace* page_space, bool collect_code) {
+  if (isolate_->marking_stack() != NULL) {
+    isolate_->DisableIncrementalBarrier();
+  }
+
+  Prologue();
   {
     Thread* thread = Thread::Current();
-    StackZone stack_zone(thread);
-    Zone* zone = stack_zone.GetZone();
-    MarkingStack marking_stack;
-    marked_bytes_ = 0;
     const int num_tasks = FLAG_marker_tasks;
     if (num_tasks == 0) {
       TIMELINE_FUNCTION_GC_DURATION(thread, "Mark");
+      int64_t start = OS::GetCurrentMonotonicMicros();
       // Mark everything on main thread.
       SkippedCodeFunctions* skipped_code_functions =
-          collect_code ? new (zone) SkippedCodeFunctions() : NULL;
-      UnsyncMarkingVisitor mark(isolate, page_space, &marking_stack,
+          collect_code ? new SkippedCodeFunctions() : NULL;
+      UnsyncMarkingVisitor mark(isolate_, page_space, &marking_stack_,
                                 skipped_code_functions);
-      IterateRoots(isolate, &mark, 0, 1);
+      IterateRoots(&mark, 0, 1);
       mark.DrainMarkingStack();
       {
         TIMELINE_FUNCTION_GC_DURATION(thread, "ProcessWeakHandles");
         MarkingWeakVisitor mark_weak(thread);
-        IterateWeakRoots(isolate, &mark_weak);
+        IterateWeakRoots(&mark_weak);
       }
       // All marking done; detach code, etc.
+      int64_t stop = OS::GetCurrentMonotonicMicros();
+      mark.AddMicros(stop - start);
       FinalizeResultsFrom(&mark);
     } else {
       ThreadBarrier barrier(num_tasks + 1, heap_->barrier(),
@@ -691,11 +881,23 @@
       uintptr_t num_busy = num_tasks;
       // Phase 1: Iterate over roots and drain marking stack in tasks.
       for (intptr_t i = 0; i < num_tasks; ++i) {
+        SyncMarkingVisitor* visitor;
+        if (visitors_[i] != NULL) {
+          visitor = visitors_[i];
+          visitors_[i] = NULL;
+        } else {
+          SkippedCodeFunctions* skipped_code_functions =
+              collect_code ? new SkippedCodeFunctions() : NULL;
+          visitor = new SyncMarkingVisitor(
+              isolate_, page_space, &marking_stack_, skipped_code_functions);
+        }
+
         MarkTask* mark_task =
-            new MarkTask(this, isolate, heap_, page_space, &marking_stack,
-                         &barrier, collect_code, i, num_tasks, &num_busy);
+            new MarkTask(this, isolate_, &marking_stack_, &barrier, visitor, i,
+                         num_tasks, &num_busy);
         ThreadPool* pool = Dart::thread_pool();
-        pool->Run(mark_task);
+        bool result = pool->Run(mark_task);
+        ASSERT(result);
       }
       bool more_to_mark = false;
       do {
@@ -722,7 +924,7 @@
       {
         TIMELINE_FUNCTION_GC_DURATION(thread, "ProcessWeakHandles");
         MarkingWeakVisitor mark_weak(thread);
-        IterateWeakRoots(isolate, &mark_weak);
+        IterateWeakRoots(&mark_weak);
       }
       barrier.Sync();
 
@@ -730,9 +932,9 @@
       barrier.Exit();
     }
     ProcessWeakTables(page_space);
-    ProcessObjectIdTable(isolate);
+    ProcessObjectIdTable();
   }
-  Epilogue(isolate);
+  Epilogue();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/heap/marker.h b/runtime/vm/heap/marker.h
index 274e99f..10fde88 100644
--- a/runtime/vm/heap/marker.h
+++ b/runtime/vm/heap/marker.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_HEAP_MARKER_H_
 
 #include "vm/allocation.h"
+#include "vm/heap/pointer_block.h"
 #include "vm/os_thread.h"  // Mutex.
 
 namespace dart {
@@ -17,40 +18,58 @@
 class ObjectPointerVisitor;
 class PageSpace;
 class RawWeakProperty;
+template <bool sync>
+class MarkingVisitorBase;
 
 // The class GCMarker is used to mark reachable old generation objects as part
 // of the mark-sweep collection. The marking bit used is defined in RawObject.
-class GCMarker : public ValueObject {
+// Instances have a lifetime that spans from the beginining of concurrent
+// marking (or stop-the-world marking) until marking is complete. In particular,
+// an instance may be created and destroyed on different threads if the isolate
+// is exited during concurrent marking.
+class GCMarker {
  public:
-  explicit GCMarker(Heap* heap) : heap_(heap), marked_bytes_(0) {}
-  ~GCMarker() {}
+  GCMarker(Isolate* isolate, Heap* heap);
+  ~GCMarker();
 
-  void MarkObjects(Isolate* isolate, PageSpace* page_space, bool collect_code);
+  // Mark roots synchronously, then spawn tasks to concurrently drain the
+  // marking queue. Only called when no marking or sweeping is in progress.
+  // Marking must later be finalized by calling MarkObjects.
+  void StartConcurrentMark(PageSpace* page_space, bool collect_code);
 
-  intptr_t marked_words() { return marked_bytes_ >> kWordSizeLog2; }
+  // (Re)mark roots, drain the marking queue and finalize weak references.
+  // Does not required StartConcurrentMark to have been previously called.
+  void MarkObjects(PageSpace* page_space, bool collect_code);
+
+  intptr_t marked_words() const { return marked_bytes_ >> kWordSizeLog2; }
+  intptr_t MarkedWordsPerMicro() const;
 
  private:
-  void Prologue(Isolate* isolate);
-  void Epilogue(Isolate* isolate);
-  void IterateRoots(Isolate* isolate,
-                    ObjectPointerVisitor* visitor,
+  void Prologue();
+  void Epilogue();
+  void IterateRoots(ObjectPointerVisitor* visitor,
                     intptr_t slice_index,
                     intptr_t num_slices);
-  void IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor);
+  void IterateWeakRoots(HandleVisitor* visitor);
   template <class MarkingVisitorType>
-  void IterateWeakReferences(Isolate* isolate, MarkingVisitorType* visitor);
+  void IterateWeakReferences(MarkingVisitorType* visitor);
   void ProcessWeakTables(PageSpace* page_space);
-  void ProcessObjectIdTable(Isolate* isolate);
+  void ProcessObjectIdTable();
 
   // Called by anyone: finalize and accumulate stats from 'visitor'.
   template <class MarkingVisitorType>
   void FinalizeResultsFrom(MarkingVisitorType* visitor);
 
-  Heap* heap_;
+  Isolate* const isolate_;
+  Heap* const heap_;
+  MarkingStack marking_stack_;
+  MarkingVisitorBase<true>** visitors_;
 
   Mutex stats_mutex_;
   uintptr_t marked_bytes_;
+  int64_t marked_micros_;
 
+  friend class ConcurrentMarkTask;
   friend class MarkTask;
   DISALLOW_IMPLICIT_CONSTRUCTORS(GCMarker);
 };
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index 17dba99..ffa17fd 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -179,8 +179,12 @@
       bump_top_(0),
       bump_end_(0),
       max_capacity_in_words_(max_capacity_in_words),
+      usage_(),
+      allocated_black_in_words_(0),
       tasks_lock_(new Monitor()),
       tasks_(0),
+      concurrent_marker_tasks_(0),
+      phase_(kDone),
 #if defined(DEBUG)
       iterating_thread_(NULL),
 #endif
@@ -188,6 +192,7 @@
                              FLAG_old_gen_growth_space_ratio,
                              FLAG_old_gen_growth_rate,
                              FLAG_old_gen_growth_time_ratio),
+      marker_(NULL),
       gc_time_micros_(0),
       collections_(0),
       mark_words_per_micro_(kConservativeInitialMarkSpeed) {
@@ -209,6 +214,7 @@
   FreePages(image_pages_);
   delete pages_lock_;
   delete tasks_lock_;
+  ASSERT(marker_ == NULL);
 }
 
 intptr_t PageSpace::LargePageSizeInWordsFor(intptr_t size) {
@@ -351,6 +357,16 @@
                                         HeapPage::PageType type,
                                         GrowthPolicy growth_policy,
                                         bool is_locked) {
+  if (growth_policy != kForceGrowth) {
+    if (heap_ != NULL) {  // Some unit tests.
+      Thread* thread = Thread::Current();
+      if (thread->CanCollectGarbage()) {
+        heap_->CheckFinishConcurrentMarking(thread);
+        heap_->CheckStartConcurrentMarking(thread, Heap::kOldSpace);
+      }
+    }
+  }
+
   ASSERT(size < kAllocatablePageSize);
   uword result = 0;
   SpaceUsage after_allocation = GetCurrentUsage();
@@ -563,6 +579,11 @@
   }
 }
 
+void PageSpace::AbandonMarkingForShutdown() {
+  delete marker_;
+  marker_ = NULL;
+}
+
 void PageSpace::UpdateMaxCapacityLocked() {
 #if !defined(PRODUCT)
   if (heap_ == NULL) {
@@ -899,7 +920,18 @@
   return estimated_mark_compact_completion <= deadline;
 }
 
-void PageSpace::CollectGarbage(bool compact) {
+void PageSpace::CollectGarbage(bool compact, bool finalize) {
+  if (!finalize) {
+#if defined(TARGET_ARCH_IA32)
+    return;  // Barrier not implemented.
+#elif !defined(CONCURRENT_MARKING)
+    return;  // Barrier generation disabled.
+#else
+    if (FLAG_marker_tasks == 0) return;   // Concurrent marking disabled.
+    if (FLAG_write_protect_code) return;  // Not implemented.
+#endif
+  }
+
   Thread* thread = Thread::Current();
 
   const int64_t pre_wait_for_sweepers = OS::GetCurrentMonotonicMicros();
@@ -907,9 +939,16 @@
   // Wait for pending tasks to complete and then account for the driver task.
   {
     MonitorLocker locker(tasks_lock());
+    if (!finalize &&
+        (phase() == kMarking || phase() == kAwaitingFinalization)) {
+      // Concurrent mark is already running.
+      return;
+    }
+
     while (tasks() > 0) {
       locker.WaitWithSafepointCheck(thread);
     }
+    ASSERT(phase() == kAwaitingFinalization || phase() == kDone);
     set_tasks(1);
   }
 
@@ -921,7 +960,8 @@
   // loser skips collection and goes straight to allocation.
   {
     SafepointOperationScope safepoint_scope(thread);
-    CollectGarbageAtSafepoint(compact, pre_wait_for_sweepers, pre_safe_point);
+    CollectGarbageAtSafepoint(compact, finalize, pre_wait_for_sweepers,
+                              pre_safe_point);
   }
 
   // Done, reset the task count.
@@ -933,6 +973,7 @@
 }
 
 void PageSpace::CollectGarbageAtSafepoint(bool compact,
+                                          bool finalize,
                                           int64_t pre_wait_for_sweepers,
                                           int64_t pre_safe_point) {
   Thread* thread = Thread::Current();
@@ -942,7 +983,6 @@
 
   const int64_t start = OS::GetCurrentMonotonicMicros();
 
-  NOT_IN_PRODUCT(isolate->class_table()->ResetCountersOld());
   // Perform various cleanup that relies on no tasks interfering.
   isolate->class_table()->FreeOldTables();
 
@@ -957,7 +997,7 @@
 
   if (FLAG_verify_before_gc) {
     OS::PrintErr("Verifying before marking...");
-    heap_->VerifyGC();
+    heap_->VerifyGC(phase() == kDone ? kForbidMarked : kAllowMarked);
     OS::PrintErr(" done.\n");
   }
 
@@ -974,9 +1014,27 @@
   bool collect_code = FLAG_collect_code && ShouldCollectCode() &&
                       !isolate->HasAttemptedReload();
 #endif  // !defined(PRODUCT)
-  GCMarker marker(heap_);
-  marker.MarkObjects(isolate, this, collect_code);
-  usage_.used_in_words = marker.marked_words();
+
+  if (marker_ == NULL) {
+    ASSERT(phase() == kDone);
+    marker_ = new GCMarker(isolate, heap_);
+  } else {
+    ASSERT(phase() == kAwaitingFinalization);
+  }
+
+  if (!finalize) {
+    ASSERT(phase() == kDone);
+    marker_->StartConcurrentMark(this, collect_code);
+    return;
+  }
+
+  NOT_IN_PRODUCT(isolate->class_table()->ResetCountersOld());
+  marker_->MarkObjects(this, collect_code);
+  usage_.used_in_words = marker_->marked_words() + allocated_black_in_words_;
+  allocated_black_in_words_ = 0;
+  mark_words_per_micro_ = marker_->MarkedWordsPerMicro();
+  delete marker_;
+  marker_ = NULL;
 
   int64_t mid1 = OS::GetCurrentMonotonicMicros();
 
@@ -1040,10 +1098,12 @@
 
   if (compact) {
     Compact(thread);
+    set_phase(kDone);
   } else if (FLAG_concurrent_sweep) {
     ConcurrentSweep(isolate);
   } else {
     BlockingSweep();
+    set_phase(kDone);
   }
 
   // Make code pages read-only.
@@ -1055,15 +1115,6 @@
   page_space_controller_.EvaluateGarbageCollection(
       usage_before, GetCurrentUsage(), start, end);
 
-  int64_t mark_micros = mid3 - start;
-  if (mark_micros == 0) {
-    mark_micros = 1;  // Prevent division by zero.
-  }
-  mark_words_per_micro_ = usage_before.used_in_words / mark_micros;
-  if (mark_words_per_micro_ == 0) {
-    mark_words_per_micro_ = 1;  // Prevent division by zero.
-  }
-
   heap_->RecordTime(kConcurrentSweep, pre_safe_point - pre_wait_for_sweepers);
   heap_->RecordTime(kSafePoint, start - pre_safe_point);
   heap_->RecordTime(kMarkObjects, mid1 - start);
@@ -1262,6 +1313,17 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
+  return after.CombinedCapacityInWords() >
+         (gc_threshold_in_words_ + heap_->new_space()->CapacityInWords());
+}
+
+bool PageSpaceController::AlmostNeedsGarbageCollection(SpaceUsage after) const {
+  if (!is_enabled_) {
+    return false;
+  }
+  if (heap_growth_ratio_ == 100) {
+    return false;
+  }
   return after.CombinedCapacityInWords() > gc_threshold_in_words_;
 }
 
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index f6b6d96..4255f93 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -25,6 +25,7 @@
 class ObjectPointerVisitor;
 class ObjectSet;
 class ForwardingPage;
+class GCMarker;
 
 // TODO(iposva): Determine heap sizes and tune the page size accordingly.
 static const intptr_t kPageSize = 256 * KB;
@@ -150,6 +151,7 @@
   // This method can be called before allocation (e.g., pretenuring) or after
   // (e.g., promotion), as it does not change the state of the controller.
   bool NeedsGarbageCollection(SpaceUsage after) const;
+  bool AlmostNeedsGarbageCollection(SpaceUsage after) const;
 
   // Returns whether an idle GC is worthwhile.
   bool NeedsIdleGarbageCollection(SpaceUsage current) const;
@@ -216,6 +218,7 @@
 class PageSpace {
  public:
   enum GrowthPolicy { kControlGrowth, kForceGrowth };
+  enum Phase { kDone, kMarking, kAwaitingFinalization, kSweeping };
 
   PageSpace(Heap* heap, intptr_t max_capacity_in_words);
   ~PageSpace();
@@ -233,6 +236,9 @@
   bool NeedsGarbageCollection() const {
     return page_space_controller_.NeedsGarbageCollection(usage_);
   }
+  bool AlmostNeedsGarbageCollection() const {
+    return page_space_controller_.AlmostNeedsGarbageCollection(usage_);
+  }
   void EvaluateSnapshotLoad() {
     page_space_controller_.EvaluateSnapshotLoad(usage_);
   }
@@ -279,7 +285,7 @@
   bool ShouldCollectCode();
 
   // Collect the garbage in the page space using mark-sweep or mark-compact.
-  void CollectGarbage(bool compact);
+  void CollectGarbage(bool compact, bool finalize);
 
   void AddRegionsToObjectSet(ObjectSet* set) const;
 
@@ -319,6 +325,11 @@
   void PrintHeapMapToJSONStream(Isolate* isolate, JSONStream* stream) const;
 #endif  // PRODUCT
 
+  void AllocateBlack(intptr_t size) {
+    AtomicOperations::IncrementBy(&allocated_black_in_words_,
+                                  size >> kWordSizeLog2);
+  }
+
   void AllocateExternal(intptr_t cid, intptr_t size);
   void FreeExternal(intptr_t size);
 
@@ -339,6 +350,13 @@
     ASSERT(val >= 0);
     tasks_ = val;
   }
+  intptr_t concurrent_marker_tasks() const { return concurrent_marker_tasks_; }
+  void set_concurrent_marker_tasks(intptr_t val) {
+    ASSERT(val >= 0);
+    concurrent_marker_tasks_ = val;
+  }
+  Phase phase() const { return phase_; }
+  void set_phase(Phase val) { phase_ = val; }
 
   // Attempt to allocate from bump block rather than normal freelist.
   uword TryAllocateDataBump(intptr_t size, GrowthPolicy growth_policy);
@@ -350,6 +368,8 @@
 
   // Return any bump allocation block to the freelist.
   void AbandonBumpAllocation();
+  // Have threads release marking stack blocks, etc.
+  void AbandonMarkingForShutdown();
 
  private:
   // Ids for time and data records in Heap::GCStats.
@@ -392,6 +412,7 @@
   void FreePages(HeapPage* pages);
 
   void CollectGarbageAtSafepoint(bool compact,
+                                 bool finalize,
                                  int64_t pre_wait_for_sweepers,
                                  int64_t pre_safe_point);
   void BlockingSweep();
@@ -438,14 +459,19 @@
   // NOTE: The capacity component of usage_ is updated by the concurrent
   // sweeper. Use (Increase)CapacityInWords(Locked) for thread-safe access.
   SpaceUsage usage_;
+  intptr_t allocated_black_in_words_;
 
   // Keep track of running MarkSweep tasks.
   Monitor* tasks_lock_;
   intptr_t tasks_;
+  intptr_t concurrent_marker_tasks_;
+  Phase phase_;
+
 #if defined(DEBUG)
   Thread* iterating_thread_;
 #endif
   PageSpaceController page_space_controller_;
+  GCMarker* marker_;
 
   int64_t gc_time_micros_;
   intptr_t collections_;
diff --git a/runtime/vm/heap/pointer_block.cc b/runtime/vm/heap/pointer_block.cc
index f983739..2d0d2a1 100644
--- a/runtime/vm/heap/pointer_block.cc
+++ b/runtime/vm/heap/pointer_block.cc
@@ -15,6 +15,11 @@
 }
 END_LEAF_RUNTIME_ENTRY
 
+DEFINE_LEAF_RUNTIME_ENTRY(void, MarkingStackBlockProcess, 1, Thread* thread) {
+  thread->MarkingStackBlockProcess();
+}
+END_LEAF_RUNTIME_ENTRY
+
 template <int BlockSize>
 typename BlockStack<BlockSize>::List* BlockStack<BlockSize>::global_empty_ =
     NULL;
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index de48b25..b732ff1 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -173,9 +173,15 @@
         // Promoted: update age/barrier tags.
         uint32_t tags = new_obj->ptr()->tags_;
         tags = RawObject::OldBit::update(true, tags);
-        tags = RawObject::OldAndNotMarkedBit::update(true, tags);
         tags = RawObject::OldAndNotRememberedBit::update(true, tags);
         tags = RawObject::NewBit::update(false, tags);
+        // Setting the forwarding pointer below will make this tenured object
+        // visible to the concurrent marker, but we haven't visited its slots
+        // yet. We mark the object here to prevent the concurrent marker from
+        // adding it to the mark stack and visiting its unprocessed slots. We
+        // push it to the mark stack after forwarding its slots.
+        tags =
+            RawObject::OldAndNotMarkedBit::update(!thread_->is_marking(), tags);
         new_obj->ptr()->tags_ = tags;
       }
 
@@ -408,7 +414,7 @@
 SemiSpace* Scavenger::Prologue(Isolate* isolate) {
   NOT_IN_PRODUCT(isolate->class_table()->ResetCountersNew());
 
-  isolate->PrepareForGC();
+  isolate->ReleaseStoreBuffers();
 
   // Flip the two semi-spaces so that to_ is always the space for allocating
   // objects.
@@ -636,6 +642,8 @@
 }
 
 void Scavenger::ProcessToSpace(ScavengerVisitor* visitor) {
+  Thread* thread = Thread::Current();
+
   // Iterate until all work has been drained.
   while ((resolved_top_ < top_) || PromotedStackHasMore()) {
     while (resolved_top_ < top_) {
@@ -659,6 +667,14 @@
         ASSERT(!raw_object->IsRemembered());
         visitor->VisitingOldObject(raw_object);
         raw_object->VisitPointersNonvirtual(visitor);
+        if (raw_object->IsMarked()) {
+          // Complete our promise from ScavengePointer. Note that marker cannot
+          // visit this object until it pops a block from the mark stack, which
+          // involves a memory fence from the mutex, so even on architectures
+          // with a relaxed memory model, the marker will see the fully
+          // forwarded contents of this object.
+          thread->MarkingStackAddObject(raw_object);
+        }
       }
       visitor->VisitingOldObject(NULL);
     }
diff --git a/runtime/vm/heap/sweeper.cc b/runtime/vm/heap/sweeper.cc
index 591cf35..8292a7d 100644
--- a/runtime/vm/heap/sweeper.cc
+++ b/runtime/vm/heap/sweeper.cc
@@ -116,6 +116,7 @@
     ASSERT(freelist_ != NULL);
     MonitorLocker ml(old_space_->tasks_lock());
     old_space_->set_tasks(old_space_->tasks() + 1);
+    old_space_->set_phase(PageSpace::kSweeping);
   }
 
   virtual void Run() {
@@ -156,6 +157,8 @@
     {
       MonitorLocker ml(old_space_->tasks_lock());
       old_space_->set_tasks(old_space_->tasks() - 1);
+      ASSERT(old_space_->phase() == PageSpace::kSweeping);
+      old_space_->set_phase(PageSpace::kDone);
       ml.NotifyAll();
     }
   }
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 9650957..b0bbb27 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -923,19 +923,35 @@
   **SP = result;
   pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
 
-  // It is legit to call the constructor of an error object, however a
-  // result of class UnhandledException must be propagated.
-  if (result->IsHeapObject() &&
-      result->GetClassId() == kUnhandledExceptionCid) {
-    (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
-    (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
-    (*SP)[2] = 0;  // Space for result.
-    Exit(thread, *FP, *SP + 3, *pc);
-    NativeArguments args(thread, 2, *SP, *SP + 2);
-    if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
+  // If the result is an error (not a Dart instance), it must either be rethrown
+  // (in the case of an unhandled exception) or it must be returned to the
+  // caller of the interpreter to be propagated.
+  if (result->IsHeapObject()) {
+    const intptr_t result_cid = result->GetClassId();
+    if (result_cid == kUnhandledExceptionCid) {
+      (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
+      (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
+      (*SP)[2] = 0;  // Space for result.
+      Exit(thread, *FP, *SP + 3, *pc);
+      NativeArguments args(thread, 2, *SP, *SP + 2);
+      if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
+        return false;
+      }
+      UNREACHABLE();
+    }
+    if (RawObject::IsErrorClassId(result_cid)) {
+      // Unwind to entry frame.
+      fp_ = *FP;
+      pc_ = reinterpret_cast<uword>(SavedCallerPC(fp_));
+      while (!IsEntryFrameMarker(pc_)) {
+        fp_ = SavedCallerFP(fp_);
+        pc_ = reinterpret_cast<uword>(SavedCallerPC(fp_));
+      }
+      // Pop entry frame.
+      fp_ = SavedCallerFP(fp_);
+      special_[KernelBytecode::kExceptionSpecialIndex] = result;
       return false;
     }
-    UNREACHABLE();
   }
   return true;
 }
@@ -1509,7 +1525,7 @@
   do {                                                                         \
     FP = reinterpret_cast<RawObject**>(fp_);                                   \
     pc = reinterpret_cast<uint32_t*>(pc_);                                     \
-    if ((reinterpret_cast<uword>(pc) & 2) != 0) { /* Entry frame? */           \
+    if (IsEntryFrameMarker(reinterpret_cast<uword>(pc))) {                     \
       pp_ = reinterpret_cast<RawObjectPool*>(fp_[kKBCSavedPpSlotFromEntryFp]); \
       argdesc_ =                                                               \
           reinterpret_cast<RawArray*>(fp_[kKBCSavedArgDescSlotFromEntryFp]);   \
@@ -1537,7 +1553,7 @@
   do {                                                                         \
     FP = reinterpret_cast<RawObject**>(fp_);                                   \
     pc = reinterpret_cast<uint32_t*>(pc_);                                     \
-    if ((reinterpret_cast<uword>(pc) & 2) != 0) { /* Entry frame? */           \
+    if (IsEntryFrameMarker(reinterpret_cast<uword>(pc))) {                     \
       pp_ = reinterpret_cast<RawObjectPool*>(fp_[kKBCSavedPpSlotFromEntryFp]); \
       argdesc_ =                                                               \
           reinterpret_cast<RawArray*>(fp_[kKBCSavedArgDescSlotFromEntryFp]);   \
@@ -1616,7 +1632,7 @@
   pc_ = reinterpret_cast<uword>(*pc);  // For the profiler.
 
   // Check if it is a fake PC marking the entry frame.
-  ASSERT((reinterpret_cast<uword>(*pc) & 2) == 0);
+  ASSERT(!IsEntryFrameMarker(reinterpret_cast<uword>(*pc)));
 
   // Restore SP, FP and PP.
   // Unoptimized frame SP is one below FrameArguments(...) because
@@ -2103,6 +2119,17 @@
         INVOKE_RUNTIME(DRT_StackOverflow, args);
       }
     }
+    RawFunction* function = FrameFunction(FP);
+    int32_t counter = ++(function->ptr()->usage_counter_);
+    if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&
+                 counter >= FLAG_compilation_counter_threshold &&
+                 !Function::HasCode(function))) {
+      SP[1] = 0;  // Unused code result.
+      SP[2] = function;
+      Exit(thread, FP, SP + 3, pc);
+      NativeArguments native_args(thread, 1, SP + 2, SP + 1);
+      INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, native_args);
+    }
     DISPATCH();
   }
 
@@ -3456,7 +3483,7 @@
     pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
 
     // Check if it is a fake PC marking the entry frame.
-    if ((reinterpret_cast<uword>(pc) & 2) != 0) {
+    if (IsEntryFrameMarker(reinterpret_cast<uword>(pc))) {
       // Pop entry frame.
       fp_ = SavedCallerFP(FP);
       // Restore exit frame info saved in entry frame.
@@ -4771,7 +4798,8 @@
     // Restore caller context as we are going to throw NoSuchMethod.
     pc = SavedCallerPC(FP);
 
-    const bool has_dart_caller = (reinterpret_cast<uword>(pc) & 2) == 0;
+    const bool has_dart_caller =
+        !IsEntryFrameMarker(reinterpret_cast<uword>(pc));
     const intptr_t argc = has_dart_caller ? KernelBytecode::DecodeArgc(pc[-1])
                                           : (reinterpret_cast<uword>(pc) >> 2);
     const intptr_t type_args_len =
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 3d98670..73fcadb 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -59,6 +59,9 @@
     return frame >= stack_base() && frame <= get_fp();
   }
 
+  // Identify an entry frame by looking at its pc marker value.
+  static bool IsEntryFrameMarker(uword pc) { return (pc & 2) != 0; }
+
   // Call on program start.
   static void InitOnce();
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 1c155bd..d26ed2e 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -84,6 +84,7 @@
 
 static void DeterministicModeHandler(bool value) {
   if (value) {
+    FLAG_marker_tasks = 0;                // Timing dependent.
     FLAG_background_compilation = false;  // Timing dependent.
     FLAG_collect_code = false;            // Timing dependent.
     FLAG_random_seed = 0x44617274;  // "Dart"
@@ -475,7 +476,7 @@
 void IsolateMessageHandler::MessageNotify(Message::Priority priority) {
   if (priority >= Message::kOOBPriority) {
     // Handle out of band messages even if the mutator thread is busy.
-    I->ScheduleMessageInterrupts();
+    I->ScheduleInterrupts(Thread::kMessageInterrupt);
   }
   Dart_MessageNotifyCallback callback = I->message_notify_callback();
   if (callback) {
@@ -866,8 +867,6 @@
 // that shared monitor.
 Isolate::Isolate(const Dart_IsolateFlags& api_flags)
     : BaseIsolate(),
-      store_buffer_(new StoreBuffer()),
-      heap_(NULL),
       user_tag_(0),
       current_tag_(UserTag::null()),
       default_tag_(UserTag::null()),
@@ -875,6 +874,9 @@
       object_store_(NULL),
       class_table_(),
       single_step_(false),
+      store_buffer_(new StoreBuffer()),
+      marking_stack_(NULL),
+      heap_(NULL),
       isolate_flags_(0),
       background_compiler_(NULL),
 #if !defined(PRODUCT)
@@ -988,6 +990,7 @@
   free(name_);
   delete store_buffer_;
   delete heap_;
+  ASSERT(marking_stack_ == NULL);
   delete object_store_;
   delete api_state_;
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -1169,13 +1172,13 @@
                         is_executable);
 }
 
-void Isolate::ScheduleMessageInterrupts() {
+void Isolate::ScheduleInterrupts(uword interrupt_bits) {
   // We take the threads lock here to ensure that the mutator thread does not
   // exit the isolate while we are trying to schedule interrupts on it.
   MonitorLocker ml(threads_lock());
   Thread* mthread = mutator_thread();
   if (mthread != NULL) {
-    mthread->ScheduleInterrupts(Thread::kMessageInterrupt);
+    mthread->ScheduleInterrupts(interrupt_bits);
   }
 }
 
@@ -1874,12 +1877,15 @@
 
   if (heap_ != NULL) {
     // Wait for any concurrent GC tasks to finish before shutting down.
-    // TODO(koda): Support faster sweeper shutdown (e.g., after current page).
+    // TODO(rmacnak): Interrupt tasks for faster shutdown.
     PageSpace* old_space = heap_->old_space();
     MonitorLocker ml(old_space->tasks_lock());
     while (old_space->tasks() > 0) {
       ml.Wait();
     }
+    // Needs to happen before ~PageSpace so TLS and the thread registery are
+    // still valid.
+    old_space->AbandonMarkingForShutdown();
   }
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -2015,8 +2021,22 @@
   }
 }
 
-void Isolate::PrepareForGC() {
-  thread_registry()->PrepareForGC();
+void Isolate::ReleaseStoreBuffers() {
+  thread_registry()->ReleaseStoreBuffers();
+}
+
+void Isolate::EnableIncrementalBarrier(MarkingStack* marking_stack) {
+  ASSERT(marking_stack_ == NULL);
+  marking_stack_ = marking_stack;
+  thread_registry()->AcquireMarkingStacks();
+  ASSERT(Thread::Current()->is_marking());
+}
+
+void Isolate::DisableIncrementalBarrier() {
+  thread_registry()->ReleaseMarkingStacks();
+  ASSERT(marking_stack_ != NULL);
+  marking_stack_ = NULL;
+  ASSERT(!Thread::Current()->is_marking());
 }
 
 RawClass* Isolate::GetClassForHeapWalkAt(intptr_t cid) {
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 07e6197..c47a9d6 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -202,9 +202,12 @@
   void VisitWeakPersistentHandles(HandleVisitor* visitor);
 
   // Prepares all threads in an isolate for Garbage Collection.
-  void PrepareForGC();
+  void ReleaseStoreBuffers();
+  void EnableIncrementalBarrier(MarkingStack* marking_stack);
+  void DisableIncrementalBarrier();
 
-  StoreBuffer* store_buffer() { return store_buffer_; }
+  StoreBuffer* store_buffer() const { return store_buffer_; }
+  MarkingStack* marking_stack() const { return marking_stack_; }
 
   ThreadRegistry* thread_registry() const { return thread_registry_; }
   SafepointHandler* safepoint_handler() const { return safepoint_handler_; }
@@ -290,7 +293,7 @@
 
   void SetupImagePage(const uint8_t* snapshot_buffer, bool is_executable);
 
-  void ScheduleMessageInterrupts();
+  void ScheduleInterrupts(uword interrupt_bits);
 
   // Marks all libraries as loaded.
   void DoneLoading();
@@ -854,8 +857,6 @@
   // in SIMARM(IA32) and ARM, and the same offsets in SIMARM64(X64) and ARM64.
   // We use only word-sized fields to avoid differences in struct packing on the
   // different architectures. See also CheckOffsets in dart.cc.
-  StoreBuffer* store_buffer_;
-  Heap* heap_;
   uword user_tag_;
   RawUserTag* current_tag_;
   RawUserTag* default_tag_;
@@ -863,6 +864,11 @@
   ObjectStore* object_store_;
   ClassTable class_table_;
   bool single_step_;
+  // End accessed from generated code.
+
+  StoreBuffer* store_buffer_;
+  MarkingStack* marking_stack_;
+  Heap* heap_;
 
 #define ISOLATE_FLAG_BITS(V)                                                   \
   V(ErrorsFatal)                                                               \
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 7bbc8f8..335a140 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -686,6 +686,12 @@
   return false;
 }
 
+bool IsFieldInitializer(const Function& function, Zone* zone) {
+  return (function.kind() == RawFunction::kImplicitStaticFinalGetter) &&
+         String::Handle(zone, function.name())
+             .StartsWith(Symbols::InitPrefix());
+}
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 5b8e9a2..534d18f 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -198,6 +198,8 @@
 // as such function already checks all of its parameters.
 bool NeedsDynamicInvocationForwarder(const Function& function);
 
+bool IsFieldInitializer(const Function& function, Zone* zone);
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 5ffbc1b..49cbe58 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -197,6 +197,26 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
+DART_EXPORT Dart_Handle Dart_ReadAllBytecode() {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Api::NewError("%s: Cannot read bytecode on an AOT runtime.",
+                       CURRENT_FUNC);
+#else
+  DARTSCOPE(Thread::Current());
+  API_TIMELINE_DURATION(T);
+  Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
+  if (::Dart_IsError(result)) {
+    return result;
+  }
+  CHECK_CALLBACK_STATE(T);
+  const Error& error = Error::Handle(T->zone(), Library::ReadAllBytecode());
+  if (!error.IsNull()) {
+    return Api::NewHandle(T, error.raw());
+  }
+  return Api::Success();
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+}
+
 DART_EXPORT Dart_Handle Dart_ParseAll() {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 39c6839..0a4719f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -13,6 +13,7 @@
 #include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_fingerprints.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/intrinsifier.h"
@@ -2042,26 +2043,31 @@
   InitializeObject(address, cls_id, size, (isolate == Dart::vm_isolate()));
   RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag);
   ASSERT(cls_id == RawObject::ClassIdTag::decode(raw_obj->ptr()->tags_));
+  if (raw_obj->IsOldObject() && thread->is_marking()) {
+    // Black allocation. Prevents a data race between the mutator and concurrent
+    // marker on ARM and ARM64 (the marker may observe a publishing store of
+    // this object before the stores that initialize its slots), and helps the
+    // collection to finish sooner.
+    raw_obj->SetMarkBitUnsynchronized();
+    heap->old_space()->AllocateBlack(size);
+  }
   return raw_obj;
 }
 
-class StoreBufferUpdateVisitor : public ObjectPointerVisitor {
+class WriteBarrierUpdateVisitor : public ObjectPointerVisitor {
  public:
-  explicit StoreBufferUpdateVisitor(Thread* thread, RawObject* obj)
+  explicit WriteBarrierUpdateVisitor(Thread* thread, RawObject* obj)
       : ObjectPointerVisitor(thread->isolate()),
         thread_(thread),
         old_obj_(obj) {
     ASSERT(old_obj_->IsOldObject());
   }
 
-  void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** curr = first; curr <= last; ++curr) {
-      RawObject* raw_obj = *curr;
-      if (raw_obj->IsHeapObject() && raw_obj->IsNewObject()) {
-        old_obj_->SetRememberedBit();
-        thread_->StoreBufferAddObject(old_obj_);
-        // Remembered this object. There is no need to continue searching.
-        return;
+  void VisitPointers(RawObject** from, RawObject** to) {
+    for (RawObject** slot = from; slot <= to; ++slot) {
+      RawObject* value = *slot;
+      if (value->IsHeapObject()) {
+        old_obj_->CheckHeapPointerStore(value, thread_);
       }
     }
   }
@@ -2070,7 +2076,7 @@
   Thread* thread_;
   RawObject* old_obj_;
 
-  DISALLOW_COPY_AND_ASSIGN(StoreBufferUpdateVisitor);
+  DISALLOW_COPY_AND_ASSIGN(WriteBarrierUpdateVisitor);
 };
 
 bool Object::IsReadOnlyHandle() const {
@@ -2086,9 +2092,6 @@
   intptr_t size = orig.raw()->Size();
   RawObject* raw_clone = Object::Allocate(cls.id(), size, space);
   NoSafepointScope no_safepoint;
-  // TODO(koda): This will trip when we start allocating black.
-  // Revisit code below at that point, to account for the new write barrier.
-  ASSERT(!(raw_clone->IsOldObject() && raw_clone->IsMarked()));
   // Copy the body of the original into the clone.
   uword orig_addr = RawObject::ToAddr(orig.raw());
   uword clone_addr = RawObject::ToAddr(raw_clone);
@@ -2100,11 +2103,8 @@
   if (!raw_clone->IsOldObject()) {
     // No need to remember an object in new space.
     return raw_clone;
-  } else if (orig.raw()->IsOldObject() && !orig.raw()->IsRemembered()) {
-    // Old original doesn't need to be remembered, so neither does the clone.
-    return raw_clone;
   }
-  StoreBufferUpdateVisitor visitor(Thread::Current(), raw_clone);
+  WriteBarrierUpdateVisitor visitor(Thread::Current(), raw_clone);
   raw_clone->VisitPointers(&visitor);
   return raw_clone;
 }
@@ -5966,8 +5966,27 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+bool Function::IsBytecodeAllowed(Zone* zone) const {
+  switch (kind()) {
+    case RawFunction::kImplicitGetter:
+    case RawFunction::kImplicitSetter:
+    case RawFunction::kMethodExtractor:
+    case RawFunction::kNoSuchMethodDispatcher:
+    case RawFunction::kInvokeFieldDispatcher:
+    case RawFunction::kDynamicInvocationForwarder:
+    case RawFunction::kImplicitClosureFunction:
+    case RawFunction::kIrregexpFunction:
+      return false;
+    case RawFunction::kImplicitStaticFinalGetter:
+      return kernel::IsFieldInitializer(*this, zone);
+    default:
+      return true;
+  }
+}
+
 void Function::AttachBytecode(const Code& value) const {
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
+  ASSERT(FLAG_enable_interpreter || FLAG_use_bytecode_compiler);
   // Finish setting up code before activating it.
   value.set_owner(*this);
   StorePointer(&raw_ptr()->bytecode_, value.raw());
@@ -5975,7 +5994,7 @@
   // We should not have loaded the bytecode if the function had code.
   ASSERT(!HasCode());
 
-  if (!FLAG_use_bytecode_compiler) {
+  if (FLAG_enable_interpreter) {
     // Set the code entry_point to InterpretCall stub.
     SetInstructions(Code::Handle(StubCode::InterpretCall_entry()->code()));
   }
@@ -6081,7 +6100,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  ASSERT(Thread::Current()->IsMutatorThread());
+  DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   ASSERT(value.IsNull() || !value.is_optimized());
   StorePointer(&raw_ptr()->unoptimized_code_, value.raw());
 #endif
@@ -12466,7 +12485,8 @@
 
   const Function& callee = Function::Cast(result);
 
-  if (type_definitions.Length() == 0) {
+  // type_arguments is null if all type arguments are dynamic.
+  if (type_definitions.Length() == 0 || type_arguments.IsNull()) {
     return DartEntry::InvokeFunction(callee, arguments);
   }
 
@@ -13302,6 +13322,51 @@
   return Error::null();
 }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+RawError* Library::ReadAllBytecode() {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Error& error = Error::Handle(zone);
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
+      Isolate::Current()->object_store()->libraries());
+  Library& lib = Library::Handle(zone);
+  Class& cls = Class::Handle(zone);
+  for (int i = 0; i < libs.Length(); i++) {
+    lib ^= libs.At(i);
+    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
+    while (it.HasNext()) {
+      cls = it.GetNextClass();
+      error = cls.EnsureIsFinalized(thread);
+      if (!error.IsNull()) {
+        return error.raw();
+      }
+      error = Compiler::ReadAllBytecode(cls);
+      if (!error.IsNull()) {
+        return error.raw();
+      }
+    }
+  }
+
+  // Inner functions get added to the closures array. As part of compilation
+  // more closures can be added to the end of the array. Compile all the
+  // closures until we have reached the end of the "worklist".
+  const GrowableObjectArray& closures = GrowableObjectArray::Handle(
+      zone, Isolate::Current()->object_store()->closure_functions());
+  Function& func = Function::Handle(zone);
+  for (int i = 0; i < closures.Length(); i++) {
+    func ^= closures.At(i);
+    if (func.IsBytecodeAllowed(zone) && !func.HasBytecode()) {
+      RawError* error =
+          kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
+      if (error != Error::null()) {
+        return error;
+      }
+    }
+  }
+  return Error::null();
+}
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
 RawError* Library::ParseAll(Thread* thread) {
   Zone* zone = thread->zone();
   Error& error = Error::Handle(zone);
@@ -15595,7 +15660,7 @@
 }
 
 const Code::Comments& Code::comments() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
   Comments* comments = new Code::Comments(Array::Handle());
 #else
   Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_));
@@ -15604,7 +15669,7 @@
 }
 
 void Code::set_comments(const Code::Comments& comments) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
   UNREACHABLE();
 #else
   ASSERT(comments.comments_.IsOld());
@@ -15613,7 +15678,7 @@
 }
 
 void Code::SetPrologueOffset(intptr_t offset) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
   UNREACHABLE();
 #else
   ASSERT(offset >= 0);
@@ -15624,7 +15689,8 @@
 }
 
 intptr_t Code::GetPrologueOffset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
+  UNREACHABLE();
   return -1;
 #else
   const Object& object = Object::Handle(raw_ptr()->return_address_metadata_);
@@ -15662,8 +15728,8 @@
     result.set_pointer_offsets_length(pointer_offsets_length);
     result.set_is_optimized(false);
     result.set_is_alive(false);
-    result.set_comments(Comments::New(0));
-    result.set_compile_timestamp(0);
+    NOT_IN_PRODUCT(result.set_comments(Comments::New(0)));
+    NOT_IN_PRODUCT(result.set_compile_timestamp(0));
     result.set_pc_descriptors(Object::empty_descriptors());
   }
   return result.raw();
@@ -15777,15 +15843,14 @@
   }
 #endif
 
+#ifndef PRODUCT
   const Code::Comments& comments = assembler->GetCodeComments();
 
   code.set_compile_timestamp(OS::GetCurrentMonotonicMicros());
-#ifndef PRODUCT
   CodeCommentsWrapper comments_wrapper(comments);
   CodeObservers::NotifyAll(name, instrs.PayloadStart(),
                            assembler->prologue_offset(), instrs.Size(),
                            optimized, &comments_wrapper);
-#endif
   code.set_comments(comments);
   if (assembler->prologue_offset() >= 0) {
     code.SetPrologueOffset(assembler->prologue_offset());
@@ -15796,6 +15861,7 @@
   }
   INC_STAT(Thread::Current(), total_code_size,
            code.comments().comments_.Length());
+#endif
   return code.raw();
 }
 
@@ -16141,7 +16207,7 @@
 }
 
 RawArray* Code::await_token_positions() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
   return Array::null();
 #else
   return raw_ptr()->await_token_positions_;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 11ea398..4aace8f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2376,6 +2376,7 @@
   }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+  bool IsBytecodeAllowed(Zone* zone) const;
   void AttachBytecode(const Code& bytecode) const;
   RawCode* Bytecode() const { return raw_ptr()->bytecode_; }
   bool HasBytecode() const;
@@ -4100,6 +4101,10 @@
   // Eagerly compile all classes and functions in the library.
   static RawError* CompileAll();
   static RawError* ParseAll(Thread* thread);
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  // Eagerly read all bytecode.
+  static RawError* ReadAllBytecode();
+#endif
 
 #if defined(DART_NO_SNAPSHOT)
   // Checks function fingerprints. Prints mismatches and aborts if
@@ -5121,7 +5126,7 @@
   void set_comments(const Comments& comments) const;
 
   RawObject* return_address_metadata() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
     UNREACHABLE();
     return NULL;
 #else
@@ -5162,7 +5167,7 @@
   void DumpSourcePositions() const;
 
   RawLocalVarDescriptors* var_descriptors() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
     UNREACHABLE();
     return NULL;
 #else
@@ -5170,7 +5175,7 @@
 #endif
   }
   void set_var_descriptors(const LocalVarDescriptors& value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
     UNREACHABLE();
 #else
     ASSERT(value.IsOld());
@@ -5258,7 +5263,7 @@
   const char* QualifiedName() const;
 
   int64_t compile_timestamp() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
     return 0;
 #else
     return raw_ptr()->compile_timestamp_;
@@ -5324,7 +5329,7 @@
   static const intptr_t kEntrySize = sizeof(int32_t);  // NOLINT
 
   void set_compile_timestamp(int64_t timestamp) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
+#if defined(PRODUCT)
     UNREACHABLE();
 #else
     StoreNonPointer(&raw_ptr()->compile_timestamp_, timestamp);
@@ -9292,8 +9297,9 @@
 
   static void Clear(RawWeakProperty* raw_weak) {
     ASSERT(raw_weak->ptr()->next_ == 0);
-    raw_weak->StorePointer(&(raw_weak->ptr()->key_), Object::null());
-    raw_weak->StorePointer(&(raw_weak->ptr()->value_), Object::null());
+    // This action is performed by the GC. No barrier.
+    raw_weak->ptr()->key_ = Object::null();
+    raw_weak->ptr()->value_ = Object::null();
   }
 
  private:
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 1046b77..95e3f16 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -501,6 +501,7 @@
 intptr_t ObjectGraph::InboundReferences(Object* obj, const Array& references) {
   Object& scratch = Object::Handle();
   HeapIterationScope iteration(Thread::Current());
+  NoSafepointScope no_safepoint;
   InboundReferencesVisitor visitor(isolate(), obj->raw(), references, &scratch);
   iteration.IterateObjects(&visitor);
   return visitor.length();
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index f69e319..881cc0d 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -1006,8 +1006,6 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("new _List", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("new List", walker.CurrentName());
-    EXPECT(walker.Down());
     EXPECT_STREQ("foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index f8dacf3..adc81d8 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -690,35 +690,21 @@
   template <typename type>
   void StorePointer(type const* addr, type value) {
     *const_cast<type*>(addr) = value;
-
-    if (!value->IsHeapObject()) return;
-
-    uint32_t source_tags = this->ptr()->tags_;
-    uint32_t target_tags = value->ptr()->tags_;
-    Thread* thread = Thread::Current();
-    if (((source_tags >> kBarrierOverlapShift) & target_tags &
-         thread->write_barrier_mask()) != 0) {
-      if (value->IsNewObject()) {
-        // Generational barrier: record when a store creates an
-        // old-and-not-remembered -> new reference.
-        ASSERT(!this->IsRemembered());
-        this->SetRememberedBit();
-        thread->StoreBufferAddObject(this);
-      } else {
-        // Incremental barrier: record when a store creates an
-        // old -> old-and-not-marked reference.
-        ASSERT(value->IsOldObject());
-        UNREACHABLE();
-      }
+    if (value->IsHeapObject()) {
+      CheckHeapPointerStore(value, Thread::Current());
     }
   }
 
   template <typename type>
   void StorePointer(type const* addr, type value, Thread* thread) {
     *const_cast<type*>(addr) = value;
+    if (value->IsHeapObject()) {
+      CheckHeapPointerStore(value, thread);
+    }
+  }
 
-    if (!value->IsHeapObject()) return;
-
+  DART_FORCE_INLINE
+  void CheckHeapPointerStore(RawObject* value, Thread* thread) {
     uint32_t source_tags = this->ptr()->tags_;
     uint32_t target_tags = value->ptr()->tags_;
     if (((source_tags >> kBarrierOverlapShift) & target_tags &
@@ -733,7 +719,9 @@
         // Incremental barrier: record when a store creates an
         // old -> old-and-not-marked reference.
         ASSERT(value->IsOldObject());
-        UNREACHABLE();
+        if (value->TryAcquireMarkBit()) {
+          thread->MarkingStackAddObject(value);
+        }
       }
     }
   }
@@ -811,6 +799,7 @@
   friend class ObjectGraph::Stack;  // GetClassId
   friend class Precompiler;         // GetClassId
   friend class ObjectOffsetTrait;   // GetClassId
+  friend class WriteBarrierUpdateVisitor;  // CheckHeapPointerStore
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
@@ -1397,24 +1386,27 @@
   RawArray* stackmaps_;
   RawArray* inlined_id_to_function_;
   RawCodeSourceMap* code_source_map_;
-  NOT_IN_PRECOMPILED(RawArray* await_token_positions_);
   NOT_IN_PRECOMPILED(RawInstructions* active_instructions_);
   NOT_IN_PRECOMPILED(RawArray* deopt_info_array_);
   // (code-offset, function, code) triples.
   NOT_IN_PRECOMPILED(RawArray* static_calls_target_table_);
+  NOT_IN_PRODUCT(RawArray* await_token_positions_);
   // If return_address_metadata_ is a Smi, it is the offset to the prologue.
   // Else, return_address_metadata_ is null.
-  NOT_IN_PRECOMPILED(RawObject* return_address_metadata_);
-  NOT_IN_PRECOMPILED(RawLocalVarDescriptors* var_descriptors_);
-  NOT_IN_PRECOMPILED(RawArray* comments_);
-#if defined(DART_PRECOMPILED_RUNTIME)
+  NOT_IN_PRODUCT(RawObject* return_address_metadata_);
+  NOT_IN_PRODUCT(RawLocalVarDescriptors* var_descriptors_);
+  NOT_IN_PRODUCT(RawArray* comments_);
+
+#if !defined(PRODUCT)
+  VISIT_TO(RawObject*, comments_);
+#elif defined(DART_PRECOMPILED_RUNTIME)
   VISIT_TO(RawObject*, code_source_map_);
 #else
-  VISIT_TO(RawObject*, comments_);
+  VISIT_TO(RawObject*, static_calls_target_table_);
 #endif
 
   // Compilation timestamp.
-  NOT_IN_PRECOMPILED(int64_t compile_timestamp_);
+  NOT_IN_PRODUCT(int64_t compile_timestamp_);
 
   // state_bits_ is a bitfield with three fields:
   // The optimized bit, the alive bit, and a count of the number of pointer
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index eca3f35..e5db6fa 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -7,6 +7,7 @@
 #include "vm/ast.h"
 #include "vm/code_patcher.h"
 #include "vm/compiler/assembler/assembler.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
@@ -636,18 +637,24 @@
     }
     return;
   }
+  Class& instance_class = Class::Handle(zone);
   if (instance.IsSmi()) {
-    if (FLAG_trace_type_checks) {
-      OS::PrintErr("UpdateTypeTestCache: instance is Smi\n");
+    if (FLAG_enable_interpreter) {
+      instance_class = Smi::Class();
+    } else {
+      if (FLAG_trace_type_checks) {
+        OS::PrintErr("UpdateTypeTestCache: instance is Smi, not updating\n");
+      }
+      return;
     }
-    return;
+  } else {
+    instance_class = instance.clazz();
   }
   // If the type is uninstantiated and refers to parent function type
   // parameters, the function_type_arguments have been canonicalized
   // when concatenated.
   ASSERT(function_type_arguments.IsNull() ||
          function_type_arguments.IsCanonical());
-  const Class& instance_class = Class::Handle(zone, instance.clazz());
   auto& instance_class_id_or_function = Object::Handle(zone);
   auto& instance_type_arguments = TypeArguments::Handle(zone);
   auto& instance_parent_function_type_arguments = TypeArguments::Handle(zone);
@@ -2146,9 +2153,15 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   ASSERT(!function.IsNull());
-  ASSERT(function.HasCode());
 
-  if (Compiler::CanOptimizeFunction(thread, function)) {
+  // If running with interpreter, do the unoptimized compilation first.
+  const bool unoptimized_compilation =
+      FLAG_enable_interpreter && !function.WasCompiled();
+
+  ASSERT(unoptimized_compilation || function.HasCode());
+
+  if (unoptimized_compilation ||
+      Compiler::CanOptimizeFunction(thread, function)) {
     if (FLAG_background_compilation) {
       Field& field = Field::Handle(zone, isolate->GetDeoptimizingBoxedField());
       while (!field.IsNull()) {
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 14cc6b7..a75bcbb 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -60,6 +60,7 @@
   V(intptr_t, DeoptimizeCopyFrame, uword, uword)                               \
   V(void, DeoptimizeFillFrame, uword)                                          \
   V(void, StoreBufferBlockProcess, Thread*)                                    \
+  V(void, MarkingStackBlockProcess, Thread*)                                   \
   V(double, LibcPow, double, double)                                           \
   V(double, DartModulo, double, double)                                        \
   V(double, LibcFloor, double)                                                 \
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
index 69e897a..41eea90 100644
--- a/runtime/vm/signal_handler.h
+++ b/runtime/vm/signal_handler.h
@@ -94,19 +94,26 @@
                                                              void* context_) {
     // IT (If-Then) instruction makes up to four instructions that follow it
     // conditional.
-    asm volatile("nop; nop; nop; nop" : : : "memory");
+    // Note: clobber all register so that compiler does not attempt to hoist
+    // anything from the next assembly block past this one.
+    asm volatile("nop; nop; nop; nop;"
+                 :
+                 :
+                 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
+                   "r10", "r11", "r12", "r13", "r14", "memory");
 
     // Tail-call into the actual signal handler.
+    //
     // Note: this code is split into a separate inline assembly block because
     // any code that compiler generates to satisfy register constraints must
     // be generated after four NOPs.
-    register int arg0 asm("r0") = signal;
-    register siginfo_t* arg1 asm("r1") = info;
-    register void* arg2 asm("r2") = context_;
-    asm volatile("bx %3"
-                 :
-                 : "r"(arg0), "r"(arg1), "r"(arg2), "r"(action)
-                 : "memory");
+    //
+    // Note: there is no portable way to specify that we want to have
+    // signal, info and context_ in r0 - r2 respectively. So we just mark them
+    // as clobbered and hope that compiler does not emit any code that uses
+    // these registers to satisfy action constraint (we tested on clang and
+    // the generated code looks like one would expect).
+    asm volatile("bx %0;" : : "r"(action) : "r0", "r1", "r2", "memory");
   }
 #endif  // defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
 };
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 759469a..472a825 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -11,6 +11,7 @@
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/flags.h"
 #include "vm/heap/safepoint.h"
+#include "vm/interpreter.h"
 #include "vm/object_store.h"
 #include "vm/snapshot.h"
 #include "vm/virtual_memory.h"
@@ -96,7 +97,7 @@
   if (FLAG_enable_interpreter) {
     if (is_interpreted_frame) {
       // Recognize special marker set up by interpreter in entry frame.
-      return (pc & 2) != 0;
+      return Interpreter::IsEntryFrameMarker(pc);
     }
     {
       uword entry = StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint();
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index d00c0f6..fdbdd82 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -1200,7 +1200,56 @@
 
 #if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
-  __ Stop("Incremental barrier");
+  __ PushList((1 << R1) | (1 << R2) | (1 << R3));  // Spill.
+
+  Label marking_retry, lost_race, marking_overflow;
+  if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+// TODO(21263): Implement 'swp' and use it below.
+#if !defined(USING_SIMULATOR)
+    ASSERT(OS::NumberOfAvailableProcessors() <= 1);
+#endif
+    __ ldr(R2, FieldAddress(TMP, Object::tags_offset()));
+    __ bic(R2, R2, Operand(1 << RawObject::kOldAndNotMarkedBit));
+    __ str(R2, FieldAddress(TMP, Object::tags_offset()));
+  } else {
+    // Atomically clear kOldAndNotMarkedBit.
+    ASSERT(Object::tags_offset() == 0);
+    __ sub(R3, TMP, Operand(kHeapObjectTag));
+    // R3: Untagged address of header word (ldrex/strex do not support offsets).
+    __ Bind(&marking_retry);
+    __ ldrex(R2, R3);
+    __ tst(R2, Operand(1 << RawObject::kOldAndNotMarkedBit));
+    __ b(&lost_race, ZERO);
+    __ bic(R2, R2, Operand(1 << RawObject::kOldAndNotMarkedBit));
+    __ strex(R1, R2, R3);
+    __ cmp(R1, Operand(1));
+    __ b(&marking_retry, EQ);
+  }
+
+  __ ldr(R1, Address(THR, Thread::marking_stack_block_offset()));
+  __ ldr(R2, Address(R1, MarkingStackBlock::top_offset()));
+  __ add(R3, R1, Operand(R2, LSL, kWordSizeLog2));
+  __ str(TMP, Address(R3, MarkingStackBlock::pointers_offset()));
+  __ add(R2, R2, Operand(1));
+  __ str(R2, Address(R1, MarkingStackBlock::top_offset()));
+  __ CompareImmediate(R2, MarkingStackBlock::kSize);
+  __ PopList((1 << R1) | (1 << R2) | (1 << R3));  // Unspill.
+  __ b(&marking_overflow, EQ);
+  __ Ret();
+
+  __ Bind(&marking_overflow);
+  __ Push(CODE_REG);
+  __ ldr(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ EnterCallRuntimeFrame(0 * kWordSize);
+  __ mov(R0, Operand(THR));
+  __ CallRuntime(kMarkingStackBlockProcessRuntimeEntry, 1);
+  __ LeaveCallRuntimeFrame();
+  __ Pop(CODE_REG);
+  __ Ret();
+
+  __ Bind(&lost_race);
+  __ PopList((1 << R1) | (1 << R2) | (1 << R3));  // Unspill.
+  __ Ret();
 #endif
 }
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index c63f0e8..0f1bf6f 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -1066,10 +1066,6 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   __ Stop("Not using interpreter");
 #else
-  if (!FLAG_enable_interpreter) {
-    __ Stop("Not using interpreter");
-    return;
-  }
   // Copy the C stack pointer (R31) into the stack pointer we'll actually use
   // to access the stack.
   __ SetupDartSP();
@@ -1405,7 +1401,52 @@
 
 #if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
-  __ Stop("Incremental barrier");
+  __ Push(R1);  // Spill.
+  __ Push(R2);  // Spill.
+  __ Push(R3);  // Spill.
+
+  // Atomically clear kOldAndNotMarkedBit.
+  // Note that we use 32 bit operations here to match the size of the
+  // background sweeper which is also manipulating this 32 bit word.
+  Label marking_retry, lost_race, marking_overflow;
+  ASSERT(Object::tags_offset() == 0);
+  __ sub(R3, TMP2, Operand(kHeapObjectTag));
+  // R3: Untagged address of header word (ldxr/stxr do not support offsets).
+  __ Bind(&marking_retry);
+  __ ldxr(R2, R3, kWord);
+  __ tbz(&lost_race, R2, RawObject::kOldAndNotMarkedBit);
+  __ AndImmediate(R2, R2, ~(1 << RawObject::kOldAndNotMarkedBit));
+  __ stxr(R1, R2, R3, kWord);
+  __ cbnz(&marking_retry, R1);
+
+  __ LoadFromOffset(R1, THR, Thread::marking_stack_block_offset());
+  __ LoadFromOffset(R2, R1, MarkingStackBlock::top_offset(), kUnsignedWord);
+  __ add(R3, R1, Operand(R2, LSL, kWordSizeLog2));
+  __ StoreToOffset(TMP2, R3, MarkingStackBlock::pointers_offset());
+  __ add(R2, R2, Operand(1));
+  __ StoreToOffset(R2, R1, MarkingStackBlock::top_offset(), kUnsignedWord);
+  __ CompareImmediate(R2, MarkingStackBlock::kSize);
+  __ Pop(R3);  // Unspill.
+  __ Pop(R2);  // Unspill.
+  __ Pop(R1);  // Unspill.
+  __ b(&marking_overflow, EQ);
+  __ ret();
+
+  __ Bind(&marking_overflow);
+  __ Push(CODE_REG);
+  __ ldr(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ EnterCallRuntimeFrame(0 * kWordSize);
+  __ mov(R0, THR);
+  __ CallRuntime(kMarkingStackBlockProcessRuntimeEntry, 1);
+  __ LeaveCallRuntimeFrame();
+  __ Pop(CODE_REG);
+  __ ret();
+
+  __ Bind(&lost_race);
+  __ Pop(R3);  // Unspill.
+  __ Pop(R2);  // Unspill.
+  __ Pop(R1);  // Unspill.
+  __ ret();
 #endif
 }
 
@@ -1992,11 +2033,6 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   __ Stop("Not using interpreter")
 #else
-  if (!FLAG_enable_interpreter) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
   __ SetPrologueOffset();
   __ EnterStubFrame();
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index f6a2790..a316199 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -979,10 +979,6 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   __ Stop("Not using interpreter");
 #else
-  if (!FLAG_enable_interpreter) {
-    __ Stop("Not using interpreter");
-    return;
-  }
   // Save frame pointer coming in.
   __ EnterFrame(0);
 
@@ -1331,7 +1327,48 @@
 
 #if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
-  __ Stop("Incremental barrier");
+  __ pushq(RAX);  // Spill.
+  __ pushq(RCX);  // Spill.
+
+  // Atomically clear kOldAndNotMarkedBit.
+  // Note that we use 32 bit operations here to match the size of the
+  // background marker which is also manipulating this 32 bit word.
+  Label retry, lost_race, marking_overflow;
+  __ movl(RAX, FieldAddress(TMP, Object::tags_offset()));
+  __ Bind(&retry);
+  __ movl(RCX, RAX);
+  __ testl(RCX, Immediate(1 << RawObject::kOldAndNotMarkedBit));
+  __ j(ZERO, &lost_race);  // Marked by another thread.
+  __ andl(RCX, Immediate(~(1 << RawObject::kOldAndNotMarkedBit)));
+  __ LockCmpxchgl(FieldAddress(TMP, Object::tags_offset()), RCX);
+  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
+
+  __ movq(RAX, Address(THR, Thread::marking_stack_block_offset()));
+  __ movl(RCX, Address(RAX, MarkingStackBlock::top_offset()));
+  __ movq(Address(RAX, RCX, TIMES_8, MarkingStackBlock::pointers_offset()),
+          TMP);
+  __ incq(RCX);
+  __ movl(Address(RAX, MarkingStackBlock::top_offset()), RCX);
+  __ cmpl(RCX, Immediate(MarkingStackBlock::kSize));
+  __ popq(RCX);  // Unspill.
+  __ popq(RAX);  // Unspill.
+  __ j(EQUAL, &marking_overflow, Assembler::kNearJump);
+  __ ret();
+
+  __ Bind(&marking_overflow);
+  __ pushq(CODE_REG);
+  __ movq(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ EnterCallRuntimeFrame(0);
+  __ movq(CallingConventions::kArg1Reg, THR);
+  __ CallRuntime(kMarkingStackBlockProcessRuntimeEntry, 1);
+  __ LeaveCallRuntimeFrame();
+  __ popq(CODE_REG);
+  __ ret();
+
+  __ Bind(&lost_race);
+  __ popq(RCX);  // Unspill.
+  __ popq(RAX);  // Unspill.
+  __ ret();
 #endif
 }
 
@@ -2008,10 +2045,6 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   __ Stop("Not using interpreter");
 #else
-  if (!FLAG_enable_interpreter) {
-    __ Stop("Not using interpreter");
-    return;
-  }
   __ EnterStubFrame();
 
 #if defined(DEBUG)
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 5bb99f2..2ff06b8 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -32,6 +32,8 @@
 Thread::~Thread() {
   // We should cleanly exit any isolate before destruction.
   ASSERT(isolate_ == NULL);
+  ASSERT(store_buffer_block_ == NULL);
+  ASSERT(marking_stack_block_ == NULL);
   if (compiler_stats_ != NULL) {
     delete compiler_stats_;
     compiler_stats_ = NULL;
@@ -67,10 +69,11 @@
       end_(0),
       top_exit_frame_info_(0),
       store_buffer_block_(NULL),
+      marking_stack_block_(NULL),
       vm_tag_(0),
-      task_kind_(kUnknownTask),
       async_stack_trace_(StackTrace::null()),
       unboxed_int64_runtime_arg_(0),
+      task_kind_(kUnknownTask),
       dart_stream_(NULL),
       os_thread_(NULL),
       thread_lock_(new Monitor()),
@@ -333,6 +336,10 @@
     ASSERT(thread->store_buffer_block_ == NULL);
     thread->task_kind_ = kMutatorTask;
     thread->StoreBufferAcquire();
+    if (isolate->marking_stack() != NULL) {
+      // Concurrent mark in progress. Enable barrier for this thread.
+      thread->MarkingStackAcquire();
+    }
     return true;
   }
   return false;
@@ -348,6 +355,9 @@
   ASSERT(thread->execution_state() == Thread::kThreadInVM);
   // Clear since GC will not visit the thread once it is unscheduled.
   thread->ClearReusableHandles();
+  if (thread->is_marking()) {
+    thread->MarkingStackRelease();
+  }
   thread->StoreBufferRelease();
   if (isolate->is_runnable()) {
     thread->set_vm_tag(VMTag::kIdleTagId);
@@ -371,6 +381,10 @@
     // before Scavenge.
     thread->store_buffer_block_ =
         thread->isolate()->store_buffer()->PopEmptyBlock();
+    if (isolate->marking_stack() != NULL) {
+      // Concurrent mark in progress. Enable barrier for this thread.
+      thread->MarkingStackAcquire();
+    }
     // This thread should not be the main mutator.
     thread->task_kind_ = kind;
     ASSERT(!thread->IsMutatorThread());
@@ -387,6 +401,9 @@
   thread->task_kind_ = kUnknownTask;
   // Clear since GC will not visit the thread once it is unscheduled.
   thread->ClearReusableHandles();
+  if (thread->is_marking()) {
+    thread->MarkingStackRelease();
+  }
   thread->StoreBufferRelease();
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
@@ -394,7 +411,7 @@
   isolate->UnscheduleThread(thread, kIsNotMutatorThread, bypass_safepoint);
 }
 
-void Thread::PrepareForGC() {
+void Thread::ReleaseStoreBuffer() {
   ASSERT(IsAtSafepoint());
   // Prevent scheduling another GC by ignoring the threshold.
   ASSERT(store_buffer_block_ != NULL);
@@ -526,6 +543,7 @@
       }
       heap()->CollectGarbage(Heap::kNew);
     }
+    heap()->CheckFinishConcurrentMarking(this);
   }
   if ((interrupt_bits & kMessageInterrupt) != 0) {
     MessageHandler::MessageStatus status =
@@ -584,6 +602,31 @@
   store_buffer_block_ = isolate()->store_buffer()->PopNonFullBlock();
 }
 
+void Thread::MarkingStackBlockProcess() {
+  MarkingStackRelease();
+  MarkingStackAcquire();
+}
+
+void Thread::MarkingStackAddObject(RawObject* obj) {
+  marking_stack_block_->Push(obj);
+  if (marking_stack_block_->IsFull()) {
+    MarkingStackBlockProcess();
+  }
+}
+
+void Thread::MarkingStackRelease() {
+  MarkingStackBlock* block = marking_stack_block_;
+  marking_stack_block_ = NULL;
+  write_barrier_mask_ = RawObject::kGenerationalBarrierMask;
+  isolate()->marking_stack()->PushBlock(block);
+}
+
+void Thread::MarkingStackAcquire() {
+  marking_stack_block_ = isolate()->marking_stack()->PopEmptyBlock();
+  write_barrier_mask_ =
+      RawObject::kGenerationalBarrierMask | RawObject::kIncrementalBarrierMask;
+}
+
 bool Thread::IsMutatorThread() const {
   return ((isolate_ != NULL) && (isolate_->mutator_thread() == this));
 }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index d17fc3a..c6b485b 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -240,7 +240,9 @@
   static void ExitIsolateAsHelper(bool bypass_safepoint = false);
 
   // Empties the store buffer block into the isolate.
-  void PrepareForGC();
+  void ReleaseStoreBuffer();
+  void AcquireMarkingStack();
+  void ReleaseMarkingStack();
 
   void SetStackLimit(uword value);
   void ClearStackLimit();
@@ -422,6 +424,13 @@
     return OFFSET_OF(Thread, store_buffer_block_);
   }
 
+  bool is_marking() const { return marking_stack_block_ != NULL; }
+  void MarkingStackAddObject(RawObject* obj);
+  void MarkingStackBlockProcess();
+  static intptr_t marking_stack_block_offset() {
+    return OFFSET_OF(Thread, marking_stack_block_);
+  }
+
   uword top_exit_frame_info() const { return top_exit_frame_info_; }
   void set_top_exit_frame_info(uword top_exit_frame_info) {
     top_exit_frame_info_ = top_exit_frame_info;
@@ -806,8 +815,8 @@
   uword end_;
   uword top_exit_frame_info_;
   StoreBufferBlock* store_buffer_block_;
+  MarkingStackBlock* marking_stack_block_;
   uword vm_tag_;
-  TaskKind task_kind_;
   RawStackTrace* async_stack_trace_;
   // Memory location dedicated for passing unboxed int64 values from
   // generated code to runtime.
@@ -833,7 +842,9 @@
     defined(TARGET_ARCH_X64)
   uword write_barrier_wrappers_entry_points_[kNumberOfDartAvailableCpuRegs];
 #endif
+  // End accessed from generated code.
 
+  TaskKind task_kind_;
   TimelineStream* dart_stream_;
   OSThread* os_thread_;
   Monitor* thread_lock_;
@@ -903,6 +914,9 @@
       StoreBuffer::ThresholdPolicy policy = StoreBuffer::kCheckThreshold);
   void StoreBufferAcquire();
 
+  void MarkingStackRelease();
+  void MarkingStackAcquire();
+
   void set_zone(Zone* zone) { zone_ = zone; }
 
   void set_safepoint_state(uint32_t value) { safepoint_state_ = value; }
diff --git a/runtime/vm/thread_registry.cc b/runtime/vm/thread_registry.cc
index 220f32c..b1bcb2c 100644
--- a/runtime/vm/thread_registry.cc
+++ b/runtime/vm/thread_registry.cc
@@ -78,12 +78,34 @@
   }
 }
 
-void ThreadRegistry::PrepareForGC() {
+void ThreadRegistry::ReleaseStoreBuffers() {
   MonitorLocker ml(threads_lock());
   Thread* thread = active_list_;
   while (thread != NULL) {
     if (!thread->BypassSafepoints()) {
-      thread->PrepareForGC();
+      thread->ReleaseStoreBuffer();
+    }
+    thread = thread->next_;
+  }
+}
+
+void ThreadRegistry::AcquireMarkingStacks() {
+  MonitorLocker ml(threads_lock());
+  Thread* thread = active_list_;
+  while (thread != NULL) {
+    if (!thread->BypassSafepoints()) {
+      thread->MarkingStackAcquire();
+    }
+    thread = thread->next_;
+  }
+}
+
+void ThreadRegistry::ReleaseMarkingStacks() {
+  MonitorLocker ml(threads_lock());
+  Thread* thread = active_list_;
+  while (thread != NULL) {
+    if (!thread->BypassSafepoints()) {
+      thread->MarkingStackRelease();
     }
     thread = thread->next_;
   }
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h
index f2426d5..2d6ad35 100644
--- a/runtime/vm/thread_registry.h
+++ b/runtime/vm/thread_registry.h
@@ -31,7 +31,11 @@
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor,
                            ValidationPolicy validate_frames);
-  void PrepareForGC();
+
+  void ReleaseStoreBuffers();
+  void AcquireMarkingStacks();
+  void ReleaseMarkingStacks();
+
   Thread* mutator_thread() const { return mutator_thread_; }
 
 #ifndef PRODUCT
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index f5d7f87..dc76612 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -39,7 +39,7 @@
 
 DEFINE_FLAG(bool,
             use_dart_frontend,
-            false,
+            true,
             "Parse scripts with Dart-to-Kernel parser");
 
 DECLARE_FLAG(bool, strong);
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index df1bfe8..78186e9 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -57,6 +57,17 @@
     zx_object_set_property(vmo, ZX_PROP_NAME, name, strlen(name));
   }
 
+  if (is_executable) {
+    // Add ZX_PERM_EXECUTE permission to VMO, so it can be mapped
+    // into memory as executable.
+    status = zx_vmo_replace_as_executable(vmo, ZX_HANDLE_INVALID, &vmo);
+    if (status != ZX_OK) {
+      LOG_ERR("zx_vmo_replace_as_executable() failed: %s\n",
+              zx_status_get_string(status));
+      return NULL;
+    }
+  }
+
   const uint32_t flags = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE |
                          (is_executable ? ZX_VM_PERM_EXECUTE : 0);
   uword address;
@@ -94,6 +105,17 @@
     zx_object_set_property(vmo, ZX_PROP_NAME, name, strlen(name));
   }
 
+  if (is_executable) {
+    // Add ZX_PERM_EXECUTE permission to VMO, so it can be mapped
+    // into memory as executable.
+    status = zx_vmo_replace_as_executable(vmo, ZX_HANDLE_INVALID, &vmo);
+    if (status != ZX_OK) {
+      LOG_ERR("zx_vmo_replace_as_executable() failed: %s\n",
+              zx_status_get_string(status));
+      return NULL;
+    }
+  }
+
   const zx_vm_option_t options = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE |
                                  (is_executable ? ZX_VM_PERM_EXECUTE : 0);
   uword base;
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 424f486..c5341d9 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -38,7 +38,6 @@
 
  private:
   Isolate* isolate_;
-  NoSafepointScope no_safepoints_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectPointerVisitor);
 };
diff --git a/samples/samples.status b/samples/samples.status
index bf9f1fc..2d1d4b8 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -23,6 +23,9 @@
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
+
 [ $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
 sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
 sample_extension/test/sample_extension_script_snapshot_test: RuntimeError
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index e9d3862..241e7d2 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -396,7 +396,7 @@
 int _stdoutFD = 1;
 int _stderrFD = 2;
 
-// This is an embedder entrypoint.
+@pragma('vm:entry-point')
 void _setStdioFDs(int stdin, int stdout, int stderr) {
   _stdinFD = stdin;
   _stdoutFD = stdout;
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 455498a..e6407d2 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -909,6 +909,8 @@
 Utils/tests/Expect/setEquals_A01_t02: CompileTimeError # Uses Dart 1 constants
 
 [ !$strong ]
+Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError
+Language/Libraries_and_Scripts/Exports/reexport_t02: MissingCompileTimeError
 LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError # Assumes no close after error.
 LibTest/async/Stream/firstWhere_A01_t01: RuntimeError # co19 issue 137
 LibTest/async/Stream/firstWhere_A02_t01: RuntimeError # co19 issue 137
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 456721c..a018bea 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -11,6 +11,8 @@
 Language/Expressions/Method_Invocation/Ordinary_Invocation/static_type_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
+Language/Libraries_and_Scripts/Exports/same_name_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
+Language/Libraries_and_Scripts/Imports/library_name_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Types/Parameterized_Types/arity_mismatch_t01: CompileTimeError
 Language/Types/Parameterized_Types/arity_mismatch_t05: CompileTimeError
 Language/Types/Parameterized_Types/arity_mismatch_t07: CompileTimeError
@@ -62,6 +64,8 @@
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
+Language/Classes/Constructors/Factories/arguments_type_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
+Language/Classes/Constructors/Factories/function_type_t01: CompileTimeError # Expects a warning but this is an error in Dart 2
 Language/Classes/Constructors/Generative_Constructors/static_type_t01: CompileTimeError
 Language/Classes/Constructors/name_t01: MissingCompileTimeError
 Language/Classes/Constructors/name_t02: MissingCompileTimeError
@@ -556,6 +560,7 @@
 Language/Expressions/Instance_Creation/New/execution_t13: CompileTimeError
 Language/Expressions/Instance_Creation/New/named_constructor_t01: CompileTimeError
 Language/Expressions/Instance_Creation/New/named_constructor_t02: CompileTimeError
+Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t01: CompileTimeError # Issue 33308
 Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: CompileTimeError
 Language/Expressions/Instance_Creation/New/type_argument_t01: CompileTimeError
 Language/Expressions/Instance_Creation/New/type_t01: CompileTimeError
@@ -917,7 +922,6 @@
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_getters_type_t06: CompileTimeError
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_getters_type_t07: CompileTimeError
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_getters_type_t08: CompileTimeError
-Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError
 Language/Libraries_and_Scripts/Exports/show_hide_t01: CompileTimeError
 Language/Libraries_and_Scripts/Exports/show_hide_t02: CompileTimeError
 Language/Libraries_and_Scripts/Exports/syntax_t02: CompileTimeError
@@ -1317,6 +1321,7 @@
 LibTest/core/AssertionError/AssertionError_A01_t01: CompileTimeError
 LibTest/core/AssertionError/message_A01_t01: CompileTimeError
 LibTest/core/AssertionError/toString_A01_t01: CompileTimeError
+LibTest/core/Duration/Duration_A02_t01: CompileTimeError
 LibTest/core/FallThroughError/toString_A01_t02: CompileTimeError
 LibTest/core/Invocation/isAccessor_A01_t01: CompileTimeError
 LibTest/core/Invocation/isAccessor_A01_t02: CompileTimeError
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index c2c3fd3..7be5f14 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -2,424 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $compiler == precompiler ]
-Language/Expressions/Throw/stack_trace_t01: Skip # Dart 1 AOT to be retired soon.
-LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Timeout
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Pass, Timeout
-LibTest/core/Map/Map_class_A01_t04: Pass, Timeout
-LibTest/core/Uri/encodeQueryComponent_A01_t02: Pass, Timeout
-
-[ $runtime == dart_precompiled ]
-Language/Expressions/Null/instance_of_class_null_t01: Skip # Uses dart:mirrors
-Language/Metadata/*: SkipByDesign # Uses dart:mirrors
-LibTest/isolate/Isolate/spawnUri*: SkipByDesign # Isolate.spawnUri
-
-#
-# flutter runs with --error-on-bad-type so the following two tests end up
-# with errors and pass
-#
-[ $runtime == flutter ]
-Language/Classes/Abstract_Instance_Members/override_more_required_parameters_t01: CompileTimeError
-Language/Classes/Abstract_Instance_Members/override_no_named_parameters_t01: CompileTimeError
-Language/Classes/Abstract_Instance_Members/override_not_a_subtype_t01: CompileTimeError
-Language/Classes/Abstract_Instance_Members/override_not_a_subtype_t03: CompileTimeError
-Language/Classes/Constructors/Factories/function_type_t01: CompileTimeError
-Language/Classes/Constructors/Factories/function_type_t02: CompileTimeError
-Language/Classes/Constructors/Factories/redirecting_constructor_call_t02: CompileTimeError
-Language/Classes/Getters/override_t01: CompileTimeError
-Language/Classes/Getters/override_t02: CompileTimeError
-Language/Classes/Getters/override_t03: CompileTimeError
-Language/Classes/Instance_Methods/override_fewer_parameters_t01: CompileTimeError
-Language/Classes/Instance_Methods/override_fewer_parameters_t02: CompileTimeError
-Language/Classes/Instance_Methods/override_more_parameters_t01: CompileTimeError
-Language/Classes/Instance_Methods/override_more_parameters_t02: CompileTimeError
-Language/Classes/Instance_Methods/override_named_parameters_t01: CompileTimeError
-Language/Classes/Instance_Methods/override_named_parameters_t02: CompileTimeError
-Language/Classes/Instance_Methods/override_named_parameters_t05: CompileTimeError
-Language/Classes/Instance_Methods/override_subtype_t01: CompileTimeError
-Language/Classes/Instance_Methods/override_subtype_t02: CompileTimeError
-Language/Classes/Instance_Methods/override_subtype_t03: CompileTimeError
-Language/Classes/Instance_Methods/override_subtype_t04: CompileTimeError
-Language/Classes/Setters/override_t01: CompileTimeError
-Language/Classes/Setters/override_t02: CompileTimeError
-Language/Errors_and_Warnings/static_warning_t01: CompileTimeError
-Language/Expressions/Assignment/expression_assignment_failed_t06: CompileTimeError
-Language/Expressions/Assignment/super_assignment_failed_t05: CompileTimeError
-Language/Expressions/Await_Expressions/syntax_t07: CompileTimeError
-Language/Expressions/Await_Expressions/syntax_t08: CompileTimeError
-Language/Expressions/Await_Expressions/syntax_t09: CompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t01: CompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: Pass
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t19: Pass
-Language/Expressions/Instance_Creation/New/evaluation_t03: CompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t16: CompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t17: CompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t18: CompileTimeError
-Language/Expressions/Instance_Creation/New/generic_type_t01: CompileTimeError
-Language/Expressions/Instance_Creation/New/generic_type_t02: CompileTimeError
-Language/Expressions/Instance_Creation/New/generic_type_t03: CompileTimeError
-Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: CompileTimeError
-Language/Expressions/Instance_Creation/New/type_argument_t01: CompileTimeError
-Language/Expressions/Instance_Creation/New/type_t01: CompileTimeError
-Language/Expressions/Instance_Creation/New/type_t02: CompileTimeError
-Language/Expressions/Instance_Creation/New/type_t03: CompileTimeError
-Language/Expressions/Instance_Creation/New/type_t05: CompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t01: CompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t03: CompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t07: CompileTimeError
-Language/Expressions/Null/instance_of_class_null_t01: CompileTimeError
-Language/Expressions/Type_Cast/evaluation_t04: CompileTimeError
-Language/Expressions/Type_Cast/evaluation_t05: CompileTimeError
-Language/Expressions/Type_Cast/evaluation_t06: CompileTimeError
-Language/Expressions/Type_Cast/evaluation_t07: CompileTimeError
-Language/Expressions/Type_Cast/evaluation_t08: CompileTimeError
-Language/Expressions/Type_Cast/evaluation_t09: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t03: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t04: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t05: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t06: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t07: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t08: CompileTimeError
-Language/Expressions/Type_Test/evaluation_t09: CompileTimeError
-Language/Generics/malformed_t02: CompileTimeError
-Language/Generics/scope_t06: CompileTimeError
-Language/Generics/upper_bound_t01: CompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t19: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t01: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t05: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t06: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t08: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t11: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t16: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t18: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t19: CompileTimeError
-Language/Metadata/before_class_t01: CompileTimeError
-Language/Metadata/before_ctor_t01: CompileTimeError
-Language/Metadata/before_ctor_t02: CompileTimeError
-Language/Metadata/before_export_t01: CompileTimeError
-Language/Metadata/before_factory_t01: CompileTimeError
-Language/Metadata/before_function_t01: CompileTimeError
-Language/Metadata/before_function_t02: CompileTimeError
-Language/Metadata/before_function_t03: CompileTimeError
-Language/Metadata/before_function_t04: CompileTimeError
-Language/Metadata/before_function_t05: CompileTimeError
-Language/Metadata/before_function_t06: CompileTimeError
-Language/Metadata/before_function_t07: CompileTimeError
-Language/Metadata/before_import_t01: CompileTimeError
-Language/Metadata/before_library_t01: CompileTimeError
-Language/Metadata/before_param_t01: CompileTimeError
-Language/Metadata/before_param_t02: CompileTimeError
-Language/Metadata/before_param_t03: CompileTimeError
-Language/Metadata/before_param_t04: CompileTimeError
-Language/Metadata/before_param_t05: CompileTimeError
-Language/Metadata/before_param_t06: CompileTimeError
-Language/Metadata/before_param_t07: CompileTimeError
-Language/Metadata/before_param_t08: CompileTimeError
-Language/Metadata/before_param_t09: CompileTimeError
-Language/Metadata/before_type_param_t01: CompileTimeError
-Language/Metadata/before_typedef_t01: CompileTimeError
-Language/Metadata/before_variable_t01: CompileTimeError
-Language/Metadata/before_variable_t02: CompileTimeError
-Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError
-Language/Mixins/Mixin_Application/warning_t01: CompileTimeError
-Language/Mixins/Mixin_Application/warning_t02: CompileTimeError
-Language/Mixins/Mixin_Application/warning_t03: CompileTimeError
-Language/Overview/Privacy/private_and_public_t02: CompileTimeError
-Language/Overview/Privacy/private_and_public_t06: CompileTimeError
-Language/Overview/Scoping/hiding_declaration_t28: CompileTimeError
-Language/Statements/Try/malformed_type_t01: CompileTimeError
-Language/Statements/Try/malformed_type_t02: CompileTimeError
-Language/Statements/Try/malformed_type_t03: CompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: Pass
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: Pass
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: Pass
-Language/Types/Dynamic_Type_System/malbounded_type_error_t01: CompileTimeError
-Language/Types/Parameterized_Types/Actual_Type_of_Declaration/actual_type_t02: CompileTimeError
-Language/Types/Parameterized_Types/Actual_Type_of_Declaration/actual_type_t03: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t01: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t02: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t03: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t04: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t05: CompileTimeError
-Language/Types/Parameterized_Types/arity_mismatch_t06: CompileTimeError
-Language/Types/Parameterized_Types/malbounded_t01: CompileTimeError
-Language/Types/Parameterized_Types/malbounded_t02: CompileTimeError
-Language/Types/Parameterized_Types/malbounded_t03: CompileTimeError
-Language/Types/Parameterized_Types/malbounded_t04: CompileTimeError
-Language/Types/Parameterized_Types/malbounded_t05: CompileTimeError
-Language/Types/Parameterized_Types/malbounded_t06: CompileTimeError
-Language/Types/Static_Types/malformed_type_t01: CompileTimeError
-Language/Types/Static_Types/malformed_type_t02: CompileTimeError
-Language/Types/Static_Types/malformed_type_t03: CompileTimeError
-Language/Types/Static_Types/malformed_type_t04: CompileTimeError
-Language/Types/Static_Types/malformed_type_t05: CompileTimeError
-Language/Types/Static_Types/malformed_type_t06: CompileTimeError
-LibTest/async/Future/doWhile_A05_t01: Pass, RuntimeError # Flutter Issue 9109
-LibTest/async/Future/forEach_A04_t02: Pass, RuntimeError # Flutter Issue 9109
-LibTest/async/Stream/timeout_A01_t01: Pass, RuntimeError # Flutter Issue 9109
-LibTest/async/Stream/timeout_A03_t01: Pass, RuntimeError # Flutter Issue 9109
-LibTest/async/Stream/timeout_A04_t01: Pass, RuntimeError # Flutter Issue 9109
-LibTest/async/StreamController/StreamController.broadcast_A04_t01: Pass, RuntimeError # Flutter Issue 9109
-LibTest/collection/DoubleLinkedQueueEntry/append_A01_t01: Pass, Timeout # Flutter Issue 9109
-LibTest/collection/LinkedList/addFirst_A01_t01: Pass, Timeout # Flutter Issue 9109
-LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t04: Pass, Timeout
-LibTest/isolate/Isolate/spawnUri*: Skip # spawnUri is not supported by flutter
-LibTest/isolate/ReceivePort/sendPort_A01_t01: Pass, Timeout # Flutter Issue 9109
-LibTest/typed_data/Int32List/buffer_A01_t02: Pass, Timeout # Flutter Issue 9109
-
-[ $runtime == vm ]
-Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: MissingCompileTimeError # Issue 114
-LibTest/isolate/Isolate/spawnUri_A01_t06: Pass, Fail # Issue 28269, These tests are timing dependent and should be non-flaky once the fix for https://github.com/dart-lang/co19/issues/86 is merged into master. (They are skipped on $runtime == pre_compiled below.)
-LibTest/isolate/Isolate/spawnUri_A01_t07: Pass, Fail # Issue 28269, These tests are timing dependent and should be non-flaky once the fix for https://github.com/dart-lang/co19/issues/86 is merged into master. (They are skipped on $runtime == pre_compiled below.)
-LibTest/isolate/Isolate/spawn_A04_t01: Pass, Fail # Issue 28269, These tests are timing dependent and should be non-flaky once the fix for https://github.com/dart-lang/co19/issues/86 is merged into master. (They are skipped on $runtime == pre_compiled below.)
-
-[ $system == windows ]
-LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Slow
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Pass, Slow
-
-[ $fasta ]
-Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: Crash
-Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
-Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
-
-[ $arch == arm64 && ($compiler == none || $compiler == precompiler) && ($runtime == dart_precompiled || $runtime == vm) ]
-LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
-LibTest/core/List/List_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
-
-[ $arch == ia32 && $mode == release && $runtime == vm && $system == linux ]
-service/dev_fs_spawn_test: Pass, Fail # Issue 28411
-
-[ $arch == simarm && $compiler == precompiler && $runtime == dart_precompiled ]
-LibTest/typed_data/Float32x4/operator_division_A01_t02: RuntimeError # Issue #26675
-
-[ $builder_tag == asan && $mode == debug && ($runtime == dart_precompiled || $runtime == vm) ]
-Language/Types/Interface_Types/subtype_t27: Skip # Issue 21174.
-
-[ $compiler == none && $runtime == vm && $system == fuchsia ]
-*: Skip # Tests not included in the image.
-
-[ $compiler == precompiler && $runtime == dart_precompiled && $system == android ]
-*: Skip # Issue 27294
-Language/Expressions/Object_Identity/double_t02: RuntimeError # Issue #26374
-LibTest/math/log_A01_t01: RuntimeError # Precision of Math.log (Issue #18998)
-
-[ $mode == debug && ($arch == simdbc || $arch == simdbc64) ]
-LibTest/collection/ListBase/ListBase_class_A01_t02: Timeout # TODO(vegorov) These tests are very slow on unoptimized SIMDBC
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Timeout # TODO(vegorov) These tests are very slow on unoptimized SIMDBC
-
-[ $mode == debug && ($runtime == dart_precompiled || $runtime == vm) ]
-LibTest/core/List/List_class_A01_t02: Pass, Slow
-
-[ $mode == release && $runtime == vm && $system == linux && ($arch == ia32 || $arch == x64) ]
-LibTest/isolate/Isolate/spawn_A04_t05: Pass, Slow
-
-# Obfuscated mode expectations
-[ $runtime == dart_precompiled && $minified ]
-Language/Enums/declaration_equivalent_t01: Skip # Enum.toString is obfuscated.
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: Skip # Uses new Symbol() instead of const Symbol()
-LibTest/core/Symbol/Symbol_A01_t01: Skip # Uses new Symbol()
-
-[ $runtime != none && !$strong ]
-LibTest/typed_data/Float32x4List/first_A01_t02: RuntimeError # co19 issue 130 + type error
-LibTest/typed_data/Float32x4List/last_A01_t02: RuntimeError # co19 issue 130 + type error
-
-[ $runtime == vm && $checked ]
-LibTest/typed_data/Float32List/reduce_A01_t01: Fail # These tests fail in checked mode because they are incorrect.
-LibTest/typed_data/Float64List/add_A01_t01: Fail # These tests fail in checked mode because they are incorrect.
-LibTest/typed_data/Float64List/firstWhere_A02_t01: Fail # These tests fail in checked mode because they are incorrect.
-LibTest/typed_data/Float64List/reduce_A01_t01: Fail # These tests fail in checked mode because they are incorrect.
-
-[ ($arch == simarm || $arch == simarm64 || $arch == simarmv5te || $arch == simarmv6 || $arch == simdbc || $arch == simdbc64) && ($runtime == dart_precompiled || $runtime == vm) ]
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Skip # Timeout
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: Skip # Timeout
-LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: Skip # Timeout
-LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # Timeout
-LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # Timeout
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # Timeout
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # Timeout
-LibTest/core/Uri/Uri_A06_t03: Skip # Timeout
-
-[ $compiler == app_jit || $compiler == precompiler ]
-Language/Mixins/Mixin_Application/error_t01: Pass
-Language/Mixins/Mixin_Application/error_t02: Pass
-Language/Mixins/declaring_constructor_t01: Pass
-
-[ $compiler == app_jit || $compiler == precompiler || $mode == product || $runtime == flutter ]
-Language/Libraries_and_Scripts/Imports/deferred_import_t01: Skip # Eager loading
-Language/Libraries_and_Scripts/Imports/deferred_import_t02: Skip # Eager loading
-Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t01: Skip # Eager loading
-Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t02: Skip # Eager loading
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
-Language/Classes/definition_t24: MissingCompileTimeError # Issue co19 #129, sdk issue #31624
-Language/Expressions/Assignment/super_assignment_failed_t05: RuntimeError # Issue 25671
-Language/Expressions/Constants/literal_number_t01: CompileTimeError # Large integer literal
-Language/Expressions/Constants/math_operators_t01: CompileTimeError # Large integer literal
-Language/Expressions/Constants/math_operators_t06: CompileTimeError # Large integer literal
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail # Issue 25967
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail # Issue 25967
-Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
-Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
-Language/Expressions/Numbers/static_type_of_int_t01: CompileTimeError # Large integer literal
-Language/Expressions/Numbers/syntax_t06: CompileTimeError # Large integer literal
-Language/Expressions/Numbers/syntax_t09: CompileTimeError # Large integer literal
-Language/Expressions/Numbers/syntax_t10: CompileTimeError # Large integer literal
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t01: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t02: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t03: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t04: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t05: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t06: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t07: MissingCompileTimeError # Issue 24332
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Issue 24332
-Language/Libraries_and_Scripts/Exports/invalid_uri_t02: Fail
-Language/Libraries_and_Scripts/Exports/reexport_t01: Fail # Dart issue 12916
-Language/Libraries_and_Scripts/Exports/reexport_t02: MissingCompileTimeError, Fail # Dart issue 12916
-Language/Libraries_and_Scripts/Imports/invalid_uri_t02: Fail
-Language/Libraries_and_Scripts/Parts/syntax_t06: Fail
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: Skip # Issue 29895
-Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError # Issue 25765
-Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
-Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
-Language/Statements/Assert/execution_t02: Skip # co19 issue 734
-Language/Statements/Assert/execution_t03: Skip # co19 issue 734
-Language/Statements/Assert/type_t02: Skip # co19 issue 734
-Language/Statements/Assert/type_t05: Skip # co19 issue 734
-Language/Statements/Labels/syntax_t03: Fail # Dart issue 2238
-Language/Statements/Switch/syntax_t02: Fail # Dart issue 12908
-Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError # Issue 25748
-Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError # Issue 25748
-Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
-Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
-Language/Types/Type_Void/syntax_t09: MissingCompileTimeError # Issue co19/30264
-LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
-LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Large integers
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Large integers
-LibTest/collection/Maps/*: Skip # Maps class no longer exists
-LibTest/core/Duration/inDays_A01_t01: RuntimeError # Large integers
-LibTest/core/Duration/inHours_A01_t01: RuntimeError # Large integers
-LibTest/core/Duration/inMilliseconds_A01_t01: RuntimeError # Large integers
-LibTest/core/Duration/inMinutes_A01_t01: RuntimeError # Large integers
-LibTest/core/Duration/inSeconds_A01_t01: RuntimeError # Large integers
-LibTest/core/List/List_class_A01_t01: RuntimeError # Large integers
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError, Fail # Issue 22200
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError, Fail # Issue 22200
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError, Fail # Issue 22200
-LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # Issue 13596
-LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # Issue 13596
-LibTest/core/double/ceil_A01_t04: RuntimeError # Large integers
-LibTest/core/double/floor_A01_t04: RuntimeError # Large integers
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError # Large integer literal
-LibTest/core/double/round_A01_t03: RuntimeError # Large integers
-LibTest/core/double/toInt_A01_t05: RuntimeError # Large integers
-LibTest/core/double/truncate_A01_t05: RuntimeError # Large integers
-LibTest/core/int/abs_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/ceil_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/compareTo_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/floor_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/isEven_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/isNaN_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/isNegative_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/isOdd_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_GT_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_LE_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_NOT_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_OR_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_division_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_left_shift_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_multiplication_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_remainder_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_remainder_A01_t02: CompileTimeError # Large integer literal
-LibTest/core/int/operator_right_shift_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/operator_truncating_division_A01_t02: CompileTimeError # Large integer literal
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/parse_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/remainder_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/remainder_A01_t02: CompileTimeError # Large integer literal
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/round_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/toDouble_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/toInt_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # Large integer literal
-LibTest/core/int/truncate_A01_t01: CompileTimeError # Large integer literal
-LibTest/html/*: SkipByDesign # dart:html not supported on VM.
-LibTest/isolate/Isolate/spawnUri_A02_t02: Skip # Issue 15974
-LibTest/isolate/Isolate/spawnUri_A02_t03: Skip # Issue 15974
-LibTest/isolate/Isolate/spawn_A02_t01: Skip # co19 issue 667
-LibTest/isolate/Isolate/spawn_A03_t02: Skip # Issue 15974
-LibTest/isolate/Isolate/spawn_A04_t01: Skip # Issue 15974
-LibTest/isolate/Isolate/spawn_A04_t03: Skip # Flaky, Issue 15974
-LibTest/isolate/Isolate/spawn_A04_t04: Skip # Issue 15974
-LibTest/isolate/Isolate/spawn_A06_t03: Skip # Issue 15974
-LibTest/isolate/Isolate/spawn_A06_t05: Skip # Issue 15974
-LibTest/math/pow_A10_t01: CompileTimeError # Large integer literal
-LibTest/typed_data/ByteData/getUint64_A01_t01: CompileTimeError # Large integer literal
-LibTest/typed_data/ByteData/setUint64_A01_t01: CompileTimeError # Large integer literal
-LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
-LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: CompileTimeError # Large integer literal
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: CompileTimeError # Large integer literal
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: CompileTimeError # Large integer literal
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError # Large integer literal
-WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
-
-[ $runtime == flutter || $hot_reload || $hot_reload_rollback ]
-Language/Expressions/Assignment/prefix_object_t02: Skip # Requires deferred libraries
-Language/Expressions/Constants/constant_constructor_t03: Skip # Requires deferred libraries
-Language/Expressions/Constants/identifier_denotes_a_constant_t06: Skip # Requires deferred libraries
-Language/Expressions/Constants/identifier_denotes_a_constant_t07: Skip # Requires deferred libraries
-Language/Expressions/Constants/static_constant_t06: Skip # Requires deferred libraries
-Language/Expressions/Constants/static_constant_t07: Skip # Requires deferred libraries
-Language/Expressions/Constants/top_level_function_t04: Skip # Requires deferred libraries
-Language/Expressions/Constants/top_level_function_t05: Skip # Requires deferred libraries
-Language/Expressions/Instance_Creation/Const/deferred_type_t01: Skip # Requires deferred libraries
-Language/Expressions/Instance_Creation/Const/deferred_type_t02: Skip # Requires deferred libraries
-Language/Expressions/Instance_Creation/New/evaluation_t19: Skip # Requires deferred libraries
-Language/Expressions/Instance_Creation/New/evaluation_t20: Skip # Requires deferred libraries
-Language/Expressions/Type_Cast/evaluation_t10: Skip # Requires deferred libraries
-Language/Expressions/Type_Test/evaluation_t10: Skip # Requires deferred libraries
-Language/Libraries_and_Scripts/Imports/deferred_import_t01: Skip # Requires deferred libraries
-Language/Libraries_and_Scripts/Imports/deferred_import_t02: Skip # Requires deferred libraries
-Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t01: Skip # Requires deferred libraries
-Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t02: Skip # Requires deferred libraries
-Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t03: Skip # Requires deferred libraries
-Language/Libraries_and_Scripts/Imports/static_type_t01: Skip # Requires deferred libraries
-Language/Types/Dynamic_Type_System/deferred_type_error_t01: Skip # Requires deferred libraries
-Language/Types/Static_Types/deferred_type_t01: Skip # Requires deferred libraries
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # Requires deferred libraries
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Pass, Slow
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: Pass, Timeout
-LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: Pass, Timeout
-LibTest/collection/ListBase/ListBase_class_A01_t01: Pass, Timeout
-LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Timeout
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Pass, Timeout
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Pass, Timeout
-LibTest/core/List/List_class_A01_t01: Pass, Timeout
-LibTest/core/List/List_class_A01_t02: Pass, Timeout
-LibTest/core/Map/Map_class_A01_t04: Pass, Timeout
-LibTest/core/Uri/Uri_A06_t03: Pass, Timeout
-LibTest/core/Uri/encodeQueryComponent_A01_t02: Pass, Timeout
-LibTest/isolate/Isolate/spawn_A01_t04: Pass, Timeout
-LibTest/isolate/ReceivePort/take_A01_t02: Skip # Issue 27773
-
-[ $hot_reload || $hot_reload_rollback ]
-LibTest/isolate/ReceivePort/firstWhere_A01_t01: Crash # Issue 33363
-LibTest/isolate/ReceivePort/firstWhere_A02_t01: Crash # Issue 33363
-LibTest/isolate/ReceivePort/lastWhere_A02_t01: Crash # Issue 33363
+*: SkipByDesign # Deprecating Dart1 tests.
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
index 8eaefac..054926b 100644
--- a/tests/co19_2/co19_2-analyzer.status
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -170,15 +170,14 @@
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t19: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t20: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t21: MissingCompileTimeError # Issue 34087
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t01: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t02: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t01: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t02: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t03: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t04: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t05: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t06: Crash # Issue 33152, 33477
-LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t07: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t01: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t02: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t01: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t02: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t03: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t05: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t06: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t07: MissingCompileTimeError # Issue 33152, 33477
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t10: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_pos_l1_t04: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_pos_l1_t05: CompileTimeError # Issue 33995
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index fdd22f1..b4cff1a 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -14,9 +14,6 @@
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError # Issue 34192
-Language/Classes/Constructors/Factories/arguments_type_t01: MissingCompileTimeError # Issue 33308
-Language/Classes/Constructors/Factories/function_type_t01: MissingCompileTimeError # Issue 31590
-Language/Classes/Constructors/Factories/function_type_t02: MissingCompileTimeError # Issue 31590
 Language/Classes/Constructors/Generative_Constructors/final_variables_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
 Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
@@ -116,8 +113,7 @@
 Language/Generics/syntax_t02: CompileTimeError
 Language/Generics/syntax_t03: CompileTimeError
 Language/Generics/upper_bound_t01: MissingCompileTimeError # Issue 33308
-Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError # Issue 12916
-Language/Libraries_and_Scripts/Exports/same_name_t01: MissingCompileTimeError # Issue 12916
+Language/Libraries_and_Scripts/Imports/library_name_t01: CompileTimeError # Test is wrong. Spec says error not warning.
 Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError # Issue 30273
 Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError # Mixin super equirement
 Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # The test even says in the comment it should be a compile time error
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index 9c6a5d9..3c16c3b 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_helper.dart
@@ -2,65 +2,195 @@
 // for 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:convert' as json;
+import 'dart:io';
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/diagnostics/source_span.dart';
 import 'package:compiler/src/library_loader.dart';
+import 'package:compiler/src/ir/static_type.dart';
 import 'package:compiler/src/ir/util.dart';
+import 'package:compiler/src/util/uri_extras.dart';
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../helpers/memory_compiler.dart';
 
-// TODO(johnniwinther): Update allowed-listing to mention specific properties.
-run(Uri entryPoint,
+run(Uri entryPoint, String allowedListPath, List<String> analyzedPaths,
     {Map<String, String> memorySourceFiles = const {},
-    Map<String, List<String>> allowedList,
-    bool verbose = false}) {
+    bool verbose = false,
+    bool generate = false}) {
   asyncTest(() async {
     Compiler compiler = await compilerFor(memorySourceFiles: memorySourceFiles);
     LoadedLibraries loadedLibraries =
         await compiler.libraryLoader.loadLibraries(entryPoint);
-    new DynamicVisitor(
-            compiler.reporter, loadedLibraries.component, allowedList)
-        .run(verbose: verbose);
+    new DynamicVisitor(compiler.reporter, loadedLibraries.component,
+            allowedListPath, analyzedPaths)
+        .run(verbose: verbose, generate: generate);
   });
 }
 
-// TODO(johnniwinther): Add improved type promotion to handle negative
-// reasoning.
-// TODO(johnniwinther): Use this visitor in kernel impact computation.
-abstract class StaticTypeVisitor extends ir.Visitor<ir.DartType> {
-  ir.Component get component;
-  ir.TypeEnvironment _typeEnvironment;
-  bool _isStaticTypePrepared = false;
+// TODO(johnniwinther): Handle dynamic access of Object properties/methods
+// separately.
+class DynamicVisitor extends StaticTypeTraversalVisitor {
+  final DiagnosticReporter reporter;
+  final ir.Component component;
+  final String _allowedListPath;
+  final List<String> analyzedPaths;
 
-  @override
-  ir.DartType defaultNode(ir.Node node) {
-    node.visitChildren(this);
-    return null;
-  }
+  Map _expectedJson = {};
+  Map<String, Map<String, List<DiagnosticMessage>>> _actualMessages = {};
 
-  @override
-  ir.DartType defaultExpression(ir.Expression node) {
-    defaultNode(node);
-    return getStaticType(node);
-  }
+  DynamicVisitor(
+      this.reporter, this.component, this._allowedListPath, this.analyzedPaths)
+      : super(new ir.TypeEnvironment(
+            new ir.CoreTypes(component), new ir.ClassHierarchy(component)));
 
-  ir.DartType getStaticType(ir.Expression node) {
-    if (!_isStaticTypePrepared) {
-      _isStaticTypePrepared = true;
-      try {
-        _typeEnvironment ??= new ir.TypeEnvironment(
-            new ir.CoreTypes(component), new ir.ClassHierarchy(component));
-      } catch (e) {}
+  void run({bool verbose = false, bool generate = false}) {
+    if (!generate) {
+      File file = new File(_allowedListPath);
+      if (file.existsSync()) {
+        try {
+          _expectedJson = json.jsonDecode(file.readAsStringSync());
+        } catch (e) {
+          Expect.fail('Error reading allowed list from $_allowedListPath: $e');
+        }
+      }
     }
-    if (_typeEnvironment == null) {
+    component.accept(this);
+    if (generate) {
+      Map<String, Map<String, int>> actualJson = {};
+      _actualMessages.forEach(
+          (String uri, Map<String, List<DiagnosticMessage>> actualMessagesMap) {
+        Map<String, int> map = {};
+        actualMessagesMap
+            .forEach((String message, List<DiagnosticMessage> actualMessages) {
+          map[message] = actualMessages.length;
+        });
+        actualJson[uri] = map;
+      });
+
+      new File(_allowedListPath).writeAsStringSync(
+          new json.JsonEncoder.withIndent('  ').convert(actualJson));
+      return;
+    }
+
+    int errorCount = 0;
+    _expectedJson.forEach((uri, expectedMessages) {
+      Map<String, List<DiagnosticMessage>> actualMessagesMap =
+          _actualMessages[uri];
+      if (actualMessagesMap == null) {
+        print("Error: Allowed-listing of uri '$uri' isn't used. "
+            "Remove it from the allowed-list.");
+        errorCount++;
+      } else {
+        expectedMessages.forEach((expectedMessage, expectedCount) {
+          List<DiagnosticMessage> actualMessages =
+              actualMessagesMap[expectedMessage];
+          if (actualMessages == null) {
+            print("Error: Allowed-listing of message '$expectedMessage' "
+                "in uri '$uri' isn't used. Remove it from the allowed-list.");
+            errorCount++;
+          } else {
+            int actualCount = actualMessages.length;
+            if (actualCount != expectedCount) {
+              print("Error: Unexpected count of allowed message "
+                  "'$expectedMessage' in uri '$uri'. "
+                  "Expected $expectedCount, actual $actualCount:");
+              print(
+                  '----------------------------------------------------------');
+              for (DiagnosticMessage message in actualMessages) {
+                reporter.reportError(message);
+              }
+              print(
+                  '----------------------------------------------------------');
+              errorCount++;
+            }
+          }
+        });
+        actualMessagesMap
+            .forEach((String message, List<DiagnosticMessage> actualMessages) {
+          if (!expectedMessages.containsKey(message)) {
+            for (DiagnosticMessage message in actualMessages) {
+              reporter.reportError(message);
+              errorCount++;
+            }
+          }
+        });
+        _actualMessages.forEach((String uri,
+            Map<String, List<DiagnosticMessage>> actualMessagesMap) {
+          if (!_expectedJson.containsKey(uri)) {
+            actualMessagesMap.forEach(
+                (String message, List<DiagnosticMessage> actualMessages) {
+              if (!expectedMessages.containsKey(message)) {
+                for (DiagnosticMessage message in actualMessages) {
+                  reporter.reportError(message);
+                  errorCount++;
+                }
+              }
+            });
+          }
+        });
+      }
+    });
+    if (errorCount != 0) {
+      print('$errorCount error(s) found.');
+      print("""
+
+********************************************************************************
+*  Unexpected dynamic invocations found by test:
+*
+*    ${relativize(Uri.base, Platform.script, Platform.isWindows)}
+*
+*  Please address the reported errors, or, if the errors are as expected, run
+*
+*    dart ${relativize(Uri.base, Platform.script, Platform.isWindows)} -g
+*
+*  to update the expectation file.
+********************************************************************************
+""");
+      exit(-1);
+    }
+    if (verbose) {
+      _actualMessages.forEach(
+          (String uri, Map<String, List<DiagnosticMessage>> actualMessagesMap) {
+        actualMessagesMap
+            .forEach((String message, List<DiagnosticMessage> actualMessages) {
+          for (DiagnosticMessage message in actualMessages) {
+            reporter.reportErrorMessage(message.sourceSpan, MessageKind.GENERIC,
+                {'text': '${message.message} (allowed)'});
+          }
+        });
+      });
+    } else {
+      int total = 0;
+      _actualMessages.forEach(
+          (String uri, Map<String, List<DiagnosticMessage>> actualMessagesMap) {
+        int count = 0;
+        actualMessagesMap
+            .forEach((String message, List<DiagnosticMessage> actualMessages) {
+          count += actualMessages.length;
+        });
+
+        print('${count} error(s) allowed in $uri');
+        total += count;
+      });
+      if (total > 0) {
+        print('${total} error(s) allowed in total.');
+      }
+    }
+  }
+
+  /// Pulls the static type from `getStaticType` on [node].
+  ir.DartType _getStaticTypeFromExpression(ir.Expression node) {
+    if (typeEnvironment == null) {
       // The class hierarchy crashes on multiple inheritance. Use `dynamic`
       // as static type.
       return const ir.DynamicType();
@@ -70,77 +200,36 @@
       enclosingClass = enclosingClass.parent;
     }
     try {
-      _typeEnvironment.thisType =
+      typeEnvironment.thisType =
           enclosingClass is ir.Class ? enclosingClass.thisType : null;
-      return node.getStaticType(_typeEnvironment);
+      return node.getStaticType(typeEnvironment);
     } catch (e) {
       // The static type computation crashes on type errors. Use `dynamic`
       // as static type.
       return const ir.DynamicType();
     }
   }
-}
 
-// TODO(johnniwinther): Handle dynamic access of Object properties/methods
-// separately.
-class DynamicVisitor extends StaticTypeVisitor {
-  final DiagnosticReporter reporter;
-  final ir.Component component;
-  final Map<String, List<String>> allowedList;
-  int _errorCount = 0;
-  Map<String, Set<String>> _encounteredAllowedListedErrors =
-      <String, Set<String>>{};
-  Map<Uri, List<DiagnosticMessage>> _allowedListedErrors =
-      <Uri, List<DiagnosticMessage>>{};
+  ir.DartType visitNode(ir.Node node) {
+    ir.DartType staticType = node?.accept(this);
+    assert(node is! ir.Expression ||
+        staticType == _getStaticTypeFromExpression(node));
+    return staticType;
+  }
 
-  DynamicVisitor(this.reporter, this.component, this.allowedList);
-
-  void run({bool verbose = false}) {
-    component.accept(this);
-    bool failed = false;
-    if (_errorCount != 0) {
-      print('$_errorCount error(s) found.');
-      failed = true;
-    }
-    allowedList.forEach((String file, List<String> messageParts) {
-      Set<String> encounteredParts = _encounteredAllowedListedErrors[file];
-      if (encounteredParts == null) {
-        print("Allowed-listing of path '$file' isn't used. "
-            "Remove it from the allowed-list.");
-        failed = true;
-      } else if (messageParts != null) {
-        for (String messagePart in messageParts) {
-          if (!encounteredParts.contains(messagePart)) {
-            print("Allowed-listing of message '$messagePart' in path '$file' "
-                "isn't used. Remove it from the allowed-list.");
-          }
-          failed = true;
-        }
-      }
-    });
-    Expect.isFalse(failed, "Errors occurred.");
-    if (verbose) {
-      _allowedListedErrors.forEach((Uri uri, List<DiagnosticMessage> messages) {
-        for (DiagnosticMessage message in messages) {
-          reporter.reportError(message);
-        }
-      });
-    } else {
-      int total = 0;
-      _allowedListedErrors.forEach((Uri uri, List<DiagnosticMessage> messages) {
-        print('${messages.length} error(s) allowed in $uri');
-        total += messages.length;
-      });
-      if (total > 0) {
-        print('${total} error(s) allowed in total.');
+  @override
+  Null visitLibrary(ir.Library node) {
+    for (String path in analyzedPaths) {
+      if ('${node.importUri}'.startsWith(path)) {
+        return super.visitLibrary(node);
       }
     }
   }
 
   @override
   ir.DartType visitPropertyGet(ir.PropertyGet node) {
-    ir.DartType result = super.visitPropertyGet(node);
-    ir.DartType type = node.receiver.accept(this);
+    ir.DartType type = visitNode(node.receiver);
+    ir.DartType result = computePropertyGetType(node, type);
     if (type is ir.DynamicType) {
       reportError(node, "Dynamic access of '${node.name}'.");
     }
@@ -149,8 +238,8 @@
 
   @override
   ir.DartType visitPropertySet(ir.PropertySet node) {
-    ir.DartType result = super.visitPropertySet(node);
-    ir.DartType type = node.receiver.accept(this);
+    ir.DartType type = visitNode(node.receiver);
+    ir.DartType result = visitNode(node.value);
     if (type is ir.DynamicType) {
       reportError(node, "Dynamic update to '${node.name}'.");
     }
@@ -159,12 +248,16 @@
 
   @override
   ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
-    ir.DartType result = super.visitMethodInvocation(node);
+    ir.DartType type = visitNode(node.receiver);
+    ir.DartType result = computeMethodInvocationType(node, type);
+    if (!isSpecialCasedBinaryOperator(node.interfaceTarget)) {
+      visitNodes(node.arguments.positional);
+      visitNodes(node.arguments.named);
+    }
     if (node.name.name == '==' &&
         node.arguments.positional.single is ir.NullLiteral) {
       return result;
     }
-    ir.DartType type = node.receiver.accept(this);
     if (type is ir.DynamicType) {
       reportError(node, "Dynamic invocation of '${node.name}'.");
     }
@@ -174,41 +267,17 @@
   void reportError(ir.Node node, String message) {
     SourceSpan span = computeSourceSpanFromTreeNode(node);
     Uri uri = span.uri;
+    String uriString = relativize(Uri.base, uri, Platform.isWindows);
+    Map<String, List<DiagnosticMessage>> actualMap = _actualMessages
+        .putIfAbsent(uriString, () => <String, List<DiagnosticMessage>>{});
     if (uri.scheme == 'org-dartlang-sdk') {
-      uri = Uri.base.resolve(uri.path.substring(1));
-      span = new SourceSpan(uri, span.begin, span.end);
+      span = new SourceSpan(
+          Uri.base.resolve(uri.path.substring(1)), span.begin, span.end);
     }
-    bool whiteListed = false;
-    allowedList.forEach((String file, List<String> messageParts) {
-      if (uri.path.endsWith(file)) {
-        if (messageParts == null) {
-          // All errors are whitelisted.
-          whiteListed = true;
-          message += ' (white-listed)';
-          _encounteredAllowedListedErrors.putIfAbsent(
-              file, () => new Set<String>());
-        } else {
-          for (String messagePart in messageParts) {
-            if (message.contains(messagePart)) {
-              _encounteredAllowedListedErrors
-                  .putIfAbsent(file, () => new Set<String>())
-                  .add(messagePart);
-              message += ' (allowed)';
-              whiteListed = true;
-            }
-          }
-        }
-      }
-    });
     DiagnosticMessage diagnosticMessage =
         reporter.createMessage(span, MessageKind.GENERIC, {'text': message});
-    if (whiteListed) {
-      _allowedListedErrors
-          .putIfAbsent(uri, () => <DiagnosticMessage>[])
-          .add(diagnosticMessage);
-    } else {
-      reporter.reportError(diagnosticMessage);
-      _errorCount++;
-    }
+    actualMap
+        .putIfAbsent(message, () => <DiagnosticMessage>[])
+        .add(diagnosticMessage);
   }
 }
diff --git a/tests/compiler/dart2js/analyses/api_allowed.json b/tests/compiler/dart2js/analyses/api_allowed.json
new file mode 100644
index 0000000..75f95cb
--- /dev/null
+++ b/tests/compiler/dart2js/analyses/api_allowed.json
@@ -0,0 +1,373 @@
+{
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/interceptors.dart": {
+    "Dynamic invocation of 'toString'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_number.dart": {
+    "Dynamic invocation of '[]'.": 5,
+    "Dynamic invocation of '<'.": 4,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of '<='.": 1,
+    "Dynamic invocation of '>'.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_helper.dart": {
+    "Dynamic invocation of '[]'.": 3,
+    "Dynamic access of 'isNaN'.": 3,
+    "Dynamic invocation of '<='.": 4,
+    "Dynamic invocation of '-'.": 4,
+    "Dynamic invocation of '>>'.": 2,
+    "Dynamic invocation of '&'.": 3,
+    "Dynamic invocation of '<'.": 6,
+    "Dynamic invocation of '>'.": 4,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of 'noSuchMethod'.": 1,
+    "Dynamic access of '_js_helper::_self'.": 1,
+    "Dynamic access of '_js_helper::_target'.": 1,
+    "Dynamic access of '_js_helper::_receiver'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'hashCode'.": 2,
+    "Dynamic invocation of 'toString'.": 2,
+    "Dynamic access of 'length'.": 3,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of 'substring'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/constant_map.dart": {
+    "Dynamic invocation of '=='.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/string_helper.dart": {
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of 'substring'.": 7,
+    "Dynamic invocation of 'allMatches'.": 4,
+    "Dynamic access of 'isNotEmpty'.": 1,
+    "Dynamic invocation of '_js_helper::_execGlobal'.": 1,
+    "Dynamic access of 'start'.": 1,
+    "Dynamic access of 'end'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'length'.": 4,
+    "Dynamic invocation of '[]'.": 2,
+    "Dynamic invocation of 'call'.": 13,
+    "Dynamic invocation of 'codeUnitAt'.": 2,
+    "Dynamic access of 'iterator'.": 2,
+    "Dynamic invocation of 'replaceRange'.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart": {
+    "Dynamic access of 'hashCode'.": 1,
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic access of '_js_helper::_length'.": 2,
+    "Dynamic access of '_js_helper::_modifications'.": 4,
+    "Dynamic invocation of 'containsKey'.": 1,
+    "Dynamic access of '_js_helper::_first'.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_rti.dart": {
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '-'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_helper.dart": {
+    "Dynamic invocation of '=='.": 6,
+    "Dynamic access of 'length'.": 2,
+    "Dynamic invocation of '[]'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/regexp_helper.dart": {
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '-'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_typed_data.dart": {
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of '|'.": 3,
+    "Dynamic invocation of '>='.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart": {
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic access of 'iterator'.": 1,
+    "Dynamic invocation of 'call'.": 4,
+    "Dynamic invocation of 'then'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/async/future.dart": {
+    "Dynamic invocation of 'call'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/async/stream.dart": {
+    "Dynamic invocation of 'dart.async::_addError'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/async/async_error.dart": {
+    "Dynamic invocation of 'call'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/collection_patch.dart": {
+    "Dynamic access of 'hashCode'.": 3,
+    "Dynamic invocation of '=='.": 4,
+    "Dynamic access of 'dart.collection::_length'.": 2,
+    "Dynamic invocation of 'dart.collection::_computeKeys'.": 2,
+    "Dynamic invocation of 'containsKey'.": 2,
+    "Dynamic access of 'dart.collection::_keys'.": 2,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic access of 'dart.collection::_modifications'.": 5,
+    "Dynamic access of 'dart.collection::_map'.": 4,
+    "Dynamic access of 'dart.collection::_elements'.": 1,
+    "Dynamic access of 'dart.collection::_element'.": 1,
+    "Dynamic access of 'dart.collection::_first'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/collection/splay_tree.dart": {
+    "Dynamic invocation of '=='.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/collection/hash_map.dart": {
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'hashCode'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/collection/iterable.dart": {
+    "Dynamic access of 'length'.": 2,
+    "Dynamic invocation of '+'.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart": {
+    "Dynamic access of 'style'.": 1,
+    "Dynamic invocation of '=='.": 4,
+    "Dynamic access of 'left'.": 3,
+    "Dynamic access of 'top'.": 3,
+    "Dynamic access of 'width'.": 2,
+    "Dynamic access of 'height'.": 2,
+    "Dynamic invocation of 'remove'.": 2,
+    "Dynamic update to 'dart.dom.html::_innerHtml'.": 1,
+    "Dynamic access of 'firstChild'.": 2,
+    "Dynamic invocation of 'append'.": 1,
+    "Dynamic access of 'tagName'.": 2,
+    "Dynamic invocation of 'round'.": 20,
+    "Dynamic invocation of 'toList'.": 1,
+    "Dynamic access of 'right'.": 1,
+    "Dynamic access of 'bottom'.": 1,
+    "Dynamic invocation of 'call'.": 1,
+    "Dynamic invocation of 'dart.dom.html::_initKeyboardEvent'.": 1,
+    "Dynamic access of 'attributes'.": 1,
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic invocation of 'toString'.": 1,
+    "Dynamic invocation of 'toLowerCase'.": 1,
+    "Dynamic invocation of 'attached'.": 1,
+    "Dynamic invocation of 'detached'.": 1,
+    "Dynamic invocation of 'attributeChanged'.": 1,
+    "Dynamic invocation of 'createElement'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/html/html_common/conversions.dart": {
+    "Dynamic invocation of '[]='.": 2,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '[]'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/html/html_common/filtered_element_list.dart": {
+    "Dynamic invocation of 'remove'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/html/html_common/lists.dart": {
+    "Dynamic invocation of '=='.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart": {
+    "Dynamic access of 'onUpgradeNeeded'.": 1,
+    "Dynamic invocation of 'listen'.": 2,
+    "Dynamic access of 'onBlocked'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/io/directory_impl.dart": {
+    "Dynamic invocation of '=='.": 5,
+    "Dynamic invocation of '[]'.": 10
+  },
+  "org-dartlang-sdk:///sdk/lib/io/file_impl.dart": {
+    "Dynamic invocation of 'cancel'.": 1,
+    "Dynamic invocation of 'pause'.": 1,
+    "Dynamic invocation of 'resume'.": 1,
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic invocation of '[]'.": 4,
+    "Dynamic access of 'length'.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/io/file_system_entity.dart": {
+    "Dynamic invocation of '[]'.": 7
+  },
+  "org-dartlang-sdk:///sdk/lib/io/io_resource_info.dart": {
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic invocation of 'containsKey'.": 1,
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic access of 'path'.": 1,
+    "Dynamic access of 'dart.io::_path'.": 1,
+    "Dynamic access of 'pid'.": 1,
+    "Dynamic access of 'dart.io::_arguments'.": 1,
+    "Dynamic access of 'dart.io::_workingDirectory'.": 2,
+    "Dynamic access of 'isListening'.": 3,
+    "Dynamic access of 'address'.": 4,
+    "Dynamic access of 'host'.": 5,
+    "Dynamic access of 'port'.": 3,
+    "Dynamic access of 'remoteAddress'.": 2,
+    "Dynamic access of 'remotePort'.": 2,
+    "Dynamic access of 'isTcp'.": 1,
+    "Dynamic access of 'type'.": 1,
+    "Dynamic access of 'name'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/io/link.dart": {
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of '[]'.": 3
+  },
+  "org-dartlang-sdk:///sdk/lib/io/platform_impl.dart": {
+    "Dynamic invocation of 'indexOf'.": 1,
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of 'substring'.": 2,
+    "Dynamic invocation of '+'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/io/secure_server_socket.dart": {
+    "Dynamic update to 'dart.io::_owner'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/io/secure_socket.dart": {
+    "Dynamic invocation of 'dart.io::_detachRaw'.": 2,
+    "Dynamic invocation of '[]'.": 10,
+    "Dynamic access of 'dart.io::_socket'.": 1,
+    "Dynamic access of 'closedReadEventSent'.": 1,
+    "Dynamic access of 'host'.": 1,
+    "Dynamic update to 'dart.io::_owner'.": 1,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of '~/'.": 1,
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '-'.": 7
+  },
+  "org-dartlang-sdk:///sdk/lib/io/stdio.dart": {
+    "Dynamic invocation of 'writeFromSync'.": 1,
+    "Dynamic invocation of 'cancel'.": 1,
+    "Dynamic invocation of 'closeSync'.": 1,
+    "Dynamic access of 'dart.io::_stream'.": 1,
+    "Dynamic invocation of '=='.": 3
+  },
+  "org-dartlang-sdk:///sdk/lib/io/common.dart": {
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of '[]'.": 3
+  },
+  "org-dartlang-sdk:///sdk/lib/js/dart2js/js_dart2js.dart": {
+    "Dynamic invocation of '[]'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/svg/dart2js/svg_dart2js.dart": {
+    "Dynamic invocation of 'createFragment'.": 1,
+    "Dynamic access of 'nodes'.": 1,
+    "Dynamic invocation of 'where'.": 1,
+    "Dynamic access of 'single'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/core_patch.dart": {
+    "Dynamic access of 'dart.core::_digits'.": 2,
+    "Dynamic invocation of '<'.": 2,
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '[]'.": 19,
+    "Dynamic invocation of 'dart.core::_absSubSetSign'.": 3,
+    "Dynamic invocation of 'dart.core::_absAndNotSetSign'.": 2,
+    "Dynamic invocation of 'dart.core::_absAddSetSign'.": 2,
+    "Dynamic invocation of 'dart.core::_absXorSetSign'.": 1,
+    "Dynamic invocation of '[]='.": 2,
+    "Dynamic invocation of '&'.": 6,
+    "Dynamic invocation of '=='.": 16,
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic invocation of '>='.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/core/date_time.dart": {
+    "Dynamic access of 'dart.core::_value'.": 1,
+    "Dynamic access of 'isUtc'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/core/duration.dart": {
+    "Dynamic access of 'dart.core::_duration'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/core/errors.dart": {
+    "Dynamic access of 'length'.": 2,
+    "Dynamic invocation of '<'.": 2,
+    "Dynamic invocation of '~'.": 1,
+    "Dynamic invocation of '^'.": 1,
+    "Dynamic invocation of '&'.": 1,
+    "Dynamic invocation of '|'.": 1,
+    "Dynamic invocation of '>>'.": 1,
+    "Dynamic invocation of '<<'.": 1,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of 'unary-'.": 1,
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic invocation of '*'.": 1,
+    "Dynamic invocation of '/'.": 1,
+    "Dynamic invocation of '~/'.": 1,
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of '<='.": 1,
+    "Dynamic invocation of '%'.": 1,
+    "Dynamic invocation of 'length'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/core/exceptions.dart": {
+    "Dynamic access of 'length'.": 3,
+    "Dynamic invocation of 'codeUnitAt'.": 2,
+    "Dynamic invocation of 'substring'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/core/uri.dart": {
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic invocation of 'startsWith'.": 1,
+    "Dynamic invocation of 'add'.": 1,
+    "Dynamic invocation of '=='.": 8
+  },
+  "org-dartlang-sdk:///sdk/lib/math/point.dart": {
+    "Dynamic access of 'x'.": 1,
+    "Dynamic access of 'y'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/math/rectangle.dart": {
+    "Dynamic access of 'left'.": 1,
+    "Dynamic access of 'top'.": 1,
+    "Dynamic access of 'right'.": 1,
+    "Dynamic access of 'bottom'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart": {
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of 'clear'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/convert/encoding.dart": {
+    "Dynamic invocation of 'write'.": 1,
+    "Dynamic invocation of 'toString'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/convert/string_conversion.dart": {
+    "Dynamic invocation of 'toString'.": 3
+  },
+  "org-dartlang-sdk:///sdk/lib/convert/json.dart": {
+    "Dynamic invocation of 'toJson'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/isolate/isolate.dart": {
+    "Dynamic invocation of '[]'.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/_http/crypto.dart": {
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '&'.": 3,
+    "Dynamic invocation of '-'.": 2,
+    "Dynamic invocation of 'unary-'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_http/http_date.dart": {
+    "Dynamic access of 'length'.": 3,
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '>='.": 2,
+    "Dynamic invocation of '[]'.": 7,
+    "Dynamic invocation of '=='.": 2
+  },
+  "org-dartlang-sdk:///sdk/lib/_http/http_headers.dart": {
+    "Dynamic invocation of '=='.": 3,
+    "Dynamic invocation of 'toLowerCase'.": 1,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of 'codeUnitAt'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_http/http_impl.dart": {
+    "Dynamic access of 'message'.": 3,
+    "Dynamic invocation of 'split'.": 1,
+    "Dynamic invocation of 'trim'.": 1,
+    "Dynamic invocation of 'toLowerCase'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of 'call'.": 1,
+    "Dynamic invocation of 'destroy'.": 2,
+    "Dynamic invocation of 'setOption'.": 1,
+    "Dynamic access of 'address'.": 2,
+    "Dynamic access of 'host'.": 2,
+    "Dynamic access of 'port'.": 2,
+    "Dynamic access of 'remoteAddress'.": 1,
+    "Dynamic access of 'remotePort'.": 1,
+    "Dynamic invocation of 'dart._http::_toJSON'.": 3,
+    "Dynamic invocation of 'listen'.": 1,
+    "Dynamic invocation of 'close'.": 1
+  },
+  "org-dartlang-sdk:///sdk/lib/_http/http_parser.dart": {
+    "Dynamic invocation of '=='.": 4
+  },
+  "org-dartlang-sdk:///sdk/lib/_http/websocket_impl.dart": {
+    "Dynamic invocation of 'transform'.": 1,
+    "Dynamic invocation of 'listen'.": 1,
+    "Dynamic access of 'address'.": 1,
+    "Dynamic access of 'host'.": 1,
+    "Dynamic access of 'port'.": 1,
+    "Dynamic invocation of 'dart._http::_toJSON'.": 1
+  }
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/analyses/api_dynamic_test.dart b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
index 0737162..bb1564a 100644
--- a/tests/compiler/dart2js/analyses/api_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
@@ -5,69 +5,14 @@
 import 'package:async_helper/async_helper.dart';
 import 'analysis_helper.dart';
 
-// TODO(johnniwinther): Remove unneeded dynamic accesses.
-const Map<String, List<String>> allowedList = {
-  'sdk/lib/_http/crypto.dart': null,
-  'sdk/lib/_http/http_date.dart': null,
-  'sdk/lib/_http/http_headers.dart': null,
-  'sdk/lib/_http/http_impl.dart': null,
-  'sdk/lib/_http/http_parser.dart': null,
-  'sdk/lib/_http/websocket_impl.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/async_patch.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/collection_patch.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/constant_map.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/convert_patch.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/core_patch.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/interceptors.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/js_helper.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/js_number.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/js_rti.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/native_helper.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/native_typed_data.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/regexp_helper.dart': null,
-  'sdk/lib/_internal/js_runtime/lib/string_helper.dart': null,
-  'sdk/lib/async/async_error.dart': null,
-  'sdk/lib/async/future.dart': null,
-  'sdk/lib/async/stream.dart': null,
-  'sdk/lib/collection/hash_map.dart': null,
-  'sdk/lib/collection/iterable.dart': null,
-  'sdk/lib/collection/splay_tree.dart': null,
-  'sdk/lib/convert/encoding.dart': null,
-  'sdk/lib/convert/json.dart': null,
-  'sdk/lib/convert/string_conversion.dart': null,
-  'sdk/lib/core/date_time.dart': null,
-  'sdk/lib/core/duration.dart': null,
-  'sdk/lib/core/errors.dart': null,
-  'sdk/lib/core/exceptions.dart': null,
-  'sdk/lib/core/uri.dart': null,
-  'sdk/lib/html/dart2js/html_dart2js.dart': null,
-  'sdk/lib/html/html_common/conversions.dart': null,
-  'sdk/lib/html/html_common/filtered_element_list.dart': null,
-  'sdk/lib/html/html_common/lists.dart': null,
-  'sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart': null,
-  'sdk/lib/io/common.dart': null,
-  'sdk/lib/io/directory_impl.dart': null,
-  'sdk/lib/io/file_impl.dart': null,
-  'sdk/lib/io/file_system_entity.dart': null,
-  'sdk/lib/io/io_resource_info.dart': null,
-  'sdk/lib/io/link.dart': null,
-  'sdk/lib/io/platform_impl.dart': null,
-  'sdk/lib/io/secure_server_socket.dart': null,
-  'sdk/lib/io/secure_socket.dart': null,
-  'sdk/lib/io/stdio.dart': null,
-  'sdk/lib/isolate/isolate.dart': null,
-  'sdk/lib/js/dart2js/js_dart2js.dart': null,
-  'sdk/lib/math/point.dart': null,
-  'sdk/lib/math/rectangle.dart': null,
-  'sdk/lib/svg/dart2js/svg_dart2js.dart': null,
-};
-
+// TODO(johnniwinther): Remove unneeded dynamic accesses from platform source
+// code.
 main(List<String> args) {
   asyncTest(() async {
     await run(Uri.parse('memory:main.dart'),
+        'tests/compiler/dart2js/analyses/api_allowed.json', ['dart:'],
         memorySourceFiles: {'main.dart': 'main() {}'},
-        allowedList: allowedList,
-        verbose: args.contains('-v'));
+        verbose: args.contains('-v'),
+        generate: args.contains('-g'));
   });
 }
diff --git a/tests/compiler/dart2js/analyses/dart2js_allowed.json b/tests/compiler/dart2js/analyses/dart2js_allowed.json
new file mode 100644
index 0000000..6796477
--- /dev/null
+++ b/tests/compiler/dart2js/analyses/dart2js_allowed.json
@@ -0,0 +1,497 @@
+{
+  "pkg/compiler/lib/src/dart2js.dart": {
+    "Dynamic invocation of 'call'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of 'pause'.": 1,
+    "Dynamic invocation of 'resume'.": 1
+  },
+  "pkg/compiler/lib/src/source_file_provider.dart": {
+    "Dynamic invocation of 'call'.": 3
+  },
+  "pkg/compiler/lib/src/util/util.dart": {
+    "Dynamic access of 'hashCode'.": 8,
+    "Dynamic access of 'a'.": 1,
+    "Dynamic access of 'b'.": 1,
+    "Dynamic invocation of 'write'.": 11,
+    "Dynamic invocation of 'writeCharCode'.": 1,
+    "Dynamic invocation of '=='.": 1
+  },
+  "pkg/compiler/lib/src/util/maplet.dart": {
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic invocation of '=='.": 9,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of 'containsKey'.": 1,
+    "Dynamic invocation of '[]'.": 11,
+    "Dynamic invocation of '[]='.": 12,
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of 'remove'.": 1,
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic invocation of 'forEach'.": 1,
+    "Dynamic access of 'keys'.": 1,
+    "Dynamic access of 'iterator'.": 1
+  },
+  "pkg/compiler/lib/src/util/setlet.dart": {
+    "Dynamic access of 'iterator'.": 1,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic invocation of '=='.": 10,
+    "Dynamic invocation of 'contains'.": 1,
+    "Dynamic invocation of '[]'.": 7,
+    "Dynamic invocation of 'add'.": 1,
+    "Dynamic invocation of '[]='.": 6,
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of 'lookup'.": 1,
+    "Dynamic invocation of 'remove'.": 1,
+    "Dynamic invocation of '-'.": 2,
+    "Dynamic invocation of 'removeWhere'.": 1,
+    "Dynamic invocation of 'forEach'.": 1,
+    "Dynamic invocation of 'toSet'.": 1,
+    "Dynamic invocation of 'toList'.": 1
+  },
+  "pkg/compiler/lib/src/common/tasks.dart": {
+    "Dynamic invocation of '=='.": 4
+  },
+  "pkg/compiler/lib/src/compiler.dart": {
+    "Dynamic invocation of 'toString'.": 1
+  },
+  "pkg/compiler/lib/src/diagnostics/messages.dart": {
+    "Dynamic access of 'template'.": 1,
+    "Dynamic invocation of 'toString'.": 1,
+    "Dynamic access of 'lexeme'.": 1,
+    "Dynamic invocation of 'toDartText'.": 1
+  },
+  "pkg/compiler/lib/src/diagnostics/source_span.dart": {
+    "Dynamic access of 'uri'.": 1,
+    "Dynamic access of 'begin'.": 1,
+    "Dynamic access of 'end'.": 1
+  },
+  "pkg/compiler/lib/src/deferred_load.dart": {
+    "Dynamic invocation of '[]='.": 1,
+    "Dynamic access of 'memberContext'.": 1,
+    "Dynamic access of 'name'.": 1
+  },
+  "pkg/compiler/lib/src/elements/entities.dart": {
+    "Dynamic access of 'requiredParameters'.": 1,
+    "Dynamic access of 'positionalParameters'.": 1,
+    "Dynamic access of 'typeParameters'.": 1,
+    "Dynamic access of 'namedParameters'.": 2,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '[]'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart": {
+    "Dynamic access of 'allocationNode'.": 2,
+    "Dynamic access of 'elementType'.": 3,
+    "Dynamic access of 'length'.": 2,
+    "Dynamic access of 'isNullable'.": 2,
+    "Dynamic access of 'isEmptyOrNull'.": 1,
+    "Dynamic access of 'isContainer'.": 1,
+    "Dynamic access of 'forwardTo'.": 1,
+    "Dynamic access of 'allocationElement'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart": {
+    "Dynamic access of 'allocationNode'.": 1,
+    "Dynamic access of 'keyType'.": 4,
+    "Dynamic access of 'valueType'.": 4,
+    "Dynamic access of 'masks::_typeMap'.": 5,
+    "Dynamic invocation of 'containsKey'.": 2,
+    "Dynamic access of 'keys'.": 1,
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic invocation of 'every'.": 1,
+    "Dynamic access of 'isNullable'.": 2,
+    "Dynamic access of 'isEmptyOrNull'.": 1,
+    "Dynamic access of 'isDictionary'.": 1,
+    "Dynamic access of 'forwardTo'.": 2,
+    "Dynamic invocation of 'nullable'.": 2,
+    "Dynamic invocation of 'union'.": 1,
+    "Dynamic invocation of 'forEach'.": 1,
+    "Dynamic access of 'isMap'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart": {
+    "Dynamic access of 'forwardTo'.": 2,
+    "Dynamic invocation of 'nullable'.": 1,
+    "Dynamic invocation of 'nonNullable'.": 1,
+    "Dynamic access of 'isNullable'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart": {
+    "Dynamic access of 'allocationNode'.": 2,
+    "Dynamic access of 'keyType'.": 5,
+    "Dynamic access of 'valueType'.": 3,
+    "Dynamic access of 'isNullable'.": 2,
+    "Dynamic access of 'isEmptyOrNull'.": 1,
+    "Dynamic access of 'isMap'.": 1,
+    "Dynamic access of 'forwardTo'.": 2,
+    "Dynamic access of 'isDictionary'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'typeMap'.": 1,
+    "Dynamic access of 'values'.": 1,
+    "Dynamic invocation of 'union'.": 1,
+    "Dynamic invocation of 'fold'.": 1,
+    "Dynamic access of 'allocationElement'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart": {
+    "Dynamic access of 'isForwarding'.": 1,
+    "Dynamic access of 'forwardTo'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart": {
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'isUnion'.": 5,
+    "Dynamic access of 'disjointMasks'.": 4,
+    "Dynamic invocation of 'contains'.": 1,
+    "Dynamic invocation of 'nonNullable'.": 1,
+    "Dynamic invocation of 'every'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart": {
+    "Dynamic access of 'value'.": 1
+  },
+  "pkg/compiler/lib/src/io/source_information.dart": {
+    "Dynamic access of 'sourceUri'.": 1,
+    "Dynamic access of 'offset'.": 1,
+    "Dynamic access of 'sourceName'.": 1
+  },
+  "pkg/compiler/lib/src/js_model/js_strategy.dart": {
+    "Dynamic invocation of '=='.": 2
+  },
+  "pkg/compiler/lib/src/ssa/nodes.dart": {
+    "Dynamic invocation of 'replaceWith'.": 1
+  },
+  "pkg/compiler/lib/src/universe/world_builder.dart": {
+    "Dynamic access of 'cls'.": 1
+  },
+  "pkg/compiler/lib/src/universe/member_usage.dart": {
+    "Dynamic access of 'entity'.": 1
+  },
+  "pkg/compiler/lib/src/universe/resolution_world_builder.dart": {
+    "Dynamic access of 'type'.": 1,
+    "Dynamic access of 'kind'.": 1,
+    "Dynamic access of 'isRedirection'.": 1
+  },
+  "pkg/compiler/lib/src/constants/expressions.dart": {
+    "Dynamic access of 'kind'.": 1,
+    "Dynamic access of 'hashCode'.": 1
+  },
+  "pkg/compiler/lib/src/helpers/trace.dart": {
+    "Dynamic access of 'index'.": 1,
+    "Dynamic access of 'file'.": 1,
+    "Dynamic access of 'lineNo'.": 1,
+    "Dynamic access of 'columnNo'.": 1,
+    "Dynamic access of 'method'.": 1
+  },
+  "pkg/compiler/lib/src/helpers/debug_collection.dart": {
+    "Dynamic access of 'runtimeType'.": 4
+  },
+  "pkg/compiler/lib/src/helpers/expensive_map.dart": {
+    "Dynamic access of 'length'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic access of 'isNotEmpty'.": 1,
+    "Dynamic access of 'keys'.": 1,
+    "Dynamic access of 'values'.": 1,
+    "Dynamic invocation of 'containsKey'.": 1,
+    "Dynamic invocation of 'containsValue'.": 1,
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic invocation of 'forEach'.": 1,
+    "Dynamic invocation of '[]='.": 1,
+    "Dynamic invocation of 'addAll'.": 1,
+    "Dynamic invocation of 'remove'.": 2,
+    "Dynamic invocation of 'clear'.": 1,
+    "Dynamic access of 'entries'.": 1,
+    "Dynamic invocation of 'addEntries'.": 1,
+    "Dynamic invocation of 'map'.": 1,
+    "Dynamic invocation of 'update'.": 1,
+    "Dynamic invocation of 'updateAll'.": 1,
+    "Dynamic invocation of 'removeWhere'.": 1
+  },
+  "pkg/compiler/lib/src/helpers/expensive_set.dart": {
+    "Dynamic access of 'length'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic access of 'isNotEmpty'.": 1,
+    "Dynamic access of 'iterator'.": 1,
+    "Dynamic invocation of 'contains'.": 1,
+    "Dynamic invocation of 'lookup'.": 1,
+    "Dynamic invocation of 'forEach'.": 1,
+    "Dynamic invocation of 'add'.": 2,
+    "Dynamic invocation of 'remove'.": 2,
+    "Dynamic invocation of 'clear'.": 1,
+    "Dynamic invocation of 'toSet'.": 1
+  },
+  "pkg/compiler/lib/src/helpers/track_map.dart": {
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '-'.": 1
+  },
+  "pkg/compiler/lib/src/closure.dart": {
+    "Dynamic access of 'typeVariable'.": 1
+  },
+  "pkg/compiler/lib/src/js_backend/native_data.dart": {
+    "Dynamic access of 'names'.": 1,
+    "Dynamic access of 'isNonLeaf'.": 1
+  },
+  "pkg/compiler/lib/src/elements/names.dart": {
+    "Dynamic access of 'library'.": 1
+  },
+  "pkg/compiler/lib/src/constants/values.dart": {
+    "Dynamic access of 'element'.": 1,
+    "Dynamic access of 'type'.": 1,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'hashCode'.": 2
+  },
+  "pkg/compiler/lib/src/elements/types.dart": {
+    "Dynamic access of 'element'.": 1
+  },
+  "pkg/compiler/lib/src/js_backend/constant_system_javascript.dart": {
+    "Dynamic invocation of 'remainder'.": 1,
+    "Dynamic access of 'isString'.": 1,
+    "Dynamic access of 'stringValue'.": 1,
+    "Dynamic invocation of '=='.": 1
+  },
+  "pkg/compiler/lib/src/universe/use.dart": {
+    "Dynamic access of 'selector'.": 1,
+    "Dynamic access of 'receiverConstraint'.": 1,
+    "Dynamic access of 'typeArguments'.": 2,
+    "Dynamic access of 'element'.": 1,
+    "Dynamic access of 'kind'.": 2,
+    "Dynamic access of 'type'.": 2,
+    "Dynamic access of 'callStructure'.": 1,
+    "Dynamic access of 'value'.": 1
+  },
+  "third_party/pkg/dart2js_info/lib/json_info_codec.dart": {
+    "Dynamic invocation of '[]'.": 13,
+    "Dynamic invocation of 'forEach'.": 3,
+    "Dynamic invocation of 'map'.": 2,
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic access of 'length'.": 1
+  },
+  "pkg/compiler/lib/src/js/js.dart": {
+    "Dynamic invocation of '=='.": 1
+  },
+  "pkg/compiler/lib/src/util/enumset.dart": {
+    "Dynamic access of 'index'.": 4,
+    "Dynamic access of 'value'.": 1
+  },
+  "pkg/compiler/lib/src/native/enqueue.dart": {
+    "Dynamic access of 'isDynamic'.": 1,
+    "Dynamic access of 'runtimeType'.": 1
+  },
+  "pkg/compiler/lib/src/js/rewrite_async.dart": {
+    "Dynamic invocation of '=='.": 1
+  },
+  "pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart": {
+    "Dynamic access of 'name'.": 1
+  },
+  "pkg/compiler/lib/src/js_backend/namer_names.dart": {
+    "Dynamic access of 'js_backend.namer::_target'.": 4,
+    "Dynamic access of 'base'.": 1,
+    "Dynamic invocation of '=='.": 4,
+    "Dynamic access of 'prefix'.": 1,
+    "Dynamic access of 'js_backend.namer::_parts'.": 2,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '[]'.": 1
+  },
+  "pkg/compiler/lib/src/universe/side_effects.dart": {
+    "Dynamic access of 'universe.side_effects::_flags'.": 1
+  },
+  "pkg/compiler/lib/src/native/behavior.dart": {
+    "Dynamic invocation of 'add'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/builder_kernel.dart": {
+    "Dynamic update to 'instantiatedTypes'.": 1,
+    "Dynamic update to 'sideEffects'.": 1,
+    "Dynamic access of 'name'.": 1,
+    "Dynamic access of 'id'.": 1,
+    "Dynamic invocation of 'addSuccessor'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/types.dart": {
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic access of 'isVoid'.": 1,
+    "Dynamic access of 'isDynamic'.": 1,
+    "Dynamic access of 'treatAsDynamic'.": 1,
+    "Dynamic access of 'element'.": 1
+  },
+  "pkg/compiler/lib/src/universe/feature.dart": {
+    "Dynamic access of 'type'.": 2,
+    "Dynamic access of 'isConstant'.": 2,
+    "Dynamic access of 'isEmpty'.": 2,
+    "Dynamic access of 'kind'.": 1,
+    "Dynamic access of 'receiverType'.": 1,
+    "Dynamic access of 'argumentType'.": 1,
+    "Dynamic access of 'functionType'.": 1,
+    "Dynamic access of 'typeArguments'.": 1
+  },
+  "pkg/compiler/lib/src/js_model/closure.dart": {
+    "Dynamic access of 'kind'.": 1,
+    "Dynamic access of 'member'.": 1,
+    "Dynamic access of 'localFunction'.": 1,
+    "Dynamic access of 'invocation'.": 1,
+    "Dynamic access of 'instantiation'.": 1,
+    "Dynamic access of 'type'.": 1,
+    "Dynamic access of 'context'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/validate.dart": {
+    "Dynamic invocation of 'isInBasicBlock'.": 2,
+    "Dynamic access of 'usedBy'.": 2,
+    "Dynamic access of 'inputs'.": 1
+  },
+  "pkg/compiler/lib/src/universe/function_set.dart": {
+    "Dynamic access of 'selector'.": 1,
+    "Dynamic access of 'receiver'.": 1
+  },
+  "pkg/compiler/lib/src/constants/constructors.dart": {
+    "Dynamic access of 'type'.": 1,
+    "Dynamic access of 'superConstructorInvocation'.": 1,
+    "Dynamic access of 'defaultValues'.": 2,
+    "Dynamic access of 'fieldMap'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic access of 'thisConstructorInvocation'.": 1,
+    "Dynamic access of 'targetConstructorInvocation'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/optimize.dart": {
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic invocation of 'replaceWith'.": 1,
+    "Dynamic access of 'inputs'.": 2,
+    "Dynamic invocation of '[]'.": 2,
+    "Dynamic invocation of 'isInteger'.": 1,
+    "Dynamic invocation of 'isConstantList'.": 1,
+    "Dynamic invocation of 'isConstantString'.": 1,
+    "Dynamic access of 'constant'.": 1,
+    "Dynamic access of 'length'.": 4,
+    "Dynamic access of 'instructionType'.": 2,
+    "Dynamic access of 'isContainer'.": 2,
+    "Dynamic access of 'isNullable'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of 'containsOnly'.": 2,
+    "Dynamic invocation of 'containsOnlyString'.": 1
+  },
+  "pkg/compiler/lib/src/constant_system_dart.dart": {
+    "Dynamic invocation of '|'.": 1,
+    "Dynamic invocation of '&'.": 1,
+    "Dynamic invocation of '^'.": 1,
+    "Dynamic invocation of '<<'.": 1,
+    "Dynamic invocation of '>>'.": 1,
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic invocation of '*'.": 1,
+    "Dynamic invocation of '%'.": 1,
+    "Dynamic invocation of 'remainder'.": 1,
+    "Dynamic invocation of '~/'.": 1,
+    "Dynamic invocation of '/'.": 1,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '<='.": 1,
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of 'codeUnitAt'.": 1
+  },
+  "pkg/compiler/lib/src/native/js.dart": {
+    "Dynamic invocation of '=='.": 1
+  },
+  "third_party/pkg/dart2js_info/lib/src/measurements.dart": {
+    "Dynamic access of 'name'.": 1,
+    "Dynamic invocation of 'call'.": 1
+  },
+  "third_party/pkg/dart2js_info/lib/src/util.dart": {
+    "Dynamic access of 'name'.": 1,
+    "Dynamic invocation of '-'.": 1
+  },
+  "pkg/js_ast/lib/src/builder.dart": {
+    "Dynamic invocation of 'call'.": 2
+  },
+  "pkg/js_ast/lib/src/template.dart": {
+    "Dynamic access of 'length'.": 1,
+    "Dynamic access of 'keys'.": 1,
+    "Dynamic invocation of 'where'.": 1,
+    "Dynamic invocation of 'join'.": 1,
+    "Dynamic invocation of 'containsKey'.": 2,
+    "Dynamic invocation of '[]'.": 9,
+    "Dynamic invocation of 'toStatement'.": 3
+  },
+  "pkg/compiler/lib/src/inferrer/inferrer_engine.dart": {
+    "Dynamic invocation of '=='.": 7,
+    "Dynamic access of 'isVoid'.": 1,
+    "Dynamic access of 'isDynamic'.": 1,
+    "Dynamic access of 'isInterfaceType'.": 1,
+    "Dynamic access of 'element'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/type_graph_nodes.dart": {
+    "Dynamic invocation of 'add'.": 1,
+    "Dynamic invocation of 'remove'.": 1,
+    "Dynamic access of 'type'.": 4,
+    "Dynamic invocation of 'containsOnlyInt'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic invocation of 'satisfies'.": 2
+  },
+  "pkg/compiler/lib/src/io/position_information.dart": {
+    "Dynamic access of 'startPosition'.": 1,
+    "Dynamic access of 'innerPosition'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/variable_allocator.dart": {
+    "Dynamic access of 'checkedInput'.": 1,
+    "Dynamic access of 'usedBy'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic invocation of 'nonCheck'.": 1,
+    "Dynamic invocation of 'isCodeMotionInvariant'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/interceptor_simplifier.dart": {
+    "Dynamic access of 'interceptedClasses'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/value_range_analyzer.dart": {
+    "Dynamic access of 'isZero'.": 2,
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic access of 'value'.": 7,
+    "Dynamic access of 'isInt'.": 3,
+    "Dynamic access of 'intValue'.": 4,
+    "Dynamic invocation of 'unary-'.": 1,
+    "Dynamic invocation of 'min'.": 1,
+    "Dynamic invocation of 'max'.": 1,
+    "Dynamic access of 'instruction'.": 1,
+    "Dynamic access of 'left'.": 4,
+    "Dynamic access of 'right'.": 4,
+    "Dynamic access of 'lower'.": 1,
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic access of 'upper'.": 1,
+    "Dynamic invocation of 'operation'.": 1
+  },
+  "pkg/compiler/lib/src/ssa/value_set.dart": {
+    "Dynamic invocation of 'add'.": 2
+  },
+  "pkg/compiler/lib/src/inferrer/locals_handler.dart": {
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic access of 'positional'.": 2,
+    "Dynamic access of 'length'.": 2,
+    "Dynamic access of 'named'.": 2,
+    "Dynamic invocation of '[]'.": 2,
+    "Dynamic invocation of '=='.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/type_graph_dump.dart": {
+    "Dynamic invocation of 'contains'.": 2
+  },
+  "pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart": {
+    "Dynamic access of 'scheme'.": 1,
+    "Dynamic invocation of '=='.": 1,
+    "Dynamic invocation of 'toString'.": 1,
+    "Dynamic invocation of 'finalizeTokens'.": 1
+  },
+  "pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart": {
+    "Dynamic access of 'keys'.": 1,
+    "Dynamic invocation of 'toSet'.": 1,
+    "Dynamic invocation of '[]='.": 1,
+    "Dynamic invocation of 'add'.": 1
+  },
+  "pkg/compiler/lib/src/inferrer/node_tracer.dart": {
+    "Dynamic access of 'receiver'.": 2,
+    "Dynamic invocation of '=='.": 2,
+    "Dynamic access of 'selector'.": 6,
+    "Dynamic access of 'name'.": 4,
+    "Dynamic access of 'isIndex'.": 1
+  },
+  "pkg/compiler/lib/src/hash/sha1.dart": {
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '&'.": 2,
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic invocation of 'unary-'.": 1
+  },
+  "pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart": {
+    "Dynamic access of 'superclass'.": 1,
+    "Dynamic access of 'needsTearOff'.": 1
+  }
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
index 82964d8..43ba39a 100644
--- a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
@@ -4,118 +4,21 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'analysis_helper.dart';
-import 'api_dynamic_test.dart' as api;
 
-// TODO(johnniwinther): Remove unneeded dynamic accesses.
-const Map<String, List<String>> allowedList = {
-  'pkg/compiler/lib/src/closure.dart': null,
-  'pkg/compiler/lib/src/common/tasks.dart': null,
-  'pkg/compiler/lib/src/compiler.dart': null,
-  'pkg/compiler/lib/src/constant_system_dart.dart': null,
-  'pkg/compiler/lib/src/constants/constructors.dart': null,
-  'pkg/compiler/lib/src/constants/expressions.dart': null,
-  'pkg/compiler/lib/src/constants/values.dart': null,
-  'pkg/compiler/lib/src/dart2js.dart': null,
-  'pkg/compiler/lib/src/deferred_load.dart': null,
-  'pkg/compiler/lib/src/diagnostics/messages.dart': null,
-  'pkg/compiler/lib/src/diagnostics/source_span.dart': null,
-  'pkg/compiler/lib/src/elements/entities.dart': null,
-  'pkg/compiler/lib/src/elements/names.dart': null,
-  'pkg/compiler/lib/src/elements/types.dart': null,
-  'pkg/compiler/lib/src/hash/sha1.dart': null,
-  'pkg/compiler/lib/src/helpers/debug_collection.dart': null,
-  'pkg/compiler/lib/src/helpers/expensive_map.dart': null,
-  'pkg/compiler/lib/src/helpers/expensive_set.dart': null,
-  'pkg/compiler/lib/src/helpers/trace.dart': null,
-  'pkg/compiler/lib/src/helpers/track_map.dart': null,
-  'pkg/compiler/lib/src/inferrer/inferrer_engine.dart': null,
-  'pkg/compiler/lib/src/inferrer/locals_handler.dart': null,
-  'pkg/compiler/lib/src/inferrer/node_tracer.dart': null,
-  'pkg/compiler/lib/src/inferrer/type_graph_dump.dart': null,
-  'pkg/compiler/lib/src/inferrer/type_graph_nodes.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart': null,
-  'pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart': null,
-  'pkg/compiler/lib/src/io/position_information.dart': null,
-  'pkg/compiler/lib/src/io/source_information.dart': null,
-  'pkg/compiler/lib/src/js/js.dart': null,
-  'pkg/compiler/lib/src/js/rewrite_async.dart': null,
-  'pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart': null,
-  'pkg/compiler/lib/src/js_backend/constant_system_javascript.dart': null,
-  'pkg/compiler/lib/src/js_backend/namer_names.dart': null,
-  'pkg/compiler/lib/src/js_backend/native_data.dart': null,
-  'pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart': null,
-  'pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart': null,
-  'pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart': null,
-  'pkg/compiler/lib/src/js_model/closure.dart': null,
-  'pkg/compiler/lib/src/js_model/js_strategy.dart': null,
-  'pkg/compiler/lib/src/native/behavior.dart': null,
-  'pkg/compiler/lib/src/native/enqueue.dart': null,
-  'pkg/compiler/lib/src/native/js.dart': null,
-  'pkg/compiler/lib/src/source_file_provider.dart': null,
-  'pkg/compiler/lib/src/ssa/builder_kernel.dart': null,
-  'pkg/compiler/lib/src/ssa/interceptor_simplifier.dart': null,
-  'pkg/compiler/lib/src/ssa/nodes.dart': null,
-  'pkg/compiler/lib/src/ssa/optimize.dart': null,
-  'pkg/compiler/lib/src/ssa/types.dart': null,
-  'pkg/compiler/lib/src/ssa/validate.dart': null,
-  'pkg/compiler/lib/src/ssa/value_range_analyzer.dart': null,
-  'pkg/compiler/lib/src/ssa/value_set.dart': null,
-  'pkg/compiler/lib/src/ssa/variable_allocator.dart': null,
-  'pkg/compiler/lib/src/universe/feature.dart': null,
-  'pkg/compiler/lib/src/universe/function_set.dart': null,
-  'pkg/compiler/lib/src/universe/member_usage.dart': null,
-  'pkg/compiler/lib/src/universe/resolution_world_builder.dart': null,
-  'pkg/compiler/lib/src/universe/side_effects.dart': null,
-  'pkg/compiler/lib/src/universe/use.dart': null,
-  'pkg/compiler/lib/src/universe/world_builder.dart': null,
-  'pkg/compiler/lib/src/util/enumset.dart': null,
-  'pkg/compiler/lib/src/util/maplet.dart': null,
-  'pkg/compiler/lib/src/util/setlet.dart': null,
-  'pkg/compiler/lib/src/util/util.dart': null,
-  'pkg/front_end/lib/src/base/libraries_specification.dart': null,
-  'pkg/front_end/lib/src/fasta/builder/function_type_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/colors.dart': null,
-  'pkg/front_end/lib/src/fasta/crash.dart': null,
-  'pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/kernel/body_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/kernel/expression_generator.dart': null,
-  'pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart':
-      null,
-  'pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/scanner/string_canonicalizer.dart': null,
-  'pkg/front_end/lib/src/fasta/scanner/token.dart': null,
-  'pkg/front_end/lib/src/fasta/source/diet_listener.dart': null,
-  'pkg/front_end/lib/src/fasta/source/outline_builder.dart': null,
-  'pkg/front_end/lib/src/fasta/util/link.dart': null,
-  'pkg/front_end/lib/src/fasta/util/link_implementation.dart': null,
-  'pkg/js_ast/lib/src/builder.dart': null,
-  'pkg/js_ast/lib/src/template.dart': null,
-  'pkg/kernel/lib/ast.dart': null,
-  'pkg/kernel/lib/clone.dart': null,
-  'pkg/kernel/lib/import_table.dart': null,
-  'pkg/kernel/lib/kernel.dart': null,
-  'pkg/kernel/lib/text/ast_to_text.dart': null,
-  'third_party/pkg/dart2js_info/lib/json_info_codec.dart': null,
-  'third_party/pkg/dart2js_info/lib/src/measurements.dart': null,
-  'third_party/pkg/dart2js_info/lib/src/util.dart': null,
-  'third_party/pkg/source_span/lib/src/file.dart': null,
-  'third_party/pkg/source_span/lib/src/span_mixin.dart': null,
-};
-
+// TODO(johnniwinther): Remove unneeded dynamic accesses from dart2js source
+// code.
 main(List<String> args) {
   asyncTest(() async {
-    Map<String, List<String>> allowed = {};
-    allowed.addAll(api.allowedList);
-    allowed.addAll(allowedList);
-    await run(Uri.parse('package:compiler/src/dart2js.dart'),
-        allowedList: allowed, verbose: args.contains('-v'));
+    await run(
+        Uri.parse('package:compiler/src/dart2js.dart'),
+        'tests/compiler/dart2js/analyses/dart2js_allowed.json',
+        [
+          'package:compiler/',
+          'package:js_ast/',
+          'package:dart2js_info/',
+          'package:js_runtime/'
+        ],
+        verbose: args.contains('-v'),
+        generate: args.contains('-g'));
   });
 }
diff --git a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
new file mode 100644
index 0000000..3a5fabe
--- /dev/null
+++ b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/ir/static_type.dart';
+import 'package:compiler/src/library_loader.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+
+import '../helpers/memory_compiler.dart';
+
+const String source = '''
+main() {}
+''';
+
+main() {
+  asyncTest(() async {
+    Compiler compiler =
+        await compilerFor(memorySourceFiles: {'main.dart': source});
+    LoadedLibraries loadedLibraries = await compiler.libraryLoader
+        .loadLibraries(Uri.parse('memory:main.dart'));
+    ir.Component component = loadedLibraries.component;
+    StaticTypeVisitor visitor = new Visitor(component);
+    component.accept(visitor);
+  });
+}
+
+class Visitor extends StaticTypeTraversalVisitor {
+  Visitor(ir.Component component)
+      : super(new ir.TypeEnvironment(
+            new ir.CoreTypes(component), new ir.ClassHierarchy(component)));
+
+  ir.DartType getStaticType(ir.Expression node) {
+    if (typeEnvironment == null) {
+      // The class hierarchy crashes on multiple inheritance. Use `dynamic`
+      // as static type.
+      return const ir.DynamicType();
+    }
+    ir.TreeNode enclosingClass = node;
+    while (enclosingClass != null && enclosingClass is! ir.Class) {
+      enclosingClass = enclosingClass.parent;
+    }
+    try {
+      typeEnvironment.thisType =
+          enclosingClass is ir.Class ? enclosingClass.thisType : null;
+      return node.getStaticType(typeEnvironment);
+    } catch (e) {
+      // The static type computation crashes on type errors. Use `dynamic`
+      // as static type.
+      return const ir.DynamicType();
+    }
+  }
+}
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index b39dc5f4f..d510bbc 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -25,6 +25,7 @@
 inference/swarm_test: Slow, Pass, Fail #
 inference/type_mask2_test: RuntimeError # Issue 34095
 inlining/inlining_test: Slow, Pass
+model/in_user_code_test: RuntimeError # Two libraries with the same name -- actually a CompileTimeError
 model/native_test: Pass, Slow
 model/no_such_method_enabled_test: Pass, Slow
 model/subtype_test: Pass, Slow
diff --git a/tests/compiler/dart2js/helpers/element_lookup.dart b/tests/compiler/dart2js/helpers/element_lookup.dart
index 4a46d08..a0c97ba 100644
--- a/tests/compiler/dart2js/helpers/element_lookup.dart
+++ b/tests/compiler/dart2js/helpers/element_lookup.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:compiler/src/common_elements.dart' show ElementEnvironment;
+import 'package:compiler/src/common_elements.dart' show JElementEnvironment;
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:compiler/src/world.dart' show JClosedWorld;
 
 ClassEntity findClass(JClosedWorld closedWorld, String name) {
-  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   ClassEntity cls =
       elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
   cls ??= elementEnvironment.lookupClass(
@@ -40,7 +40,7 @@
     memberName = memberName.substring(0, memberName.length - 1);
     isSetter = true;
   }
-  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   ClassEntity cls = findClass(closedWorld, className);
   assert(cls != null, "Class '$className' not found.");
   MemberEntity member =
@@ -59,7 +59,7 @@
     name = name.substring(0, name.length - 1);
     isSetter = true;
   }
-  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   MemberEntity member = elementEnvironment.lookupLibraryMember(
       elementEnvironment.mainLibrary, name,
       setter: isSetter);
diff --git a/tests/compiler/dart2js/helpers/program_lookup.dart b/tests/compiler/dart2js/helpers/program_lookup.dart
index ba7d268..ab3ecff 100644
--- a/tests/compiler/dart2js/helpers/program_lookup.dart
+++ b/tests/compiler/dart2js/helpers/program_lookup.dart
@@ -10,14 +10,14 @@
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js/js.dart' as js;
 
-ClassEntity lookupClass(ElementEnvironment elementEnvironment, String name) {
+ClassEntity lookupClass(JElementEnvironment elementEnvironment, String name) {
   ClassEntity cls =
       elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
   Expect.isNotNull(cls, "No class '$name' found in the main library.");
   return cls;
 }
 
-MemberEntity lookupMember(ElementEnvironment elementEnvironment, String name) {
+MemberEntity lookupMember(JElementEnvironment elementEnvironment, String name) {
   MemberEntity member;
   int dotIndex = name.indexOf('.');
   if (dotIndex != -1) {
diff --git a/tests/compiler/dart2js/helpers/type_test_helper.dart b/tests/compiler/dart2js/helpers/type_test_helper.dart
index c4304da..9576e09 100644
--- a/tests/compiler/dart2js/helpers/type_test_helper.dart
+++ b/tests/compiler/dart2js/helpers/type_test_helper.dart
@@ -99,7 +99,7 @@
   DartType getElementType(String name) {
     dynamic element = getElement(name);
     if (element is FieldEntity) {
-      return elementEnvironment.getFieldType(element);
+      return (elementEnvironment as JElementEnvironment).getFieldType(element);
     } else if (element is FunctionEntity) {
       return elementEnvironment.getFunctionType(element);
     } else if (element is ClassEntity) {
@@ -131,7 +131,7 @@
   DartType getMemberType(String name, [ClassEntity cls]) {
     MemberEntity member = _getMember(name, cls);
     if (member is FieldEntity) {
-      return elementEnvironment.getFieldType(member);
+      return (elementEnvironment as JElementEnvironment).getFieldType(member);
     } else if (member is FunctionEntity) {
       return elementEnvironment.getFunctionType(member);
     }
@@ -159,7 +159,7 @@
     FieldEntity field =
         elementEnvironment.lookupLibraryMember(mainLibrary, name);
     Expect.isNotNull(field);
-    return elementEnvironment.getFieldType(field);
+    return (elementEnvironment as JElementEnvironment).getFieldType(field);
   }
 
   bool isSubtype(DartType T, DartType S) {
diff --git a/tests/compiler/dart2js/impact/data/promotion.dart b/tests/compiler/dart2js/impact/data/promotion.dart
new file mode 100644
index 0000000..f7022a2
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/promotion.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {}
+
+class SubClass extends Class {
+  method() {}
+}
+
+/*element: main:
+ static=[
+  dynamicToEquals(1),
+  dynamicToHashCode(1),
+  dynamicToNoSuchMethod(1),
+  dynamicToNoSuchMethodTearOff(1),
+  dynamicToNoSuchMethodWrong(1),
+  dynamicToString(1),
+  dynamicToStringTearOff(1),
+  dynamicToStringWrong(1),
+  negativeDynamic(1),
+  positiveDynamic(1),
+  positiveTyped(1)],
+ type=[inst:JSNull]
+*/
+main() {
+  positiveTyped(null);
+  positiveDynamic(null);
+  negativeDynamic(null);
+  dynamicToString(null);
+  dynamicToStringWrong(null);
+  dynamicToStringTearOff(null);
+  dynamicToEquals(null);
+  dynamicToHashCode(null);
+  dynamicToNoSuchMethod(null);
+  dynamicToNoSuchMethodWrong(null);
+  dynamicToNoSuchMethodTearOff(null);
+}
+
+/*element: positiveTyped:dynamic=[SubClass.method(0)],type=[inst:JSBool,is:SubClass,param:Class]*/
+positiveTyped(Class cls) {
+  if (cls is SubClass) cls.method();
+}
+
+/*element: positiveDynamic:dynamic=[SubClass.method(0)],type=[inst:JSBool,is:SubClass]*/
+positiveDynamic(dynamic cls) {
+  if (cls is SubClass) cls.method();
+}
+
+/*element: negativeDynamic:dynamic=[call(0),method(0)],type=[inst:JSBool,is:SubClass]*/
+negativeDynamic(dynamic cls) {
+  if (cls is! SubClass) return;
+  cls.method();
+}
+
+/*element: dynamicToString:dynamic=[toString(0)]*/
+dynamicToString(dynamic cls) {
+  cls.toString();
+}
+
+/*element: dynamicToStringWrong:dynamic=[call(1),toString(1)],type=[inst:JSNull]*/
+dynamicToStringWrong(dynamic cls) {
+  cls.toString(null);
+}
+
+/*element: dynamicToStringTearOff:dynamic=[toString]*/
+dynamicToStringTearOff(dynamic cls) {
+  cls.toString;
+}
+
+/*element: dynamicToEquals:dynamic=[==],type=[inst:JSNull]*/
+dynamicToEquals(dynamic cls) {
+  cls == null;
+}
+
+/*element: dynamicToHashCode:dynamic=[hashCode]*/
+dynamicToHashCode(dynamic cls) {
+  cls.hashCode;
+}
+
+/*element: dynamicToNoSuchMethod:dynamic=[noSuchMethod(1)],type=[inst:JSNull]*/
+dynamicToNoSuchMethod(dynamic cls) {
+  cls.noSuchMethod(null);
+}
+
+/*element: dynamicToNoSuchMethodWrong:dynamic=[call(0),noSuchMethod(0)]*/
+dynamicToNoSuchMethodWrong(dynamic cls) {
+  cls.noSuchMethod();
+}
+
+/*element: dynamicToNoSuchMethodTearOff:dynamic=[noSuchMethod]*/
+dynamicToNoSuchMethodTearOff(dynamic cls) {
+  cls.noSuchMethod;
+}
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 600ae9d..3b31d3c 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -38,7 +38,7 @@
     Compiler compiler = result.compiler;
     KClosedWorld closedWorld =
         compiler.resolutionWorldBuilder.closedWorldForTesting;
-    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+    KElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
     Expect.isNotNull(closedWorld.commonElements.metaNoInlineClass,
         'NoInlineClass is unresolved.');
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index 8a4f0d8..a76638c 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -257,11 +257,11 @@
         'field3=IntConstant(99)))'),
   ]),
   const TestData('redirect', '''
-class A<T> implements B {
+class A<T> implements B<Null> {
   final field1;
   const A({this.field1:42});
 }
-class B<S> implements C {
+class B<S> implements C<Null> {
   const factory B({field1}) = A<B<S>>;
   const factory B.named() = A<S>;
 }
@@ -601,14 +601,14 @@
     CompilationResult result =
         await runCompiler(memorySourceFiles: {'main.dart': source});
     Compiler compiler = result.compiler;
-    ElementEnvironment elementEnvironment =
+    KElementEnvironment elementEnvironment =
         compiler.frontendStrategy.elementEnvironment;
     LibraryEntity library = elementEnvironment.mainLibrary;
     constants.forEach((String name, ConstantData data) {
       FieldEntity field = elementEnvironment.lookupLibraryMember(library, name);
       compiler.reporter.withCurrentElement(field, () {
         ConstantExpression constant =
-            elementEnvironment.getFieldConstant(field);
+            elementEnvironment.getFieldConstantForTesting(field);
 
         var expectedResults = data.expectedResults;
         if (expectedResults is String) {
diff --git a/tests/compiler/dart2js/model/constant_expression_test.dart b/tests/compiler/dart2js/model/constant_expression_test.dart
index 4ab5072..dee8ee5 100644
--- a/tests/compiler/dart2js/model/constant_expression_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_test.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
+import 'package:compiler/src/common_elements.dart' show KElementEnvironment;
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/constants/expressions.dart';
 import 'package:compiler/src/kernel/element_map_impl.dart';
@@ -233,11 +234,11 @@
         }),
   ]),
   const TestData('''
-class A<T> implements B {
+class A<T> implements B<Null> {
   final field1;
   const A({this.field1:42});
 }
-class B<S> implements C {
+class B<S> implements C<Null> {
   const factory B({field1}) = A<B<S>>;
   const factory B.named() = A<S>;
 }
@@ -340,7 +341,8 @@
   CompilationResult result =
       await runCompiler(memorySourceFiles: {'main.dart': source});
   Compiler compiler = result.compiler;
-  var elementEnvironment = compiler.frontendStrategy.elementEnvironment;
+  KElementEnvironment elementEnvironment =
+      compiler.frontendStrategy.elementEnvironment;
 
   MemoryEnvironment environment = new MemoryEnvironment(
       new KernelEvaluationEnvironment(
@@ -350,7 +352,7 @@
   dynamic library = elementEnvironment.mainLibrary;
   constants.forEach((String name, ConstantData data) {
     FieldEntity field = elementEnvironment.lookupLibraryMember(library, name);
-    dynamic constant = elementEnvironment.getFieldConstant(field);
+    dynamic constant = elementEnvironment.getFieldConstantForTesting(field);
     Expect.equals(
         data.kind,
         constant.kind,
diff --git a/tests/compiler/dart2js/model/instantiated_classes_test.dart b/tests/compiler/dart2js/model/instantiated_classes_test.dart
index 3c3e074..8b43948 100644
--- a/tests/compiler/dart2js/model/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/model/instantiated_classes_test.dart
@@ -71,8 +71,8 @@
                   class Class extends B with A {}""", ["Class", "A"],
         ["Class", "A"]);
 
-    await test("""class A {}
-                  class Class implements A {
+    await test("""class A implements Class {}
+                  class Class {
                     factory Class() = A;
                   }""", ["A"], ["Class"]);
   }
diff --git a/tests/compiler/dart2js/model/supermixin_test.dart b/tests/compiler/dart2js/model/supermixin_test.dart
index b0ed2a4..3533fe7 100644
--- a/tests/compiler/dart2js/model/supermixin_test.dart
+++ b/tests/compiler/dart2js/model/supermixin_test.dart
@@ -42,7 +42,7 @@
         options: <String>[Flags.disableInlining]);
     Expect.isTrue(result.isSuccess);
 
-    ElementEnvironment elementEnvironment =
+    JElementEnvironment elementEnvironment =
         result.compiler.backendClosedWorldForTesting.elementEnvironment;
 
     ClassEntity cls = lookupClass(elementEnvironment, 'Class');
diff --git a/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart b/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart
index e26c0a2..d045fa7 100644
--- a/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart
@@ -32,6 +32,12 @@
   method6<T>() => null;
 }
 
+/*strong.class: Class4:explicit=[Class4]*/
+class Class4 {}
+
+/*strong.element: method10:needsArgs*/
+method10<T extends Class4>() => null;
+
 main() {
   /*strong.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
   method7<T extends Class1a>() => null;
@@ -75,4 +81,6 @@
     f7<Class2a<num>>();
     f8<Class2b<String>>();
   }
+
+  method10();
 }
diff --git a/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart b/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
new file mode 100644
index 0000000..421d6bd
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T method1a<T>() => null;
+T method1b<T>() => null;
+
+class Class {
+  T method2a<T>() => null;
+  T method2b<T>() => null;
+}
+
+main() {
+  method1a();
+  T Function<T>() f1 = method1b;
+
+  Class c = new Class();
+  c.method2a();
+  T Function<T>() f2 = c.method2b;
+
+  print(f1.runtimeType == f2.runtimeType);
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
index 4d501bb..ac7d406 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -4,16 +4,14 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.element: method1a:needsArgs*/
-/*omit.element: method1a:needsArgs*/
+/*element: method1a:*/
 T method1a<T>() => null;
 
-/*strong.element: method1b:needsArgs*/
-/*omit.element: method1b:needsArgs*/
+/*element: method1b:*/
 T method1b<T>() => null;
 
 /*strong.element: method2:direct,explicit=[method2.T],needsArgs*/
-/*omit.element: method2:needsArgs*/
+/*omit.element: method2:*/
 T method2<T>(T t, String s) => t;
 
 /*strong.class: Class:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
index 2735441..d597301 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -11,16 +11,14 @@
   /*omit.element: Class1.:*/
   Class1();
 
-  /*strong.element: Class1.method1a:needsArgs*/
-  /*omit.element: Class1.method1a:needsArgs*/
+  /*element: Class1.method1a:*/
   T method1a<T>() => null;
 
-  /*strong.element: Class1.method1b:needsArgs*/
-  /*omit.element: Class1.method1b:needsArgs*/
+  /*element: Class1.method1b:*/
   T method1b<T>() => null;
 
   /*strong.element: Class1.method2:direct,explicit=[method2.T],needsArgs*/
-  /*omit.element: Class1.method2:needsArgs*/
+  /*omit.element: Class1.method2:*/
   T method2<T>(T t, String s) => t;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
index 318d8e8..907e515 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
@@ -4,25 +4,20 @@
 
 /*class: Class1:*/
 class Class1 {
-  /*strong.element: Class1.:*/
-  /*omit.element: Class1.:*/
+  /*element: Class1.:*/
   Class1();
 
-  /*strong.element: Class1.method:needsArgs*/
-  /*omit.element: Class1.method:*/
+  /*element: Class1.method:*/
   T method<T>() => null;
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*class: Class2:*/
 class Class2<T> {
-  /*strong.element: Class2.:*/
-  /*omit.element: Class2.:*/
+  /*element: Class2.:*/
   Class2();
 }
 
-/*strong.element: main:*/
-/*omit.element: main:*/
+/*element: main:*/
 main() {
   Class1 cls1 = new Class1();
   print(cls1.method.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
index 1fcaa30..b684856 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
@@ -2,24 +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.
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*class: Class:*/
 class Class<T> {
-  /*strong.element: Class.:*/
-  /*omit.element: Class.:*/
+  /*element: Class.:*/
   Class();
 }
 
-/*strong.element: method1:needsArgs*/
-/*omit.element: method1:*/
+/*element: method1:*/
 method1<T>() {}
 
-/*strong.element: method2:needsArgs*/
-/*omit.element: method2:*/
+/*element: method2:*/
 method2<T>(t, s) => t;
 
-/*strong.element: main:*/
-/*omit.element: main:*/
+/*element: main:*/
 main() {
   print('${method1.runtimeType}');
   method2(0, '');
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index b933aad..c4749ad 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -77,7 +77,7 @@
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
-    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+    JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     RuntimeTypesNeed rtiNeed = closedWorld.rtiNeed;
     ProgramLookup programLookup = new ProgramLookup(compiler);
 
diff --git a/tests/compiler/dart2js/sourcemaps/name_test.dart b/tests/compiler/dart2js/sourcemaps/name_test.dart
index 257458e..3db6952 100644
--- a/tests/compiler/dart2js/sourcemaps/name_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/name_test.dart
@@ -7,6 +7,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart' show JElementEnvironment;
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/io/kernel_source_information.dart';
@@ -80,7 +81,8 @@
         options: [Flags.disableInlining]);
     Compiler compiler = result.compiler;
     JsBackendStrategy backendStrategy = compiler.backendStrategy;
-    var env = compiler.backendClosedWorldForTesting.elementEnvironment;
+    JElementEnvironment env =
+        compiler.backendClosedWorldForTesting.elementEnvironment;
     LibraryEntity mainApp = env.mainLibrary;
 
     check(MemberEntity element, String expectedName) {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
new file mode 100644
index 0000000..efd86c0
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class SuperA1 {
+  method1(a) => 'A1.m1$a';
+}
+
+class SuperA2 {
+  method2(a) => 'A2.m2$a';
+}
+
+class SuperA {
+  method1(a) => 'A.m1$a';
+  method2(a) => 'A.m2$a';
+}
+
+class SuperB1 extends SuperA implements SuperA1 {
+  method1(a) => 'B1.m1$a';
+}
+
+class SuperB2 extends SuperB1 implements SuperA2 {
+  method2(a) => 'B2.m2$a';
+}
+
+mixin Mixin on SuperA1, SuperA2 {
+  method1(a) => super.method1('M$a');
+  method2(a) => super.method2('M$a');
+}
+
+class Class extends SuperB2 with Mixin {}
+
+main() {
+  var c = new Class();
+  Expect.equals("B1.m1MC", c.method1('C'));
+  Expect.equals("B2.m2MC", c.method2('C'));
+}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
new file mode 100644
index 0000000..81fa7f29
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class SuperA {
+  method(a, [b = 'foo']) => 'A$a$b';
+}
+
+class SuperB extends SuperA {
+  method(a, [b = 'foo']) => 'B$a$b';
+}
+
+mixin Mixin on SuperA {
+  method2(a) => super.method('M$a');
+}
+
+class Class extends SuperB with Mixin {}
+
+main() {
+  var c = new Class();
+  Expect.equals("BMCfoo", c.method2('C'));
+}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
new file mode 100644
index 0000000..142e893
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class SuperA {
+  method(a) => 'A$a';
+}
+
+class SuperB extends SuperA {
+  method(a, [b = 'foo']) => 'B$a$b';
+}
+
+mixin Mixin on SuperA {
+  method2(a) => super.method('M$a');
+}
+
+class Class extends SuperB with Mixin {}
+
+main() {
+  var c = new Class();
+  Expect.equals("BMCfoo", c.method2('C'));
+}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
new file mode 100644
index 0000000..224baa4
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class SuperA {
+  method(a) => 'A$a';
+}
+
+class SuperB implements SuperA {
+  method(a) => 'B$a';
+}
+
+mixin Mixin on SuperA {
+  method(a) => super.method('M$a');
+}
+
+class Class extends SuperB with Mixin {}
+
+main() {
+  var c = new Class();
+  Expect.equals("BMC", c.method('C'));
+} 
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
new file mode 100644
index 0000000..a2df040
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class SuperA {
+  method(a) => 'A$a';
+}
+
+class SuperB extends SuperA {
+  method(a) => 'B$a';
+}
+
+mixin Mixin on SuperA {
+  method(a) => super.method('M$a');
+}
+
+class Class extends SuperB with Mixin {}
+
+main() {
+  var c = new Class();
+  Expect.equals("BMC", c.method('C'));
+} 
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
new file mode 100644
index 0000000..09e0267
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class SuperA1 {}
+
+class SuperA2 {}
+
+class InterfaceA {}
+
+mixin MixinA on SuperA1, SuperA2 implements InterfaceA {}
+
+class SuperB1<T> {}
+
+class SuperB2<T> {}
+
+class SuperB3<T> {}
+
+class InterfaceB<T> {}
+
+mixin MixinB<T> on SuperB1<List<T>>, SuperB2<int>, SuperB3<T>
+    implements InterfaceB<Map<int, T>> {}
+
+class C extends SuperA1 with SuperA2 {}
+
+main() {
+  var listA = <MixinA>[];
+  Expect.isTrue(listA is List<MixinA>);
+  Expect.isTrue(listA is List<SuperA1>);
+  Expect.isTrue(listA is List<SuperA2>);
+  Expect.isTrue(listA is List<InterfaceA>);
+
+  var listB = <MixinB<String>>[];
+  Expect.isTrue(listB is List<MixinB<String>>);
+  Expect.isTrue(listB is List<SuperB1<List<String>>>);
+  Expect.isTrue(listB is List<SuperB2<int>>);
+  Expect.isTrue(listB is List<SuperB3<String>>);
+  Expect.isTrue(listB is List<InterfaceB<Map<int, String>>>);
+
+} 
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
new file mode 100644
index 0000000..7752bc7
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class S {}
+class M {}
+
+class SuperC = S with M;
+
+class SuperA {
+}
+
+class SuperB extends SuperA {
+}
+
+mixin Mixin on SuperC, SuperA {
+}
+
+class Class extends SuperB with Mixin {}
+
+@AssumeDynamic()
+@NoInline()
+test(c) {
+  Expect.isTrue(c is Mixin, "Unexpected result for $c is Mixin");
+  Expect.isTrue(c is SuperC, "Unexpected result for $c is SuperC");
+  Expect.isTrue(c is SuperA, "Unexpected result for $c is SuperA");
+  Expect.isTrue(c is S, "Unexpected result for $c is S");
+  Expect.isTrue(c is M, "Unexpected result for $c is M");
+}
+
+main() {
+  new SuperC();
+  test(new Class());
+}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
new file mode 100644
index 0000000..8153da1
--- /dev/null
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class S {}
+class M {}
+
+class SuperC = S with M;
+
+class SuperA {
+}
+
+class SuperB extends SuperA {
+}
+
+mixin Mixin on SuperA, SuperC {
+}
+
+class Class extends SuperB with Mixin {}
+
+@AssumeDynamic()
+@NoInline()
+test(c) {
+  Expect.isTrue(c is Mixin, "Unexpected result for $c is Mixin");
+  Expect.isTrue(c is SuperC, "Unexpected result for $c is SuperC");
+  Expect.isTrue(c is SuperA, "Unexpected result for $c is SuperA");
+  Expect.isTrue(c is S, "Unexpected result for $c is S");
+  Expect.isTrue(c is M, "Unexpected result for $c is M");
+}
+
+main() {
+  new SuperC();
+  test(new Class());
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index a701a20..7be5f14 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -2,478 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-core_runtime_types_test: RuntimeError # Does not expect bool to have operators.
-maps_test: Skip # Maps class no longer exists
-
-[ $compiler == dart2analyzer ]
-*: Skip
-
-[ $compiler == dart2js ]
-apply3_test: RuntimeError # mirrors not supported
-big_integer_arith_vm_test/add: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/div: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/gcd: CompileTimeError # Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/mod: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/modInv: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/modPow: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/mul: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/negate: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/none: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/overflow: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/shift: CompileTimeError # Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/sub: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_arith_vm_test/trunDiv: CompileTimeError #Large integer literal. Not representable in JS.
-big_integer_parsed_arith_vm_test: RuntimeError
-big_integer_parsed_div_rem_vm_test: RuntimeError
-big_integer_parsed_mul_div_vm_test: RuntimeError
-bit_twiddling_bigint_test: CompileTimeError #Large integer literal. Not representable in JS.
-bit_twiddling_test: CompileTimeError # Large integer literal. Not representable in JS.
-compare_to2_test: RuntimeError
-date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_ceil_test: CompileTimeError # Large integer literal. Not representable in JS.
-double_floor_test: CompileTimeError # Large integer literal. Not representable in JS.
-double_parse_test/01: RuntimeError
-double_round_test: CompileTimeError # Large integer literal. Not representable in JS.
-double_truncate_test: CompileTimeError # Large integer literal. Not representable in JS.
-error_stack_trace1_test: RuntimeError # Issue 12399
-growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-hash_set_test/01: RuntimeError
-int_ceil_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_ceil_to_double_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_floor_test: CompileTimeError #Large integer literal. Not representable in JS.
-int_floor_to_double_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_from_environment_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_modulo_arith_test/bignum: CompileTimeError # Large integer literal. Not representable in JS.
-int_modulo_arith_test/modPow: CompileTimeError # Large integer literal. Not representable in JS.
-int_modulo_arith_test/none: CompileTimeError # Large integer literal. Not representable in JS.
-int_parse_radix_test/01: RuntimeError
-int_parse_radix_test/02: CompileTimeError
-int_round_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_round_to_double_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_to_int_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_truncate_test: CompileTimeError # Large integer literal. Not representable in JS.
-int_truncate_to_double_test: CompileTimeError # Large integer literal. Not representable in JS.
-integer_to_radix_string_test: CompileTimeError # Large integer literal. Not representable in JS.
-integer_to_string_test/01: CompileTimeError # Large integer literal. Not representable in JS.
-iterable_return_type_test/02: RuntimeError
-nan_infinity_test/01: RuntimeError
-num_parse_test/01: CompileTimeError # Large integer literal. Not representable in JS.
-num_parse_test/none: CompileTimeError # Large integer literal. Not representable in JS.
-num_sign_test: CompileTimeError # Large integer literal. Not representable in JS.
-regexp/pcre_test: Pass, Slow # Issue 21593
-regress_r21715_test: CompileTimeError # Large integer literal. Not representable in JS.
-string_base_vm_test: RuntimeError
-symbol_reserved_word_test/03: RuntimeError
-
-[ $compiler == precompiler ]
-apply3_test: SkipByDesign # Imports dart:mirrors
-big_integer_huge_mul_vm_test: Pass, Timeout # --no_intrinsify
-big_integer_parsed_mul_div_vm_test: Pass, Timeout # --no_intrinsify
-error_stack_trace1_test: Skip # Dart 1 AOT to be retired soon.
-error_stack_trace2_test: Skip # Dart 1 AOT to be retired soon.
-error_stack_trace_test: Skip # Dart 1 AOT to be retired soon.
-int_parse_radix_test: Pass, Timeout # --no_intrinsify
-regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
-
-[ $mode == debug ]
-regexp/pcre_test: Pass, Slow # Timeout. Issue 22008
-
-[ $runtime == d8 ]
-uri_base_test: RuntimeError # d8 preamble uses custom URI scheme "org-dartlang-d8-preamble:".
-
-[ $runtime == ff ]
-double_round3_test: Pass, Fail, OK # Fails on ff 34, passes on ff 35. Runtime rounds 0.49999999999999994 to 1.
-double_round_to_double2_test: Pass, Fail, OK # Fails on ff 34, passes on ff 35. Runtime rounds 0.49999999999999994 to 1.
-
-[ $runtime == flutter ]
-apply3_test: CompileTimeError # No support for mirrors
-bool_from_environment_test: Fail # Flutter Issue 9111
-format_exception_test: RuntimeError # Flutter Issue 9111
-from_environment_const_type_test/01: Fail # Flutter Issue 9111
-from_environment_const_type_test/02: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/03: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/04: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/05: Fail # Flutter Issue 9111
-from_environment_const_type_test/06: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/07: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/08: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/09: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/10: Fail # Flutter Issue 9111
-from_environment_const_type_test/11: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/12: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/13: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/14: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/15: Fail # Flutter Issue 9111
-from_environment_const_type_test/16: MissingCompileTimeError # Flutter Issue 9111
-from_environment_const_type_test/none: Fail # Flutter Issue 9111
-int_from_environment2_test: Fail # Flutter Issue 9111
-int_from_environment_test: Fail # Flutter Issue 9111
-main_test: RuntimeError # Flutter Issue 9111
-string_from_environment2_test: Fail # Flutter Issue 9111
-string_from_environment_test: Fail # Flutter Issue 9111
-
-[ $runtime == jsshell ]
-string_case_test/01: RuntimeError # jsshell does not recognize character 223 aka \xdf
-unicode_test: RuntimeError # jsshell does not recognize character 223 aka \xdf
-
-[ $runtime == none ]
-iterable_contains_test: CompileTimeError # Uppercase constants removed.
-map_test: CompileTimeError # Uppercase constants removed.
-
-[ $runtime != none ]
-compare_to_test: RuntimeError # Uppercase constants removed.
-data_uri_test: RuntimeError # Uppercase constants removed.
-date_time_test: RuntimeError # Uppercase constants removed.
-double_ceil2_test: RuntimeError # Uppercase constants removed.
-double_ceil_to_double_test: RuntimeError # Uppercase constants removed.
-double_compare_test: RuntimeError # Uppercase constants removed.
-double_floor2_test: RuntimeError # Uppercase constants removed.
-double_floor_to_double_test: RuntimeError # Uppercase constants removed.
-double_parse_test/01: RuntimeError # Uppercase constants removed.
-double_parse_test/02: RuntimeError # Uppercase constants removed.
-double_parse_test/03: RuntimeError # Uppercase constants removed.
-double_parse_test/none: RuntimeError # Uppercase constants removed.
-double_round2_test: RuntimeError # Uppercase constants removed.
-double_round_to_double_test: RuntimeError # Uppercase constants removed.
-double_truncate2_test: RuntimeError # Uppercase constants removed.
-double_truncate_to_double_test: RuntimeError # Uppercase constants removed.
-double_try_parse_test/01: RuntimeError # Uppercase constants removed.
-double_try_parse_test/02: RuntimeError # Uppercase constants removed.
-double_try_parse_test/03: RuntimeError # Uppercase constants removed.
-double_try_parse_test/none: RuntimeError # Uppercase constants removed.
-hash_set_test/01: RuntimeError # Uppercase constants removed.
-hash_set_test/none: RuntimeError # Uppercase constants removed.
-iterable_contains_test: CompileTimeError # Uppercase constants removed.
-json_map_test: RuntimeError # Uppercase constants removed.
-map_from_test: Fail # Assumes LinkedHashMap implements HashMap.
-map_test: CompileTimeError, RuntimeError # Uppercase constants removed.
-nan_infinity_test/01: RuntimeError # Uppercase constants removed.
-nan_infinity_test/none: RuntimeError # Uppercase constants removed.
-num_clamp_test: RuntimeError # Uppercase constants removed.
-string_source_test: RuntimeError # Uppercase constants removed.
-uri_test: RuntimeError # Uppercase constants removed.
-
-[ $runtime == safari ]
-double_round3_test: RuntimeError
-double_round_to_double2_test: Pass, Fail, OK
-string_trimlr_test/unicode63: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
-[ $fasta ]
-symbol_reserved_word_test/04: MissingCompileTimeError
-symbol_reserved_word_test/07: MissingCompileTimeError
-symbol_reserved_word_test/10: MissingCompileTimeError
-symbol_test/02: MissingCompileTimeError
-symbol_test/03: MissingCompileTimeError
-
-[ $strong ]
-*: SkipByDesign # tests/corelib_2 has the strong mode versions of these tests.
-
-[ $arch == simarmv5te && ($runtime == dart_precompiled || $runtime == vm) ]
-big_integer_parsed_mul_div_vm_test: Pass, Slow
-int_parse_radix_test/*: Pass, Slow
-
-[ $arch == x64 && $system == windows ]
-stopwatch_test: Skip # Flaky test due to expected performance behaviour.
-
-[ $compiler != dart2analyzer && $runtime != dart_precompiled && $runtime != vm ]
-data_resource_test: RuntimeError # Issue 23825 (not implemented yet).
-file_resource_test: Skip, OK # VM specific test, uses dart:io.
-http_resource_test: Skip, OK # VM specific test, uses dart:io.
-
-[ $compiler == dart2js && $runtime == chromeOnAndroid ]
-list_as_map_test: Pass, Slow # TODO(kasperl): Please triage.
-string_trimlr_test/unicode63: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
-[ $compiler == dart2js && $runtime != d8 ]
-main_test: RuntimeError
-
-[ $compiler == dart2js && $runtime == none ]
-*: Fail, Pass # TODO(ahe): Triage these tests.
-
-[ $compiler == dart2js && !$browser ]
-package_resource_test: RuntimeError # Issue 26842
-
-[ $compiler == dart2js && $checked ]
-big_integer_arith_vm_test/add: CompileTimeError
-big_integer_arith_vm_test/div: CompileTimeError
-big_integer_arith_vm_test/gcd: CompileTimeError
-big_integer_arith_vm_test/mod: CompileTimeError
-big_integer_arith_vm_test/modInv: CompileTimeError
-big_integer_arith_vm_test/modPow: CompileTimeError
-big_integer_arith_vm_test/mul: CompileTimeError
-big_integer_arith_vm_test/negate: CompileTimeError
-big_integer_arith_vm_test/none: CompileTimeError
-big_integer_arith_vm_test/overflow: CompileTimeError
-big_integer_arith_vm_test/shift: CompileTimeError
-big_integer_arith_vm_test/sub: CompileTimeError
-big_integer_arith_vm_test/trunDiv: CompileTimeError
-bit_twiddling_bigint_test: CompileTimeError
-bit_twiddling_test: CompileTimeError
-double_ceil_test: CompileTimeError
-double_floor_test: CompileTimeError
-double_round_test: CompileTimeError
-double_truncate_test: CompileTimeError
-from_environment_const_type_test/02: MissingCompileTimeError
-from_environment_const_type_test/03: MissingCompileTimeError
-from_environment_const_type_test/04: MissingCompileTimeError
-from_environment_const_type_test/06: MissingCompileTimeError
-from_environment_const_type_test/07: MissingCompileTimeError
-from_environment_const_type_test/08: MissingCompileTimeError
-from_environment_const_type_test/09: MissingCompileTimeError
-from_environment_const_type_test/11: MissingCompileTimeError
-from_environment_const_type_test/12: MissingCompileTimeError
-from_environment_const_type_test/13: MissingCompileTimeError
-from_environment_const_type_test/14: MissingCompileTimeError
-from_environment_const_type_test/16: MissingCompileTimeError
-from_environment_const_type_undefined_test/02: MissingCompileTimeError
-from_environment_const_type_undefined_test/03: MissingCompileTimeError
-from_environment_const_type_undefined_test/04: MissingCompileTimeError
-from_environment_const_type_undefined_test/06: MissingCompileTimeError
-from_environment_const_type_undefined_test/07: MissingCompileTimeError
-from_environment_const_type_undefined_test/08: MissingCompileTimeError
-int_ceil_test: CompileTimeError
-int_ceil_to_double_test: CompileTimeError
-int_floor_test: CompileTimeError
-int_floor_to_double_test: CompileTimeError
-int_from_environment_test: CompileTimeError
-int_modulo_arith_test/bignum: CompileTimeError
-int_modulo_arith_test/modPow: CompileTimeError
-int_modulo_arith_test/none: CompileTimeError
-int_parse_radix_test/02: CompileTimeError
-int_round_test: CompileTimeError
-int_round_to_double_test: CompileTimeError
-int_to_int_test: CompileTimeError
-int_truncate_test: CompileTimeError
-int_truncate_to_double_test: CompileTimeError
-integer_to_radix_string_test: CompileTimeError
-integer_to_string_test/01: CompileTimeError
-num_parse_test/01: CompileTimeError
-num_parse_test/none: CompileTimeError
-num_sign_test: CompileTimeError
-regress_r21715_test: CompileTimeError
-
-[ $compiler == dart2js && $fast_startup ]
-apply3_test: Fail # mirrors not supported
-
-[ $compiler == dart2js && $host_checked ]
-apply3_test: RuntimeError
-big_integer_arith_vm_test/add: CompileTimeError
-big_integer_arith_vm_test/div: CompileTimeError
-big_integer_arith_vm_test/gcd: CompileTimeError
-big_integer_arith_vm_test/mod: CompileTimeError
-big_integer_arith_vm_test/modInv: CompileTimeError
-big_integer_arith_vm_test/modPow: CompileTimeError
-big_integer_arith_vm_test/mul: CompileTimeError
-big_integer_arith_vm_test/negate: CompileTimeError
-big_integer_arith_vm_test/none: CompileTimeError
-big_integer_arith_vm_test/overflow: CompileTimeError
-big_integer_arith_vm_test/shift: CompileTimeError
-big_integer_arith_vm_test/sub: CompileTimeError
-big_integer_arith_vm_test/trunDiv: CompileTimeError
-bit_twiddling_bigint_test: CompileTimeError
-bit_twiddling_test: CompileTimeError
-double_ceil_test: CompileTimeError
-double_floor_test: CompileTimeError
-double_round_test: CompileTimeError
-double_truncate_test: CompileTimeError
-int_ceil_test: CompileTimeError
-int_ceil_to_double_test: CompileTimeError
-int_floor_test: CompileTimeError
-int_floor_to_double_test: CompileTimeError
-int_from_environment_test: CompileTimeError
-int_modulo_arith_test/bignum: CompileTimeError
-int_modulo_arith_test/modPow: CompileTimeError
-int_modulo_arith_test/none: CompileTimeError
-int_parse_radix_test/02: CompileTimeError
-int_round_test: CompileTimeError
-int_round_to_double_test: CompileTimeError
-int_to_int_test: CompileTimeError
-int_truncate_test: CompileTimeError
-int_truncate_to_double_test: CompileTimeError
-integer_to_radix_string_test: CompileTimeError
-integer_to_string_test/01: CompileTimeError
-num_parse_test/01: CompileTimeError
-num_parse_test/none: CompileTimeError
-num_sign_test: CompileTimeError
-regress_r21715_test: CompileTimeError
-
-[ $compiler == dart2js && $minified ]
-apply3_test: RuntimeError
-big_integer_arith_vm_test/add: CompileTimeError
-big_integer_arith_vm_test/div: CompileTimeError
-big_integer_arith_vm_test/gcd: CompileTimeError
-big_integer_arith_vm_test/mod: CompileTimeError
-big_integer_arith_vm_test/modInv: CompileTimeError
-big_integer_arith_vm_test/modPow: CompileTimeError
-big_integer_arith_vm_test/mul: CompileTimeError
-big_integer_arith_vm_test/negate: CompileTimeError
-big_integer_arith_vm_test/none: CompileTimeError
-big_integer_arith_vm_test/overflow: CompileTimeError
-big_integer_arith_vm_test/shift: CompileTimeError
-big_integer_arith_vm_test/sub: CompileTimeError
-big_integer_arith_vm_test/trunDiv: CompileTimeError
-bit_twiddling_bigint_test: CompileTimeError
-bit_twiddling_test: CompileTimeError
-double_ceil_test: CompileTimeError
-double_floor_test: CompileTimeError
-double_round_test: CompileTimeError
-double_truncate_test: CompileTimeError
-int_ceil_test: CompileTimeError
-int_ceil_to_double_test: CompileTimeError
-int_floor_test: CompileTimeError
-int_floor_to_double_test: CompileTimeError
-int_from_environment_test: CompileTimeError
-int_modulo_arith_test/bignum: CompileTimeError
-int_modulo_arith_test/modPow: CompileTimeError
-int_modulo_arith_test/none: CompileTimeError
-int_parse_radix_test/02: CompileTimeError
-int_round_test: CompileTimeError
-int_round_to_double_test: CompileTimeError
-int_to_int_test: CompileTimeError
-int_truncate_test: CompileTimeError
-int_truncate_to_double_test: CompileTimeError
-integer_to_radix_string_test: CompileTimeError
-integer_to_string_test/01: CompileTimeError
-num_parse_test/01: CompileTimeError
-num_parse_test/none: CompileTimeError
-num_sign_test: CompileTimeError
-regress_r21715_test: CompileTimeError
-symbol_operator_test/03: RuntimeError # Issue 27394
-symbol_operator_test/none: RuntimeError
-
-[ $compiler != dart2js && $fasta ]
-big_integer_arith_vm_test/add: CompileTimeError
-big_integer_arith_vm_test/div: CompileTimeError
-big_integer_arith_vm_test/gcd: CompileTimeError
-big_integer_arith_vm_test/mod: CompileTimeError
-big_integer_arith_vm_test/modInv: CompileTimeError
-big_integer_arith_vm_test/modPow: CompileTimeError
-big_integer_arith_vm_test/mul: CompileTimeError
-big_integer_arith_vm_test/negate: CompileTimeError
-big_integer_arith_vm_test/none: CompileTimeError
-big_integer_arith_vm_test/overflow: CompileTimeError
-big_integer_arith_vm_test/shift: CompileTimeError
-big_integer_arith_vm_test/sub: CompileTimeError
-big_integer_arith_vm_test/trunDiv: CompileTimeError
-bit_twiddling_bigint_test: CompileTimeError
-bit_twiddling_test: CompileTimeError
-bool_from_environment2_test/01: MissingCompileTimeError
-bool_from_environment2_test/02: MissingCompileTimeError
-bool_from_environment2_test/03: MissingCompileTimeError
-bool_from_environment2_test/04: MissingCompileTimeError
-bool_from_environment2_test/05: MissingCompileTimeError
-double_ceil_test: CompileTimeError
-double_floor_test: CompileTimeError
-double_round_test: CompileTimeError
-double_truncate_test: CompileTimeError
-int_ceil_test: CompileTimeError
-int_ceil_to_double_test: CompileTimeError
-int_floor_test: CompileTimeError
-int_floor_to_double_test: CompileTimeError
-int_from_environment3_test/01: MissingCompileTimeError
-int_from_environment3_test/02: MissingCompileTimeError
-int_from_environment3_test/03: MissingCompileTimeError
-int_from_environment3_test/04: MissingCompileTimeError
-int_from_environment3_test/05: MissingCompileTimeError
-int_from_environment_test: CompileTimeError
-int_modulo_arith_test/bignum: CompileTimeError
-int_modulo_arith_test/modPow: CompileTimeError
-int_modulo_arith_test/none: CompileTimeError
-int_parse_radix_test/02: CompileTimeError
-int_round_test: CompileTimeError
-int_round_to_double_test: CompileTimeError
-int_to_int_test: CompileTimeError
-int_truncate_test: CompileTimeError
-int_truncate_to_double_test: CompileTimeError
-integer_to_radix_string_test: CompileTimeError
-integer_to_string_test/01: CompileTimeError
-num_parse_test/01: CompileTimeError
-num_parse_test/none: CompileTimeError
-num_sign_test: CompileTimeError
-regress_r21715_test: CompileTimeError
-string_from_environment3_test/01: MissingCompileTimeError
-string_from_environment3_test/02: MissingCompileTimeError
-string_from_environment3_test/03: MissingCompileTimeError
-string_from_environment3_test/04: MissingCompileTimeError
-string_from_environment3_test/05: MissingCompileTimeError
-symbol_test/01: MissingCompileTimeError
-
-[ $runtime != d8 && $runtime != dart_precompiled && $runtime != vm ]
-regexp/*: Skip # The regexp tests are not verified to work on non d8/vm platforms yet.
-
-[ $arch == simdbc || $arch == simdbc64 ]
-regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
-
-[ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
-compare_to2_test: Fail # Bug 4018
-string_case_test/01: Fail # Bug 18061
-symbol_operator_test/03: Fail # bug 11669
-symbol_reserved_word_test/02: CompileTimeError # bug 20191
-symbol_reserved_word_test/04: MissingCompileTimeError # bug 11669, 19972
-symbol_reserved_word_test/05: CompileTimeError # bug 20191
-symbol_reserved_word_test/06: RuntimeError # bug 11669
-symbol_reserved_word_test/07: MissingCompileTimeError # bug 11669, 19972
-symbol_reserved_word_test/09: RuntimeError # bug 11669
-symbol_reserved_word_test/10: MissingCompileTimeError # bug 11669, 19972
-symbol_reserved_word_test/12: RuntimeError # bug 11669
-symbol_test/01: Fail, Pass # bug 11669
-symbol_test/02: MissingCompileTimeError # bug 11669
-symbol_test/03: MissingCompileTimeError # bug 11669
-symbol_test/none: Fail # bug 11669
-unicode_test: Fail # Bug 6706
-
-[ $compiler == app_jit || $compiler == precompiler ]
-data_resource_test: Skip # Resolve URI not supported yet in product mode.
-file_resource_test: Skip # Resolve URI not supported yet in product mode.
-http_resource_test: Skip # Resolve URI not supported yet in product mode.
-package_resource_test: Skip # Resolve URI not supported yet in product mode.
-
-# We skip all the Dart 1.0 tests in dartk and dartkp mode as these
-# modes are intended only for Dart 2.0 with strong mode enabled.
-[ $compiler == app_jitk || $compiler == dartk || $compiler == dartkp ]
-*: SkipByDesign
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
-big_integer_arith_vm_test: CompileTimeError # Large integer literal
-big_integer_parsed_arith_vm_test: RuntimeError # Large integers
-big_integer_parsed_div_rem_vm_test: RuntimeError # Large integers
-big_integer_parsed_mul_div_vm_test: RuntimeError # Large integers
-bit_twiddling_bigint_test: CompileTimeError # Large integer literal
-bit_twiddling_test: CompileTimeError # Large integer literal
-double_ceil_test: CompileTimeError # Large integer literal
-double_floor_test: CompileTimeError # Large integer literal
-double_round_test: CompileTimeError # Large integer literal
-double_truncate_test: CompileTimeError # Large integer literal
-int_ceil_test: CompileTimeError # Large integer literal
-int_ceil_to_double_test: CompileTimeError # Large integer literal
-int_floor_test: CompileTimeError # Large integer literal
-int_floor_to_double_test: CompileTimeError # Large integer literal
-int_from_environment_test: CompileTimeError # Large integer literal
-int_modulo_arith_test: CompileTimeError # Large integer literal
-int_parse_radix_test/02: CompileTimeError # Large integer literal
-int_round_test: CompileTimeError # Large integer literal
-int_round_to_double_test: CompileTimeError # Large integer literal
-int_to_int_test: CompileTimeError # Large integer literal
-int_truncate_test: CompileTimeError # Large integer literal
-int_truncate_to_double_test: CompileTimeError # Large integer literal
-integer_to_radix_string_test: CompileTimeError # Large integer literal
-integer_to_string_test/01: CompileTimeError # Large integer literal
-num_parse_test/01: CompileTimeError # Large integer literal
-num_parse_test/none: CompileTimeError # Large integer literal
-num_sign_test: CompileTimeError # Large integer literal
-regexp/capture-3: Pass, Slow, Timeout # Issues 21593 and 22008
-regexp/global_test: Skip # Timeout. Issue 21709 and 21708
-regexp/pcre_test: Pass, Slow, Timeout # Issues 21593 and 22008
-regress_r21715_test: CompileTimeError # Large integer literal
-
-# Firefox takes advantage of the ECMAScript number parsing cop-out clause
-# (presumably added to allow Mozilla's existing behavior)
-# and only looks at the first 20 significant digits.
-# The Dart VM and the other ECMAScript implementations follow the correct
-# IEEE-754 rounding algorithm.
-[ $runtime == ff || $runtime == jsshell ]
-double_parse_test/02: Fail, OK
-
-[ $hot_reload || $hot_reload_rollback ]
-big_integer_huge_mul_vm_test: Pass, Slow # Slow
-big_integer_parsed_mul_div_vm_test: Pass, Slow # Slow.
+*: SkipByDesign # Deprecating Dart1 tests.
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 8467f2f..caabc0d 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -59,6 +59,12 @@
 int_modulo_arith_test/none: RuntimeError
 string_from_environment3_test/03: Crash
 
+# These tests crash in mixed mode.
+[ $compiler == dartkb ]
+bigint_from_test: Pass, Crash # Please triage
+bigint_parse_radix_test: Pass, Crash # Please triage
+bigint_test: Pass, Crash, RuntimeError # Please triage
+
 [ $compiler == precompiler ]
 bigint_test: Pass, Timeout # --no_intrinsify
 int_parse_radix_test: Pass, Timeout # --no_intrinsify
@@ -400,6 +406,9 @@
 symbol_reserved_word_test/05: MissingCompileTimeError
 symbol_test/01: MissingCompileTimeError
 
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
+
 # Sections for dartk and dartkp.
 #
 # Note: these sections are normalized so we can update them with automated
@@ -414,7 +423,7 @@
 [ !$strong && ($runtime == dart_precompiled || $runtime == vm) ]
 list_test/*: RuntimeError # VM doesn't implement strong mode covariance checks
 
-[ $arch == simarm || $arch == simarm64 || $arch == simdbc64 ]
+[ $arch == simarm || $arch == simarm64 || $arch == simdbc64 || $compiler == dartkb ]
 bigint_parse_radix_test: Pass, Slow # Bigint computations are slow on simulated architectures.
 bigint_test: Pass, Slow, Timeout # Bigint computations are slow on simulated architectures.
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index db0a720..a9613eb 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -2,137 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# No longer supported in dart 2
-scenarios/package_relative_root: Fail
-
-[ $compiler == dart2analyzer ]
-browser/typed_data_message_test: StaticWarning
-
-[ $compiler == dart2js ]
-*: SkipByDesign
-
-[ $compiler == fasta ]
-browser/compute_this_script_browser_test: CompileTimeError # TODO(ahe): Support dart:html in Fasta.
-browser/package_resolve_browser_hook2_test: CompileTimeError # TODO(ahe): Support dart:html in Fasta.
-browser/package_resolve_browser_hook_test: CompileTimeError # TODO(ahe): Support dart:html in Fasta.
-browser/package_resolve_browser_test: CompileTimeError # TODO(ahe): Support dart:html in Fasta.
-isolate_stress_test: CompileTimeError # TODO(ahe): Support dart:html in Fasta.
-
-[ $mode == product ]
-issue_24243_parent_isolate_test: Skip # Requires checked mode
-
-[ $runtime == flutter ]
-isolate_import_test/01: Skip # Flutter Issue 9114
-issue_21398_parent_isolate2_test/01: Skip # Flutter Issue 9114
-simple_message_test/01: Skip # Flutter Issue 9114
-
-[ $runtime != none ]
-kill2_test: RuntimeError # Uppercase constants removed
-kill_self_synchronously_test: RuntimeError # Uppercase constants removed
-kill_test: RuntimeError # Uppercase constants removed
-
-[ $csp ]
-browser/package_resolve_browser_hook_test: SkipByDesign # Test written in a way that violates CSP.
-deferred_in_isolate2_test: Skip # Issue 16898. Deferred loading does not work from an isolate in CSP-mode
-
-[ $jscl ]
-spawn_uri_multi_test/none: RuntimeError # Issue 13544
-
-# The isolate tests were moved to lib_2/isolate, and there they should be
-# made strong mode compliant. There's no sense in running the old versions
-# here.
-[ $strong ]
-*: SkipByDesign
-
-[ $compiler == none && $runtime == vm && $system == fuchsia ]
-*: Skip # Not yet triaged.
-
-[ $compiler == none && ($runtime == flutter || $runtime == vm) ]
-scenarios/short_package/short_package_test: Fail, OK # We do not plan to support the tested behavior anyway.
-
-[ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
-compile_time_error_test/01: Skip # Issue 12587
-kill3_test: Pass, Fail # Bad test: expects total message order
-ping_pause_test: Skip # Resolve test issues
-ping_test: Skip # Resolve test issues
-
-[ $compiler == app_jit || $mode == product || $runtime != vm ]
-checked_test: Skip # Unsupported.
-
-[ $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
-*: Skip # This directory has only Dart1 tests (Dart2 tests are in lib_2/isolate).
-
-[ $compiler != none || $runtime != vm ]
-package_config_test: SkipByDesign # Uses Isolate.packageConfig
-package_resolve_test: SkipByDesign # Uses Isolate.resolvePackageUri
-package_root_test: SkipByDesign # Uses Isolate.packageRoot
-scenarios/*: SkipByDesign # Use automatic package resolution, spawnFunction and .dart URIs.
-spawn_uri_fail_test: SkipByDesign # Uses dart:io.
-
-[ $compiler == precompiler || $runtime == flutter ]
-count_test: SkipByDesign # Imports dart:mirrors
-cross_isolate_message_test: SkipByDesign
-illegal_msg_function_test: SkipByDesign
-illegal_msg_mirror_test: SkipByDesign
-isolate_complex_messages_test: SkipByDesign
-mandel_isolate_test: SkipByDesign
-message2_test: SkipByDesign
-message_test: SkipByDesign
-mint_maker_test: SkipByDesign
-nested_spawn2_test: SkipByDesign
-nested_spawn_test: SkipByDesign
-raw_port_test: SkipByDesign
-request_reply_test: SkipByDesign
-spawn_function_custom_class_test: SkipByDesign
-spawn_function_test: SkipByDesign
-stacktrace_message_test: SkipByDesign
-static_function_test: SkipByDesign
-unresolved_ports_test: SkipByDesign
-
-[ $runtime == dart_precompiled || $runtime == flutter ]
-count_test: Skip # Isolate.spawnUri
-cross_isolate_message_test: Skip # Isolate.spawnUri
-deferred_in_isolate2_test: Skip # Isolate.spawnUri
-deferred_in_isolate_test: Skip # Isolate.spawnUri
-error_at_spawnuri_test: Skip # Isolate.spawnUri
-error_exit_at_spawnuri_test: Skip # Isolate.spawnUri
-exit_at_spawnuri_test: Skip # Isolate.spawnUri
-illegal_msg_function_test: Skip # Isolate.spawnUri
-illegal_msg_mirror_test: Skip # Isolate.spawnUri
-isolate_complex_messages_test: Skip # Isolate.spawnUri
-issue_21398_parent_isolate1_test: Skip # Isolate.spawnUri
-issue_21398_parent_isolate_test: Skip # Isolate.spawnUri
-issue_24243_parent_isolate_test: Skip # Isolate.spawnUri
-mandel_isolate_test: Skip # Isolate.spawnUri
-message2_test: Skip # Isolate.spawnUri
-message_test: Skip # Isolate.spawnUri
-mint_maker_test: Skip # Isolate.spawnUri
-nested_spawn2_test: Skip # Isolate.spawnUri
-nested_spawn_test: Skip # Isolate.spawnUri
-raw_port_test: Skip # Isolate.spawnUri
-request_reply_test: Skip # Isolate.spawnUri
-spawn_function_custom_class_test: Skip # Isolate.spawnUri
-spawn_function_test: Skip # Isolate.spawnUri
-spawn_uri_exported_main_test: Skip # Isolate.spawnUri
-spawn_uri_missing_from_isolate_test: Skip # Isolate.spawnUri
-spawn_uri_missing_test: Skip # Isolate.spawnUri
-spawn_uri_multi_test: Skip # Isolate.spawnUri
-spawn_uri_nested_vm_test: Skip # Isolate.spawnUri
-spawn_uri_test: Skip # Isolate.spawnUri
-spawn_uri_vm_test: Skip # Isolate.spawnUri
-stacktrace_message_test: Skip # Isolate.spawnUri
-static_function_test: Skip # Isolate.spawnUri
-unresolved_ports_test: Skip # Isolate.spawnUri
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
-browser/*: SkipByDesign # Browser specific tests
-isolate_stress_test: Skip # Issue 12588: Uses dart:html. This should be able to pass when we have wrapper-less tests.
-stacktrace_message_test: RuntimeError # Fails to send stacktrace object.
-
-[ $hot_reload || $hot_reload_rollback ]
-deferred_in_isolate2_test: Crash # Requires deferred libraries
-deferred_in_isolate_test: Crash # Requires deferred libraries
-function_send_test: Pass, Fail # Closure identity
-issue_21398_parent_isolate2_test: Crash # Requires deferred libraries
-message3_test/fun: Pass, Fail # Closure identity
-spawn_uri_nested_vm_test: Pass, Crash # Issue 28192
+*: SkipByDesign # Deprecating all Dart1 mode tests
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index 4602e94..fd35205 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -31,3 +31,6 @@
 
 [ $runtime == dart_precompiled && $minified ]
 unsorted/symbol_literal_test: Skip # Expects unobfuscated Symbol.toString.
+
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
diff --git a/tests/language/language.status b/tests/language/language.status
index a655de2..586ed90 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -4,560 +4,4 @@
 # This directory contains tests that are intended to show the
 # current state of the language.
 
-[ $compiler == app_jit ]
-deferred_inheritance_constraints_test/redirecting_constructor: Crash
-
-[ $compiler == dart2analyzer ]
-config_import_corelib_test: StaticWarning, OK
-vm/regress_27201_test: SkipByDesign # Loads bad library, so will always crash.
-
-[ $compiler == precompiler ]
-deferred_global_test: Skip # Deferred loading happens eagerly.
-deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot
-error_stacktrace_test: Skip # Dart 1 AOT to be retired soon.
-implicit_closure_test: Skip # Incompatible flag: --use_slow_path
-regress_23408_test: RuntimeError
-stacktrace_rethrow_error_test/*: Skip # Dart 1 AOT to be retired soon.
-vm/optimized_guarded_field_test: Skip # Dart 1 AOT to be retired soon.
-vm/regress_27201_test: Skip # Deferred loading happens eagerly.
-
-[ $mode == debug ]
-large_class_declaration_test: Slow, Pass
-
-[ $mode == product ]
-assertion_test: SkipByDesign # Requires checked mode.
-generic_test: SkipByDesign # Requires checked mode.
-issue13474_test: SkipByDesign # Requires checked mode.
-list_literal4_test: SkipByDesign # Requires checked mode.
-map_literal4_test: SkipByDesign # Requires checked mode.
-named_parameters_type_test/01: SkipByDesign # Requires checked mode.
-named_parameters_type_test/02: SkipByDesign # Requires checked mode.
-named_parameters_type_test/03: SkipByDesign # Requires checked mode.
-positional_parameters_type_test/01: SkipByDesign # Requires checked mode.
-positional_parameters_type_test/02: SkipByDesign # Requires checked mode.
-stacktrace_demangle_ctors_test: SkipByDesign # Names are not scrubbed.
-type_checks_in_factory_method_test: SkipByDesign # Requires checked mode.
-vm/type_vm_test: Fail, OK # Expects exact type name.
-
-[ $runtime == dart_precompiled ]
-const_evaluation_test: SkipByDesign # Imports dart:mirrors
-deferred_constraints_constants_test: SkipByDesign # Imports dart:mirrors
-enum_mirror_test: SkipByDesign # Imports dart:mirrors
-field_increment_bailout_test: SkipByDesign # Imports dart:mirrors
-instance_creation_in_function_annotation_test: SkipByDesign # Imports dart:mirrors
-invocation_mirror2_test: SkipByDesign # Imports dart:mirrors
-invocation_mirror_invoke_on2_test: SkipByDesign # Imports dart:mirrors
-invocation_mirror_invoke_on_test: SkipByDesign # Imports dart:mirrors
-issue21079_test: SkipByDesign # Imports dart:mirrors
-library_env_test/has_mirror_support: RuntimeError, OK # The test is supposed to fail.
-many_overridden_no_such_method_test: SkipByDesign # Imports dart:mirrors
-no_such_method_test: SkipByDesign # Imports dart:mirrors
-null_test/none: SkipByDesign # Imports dart:mirrors
-overridden_no_such_method_test: SkipByDesign # Imports dart:mirrors
-redirecting_factory_reflection_test: SkipByDesign # Imports dart:mirrors
-regress_13462_0_test: SkipByDesign # Imports dart:mirrors
-regress_13462_1_test: SkipByDesign # Imports dart:mirrors
-regress_18535_test: SkipByDesign # Imports dart:mirrors
-regress_28255_test: SkipByDesign # Imports dart:mirrors
-super_call4_test: SkipByDesign # Imports dart:mirrors
-super_getter_setter_test: SkipByDesign # Imports dart:mirrors
-vm/reflect_core_vm_test: SkipByDesign # Imports dart:mirrors
-
-# flutter uses --error_on_bad_type, --error_on_bad_override
-# and --await_is_keyword so # the following tests fail with
-# a Compilation Error
-[ $runtime == flutter ]
-async_await_syntax_test/a05c: CompileTimeError
-async_await_syntax_test/a05e: CompileTimeError
-async_await_syntax_test/d08c: CompileTimeError
-async_await_test: CompileTimeError
-async_return_types_test/nestedFuture: Skip # Flutter Issue 9110
-async_return_types_test/return_value_sync_star: Skip # Flutter Issue 9110
-async_return_types_test/tooManyTypeParameters: CompileTimeError
-async_return_types_test/wrongReturnType: Skip # Flutter Issue 9110
-async_return_types_test/wrongTypeParameter: Skip # Flutter Issue 9110
-async_star_cancel_while_paused_test: Skip # Flutter Issue 9110
-async_star_no_cancel_test: Skip # Flutter Issue 9110
-asyncstar_yield_test: Skip # Flutter Issue 9110
-await_backwards_compatibility_test/none: CompileTimeError
-await_for_cancel_test: Skip # Flutter Issue 9110
-await_for_test: Skip # Flutter Issue 9110
-await_test: CompileTimeError
-bad_override_test/06: CompileTimeError
-call_constructor_on_unresolvable_class_test/01: CompileTimeError
-call_constructor_on_unresolvable_class_test/02: CompileTimeError
-call_constructor_on_unresolvable_class_test/03: CompileTimeError
-call_constructor_on_unresolvable_class_test/07: CompileTimeError
-check_method_override_test/01: CompileTimeError
-check_method_override_test/02: CompileTimeError
-class_keyword_test/02: CompileTimeError
-class_override_test/00: CompileTimeError
-conditional_import_string_test: CompileTimeError
-conditional_import_test: CompileTimeError
-config_import_test: RuntimeError # Flutter Issue 9110
-const_evaluation_test/01: CompileTimeError
-const_evaluation_test/none: CompileTimeError
-const_types_test/01: CompileTimeError
-const_types_test/02: CompileTimeError
-const_types_test/03: CompileTimeError
-const_types_test/04: CompileTimeError
-const_types_test/05: CompileTimeError
-const_types_test/06: CompileTimeError
-const_types_test/13: CompileTimeError
-const_types_test/35: CompileTimeError
-const_types_test/40: CompileTimeError
-default_factory_test/01: CompileTimeError
-deferred_closurize_load_library_test: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_constant_list_test: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_constraints_constants_test/none: CompileTimeError
-deferred_constraints_constants_test/reference_after_load: CompileTimeError
-deferred_constraints_type_annotation_test/as_operation: CompileTimeError
-deferred_constraints_type_annotation_test/catch_check: CompileTimeError
-deferred_constraints_type_annotation_test/is_check: CompileTimeError
-deferred_constraints_type_annotation_test/new: CompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: CompileTimeError
-deferred_constraints_type_annotation_test/new_generic1: CompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: CompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: CompileTimeError
-deferred_constraints_type_annotation_test/none: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_constraints_type_annotation_test/static_method: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_constraints_type_annotation_test/type_annotation_generic2: CompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: CompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: CompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: CompileTimeError
-deferred_global_test: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_inheritance_constraints_test/redirecting_constructor: CompileTimeError
-deferred_mixin_test: CompileTimeError
-deferred_no_such_method_test: CompileTimeError
-deferred_not_loaded_check_test: CompileTimeError
-deferred_redirecting_factory_test: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_shadow_load_library_test: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_shared_and_unshared_classes_test: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_static_seperate_test: CompileTimeError
-deferred_super_dependency_test/01: CompileTimeError
-deferred_type_dependency_test/as: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_type_dependency_test/is: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_type_dependency_test/none: Skip # Timeout, deferred loading is not supported by Flutter
-deferred_type_dependency_test/type_annotation: Skip # Timeout, deferred loading is not supported by Flutter
-enum_mirror_test: CompileTimeError
-f_bounded_quantification5_test: CompileTimeError
-f_bounded_quantification_test/01: CompileTimeError
-f_bounded_quantification_test/02: CompileTimeError
-factory2_test: CompileTimeError
-factory4_test: CompileTimeError
-factory6_test/00: CompileTimeError
-field_increment_bailout_test: CompileTimeError
-field_override_test/01: CompileTimeError
-function_malformed_result_type_test: CompileTimeError
-generic_function_typedef2_test/04: CompileTimeError
-instance_creation_in_function_annotation_test: CompileTimeError
-instanceof3_test: CompileTimeError
-internal_library_test/01: MissingCompileTimeError
-internal_library_test/01: CompileTimeError
-internal_library_test/02: CompileTimeError
-internal_library_test/02: MissingCompileTimeError
-invocation_mirror2_test: CompileTimeError
-invocation_mirror_invoke_on2_test: CompileTimeError
-invocation_mirror_invoke_on_test: CompileTimeError
-is_malformed_type_test/94: CompileTimeError
-is_malformed_type_test/95: CompileTimeError
-is_malformed_type_test/96: CompileTimeError
-is_malformed_type_test/97: CompileTimeError
-is_malformed_type_test/98: CompileTimeError
-is_malformed_type_test/99: CompileTimeError
-is_not_class2_test: RuntimeError
-isnot_malformed_type_test: RuntimeError
-issue21079_test: CompileTimeError
-issue_25671a_test/01: CompileTimeError
-issue_25671b_test/01: CompileTimeError
-library_env_test/has_mirror_support: RuntimeError, OK # No mirrors support in Flutter.
-library_env_test/has_no_mirror_support: Pass # No mirrors support in Flutter.
-list_literal_syntax_test/01: CompileTimeError
-list_literal_syntax_test/02: CompileTimeError
-list_literal_syntax_test/03: CompileTimeError
-malbounded_instantiation_test/01: CompileTimeError
-malbounded_redirecting_factory2_test/01: CompileTimeError
-malbounded_redirecting_factory2_test/none: CompileTimeError
-malbounded_redirecting_factory_test/01: CompileTimeError
-malbounded_redirecting_factory_test/none: CompileTimeError
-malbounded_type_cast_test: CompileTimeError
-malbounded_type_literal_test: CompileTimeError
-malbounded_type_test_test/02: CompileTimeError
-malformed2_test/00: CompileTimeError
-malformed_inheritance_test/02: CompileTimeError
-malformed_inheritance_test/04: CompileTimeError
-malformed_inheritance_test/06: CompileTimeError
-malformed_test/none: CompileTimeError
-malformed_type_test: CompileTimeError
-many_overridden_no_such_method_test: CompileTimeError
-method_override2_test/01: CompileTimeError
-method_override3_test/00: CompileTimeError
-method_override3_test/01: CompileTimeError
-method_override3_test/02: CompileTimeError
-method_override4_test: CompileTimeError
-method_override5_test: CompileTimeError
-method_override6_test: CompileTimeError
-mixin_invalid_bound2_test/01: CompileTimeError
-mixin_invalid_bound2_test/04: CompileTimeError
-mixin_invalid_bound2_test/07: CompileTimeError
-mixin_invalid_bound2_test/none: CompileTimeError
-mixin_invalid_bound_test/01: CompileTimeError
-mixin_invalid_bound_test/03: CompileTimeError
-mixin_invalid_bound_test/05: CompileTimeError
-mixin_invalid_bound_test/none: CompileTimeError
-mixin_super_bound2_test/01: CompileTimeError
-mixin_super_bound_test: CompileTimeError
-mixin_type_parameters_errors_test/01: CompileTimeError
-mixin_type_parameters_errors_test/02: CompileTimeError
-mixin_type_parameters_errors_test/03: CompileTimeError
-mixin_type_parameters_errors_test/04: CompileTimeError
-mixin_type_parameters_errors_test/05: CompileTimeError
-new_expression_type_args_test/02: CompileTimeError
-no_such_method_test: CompileTimeError
-non_parameterized_factory2_test: CompileTimeError
-non_parameterized_factory_test: CompileTimeError
-null_test/none: CompileTimeError
-on_catch_malformed_type_test: CompileTimeError
-overridden_no_such_method_test: CompileTimeError
-override_inheritance_field_test/05: CompileTimeError
-override_inheritance_field_test/06: CompileTimeError
-override_inheritance_field_test/07: CompileTimeError
-override_inheritance_field_test/08: CompileTimeError
-override_inheritance_field_test/09: CompileTimeError
-override_inheritance_field_test/10: CompileTimeError
-override_inheritance_field_test/11: CompileTimeError
-override_inheritance_field_test/28: CompileTimeError
-override_inheritance_field_test/29: CompileTimeError
-override_inheritance_field_test/30: CompileTimeError
-override_inheritance_field_test/31: CompileTimeError
-override_inheritance_field_test/32: CompileTimeError
-override_inheritance_field_test/33: CompileTimeError
-override_inheritance_field_test/33a: CompileTimeError
-override_inheritance_field_test/34: CompileTimeError
-override_inheritance_field_test/44: CompileTimeError
-override_inheritance_field_test/45: CompileTimeError
-override_inheritance_field_test/47: CompileTimeError
-override_inheritance_field_test/48: CompileTimeError
-override_inheritance_field_test/53: CompileTimeError
-override_inheritance_field_test/54: CompileTimeError
-override_inheritance_method_test/04: CompileTimeError
-override_inheritance_method_test/05: CompileTimeError
-override_inheritance_method_test/06: CompileTimeError
-override_inheritance_method_test/11: CompileTimeError
-override_inheritance_method_test/12: CompileTimeError
-override_inheritance_method_test/13: CompileTimeError
-override_inheritance_method_test/14: CompileTimeError
-override_inheritance_method_test/19: CompileTimeError
-override_inheritance_method_test/20: CompileTimeError
-override_inheritance_method_test/21: CompileTimeError
-override_inheritance_method_test/27: CompileTimeError
-override_inheritance_method_test/28: CompileTimeError
-override_inheritance_method_test/29: CompileTimeError
-override_inheritance_method_test/30: CompileTimeError
-override_inheritance_method_test/31: CompileTimeError
-override_inheritance_method_test/32: CompileTimeError
-override_inheritance_method_test/33: CompileTimeError
-prefix16_test: CompileTimeError
-prefix22_test: CompileTimeError
-private_access_test/03: CompileTimeError
-private_access_test/04: CompileTimeError
-redirecting_factory_incompatible_signature_test: CompileTimeError
-redirecting_factory_reflection_test: CompileTimeError
-regress_12561_test: CompileTimeError
-regress_13462_0_test: CompileTimeError
-regress_13462_1_test: CompileTimeError
-regress_18535_test: CompileTimeError
-regress_22438_test: CompileTimeError
-regress_23408_test: CompileTimeError
-regress_28255_test: CompileTimeError
-static_initializer_type_error_test: CompileTimeError
-super_call4_test: CompileTimeError
-super_getter_setter_test: CompileTimeError
-try_catch_on_syntax_test/07: CompileTimeError
-try_catch_syntax_test/08: CompileTimeError
-type_parameter_test/none: CompileTimeError
-type_variable_bounds_test/00: CompileTimeError
-type_variable_bounds_test/06: CompileTimeError
-type_variable_bounds_test/07: CompileTimeError
-type_variable_bounds_test/08: CompileTimeError
-type_variable_bounds_test/09: CompileTimeError
-type_variable_bounds_test/10: CompileTimeError
-type_variable_scope2_test: CompileTimeError
-type_variable_scope_test/00: CompileTimeError
-type_variable_scope_test/01: CompileTimeError
-type_variable_scope_test/02: CompileTimeError
-type_variable_scope_test/03: CompileTimeError
-type_variable_scope_test/04: CompileTimeError
-type_variable_scope_test/05: CompileTimeError
-type_variable_scope_test/none: CompileTimeError
-unicode_bom_test: CompileTimeError
-vm/debug_break_enabled_vm_test/01: CompileTimeError
-vm/debug_break_enabled_vm_test/none: CompileTimeError
-vm/no_such_method_error_message_callable_vm_test: RuntimeError # Flutter Issue 9110
-vm/reflect_core_vm_test: CompileTimeError
-vm/regress_27201_test: Fail # Flutter Issue 9110
-wrong_number_type_arguments_test/00: CompileTimeError
-wrong_number_type_arguments_test/01: CompileTimeError
-wrong_number_type_arguments_test/02: CompileTimeError
-
-[ $runtime != none ]
-arithmetic_canonicalization_test: RuntimeError # Uppercase constants removed
-double_nan_comparison_test: RuntimeError # Uppercase constants removed
-double_to_string_as_exponential_test: RuntimeError # Uppercase constants removed
-double_to_string_as_precision_test: RuntimeError # Uppercase constants removed
-double_to_string_test: RuntimeError # Uppercase constants removed
-import_combinators_test: RuntimeError # Uppercase constants removed
-infinity_test: RuntimeError # Uppercase constants removed
-intrinsified_methods_test: RuntimeError # Uppercase constants removed
-is_nan_test: RuntimeError # Uppercase constants removed
-mixin_prefix_test: RuntimeError # Uppercase constants removed
-nan_identical_test: RuntimeError # Uppercase constants removed
-null_test/none: RuntimeError # Uppercase constants removed
-number_identity2_test: RuntimeError # Uppercase constants removed
-ref_before_declaration_test/none: RuntimeError # Uppercase constants removed
-vm/load_to_load_forwarding_vm_test: RuntimeError # Uppercase constants removed
-vm/load_to_load_unaligned_forwarding_vm_test: RuntimeError # Uppercase constants removed
-vm/unaligned_float_access_literal_index_test: RuntimeError # Uppercase constants removed
-vm/unaligned_float_access_register_index_test: RuntimeError # Uppercase constants removed
-vm/unaligned_integer_access_literal_index_test: RuntimeError # Uppercase constants removed
-vm/unaligned_integer_access_register_index_test: RuntimeError # Uppercase constants removed
-
-[ $strong ]
-*: SkipByDesign # tests/language_2 has the strong mode versions of these tests.
-
-[ $arch == arm64 && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
-closure_cycles_test: Pass, Slow
-large_class_declaration_test: SkipSlow # Uses too much memory.
-
-[ $arch == ia32 && $compiler == none && $runtime == vm && $system == windows ]
-vm/optimized_stacktrace_test: Pass, Crash # Issue 28276
-
-[ $arch == ia32 && $mode == release && $runtime == vm ]
-deep_nesting1_negative_test: Crash, Pass # Issue 31496
-
-[ $arch == ia32 && ($compiler == app_jit || $compiler == none || $compiler == precompiler) && ($runtime == dart_precompiled || $runtime == vm) ]
-vm/regress_24517_test: Pass, Fail # Issue 24517.
-
-[ $compiler == app_jit && $runtime == vm && !$checked ]
-assertion_initializer_const_error_test/01: MissingCompileTimeError
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-
-# Detection of compile-time errors that are related to constants can't be fully
-# done at the front end, because constants are evaluated at back ends.  So, some
-# errors aren't detected by fasta, but reported by back ends as compile-time
-# errors.
-[ $compiler != dart2js && $runtime != vm && $fasta ]
-deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
-
-[ $compiler != dartk && $compiler != dartkb && $compiler != dartkp && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
-abstract_beats_arguments2_test/01: Crash # Issue 29171
-
-[ $compiler == none && $runtime == vm && $system == fuchsia ]
-async_await_test: RuntimeError # Use package:unittest
-async_star_test: RuntimeError # Use package:unittest
-closure_cycles_test: Pass, Crash # TODO(zra): Investigate
-vm/causal_async_exception_stack2_test: RuntimeError # Use package:unittest
-vm/causal_async_exception_stack_test: RuntimeError # Use package:unittest
-vm/math_vm_test: Crash # TODO(zra): Investigate
-
-[ $compiler == none && $runtime == vm && !$checked ]
-assertion_initializer_const_error_test/01: MissingCompileTimeError
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-
-[ $compiler == none && $checked && ($runtime == flutter || $runtime == vm) ]
-assert_initializer_test/4*: MissingCompileTimeError # Issue 392. The VM doesn't enforce that potentially const expressions are actually const expressions when the constructor is called with `const`.
-
-[ $compiler == none && ($runtime == flutter || $runtime == vm) ]
-duplicate_part_test/01: MissingCompileTimeError # Issue 27516
-
-[ $compiler == precompiler && $mode == debug && $runtime == dart_precompiled ]
-regress_29025_test: Crash # Issue dartbug.com/29331
-
-[ $compiler == precompiler && $runtime == dart_precompiled ]
-export_ambiguous_main_negative_test: Skip # Issue 29895
-export_double_same_main_test: Skip # Issue 29895
-stacktrace_demangle_ctors_test: RuntimeError
-vm/optimized_stacktrace_test: Skip # Issue 30198
-vm/regress_27671_test: Skip # Unsupported
-
-[ $compiler == precompiler && $runtime == dart_precompiled && $checked ]
-assertion_initializer_const_error2_test/cc02: Crash
-
-[ $compiler == precompiler && $runtime == dart_precompiled && !$checked ]
-assertion_initializer_const_error_test/01: MissingCompileTimeError
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-
-[ $mode == debug && $hot_reload_rollback ]
-enum_duplicate_test/02: Pass, Crash # http://dartbug.com/33156
-enum_duplicate_test/none: Pass, Crash # http://dartbug.com/33156
-enum_private_test/01: Pass, Crash # http://dartbug.com/33156
-
-[ $mode == debug && ($hot_reload || $hot_reload_rollback) ]
-enum_duplicate_test/01: Pass, Crash # http://dartbug.com/33156
-enum_private_test/02: Pass, Crash # dartbug.com/33339
-
-[ $runtime == dart_precompiled && $minified ]
-cyclic_type_test/*: Skip # Tests below rely on Type.toString()
-enum_duplicate_test/*: Skip # Uses Enum.toString()
-enum_private_test/*: Skip # Uses Enum.toString()
-enum_test: Skip # Uses Enum.toString()
-f_bounded_quantification4_test: Skip # Tests below rely on Type.toString()
-f_bounded_quantification5_test: Skip # Tests below rely on Type.toString()
-full_stacktrace1_test: Skip # Tests below rely on Stacktrace.toString()
-full_stacktrace2_test: Skip # Tests below rely on Stacktrace.toString()
-full_stacktrace3_test: Skip # Tests below rely on Stacktrace.toString()
-mixin_generic_test: Skip # Tests below rely on Type.toString()
-mixin_mixin2_test: Skip # Tests below rely on Type.toString()
-mixin_mixin3_test: Skip # Tests below rely on Type.toString()
-mixin_mixin5_test: Skip # Tests below rely on Type.toString()
-mixin_mixin6_test: Skip # Tests below rely on Type.toString()
-mixin_mixin_bound2_test: Skip # Tests below rely on Type.toString()
-mixin_mixin_type_arguments_test: Skip # Tests below rely on Type.toString()
-mixin_super_2_test: Skip # Tests below rely on Type.toString()
-no_such_method_dispatcher_test: Skip # Uses new Symbol()
-stacktrace_rethrow_error_test: Skip # Tests below rely on Stacktrace.toString()
-stacktrace_rethrow_nonerror_test: Skip # Tests below rely on Stacktrace.toString()
-vm/no_such_args_error_message_vm_test: Skip # Tests below rely on Stacktrace.toString()
-vm/no_such_method_error_message_callable_vm_test: Skip # Tests below rely on Stacktrace.toString()
-vm/no_such_method_error_message_vm_test: Skip # Tests below rely on Stacktrace.toString()
-vm/regress_28325_test: Skip # Tests below rely on Stacktrace.toString()
-
-[ $browser && ($compiler == app_jit || $compiler == none || $compiler == precompiler) ]
-library_env_test/has_io_support: RuntimeError, OK # The test is supposed to fail.
-library_env_test/has_no_html_support: RuntimeError, OK # The test is supposed to fail.
-
-[ !$browser && ($compiler == app_jit || $compiler == none || $compiler == precompiler) ]
-library_env_test/has_html_support: RuntimeError, OK # The test is supposed to fail.
-library_env_test/has_no_io_support: RuntimeError, OK # The test is supposed to fail.
-
-[ $checked && ($compiler == app_jit || $compiler == none || $compiler == precompiler) ]
-generic_functions_test: Pass # Issue 25869, These generic functions tests pass for the wrong reason in checked mode, because the parsed type parameters are mapped to dynamic type.
-generic_local_functions_test: Pass # Issue 25869, These generic functions tests pass for the wrong reason in checked mode, because the parsed type parameters are mapped to dynamic type.
-generic_methods_function_type_test: Pass # Issue 25869, These generic functions tests pass for the wrong reason in checked mode, because the parsed type parameters are mapped to dynamic type.
-generic_methods_generic_function_parameter_test: Pass # Issue 25869, These generic functions tests pass for the wrong reason in checked mode, because the parsed type parameters are mapped to dynamic type.
-generic_methods_new_test: Pass # Issue 25869, These generic functions tests pass for the wrong reason in checked mode, because the parsed type parameters are mapped to dynamic type.
-generic_methods_test: Pass # Issue 25869, These generic functions tests pass for the wrong reason in checked mode, because the parsed type parameters are mapped to dynamic type.
-type_variable_bounds4_test/01: Fail # Issue 14006
-
-[ ($compiler == app_jit || $compiler == dartk || $compiler == dartkb || $compiler == dartkp || $compiler == none || $compiler == precompiler) && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
-dynamic_prefix_core_test/none: Fail # Issue 12478
-
-[ ($compiler == app_jit || $compiler == none || $compiler == precompiler) && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
-await_for_test: RuntimeError # issue 28974
-class_keyword_test/02: MissingCompileTimeError # Issue 13627
-export_ambiguous_main_negative_test: Fail # Issue 14763
-syntax_test/none: CompileTimeError # Issue #30176.
-unicode_bom_test: Fail # Issue 16067
-vm/debug_break_enabled_vm_test/01: Crash, OK # Expected to hit breakpoint.
-
-# These test entries will be valid for vm (with and without kernel).
-[ $compiler == app_jit || $compiler == dartk || $compiler == dartkb || $compiler == none || $runtime == dart_precompiled ]
-async_star_cancel_while_paused_test: RuntimeError
-async_star_pause_test: Fail, OK # This is OK for now, but we may want to change the semantics to match the test.
-constructor2_test: Fail, OK # Failures related to super call in ctor initializer list
-constructor3_test: Fail, OK # Failures related to super call in ctor initializer list
-constructor5_test: Fail # Issue 6422, These bugs refer currently ongoing language discussions.
-constructor6_test: Fail # Issue 6422, These bugs refer currently ongoing language discussions.
-cyclic_type2_test: Fail, OK # Non-contractive types are not supported in the vm.
-cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
-cyclic_type_test/04: Fail, OK # Non-contractive types are not supported in the vm.
-duplicate_export_negative_test: Fail # Issue 6134
-example_constructor_test: Fail, OK # Failures related to super call in ctor initializer list
-field_initialization_order_test: Fail, OK # Failures related to super call in ctor initializer list
-final_field_initialization_order_test: Fail, OK # Failures related to super call in ctor initializer list
-generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
-least_upper_bound_expansive_test/*: Fail, OK # Non-contractive types are not supported in the vm.
-main_not_a_function_test/01: Skip # Skipped temporaril until Issue 29895 is fixed.
-mixin_illegal_super_use_test: Skip # Issues 24478 and 23773, # These tests are skipped in the VM because it has "--supermixin" functionality enabled unconditionally.  The tests should be removed once the same is true for analyzer (#24478) and dart2js (#23773)
-mixin_illegal_superclass_test: Skip # Issues 24478 and 23773, # These tests are skipped in the VM because it has "--supermixin" functionality enabled unconditionally.  The tests should be removed once the same is true for analyzer (#24478) and dart2js (#23773)
-no_main_test/01: Skip # Skipped temporaril until Issue 29895 is fixed.
-super_test: Fail, OK # Failures related to super call in ctor initializer list
-vm/regress_29145_test: Skip # Issue 29145
-
-[ $compiler == app_jit || $compiler == none ]
-library_env_test/has_no_mirror_support: RuntimeError, OK # The test is supposed to fail.
-
-[ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
-async_star_regression_2238_test: CompileTimeError
-deferred_redirecting_factory_test: Fail, Crash # Issue 23408
-dynamic_prefix_core_test/01: RuntimeError # Issue 12478
-multiline_strings_test: Fail # Issue 23020
-redirecting_constructor_initializer_test: RuntimeError # Issue 23488
-
-[ $compiler == app_jit || $compiler == precompiler || $mode == product ]
-deferred_load_constants_test/02: Skip # Deferred loading happens eagerly.
-deferred_load_constants_test/03: Skip # Deferred loading happens eagerly.
-deferred_load_constants_test/05: Skip # Deferred loading happens eagerly.
-deferred_not_loaded_check_test: Skip # Deferred loading happens eagerly.
-vm/regress_27201_test: Fail
-
-[ $compiler == app_jit || $runtime == dart_precompiled ]
-ct_const2_test: Skip # Incompatible flag: --compile_all
-hello_dart_test: Skip # Incompatible flag: --compile_all
-vm/type_cast_vm_test: RuntimeError # Expects line and column numbers
-vm/type_vm_test: RuntimeError # Expects line and column numbers
-
-[ $mode == product || $runtime == dart_precompiled ]
-vm/causal_async_exception_stack2_test: SkipByDesign # Causal async stacks are not supported in product mode
-vm/causal_async_exception_stack_test: SkipByDesign # Causal async stacks are not supported in product mode
-
-[ $runtime == dart_precompiled || $runtime == vm ]
-arithmetic_test: CompileTimeError # Large integer literal
-bit_operations_test: CompileTimeError # Large integer literal
-deopt_inlined_function_lazy_test: CompileTimeError # Large integer literal
-guess_cid_test: CompileTimeError # Large integer literal
-identical_closure2_test: CompileTimeError # Large integer literal
-int2_test: CompileTimeError # Large integer literal
-mint_compares_test: CompileTimeError # Large integer literal
-number_identity_test: CompileTimeError # Large integer literal
-regress_24283_test: RuntimeError # Large integers
-vm/load_to_load_unaligned_forwarding_vm_test: Pass, Crash # Unaligned offset. Issue 22151
-vm/regress_14903_test: CompileTimeError # Large integer literal
-vm/regress_23117_vm_test: RuntimeError # Large integers
-vm/regress_23238_test: RuntimeError # Large integers
-vm/unaligned_float_access_literal_index_test: Pass, Crash # Unaligned offset. Issue 22151
-
-[ $hot_reload || $hot_reload_rollback ]
-cha_deopt1_test: Crash # Requires deferred libraries
-cha_deopt2_test: Crash # Requires deferred libraries
-cha_deopt3_test: Crash # Requires deferred libraries
-conditional_import_string_test: Crash # Requires deferred libraries
-conditional_import_test: Crash # Requires deferred libraries
-deferred_call_empty_before_load_test: Crash # Requires deferred libraries
-deferred_closurize_load_library_test: Crash # Requires deferred libraries
-deferred_constant_list_test: Crash # Requires deferred libraries
-deferred_constraints_constants_test: Crash # Requires deferred libraries
-deferred_constraints_type_annotation_test: Crash # Requires deferred libraries
-deferred_function_type_test: Crash # Requires deferred libraries
-deferred_global_test: Crash # Requires deferred libraries
-deferred_import_core_test: Crash # Requires deferred libraries
-deferred_inheritance_constraints_test: Crash # Requires deferred libraries
-deferred_inlined_test: Crash # Requires deferred libraries
-deferred_load_constants_test: Crash # Requires deferred libraries
-deferred_load_inval_code_test: Crash # Requires deferred libraries
-deferred_load_library_wrong_args_test: Crash # Requires deferred libraries
-deferred_mixin_test: Crash # Requires deferred libraries
-deferred_no_such_method_test: Crash # Requires deferred libraries
-deferred_not_loaded_check_test: Crash # Requires deferred libraries
-deferred_only_constant_test: Crash # Requires deferred libraries
-deferred_optimized_test: Crash # Requires deferred libraries
-deferred_redirecting_factory_test: Crash # Requires deferred libraries
-deferred_regression_22995_test: Crash # Requires deferred libraries
-deferred_regression_28678_test: Crash # Requires deferred libraries
-deferred_shadow_load_library_test: Crash # Requires deferred libraries
-deferred_shared_and_unshared_classes_test: Crash # Requires deferred libraries
-deferred_static_seperate_test: Crash # Requires deferred libraries
-deferred_super_dependency_test: Pass, Crash # Requires deferred libraries
-deferred_type_dependency_test: Crash # Requires deferred libraries
-issue21159_test: Pass, Crash # Issue 29094
-issue_1751477_test: Crash # Requires deferred libraries
-issue_22780_test/01: Pass, Crash # Issue 29094
-regress_22443_test: Crash # Requires deferred libraries
-regress_23408_test: Crash # Requires deferred libraries
-regress_28278_test: Crash # Requires deferred libraries
-static_closure_identical_test: Pass, Fail # Closure identity
-vm/optimized_stacktrace_test: Pass, Slow
-vm/regress_27201_test: Pass, Crash # Requires deferred libraries
-
-[ $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $compiler != none || $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $runtime != vm ]
-assert_initializer_test/*: Skip # not implemented yet, experiment is VM only.
+*: SkipByDesign # Deprecating Dart1 tests.
diff --git a/tests/language_2/async_await_test.dart b/tests/language_2/async_await_test.dart
index 7c19b9c..d434da9 100644
--- a/tests/language_2/async_await_test.dart
+++ b/tests/language_2/async_await_test.dart
@@ -8,6 +8,8 @@
 import "package:async_helper/async_helper.dart";
 import "dart:async";
 
+typedef dynamic DynamicToDynamic(dynamic d);
+
 main() {
   asyncStart();
   group("basic", () {
@@ -2095,7 +2097,7 @@
   return (() async => await f)();
 }
 
-var topVarExpression = (f) async {
+DynamicToDynamic topVarExpression = (f) async {
   return await f;
 };
 
@@ -2148,7 +2150,7 @@
     return (() async => await f)();
   }
 
-  static var staticVarExpression = (f) async {
+  static DynamicToDynamic staticVarExpression = (f) async {
     return await f;
   };
 
@@ -2190,7 +2192,7 @@
     return (() async => await f)();
   }
 
-  var instanceVarExpression = (f) async {
+  DynamicToDynamic instanceVarExpression = (f) async {
     return await f;
   };
 
diff --git a/tests/language_2/async_backwards_compatibility_1_test.dart b/tests/language_2/async_backwards_compatibility_1_test.dart
index 9390879..474effe 100644
--- a/tests/language_2/async_backwards_compatibility_1_test.dart
+++ b/tests/language_2/async_backwards_compatibility_1_test.dart
@@ -6,13 +6,19 @@
 import 'async_helper_lib.dart' as async;
 
 class A {
-  async.async get async => null;
+  async.async get x => null;
+}
+
+class B {
+  int get async => null;
 }
 
 async.async topLevel() => null;
 
 main() {
   var a = new A();
-  var b = a.async;
+  var b = a.x;
   var c = topLevel();
+  var d = new B();
+  var e = d.async;
 }
diff --git a/tests/language_2/async_star_test.dart b/tests/language_2/async_star_test.dart
index 054a4b5..4828485 100644
--- a/tests/language_2/async_star_test.dart
+++ b/tests/language_2/async_star_test.dart
@@ -983,7 +983,7 @@
 
 const MS = const Duration(milliseconds: 1);
 
-var getErrors = new StreamTransformer.fromHandlers(handleData: (data, sink) {
+StreamTransformer getErrors = new StreamTransformer.fromHandlers(handleData: (data, sink) {
   fail("Unexpected value");
 }, handleError: (e, s, sink) {
   sink.add(e);
diff --git a/tests/language_2/closure_side_effect_test.dart b/tests/language_2/closure_side_effect_test.dart
index 95fb941..a7b0f50 100644
--- a/tests/language_2/closure_side_effect_test.dart
+++ b/tests/language_2/closure_side_effect_test.dart
@@ -4,8 +4,10 @@
 
 import "package:expect/expect.dart";
 
+typedef void VoidToVoid();
+
 var b;
-var a = () {
+VoidToVoid a = () {
   b = 42;
 };
 
diff --git a/tests/language_2/default_implementation2_test.dart b/tests/language_2/default_implementation2_test.dart
index 2336935..0a3607c 100644
--- a/tests/language_2/default_implementation2_test.dart
+++ b/tests/language_2/default_implementation2_test.dart
@@ -4,13 +4,15 @@
 // Dart test to verify incompatible constructor types
 
 abstract class Point {
-  factory Point(x, y) = PointImplementation;
+  factory Point(int x, int y) = PointImplementation; //# 01: ok
+  factory Point(x, y) = PointImplementation; //# 02: compile-time error
 }
 
 class PointImplementation implements Point {
-   PointImplementation(int x, int y) {} //# static type warning
+   PointImplementation(int x, int y) {}
 }
 
 main() {
-  new Point(1, 2);
+  new Point(1, 2); //# 01: continued
+  new Point(1, 2); //# 02: continued
 }
diff --git a/tests/language_2/int64_literal_test.dart b/tests/language_2/int64_literal_test.dart
index 9c0cb77..5c54736 100644
--- a/tests/language_2/int64_literal_test.dart
+++ b/tests/language_2/int64_literal_test.dart
@@ -3,22 +3,30 @@
 const String realMaxInt64Value = '9223372036854775807';
 const String realMinInt64Value = '-9223372036854775808';
 
+const int i21 = 2097152;
+
 main() {
-  int minInt64Value = (-9223372036854775807) - 1;
-  minInt64Value = -(1 << 63);               /// 01: ok
+  int minInt64Value = -1 * i21 * i21 * i21;
+  minInt64Value = -9223372036854775807 - 1; /// 01: ok
   minInt64Value = -9223372036854775808;     /// 02: ok
   minInt64Value = -(9223372036854775808);   /// 03: compile-time error
   minInt64Value = -(0x8000000000000000);    /// 04: ok
   minInt64Value = 0x8000000000000000;       /// 05: ok
+  minInt64Value = -0x8000000000000000;      /// 06: ok
 
   Expect.equals('$minInt64Value', realMinInt64Value);
   Expect.equals('${minInt64Value - 1}', realMaxInt64Value);
 
-  int maxInt64Value = 9223372036854775807;
-  maxInt64Value = (1 << 63) - 1;            /// 10: ok
-  maxInt64Value = 9223372036854775807;      /// 20: ok
-  maxInt64Value = 9223372036854775808 - 1;  /// 30: compile-time error
-  maxInt64Value = 0x8000000000000000 - 1;   /// 40: ok
+  int maxInt64Value = 1 * i21 * i21 * i21 - 1;
+  maxInt64Value = 9223372036854775807;      /// 11: ok
+  maxInt64Value = 9223372036854775807;      /// 12: ok
+  maxInt64Value = 9223372036854775808 - 1;  /// 13: compile-time error
+  maxInt64Value = -9223372036854775808 - 1; /// 14: ok
+  maxInt64Value = -9223372036854775809;     /// 15: compile-time error
+  maxInt64Value = 0x8000000000000000 - 1;   /// 16: ok
+  maxInt64Value = -0x8000000000000000 - 1;  /// 17: ok
+  maxInt64Value = -0x8000000000000001;      /// 18: compile-time error
+  maxInt64Value = -(0x8000000000000001);    /// 19: ok
 
   Expect.equals('$maxInt64Value', realMaxInt64Value);
   Expect.equals('${maxInt64Value + 1}', realMinInt64Value);
diff --git a/tests/language_2/issue13673_test.dart b/tests/language_2/issue13673_test.dart
index 303b48b..b510c61 100644
--- a/tests/language_2/issue13673_test.dart
+++ b/tests/language_2/issue13673_test.dart
@@ -10,7 +10,7 @@
   foo() => field;
 }
 
-var topLevel = new Bar(String).foo();
+dynamic topLevel = new Bar(String).foo();
 
 main() {
   Expect.isTrue(topLevel is Type);
diff --git a/tests/language_2/issue34404_flutter_modified_test.dart b/tests/language_2/issue34404_flutter_modified_test.dart
new file mode 100644
index 0000000..b78202a
--- /dev/null
+++ b/tests/language_2/issue34404_flutter_modified_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test case is a reduction of some Flutter code, modified to use the new
+// mixin syntax.  We wish to verify that the class _DismissibleState doesn't
+// have any type inference errors.
+
+class _DismissibleState extends State<Dismissible>
+    with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {}
+
+abstract class State<T extends StatefulWidget> extends Diagnosticable {}
+
+abstract class StatefulWidget extends Widget {}
+
+abstract class Widget extends DiagnosticableTree {}
+
+abstract class DiagnosticableTree extends Diagnosticable {}
+
+abstract class Diagnosticable {}
+
+class Dismissible extends StatefulWidget {}
+
+mixin TickerProviderStateMixin<T extends StatefulWidget> on State<T>
+    implements TickerProvider {}
+
+abstract class TickerProvider {}
+
+mixin AutomaticKeepAliveClientMixin<T extends StatefulWidget> on State<T> {}
+
+main() {
+  new _DismissibleState();
+}
diff --git a/tests/language_2/issue34404_flutter_test.dart b/tests/language_2/issue34404_flutter_test.dart
new file mode 100644
index 0000000..4e1c7f7
--- /dev/null
+++ b/tests/language_2/issue34404_flutter_test.dart
@@ -0,0 +1,34 @@
+// 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.
+// SharedOptions=--supermixin
+
+// This test case is a reduction of some Flutter code.  We wish to verify that
+// the class _DismissibleState doesn't have any type inference errors.
+
+class _DismissibleState extends State<Dismissible>
+    with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {}
+
+abstract class State<T extends StatefulWidget> extends Diagnosticable {}
+
+abstract class StatefulWidget extends Widget {}
+
+abstract class Widget extends DiagnosticableTree {}
+
+abstract class DiagnosticableTree extends Diagnosticable {}
+
+abstract class Diagnosticable {}
+
+class Dismissible extends StatefulWidget {}
+
+abstract class TickerProviderStateMixin<T extends StatefulWidget>
+    extends State<T> implements TickerProvider {}
+
+abstract class TickerProvider {}
+
+abstract class AutomaticKeepAliveClientMixin<T extends StatefulWidget>
+    extends State<T> {}
+
+main() {
+  new _DismissibleState();
+}
diff --git a/tests/language_2/issue34498_test.dart b/tests/language_2/issue34498_test.dart
new file mode 100644
index 0000000..c18ad0f
--- /dev/null
+++ b/tests/language_2/issue34498_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:core';
+import 'dart:core' as core;
+
+class A {
+  /*@compile-error=unspecified*/ core.List get core => null;
+}
+
+main() {
+  new A().core;
+}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 84a6412..c8bc2fe 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -12,10 +12,6 @@
 mixin_constructor_forwarding/optional_named_parameters_test/none: CompileTimeError # Issue 31543
 mixin_constructor_forwarding/optional_positional_parameters_test/none: CompileTimeError # Issue 31543
 
-[ $compiler == dart2analyzer ]
-double_literals/implicit_double_context_test: CompileTimeError # Needs triage, see Issue #34444
-mixin_declaration/mixin_declaration_inference_valid_classes_test: CompileTimeError # https://github.com/dart-lang/sdk/issues/34164
-
 [ $compiler != dart2analyzer ]
 switch_case_warn_test: Skip # Analyzer only, see language_analyzer2.status
 
@@ -55,6 +51,7 @@
 mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError, DartkCrash # https://github.com/dart-lang/sdk/issues/34165
 mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
 mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError, DartkCrash # https://github.com/dart-lang/sdk/issues/34165
+mixin_declaration/mixin_declaration_inference_invalid_11_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
 partial_instantiation_static_bounds_check_test/01: MissingCompileTimeError # Issue 34327
 partial_instantiation_static_bounds_check_test/02: MissingCompileTimeError # Issue 34327
 partial_instantiation_static_bounds_check_test/03: MissingCompileTimeError # Issue 34327
@@ -227,6 +224,9 @@
 [ $checked && !$strong ]
 type_parameter_test/05: Pass
 
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
+
 [ $compiler == app_jit || $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp || $compiler == none || $compiler == precompiler ]
 double_literals/*: Skip # https://github.com/dart-lang/sdk/issues/34358
 
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 97bbdb3..65e2302 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -22,7 +22,7 @@
 const_constructor3_test/04: MissingCompileTimeError # Side-effect of working around issue 33441 for int-to-double
 constructor_reference_test/27: MissingCompileTimeError # Issue 34403
 covariant_subtyping_with_mixin_test: CompileTimeError # Issue 34329
-default_implementation2_test: CompileTimeError # Issue #34338, however, needs triage (#34337) and blocked (#34336)
+double_literals/implicit_double_context_test: CompileTimeError # Needs triage, see Issue #34444
 dynamic_prefix_core_test/01: MissingCompileTimeError # failing-by-design: #34339
 emit_const_fields_test: CompileTimeError # failing-by-design: #34340
 enum_syntax_test/05: Fail # Issue 34341
@@ -58,7 +58,6 @@
 invalid_returns/sync_invalid_return_03_test/none: CompileTimeError # issue #34319
 invalid_returns/sync_invalid_return_04_test/none: CompileTimeError # issue #34319
 invalid_returns/sync_invalid_return_05_test/none: CompileTimeError # issue #34319
-issue13673_test: StaticWarning # Issue 31925
 issue31596_implement_covariant_test: CompileTimeError # Issue #31596
 issue31596_override_test/01: CompileTimeError # Issue #31596
 issue31596_override_test/02: CompileTimeError # Issue #31596
@@ -71,16 +70,13 @@
 issue31596_super_test/none: CompileTimeError # Issue #31596
 issue31596_tearoff_test: CompileTimeError # Issue #31596
 issue31596_test: CompileTimeError # Issue #31596
+issue34498_test: MissingCompileTimeError # Issue 34500
 malformed2_test: Pass, MissingCompileTimeError # Flaky: issue 31056.
+mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError
 mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError # Issue 30552
-mixin_forwarding_constructor4_test/01: CompileTimeError # See issue #34375
-mixin_forwarding_constructor4_test/02: CompileTimeError # See issue #34375
-mixin_forwarding_constructor4_test/03: CompileTimeError # See issue #34375
 mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
-mixin_super_constructor_named_test/01: CompileTimeError # See issue #34375
-mixin_super_constructor_positionals_test/01: CompileTimeError # See issue #34375
 mixin_supertype_subclass2_test/02: MissingStaticWarning # Issue 25614
 mixin_supertype_subclass2_test/05: MissingStaticWarning # Issue 25614
 mixin_supertype_subclass3_test/02: MissingStaticWarning # Issue 25614
@@ -120,11 +116,10 @@
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_call4_test/01: MissingCompileTimeError
-super_no_such_method4_test/01: MissingCompileTimeError # Issue 33553
-super_no_such_method5_test/01: MissingCompileTimeError # Issue 33553
+super_no_such_method1_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
+super_no_such_method2_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
+super_no_such_method3_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
 super_setter_test: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
-switch_case_test/none: CompileTimeError
 syntax_test/60: MissingCompileTimeError
 syntax_test/61: MissingCompileTimeError
 try_catch_on_syntax_test/10: MissingCompileTimeError
@@ -139,7 +134,6 @@
 type_promotion_functions_test/13: CompileTimeError
 type_promotion_functions_test/14: CompileTimeError
 type_promotion_functions_test/none: CompileTimeError
-type_variable_scope_test/none: Fail # Issue 11578
 type_variable_static_context_negative_test: Fail # Issue 12161
 vm/debug_break_enabled_vm_test: Skip
 vm/debug_break_vm_test/*: Skip
@@ -151,28 +145,22 @@
 void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/final_local_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
 void/void_type_usage_test/final_local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/global_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/global_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/global_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/param_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/param_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/param_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/paren_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/paren_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/paren_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/sync_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 241f8f57..228a5bd 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -36,15 +36,20 @@
 instantiate_tearoff_of_call_test: RuntimeError
 int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 int64_literal_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/05: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/10: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/20: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/40: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int64_literal_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/02: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/04: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/05: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/06: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/11: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/12: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/14: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/16: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/17: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/19: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/none: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 issue23244_test: RuntimeError # Isolates - enum canonicalization - Issue 23244
 issue32353_test: CompileTimeError
+issue34404_flutter_test: CompileTimeError # --supermixin not supported
 library_env_test/has_mirror_support: RuntimeError, OK
 library_env_test/has_no_html_support: RuntimeError, OK
 list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -459,8 +464,6 @@
 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)
 partial_tearoff_instantiation_test/08: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
-redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
-redirecting_factory_malbounded_test/01: MissingCompileTimeError
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
 type_literal_prefix_call_test/00: MissingCompileTimeError
@@ -515,8 +518,6 @@
 no_such_method_test: RuntimeError
 overridden_no_such_method_test: RuntimeError
 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
@@ -592,14 +593,6 @@
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
 instance_creation_in_function_annotation_test: RuntimeError
 instantiate_tearoff_of_call_test: CompileTimeError
-int64_literal_test/01: RuntimeError
-int64_literal_test/02: RuntimeError
-int64_literal_test/04: RuntimeError
-int64_literal_test/05: RuntimeError
-int64_literal_test/10: RuntimeError
-int64_literal_test/20: RuntimeError
-int64_literal_test/40: RuntimeError
-int64_literal_test/none: RuntimeError
 integer_division_by_zero_test: RuntimeError # Issue 8301
 internal_library_test/02: Crash
 invocation_mirror_invoke_on2_test: RuntimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 29b9a9c..c9f79bb 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -39,7 +39,6 @@
 covariance_field_test/03: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError # Issue 28395
 covariant_subtyping_with_mixin_test: CompileTimeError # Issue 34329
-default_implementation2_test: CompileTimeError # Issue 30855
 deferred_load_library_wrong_args_test/01: MissingRuntimeError, RuntimeError # Issue 29920
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddc
 dynamic_prefix_core_test/01: MissingCompileTimeError
@@ -102,26 +101,54 @@
 issue31596_tearoff_test: CompileTimeError
 issue31596_test: CompileTimeError
 issue32353_test: RuntimeError
+issue34404_flutter_modified_test: CompileTimeError # DDC doesn't support mixin inference
+issue34404_flutter_test: CompileTimeError # DDC doesn't support mixin inference
+issue34498_test: MissingCompileTimeError # Issue 34500
 label_test: RuntimeError
 left_shift_test: RuntimeError # Ints and doubles are unified.
-mixin_declaration/mixin_declaration_inference_invalid_03_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_04_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_06_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_08_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_09_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError   # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_valid_classes_test: CompileTimeError   # https://github.com/dart-lang/sdk/issues/34164
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError    # Analyzer chooses wrong(?) super method.
-mixin_forwarding_constructor4_test/01: CompileTimeError # See issue 15101
-mixin_forwarding_constructor4_test/02: CompileTimeError # See issue 15101
-mixin_forwarding_constructor4_test/03: CompileTimeError # See issue 15101
+mixin_declaration/mixin_declaration_inference_invalid_03_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_04_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_06_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_08_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_09_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_invalid_11_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
+mixin_declaration/mixin_declaration_inference_valid_A00_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A01_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A02_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A10_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A11_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A12_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A20_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A21_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A22_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A23_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A30_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A31_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_A42_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B00_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B01_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B02_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B03_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B10_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B11_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B12_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_B13_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C00_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C01_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C02_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C03_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C10_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C11_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C12_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_C13_test: CompileTimeError # Issue #34164
+mixin_declaration/mixin_declaration_inference_valid_mixin_applications_test: CompileTimeError # https://github.com/dart-lang/sdk/issues/34164
+mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError # Analyzer chooses wrong(?) super method.
 mixin_method_override_test/01: MissingCompileTimeError # Issue 34235
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
-mixin_super_constructor_named_test/01: CompileTimeError # See issue 15101
-mixin_super_constructor_positionals_test/01: CompileTimeError # See issue 15101
 mixin_super_test: RuntimeError
 mixin_super_use_test: RuntimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
@@ -163,14 +190,13 @@
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_call4_test/01: 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.
+super_no_such_method1_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
+super_no_such_method2_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
+super_no_such_method3_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
 super_operator_index5_test: RuntimeError # 33470
 super_operator_index7_test: RuntimeError # 33470
 super_operator_index8_test: RuntimeError # 33470
 super_setter_test: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
-switch_case_test/none: CompileTimeError
 syntax_test/60: MissingCompileTimeError
 syntax_test/61: MissingCompileTimeError
 truncdiv_test: RuntimeError # Issue 29920
@@ -191,35 +217,28 @@
 type_promotion_functions_test/13: CompileTimeError # Issue 30895
 type_promotion_functions_test/14: CompileTimeError # Issue 30895
 type_promotion_functions_test/none: CompileTimeError # Issue 30895
-type_variable_scope_test/none: CompileTimeError
 void/return_future_future_or_void_async_error1_test/none: CompileTimeError # issue #34319
 void/return_future_or_future_or_void_sync_error2_test/none: CompileTimeError # issue #34319
 void/return_future_or_void_sync_error4_test/none: CompileTimeError # issue #34319
 void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/call_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/final_local_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
 void/void_type_usage_test/final_local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/global_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/global_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/global_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/param_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/param_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/param_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/paren_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_boolean_negation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/paren_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/paren_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/sync_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
@@ -266,7 +285,6 @@
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
 dynamic_prefix_core_test/none: CompileTimeError
 emit_const_fields_test: CompileTimeError # Issue 31533
-export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
 function_propagation_test: RuntimeError
@@ -300,7 +318,26 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-mixin_declaration/*: Skip # need flag on Kernel Class nodes.
+mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError, Crash # https://github.com/dart-lang/sdk/issues/34165
+mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
+mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError, Crash # https://github.com/dart-lang/sdk/issues/34165
+mixin_declaration/mixin_declaration_inference_invalid_11_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
+mixin_declaration/mixin_declaration_invalid_application_supertype_test/03: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_application_supertype_test/04: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_application_supertype_test/05: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_override_test/06: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_override_test/07: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_override_test/08: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError
+mixin_declaration/mixin_declaration_invalid_superinvocation_test/none: CompileTimeError
+mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError
+mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/04: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/05: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/06: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/07: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/08: MissingCompileTimeError
+mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
@@ -351,8 +388,6 @@
 multiline_newline_test/06r: MissingCompileTimeError
 no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
 null_no_such_method_test: CompileTimeError # Issue 31533
-redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
-redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError # UnimplementedError: node <InvalidExpression> `invalid-expression`
 regress_23408_test: CompileTimeError # Issue 31533
 regress_24283_test: RuntimeError # Expect.equals(expected: <-1>, actual: <4294967295>) fails.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 41bd846..33a2810 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -56,7 +56,6 @@
 dynamic_prefix_core_test/none: CompileTimeError
 emit_const_fields_test: CompileTimeError
 example_constructor_test: RuntimeError
-export_ambiguous_main_test: Crash
 external_test/10: MissingRuntimeError
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
@@ -95,7 +94,6 @@
 mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/none: CompileTimeError
 mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_syntax_test: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
@@ -219,7 +217,6 @@
 mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/none: CompileTimeError
 mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_syntax_test: CompileTimeError
 vm/regress_33469_test/01: MissingCompileTimeError
 vm/regress_33469_test/02: MissingCompileTimeError
 vm/regress_33469_test/03: MissingCompileTimeError
@@ -232,19 +229,12 @@
 const_cast2_test/none: CompileTimeError # Issue 32517
 const_constructor_mixin3_test: CompileTimeError # Issue 33644.
 const_constructor_mixin_test: CompileTimeError # Issue 33644.
-const_types_test/34: MissingCompileTimeError # Issue 31590
-const_types_test/39: MissingCompileTimeError # Issue 31590
 constructor_reference_test/27: MissingCompileTimeError # Issue 34403
-default_factory2_test/01: MissingCompileTimeError # Issue 31590
-default_factory_test/01: MissingCompileTimeError # Issue 31590
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
-duplicate_export_collision_test/01: MissingCompileTimeError # Issue 12916
 f_bounded_quantification_test/01: MissingCompileTimeError # Issue 33308
 f_bounded_quantification_test/02: MissingCompileTimeError # Issue 33308
-factory4_test/00: MissingCompileTimeError # Issue 31590
 generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33308
 generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33308
 issue31596_super_test/02: MissingCompileTimeError # Issue 31596
@@ -255,10 +245,10 @@
 issue34488_test/04: MissingCompileTimeError # Issue 34488
 issue34488_test/05: MissingCompileTimeError # Issue 34488
 issue34488_test/06: MissingCompileTimeError # Issue 34488
+issue34498_test: MissingCompileTimeError # Issue 34498
 malbounded_instantiation_test/01: MissingCompileTimeError # Issue 33308
 malbounded_instantiation_test/02: MissingCompileTimeError # Issue 33308
 malbounded_instantiation_test/03: MissingCompileTimeError # Issue 33308
-malbounded_redirecting_factory_test/02: MissingCompileTimeError # Issue 33308
 malbounded_redirecting_factory_test/03: MissingCompileTimeError # Issue 33308
 malbounded_redirecting_factory_test/04: MissingCompileTimeError # Issue 33308
 malbounded_redirecting_factory_test/05: MissingCompileTimeError # Issue 33308
@@ -271,7 +261,6 @@
 malbounded_type_test_test/00: MissingCompileTimeError # Issue 33308
 malbounded_type_test_test/01: MissingCompileTimeError # Issue 33308
 malbounded_type_test_test/02: MissingCompileTimeError # Issue 33308
-mixin_declaration/mixin_declaration_inference_valid_classes_test: CompileTimeError, DartkCrash, Crash # https://github.com/dart-lang/sdk/issues/34165
 mixin_invalid_bound2_test/02: MissingCompileTimeError # Issue 33308
 mixin_invalid_bound2_test/03: MissingCompileTimeError # Issue 33308
 mixin_invalid_bound2_test/04: MissingCompileTimeError # Issue 33308
@@ -341,14 +330,10 @@
 type_variable_bounds_test/04: MissingCompileTimeError # Issue 33308
 type_variable_bounds_test/05: MissingCompileTimeError # Issue 33308
 type_variable_bounds_test/06: MissingCompileTimeError # Issue 33308
-type_variable_bounds_test/11: MissingCompileTimeError # Issue 33308
 vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 
-[ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && $compiler == dartk && $runtime == vm && $strong ]
-export_ambiguous_main_test: Crash # Issue 32618
-
 [ $compiler == app_jitk && $mode == product ]
 vm/causal_async_exception_stack2_test: RuntimeError
 vm/causal_async_exception_stack_test: RuntimeError
@@ -426,6 +411,8 @@
 assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
 
 [ $compiler == dartkb && $runtime == vm && $strong ]
+async_star_test/03: Pass, RuntimeError # Please triage
+async_star_test/04: Pass, RuntimeError # Please triage
 compile_time_constant_o_test/01: Pass
 compile_time_constant_o_test/02: Pass
 const_dynamic_type_literal_test/02: Pass
@@ -689,8 +676,6 @@
 null_test/none: SkipByDesign
 overridden_no_such_method_test: SkipByDesign
 parser_quirks_test: CompileTimeError # Issue 31533
-redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
-redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: SkipByDesign
 regress_13462_0_test: SkipByDesign
 regress_13462_1_test: SkipByDesign
@@ -777,7 +762,6 @@
 deferred_load_library_wrong_args_test/01: CompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
 emit_const_fields_test: CompileTimeError
-export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
@@ -1139,7 +1123,6 @@
 assert_initializer_test/none: RuntimeError # KernelVM bug: Constant evaluation.
 async_return_types_test/nestedFuture: Fail
 compile_time_constant_checked_test/02: MissingCompileTimeError
-default_factory2_test/01: Fail
 malbounded_redirecting_factory_test/03: Fail
 malbounded_redirecting_factory_test/04: Fail
 malbounded_type_test_test/03: Fail
@@ -1149,8 +1132,6 @@
 mixin_invalid_bound2_test/10: Fail
 mixin_invalid_bound_test/06: Fail
 mixin_invalid_bound_test/07: Fail
-redirecting_factory_infinite_steps_test/01: Fail
-redirecting_factory_malbounded_test/01: Fail
 regress_30339_test: RuntimeError
 type_variable_bounds4_test/01: RuntimeError
 
@@ -1255,8 +1236,6 @@
 no_such_method_mock_test: RuntimeError # Issue 31426
 null_no_such_method_test: CompileTimeError # Issue 31533
 parser_quirks_test: CompileTimeError # Issue 31533
-redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
-redirecting_factory_malbounded_test/01: MissingCompileTimeError
 regress_22443_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23408_test: RuntimeError, CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -1303,8 +1282,7 @@
 
 [ $fasta && $strong ]
 issue18628_2_test/01: MissingCompileTimeError
-redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
-redirecting_factory_malbounded_test/01: MissingCompileTimeError
+redirecting_factory_bounds_test/02: MissingCompileTimeError # Related to issue 33308
 type_promotion_logical_and_test/01: MissingCompileTimeError
 
 [ $fasta && !$strong ]
@@ -1503,7 +1481,6 @@
 empty_block_case_test: MissingCompileTimeError
 enum_private_test/02: MissingCompileTimeError
 error_stacktrace_test/00: MissingCompileTimeError
-export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
 factory1_test/00: MissingCompileTimeError
@@ -2144,4 +2121,3 @@
 mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/none: CompileTimeError
 mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_syntax_test: CompileTimeError
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_invalid_11_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_invalid_11_test.dart
new file mode 100644
index 0000000..c7de81e
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_invalid_11_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class I<T> {}
+mixin M1<T> on I<T> {}
+
+//////////////////////////////////////////////////////
+// Mixin type argument inference is not performed on
+// the "on" clause of a mixin
+///////////////////////////////////////////////////////
+
+mixin A00Mixin on I<int>, M1 {} /*@compile-error=unspecified*/
+
+void main() {}
\ No newline at end of file
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A00_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A00_test.dart
new file mode 100644
index 0000000..02e8ccd
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A00_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class A00 extends I<int> with M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new A00()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A01_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A01_test.dart
new file mode 100644
index 0000000..bdf8286
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A01_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class A01 extends C0<int> with M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new A01()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A02_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A02_test.dart
new file mode 100644
index 0000000..b32cc46
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A02_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class A02 extends C1<int> with M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new A02()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A10_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A10_test.dart
new file mode 100644
index 0000000..c9b9d57
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A10_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class A10 extends I<int> with M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new A10()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A11_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A11_test.dart
new file mode 100644
index 0000000..4df8195
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A11_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class A11 extends C0<int> with M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new A11()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A12_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A12_test.dart
new file mode 100644
index 0000000..c480f84
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A12_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class A12 extends C1<int> with M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new A12()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A20_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A20_test.dart
new file mode 100644
index 0000000..fc69345
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A20_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M4 is inferred as M4<int, double>
+class A20 extends C2 with M4 {
+  void check() {
+    // Verify that M4.S is exactly int
+    int Function(int) f0 = this.value0;
+    // Verify that M4.T is exactly double
+    double Function(double) f1 = this.value1;
+  }
+}
+
+void main() {
+  Expect.type<M4<int, double>>(new A20()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A21_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A21_test.dart
new file mode 100644
index 0000000..bba17a3
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A21_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M4 is inferred as M4<int, double>
+class A21 extends C3 with M2<int>, M4 {
+  void check() {
+    // Verify that M4.S is exactly int
+    int Function(int) f0 = this.value0;
+    // Verify that M4.T is exactly double
+    double Function(double) f1 = this.value1;
+  }
+}
+
+void main() {
+  Expect.type<M4<int, double>>(new A21()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A22_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A22_test.dart
new file mode 100644
index 0000000..83ef40c
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A22_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M4 is inferred as M4<int, double>
+class A22 extends C2 with M1, M4 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+    // Verify that M4.S is exactly int
+    int Function(int) f0 = this.value0;
+    // Verify that M4.T is exactly double
+    double Function(double) f1 = this.value1;
+  }
+}
+
+void main() {
+  Expect.type<M4<int, double>>(new A22()..check());
+  Expect.type<M1<int>>(new A22()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A23_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A23_test.dart
new file mode 100644
index 0000000..1d19eef
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A23_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+mixin _M5<T> on I<T> implements J<T> {}
+
+// Inference here puts J<int> in the superclass hierarchy
+class _A23 extends C0<int> with _M5 {}
+
+// Inference here should get J<int> for M4.T
+// if inference for _M5 is done first (correctly)
+// and otherwise J<dynamic>
+class A23 extends _A23 with M4 {
+  void check() {
+    // Verify that M4.S is exactly int
+    int Function(int) f0 = this.value0;
+    // Verify that M4.T is exactly int
+    int Function(int) f1 = this.value1;
+  }
+}
+
+void main() {
+  Expect.type<M4<int, int>>(new A23()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A30_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A30_test.dart
new file mode 100644
index 0000000..71337c7
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A30_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+mixin M5<S, T extends String> on I<S> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M5 is inferred as M5<int, String>
+class A30 extends C0<int> with M5 {
+  void check() {
+    // Verify that M5.S is exactly int
+    int Function(int) f0 = this.value0;
+    // Verify that M5.T is exactly String
+    String Function(String) f1 = this.value1;
+  }
+}
+
+void main() {
+  Expect.type<M5<int, String>>(new A30()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A31_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A31_test.dart
new file mode 100644
index 0000000..b0da8e9
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A31_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+mixin M6<S, T extends S> on I<S> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M6 is inferred as M6<int, int>
+class A31 extends C0<int> with M6 {
+  void check() {
+    // Verify that M6.S is exactly int
+    int Function(int) f0 = this.value0;
+    // Verify that M6.T is exactly int
+    int Function(int) f1 = this.value1;
+  }
+}
+
+void main() {
+  Expect.type<M6<int, int>>(new A31()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A42_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A42_test.dart
new file mode 100644
index 0000000..01ab1ca
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_A42_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+mixin M7<T> on I<List<T>> {
+  T Function(T) get value0 => null;
+}
+
+class A40<T> extends I<List<T>> {}
+
+class A41<T> extends A40<Map<T, T>> {}
+
+// M7 is inferred as M7<Map<int, int>>
+class A42 extends A41<int> with M7 {
+  void check() {
+    // Verify that M7.T is exactly Map<int, int>
+    Map<int, int> Function(Map<int, int>) f1 = this.value0;
+  }
+}
+
+void main() {
+  Expect.type<M7<Map<int, int>>>(new A42()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B00_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B00_test.dart
new file mode 100644
index 0000000..74e7d84
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B00_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B00 extends Object with I<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B00()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B01_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B01_test.dart
new file mode 100644
index 0000000..b0435a2
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B01_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B01 extends Object with C1<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B01()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B02_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B02_test.dart
new file mode 100644
index 0000000..0c61e49
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B02_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B02 extends I<int> with M0<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B02()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B03_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B03_test.dart
new file mode 100644
index 0000000..2f80e0f
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B03_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B03 extends Object with M2<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B03()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B10_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B10_test.dart
new file mode 100644
index 0000000..8485a59
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B10_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B10 extends Object with I<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B10()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B11_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B11_test.dart
new file mode 100644
index 0000000..adf1151
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B11_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B11 extends Object with C1<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B11()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B12_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B12_test.dart
new file mode 100644
index 0000000..fc9e613
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B12_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B12 extends I<int> with M0<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B12()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B13_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B13_test.dart
new file mode 100644
index 0000000..d8bbf43
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_B13_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class B13 extends Object with M2<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new B13()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C00_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C00_test.dart
new file mode 100644
index 0000000..7db4c89
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C00_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C00 with I<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C00()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C01_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C01_test.dart
new file mode 100644
index 0000000..d860784
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C01_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C01 with C1<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C01()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C02_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C02_test.dart
new file mode 100644
index 0000000..56c6ab0
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C02_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C02 with I<int>, M0<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C02()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C03_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C03_test.dart
new file mode 100644
index 0000000..c98a810
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C03_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C03 with M2<int>, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C03()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C10_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C10_test.dart
new file mode 100644
index 0000000..71c1f34
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C10_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C10 with I<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C10()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C11_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C11_test.dart
new file mode 100644
index 0000000..de1126c
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C11_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C11 with C1<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C11()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C12_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C12_test.dart
new file mode 100644
index 0000000..85dbebd
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C12_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C12 with I<int>, M0<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C12()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C13_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C13_test.dart
new file mode 100644
index 0000000..433ce47
--- /dev/null
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_C13_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class I<X> {}
+
+class C0<T> extends I<T> {}
+class C1<T> implements I<T> {}
+
+mixin M0<T> on I<T> {
+}
+
+mixin M1<T> on I<T> {
+  T Function(T) get value => null;
+}
+
+mixin M2<T> implements I<T> {}
+
+mixin M3<T> on I<T> {}
+
+class J<X> {}
+class C2 extends C1<int> implements J<double> {}
+class C3 extends J<double> {}
+
+mixin M4<S, T> on I<S>, J<T> {
+  S Function(S) get value0 => null;
+  T Function(T) get value1 => null;
+}
+
+// M1 is inferred as M1<int>
+class C13 with M2<int>, M3, M1 {
+  void check() {
+    // Verify that M1.T is exactly int
+    int Function(int) f = this.value;
+  }
+}
+
+void main() {
+  Expect.type<M1<int>>(new C13()..check());
+}
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_classes_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_mixin_applications_test.dart
similarity index 74%
rename from tests/language_2/mixin_declaration/mixin_declaration_inference_valid_classes_test.dart
rename to tests/language_2/mixin_declaration/mixin_declaration_inference_valid_mixin_applications_test.dart
index e7eeb50..8c4e363 100644
--- a/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_classes_test.dart
+++ b/tests/language_2/mixin_declaration/mixin_declaration_inference_valid_mixin_applications_test.dart
@@ -4,6 +4,12 @@
 
 import "package:expect/expect.dart";
 
+///////////////////////////////////////////////////////
+// Tests for inference of type arguments to mixins in
+// class definition mixin applications of the form
+// `class Foo = A with M`
+///////////////////////////////////////////////////////
+
 class I<X> {}
 
 class C0<T> extends I<T> {}
@@ -33,8 +39,7 @@
 // Inference of a single mixin from a super class works
 ///////////////////////////////////////////////////////
 
-// M1 is inferred as M1<int>
-class A00 extends I<int> with M1 {
+mixin A00Mixin on M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -42,7 +47,9 @@
 }
 
 // M1 is inferred as M1<int>
-class A01 extends C0<int> with M1 {
+class A00 = I<int> with M1, A00Mixin;
+
+mixin A01Mixin on M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -50,19 +57,23 @@
 }
 
 // M1 is inferred as M1<int>
-class A02 extends C1<int> with M1 {
+class A01 = C0<int> with M1, A01Mixin;
+
+mixin A02Mixin on M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
   }
 }
 
+// M1 is inferred as M1<int>
+class A02 = C1<int> with M1, A02Mixin;
+
 ///////////////////////////////////////////////////////
 // Inference of a single mixin from another mixin works
 ///////////////////////////////////////////////////////
 
-// M1 is inferred as M1<int>
-class B00 extends Object with I<int>, M1 {
+mixin B00Mixin on M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -70,7 +81,9 @@
 }
 
 // M1 is inferred as M1<int>
-class B01 extends Object with C1<int>, M1 {
+class B00 = Object with I<int>, M1, B00Mixin;
+
+mixin B01Mixin on M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -78,7 +91,9 @@
 }
 
 // M1 is inferred as M1<int>
-class B02 extends I<int> with M0<int>, M1 {
+class B01 = Object with C1<int>, M1, B01Mixin;
+
+mixin B02Mixin on M0<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -86,20 +101,24 @@
 }
 
 // M1 is inferred as M1<int>
-class B03 extends Object with M2<int>, M1 {
+class B02 = I<int> with M0<int>, M1, B02Mixin;
+
+mixin B03Mixin on M2<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
   }
 }
 
+// M1 is inferred as M1<int>
+class B03 = Object with M2<int>, M1, B03Mixin;
+
 ///////////////////////////////////////////////////////
 // Inference of a single mixin from another mixin works
 // with the shorthand syntax
 ///////////////////////////////////////////////////////
 
-// M1 is inferred as M1<int>
-class C00 with I<int>, M1 {
+mixin C00Mixin on M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -107,7 +126,9 @@
 }
 
 // M1 is inferred as M1<int>
-class C01 with C1<int>, M1 {
+class C00 = Object with I<int>, M1, C00Mixin;
+
+mixin C01Mixin on C1<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -115,7 +136,9 @@
 }
 
 // M1 is inferred as M1<int>
-class C02 with I<int>, M0<int>, M1 {
+class C01 = Object with C1<int>, M1, C01Mixin;
+
+mixin C02Mixin on M0<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -123,19 +146,23 @@
 }
 
 // M1 is inferred as M1<int>
-class C03 with M2<int>, M1 {
+class C02 = Object with I<int>, M0<int>, M1, C02Mixin;
+
+mixin C03Mixin on M2<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
   }
 }
 
+// M1 is inferred as M1<int>
+class C03 = Object with M2<int>, M1, C03Mixin;
+
 ///////////////////////////////////////////////////////
 // Inference of two mixins from a super class works
 ///////////////////////////////////////////////////////
 
-// M1 is inferred as M1<int>
-class A10 extends I<int> with M3, M1 {
+mixin A10Mixin on M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -143,7 +170,9 @@
 }
 
 // M1 is inferred as M1<int>
-class A11 extends C0<int> with M3, M1 {
+class A10 = I<int> with M3, M1, A10Mixin;
+
+mixin A11Mixin on C0<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -151,19 +180,23 @@
 }
 
 // M1 is inferred as M1<int>
-class A12 extends C1<int> with M3, M1 {
+class A11 = C0<int> with M3, M1, A11Mixin;
+
+mixin A12Mixin on C1<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
   }
 }
 
+// M1 is inferred as M1<int>
+class A12 = C1<int> with M3, M1, A12Mixin;
+
 ///////////////////////////////////////////////////////
 // Inference of two mixins from another mixin works
 ///////////////////////////////////////////////////////
 
-// M1 is inferred as M1<int>
-class B10 extends Object with I<int>, M3, M1 {
+mixin B10Mixin on I<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -171,7 +204,9 @@
 }
 
 // M1 is inferred as M1<int>
-class B11 extends Object with C1<int>, M3, M1 {
+class B10 = Object with I<int>, M3, M1, B10Mixin;
+
+mixin B11Mixin on C1<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -179,7 +214,9 @@
 }
 
 // M1 is inferred as M1<int>
-class B12 extends I<int> with M0<int>, M3, M1 {
+class B11 = Object with C1<int>, M3, M1, B11Mixin;
+
+mixin B12Mixin on I<int>, M0<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -187,20 +224,24 @@
 }
 
 // M1 is inferred as M1<int>
-class B13 extends Object with M2<int>, M3, M1 {
+class B12 = I<int> with M0<int>, M3, M1, B12Mixin;
+
+mixin B13Mixin on M2<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
   }
 }
 
+// M1 is inferred as M1<int>
+class B13 = Object with M2<int>, M3, M1, B13Mixin;
+
 ///////////////////////////////////////////////////////
 // Inference of a single mixin from another mixin works
 // with the shorthand syntax
 ///////////////////////////////////////////////////////
 
-// M1 is inferred as M1<int>
-class C10 with I<int>, M3, M1 {
+mixin C10Mixin on I<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -208,7 +249,9 @@
 }
 
 // M1 is inferred as M1<int>
-class C11 with C1<int>, M3, M1 {
+class C10 = Object with I<int>, M3, M1, C10Mixin;
+
+mixin C11Mixin on C1<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -216,7 +259,9 @@
 }
 
 // M1 is inferred as M1<int>
-class C12 with I<int>, M0<int>, M3, M1 {
+class C11 = Object with C1<int>, M3, M1, C11Mixin;
+
+mixin C12Mixin on I<int>, M0<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -224,21 +269,25 @@
 }
 
 // M1 is inferred as M1<int>
-class C13 with M2<int>, M3, M1 {
+class C12 = Object with I<int>, M0<int>, M3, M1, C12Mixin;
+
+mixin C13Mixin on M2<int>, M3<int>, M1<int> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
   }
 }
 
+// M1 is inferred as M1<int>
+class C13 = Object with M2<int>, M3, M1, C13Mixin;
+
 
 ///////////////////////////////////////////////////////
 // Inference from multiple constraints works
 ///////////////////////////////////////////////////////
 
 
-// M4 is inferred as M4<int, double>
-class A20 extends C2 with M4 {
+mixin A20Mixin on C2, M4<int, double> {
   void check() {
     // Verify that M4.S is exactly int
     int Function(int) f0 = this.value0;
@@ -248,17 +297,21 @@
 }
 
 // M4 is inferred as M4<int, double>
-class A21 extends C3 with M2<int>, M4 {
+class A20 = C2 with M4, A20Mixin;
+
+mixin A21Mixin on C3, M2<int>, M4<int, double> {
   void check() {
     // Verify that M4.S is exactly int
     int Function(int) f0 = this.value0;
     // Verify that M4.T is exactly double
-    double Function(double) f1 = this.value0;
+    double Function(double) f1 = this.value1;
   }
 }
 
 // M4 is inferred as M4<int, double>
-class A22 extends C2 with M1, M4 {
+class A21 = C3 with M2<int>, M4, A21Mixin;
+
+mixin A22Mixin on C2, M1<int>, M4<int, double> {
   void check() {
     // Verify that M1.T is exactly int
     int Function(int) f = this.value;
@@ -269,15 +322,15 @@
   }
 }
 
+// M4 is inferred as M4<int, double>
+class A22 = C2 with M1, M4, A22Mixin;
+
 mixin _M5<T> on I<T> implements J<T> {}
 
 // Inference here puts J<int> in the superclass hierarchy
 class _A23 extends C0<int> with _M5 {}
 
-// Inference here should get J<int> for M4.T
-// if inference for _M5 is done first (correctly)
-// and otherwise J<dynamic>
-class A23 extends _A23 with M4 {
+mixin A23Mixin on _A23, M4<int, int> {
   void check() {
     // Verify that M4.S is exactly int
     int Function(int) f0 = this.value0;
@@ -286,6 +339,11 @@
   }
 }
 
+// Inference here should get J<int> for M4.T
+// if inference for _A23 is done first (correctly)
+// and otherwise J<dynamic>
+class A23 = _A23 with M4, A23Mixin;
+
 ///////////////////////////////////////////////////////
 // Unconstrained parameters go to bounds
 ///////////////////////////////////////////////////////
@@ -300,8 +358,7 @@
   T Function(T) get value1 => null;
 }
 
-// M5 is inferred as M5<int, String>
-class A30 extends C0<int> with M5 {
+mixin A30Mixin on C0<int>, M5<int, String> {
   void check() {
     // Verify that M5.S is exactly int
     int Function(int) f0 = this.value0;
@@ -310,8 +367,10 @@
   }
 }
 
-// M6 is inferred as M6<int, int>
-class A31 extends C0<int> with M6 {
+// M5 is inferred as M5<int, String>
+class A30 = C0<int> with M5, A30Mixin;
+
+mixin A31Mixin on C0<int>, M6<int, int> {
   void check() {
     // Verify that M6.S is exactly int
     int Function(int) f0 = this.value0;
@@ -320,6 +379,9 @@
   }
 }
 
+// M6 is inferred as M6<int, int>
+class A31 = C0<int> with M6, A31Mixin;
+
 ///////////////////////////////////////////////////////
 // Non-trivial constraints should work
 ///////////////////////////////////////////////////////
@@ -328,30 +390,19 @@
   T Function(T) get value0 => null;
 }
 
-mixin M8<T> on I<Iterable<T>> {
-  T Function(T) get value0 => null;
-}
-
 class A40<T> extends I<List<T>> {}
 
 class A41<T> extends A40<Map<T, T>> {}
 
-// M7 is inferred as M7<Map<int, int>>
-class A42 extends A41<int> with M7 {
+mixin A42Mixin on A41<int>, M7<Map<int, int>> {
   void check() {
     // Verify that M7.T is exactly Map<int, int>
     Map<int, int> Function(Map<int, int>) f1 = this.value0;
   }
 }
 
-// M8 is inferred as M8<Map<int, int>>
-class A43 extends A41<int> with M8 {
-  void check() {
-    // Verify that M8.T is exactly Map<int, int>
-    Map<int, int> Function(Map<int, int>) f1 = this.value0;
-  }
-}
-
+// M7 is inferred as M7<Map<int, int>>
+class A42 = A41<int> with M7, A42Mixin;
 
 void main() {
   Expect.type<M1<int>>(new A00()..check());
@@ -392,5 +443,4 @@
   Expect.type<M6<int, int>>(new A31()..check());
 
   Expect.type<M7<Map<int, int>>>(new A42()..check());
-  Expect.type<M8<Map<int, int>>>(new A43()..check());
 }
\ No newline at end of file
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_superinvocation_application_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_superinvocation_application_test.dart
index 1a07759..4cbf973e 100644
--- a/tests/language_2/mixin_declaration/mixin_declaration_superinvocation_application_test.dart
+++ b/tests/language_2/mixin_declaration/mixin_declaration_superinvocation_application_test.dart
@@ -23,9 +23,21 @@
   }
 }
 
+mixin M11 on UnaryNum {
+  num bar() {
+    return 0.0;
+  }
+  num foo(num x) {
+    return super.foo(42.0);
+  }
+}
+
 // The super-invoked method must be non-abstract.
 class A1 extends UnaryNum //
     with M1 //# 04: compile-time error
+    with M11 //# 05: compile-time error
+    with M1, M11 //# 06: compile-time error
+    with M11, M1 //# 07: compile-time error
 {
   // M1.bar does super.foo and UnaryNum has no implementation.
   num foo(num x) => x;
@@ -49,7 +61,7 @@
 }
 
 class A2 extends C2 //
-    with M2 //# 05: compile-time error
+    with M2 //# 08: compile-time error
 {
   // M2.bar does a super.foo, so C2.foo must satisfy the super-interface of M2.
   // It doesn't, even if the super-call would succeed against C1.foo.
@@ -58,5 +70,8 @@
 
 main() {
   A1().bar(); //# 04: continued
-  A2().bar(); //# 05: continued
+  A1().bar(); //# 05: continued
+  A1().bar(); //# 06: continued
+  A1().bar(); //# 07: continued
+  A2().bar(); //# 08: continued
 }
\ No newline at end of file
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart
index 6159af9..b87284a 100644
--- a/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart
+++ b/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart
@@ -222,7 +222,7 @@
   }
 
   {
-    for (var o in [CBaM(), CBaM_2()]) {
+    for (dynamic o in [CBaM(), CBaM_2()]) {
       Expect.type<B>(o);
       Expect.type<M>(o);
       Expect.equals("?&M", "$o");
@@ -241,7 +241,7 @@
   }
 
   {
-    for (var o in [CBaMO(), CBaMO_2()]) {
+    for (dynamic o in [CBaMO(), CBaMO_2()]) {
       Expect.type<B>(o);
       Expect.type<MO>(o);
       Expect.equals("B&MO", "$o");
@@ -288,7 +288,7 @@
   }
 
   {
-    for (var o in [CBaMA(), CBaMA_2()]) {
+    for (dynamic o in [CBaMA(), CBaMA_2()]) {
       Expect.type<B>(o);
       Expect.type<MA>(o);
       Expect.equals("B&MA", "$o");
diff --git a/tests/language_2/redirecting_factory_bounds_test.dart b/tests/language_2/redirecting_factory_bounds_test.dart
new file mode 100644
index 0000000..e8dbabf
--- /dev/null
+++ b/tests/language_2/redirecting_factory_bounds_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Bounds checking on redirecting factories.
+
+class Foo<T> {}
+
+class Baz<T> {}
+
+class Foobar<T> implements Foo<T> {}
+
+class Bar<
+          T // A comment to prevent dartfmt from joining the lines.
+          extends Foo<T>      //# 00: ok
+          extends Baz<Foo<T>> //# 01: compile-time error
+          extends Foobar<T>   //# 02: compile-time error
+  > {
+  Bar.named();
+  factory Bar() = Qux<T>;
+}
+
+class Qux<
+          T // A comment to prevent dartfmt from joining the lines.
+          extends Foo<T> //# 00: continued
+          extends Foo<T> //# 01: continued
+          extends Foo<T> //# 02: continued
+         > extends Bar<T> {
+  Qux() : super.named();
+}
+
+
+
+class A<T extends int> {
+  factory A() = B<
+                  T // A comment to prevent dartfmt from joining the lines.
+                  , int //# 03: compile-time error
+                  , String //# 04: ok
+                 >;
+}
+
+class B<T extends int
+        , S extends String //# 03: continued
+        , S extends String //# 04: continued
+       > implements A<T> {}
+
+void main() {
+  new Bar<Null>();
+  new A<int>();
+}
diff --git a/tests/language_2/switch_case_test.dart b/tests/language_2/switch_case_test.dart
index 52128d4..736ec30 100644
--- a/tests/language_2/switch_case_test.dart
+++ b/tests/language_2/switch_case_test.dart
@@ -17,19 +17,19 @@
   operator ==(o) => true; // //# 00: compile-time error
 }
 
-class C implements A {
+class C implements D {
   final int x;
   const C() : x = 0;
   const C.fromD() : x = 1;
 }
 
-class D implements C {
+class D implements A {
   int get x => 0;
   const factory D() = C.fromD;
 }
 
 main() {
-  switch (new B()) { 
+  switch (new B()) {
     case const A.B(): Expect.fail("bad switch"); break; // //# 00: continued
   }
 
diff --git a/tests/language_2/type_variable_conflict_test.dart b/tests/language_2/type_variable_conflict_test.dart
index 06cd2f7..5242b0d 100644
--- a/tests/language_2/type_variable_conflict_test.dart
+++ b/tests/language_2/type_variable_conflict_test.dart
@@ -8,27 +8,35 @@
 import "package:expect/expect.dart";
 
 class G1<T> {
-  var T; // //# 01: compile-time error
+  var T; //              //# 01: compile-time error
 }
 
 class G2<T> {
-  get T {} // //# 02: compile-time error
+  get T {} //            //# 02: compile-time error
 }
 
 class G3<T> {
-  T() {} // //# 03: compile-time error
+  T() {} //              //# 03: compile-time error
 }
 
 class G4<T> {
-  static var T; // //# 04: compile-time error
+  static var T; //       //# 04: compile-time error
 }
 
 class G5<T> {
-  static get T {} // //# 05: compile-time error
+  static get T {} //     //# 05: compile-time error
 }
 
 class G6<T> {
-  static T() {} // //# 06: compile-time error
+  static T() {} //       //# 06: compile-time error
+}
+
+class G7<T> {
+  set T(_) {} //         //# 07: compile-time error
+}
+
+class G8<T> {
+  static set T(x) {} //  //# 08: compile-time error
 }
 
 main() {
@@ -38,4 +46,6 @@
   new G4<int>();
   new G5<int>();
   new G6<int>();
+  new G7<int>();
+  new G8<int>();
 }
diff --git a/tests/language_2/type_variable_scope_test.dart b/tests/language_2/type_variable_scope_test.dart
index b219b29..fc53e58 100644
--- a/tests/language_2/type_variable_scope_test.dart
+++ b/tests/language_2/type_variable_scope_test.dart
@@ -4,7 +4,7 @@
 
 // Test that type variables referenced from within static members are malformed.
 
-class Foo<T> {
+class Foo<T> implements I<T> {
   Foo() {}
 
   static
diff --git a/tests/language_2/vm/regress_34466_test.dart b/tests/language_2/vm/regress_34466_test.dart
new file mode 100644
index 0000000..69b237f
--- /dev/null
+++ b/tests/language_2/vm/regress_34466_test.dart
@@ -0,0 +1,53 @@
+// 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 NaN comparison (dartbug.com/34466 and dartbug.com/34467).
+
+// VMOptions=--no_background_compilation --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+double dvar = double.nan;
+
+int doit() {
+  if (!(((-84).toDouble() <= double.nan))) {
+    return 1;
+  } else {
+    return 2;
+  }
+}
+
+doTests() {
+  Expect.isFalse(dvar > dvar);
+  Expect.isFalse(dvar < dvar);
+  Expect.isFalse(dvar <= dvar);
+  Expect.isFalse(dvar >= dvar);
+  Expect.isFalse(dvar > -dvar);
+  Expect.isFalse(-dvar > dvar);
+
+  Expect.isTrue(!(dvar > dvar));
+  Expect.isTrue(!(dvar < dvar));
+  Expect.isTrue(!(dvar <= dvar));
+  Expect.isTrue(!(dvar >= dvar));
+  Expect.isTrue(!(dvar > -dvar));
+  Expect.isTrue(!(-dvar > dvar));
+
+  Expect.equals(1, doit());
+
+  Expect.isFalse(dvar == dvar);
+  Expect.isFalse(dvar == -dvar);
+  Expect.isTrue(dvar != dvar);
+  Expect.isTrue(dvar != -dvar);
+
+  Expect.isTrue(!(dvar == dvar));
+  Expect.isTrue(!(dvar == -dvar));
+  Expect.isFalse(!(dvar != dvar));
+  Expect.isFalse(!(dvar != -dvar));
+}
+
+void main() {
+  for (int i = 0; i < 20; ++i) {
+    doTests();
+  }
+}
diff --git a/tests/language_2/vm/regress_flutter_21957_test.dart b/tests/language_2/vm/regress_flutter_21957_test.dart
new file mode 100644
index 0000000..69db3a5
--- /dev/null
+++ b/tests/language_2/vm/regress_flutter_21957_test.dart
@@ -0,0 +1,58 @@
+// 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.
+
+// Tests how nullability is inferred for a final field which is implicitly
+// initialized to null. This is a regression test for
+// https://github.com/flutter/flutter/issues/21957.
+
+// VMOptions=--no_background_compilation --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+class A {}
+
+class X {
+  final A f;
+  X.empty() : f = null;
+  X.full() : f = A();
+}
+
+bool doit(bool choice) {
+  X x = choice ? X.full() : X.empty();
+  return x.f == null;
+}
+
+class Y {
+  final A f;
+  Y.c0() : f = A();
+  Y.c1() : f = null;
+  Y.c2() : f = A();
+}
+
+bool doit2(int choice) {
+  Y y;
+  switch (choice) {
+    case 0:
+      y = new Y.c0();
+      break;
+    case 1:
+      y = new Y.c1();
+      break;
+    case 2:
+      y = new Y.c2();
+      break;
+  }
+  return y.f == null;
+}
+
+void main() {
+  for (int i = 0; i < 100; i++) {
+    bool ping = (i & 1) == 0;
+    bool result = doit(ping);
+    Expect.equals(result, !ping);
+
+    bool result2 = doit2(i % 3);
+    Expect.equals(result2, (i % 3) != 0 && (i % 3) != 2);
+  }
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 2af6884..7be5f14 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -2,467 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $arch == simarm64 ]
-convert/utf85_test: Skip # Pass, Slow Issue 20111.
-
-[ $arch == simarmv5te ]
-mirrors/mirrors_reader_test: Pass, Slow
-
-[ $compiler == app_jit ]
-mirrors/*: Skip # Issue 27929: Triage
-
-[ $compiler == dart2analyzer ]
-*: Skip
-
-[ $compiler == dart2js ]
-async/async_await_sync_completer_test: RuntimeError # sync-async is on by default.
-async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
-convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by dart2js.
-convert/chunked_conversion_utf88_test: Slow, Pass
-convert/utf82_test: CompileTimeError # Large integer literal. Not valid in dart2.
-convert/utf85_test: Slow, Pass
-developer/timeline_test: Skip # Not supported
-math/double_pow_test: RuntimeError
-math/low_test: RuntimeError
-mirrors/*: SkipByDesign # mirrors not supported
-mirrors/class_declarations_test/none: RuntimeError # Issue 13440
-mirrors/class_mirror_location_test: RuntimeError # Issue 6490
-mirrors/closurization_equivalence_test: RuntimeError # Issue 6490
-mirrors/fake_function_with_call_test: RuntimeError # Issue 11612
-mirrors/fake_function_without_call_test: RuntimeError # Issue 11612
-mirrors/generic_f_bounded_mixin_application_test: RuntimeError # Issue 12087
-mirrors/generic_function_typedef_test: RuntimeError # Issue 12333
-mirrors/generic_interface_test: RuntimeError # Issue 12087
-mirrors/get_field_static_test/00: RuntimeError # Issue 21323
-mirrors/globalized_closures2_test/00: RuntimeError # Issue 17118. Please remove the multi-test comments when this test starts succeeding.
-mirrors/globalized_closures_test/00: RuntimeError # Issue 17118. Please remove the multi-test comments when this test starts succeeding.
-mirrors/hierarchy_invariants_test: RuntimeError # Issue 15262
-mirrors/hot_get_field_test: CompileTimeError # Issue 12164
-mirrors/hot_set_field_test: CompileTimeError # Issue 12164
-mirrors/immutable_collections_test: RuntimeError # Issue 14030
-mirrors/initializing_formals_test/01: RuntimeError # Issue 6490
-mirrors/initializing_formals_test/03: CompileTimeError # Issue 12164
-mirrors/instance_members_test: RuntimeError # Issue 14633
-mirrors/instantiate_abstract_class_test: RuntimeError # Issue 6490
-mirrors/invocation_fuzz_test: RuntimeError # Issue 29086
-mirrors/invoke_call_on_closure_test: RuntimeError # 6490
-mirrors/invoke_call_through_getter_previously_accessed_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
-mirrors/invoke_call_through_getter_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
-mirrors/invoke_call_through_implicit_getter_previously_accessed_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
-mirrors/invoke_call_through_implicit_getter_test: RuntimeError # Issue 17638
-mirrors/invoke_named_test/none: RuntimeError # Issue 12863
-mirrors/invoke_private_test: CompileTimeError # Issue 12164
-mirrors/invoke_private_wrong_library_test: CompileTimeError # Issue 12164
-mirrors/library_declarations_test/none: RuntimeError # Issue 13439, Issue 13733
-mirrors/library_exports_hidden_test: RuntimeError # Issue 6490
-mirrors/library_exports_shown_test: RuntimeError # Issue 6490
-mirrors/library_import_deferred_loading_test: RuntimeError # Issue 6490
-mirrors/library_imports_bad_metadata_test/none: RuntimeError # Issue 6490
-mirrors/library_imports_deferred_test: RuntimeError # Issue 6490
-mirrors/library_imports_hidden_test: RuntimeError # Issue 6490
-mirrors/library_imports_metadata_test: RuntimeError # Issue 6490
-mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 6490
-mirrors/library_imports_prefixed_test: RuntimeError # Issue 6490
-mirrors/library_imports_shown_test: RuntimeError # Issue 6490
-mirrors/library_uri_io_test: SkipByDesign # Uses dart:io.
-mirrors/load_library_test: RuntimeError # Issue 6335
-mirrors/local_function_is_static_test: RuntimeError # Issue 6335
-mirrors/lru_test: Skip # dart2js_native/lru_test is used instead
-mirrors/metadata_scope_test/none: RuntimeError # Issue 10905
-mirrors/method_mirror_location_test: RuntimeError # Issue 6490
-mirrors/method_mirror_name_test: RuntimeError # Issue 6335
-mirrors/method_mirror_properties_test: RuntimeError # Issue 11861
-mirrors/method_mirror_source_line_ending_test: RuntimeError # Issue 6490
-mirrors/method_mirror_source_test: RuntimeError # Issue 6490
-mirrors/mirrors_nsm_mismatch_test: RuntimeError # Issue 19353
-mirrors/mirrors_nsm_test/dart2js: RuntimeError # Issue 19353
-mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
-mirrors/mirrors_test: RuntimeError # TODO(ahe): I'm working on fixing this. When removing this line please change the "endsWith" to "/mirrors_test.dart".
-mirrors/mixin_application_test: RuntimeError # Issue 12464
-mirrors/mixin_test: RuntimeError # Issue 12464
-mirrors/other_declarations_location_test: RuntimeError # Issue 10905
-mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
-mirrors/parameter_test/none: RuntimeError # Issue 6490
-mirrors/private_class_field_test: CompileTimeError
-mirrors/private_symbol_test: CompileTimeError # Issue 13597
-mirrors/private_types_test: RuntimeError # Issue 6490
-mirrors/raw_type_test/01: RuntimeError # Issue 6490
-mirrors/redirecting_factory_test/02: RuntimeError # Issue 6490
-mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
-mirrors/reflected_type_function_type_test: RuntimeError # Issue 12607
-mirrors/reflected_type_generics_test/01: Fail # Issues in reflecting generic typedefs.
-mirrors/reflected_type_generics_test/02: Fail # Issues in reflecting bounded type variables.
-mirrors/reflected_type_generics_test/03: Fail # Issues in reflecting generic typedefs. The following tests fail because we have disabled a test in `reflectClassByName`. `MirrorsUsed` leads to classes not having the information necessary to correctly handle these checks.
-mirrors/reflected_type_generics_test/04: Fail # Issues in reflecting bounded type variables. The following tests fail because we have disabled a test in `reflectClassByName`. `MirrorsUsed` leads to classes not having the information necessary to correctly handle these checks.
-mirrors/reflected_type_generics_test/05: Fail # Issues in reflecting generic typedefs. The following tests fail because we have disabled a test in `reflectClassByName`. `MirrorsUsed` leads to classes not having the information necessary to correctly handle these checks.
-mirrors/reflected_type_generics_test/06: Fail # Issues in reflecting bounded type variables. The following tests fail because we have disabled a test in `reflectClassByName`. `MirrorsUsed` leads to classes not having the information necessary to correctly handle these checks.
-mirrors/reflected_type_special_types_test: RuntimeError # Issue 12607
-mirrors/reflected_type_typedefs_test: RuntimeError # Issue 12607
-mirrors/reflected_type_typevars_test: RuntimeError # Issue 12607
-mirrors/regress_26187_test: RuntimeError # Issue 6490
-mirrors/relation_assignable2_test: RuntimeError # Issue 6490
-mirrors/relation_assignable_test: RuntimeError # Issue 6490
-mirrors/relation_subtype_test: RuntimeError # Issue 6490
-mirrors/repeated_private_anon_mixin_app_test: RuntimeError # Issue 14670
-mirrors/static_members_test: RuntimeError # Issue 14633, Issue 12164
-mirrors/symbol_validation_test/01: RuntimeError # Issue 13597
-mirrors/type_variable_is_static_test: RuntimeError # Issue 6335
-mirrors/type_variable_owner_test/01: RuntimeError # Issue 12785
-mirrors/typedef_metadata_test: RuntimeError # Issue 12785
-mirrors/typedef_reflected_type_test/01: RuntimeError # Issue 12607
-mirrors/typedef_test: RuntimeError # Issue 6490
-mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
-mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
-profiler/metrics_num_test: Skip # Because of a int / double type test.
-typed_data/int32x4_bigint_test: Pass
-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/int64_list_load_store_test: RuntimeError # Issue 10275
-typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
-
-[ $compiler == fasta ]
-mirrors/metadata_allowed_values_test/02: MissingCompileTimeError
-mirrors/metadata_allowed_values_test/27: MissingCompileTimeError
-mirrors/metadata_constructor_arguments_test/04: MissingCompileTimeError
-
-[ $compiler == precompiler ]
-convert/chunked_conversion_utf88_test: Pass, Timeout
-convert/utf85_test: Pass, Timeout
-mirrors/*: SkipByDesign
-
-[ $mode == product ]
-developer/timeline_test: Skip # Not supported
-
-[ $runtime == ff ]
-convert/streamed_conversion_utf8_decode_test: Pass, Slow # Issue 12029, FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
-convert/utf85_test: SkipSlow
-mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589, FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
-
-[ $runtime == flutter ]
-async/catch_errors11_test: Skip # Flutter Issue 9113
-async/intercept_schedule_microtask2_test: Skip # Flutter Issue 9113
-async/intercept_schedule_microtask5_test: Skip # Flutter Issue 9113
-async/intercept_schedule_microtask6_test: Skip # Flutter Issue 9113
-async/stream_empty_test: Skip # Flutter Issue 9113
-async/stream_event_transformed_test: Skip # Flutter Issue 9113
-mirrors/*: Skip # Flutter does not support mirrors.
-
-[ $runtime == none ]
-convert/html_escape_test: CompileTimeError # Uppercase constants removed
-
-[ $runtime != none ]
-async/stream_controller_async_test: RuntimeError # Library changed.
-async/stream_empty_test: RuntimeError # Uppercase constants removed
-async/stream_from_iterable_test: RuntimeError # Library changed.
-async/stream_iterator_test: RuntimeError # Uppercase constants removed
-async/stream_listen_zone_test: RuntimeError # Uppercase constants removed
-async/zone_bind_callback_test: RuntimeError # Uppercase constants removed
-async/zone_bind_callback_unary_test: RuntimeError # Uppercase constants removed
-async/zone_bind_test: RuntimeError # Uppercase constants removed
-async/zone_create_periodic_timer_test: RuntimeError # Uppercase constants removed
-async/zone_create_timer2_test: RuntimeError # Uppercase constants removed
-async/zone_create_timer_test: RuntimeError # Uppercase constants removed
-async/zone_debug_test: RuntimeError # Uppercase constants removed
-async/zone_empty_description2_test: RuntimeError # Uppercase constants removed
-async/zone_empty_description_test: RuntimeError # Uppercase constants removed
-async/zone_fork_test: RuntimeError # Uppercase constants removed
-async/zone_register_callback_test: RuntimeError # Uppercase constants removed
-async/zone_register_callback_unary_test: RuntimeError # Uppercase constants removed
-async/zone_root_bind_test: RuntimeError # Uppercase constants removed
-async/zone_run_guarded_test: RuntimeError # Uppercase constants removed
-async/zone_run_test: RuntimeError # Uppercase constants removed
-async/zone_run_unary_test: RuntimeError # Uppercase constants removed
-async/zone_value_test: RuntimeError # Uppercase constants removed
-convert/ascii_test: RuntimeError # Uppercase constants removed
-convert/base64_test/none: RuntimeError # Uppercase constants removed
-convert/chunked_conversion_json_decode1_test: RuntimeError # Uppercase constants removed
-convert/chunked_conversion_utf85_test: RuntimeError # Uppercase constants removed
-convert/chunked_conversion_utf87_test: RuntimeError # Uppercase constants removed
-convert/chunked_conversion_utf88_test: RuntimeError # Uppercase constants removed
-convert/codec2_test: RuntimeError # Uppercase constants removed
-convert/encoding_test: RuntimeError # Uppercase constants removed
-convert/html_escape_test: CompileTimeError # Uppercase constants removed
-convert/json_chunk_test: RuntimeError # Uppercase constants removed
-convert/json_lib_test: RuntimeError # Uppercase constants removed
-convert/json_pretty_test: RuntimeError # Uppercase constants removed
-convert/json_test: RuntimeError # Uppercase constants removed
-convert/json_util_test: RuntimeError # Uppercase constants removed
-convert/latin1_test: RuntimeError # Uppercase constants removed
-convert/line_splitter_test: RuntimeError # Uppercase constants removed
-convert/streamed_conversion_json_encode1_test: RuntimeError # Uppercase constants removed
-convert/streamed_conversion_json_utf8_decode_test: RuntimeError # Uppercase constants removed
-convert/streamed_conversion_json_utf8_encode_test: RuntimeError # Uppercase constants removed
-convert/streamed_conversion_utf8_decode_test: RuntimeError # Uppercase constants removed
-convert/streamed_conversion_utf8_encode_test: RuntimeError # Uppercase constants removed
-convert/utf83_test: RuntimeError # Uppercase constants removed
-convert/utf84_test: RuntimeError # Uppercase constants removed
-convert/utf85_test: RuntimeError # Uppercase constants removed
-convert/utf8_encode_test: RuntimeError # Uppercase constants removed
-convert/utf8_test: RuntimeError # Uppercase constants removed
-math/math2_test: RuntimeError # Uppercase constants removed
-math/math_parse_double_test: RuntimeError # Uppercase constants removed
-math/math_test: RuntimeError # Uppercase constants removed
-mirrors/invocation_fuzz_test/emptyarray: RuntimeError # Uppercase constants removed
-mirrors/invocation_fuzz_test/false: RuntimeError # Uppercase constants removed
-mirrors/invocation_fuzz_test/none: RuntimeError # Uppercase constants removed
-mirrors/invocation_fuzz_test/smi: RuntimeError # Uppercase constants removed
-mirrors/invocation_fuzz_test/string: RuntimeError # Uppercase constants removed
-typed_data/endianness_test: RuntimeError # Uppercase constants removed
-typed_data/float32x4_cross_test: RuntimeError # Uppercase constants removed
-typed_data/float32x4_list_test: RuntimeError # Uppercase constants removed
-typed_data/float32x4_shuffle_test: RuntimeError # Uppercase constants removed
-typed_data/float32x4_test: RuntimeError # Uppercase constants removed
-typed_data/float32x4_transpose_test: RuntimeError # Uppercase constants removed
-typed_data/float32x4_two_arg_shuffle_test: RuntimeError # Uppercase constants removed
-typed_data/int32x4_shuffle_test: RuntimeError # Uppercase constants removed
-
-[ $runtime == safari ]
-convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
-typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-
-[ $runtime == vm ]
-convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Infrequent timeouts.
-
-[ !$checked ]
-mirrors/redirecting_factory_different_type_test: SkipByDesign # Tests type checks.
-
-[ $fasta ]
-convert/base64_test/01: CompileTimeError
-math/double_pow_test: CompileTimeError
-mirrors/metadata_allowed_values_test/13: MissingCompileTimeError
-mirrors/metadata_allowed_values_test/14: MissingCompileTimeError
-mirrors/metadata_nested_constructor_call_test/03: MissingCompileTimeError
-mirrors/metadata_nested_constructor_call_test/04: MissingCompileTimeError
-mirrors/native_class_test: CompileTimeError
-mirrors/variable_is_const_test/01: MissingCompileTimeError
-typed_data/int32x4_bigint_test: CompileTimeError
-
-[ $hot_reload ]
-async/timer_regress22626_test: Pass, RuntimeError # Timing dependent.
-mirrors/generic_bounded_by_type_parameter_test/02: Fail # Type equality - Issue 26869
-mirrors/generic_bounded_test/02: Fail # Type equality - Issue 26869
-
-[ $strong ]
-*: SkipByDesign # tests/lib_2 has the strong mode versions of these tests.
-
-[ $arch == arm64 && $runtime == vm ]
-mirrors/immutable_collections_test: Pass, Slow # http://dartbug.com/33057
-
-[ $arch == ia32 && $mode == debug && $system == windows ]
-convert/streamed_conversion_json_utf8_decode_test: Skip # Verification OOM.
-
-[ $arch != ia32 && $arch != simarm && $arch != simarmv5te && $arch != simarmv6 && $arch != x64 && $mode == debug ]
-convert/streamed_conversion_json_utf8_decode_test: Skip # Verification not yet implemented.
-
-[ $arch == x64 && $mode == debug && $system == windows && ($runtime == dart_precompiled || $runtime == vm) ]
-convert/streamed_conversion_json_utf8_decode_test: Pass, Slow
-
-[ $builder_tag == asan && $mode == debug && ($runtime == dart_precompiled || $runtime == vm) ]
-convert/streamed_conversion_json_utf8_decode_test: Skip # Timeout.
-mirrors/immutable_collections_test: SkipSlow # Timeout.
-
-[ $builder_tag == mac10_7 && $runtime == safari ]
-typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-
-[ $compiler == dart2js && $mode == debug ]
-mirrors/native_class_test: Pass, Slow
-
-[ $compiler == dart2js && $runtime == chromeOnAndroid ]
-typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
-typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
-
-[ $compiler == dart2js && $runtime == d8 && $system == windows ]
-async/*deferred*: Pass, RuntimeError # Issue 17458
-mirrors/*deferred*: Pass, RuntimeError # Issue 17458
-
-[ $compiler == dart2js && $runtime == d8 && $fasta ]
-js/null_test: RuntimeError
-
-[ $compiler == dart2js && $runtime == ie11 ]
-math/math2_test: RuntimeError
-math/math_test: RuntimeError
-
-[ $compiler == dart2js && $runtime == jsshell ]
-async/catch_errors12_test: Fail # Timer interface not supported: Issue 7728.
-async/catch_errors13_test: Fail # Timer interface not supported: Issue 7728.
-async/catch_errors14_test: Fail # Timer interface not supported: Issue 7728.
-async/catch_errors15_test: Fail # Timer interface not supported: Issue 7728.
-async/catch_errors22_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/catch_errors8_test: Fail # Timer interface not supported: Issue 7728.
-async/future_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_asyncexpand_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/stream_asyncmap_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/stream_controller_async_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_controller_test: Fail # Timer interface not supported: Issue 7728.
-async/stream_from_iterable_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_periodic2_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_periodic3_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_periodic4_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_periodic5_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_periodic6_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_periodic_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_state_nonzero_timer_test: RuntimeError # Timer interface not supported; Issue 7728.
-async/stream_subscription_cancel_test: Fail # Timer interface not supported: Issue 7728.
-async/stream_take_test: Fail # Timer interface not supported: Issue 7728.
-async/stream_timeout_test: Fail # Timer interface not supported: Issue 7728.
-async/stream_transformation_broadcast_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/timer_cancel1_test: RuntimeError, OK # Needs Timer to run.
-async/timer_cancel2_test: RuntimeError, OK # Needs Timer to run.
-async/timer_cancel_test: RuntimeError, OK # Needs Timer to run.
-async/timer_isActive_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/timer_regress22626_test: RuntimeError # Non-zero timers not supported; Issue 7728.
-async/timer_repeat_test: RuntimeError, OK # Needs Timer to run.
-async/timer_test: RuntimeError, OK # Needs Timer to run.
-async/zone_bind_test: Fail # Timer interface not supported: Issue 7728.
-async/zone_create_periodic_timer_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/zone_create_timer2_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/zone_empty_description2_test: RuntimeError # Timer interface not supported: Issue 7728.
-mirrors/mirrors_reader_test: Skip # Running in v8 suffices. Issue 16589 - RuntimeError.  Issue 22130 - Crash (out of memory).
-
-[ $compiler == dart2js && $checked ]
-convert/utf85_test: Pass, Slow # Issue 12029.
-
-[ $compiler == dart2js && $checked && $fast_startup && $minified ]
-async/stream_listen_zone_test: RuntimeError
-
-[ $compiler == dart2js && $checked && $host_checked ]
-async/stream_listen_zone_test: RuntimeError
-
-[ $compiler == dart2js && $fast_startup ]
-mirrors/*: Fail # mirrors not supported
-mirrors/library_imports_bad_metadata_test/01: Pass # expects failure, but it fails for the wrong reason
-mirrors/library_metadata2_test/01: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_allowed_values_test/0*: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_allowed_values_test/1*: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_allowed_values_test/2*: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_allowed_values_test/3*: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_constructor_arguments_test/0*: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_nested_constructor_call_test/0*: Pass # expects failure, but it fails for the wrong reason
-mirrors/metadata_scope_test/01: Pass # expects failure, but it fails for the wrong reason
-mirrors/mirror_in_static_init_test/01: Pass # expects failure, but it fails for the wrong reason
-mirrors/model_test: Pass # this is ok
-mirrors/parameter_is_const_test/01: Pass # expects failure, but it fails for the wrong reason
-mirrors/regress_16321_test/01: Pass # expects failure, but if fails for the wrong reason
-mirrors/syntax_error_test/01: Pass # expects failure, but it fails for the wrong reason
-mirrors/variable_is_const_test/01: Pass # expects failure, but it fails for the wrong reason
-
-[ $compiler == dart2js && $host_checked ]
-async/stream_controller_async_test: Crash
-mirrors/metadata_allowed_values_test/28: Crash # Issue 25911
-mirrors/metadata_allowed_values_test/29: Crash # Issue 25911
-mirrors/metadata_allowed_values_test/30: Crash # Issue 25911
-mirrors/metadata_allowed_values_test/31: Crash # Issue 25911
-
-[ $compiler == dart2js && $minified ]
-mirrors/mirrors_used_get_name2_test: RuntimeError
-mirrors/mirrors_used_get_name_test: RuntimeError
-
-[ $compiler == dart2js && ($runtime == d8 || $browser) ]
-async/timer_not_available_test: Fail, OK # only meant to test when there is no way to implement timer (currently only in jsshell)
-
-[ $compiler != dart2js && $fasta ]
-convert/utf82_test: CompileTimeError # Note: dart2js passes for the wrong reason, it hasn't switched to run in 64-bits
-js/datetime_roundtrip_test: CompileTimeError
-js/null_test: CompileTimeError
-
-[ $compiler != dartk && $compiler != dartkb && $compiler != dartkp && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
-mirrors/initializing_formals_test/01: Fail # initializing formals are implicitly final as of Dart 1.21
-
-[ $compiler == none && $mode == product ]
-mirrors/library_enumeration_deferred_loading_test: RuntimeError, OK # Deferred loaded eagerly
-mirrors/library_import_deferred_loading_test: RuntimeError, OK # Deferred loaded eagerly
-mirrors/load_library_test: RuntimeError, OK # Deferred loaded eagerly
-
-[ $compiler == none && !$checked ]
-mirrors/reflected_type_generics_test/02: Fail, OK # Type check for a bounded type argument.
-
-[ $runtime == chrome && $system == linux ]
-mirrors/native_class_test: Pass, Slow
-
-[ $runtime == chrome && $system == macos ]
-async/catch_errors11_test: Pass, Timeout # Issue 22696
-async/timer_isActive_test: Fail, Pass, Timeout # Issue 22696
-
-[ $runtime != none && !$strong ]
-async/stream_first_where_test: RuntimeError
-async/stream_last_where_test: RuntimeError
-
-[ $runtime == vm && $system == fuchsia ]
-async/first_regression_test: RuntimeError # These use package:unittest
-async/future_timeout_test: RuntimeError # These use package:unittest
-async/multiple_timer_test: RuntimeError # These use package:unittest
-async/stream_controller_async_test: RuntimeError # These use package:unittest
-async/stream_first_where_test: RuntimeError # These use package:unittest
-async/stream_from_iterable_test: RuntimeError # These use package:unittest
-async/stream_iterator_test: RuntimeError # These use package:unittest
-async/stream_join_test: RuntimeError # These use package:unittest
-async/stream_last_where_test: RuntimeError # These use package:unittest
-async/stream_periodic2_test: RuntimeError # These use package:unittest
-async/stream_periodic3_test: RuntimeError # These use package:unittest
-async/stream_periodic4_test: RuntimeError # These use package:unittest
-async/stream_periodic5_test: RuntimeError # These use package:unittest
-async/stream_periodic6_test: RuntimeError # These use package:unittest
-async/stream_periodic_test: RuntimeError # These use package:unittest
-async/stream_single_test: RuntimeError # These use package:unittest
-async/stream_single_to_multi_subscriber_test: RuntimeError # These use package:unittest
-async/stream_state_nonzero_timer_test: RuntimeError # These use package:unittest
-async/stream_state_test: RuntimeError # These use package:unittest
-async/stream_subscription_as_future_test: RuntimeError # These use package:unittest
-async/stream_subscription_cancel_test: RuntimeError # These use package:unittest
-async/stream_timeout_test: RuntimeError # These use package:unittest
-async/stream_transform_test: RuntimeError # These use package:unittest
-async/stream_transformation_broadcast_test: RuntimeError # These use package:unittest
-async/timer_cancel1_test: RuntimeError # These use package:unittest
-async/timer_cancel2_test: RuntimeError # These use package:unittest
-async/timer_cancel_test: RuntimeError # These use package:unittest
-async/timer_isActive_test: RuntimeError # These use package:unittest
-async/timer_repeat_test: RuntimeError # These use package:unittest
-async/timer_test: RuntimeError # These use package:unittest
-convert/json_lib_test: RuntimeError # These use package:unittest
-mirrors/invocation_fuzz_test: Crash # fstat bug, ZX-479.
-mirrors/library_uri_io_test: RuntimeError # These use package:unittest
-mirrors/library_uri_package_test: RuntimeError # These use package:unittest
-
-[ $arch == simarm || $arch == simarmv5te || $arch == simarmv6 ]
-convert/chunked_conversion_utf88_test: Skip # Pass, Slow Issue 12644.
-convert/utf85_test: Skip # Pass, Slow Issue 12644.
-
-[ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
-async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
-async/timer_regress22626_test: Pass, RuntimeError # Issue 28254
-mirrors/mirrors_used*: SkipByDesign # Invalid tests. MirrorsUsed does not have a specification, and dart:mirrors is not required to hide declarations that are not covered by any MirrorsUsed annotation.
-mirrors/symbol_validation_test: RuntimeError # Issue 13596
-
-# All these tests have been migrated as strong mode compatible tests to
-# lib_2, so skipping these tests for dartk and dartkp
-[ $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
-*: SkipByDesign
-
-[ $runtime == chrome || $runtime == ff ]
-async/stream_timeout_test: SkipSlow # Times out. Issue 22050
-convert/streamed_conversion_json_utf8_decode_test: SkipSlow # Times out. Issue 22050
-convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
-convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
-convert/streamed_conversion_utf8_encode_test: SkipSlow # Times out. Issue 22050
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
-async/timer_not_available_test: Fail, OK
-convert/base64_test/01: CompileTimeError # Large integer literal
-convert/json_utf8_chunk_test: RuntimeError # Large integers
-convert/utf82_test: CompileTimeError # Large integer literal
-js/*: Skip
-math/double_pow_test: CompileTimeError # Large integer literal
-mirrors/deferred_type_test: CompileTimeError, OK # Don't have a multitest marker for dynamic compile time errors.
-mirrors/native_class_test: Fail, OK # This test is meant to run in a browser.
-typed_data/int32x4_bigint_test: CompileTimeError # Large integer literal
-
-[ $hot_reload || $hot_reload_rollback ]
-async/stream_transformer_test: Pass, Fail # Closure identity
-mirrors/fake_function_with_call_test: SkipByDesign # Method equality
-mirrors/library_enumeration_deferred_loading_test: Crash # Deferred loading
-mirrors/library_import_deferred_loading_test: Crash # Deferred loading
-mirrors/library_imports_deferred_test: Crash # Deferred loading
-mirrors/load_library_test: Crash # Deferred loading
-mirrors/typedef_deferred_library_test: Crash # Deferred loading
+*: SkipByDesign # Deprecating Dart1 tests.
diff --git a/tests/lib_2/async/stream_distinct_test.dart b/tests/lib_2/async/stream_distinct_test.dart
index d7ca53b..bc642d4 100644
--- a/tests/lib_2/async/stream_distinct_test.dart
+++ b/tests/lib_2/async/stream_distinct_test.dart
@@ -120,7 +120,7 @@
       other is T && ((other.value == 2) ? throw 2 : (value == other.value));
 }
 
-final reifyErrors =
+StreamTransformer reifyErrors =
     new StreamTransformer.fromHandlers(handleError: (e, s, sink) {
   sink.add("[$e]");
 });
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index ac45d22..f1d2f76 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -165,9 +165,6 @@
 async/multiple_timer_test: Pass, Fail # Timing related
 isolate/issue_24243_parent_isolate_test: SkipByDesign # Requires type checks.
 
-[ !$fasta && $strong ]
-mirrors/redirecting_factory_test: CompileTimeError # Issue 30855
-
 [ !$fasta && !$strong ]
 isolate/isolate_import_test/01: MissingCompileTimeError
 mirrors/top_level_accessors_test/01: MissingCompileTimeError
@@ -175,6 +172,9 @@
 typed_data/int32x4_static_test/01: MissingCompileTimeError
 typed_data/int32x4_static_test/02: MissingCompileTimeError
 
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
+
 [ ($compiler != precompiler || $runtime != dart_precompiled) && ($runtime != vm || $compiler != dartk && $compiler != none) ]
 isolate/vm_rehash_test: SkipByDesign
 
diff --git a/tests/lib_2/lib_2_analyzer.status b/tests/lib_2/lib_2_analyzer.status
index a521c69..165b9a3 100644
--- a/tests/lib_2/lib_2_analyzer.status
+++ b/tests/lib_2/lib_2_analyzer.status
@@ -12,6 +12,4 @@
 mirrors/mirrors_nsm_mismatch_test: CompileTimeError, OK
 mirrors/mirrors_nsm_test: CompileTimeError, OK
 mirrors/mirrors_nsm_test/dart2js: CompileTimeError, OK
-mirrors/redirecting_factory_test/01: StaticWarning # test issue X, The return type 'Class<T2, T1>' of the redirected constructor is not assignable to 'Class<T1, T2>'
-mirrors/redirecting_factory_test/none: StaticWarning # test issue X, The return type 'Class<T2, T1>' of the redirected constructor is not assignable to 'Class<T1, T2>
 mirrors/repeated_private_anon_mixin_app_test: CompileTimeError, OK # Intentional library name conflict.
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 2c1250c..8bdc706 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -26,6 +26,7 @@
 html/*: Skip # TODO(ahe): Make dart:html available.
 isolate/browser/*: Skip # TODO(ahe): Make dart:html available.
 js/*: Skip # TODO(ahe): Make dart:js available.
+mirrors/repeated_private_anon_mixin_app_test: CompileTimeError # Two libraries with same name inported.
 
 [ $fasta ]
 mirrors/deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
@@ -35,6 +36,8 @@
 mirrors/generic_interface_test/01: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/13: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/14: MissingCompileTimeError
+mirrors/redirecting_factory_test/01: CompileTimeError # Issue 33308
+mirrors/redirecting_factory_test/none: CompileTimeError # Issue 33308
 
 [ $arch == simarm64 && $strong && ($compiler == dartk || $compiler == dartkb) ]
 isolate/mint_maker_test: Timeout # Please triage.
@@ -65,6 +68,16 @@
 isolate/browser/package_resolve_browser_hook_test: CompileTimeError
 isolate/browser/package_resolve_browser_test: CompileTimeError
 
+# The failures below still need to be investigated and possibly fixed, or marked as skipped.
+[ $compiler == dartkb && $strong ]
+convert/streamed_conversion_json_utf8_decode_test: Pass, Timeout # Please triage.
+io/file_lock_test: Pass, Timeout # Please triage.
+isolate/isolate_complex_messages_test: Pass, Crash # Non-canonical type arguments.
+isolate/mandel_isolate_test: Pass, Timeout, Crash # Please triage.
+isolate/spawn_uri_exported_main_test: Pass, RuntimeError # Please triage.
+mirrors/library_uri_io_test: RuntimeError # Platform.script points to dill file.
+mirrors/method_mirror_location_test: Crash # runtime/lib/mirrors.cc: 1634: error: expected: token_pos != TokenPosition::kNoSource
+
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 isolate/static_function_test: Skip # Flaky (https://github.com/dart-lang/sdk/issues/30063).
 
@@ -98,8 +111,6 @@
 mirrors/mirrors_nsm_test/dart2js: CompileTimeError
 mirrors/mirrors_nsm_test/none: CompileTimeError
 mirrors/native_class_test: CompileTimeError
-mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
-mirrors/redirecting_factory_different_type_test/02: MissingCompileTimeError
 
 [ $mode == debug && $runtime == vm && $strong && ($compiler == dartk || $compiler == dartkb) ]
 mirrors/other_declarations_location_test: Crash # Issue 33325 (assertion error, TypeParameter not having position).
@@ -108,7 +119,6 @@
 isolate/message3_test/constList_identical: Skip # Timeout
 
 [ $runtime == vm && $checked && $strong && ($compiler == dartk || $compiler == dartkb) ]
-mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError # Issue 28424
 mirrors/redirecting_factory_different_type_test/none: RuntimeError # Issue 28424
 mirrors/reflected_type_generics_test/02: Pass
 
@@ -183,9 +193,7 @@
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/private_symbol_test: RuntimeError # Issue 33326 - CFE/kernel invalid typedef substitution
 mirrors/private_types_test: RuntimeError # Issue 33326 - CFE/kernel invalid typedef substitution
-mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
 mirrors/redirecting_factory_test/01: RuntimeError
-mirrors/redirecting_factory_test/02: RuntimeError
 mirrors/redirecting_factory_test/none: RuntimeError
 mirrors/reflect_class_test/none: RuntimeError
 mirrors/reflected_type_function_type_test: RuntimeError
@@ -197,7 +205,7 @@
 mirrors/relation_assignable_test: RuntimeError
 mirrors/relation_subclass_test: RuntimeError
 mirrors/relation_subtype_test: RuntimeError
-mirrors/repeated_private_anon_mixin_app_test: RuntimeError
+mirrors/repeated_private_anon_mixin_app_test: CompileTimeError # Two libraries with same name inported.
 mirrors/static_members_easier_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/static_members_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/symbol_validation_test/01: RuntimeError # Issue 31537
@@ -287,7 +295,6 @@
 mirrors/invoke_throws_test: RuntimeError
 mirrors/mixin_members_test: RuntimeError
 mirrors/operator_test: RuntimeError
-mirrors/redirecting_factory_different_type_test/02: MissingCompileTimeError
 mirrors/redirecting_factory_different_type_test/none: RuntimeError
 mirrors/redirecting_factory_reflection_test: RuntimeError
 
diff --git a/tests/lib_2/lib_2_vm.status b/tests/lib_2/lib_2_vm.status
index 8a82ed2..a652e636 100644
--- a/tests/lib_2/lib_2_vm.status
+++ b/tests/lib_2/lib_2_vm.status
@@ -34,6 +34,8 @@
 mirrors/mirrors_used*: SkipByDesign # Invalid tests. MirrorsUsed does not have a specification, and dart:mirrors is not required to hide declarations that are not covered by any MirrorsUsed annotation.
 mirrors/native_class_test: SkipByDesign # Imports dart:html
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
+mirrors/redirecting_factory_test/01: RuntimeError
+mirrors/redirecting_factory_test/none: RuntimeError
 
 [ $compiler != app_jitk && $compiler != dartk && $compiler != dartkb && $runtime == vm && !$checked ]
 mirrors/inference_and_no_such_method_test: RuntimeError
@@ -41,6 +43,11 @@
 [ $compiler != app_jitk && $compiler != dartk && $compiler != dartkb && $runtime == vm && $strong ]
 async/future_or_only_in_async_test/00: MissingCompileTimeError
 
+[ $compiler != app_jitk && $compiler != dartk && $compiler != dartkb && $runtime == vm && !$strong ]
+mirrors/redirecting_factory_test/02: MissingCompileTimeError
+mirrors/redirecting_factory_test/03: MissingCompileTimeError
+mirrors/redirecting_factory_test/04: MissingCompileTimeError
+
 [ $compiler != dartk && $compiler != dartkb && $runtime == vm && !$strong ]
 mirrors/reflect_class_test/01: MissingCompileTimeError
 mirrors/reflect_class_test/02: MissingCompileTimeError
diff --git a/tests/lib_2/mirrors/redirecting_factory_test.dart b/tests/lib_2/mirrors/redirecting_factory_test.dart
index 78e7fe5..2f5e47a 100644
--- a/tests/lib_2/mirrors/redirecting_factory_test.dart
+++ b/tests/lib_2/mirrors/redirecting_factory_test.dart
@@ -38,18 +38,20 @@
   factory Class.redirectingFactoryMoreUnnamedOptional(a, [b]) =
       Class<T1, T2>.factoryMoreUnnamedOptional;
 
-  factory Class.redirectingFactoryStringIntTypeParameters(a, b) =
-      Class<String, int>.factoryNoOptional;
+  factory Class.redirectingFactoryStringIntTypeParameters(a, b) = Class //
+      <String, int> //# 03: compile-time error
+      .factoryNoOptional;
 
   factory Class.redirectingFactoryStringTypeParameters(a, b) = Class //
-      <String> //# 02: static type warning
+      <String> //# 02: compile-time error
       .factoryNoOptional;
 
   factory Class.redirectingFactoryTypeParameters(a, b) =
       Class<T1, T2>.factoryNoOptional;
 
-  factory Class.redirectingFactoryReversedTypeParameters(a, b) =
-      Class<T2, T1>.factoryNoOptional;
+  factory Class.redirectingFactoryReversedTypeParameters(a, b) = Class //
+      <T2, T1> //# 04: compile-time error
+      .factoryNoOptional;
 }
 
 main() {
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index f9ab4d4..ee1bf10 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -6,93 +6,4 @@
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
 
-# Obsolete behavior. We want to test that it fails.
-# TODO(mfairhurst) delete this test.
-isolate/scenarios/package_relative_root/package_relative_root_test: Fail
-
-[ $builder_tag == no_ipv6 ]
-io/raw_datagram_socket_test: SkipByDesign
-
-[ $compiler == dart2analyzer ]
-*: Skip
-
-# Overriding these flags are not supported in product mode.
-[ $mode == product ]
-verbose_gc_to_bmu_test: SkipByDesign # No verbose_gc in product mode
-
-[ $runtime == dart_precompiled ]
-verbose_gc_to_bmu_test: Skip # These tests attempt to spawn another script using the precompiled runtime.
-
-[ $runtime == vm ]
-verbose_gc_to_bmu_test: Skip # spawns a process which runs in Dart2 mode.
-
-[ $system == windows ]
-io/sleep_test: Pass, Fail # Issue 25757
-verbose_gc_to_bmu_test: Skip
-
-[ $builder_tag == swarming && $system == macos ]
-io/*: Skip # Issue 30618
-
-[ $compiler == fasta && $strong ]
-io/directory_invalid_arguments_test: CompileTimeError
-io/io_override_test: CompileTimeError
-io/process_invalid_arguments_test: CompileTimeError
-io/raw_secure_server_socket_argument_test: CompileTimeError
-io/raw_secure_server_socket_test: CompileTimeError
-io/secure_socket_bad_data_test: CompileTimeError
-io/security_context_argument_test: CompileTimeError
-io/stdout_bad_argument_test: CompileTimeError
-no_assert_test: CompileTimeError
-priority_queue_stress_test: CompileTimeError
-verbose_gc_to_bmu_test: CompileTimeError
-
-[ $compiler != fasta && $compiler != none && $runtime != dart_precompiled && $runtime != vm ]
-no_assert_test: Fail, OK # This is testing a vm flag.
-
-[ $compiler == none && $runtime == vm && $system == fuchsia ]
-*: Skip # Not yet triaged.
-
-[ $mode == product && $runtime == dart_precompiled ]
-dwarf_stack_trace_test: Pass, RuntimeError # Results will flake due to identical code folding
-
-[ $runtime == dart_precompiled && $system == android ]
-io/https_bad_certificate_test: RuntimeError # Issue 31310
-io/raw_datagram_socket_test: RuntimeError # Issue 31310
-io/raw_secure_server_socket_test: RuntimeError # Issue 31310
-
-[ $system == macos && ($runtime == dart_precompiled || $runtime == vm) ]
-io/raw_secure_server_socket_test: Pass, Crash # Issue 29524
-
-[ $checked && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
-io/directory_fuzz_test: Skip # These test have type errors on purpose and take very long to run in checked mode with no benefit. Skip.
-io/directory_invalid_arguments_test: Fail, OK # These tests have type errors on purpose.
-io/file_fuzz_test: Skip # These test have type errors on purpose and take very long to run in checked mode with no benefit. Skip.
-io/internet_address_invalid_arguments_test: Fail, OK # These tests have type errors on purpose.
-io/process_invalid_arguments_test: Fail, OK # These tests have type errors on purpose.
-io/socket_invalid_arguments_test: Fail, OK # These tests have type errors on purpose.
-io/stdout_bad_argument_test: Fail, OK # These tests have type errors on purpose.
-
-[ $compiler == app_jit || $compiler == precompiler ]
-io/compile_all_test: Skip # Incompatible flag --compile_all
-
-# We skip all the Dart 1.0 tests in dartk and dartkp mode as these
-# modes are intended only for Dart 2.0 with strong mode enabled.
-[ $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
-*: SkipByDesign
-
-[ $compiler == dart2js || $compiler == dartdevc ]
-*: SkipByDesign
-
-[ $compiler != none || $runtime != vm ]
-script_snapshot_depfile_test: SkipByDesign # Only makes sense running from source.
-script_snapshot_not_executed_test: SkipByDesign # Only makes sense running from source.
-
-[ $mode == product || $runtime == dart_precompiled ]
-no_assert_test: SkipByDesign # Requires checked mode.
-
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
-io/secure_socket_bad_data_test: RuntimeError # An error in a secure connection just puts a READ_CLOSED on the stream, rather than signaling an error on the stream.
-
-[ $hot_reload || $hot_reload_rollback ]
-script_snapshot_depfile_test: RuntimeError, OK # Child VM doesn't execute Dart.
-script_snapshot_not_executed_test: RuntimeError, OK # Child VM doesn't execute Dart.
+*: SkipByDesign # Deprecating Dart1 tests.
diff --git a/tests/standalone_2/app_snapshot_share_test.dart b/tests/standalone_2/app_snapshot_share_test.dart
index 050f610..27b6cb2 100644
--- a/tests/standalone_2/app_snapshot_share_test.dart
+++ b/tests/standalone_2/app_snapshot_share_test.dart
@@ -37,10 +37,6 @@
       '--platform=$buildDir/vm_platform_strong.dill',
       '-o',
       scriptPathDill,
-      '--entry-points',
-      '$buildDir/gen/runtime/bin/precompiler_entry_points.json',
-      '--entry-points',
-      'pkg/vm/lib/transformations/type_flow/entry_points_extra.json',
       scriptPath,
     ];
     runSync("pkg/vm/tool/gen_kernel${Platform.isWindows ? '.bat' : ''}", args);
diff --git a/tests/standalone_2/io/code_collection_test.dart b/tests/standalone_2/io/code_collection_test.dart
index 99344df..71f36b6 100644
--- a/tests/standalone_2/io/code_collection_test.dart
+++ b/tests/standalone_2/io/code_collection_test.dart
@@ -68,13 +68,14 @@
       Platform.script.toFilePath(),
       "--run"
     ]);
+    print("+ ${Platform.executable} ${args.join(' ')}");
     var pr = Process.runSync(Platform.executable, args);
 
+    print(pr.stderr);
     Expect.equals(0, pr.exitCode);
 
     // Code drops are logged with --log-code-drop. Look through stderr for the
     // message that foo's code was dropped.
-    print(pr.stderr);
     bool saw_foo2 = false;
     bool saw_detaching_foo = false;
     bool saw_foo3 = false;
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 36b4a51..e78ae4d 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -107,6 +107,9 @@
 io/socket_connect_stream_data_close_cancel_test: Pass, Timeout # Issue 27453
 io/socket_many_connections_test: Skip # This test fails with "Too many open files" on the Mac OS buildbot. This is expected as MacOS by default runs with a very low number of allowed open files ('ulimit -n' says something like 256).
 
+[ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # Deprecating all Dart1 modes of execution
+
 [ $strong && ($compiler == dartk || $compiler == dartkb || $compiler == dartkp) ]
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 3019ae9..011c128 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -34,9 +34,6 @@
 oom_error_stacktrace_test: RuntimeError
 out_of_memory_test: RuntimeError
 
-[ $compiler == dartkb ]
-no_lazy_dispatchers_test: SkipByDesign # KBC interpreter doesn't support --no_lazy_dispatchers
-
 [ $fasta ]
 deferred_transitive_import_error_test: CompileTimeError
 package/package1_test: CompileTimeError
@@ -56,6 +53,27 @@
 [ $compiler == app_jitk && ($mode == debug || $mode == release) ]
 dart_developer_disabled_env_test: RuntimeError
 
+# The failures below still need to be investigated and possibly fixed, or marked as skipped.
+[ $compiler == dartkb && $strong ]
+io/dart_std_io_pipe_test: Pass, Crash # Trap bytecode encountered.
+io/file_lock_test: Pass, Crash # Trap bytecode encountered.
+io/http_advanced_test: Pass, RuntimeError # Please triage.
+io/http_client_connect_test: Pass, RuntimeError # Please triage.
+io/http_outgoing_size_test: Pass, RuntimeError # Please triage.
+io/platform_test: RuntimeError # Platform.script points to dill file.
+io/process_sync_test: Pass, Crash # Bytecode compilation.
+io/test_extension_fail_test: RuntimeError # Platform.script points to dill file.
+io/test_extension_test: RuntimeError # Platform.script points to dill file.
+io/web_socket_compression_test: Pass, RuntimeError # Please triage.
+io/web_socket_ping_test: Pass, RuntimeError # Please triage.
+io/web_socket_protocol_test: Pass, RuntimeError # Please triage.
+io/web_socket_typed_data_test: Pass, RuntimeError # Please triage.
+no_lazy_dispatchers_test: SkipByDesign # KBC interpreter doesn't support --no_lazy_dispatchers
+package/scenarios/packages_file_strange_formatting/empty_lines_test: CompileTimeError # Please triage.
+package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: CompileTimeError # Please triage.
+package/scenarios/packages_option_only/packages_option_only_test: CompileTimeError # Please triage.
+typed_data_isolate_test: Pass, Crash, Timeout # Please triage.
+
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 io/compile_all_test: Crash # Issue 32373
 io/raw_socket_test: Crash
@@ -164,7 +182,7 @@
 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
+# Enabling of dartk for sim{arm,arm64,dbc64} revealed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) && ($compiler == dartk || $compiler == dartkb) ]
@@ -173,10 +191,10 @@
 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_test: RuntimeError # Please triage.
+io/platform_test: RuntimeError # Platform.script points to dill file.
 io/process_sync_test: Timeout, Pass
-io/test_extension_fail_test: RuntimeError # Please traige.
-io/test_extension_test: RuntimeError # Please traige.
+io/test_extension_fail_test: RuntimeError # Platform.script points to dill file.
+io/test_extension_test: RuntimeError # Platform.script points to dill file.
 map_insert_remove_oom_test: Skip # Heap limit too low.
 package/scenarios/packages_file_strange_formatting/empty_lines_test: CompileTimeError # Please triage.
 package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: CompileTimeError # Please triage.
diff --git a/tools/VERSION b/tools/VERSION
index 4bb7fc5..646d82b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 1
 PATCH 0
-PRERELEASE 5
+PRERELEASE 6
 PRERELEASE_PATCH 0
diff --git a/tools/bots/compare_results.dart b/tools/bots/compare_results.dart
new file mode 100755
index 0000000..5192925
--- /dev/null
+++ b/tools/bots/compare_results.dart
@@ -0,0 +1,284 @@
+#!/usr/bin/env dart
+// 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.
+
+// Compare the old and new test results and list tests that pass the filters.
+// The output contains additional details in the verbose mode. There is a human
+// readable mode that explains the results and how they changed.
+
+import 'dart:collection';
+import 'dart:io';
+
+import 'package:args/args.dart';
+
+import 'results.dart';
+
+class Result {
+  final String name;
+  final String outcome;
+  final String expectation;
+  final bool matches;
+  final bool flaked;
+
+  Result(this.name, this.outcome, this.expectation, this.matches, this.flaked);
+
+  Result.fromMap(Map<String, dynamic> map, Map<String, dynamic> flakinessData)
+      : name = map["name"],
+        outcome = map["result"],
+        expectation = map["expected"],
+        matches = map["matches"],
+        flaked = flakinessData != null &&
+            flakinessData["outcomes"].contains(map["result"]);
+}
+
+class Event {
+  final Result before;
+  final Result after;
+
+  Event(this.before, this.after);
+
+  bool get isNew => before == null;
+  bool get isNewPassing => before == null && after.matches;
+  bool get isNewFailing => before == null && !after.matches;
+  bool get changed => !unchanged;
+  bool get unchanged => before != null && before.outcome == after.outcome;
+  bool get remainedPassing => before.matches && after.matches;
+  bool get remainedFailing => !before.matches && !after.matches;
+  bool get flaked => after.flaked;
+  bool get fixed => !before.matches && after.matches;
+  bool get broke => before.matches && !after.matches;
+
+  String get description {
+    if (isNewPassing) {
+      return "is new and succeeded";
+    } else if (isNewFailing) {
+      return "is new and failed";
+    } else if (remainedPassing) {
+      return "succeeded again";
+    } else if (remainedFailing) {
+      return "failed again";
+    } else if (fixed) {
+      return "was fixed";
+    } else if (broke) {
+      return "broke";
+    } else {
+      throw new Exception("Unreachable");
+    }
+  }
+}
+
+bool firstSection = true;
+
+bool search(String description, String searchFor, List<Event> events,
+    ArgResults options) {
+  bool judgement = false;
+  bool beganSection = false;
+
+  for (final event in events) {
+    if (searchFor == "passing" &&
+        (event.after.flaked || !event.after.matches)) {
+      continue;
+    }
+    if (searchFor == "flaky" && !event.after.flaked) {
+      continue;
+    }
+    if (searchFor == "failing" && (event.after.flaked || event.after.matches)) {
+      continue;
+    }
+    if (options["unchanged"] && !event.unchanged) continue;
+    if (options["changed"] && !event.changed) continue;
+    if (!beganSection) {
+      if (options["human"]) {
+        if (!firstSection) {
+          print("");
+        }
+        firstSection = false;
+        print("$description\n");
+      }
+    }
+    beganSection = true;
+    final before = event.before;
+    final after = event.after;
+    final name = event.after.name;
+    if (!after.flaked && !after.matches) {
+      judgement = true;
+    }
+    if (options["human"]) {
+      if (options["verbose"]) {
+        String expected =
+            after.matches ? "" : ", expected ${after.expectation}";
+        if (before == null || before.outcome == after.outcome) {
+          print("${name} ${event.description} "
+              "(${event.after.outcome}${expected})");
+        } else {
+          print("${name} ${event.description} "
+              "(${event.before?.outcome} -> ${event.after.outcome}${expected})");
+        }
+      } else {
+        print(name);
+      }
+    } else {
+      if (options["verbose"]) {
+        print("$name "
+            "${before?.outcome} ${after.outcome} "
+            "${before?.expectation} ${after.expectation} "
+            "${before?.matches} ${after.matches} "
+            "${before?.flaked} ${after.flaked}");
+      } else {
+        print(event.after.name);
+      }
+    }
+  }
+
+  return judgement;
+}
+
+main(List<String> args) async {
+  final parser = new ArgParser();
+  parser.addFlag("changed",
+      abbr: 'c',
+      negatable: false,
+      help: "Show only tests that changed results.");
+  parser.addFlag("failing",
+      abbr: 'f', negatable: false, help: "Show failing tests.");
+  parser.addOption("flakiness-data",
+      abbr: 'd', help: "File containing flakiness data");
+  parser.addFlag("judgement",
+      abbr: 'j',
+      negatable: false,
+      help: "Exit 1 only if any of the filtered results failed.");
+  parser.addFlag("flaky",
+      abbr: 'F', negatable: false, help: "Show flaky tests.");
+  parser.addFlag("help", help: "Show the program usage.", negatable: false);
+  parser.addFlag("human",
+      abbr: "h",
+      help: "Prove you can't read machine readable output.",
+      negatable: false);
+  parser.addFlag("passing",
+      abbr: 'p', negatable: false, help: "Show passing tests.");
+  parser.addFlag("unchanged",
+      abbr: 'u',
+      negatable: false,
+      help: "Show only tests with unchanged results.");
+  parser.addFlag("verbose",
+      abbr: "v",
+      help: "Show the old and new result for each test",
+      negatable: false);
+
+  final options = parser.parse(args);
+  if (options["help"]) {
+    print("""
+Usage: compare_results.dart [OPTION]... [BEFORE] [AFTER]
+Compare the old and new test results and list tests that pass the filters.
+All tests are listed if no filters are given.
+
+The options are as follows:
+
+${parser.usage}""");
+    return;
+  }
+
+  if (options["changed"] && options["unchanged"]) {
+    print(
+        "error: The options --changed and --unchanged are mutually exclusive");
+    exitCode = 2;
+    return;
+  }
+
+  final parameters = options.rest;
+  if (parameters.length != 2) {
+    print("error: Expected two parameters (results before and results after)");
+    exitCode = 2;
+    return;
+  }
+
+  // Load the input and the flakiness data if specified.
+  final before = await loadResultsMap(parameters[0]);
+  final after = await loadResultsMap(parameters[1]);
+  final flakinessData = options["flakiness-data"] != null
+      ? await loadResultsMap(options["flakiness-data"])
+      : <String, Map<String, dynamic>>{};
+
+  // The names of every test that has a data point in the new data set.
+  final names = new SplayTreeSet<String>.from(after.keys);
+
+  final events = <Event>[];
+  for (final name in names) {
+    final mapBefore = before[name];
+    final mapAfter = after[name];
+    final resultBefore = mapBefore != null
+        ? new Result.fromMap(mapBefore, flakinessData[name])
+        : null;
+    final resultAfter = new Result.fromMap(mapAfter, flakinessData[name]);
+    final event = new Event(resultBefore, resultAfter);
+    events.add(event);
+  }
+
+  // Report tests matching the filters.
+  bool judgement = false;
+  if (options["passing"] || options["flaky"] || options["failing"]) {
+    if (options["passing"]) {
+      String sectionHeader;
+      if (options["unchanged"]) {
+        sectionHeader = "The following tests continued to pass:";
+      } else if (options["changed"]) {
+        sectionHeader = "The following tests began passing:";
+      } else {
+        sectionHeader = "The following tests passed:";
+      }
+      search(sectionHeader, "passing", events, options);
+    }
+    if (options["flaky"]) {
+      String sectionHeader;
+      if (options["unchanged"]) {
+        sectionHeader = "The following tests are known to flake but didn't:";
+      } else if (options["changed"]) {
+        sectionHeader = "The following tests flaked:";
+      } else {
+        sectionHeader = "The following tests are known to flake:";
+      }
+      search(sectionHeader, "flaky", events, options);
+    }
+    if (options["failing"]) {
+      String sectionHeader;
+      if (options["unchanged"]) {
+        sectionHeader = "The following tests continued to fail:";
+      } else if (options["changed"]) {
+        sectionHeader = "The following tests began failing:";
+      } else {
+        sectionHeader = "The following tests failed:";
+      }
+      judgement = search(sectionHeader, "failing", events, options);
+    }
+  } else {
+    String sectionHeader;
+    if (options["unchanged"]) {
+      sectionHeader = "The following tests had the same result:";
+    } else if (options["changed"]) {
+      sectionHeader = "The following tests changed result:";
+    } else {
+      sectionHeader = "The following tests ran:";
+    }
+    judgement = search(sectionHeader, null, events, options);
+  }
+
+  // Exit 1 only if --judgement and any test failed.
+  if (options["judgement"]) {
+    if (options["human"] && !firstSection) {
+      print("");
+    }
+    String oldNew =
+        options["unchanged"] ? "old " : options["changed"] ? "new " : "";
+    if (judgement) {
+      if (options["human"]) {
+        print("There were ${oldNew}test failures.");
+      }
+      exitCode = 1;
+    } else {
+      if (options["human"]) {
+        print("No ${oldNew}test failures were found.");
+      }
+    }
+  }
+}
diff --git a/tools/bots/results.dart b/tools/bots/results.dart
new file mode 100644
index 0000000..fbc51e7
--- /dev/null
+++ b/tools/bots/results.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.
+
+// results.json and flaky.json parses.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+Future<List<Map<String, dynamic>>> loadResults(String path) async {
+  final results = <Map<String, dynamic>>[];
+  final lines = new File(path)
+      .openRead()
+      .transform(utf8.decoder)
+      .transform(new LineSplitter());
+  await for (final line in lines) {
+    final Map<String, dynamic> map = jsonDecode(line);
+    results.add(map);
+  }
+  return results;
+}
+
+Map<String, Map<String, dynamic>> createResultsMap(
+        List<Map<String, dynamic>> results) =>
+    new Map<String, Map<String, dynamic>>.fromIterable(results,
+        key: (dynamic result) => (result as Map<String, dynamic>)['name']);
+
+Future<Map<String, Map<String, dynamic>>> loadResultsMap(String path) async =>
+    createResultsMap(await loadResults(path));
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 088da9b..9fe04ff 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -402,13 +402,13 @@
       "options": {
         "hot-reload-rollback": true
       }},
-    "app_jit-legacy-linux-(debug|product|release)-x64": {
-      "options": {
-        "preview-dart-2": false
-      }},
     "app_jitk-linux-(debug|product|release)-x64": { },
     "dartkb-interpret-linux-(debug|release)-x64": {
       "options": {
+        "vm-options": ["--enable_interpreter", "--compilation-counter-threshold=-1"]
+      }},
+    "dartkb-mixed-linux-(debug|release)-x64": {
+      "options": {
         "vm-options": ["--enable_interpreter"]
       }},
     "dartkb-compile-linux-(debug|release)-x64": {
@@ -420,21 +420,6 @@
         "checked": true,
         "use-sdk": true
       }},
-    "precompiler-legacy-linux-(debug|product)-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "use-blobs": true
-      }},
-    "precompiler-legacy-(mac|win)-debug-simarm64": {
-      "options": {
-        "preview-dart-2": false,
-        "use-blobs": true
-      }},
-    "precompiler-legacy-android-debug-arm": {
-      "options": {
-        "preview-dart-2": false,
-        "use-blobs": true
-      }},
     "fasta-(linux|mac|win)": { },
     "analyzer-(linux|mac|win)": {
       "options": {
@@ -527,11 +512,14 @@
           ]
         },
         {
-          "name": "vm interpreter tests",
+          "name": "vm mixed mode tests",
           "arguments": [
-            "-ndartkb-interpret-linux-${mode}-x64",
+            "-ndartkb-mixed-linux-${mode}-x64",
             "--compiler=dartkb",
-            "language_2"
+            "language_2",
+            "corelib_2",
+            "lib_2",
+            "standalone_2"
           ]
         },
         {
@@ -539,7 +527,21 @@
           "arguments": [
             "-ndartkb-compile-linux-${mode}-x64",
             "--compiler=dartkb",
-            "language_2"
+            "language_2",
+            "corelib_2",
+            "lib_2",
+            "standalone_2"
+          ]
+        },
+        {
+          "name": "vm interpreter tests",
+          "arguments": [
+            "-ndartkb-interpret-linux-${mode}-x64",
+            "--compiler=dartkb",
+            "language_2",
+            "corelib_2",
+            "lib_2",
+            "standalone_2"
           ]
         }
       ]
@@ -809,30 +811,6 @@
     },
     {
       "builders": [
-        "app-linux-debug-x64",
-        "app-linux-product-x64",
-        "app-linux-release-x64"
-      ],
-      "meta": {
-        "description": "This configuration is used by the vm app builder group."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": [
-            "runtime"
-          ]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-napp_jit-legacy-linux-${mode}-x64"]
-        }
-      ]
-    },
-    {
-      "builders": [
         "app-kernel-linux-debug-x64",
         "app-kernel-linux-product-x64",
         "app-kernel-linux-release-x64"
@@ -988,49 +966,6 @@
     },
     {
       "builders": [
-        "precomp-linux-debug-x64",
-        "precomp-linux-product-x64",
-        "vm-noopt-mac-simarm64",
-        "vm-precomp-win-simarm64"
-      ],
-      "meta": {
-        "description": "This is the configuration for the vm precomp builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime", "runtime_precompiled"]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nprecompiler-legacy-${system}-${mode}-${arch}"]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "vm-precomp-android-release"
-      ],
-      "meta": {
-        "description": "This is the configuration for the android precomp builder. This has its own configuration because it needs to pass arch and os as arguments to build and system to test.py."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["--arch=arm", "--os=android", "runtime", "runtime_precompiled"]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nprecompiler-legacy-android-debug-arm"]
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-optcounter-threshold-linux-release-ia32",
         "vm-optcounter-threshold-linux-release-x64"
       ],
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index 141b852..a988f47 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -242,7 +242,6 @@
       out/ReleaseX64/dart-sdk \
       out/ReleaseSIMDBC64/dart \
       out/ReleaseX64/gen/kernel-service.dart.snapshot \
-      out/ReleaseX64/gen/runtime/bin/precompiler_entry_points.json \
       out/ReleaseX64/dart \
       out/ReleaseX64/dart_bootstrap \
       out/ReleaseX64/run_vm_tests \
@@ -363,7 +362,6 @@
       out/ReleaseX64/dart-sdk \
       out/ReleaseSIMDBC64/dart \
       out/ReleaseX64/gen/kernel-service.dart.snapshot \
-      out/ReleaseX64/gen/runtime/bin/precompiler_entry_points.json \
       out/ReleaseX64/dart \
       out/ReleaseX64/dart_bootstrap \
       out/ReleaseX64/run_vm_tests \
diff --git a/tools/bots/update_flakiness.dart b/tools/bots/update_flakiness.dart
new file mode 100755
index 0000000..4c49782
--- /dev/null
+++ b/tools/bots/update_flakiness.dart
@@ -0,0 +1,66 @@
+#!/usr/bin/env dart
+// 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.
+
+// Update the flakiness data with a set of fresh results.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:args/args.dart';
+
+import 'results.dart';
+
+main(List<String> args) async {
+  final parser = new ArgParser();
+  parser.addFlag('help', help: 'Show the program usage.', negatable: false);
+  parser.addOption('input', abbr: 'i', help: "Input flakiness file.");
+  parser.addOption('output', abbr: 'o', help: "Output flakiness file.");
+  final options = parser.parse(args);
+  if (options["help"]) {
+    print("""
+Usage: update_flakiness.dart [OPTION]... [RESULT-FILE]...
+Update the flakiness data with a set of fresh results.
+
+The options are as follows:
+
+${parser.usage}""");
+    return;
+  }
+  final parameters = options.rest;
+
+  // Load the existing flakiness data, if any.
+  final data = options["input"] != null
+      ? await loadResultsMap(options["input"])
+      : <String, Map<String, dynamic>>{};
+
+  // Incrementally update the flakiness data with each observed result.
+  for (final path in parameters) {
+    final results = await loadResults(path);
+    for (final result in results) {
+      final String name = result["name"];
+      final Map<String, dynamic> testData =
+          data.putIfAbsent(name, () => <String, dynamic>{});
+      testData["name"] = name;
+      final List<String> outcomes =
+          testData.putIfAbsent("outcomes", () => <String>[]);
+      if (!outcomes.contains(result["result"])) {
+        outcomes.add(result["result"]);
+        outcomes..sort();
+      }
+    }
+  }
+
+  // Write out the new flakiness data, containing all the tests known to have
+  // multiple outcomes.
+  final sink = options["output"] != null
+      ? new File(options["output"]).openWrite()
+      : stdout;
+  final names = new List<String>.from(data.keys)..sort();
+  for (final name in names) {
+    final testData = data[name];
+    if (testData["outcomes"].length < 2) continue;
+    sink.writeln(jsonEncode(testData));
+  }
+}
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index f025a04..da1bc36 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -199,8 +199,10 @@
     ..target = target;
 
   var inputs = [Uri.parse('dart:core')];
-  var result = await generateKernel(new ProcessedOptions(options, inputs),
-      buildSummary: true, buildComponent: true);
+  var result = await generateKernel(
+      new ProcessedOptions(options: options, inputs: inputs),
+      buildSummary: true,
+      buildComponent: true);
   await writeComponentToFile(result.component, output);
   return result.deps;
 }
diff --git a/tools/testing/dart/command.dart b/tools/testing/dart/command.dart
index eaf62c6..fecadb4 100644
--- a/tools/testing/dart/command.dart
+++ b/tools/testing/dart/command.dart
@@ -114,17 +114,21 @@
       Uri workingDirectory) {
     return new FastaCompilationCommand._(
         compilerLocation,
-        outputFile,
+        outputFile.toFilePath(),
         bootstrapDependencies,
-        executable,
+        executable.toFilePath(),
         arguments,
         environment,
-        workingDirectory);
+        workingDirectory?.toFilePath());
   }
 
   /// A descriptive name for this command.
   final String displayName;
 
+  /// When cloning a command object to run it multiple times, we give
+  /// the different copies distinct values for index.
+  int index;
+
   /// Number of times this command *can* be retried.
   int get maxNumRetries => 2;
 
@@ -135,7 +139,15 @@
   /// be expensive to compute (and hashCode is called often).
   int _cachedHashCode;
 
-  Command._(this.displayName);
+  Command._(this.displayName, {this.index = 0});
+
+  /// A virtual clone method for a member of the Command hierarchy.
+  /// Two clones with the same index will be equal, with different indices
+  /// will be distinct. Used to run tests multiple times, since identical
+  /// commands are only run once by the dependency graph scheduler.
+  Command indexedCopy(int index) {
+    return Command._(displayName, index: index);
+  }
 
   int get hashCode {
     if (_cachedHashCode == null) {
@@ -152,10 +164,13 @@
 
   void _buildHashCode(HashCodeBuilder builder) {
     builder.addJson(displayName);
+    builder.add(index);
   }
 
   bool _equal(covariant Command other) =>
-      hashCode == other.hashCode && displayName == other.displayName;
+      hashCode == other.hashCode &&
+      displayName == other.displayName &&
+      index == other.index;
 
   String toString() => reproductionCommand;
 
@@ -176,8 +191,8 @@
   final String workingDirectory;
 
   ProcessCommand._(String displayName, this.executable, this.arguments,
-      [this.environmentOverrides, this.workingDirectory])
-      : super._(displayName) {
+      [this.environmentOverrides, this.workingDirectory, int index = 0])
+      : super._(displayName, index: index) {
     if (io.Platform.operatingSystem == 'windows') {
       // Windows can't handle the first command if it is a .bat file or the like
       // with the slashes going the other direction.
@@ -186,6 +201,11 @@
     }
   }
 
+  ProcessCommand indexedCopy(int index) {
+    return ProcessCommand._(displayName, executable, arguments,
+        environmentOverrides, workingDirectory, index);
+  }
+
   void _buildHashCode(HashCodeBuilder builder) {
     super._buildHashCode(builder);
     builder.addJson(executable);
@@ -240,9 +260,21 @@
       String executable,
       List<String> arguments,
       Map<String, String> environmentOverrides,
-      {String workingDirectory})
+      {String workingDirectory,
+      int index = 0})
       : super._(displayName, executable, arguments, environmentOverrides,
-            workingDirectory);
+            workingDirectory, index);
+
+  CompilationCommand indexedCopy(int index) => CompilationCommand._(
+      displayName,
+      _outputFile,
+      _alwaysCompile,
+      _bootstrapDependencies,
+      executable,
+      arguments,
+      environmentOverrides,
+      workingDirectory: workingDirectory,
+      index: index);
 
   bool get outputIsUpToDate {
     if (_alwaysCompile) return false;
@@ -294,15 +326,27 @@
 
   FastaCompilationCommand._(
       this._compilerLocation,
-      Uri outputFile,
+      String outputFile,
       List<Uri> bootstrapDependencies,
-      Uri executable,
+      String executable,
       List<String> arguments,
       Map<String, String> environmentOverrides,
-      Uri workingDirectory)
-      : super._("fasta", outputFile.toFilePath(), true, bootstrapDependencies,
-            executable.toFilePath(), arguments, environmentOverrides,
-            workingDirectory: workingDirectory?.toFilePath());
+      String workingDirectory,
+      {int index = 0})
+      : super._("fasta", outputFile, true, bootstrapDependencies, executable,
+            arguments, environmentOverrides,
+            workingDirectory: workingDirectory, index: index);
+
+  @override
+  FastaCompilationCommand indexedCopy(int index) => FastaCompilationCommand._(
+      _compilerLocation,
+      _outputFile,
+      _bootstrapDependencies,
+      executable,
+      arguments,
+      environmentOverrides,
+      workingDirectory,
+      index: index);
 
   @override
   List<String> get batchArguments {
@@ -370,13 +414,20 @@
 class VMKernelCompilationCommand extends CompilationCommand {
   VMKernelCompilationCommand._(
       String outputFile,
-      bool neverSkipCompilation,
+      bool alwaysCompile,
       List<Uri> bootstrapDependencies,
       String executable,
       List<String> arguments,
-      Map<String, String> environmentOverrides)
-      : super._('vm_compile_to_kernel', outputFile, neverSkipCompilation,
-            bootstrapDependencies, executable, arguments, environmentOverrides);
+      Map<String, String> environmentOverrides,
+      {int index = 0})
+      : super._('vm_compile_to_kernel', outputFile, alwaysCompile,
+            bootstrapDependencies, executable, arguments, environmentOverrides,
+            index: index);
+
+  VMKernelCompilationCommand indexedCopy(int index) =>
+      VMKernelCompilationCommand._(_outputFile, _alwaysCompile,
+          _bootstrapDependencies, executable, arguments, environmentOverrides,
+          index: index);
 
   int get maxNumRetries => 1;
 }
@@ -398,8 +449,12 @@
   final TestConfiguration configuration;
   final bool retry;
 
-  BrowserTestCommand._(this.url, this.configuration, this.retry)
-      : super._(configuration.runtime.name);
+  BrowserTestCommand._(this.url, this.configuration, this.retry,
+      {int index = 0})
+      : super._(configuration.runtime.name, index: index);
+
+  BrowserTestCommand indexedCopy(int index) =>
+      BrowserTestCommand._(url, configuration, retry, index: index);
 
   void _buildHashCode(HashCodeBuilder builder) {
     super._buildHashCode(builder);
@@ -431,27 +486,45 @@
 
 class AnalysisCommand extends ProcessCommand {
   AnalysisCommand._(String executable, List<String> arguments,
-      Map<String, String> environmentOverrides)
-      : super._('dart2analyzer', executable, arguments, environmentOverrides);
+      Map<String, String> environmentOverrides, {int index = 0})
+      : super._('dart2analyzer', executable, arguments, environmentOverrides,
+            null, index);
+
+  AnalysisCommand indexedCopy(int index) =>
+      AnalysisCommand._(executable, arguments, environmentOverrides,
+          index: index);
 }
 
 class CompareAnalyzerCfeCommand extends ProcessCommand {
   CompareAnalyzerCfeCommand._(String executable, List<String> arguments,
-      Map<String, String> environmentOverrides)
+      Map<String, String> environmentOverrides, {int index = 0})
       : super._('compare_analyzer_cfe', executable, arguments,
-            environmentOverrides);
+            environmentOverrides, null, index);
+
+  CompareAnalyzerCfeCommand indexedCopy(int index) =>
+      CompareAnalyzerCfeCommand._(executable, arguments, environmentOverrides,
+          index: index);
 }
 
 class SpecParseCommand extends ProcessCommand {
   SpecParseCommand._(String executable, List<String> arguments,
-      Map<String, String> environmentOverrides)
-      : super._('spec_parser', executable, arguments, environmentOverrides);
+      Map<String, String> environmentOverrides, {int index = 0})
+      : super._('spec_parser', executable, arguments, environmentOverrides,
+            null, index);
+
+  SpecParseCommand indexedCopy(int index) =>
+      SpecParseCommand._(executable, arguments, environmentOverrides,
+          index: index);
 }
 
 class VmCommand extends ProcessCommand {
   VmCommand._(String executable, List<String> arguments,
-      Map<String, String> environmentOverrides)
-      : super._('vm', executable, arguments, environmentOverrides);
+      Map<String, String> environmentOverrides,
+      {int index = 0})
+      : super._('vm', executable, arguments, environmentOverrides, null, index);
+
+  VmCommand indexedCopy(int index) =>
+      VmCommand._(executable, arguments, environmentOverrides, index: index);
 }
 
 class VmBatchCommand extends ProcessCommand implements VmCommand {
@@ -460,9 +533,14 @@
 
   VmBatchCommand._(String executable, String dartFile, List<String> arguments,
       Map<String, String> environmentOverrides,
-      {this.checked: true})
+      {this.checked: true, int index = 0})
       : this.dartFile = dartFile,
-        super._('vm-batch', executable, arguments, environmentOverrides);
+        super._('vm-batch', executable, arguments, environmentOverrides, null,
+            index);
+
+  VmBatchCommand indexedCopy(int index) =>
+      VmBatchCommand._(executable, dartFile, arguments, environmentOverrides,
+          checked: checked, index: index);
 
   @override
   List<String> get batchArguments =>
@@ -495,10 +573,18 @@
       this.processTestFilename,
       this.precompiledTestDirectory,
       this.arguments,
-      this.useBlobs)
-      : super._("adb_precompilation");
+      this.useBlobs,
+      {int index = 0})
+      : super._("adb_precompilation", index: index);
 
-  void _buildHashCode(HashCodeBuilder builder) {
+  AdbPrecompilationCommand indexedCopy(int index) => AdbPrecompilationCommand._(
+      precompiledRunnerFilename,
+      processTestFilename,
+      precompiledTestDirectory,
+      arguments,
+      useBlobs,
+      index: index);
+  _buildHashCode(HashCodeBuilder builder) {
     super._buildHashCode(builder);
     builder.add(precompiledRunnerFilename);
     builder.add(precompiledTestDirectory);
@@ -520,13 +606,18 @@
 class JSCommandlineCommand extends ProcessCommand {
   JSCommandlineCommand._(
       String displayName, String executable, List<String> arguments,
-      [Map<String, String> environmentOverrides = null])
-      : super._(displayName, executable, arguments, environmentOverrides);
+      [Map<String, String> environmentOverrides = null, int index = 0])
+      : super._(displayName, executable, arguments, environmentOverrides, null,
+            index);
+
+  JSCommandlineCommand indexedCopy(int index) => JSCommandlineCommand._(
+      displayName, executable, arguments, environmentOverrides, index);
 }
 
 /// [ScriptCommand]s are executed by dart code.
 abstract class ScriptCommand extends Command {
-  ScriptCommand._(String displayName) : super._(displayName);
+  ScriptCommand._(String displayName, {int index = 0})
+      : super._(displayName, index: index);
 
   Future<ScriptCommandOutput> run();
 }
@@ -535,8 +626,13 @@
   final String _sourceDirectory;
   final String _destinationDirectory;
 
-  CleanDirectoryCopyCommand._(this._sourceDirectory, this._destinationDirectory)
-      : super._('dir_copy');
+  CleanDirectoryCopyCommand._(this._sourceDirectory, this._destinationDirectory,
+      {int index = 0})
+      : super._('dir_copy', index: index);
+
+  CleanDirectoryCopyCommand indexedCopy(int index) =>
+      CleanDirectoryCopyCommand._(_sourceDirectory, _destinationDirectory,
+          index: index);
 
   String get reproductionCommand =>
       "Copying '$_sourceDirectory' to '$_destinationDirectory'.";
@@ -581,7 +677,11 @@
   String _link;
   String _target;
 
-  MakeSymlinkCommand._(this._link, this._target) : super._('make_symlink');
+  MakeSymlinkCommand._(this._link, this._target, {int index = 0})
+      : super._('make_symlink', index: index);
+
+  MakeSymlinkCommand indexedCopy(int index) =>
+      MakeSymlinkCommand._(_link, _target, index: index);
 
   String get reproductionCommand =>
       "Make symbolic link '$_link' (target: $_target)'.";
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 8f039d7..75728c3 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -1071,15 +1071,6 @@
       dillFile,
     ];
 
-    if (_isAot) {
-      args.addAll([
-        '--entry-points',
-        '${_configuration.buildDirectory}/gen/runtime/bin/precompiler_entry_points.json',
-        '--entry-points',
-        '${pkgVmDir}/lib/transformations/type_flow/entry_points_extra.json',
-      ]);
-    }
-
     args.add(arguments.where((name) => name.endsWith('.dart')).single);
     args.addAll(arguments.where((name) => name.startsWith('-D')));
     if (_isChecked || _useEnableAsserts) {
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index bd53829..ab0a075 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -25,7 +25,9 @@
       {this.configuration,
       this.progress,
       this.selectors,
+      this.testList,
       this.appendLogs,
+      this.repeat,
       this.batch,
       this.batchDart2JS,
       this.copyCoreDumps,
@@ -127,10 +129,12 @@
   final String dartPath;
   final String dartPrecompiledPath;
   final String flutterPath;
+  final List<String> testList;
 
   final int taskCount;
   final int shardCount;
   final int shard;
+  final int repeat;
   final String stepName;
 
   final int testServerPort;
diff --git a/tools/testing/dart/dependency_graph.dart b/tools/testing/dart/dependency_graph.dart
index a3e04fc2..1b6cb0e 100644
--- a/tools/testing/dart/dependency_graph.dart
+++ b/tools/testing/dart/dependency_graph.dart
@@ -70,10 +70,11 @@
   /// Adds a new node to the graph with [dependencies] and [userData].
   ///
   /// The node is in the [NodeState.initialized] state.
-  Node<T> add(T userData, Iterable<Node<T>> dependencies) {
+  Node<T> add(T userData, Iterable<Node<T>> dependencies,
+      {bool timingDependency = false}) {
     assert(!_isSealed);
 
-    var node = new Node._(userData);
+    var node = new Node._(userData, timingDependency);
     _nodes.add(node);
 
     for (var dependency in dependencies) {
@@ -114,11 +115,12 @@
 /// A single node in a [Graph].
 class Node<T> extends UniqueObject {
   final T data;
+  final bool timingDependency;
   NodeState _state = NodeState.initialized;
   final Set<Node<T>> _dependencies = new Set();
   final Set<Node<T>> _neededFor = new Set();
 
-  Node._(this.data);
+  Node._(this.data, this.timingDependency);
 
   NodeState get state => _state;
   Iterable<Node<T>> get dependencies => _dependencies;
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 9f5aadf..6c72986 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -220,6 +220,7 @@
         'shard', 'The index of this instance when running in sharded mode.',
         defaultsTo: 1, hide: true),
     new _Option.bool('help', 'Print list of options.', abbr: 'h'),
+    new _Option.int('repeat', 'How many times each test is run', defaultsTo: 1),
     new _Option.bool('verbose', 'Verbose output.', abbr: 'v'),
     new _Option.bool('verify-ir', 'Verify kernel IR.', hide: true),
     new _Option.bool('no-tree-shake', 'Disable kernel IR tree shaking.',
@@ -295,6 +296,7 @@
     new _Option.int(
         'test_driver_error_port', 'Port for http test driver server errors.',
         defaultsTo: 0, hide: true),
+    new _Option('test_list', 'File containing a list of tests to be executed'),
     new _Option(
         'builder_tag',
         '''Machine specific options that is not captured by the regular test
@@ -372,6 +374,10 @@
           verbose: arguments.contains("--verbose") || arguments.contains("-v"));
       return null;
     }
+    // Dart1 mode has been deprecated.
+    if (arguments.contains("--no-preview-dart-2")) {
+      return null;
+    }
 
     var configuration = <String, dynamic>{};
 
@@ -478,6 +484,12 @@
       }
     }
 
+    // Fetch list of tests to run, if option is present.
+    if (configuration['test_list'] is String) {
+      configuration['test_list_contents'] =
+          File(configuration['test_list'] as String).readAsLinesSync();
+    }
+
     return _createConfigurations(configuration);
   }
 
@@ -600,7 +612,7 @@
     if (runtimes.isEmpty) {
       if (compilers.isEmpty) {
         runtimes = [Runtime.vm];
-        compilers = [Compiler.none];
+        compilers = [Compiler.dartk];
       } else {
         // Pick a runtime for each compiler.
         runtimes.addAll(compilers.map((compiler) => compiler.defaultRuntime));
@@ -654,12 +666,14 @@
                     isMinified: data["minified"] as bool,
                     vmOptions: vmOptions,
                     builderTag: data["builder_tag"] as String,
-                    previewDart2: !(data["no_preview_dart_2"] as bool));
+                    previewDart2: true);
             var configuration = new TestConfiguration(
                 configuration: innerConfiguration,
                 progress: Progress.find(data["progress"] as String),
                 selectors: selectors,
+                testList: data["test_list_contents"] as List<String>,
                 appendLogs: data["append_logs"] as bool,
+                repeat: data["repeat"] as int,
                 batch: !(data["noBatch"] as bool),
                 batchDart2JS: data["dart2js_batch"] as bool,
                 copyCoreDumps: data["copy_coredumps"] as bool,
@@ -725,8 +739,13 @@
 
     if (selectors == null) {
       if (configuration['suite_dir'] != null) {
-        var suitePath = new Path(configuration['suite_dir'] as String);
+        var suitePath = Path(configuration['suite_dir'] as String);
         selectors = [suitePath.filename];
+      } else if (configuration['test_list_contents'] != null) {
+        selectors = (configuration['test_list_contents'] as List<String>)
+            .map((t) => t.split('/').first)
+            .toSet()
+            .toList();
       } else {
         selectors = _defaultTestSelectors.toList();
       }
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 0573c17..17e0b60 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -135,6 +135,14 @@
     }
   }
 
+  TestCase indexedCopy(int index) {
+    var newCommands = commands.map((c) => c.indexedCopy(index)).toList();
+    return new TestCase(
+        displayName, newCommands, configuration, expectedOutcomes)
+      .._expectations = _expectations
+      ..hash = hash;
+  }
+
   bool get isNegative => _expectations & IS_NEGATIVE != 0;
   bool get hasRuntimeError => _expectations & HAS_RUNTIME_ERROR != 0;
   bool get hasStaticWarning => _expectations & HAS_STATIC_WARNING != 0;
@@ -872,27 +880,46 @@
     enqueueNextSuite();
   }
 
+  /// Adds a test case to the list of active test cases, and adds its commands
+  /// to the dependency graph of commands.
+  ///
+  /// If the repeat flag is > 1, replicates the test case and its commands,
+  /// adding an index field with a distinct value to each of the copies.
+  ///
+  /// Each copy of the test case depends on the previous copy of the test
+  /// case completing, with its first command having a dependency on the last
+  /// command of the previous copy of the test case. This dependency is
+  /// marked as a "timingDependency", so that it doesn't depend on the previous
+  /// test completing successfully, just on it completing.
   void _newTest(TestCase testCase) {
-    remainingTestCases.add(testCase);
-
     Node<Command> lastNode;
-    for (var command in testCase.commands) {
-      // Make exactly *one* node in the dependency graph for every command.
-      // This ensures that we never have two commands c1 and c2 in the graph
-      // with "c1 == c2".
-      var node = command2node[command];
-      if (node == null) {
-        var requiredNodes = (lastNode != null) ? [lastNode] : <Node<Command>>[];
-        node = graph.add(command, requiredNodes);
-        command2node[command] = node;
-        command2testCases[command] = <TestCase>[];
+    for (int i = 0; i < testCase.configuration.repeat; ++i) {
+      if (i > 0) {
+        testCase = testCase.indexedCopy(i);
       }
-      // Keep mapping from command to all testCases that refer to it
-      command2testCases[command].add(testCase);
+      remainingTestCases.add(testCase);
+      bool isFirstCommand = true;
+      for (var command in testCase.commands) {
+        // Make exactly *one* node in the dependency graph for every command.
+        // This ensures that we never have two commands c1 and c2 in the graph
+        // with "c1 == c2".
+        var node = command2node[command];
+        if (node == null) {
+          var requiredNodes =
+              (lastNode != null) ? [lastNode] : <Node<Command>>[];
+          node = graph.add(command, requiredNodes,
+              timingDependency: isFirstCommand);
+          command2node[command] = node;
+          command2testCases[command] = <TestCase>[];
+        }
+        // Keep mapping from command to all testCases that refer to it
+        command2testCases[command].add(testCase);
 
-      lastNode = node;
+        lastNode = node;
+        isFirstCommand = false;
+      }
+      _onTestCaseAdded(testCase);
     }
-    _onTestCaseAdded(testCase);
   }
 }
 
@@ -921,8 +948,8 @@
       if (event.from == NodeState.waiting ||
           event.from == NodeState.processing) {
         if (_finishedStates.contains(event.to)) {
-          for (var dependendNode in event.node.neededFor) {
-            _changeNodeStateIfNecessary(dependendNode);
+          for (var dependentNode in event.node.neededFor) {
+            _changeNodeStateIfNecessary(dependentNode);
           }
         }
       }
@@ -933,19 +960,19 @@
   // changed it's state.
   void _changeNodeStateIfNecessary(Node<Command> node) {
     if (_initStates.contains(node.state)) {
+      bool allDependenciesFinished =
+          node.dependencies.every((dep) => _finishedStates.contains(dep.state));
       bool anyDependenciesUnsuccessful = node.dependencies.any((dep) =>
           [NodeState.failed, NodeState.unableToRun].contains(dep.state));
+      bool allDependenciesSuccessful =
+          node.dependencies.every((dep) => dep.state == NodeState.successful);
 
       var newState = NodeState.waiting;
-      if (anyDependenciesUnsuccessful) {
+      if (allDependenciesSuccessful ||
+          (allDependenciesFinished && node.timingDependency)) {
+        newState = NodeState.enqueuing;
+      } else if (anyDependenciesUnsuccessful) {
         newState = NodeState.unableToRun;
-      } else {
-        bool allDependenciesSuccessful =
-            node.dependencies.every((dep) => dep.state == NodeState.successful);
-
-        if (allDependenciesSuccessful) {
-          newState = NodeState.enqueuing;
-        }
       }
       if (node.state != newState) {
         _graph.changeState(node, newState);
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 0d0cfa6..3ecabb4 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -297,6 +297,10 @@
     if (!pattern.hasMatch(displayName)) {
       return;
     }
+    if (configuration.testList != null &&
+        !configuration.testList.contains(displayName)) {
+      return;
+    }
 
     if (configuration.hotReload || configuration.hotReloadRollback) {
       // Handle reload special cases.
@@ -541,10 +545,10 @@
   ExpectationSet testExpectations;
   List<TestInformation> cachedTests;
   final Path dartDir;
-  Predicate<String> isTestFilePredicate;
   final bool listRecursively;
   final List<String> extraVmOptions;
   List<Uri> _dart2JsBootstrapDependencies;
+  Set<String> _testListPossibleFilenames;
 
   static final Uri co19SuiteLocation = Repository.uri.resolve("tests/co19_2/");
   static final Uri legacyCo19SuiteLocation =
@@ -552,7 +556,7 @@
 
   StandardTestSuite(TestConfiguration configuration, String suiteName,
       Path suiteDirectory, List<String> statusFilePaths,
-      {this.isTestFilePredicate, bool recursive: false})
+      {bool recursive: false})
       : dartDir = Repository.dir,
         listRecursively = recursive,
         suiteDir = Repository.dir.join(suiteDirectory),
@@ -567,6 +571,22 @@
             .resolve('dart-sdk/bin/snapshots/dart2js.dart.snapshot')
       ];
     }
+    if (configuration.testList != null) {
+      _testListPossibleFilenames = Set<String>();
+      for (String s in configuration.testList) {
+        if (s.startsWith("$suiteName/")) {
+          s = s.substring(s.indexOf('/') + 1);
+          _testListPossibleFilenames
+              .add(suiteDir.append('$s.dart').toNativePath());
+          // If the test is a multitest, the filename doesn't include the label.
+          if (s.lastIndexOf('/') != -1) {
+            s = s.substring(0, s.lastIndexOf('/'));
+            _testListPossibleFilenames
+                .add(suiteDir.append('$s.dart').toNativePath());
+          }
+        }
+      }
+    }
   }
 
   /**
@@ -614,21 +634,14 @@
     ];
 
     return new StandardTestSuite(configuration, name, directory, status_paths,
-        isTestFilePredicate: (filename) => filename.endsWith('_test.dart'),
         recursive: true);
   }
 
   List<Uri> get dart2JsBootstrapDependencies => _dart2JsBootstrapDependencies;
 
-  /**
-   * The default implementation assumes a file is a test if
-   * it ends in "Test.dart".
-   */
-  bool isTestFile(String filename) {
-    // Use the specified predicate, if provided.
-    if (isTestFilePredicate != null) return isTestFilePredicate(filename);
-    return filename.endsWith("Test.dart");
-  }
+  /// The default implementation assumes a file is a test if
+  /// it ends in "_test.dart".
+  bool isTestFile(String filename) => filename.endsWith("_test.dart");
 
   List<String> additionalOptions(Path filePath) => [];
 
@@ -692,6 +705,10 @@
   }
 
   void enqueueFile(String filename, FutureGroup group) {
+    // This is an optimization to avoid scanning and generating extra tests.
+    // The definitive check against configuration.testList is performed in
+    // TestSuite.enqueueNewTestCase().
+    if (_testListPossibleFilenames?.contains(filename) == false) return;
     bool match = false;
     for (var regex in configuration.selectors.values) {
       String pattern = regex.pattern;
@@ -1500,7 +1517,6 @@
   PKGTestSuite(TestConfiguration configuration, Path directoryPath)
       : super(configuration, directoryPath.filename, directoryPath,
             ["$directoryPath/.status"],
-            isTestFilePredicate: (f) => f.endsWith('_test.dart'),
             recursive: true);
 
   void _enqueueBrowserTest(Path packageRoot, packages, TestInformation info,
diff --git a/utils/analysis_server/BUILD.gn b/utils/analysis_server/BUILD.gn
index 00ff196..643c494 100644
--- a/utils/analysis_server/BUILD.gn
+++ b/utils/analysis_server/BUILD.gn
@@ -7,7 +7,7 @@
 application_snapshot("analysis_server") {
   main_dart = "../../pkg/analysis_server/bin/server.dart"
   training_args = [
-    "--train-using=" + rebase_path("../../pkg/analyzer_cli"),
-    "--sdk=" + rebase_path("../../sdk/")
+    "--sdk=" + rebase_path("../../sdk/"),
+    "--train-using=" + rebase_path("../../pkg/analyzer_cli")
   ]
 }
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index b225d40..16b0025 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -121,8 +121,7 @@
 #    Arguments to pass to the Dart application for the training run.
 #
 #  vm_args (optional):
-#    Additional arguments to the Dart VM. Do not put --no-preview-dart-2 here.
-#    Instead use the template application_snapshot_dart1.
+#    Additional arguments to the Dart VM.
 #
 #  name (optional):
 #    The name of the snapshot if different from the target name. The output
@@ -148,40 +147,6 @@
   }
 }
 
-# Creates an app-jit snapshot for a Dart1 program based on a training run.
-#
-# Parameters:
-#  main_dart (required):
-#    The entrypoint to the Dart application.
-#
-#  training_args (required):
-#    Arguments to pass to the Dart application for the training run.
-#
-#  vm_args (optional):
-#    Additional arguments to the Dart VM. Do not put --no-preview-dart-2 here.
-#
-#  name (optional):
-#    The name of the snapshot if different from the target name. The output
-#    will be in $root_gen_dir/$name.dart.snapshot.
-#
-#  deps (optional):
-#    Any build dependencies.
-#
-#  dot_packages (optional):
-#    The .packages file for the app. Defaults to the $_dart_root/.packages.
-#
-#  output (optional):
-#    Overrides the full output path.
-template("application_snapshot_dart1") {
-  _application_snapshot(target_name) {
-    forward_variables_from(invoker, "*")
-    if (!defined(invoker.vm_args)) {
-      vm_args = []
-    }
-    vm_args += [ "--no-preview-dart-2" ]
-  }
-}
-
 # Creates an app-jit snapshot for the common FE based on a training run.
 #
 # Parameters:
@@ -192,7 +157,7 @@
 #    Arguments to pass to the Dart application for the training run.
 #
 #  vm_args (optional):
-#    Additional arguments to the Dart VM. Do not put --no-preview-dart-2 here.
+#    Additional arguments to the Dart VM.
 #
 #  name (optional):
 #    The name of the snapshot if different from the target name. The output
@@ -251,18 +216,13 @@
       output,
     ]
 
-    abs_depfile = rebase_path(depfile)
     abs_output = rebase_path(output, root_build_dir)
 
     vm_args = [
-      # TODO(asiva): For not use --no-preview-dart-2, need to flip this to use
-      # gen_kernel to generate a kernel file before creating an app snapshot.
-      "--no-preview-dart-2",
       "--deterministic",
       "--packages=$dot_packages",
       "--snapshot-kind=app-aot",
       "--snapshot=$abs_output",
-      "--snapshot-depfile=$abs_depfile",
     ] + aot_vm_args
 
     args = []
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index fe73122..887caf5 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -22,16 +22,58 @@
 application_snapshot("generate_dartanalyzer_snapshot") {
   main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
   training_args = [
-    "--dart-sdk=" + rebase_path("../../sdk"),
-    rebase_path("../../tests/language/first_test.dart"),
+    "--dart-sdk=" + rebase_path("../../sdk/"),
+    "--train-snapshot",
+    rebase_path("../../tests/language/first_test.dart")
   ]
   name = "dartanalyzer"
 }
 
 if (current_os == "linux") {
+  prebuilt_dart_action("dart_analyzer_dill") {
+    deps = [
+      "../../runtime/vm:vm_platform",
+      "../../runtime/vm:kernel_platform_files($dart_host_toolchain)",
+    ]
+    dart_analyzer_script = "../../pkg/vm/bin/kernel_service.dart"
+    gen_kernel_script = "../../pkg/vm/bin/gen_kernel.dart"
+
+    inputs = [
+      gen_kernel_script,
+      dart_analyzer_script,
+      "$root_out_dir/vm_platform_strong.dill",
+    ]
+    output = "$root_gen_dir/dart_analyzer.dill"
+    outputs = [
+      output,
+    ]
+
+    depfile = "$root_gen_dir/dart_analyzer_dill.d"
+    abs_depfile = rebase_path(depfile)
+    rebased_output = rebase_path(output, root_out_dir)
+    vm_args = [
+      "--depfile=$abs_depfile",
+      "--depfile_output_filename=$rebased_output",
+    ]
+
+    script = gen_kernel_script
+
+    args = [
+      "--packages=" + rebase_path("../../.packages"),
+      "--platform=" + rebase_path("$root_out_dir/vm_platform_strong.dill"),
+      "--aot",
+      "--no-embed-sources",
+      "--output=" + rebase_path("$root_gen_dir/dart_analyzer.dill"),
+      rebase_path(dart_analyzer_script),
+    ]
+  }
+
   aot_assembly("dartanalyzer_aot_assembly") {
-    main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
+    main_dart = "$root_gen_dir/dart_analyzer.dill"
     name = "dartanalyzer"
+    deps = [
+      ":dart_analyzer_dill"
+    ]
   }
 
   # This target is for Goma. It should not be used in the SDK.
diff --git a/utils/generate_entry_points_json.gni b/utils/generate_entry_points_json.gni
deleted file mode 100644
index dbb3a42..0000000
--- a/utils/generate_entry_points_json.gni
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-import("../build/dart/dart_action.gni")
-
-_dart_root = get_path_info("..", "abspath")
-
-# Template to generate entry points JSON file using dart_bootstrap tool.
-# List of entry points is generated as a by-product while doing precompilation.
-#
-# This template expects the following arguments:
-#  - input: Name of the input dart script for precompilation.
-#  - output: Name of the output entry points JSON file.
-#  - extra_args: Extra arguments to pass to dart_bootstrap (optional).
-#
-template("generate_entry_points_json_with_dart_bootstrap") {
-  assert(defined(invoker.input), "Must define input dart script")
-  assert(defined(invoker.output), "Must define output json file")
-  extra_args = []
-  if (defined(invoker.extra_args)) {
-    extra_args += invoker.extra_args
-  }
-  dart_bootstrap_action(target_name) {
-    # Printing precompiler entry points is folded into precompilation, so dart_bootstrap is invoked
-    # with correct arguments to generate app-aot snapshot.
-    script = invoker.input
-    output = invoker.output
-    outputs = [
-      output,
-    ]
-    vm_args = [
-      "--no-preview-dart-2",
-      "--print-precompiler-entry-points=" + rebase_path(output),
-      "--snapshot=" + rebase_path("$target_gen_dir/dummy.snapshot"),
-      "--snapshot-kind=app-aot",
-      "--use-blobs",
-      "--snapshot-kind=app-aot",
-    ] + extra_args
-    args = []
-  }
-}
-
-# Template to copy checked-in extra entry points JSON file.
-#
-# This template expects the following argument:
-#  - output: Target destination for the extra entry points JSON file.
-#
-template("copy_entry_points_extra_json") {
-  assert(defined(invoker.output), "Must define output json file")
-  copy(target_name) {
-    sources = [ "$_dart_root/pkg/vm/lib/transformations/type_flow/entry_points_extra.json" ]
-    outputs = [ invoker.output ]
-  }
-}
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index bcab702..3d9a72a 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -78,15 +78,13 @@
     output,
   ]
 
-  # Enable this when the prebuilt SDK rolls to pick up the fix for
-  # Issue #34026.
-  # depfile = "$target_gen_dir/kernel_service_dill.d"
-  # abs_depfile = rebase_path(depfile)
-  # abs_output = rebase_path(output)
-  # vm_args = [
-  #   "--depfile=$abs_depfile",
-  #   "--depfile_output_filename=$abs_output",
-  # ]
+  depfile = "$root_gen_dir/kernel_service_dill.d"
+  abs_depfile = rebase_path(depfile)
+  rebased_output = rebase_path(output, root_out_dir)
+  vm_args = [
+    "--depfile=$abs_depfile",
+    "--depfile_output_filename=$rebased_output",
+  ]
 
   script = gen_kernel_script