Version 2.5.0-dev.4.0

Merge commit '027071318ff1333fefcf7b4e475c10a8f68ebc0d' into dev
diff --git a/DEPS b/DEPS
index b32253a..8aba950 100644
--- a/DEPS
+++ b/DEPS
@@ -107,7 +107,7 @@
   "mustache_tag" : "5e81b12215566dbe2473b2afd01a8a8aedd56ad9",
   "oauth2_tag": "1.2.1",
   "observatory_pub_packages_rev": "0894122173b0f98eb08863a7712e78407d4477bc",
-  "package_config_tag": "1.0.5",
+  "package_config_tag": "2453cd2e78c2db56ee2669ced17ce70dd00bf576", # should be 1.1.0
   "package_resolver_tag": "1.0.10",
   "path_tag": "1.6.2",
   "pedantic_tag": "v1.8.0",
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index b919610..48fbe59 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -498,6 +498,7 @@
   ParserErrorCode.INVALID_CONSTRUCTOR_NAME,
   ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE,
   ParserErrorCode.INVALID_HEX_ESCAPE,
+  ParserErrorCode.INVALID_INITIALIZER,
   ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION,
   ParserErrorCode.INVALID_OPERATOR,
   ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index cec3fe1..d5a9bbb 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -357,6 +357,8 @@
 
   static const ParserErrorCode INVALID_HEX_ESCAPE = _INVALID_HEX_ESCAPE;
 
+  static const ParserErrorCode INVALID_INITIALIZER = _INVALID_INITIALIZER;
+
   static const ParserErrorCode INVALID_LITERAL_IN_CONFIGURATION =
       const ParserErrorCode('INVALID_LITERAL_IN_CONFIGURATION',
           "The literal in a configuration can't contain interpolation.",
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 80d4ee8b..732496e 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -97,6 +97,7 @@
   _EXTERNAL_CONSTRUCTOR_WITH_BODY,
   _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
   _VAR_AND_TYPE,
+  _INVALID_INITIALIZER,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
@@ -190,7 +191,7 @@
 
 const ParserErrorCode _DUPLICATED_MODIFIER = const ParserErrorCode(
     'DUPLICATED_MODIFIER', r"The modifier '#lexeme' was already specified.",
-    correction: "Try removing all but one occurence of the modifier.");
+    correction: "Try removing all but one occurrence of the modifier.");
 
 const ParserErrorCode _DUPLICATE_DEFERRED = const ParserErrorCode(
     'DUPLICATE_DEFERRED',
@@ -342,6 +343,10 @@
     'INVALID_HEX_ESCAPE',
     r"An escape sequence starting with '\x' must be followed by 2 hexadecimal digits.");
 
+const ParserErrorCode _INVALID_INITIALIZER = const ParserErrorCode(
+    'INVALID_INITIALIZER', r"Not a valid initializer.",
+    correction: "To initialize a field, use the syntax 'name = value'.");
+
 const ParserErrorCode _INVALID_OPERATOR = const ParserErrorCode(
     'INVALID_OPERATOR',
     r"The string '#lexeme' isn't a user-definable operator.");
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 131f83f..71e5474 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -32,6 +32,7 @@
         messageFieldInitializerOutsideConstructor,
         messageIllegalAssignmentToNonAssignable,
         messageInterpolationInUri,
+        messageInvalidInitializer,
         messageInvalidSuperInInitializer,
         messageInvalidThisInInitializer,
         messageMissingAssignableSelector,
@@ -419,8 +420,7 @@
           initializerObject.target, initializerObject);
     }
 
-    throw new UnsupportedError('unsupported initializer:'
-        ' ${initializerObject.runtimeType} :: $initializerObject');
+    return null;
   }
 
   AstNode buildInitializerTargetExpressionRecovery(
@@ -455,9 +455,7 @@
       return ast.redirectingConstructorInvocation(
           target.thisKeyword, null, null, argumentList);
     }
-    throw new UnsupportedError('unsupported initializer:'
-        ' ${initializerObject.runtimeType} :: $initializerObject'
-        ' %% target : ${target.runtimeType} :: $target');
+    return null;
   }
 
   void checkFieldFormalParameters(FormalParameterList parameters) {
@@ -1367,11 +1365,14 @@
     var initializers = <ConstructorInitializer>[];
     for (Object initializerObject in initializerObjects) {
       ConstructorInitializer initializer = buildInitializer(initializerObject);
-      if (initializer == null) {
-        throw new UnsupportedError('unsupported initializer:'
-            ' ${initializerObject.runtimeType} :: $initializerObject');
+      if (initializer != null) {
+        initializers.add(initializer);
+      } else {
+        handleRecoverableError(
+            messageInvalidInitializer,
+            initializerObject is AstNode ? initializerObject.beginToken : colon,
+            initializerObject is AstNode ? initializerObject.endToken : colon);
       }
-      initializers.add(initializer);
     }
 
     push(initializers);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index bde9710..63c5052 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -792,11 +792,7 @@
       return;
     }
     if (_checkForEachParts(node, identifier)) {
-      Element variableElement = identifier.staticElement;
-      if (variableElement is VariableElement && variableElement.isConst) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE, identifier);
-      }
+      _checkForAssignmentToFinal(identifier);
     }
     super.visitForEachPartsWithIdentifier(node);
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 586123a..426c86f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -333,6 +333,26 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    _compilationUnitMember(node);
+    _token(node.extensionKeyword);
+    node.name?.accept(this);
+    node.typeParameters?.accept(this);
+    _token(node.onKeyword);
+    node.extendedType.accept(this);
+    _token(node.leftBracket);
+    node.members.accept(this);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitExtensionOverride(ExtensionOverride node) {
+    node.extensionName.accept(this);
+    node.typeArguments.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     _classMember(node);
     _token(node.staticKeyword);
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
index e011614..899e2e5 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code.dart
@@ -1571,7 +1571,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE, 28, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 28, 1),
     ]);
   }
 
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 ba715e5..eb70ef3 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -231,7 +231,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE, 28, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 28, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 383986c..3718020 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -97,6 +97,14 @@
     expect(rightHandSide.name, 'value');
   }
 
+  void test_parseConstructor_invalidInitializer() {
+    // https://github.com/dart-lang/sdk/issues/37693
+    parseCompilationUnit('class C{ C() : super() * (); }', errors: [
+      expectedError(ParserErrorCode.INVALID_INITIALIZER, 15, 12),
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+    ]);
+  }
+
   void test_parseConstructor_nullSuperArgList_openBrace_37735() {
     // https://github.com/dart-lang/sdk/issues/37735
     var unit = parseCompilationUnit('class{const():super.{n', errors: [
@@ -1232,6 +1240,14 @@
     ]);
   }
 
+  void test_listLiteral_invalidElement_37697() {
+    // https://github.com/dart-lang/sdk/issues/37674
+    parseExpression('[<y.<z>(){}]', errors: [
+      expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 4, 1),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 1),
+    ]);
+  }
+
   void test_listLiteral_spread_disabled() {
     ListLiteral list =
         parseExpression('[1, ...[2]]', featureSet: beforeUiAsCode, errors: [
diff --git a/pkg/analyzer/test/src/context/source_test.dart b/pkg/analyzer/test/src/context/source_test.dart
index 74b8c43..5bc3108 100644
--- a/pkg/analyzer/test/src/context/source_test.dart
+++ b/pkg/analyzer/test/src/context/source_test.dart
@@ -58,4 +58,19 @@
   Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
     fail('Unexpected invocation of resolve');
   }
+
+  @override
+  String get defaultPackageName {
+    fail('Unexpected invocation of defaultPackageName');
+  }
+
+  @override
+  String libraryMetadata(Uri libraryUri, String key) {
+    fail('Unexpected invocation of libraryMetadata');
+  }
+
+  @override
+  String packageMetadata(String packageName, String key) {
+    fail('Unexpected invocation of packageMetadata');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
index a3b7863..a9022b5 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
@@ -61,4 +61,16 @@
       error(StaticWarningCode.ASSIGNMENT_TO_CONST, 23, 1),
     ]);
   }
+
+  test_localVariable_inForEach() async {
+    await assertErrorsInCode('''
+f() {
+  const x = 0;
+  for (x in <int>[1, 2]) {
+    print(x);
+  }
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 28, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
index 2839d0a..cef7998 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
@@ -113,6 +113,18 @@
     ]);
   }
 
+  test_localVariable_inForEach() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  for (x in <int>[1, 2]) {
+    print(x);
+  }
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 28, 1),
+    ]);
+  }
+
   test_topLevelVariable() async {
     await assertErrorsInCode('''
 final x = 0;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index af985cd..ab3bc02 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -6044,7 +6044,7 @@
       FunctionEntity function, TypeVariableType typeVariable) {
     DartType bound =
         _elementEnvironment.getTypeVariableDefaultType(typeVariable.element);
-    if (bound.containsTypeVariables) {
+    if (bound.containsTypeVariables && !options.experimentNewRti) {
       // TODO(33422): Support type variables in default
       // types. Temporarily using the "any" type (encoded as -2) to
       // avoid failing on bounds checks.
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index b081701..e1cb003 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -494,7 +494,8 @@
     if (contents != null) {
       _packagesUri = file;
       try {
-        Map<String, Uri> map = package_config.parse(contents, file);
+        Map<String, Uri> map =
+            package_config.parse(contents, file, allowDefaultPackage: true);
         return new MapPackages(map);
       } on FormatException catch (e) {
         report(
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 7db58b7..81f0051 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -6402,6 +6402,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidInitializer = const MessageCode(
     "InvalidInitializer",
+    index: 90,
     message: r"""Not a valid initializer.""",
     tip: r"""To initialize a field, use the syntax 'name = value'.""");
 
diff --git a/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart b/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
index e17c773..29ae839 100644
--- a/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
+++ b/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
@@ -26,7 +26,7 @@
   }
 
   void beginStatement() {
-    var set = Set<Variable>.identity();
+    Set<Variable> set = Set<Variable>.identity();
     _stack.add(set);
   }
 
@@ -35,7 +35,7 @@
   }
 
   void write(Variable variable) {
-    for (var i = 0; i < _stack.length; ++i) {
+    for (int i = 0; i < _stack.length; ++i) {
       _stack[i].add(variable);
     }
   }
@@ -100,7 +100,8 @@
     TypeOperations<Variable, Type> typeOperations,
     FunctionBodyAccess<Variable> functionBody,
   ) {
-    var emptySet = FlowModel<Variable, Type>(false).notAssigned;
+    _VariableSet<Variable> emptySet =
+        FlowModel<Variable, Type>(false).notAssigned;
     return FlowAnalysis._(
       nodeOperations,
       typeOperations,
@@ -139,8 +140,8 @@
   }
 
   void conditional_elseBegin(Expression thenExpression) {
-    var afterThen = _current;
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> afterThen = _current;
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
 
     _conditionalEnd(thenExpression);
     // Tail of the stack: falseThen, trueThen
@@ -151,20 +152,20 @@
 
   void conditional_end(
       Expression conditionalExpression, Expression elseExpression) {
-    var afterThen = _stack.removeLast();
-    var afterElse = _current;
+    FlowModel<Variable, Type> afterThen = _stack.removeLast();
+    FlowModel<Variable, Type> afterElse = _current;
 
     _conditionalEnd(elseExpression);
     // Tail of the stack: falseThen, trueThen, falseElse, trueElse
 
-    var trueElse = _stack.removeLast();
-    var falseElse = _stack.removeLast();
+    FlowModel<Variable, Type> trueElse = _stack.removeLast();
+    FlowModel<Variable, Type> falseElse = _stack.removeLast();
 
-    var trueThen = _stack.removeLast();
-    var falseThen = _stack.removeLast();
+    FlowModel<Variable, Type> trueThen = _stack.removeLast();
+    FlowModel<Variable, Type> falseThen = _stack.removeLast();
 
-    var trueResult = _join(trueThen, trueElse);
-    var falseResult = _join(falseThen, falseElse);
+    FlowModel<Variable, Type> trueResult = _join(trueThen, trueElse);
+    FlowModel<Variable, Type> falseResult = _join(falseThen, falseElse);
 
     _condition = conditionalExpression;
     _conditionTrue = trueResult;
@@ -177,7 +178,7 @@
     _conditionalEnd(condition);
     // Tail of the stack: falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
     _current = trueCondition;
   }
 
@@ -191,7 +192,8 @@
     }
 
     _condition = binaryExpression;
-    var currentPromoted = _current.markNonNullable(typeOperations, variable);
+    FlowModel<Variable, Type> currentPromoted =
+        _current.markNonNullable(typeOperations, variable);
     if (notEqual) {
       _conditionTrue = currentPromoted;
       _conditionFalse = _current;
@@ -214,7 +216,7 @@
   void doStatement_conditionBegin() {
     // Tail of the stack: break, continue
 
-    var continueState = _stack.removeLast();
+    FlowModel<Variable, Type> continueState = _stack.removeLast();
     _current = _join(_current, continueState);
   }
 
@@ -223,8 +225,8 @@
     // Tail of the stack:  break, falseCondition, trueCondition
 
     _stack.removeLast(); // trueCondition
-    var falseCondition = _stack.removeLast();
-    var breakState = _stack.removeLast();
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
 
     _current = _join(falseCondition, breakState);
   }
@@ -234,7 +236,7 @@
   void finish() {
     assert(_stack.isEmpty);
     assert(() {
-      var variablesNotAdded =
+      Set<Variable> variablesNotAdded =
           _referencedVariables.difference(Set<Variable>.from(_addedVariables));
       assert(variablesNotAdded.isEmpty,
           'Variables not passed to add: $variablesNotAdded');
@@ -249,7 +251,7 @@
   }
 
   void forEachStatement_end() {
-    var afterIterable = _stack.removeLast();
+    FlowModel<Variable, Type> afterIterable = _stack.removeLast();
     _current = _join(_current, afterIterable);
   }
 
@@ -257,7 +259,7 @@
     _conditionalEnd(condition);
     // Tail of the stack: falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
 
     _statementToStackIndex[node] = _stack.length;
     _stack.add(null); // break
@@ -273,16 +275,16 @@
 
   void forStatement_end() {
     // Tail of the stack: falseCondition, break
-    var breakState = _stack.removeLast();
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
 
     _current = _join(falseCondition, breakState);
   }
 
   void forStatement_updaterBegin() {
     // Tail of the stack: falseCondition, break, continue
-    var afterBody = _current;
-    var continueState = _stack.removeLast();
+    FlowModel<Variable, Type> afterBody = _current;
+    FlowModel<Variable, Type> continueState = _stack.removeLast();
 
     _current = _join(afterBody, continueState);
   }
@@ -291,9 +293,9 @@
     _stack.add(_current);
 
     Set<Variable> notPromoted = null;
-    for (var entry in _current.promoted.entries) {
-      var variable = entry.key;
-      var promotedType = entry.value;
+    for (MapEntry<Variable, Type> entry in _current.promoted.entries) {
+      Variable variable = entry.key;
+      Type promotedType = entry.value;
       if (promotedType != null &&
           functionBody.isPotentiallyMutatedInScope(variable)) {
         notPromoted ??= Set<Variable>.identity();
@@ -311,7 +313,7 @@
   }
 
   void handleBreak(Statement target) {
-    var breakIndex = _statementToStackIndex[target];
+    int breakIndex = _statementToStackIndex[target];
     if (breakIndex != null) {
       _stack[breakIndex] = _join(_stack[breakIndex], _current);
     }
@@ -319,9 +321,9 @@
   }
 
   void handleContinue(Statement target) {
-    var breakIndex = _statementToStackIndex[target];
+    int breakIndex = _statementToStackIndex[target];
     if (breakIndex != null) {
-      var continueIndex = breakIndex + 1;
+      int continueIndex = breakIndex + 1;
       _stack[continueIndex] = _join(_stack[continueIndex], _current);
     }
     _current = _current.setReachable(false);
@@ -334,7 +336,7 @@
   }
 
   void ifNullExpression_end() {
-    var afterLeft = _stack.removeLast();
+    FlowModel<Variable, Type> afterLeft = _stack.removeLast();
     _current = _join(_current, afterLeft);
   }
 
@@ -343,8 +345,8 @@
   }
 
   void ifStatement_elseBegin() {
-    var afterThen = _current;
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> afterThen = _current;
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
     _stack.add(afterThen);
     _current = falseCondition;
   }
@@ -366,7 +368,7 @@
     _conditionalEnd(condition);
     // Tail of the stack:  falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
     _current = trueCondition;
   }
 
@@ -398,11 +400,11 @@
     _conditionalEnd(rightOperand);
     // Tail of the stack: falseLeft, trueLeft, falseRight, trueRight
 
-    var trueRight = _stack.removeLast();
-    var falseRight = _stack.removeLast();
+    FlowModel<Variable, Type> trueRight = _stack.removeLast();
+    FlowModel<Variable, Type> falseRight = _stack.removeLast();
 
-    var trueLeft = _stack.removeLast();
-    var falseLeft = _stack.removeLast();
+    FlowModel<Variable, Type> trueLeft = _stack.removeLast();
+    FlowModel<Variable, Type> falseLeft = _stack.removeLast();
 
     FlowModel<Variable, Type> trueResult;
     FlowModel<Variable, Type> falseResult;
@@ -414,7 +416,7 @@
       falseResult = falseRight;
     }
 
-    var afterResult = _join(trueResult, falseResult);
+    FlowModel<Variable, Type> afterResult = _join(trueResult, falseResult);
 
     _condition = wholeExpression;
     _conditionTrue = trueResult;
@@ -429,18 +431,18 @@
     // Tail of the stack: falseLeft, trueLeft
 
     if (isAnd) {
-      var trueLeft = _stack.last;
+      FlowModel<Variable, Type> trueLeft = _stack.last;
       _current = trueLeft;
     } else {
-      var falseLeft = _stack[_stack.length - 2];
+      FlowModel<Variable, Type> falseLeft = _stack[_stack.length - 2];
       _current = falseLeft;
     }
   }
 
   void logicalNot_end(Expression notExpression, Expression operand) {
     _conditionalEnd(operand);
-    var trueExpr = _stack.removeLast();
-    var falseExpr = _stack.removeLast();
+    FlowModel<Variable, Type> trueExpr = _stack.removeLast();
+    FlowModel<Variable, Type> falseExpr = _stack.removeLast();
 
     _condition = notExpression;
     _conditionTrue = falseExpr;
@@ -465,9 +467,9 @@
 
   void switchStatement_end(Statement switchStatement, bool hasDefault) {
     // Tail of the stack: break, continue, afterExpression
-    var afterExpression = _current = _stack.removeLast();
+    FlowModel<Variable, Type> afterExpression = _current = _stack.removeLast();
     _stack.removeLast(); // continue
-    var breakState = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
 
     if (hasDefault) {
       // breakState should not be null because we should have joined it with
@@ -493,25 +495,26 @@
 
   void tryCatchStatement_bodyEnd(Set<Variable> assignedInBody) {
     _variablesReferenced(assignedInBody);
-    var beforeBody = _stack.removeLast();
-    var beforeCatch = beforeBody.removePromotedAll(assignedInBody);
+    FlowModel<Variable, Type> beforeBody = _stack.removeLast();
+    FlowModel<Variable, Type> beforeCatch =
+        beforeBody.removePromotedAll(assignedInBody);
     _stack.add(beforeCatch);
     _stack.add(_current); // afterBodyAndCatches
     // Tail of the stack: beforeCatch, afterBodyAndCatches
   }
 
   void tryCatchStatement_catchBegin() {
-    var beforeCatch = _stack[_stack.length - 2];
+    FlowModel<Variable, Type> beforeCatch = _stack[_stack.length - 2];
     _current = beforeCatch;
   }
 
   void tryCatchStatement_catchEnd() {
-    var afterBodyAndCatches = _stack.last;
+    FlowModel<Variable, Type> afterBodyAndCatches = _stack.last;
     _stack.last = _join(afterBodyAndCatches, _current);
   }
 
   void tryCatchStatement_end() {
-    var afterBodyAndCatches = _stack.removeLast();
+    FlowModel<Variable, Type> afterBodyAndCatches = _stack.removeLast();
     _stack.removeLast(); // beforeCatch
     _current = afterBodyAndCatches;
   }
@@ -522,7 +525,7 @@
 
   void tryFinallyStatement_end(Set<Variable> assignedInFinally) {
     _variablesReferenced(assignedInFinally);
-    var afterBody = _stack.removeLast();
+    FlowModel<Variable, Type> afterBody = _stack.removeLast();
     _current = _current.restrict(
       typeOperations,
       _emptySet,
@@ -533,8 +536,8 @@
 
   void tryFinallyStatement_finallyBegin(Set<Variable> assignedInBody) {
     _variablesReferenced(assignedInBody);
-    var beforeTry = _stack.removeLast();
-    var afterBody = _current;
+    FlowModel<Variable, Type> beforeTry = _stack.removeLast();
+    FlowModel<Variable, Type> afterBody = _current;
     _stack.add(afterBody);
     _current = _join(afterBody, beforeTry.removePromotedAll(assignedInBody));
   }
@@ -544,7 +547,7 @@
     _conditionalEnd(condition);
     // Tail of the stack: falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
 
     _statementToStackIndex[whileStatement] = _stack.length;
     _stack.add(null); // break
@@ -560,8 +563,8 @@
 
   void whileStatement_end() {
     _stack.removeLast(); // continue
-    var breakState = _stack.removeLast();
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
 
     _current = _join(falseCondition, breakState);
   }
@@ -657,8 +660,9 @@
   /// optional [assigned] boolean indicates whether the variable is assigned at
   /// the point of declaration.
   FlowModel<Variable, Type> add(Variable variable, {bool assigned: false}) {
-    var newNotAssigned = assigned ? notAssigned : notAssigned.add(variable);
-    var newPromoted = Map<Variable, Type>.from(promoted);
+    _VariableSet<Variable> newNotAssigned =
+        assigned ? notAssigned : notAssigned.add(variable);
+    Map<Variable, Type> newPromoted = Map<Variable, Type>.from(promoted);
     newPromoted[variable] = null;
 
     return FlowModel<Variable, Type>._(
@@ -675,12 +679,12 @@
   /// assigned?  Does it matter?
   FlowModel<Variable, Type> markNonNullable(
       TypeOperations<Variable, Type> typeOperations, Variable variable) {
-    var previousType = promoted[variable];
+    Type previousType = promoted[variable];
     previousType ??= typeOperations.variableType(variable);
-    var type = typeOperations.promoteToNonNull(previousType);
+    Type type = typeOperations.promoteToNonNull(previousType);
 
     if (!typeOperations.isSameType(type, previousType)) {
-      var newPromoted = <Variable, Type>{}..addAll(promoted);
+      Map<Variable, Type> newPromoted = <Variable, Type>{}..addAll(promoted);
       newPromoted[variable] = type;
       return FlowModel<Variable, Type>._(
         reachable,
@@ -706,12 +710,12 @@
     Variable variable,
     Type type,
   ) {
-    var previousType = promoted[variable];
+    Type previousType = promoted[variable];
     previousType ??= typeOperations.variableType(variable);
 
     if (typeOperations.isSubtypeOf(type, previousType) &&
         !typeOperations.isSameType(type, previousType)) {
-      var newPromoted = <Variable, Type>{}..addAll(promoted);
+      Map<Variable, Type> newPromoted = <Variable, Type>{}..addAll(promoted);
       newPromoted[variable] = type;
       return FlowModel<Variable, Type>._(
         reachable,
@@ -743,7 +747,7 @@
   /// later in the loop body.  If we switch to a fixed point analysis, we should
   /// be able to remove this method.
   FlowModel<Variable, Type> removePromotedAll(Set<Variable> variables) {
-    var newPromoted = _removePromotedAll(promoted, variables);
+    Map<Variable, Type> newPromoted = _removePromotedAll(promoted, variables);
 
     if (identical(newPromoted, promoted)) return this;
 
@@ -780,8 +784,8 @@
     FlowModel<Variable, Type> other,
     Set<Variable> unsafe,
   ) {
-    var newReachable = reachable && other.reachable;
-    var newNotAssigned = notAssigned.intersect(
+    bool newReachable = reachable && other.reachable;
+    _VariableSet<Variable> newNotAssigned = notAssigned.intersect(
       empty: emptySet,
       other: other.notAssigned,
     );
@@ -792,13 +796,13 @@
       newNotAssigned = other.notAssigned;
     }
 
-    var newPromoted = <Variable, Type>{};
+    Map<Variable, Type> newPromoted = <Variable, Type>{};
     bool promotedMatchesThis = true;
     bool promotedMatchesOther = other.promoted.length == promoted.length;
-    for (var entry in promoted.entries) {
-      var variable = entry.key;
-      var thisType = entry.value;
-      var otherType = other.promoted[variable];
+    for (MapEntry<Variable, Type> entry in promoted.entries) {
+      Variable variable = entry.key;
+      Type thisType = entry.value;
+      Type otherType = other.promoted[variable];
       if (!unsafe.contains(variable)) {
         if (otherType != null &&
             (thisType == null ||
@@ -867,11 +871,12 @@
   /// TODO(paulberry): allow for writes that preserve type promotions.
   FlowModel<Variable, Type> write(TypeOperations<Variable, Type> typeOperations,
       _VariableSet<Variable> emptySet, Variable variable) {
-    var newNotAssigned = typeOperations.isLocalVariable(variable)
-        ? notAssigned.remove(emptySet, variable)
-        : notAssigned;
+    _VariableSet<Variable> newNotAssigned =
+        typeOperations.isLocalVariable(variable)
+            ? notAssigned.remove(emptySet, variable)
+            : notAssigned;
 
-    var newPromoted = _removePromoted(promoted, variable);
+    Map<Variable, Type> newPromoted = _removePromoted(promoted, variable);
 
     if (identical(newNotAssigned, notAssigned) &&
         identical(newPromoted, promoted)) {
@@ -891,7 +896,7 @@
       Map<Variable, Type> map, Variable variable) {
     if (map[variable] == null) return map;
 
-    var result = Map<Variable, Type>.from(map);
+    Map<Variable, Type> result = Map<Variable, Type>.from(map);
     result[variable] = null;
     return result;
   }
@@ -905,11 +910,11 @@
     if (map.isEmpty) return const {};
     if (variables.isEmpty) return map;
 
-    var result = <Variable, Type>{};
-    var noChanges = true;
-    for (var entry in map.entries) {
-      var variable = entry.key;
-      var promotedType = entry.value;
+    Map<Variable, Type> result = <Variable, Type>{};
+    bool noChanges = true;
+    for (MapEntry<Variable, Type> entry in map.entries) {
+      Variable variable = entry.key;
+      Type promotedType = entry.value;
       if (variables.contains(variable) && promotedType != null) {
         result[variable] = null;
         noChanges = false;
@@ -943,9 +948,10 @@
     if (first.reachable && !second.reachable) return first;
     if (!first.reachable && second.reachable) return second;
 
-    var newReachable = first.reachable || second.reachable;
-    var newNotAssigned = first.notAssigned.union(second.notAssigned);
-    var newPromoted =
+    bool newReachable = first.reachable || second.reachable;
+    _VariableSet<Variable> newNotAssigned =
+        first.notAssigned.union(second.notAssigned);
+    Map<Variable, Type> newPromoted =
         FlowModel.joinPromoted(typeOperations, first.promoted, second.promoted);
 
     return FlowModel._identicalOrNew(
@@ -967,16 +973,16 @@
     if (identical(first, second)) return first;
     if (first.isEmpty || second.isEmpty) return const {};
 
-    var result = <Variable, Type>{};
-    var alwaysFirst = true;
-    var alwaysSecond = true;
-    for (var entry in first.entries) {
-      var variable = entry.key;
+    Map<Variable, Type> result = <Variable, Type>{};
+    bool alwaysFirst = true;
+    bool alwaysSecond = true;
+    for (MapEntry<Variable, Type> entry in first.entries) {
+      Variable variable = entry.key;
       if (!second.containsKey(variable)) {
         alwaysFirst = false;
       } else {
-        var firstType = entry.value;
-        var secondType = second[variable];
+        Type firstType = entry.value;
+        Type secondType = second[variable];
         if (identical(firstType, secondType)) {
           result[variable] = firstType;
         } else if (firstType == null) {
@@ -1039,9 +1045,9 @@
       Map<Variable, Type> p2) {
     if (p1.length != p2.length) return false;
     if (!p1.keys.toSet().containsAll(p2.keys)) return false;
-    for (var entry in p1.entries) {
-      var p1Value = entry.value;
-      var p2Value = p2[entry.key];
+    for (MapEntry<Variable, Type> entry in p1.entries) {
+      Type p1Value = entry.value;
+      Type p2Value = p2[entry.key];
       if (p1Value == null) {
         if (p2Value != null) return false;
       } else {
@@ -1098,9 +1104,9 @@
       return this;
     }
 
-    var length = variables.length;
-    var newVariables = List<Variable>(length + 1);
-    for (var i = 0; i < length; ++i) {
+    int length = variables.length;
+    List<Variable> newVariables = List<Variable>(length + 1);
+    for (int i = 0; i < length; ++i) {
       newVariables[i] = variables[i];
     }
     newVariables[length] = addedVariable;
@@ -1108,16 +1114,16 @@
   }
 
   _VariableSet<Variable> addAll(Iterable<Variable> variables) {
-    var result = this;
-    for (var variable in variables) {
+    _VariableSet<Variable> result = this;
+    for (Variable variable in variables) {
       result = result.add(variable);
     }
     return result;
   }
 
   bool contains(Variable variable) {
-    var length = variables.length;
-    for (var i = 0; i < length; ++i) {
+    int length = variables.length;
+    for (int i = 0; i < length; ++i) {
       if (identical(variables[i], variable)) {
         return true;
       }
@@ -1133,7 +1139,7 @@
     if (identical(this, other)) return this;
 
     // TODO(scheglov) optimize
-    var newVariables =
+    List<Variable> newVariables =
         variables.toSet().intersection(other.variables.toSet()).toList();
 
     if (newVariables.isEmpty) return empty;
@@ -1148,15 +1154,15 @@
       return this;
     }
 
-    var length = variables.length;
+    int length = variables.length;
     if (length == 1) {
       return empty;
     }
 
-    var newVariables = List<Variable>(length - 1);
-    var newIndex = 0;
-    for (var i = 0; i < length; ++i) {
-      var variable = variables[i];
+    List<Variable> newVariables = List<Variable>(length - 1);
+    int newIndex = 0;
+    for (int i = 0; i < length; ++i) {
+      Variable variable = variables[i];
       if (!identical(variable, removedVariable)) {
         newVariables[newIndex++] = variable;
       }
@@ -1173,10 +1179,10 @@
       return this;
     }
 
-    var result = this;
-    var otherVariables = other.variables;
-    for (var i = 0; i < otherVariables.length; ++i) {
-      var otherVariable = otherVariables[i];
+    _VariableSet<Variable> result = this;
+    List<Variable> otherVariables = other.variables;
+    for (int i = 0; i < otherVariables.length; ++i) {
+      Variable otherVariable = otherVariables[i];
       result = result.add(otherVariable);
     }
     return result;
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 c15646d..5d697e6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -740,7 +740,7 @@
     debugEvent("endInitializer");
     inFieldInitializer = false;
     assert(!inInitializer);
-    final member = this.member;
+    final ModifierBuilder member = this.member;
     Object node = pop();
     Initializer initializer;
     if (node is Initializer) {
@@ -2507,7 +2507,7 @@
   @override
   void endForControlFlow(Token token) {
     debugEvent("ForControlFlow");
-    var entry = pop();
+    Object entry = pop();
     int updateExpressionCount = pop();
     pop(); // left separator
     pop(); // left parenthesis
@@ -2638,7 +2638,7 @@
     List<Expression> expressions =
         new List<Expression>.filled(count, null, growable: true);
     for (int i = count - 1; i >= 0; i--) {
-      var elem = pop();
+      Object elem = pop();
       if (elem != invalidCollectionElement) {
         expressions[i] = toValue(elem);
       } else {
@@ -2691,9 +2691,9 @@
       typeArgument = implicitTypeArgument;
     }
 
-    var expressions = <Expression>[];
+    List<Expression> expressions = <Expression>[];
     if (setOrMapEntries != null) {
-      for (var entry in setOrMapEntries) {
+      for (dynamic entry in setOrMapEntries) {
         if (entry is MapEntry) {
           // TODO(danrubel): report the error on the colon
           addProblem(fasta.templateExpectedButGot.withArguments(','),
@@ -2730,9 +2730,10 @@
   ) {
     debugEvent("LiteralSetOrMap");
 
-    var setOrMapEntries = new List<dynamic>.filled(count, null, growable: true);
+    List<dynamic> setOrMapEntries =
+        new List<dynamic>.filled(count, null, growable: true);
     for (int i = count - 1; i >= 0; i--) {
-      var elem = pop();
+      Object elem = pop();
       // TODO(danrubel): Revise this to handle control flow and spread
       if (elem == invalidCollectionElement) {
         setOrMapEntries.removeAt(i);
@@ -2751,7 +2752,7 @@
     // TODO(danrubel): Since type resolution is needed to disambiguate
     // set or map in some situations, consider always deferring determination
     // until the type resolution phase.
-    final typeArgCount = typeArguments?.length;
+    final int typeArgCount = typeArguments?.length;
     bool isSet = typeArgCount == 1 ? true : typeArgCount != null ? false : null;
 
     for (int i = 0; i < setOrMapEntries.length; ++i) {
@@ -3981,8 +3982,8 @@
   @override
   void endIfControlFlow(Token token) {
     debugEvent("endIfControlFlow");
-    var entry = pop();
-    var condition = pop(); // parenthesized expression
+    Object entry = pop();
+    Object condition = pop(); // parenthesized expression
     Token ifToken = pop();
     typePromoter?.enterElse();
     typePromoter?.exitConditional();
@@ -4020,9 +4021,9 @@
   @override
   void endIfElseControlFlow(Token token) {
     debugEvent("endIfElseControlFlow");
-    var elseEntry = pop(); // else entry
-    var thenEntry = pop(); // then entry
-    var condition = pop(); // parenthesized expression
+    Object elseEntry = pop(); // else entry
+    Object thenEntry = pop(); // then entry
+    Object condition = pop(); // parenthesized expression
     Token ifToken = pop();
     typePromoter?.exitConditional();
     if (!library.loader.target.enableControlFlowCollections) {
@@ -4098,7 +4099,7 @@
   @override
   void handleSpreadExpression(Token spreadToken) {
     debugEvent("SpreadExpression");
-    var expression = pop();
+    Object expression = pop();
     if (!library.loader.target.enableSpreadCollections) {
       handleRecoverableError(
           fasta.templateUnexpectedToken.withArguments(spreadToken),
@@ -4418,7 +4419,7 @@
   @override
   void endForInControlFlow(Token token) {
     debugEvent("ForInControlFlow");
-    var entry = pop();
+    Object entry = pop();
     Token inToken = pop();
     Token forToken = pop();
     Token awaitToken = pop(NullValue.AwaitToken);
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 a025fd0..d9ba7e9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -11,6 +11,7 @@
     show
         Constructor,
         Field,
+        IntLiteral,
         InvalidExpression,
         Let,
         Node,
@@ -85,6 +86,9 @@
 
 import '../scope.dart';
 
+import '../type_inference/type_promotion.dart'
+    show TypePromotionFact, TypePromotionScope;
+
 import 'body_builder.dart' show noLocation;
 
 import 'constness.dart' show Constness;
@@ -194,7 +198,7 @@
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    var complexAssignment = startComplexAssignment(value);
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(value);
     return _finish(_makeSimpleWrite(value, voidContext, complexAssignment),
         complexAssignment);
   }
@@ -215,9 +219,9 @@
   Expression buildNullAwareAssignment(
       Expression value, DartType type, int offset,
       {bool voidContext: false}) {
-    var complexAssignment = startComplexAssignment(value);
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(value);
     if (voidContext) {
-      var nullAwareCombiner = _forest.createConditionalExpression(
+      Expression nullAwareCombiner = _forest.createConditionalExpression(
           buildIsNull(_makeRead(complexAssignment), offset, _helper),
           null,
           _makeWrite(value, false, complexAssignment),
@@ -227,8 +231,9 @@
       complexAssignment?.nullAwareCombiner = nullAwareCombiner;
       return _finish(nullAwareCombiner, complexAssignment);
     }
-    var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
-    var nullAwareCombiner = _forest.createConditionalExpression(
+    VariableDeclaration tmp =
+        new VariableDeclaration.forValue(_makeRead(complexAssignment));
+    Expression nullAwareCombiner = _forest.createConditionalExpression(
         buildIsNull(new VariableGet(tmp), offset, _helper),
         null,
         _makeWrite(value, false, complexAssignment),
@@ -247,11 +252,11 @@
       Procedure interfaceTarget,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
-    var complexAssignment = startComplexAssignment(value);
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(value);
     complexAssignment?.isPreIncDec = isPreIncDec;
     complexAssignment?.isPostIncDec = isPostIncDec;
-    var combiner = makeBinary(_makeRead(complexAssignment), binaryOperator,
-        interfaceTarget, value, _helper,
+    Expression combiner = makeBinary(_makeRead(complexAssignment),
+        binaryOperator, interfaceTarget, value, _helper,
         offset: offset);
     complexAssignment?.combiner = combiner;
     return _finish(_makeWrite(combiner, voidContext, complexAssignment),
@@ -286,18 +291,20 @@
           interfaceTarget: interfaceTarget,
           isPostIncDec: true);
     }
-    var rhs = _forest.createIntLiteral(1, null)..fileOffset = offset;
-    var complexAssignment = startComplexAssignment(rhs);
-    var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
+    IntLiteral rhs = _forest.createIntLiteral(1, null)..fileOffset = offset;
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(rhs);
+    VariableDeclaration value =
+        new VariableDeclaration.forValue(_makeRead(complexAssignment));
     valueAccess() => new VariableGet(value);
-    var combiner = makeBinary(
+    Expression combiner = makeBinary(
         valueAccess(), binaryOperator, interfaceTarget, rhs, _helper,
         offset: offset);
     complexAssignment?.combiner = combiner;
     complexAssignment?.isPostIncDec = true;
-    var dummy = new VariableDeclarationJudgment.forValue(
-        _makeWrite(combiner, true, complexAssignment),
-        _helper.functionNestingLevel);
+    VariableDeclarationJudgment dummy =
+        new VariableDeclarationJudgment.forValue(
+            _makeWrite(combiner, true, complexAssignment),
+            _helper.functionNestingLevel);
     return _finish(
         makeLet(value, makeLet(dummy, valueAccess())), complexAssignment);
   }
@@ -531,10 +538,10 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var fact = _helper.typePromoter
+    TypePromotionFact fact = _helper.typePromoter
         ?.getFactForAccess(variable, _helper.functionNestingLevel);
-    var scope = _helper.typePromoter?.currentScope;
-    var read = new VariableGetJudgment(variable, fact, scope)
+    TypePromotionScope scope = _helper.typePromoter?.currentScope;
+    VariableGetJudgment read = new VariableGetJudgment(variable, fact, scope)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -664,7 +671,7 @@
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiver, name, value, setter)
+    PropertySet write = new PropertySet(receiver, name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -672,7 +679,7 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new PropertyGet(receiverAccess(), name, getter)
+    PropertyGet read = new PropertyGet(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -681,7 +688,7 @@
   @override
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiverAccess(), name, value, setter)
+    PropertySet write = new PropertySet(receiverAccess(), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -780,7 +787,7 @@
     if (getter == null) {
       _helper.warnUnresolvedGet(name, offsetForToken(token));
     }
-    var read =
+    PropertyGet read =
         new PropertyGet(_forest.createThisExpression(token), name, getter)
           ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -793,7 +800,7 @@
     if (setter == null) {
       _helper.warnUnresolvedSet(name, offsetForToken(token));
     }
-    var write = new PropertySet(
+    PropertySet write = new PropertySet(
         _forest.createThisExpression(token), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -866,7 +873,7 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new PropertyGet(receiverAccess(), name, getter)
+    PropertyGet read = new PropertyGet(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -875,7 +882,7 @@
   @override
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiverAccess(), name, value, setter)
+    PropertySet write = new PropertySet(receiverAccess(), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -884,8 +891,8 @@
   @override
   Expression _finish(
       Expression body, ComplexAssignmentJudgment complexAssignment) {
-    var offset = offsetForToken(token);
-    var nullAwareGuard = _forest.createConditionalExpression(
+    int offset = offsetForToken(token);
+    Expression nullAwareGuard = _forest.createConditionalExpression(
         buildIsNull(receiverAccess(), offset, _helper),
         null,
         _forest.createNullLiteral(null)..fileOffset = offset,
@@ -955,8 +962,9 @@
       _helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
     }
     // TODO(ahe): Use [DirectPropertyGet] when possible.
-    var read = new SuperPropertyGetJudgment(name, interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
+    SuperPropertyGetJudgment read =
+        new SuperPropertyGetJudgment(name, interfaceTarget: getter)
+          ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
   }
@@ -968,7 +976,7 @@
       _helper.warnUnresolvedSet(name, offsetForToken(token), isSuper: true);
     }
     // TODO(ahe): Use [DirectPropertySet] when possible.
-    var write = new SuperPropertySet(name, value, setter)
+    SuperPropertySet write = new SuperPropertySet(name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -1048,8 +1056,8 @@
 
   @override
   Expression _makeSimpleRead() {
-    var read = new MethodInvocationJudgment(receiver, indexGetName,
-        _forest.createArguments(<Expression>[index], token),
+    MethodInvocationJudgment read = new MethodInvocationJudgment(receiver,
+        indexGetName, _forest.createArguments(<Expression>[index], token),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
     return read;
@@ -1059,7 +1067,9 @@
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(receiver, indexSetName,
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
+        receiver,
+        indexSetName,
         _forest.createArguments(<Expression>[index, value], token),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
@@ -1069,7 +1079,9 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new MethodInvocationJudgment(receiverAccess(), indexGetName,
+    MethodInvocationJudgment read = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexGetName,
         _forest.createArguments(<Expression>[indexAccess()], token),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
@@ -1081,7 +1093,9 @@
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(receiverAccess(), indexSetName,
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexSetName,
         _forest.createArguments(<Expression>[indexAccess(), value], token),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
@@ -1095,8 +1109,8 @@
       Expression value, ComplexAssignmentJudgment complexAssignment) {
     // The call to []= does not return the value like direct-style assignments
     // do.  We need to bind the value in a let.
-    var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new MethodInvocationJudgment(
+    VariableDeclaration valueVariable = new VariableDeclaration.forValue(value);
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         receiverAccess(),
         indexSetName,
         _forest.createArguments(
@@ -1104,8 +1118,9 @@
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new VariableDeclarationJudgment.forValue(
-        write, _helper.functionNestingLevel);
+    VariableDeclarationJudgment dummy =
+        new VariableDeclarationJudgment.forValue(
+            write, _helper.functionNestingLevel);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
@@ -1194,8 +1209,8 @@
 
   Expression _makeWriteAndReturn(
       Expression value, ComplexAssignmentJudgment complexAssignment) {
-    var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new MethodInvocationJudgment(
+    VariableDeclaration valueVariable = new VariableDeclaration.forValue(value);
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexSetName,
         _forest.createArguments(
@@ -1203,7 +1218,7 @@
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new VariableDeclaration.forValue(write);
+    VariableDeclaration dummy = new VariableDeclaration.forValue(write);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
@@ -1220,7 +1235,7 @@
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexSetName,
         _forest.createArguments(<Expression>[index, value], token),
@@ -1232,7 +1247,7 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new MethodInvocationJudgment(
+    MethodInvocationJudgment read = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexGetName,
         _forest.createArguments(<Expression>[indexAccess()], token),
@@ -1246,7 +1261,7 @@
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexSetName,
         _forest.createArguments(<Expression>[indexAccess(), value], token),
@@ -1311,19 +1326,19 @@
 
   Expression _makeWriteAndReturn(
       Expression value, ComplexAssignmentJudgment complexAssignment) {
-    var valueVariable = new VariableDeclaration.forValue(value);
+    VariableDeclaration valueVariable = new VariableDeclaration.forValue(value);
     if (setter == null) {
       _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
           isSuper: true);
     }
-    var write = new SuperMethodInvocation(
+    SuperMethodInvocation write = new SuperMethodInvocation(
         indexSetName,
         _forest.createArguments(
             <Expression>[indexAccess(), new VariableGet(valueVariable)], token),
         setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new VariableDeclaration.forValue(write);
+    VariableDeclaration dummy = new VariableDeclaration.forValue(write);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
@@ -1349,7 +1364,7 @@
       _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
           isSuper: true);
     }
-    var write = new SuperMethodInvocation(indexSetName,
+    SuperMethodInvocation write = new SuperMethodInvocation(indexSetName,
         _forest.createArguments(<Expression>[index, value], token), setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -1362,7 +1377,7 @@
       _helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
           isSuper: true);
     }
-    var read = new SuperMethodInvocation(indexGetName,
+    SuperMethodInvocation read = new SuperMethodInvocation(indexGetName,
         _forest.createArguments(<Expression>[indexAccess()], token), getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -1377,7 +1392,7 @@
       _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
           isSuper: true);
     }
-    var write = new SuperMethodInvocation(
+    SuperMethodInvocation write = new SuperMethodInvocation(
         indexSetName,
         _forest.createArguments(<Expression>[indexAccess(), value], token),
         setter)
@@ -1802,7 +1817,7 @@
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     builder.importDependency.targetLibrary;
-    var read = new LoadLibraryTearOffJudgment(
+    LoadLibraryTearOffJudgment read = new LoadLibraryTearOffJudgment(
         builder.importDependency, builder.createTearoffMethod(_helper.forest))
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -3266,7 +3281,7 @@
     sink.write(", name: ");
     sink.write(name.name);
     sink.write(", arguments: ");
-    var node = arguments;
+    Arguments node = arguments;
     if (node is Node) {
       printNodeOn(node, sink);
     } else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 2c7a1d3..dcfc73d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -56,9 +56,9 @@
   }
 
   void visitAssertStatementJudgment(AssertStatementJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
-    var messageJudgment = node.messageJudgment;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression conditionJudgment = node.conditionJudgment;
+    Expression messageJudgment = node.messageJudgment;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -77,7 +77,7 @@
     if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
       typeContext = inferrer.wrapFutureOrType(typeContext);
     }
-    var operand = node.operand;
+    Expression operand = node.operand;
     inferrer.inferExpression(operand, typeContext, true, isVoidAllowed: true);
     inferrer.storeInferredType(
         node,
@@ -86,7 +86,7 @@
   }
 
   void visitBlockJudgment(BlockJudgment node) {
-    for (var judgment in node.judgments) {
+    for (Statement judgment in node.judgments) {
       inferrer.inferStatement(judgment);
     }
   }
@@ -103,7 +103,7 @@
     node.inferredType =
         inferrer.inferExpression(node.targetJudgment, typeContext, true);
     node.variable.type = getInferredType(node, inferrer);
-    for (var judgment in node.cascadeJudgments) {
+    for (Expression judgment in node.cascadeJudgments) {
       inferrer.inferExpression(
           judgment, const UnknownType(), !inferrer.isTopLevel,
           isVoidAllowed: true);
@@ -114,10 +114,10 @@
   @override
   void visitConditionalExpression(
       ConditionalExpression node, DartType typeContext) {
-    var condition = node.condition;
-    var then = node.then;
-    var otherwise = node.otherwise;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression condition = node.condition;
+    Expression then = node.then;
+    Expression otherwise = node.otherwise;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(condition, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
         expectedType,
@@ -135,7 +135,7 @@
   @override
   void visitConstructorInvocation(
       ConstructorInvocation node, DartType typeContext) {
-    var library = inferrer.engine.beingInferred[node.target];
+    LibraryBuilder library = inferrer.engine.beingInferred[node.target];
     if (library != null) {
       // There is a cyclic dependency where inferring the types of the
       // initializing formals of a constructor required us to infer the
@@ -152,26 +152,30 @@
           node.target.fileOffset,
           name.length,
           node.target.fileUri);
-      for (var declaration in node.target.function.positionalParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.positionalParameters) {
         declaration.type ??= const InvalidType();
       }
-      for (var declaration in node.target.function.namedParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.namedParameters) {
         declaration.type ??= const InvalidType();
       }
     } else if ((library = inferrer.engine.toBeInferred[node.target]) != null) {
       inferrer.engine.toBeInferred.remove(node.target);
       inferrer.engine.beingInferred[node.target] = library;
-      for (var declaration in node.target.function.positionalParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.positionalParameters) {
         inferrer.engine.inferInitializingFormal(declaration, node.target);
       }
-      for (var declaration in node.target.function.namedParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.namedParameters) {
         inferrer.engine.inferInitializingFormal(declaration, node.target);
       }
       inferrer.engine.beingInferred.remove(node.target);
     }
     bool hasExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    var inferenceResult = inferrer.inferInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
         node.target.function.functionType,
@@ -196,16 +200,16 @@
       DeferredCheckJudgment node, DartType typeContext) {
     // Since the variable is not used in the body we don't need to type infer
     // it.  We can just type infer the body.
-    var judgment = node.judgment;
+    Expression judgment = node.judgment;
     inferrer.inferExpression(judgment, typeContext, true, isVoidAllowed: true);
     node.inferredType = getInferredType(judgment, inferrer);
     return null;
   }
 
   void visitDoJudgment(DoJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
+    Expression conditionJudgment = node.conditionJudgment;
     inferrer.inferStatement(node.body);
-    var boolType = inferrer.coreTypes.boolClass.rawType;
+    InterfaceType boolType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(conditionJudgment, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
         boolType,
@@ -232,7 +236,7 @@
       FactoryConstructorInvocationJudgment node, DartType typeContext) {
     bool hadExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    var inferenceResult = inferrer.inferInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
         node.target.function.functionType,
@@ -252,7 +256,7 @@
   }
 
   void visitShadowFieldInitializer(ShadowFieldInitializer node) {
-    var initializerType =
+    DartType initializerType =
         inferrer.inferExpression(node.value, node.field.type, true);
     inferrer.ensureAssignable(
         node.field.type, initializerType, node.value, node.fileOffset);
@@ -410,7 +414,7 @@
   }
 
   void visitForJudgment(ForJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
+    Expression conditionJudgment = node.conditionJudgment;
     for (VariableDeclaration variable in node.variables) {
       if (variable.name == null) {
         Expression initializer = variable.initializer;
@@ -424,7 +428,7 @@
       }
     }
     if (conditionJudgment != null) {
-      var expectedType = inferrer.coreTypes.boolClass.rawType;
+      InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
       inferrer.inferExpression(
           conditionJudgment, expectedType, !inferrer.isTopLevel);
       inferrer.ensureAssignable(
@@ -433,7 +437,7 @@
           node.condition,
           node.condition.fileOffset);
     }
-    for (var update in node.updateJudgments) {
+    for (Expression update in node.updateJudgments) {
       inferrer.inferExpression(
           update, const UnknownType(), !inferrer.isTopLevel,
           isVoidAllowed: true);
@@ -454,22 +458,22 @@
     inferrer.inferMetadataKeepingHelper(node.variable.annotations);
     DartType returnContext =
         node._hasImplicitReturnType ? null : node.function.returnType;
-    var inferenceResult = visitFunctionNodeJudgment(
+    ExpressionInferenceResult inferenceResult = visitFunctionNodeJudgment(
         node.functionJudgment, null, returnContext, node.fileOffset);
     node.variable.type = inferenceResult.type;
   }
 
   @override
   void visitFunctionExpression(FunctionExpression node, DartType typeContext) {
-    var inferenceResult = visitFunctionNodeJudgment(
+    ExpressionInferenceResult inferenceResult = visitFunctionNodeJudgment(
         node.function, typeContext, null, node.fileOffset);
     inferrer.storeInferredType(node, inferenceResult.type);
   }
 
   void visitInvalidSuperInitializerJudgment(
       InvalidSuperInitializerJudgment node) {
-    var substitution = Substitution.fromSupertype(inferrer.classHierarchy
-        .getClassAsInstanceOf(
+    Substitution substitution = Substitution.fromSupertype(
+        inferrer.classHierarchy.getClassAsInstanceOf(
             inferrer.thisType.classNode, node.target.enclosingClass));
     inferrer.inferInvocation(
         null,
@@ -482,12 +486,12 @@
   }
 
   void visitIfNullJudgment(IfNullJudgment node, DartType typeContext) {
-    var leftJudgment = node.leftJudgment;
-    var rightJudgment = node.rightJudgment;
+    Expression leftJudgment = node.leftJudgment;
+    Expression rightJudgment = node.rightJudgment;
     // To infer `e0 ?? e1` in context K:
     // - Infer e0 in context K to get T0
     inferrer.inferExpression(leftJudgment, typeContext, true);
-    var lhsType = getInferredType(leftJudgment, inferrer);
+    DartType lhsType = getInferredType(leftJudgment, inferrer);
     node.variable.type = lhsType;
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
@@ -498,7 +502,7 @@
       inferrer.inferExpression(rightJudgment, typeContext, true,
           isVoidAllowed: true);
     }
-    var rhsType = getInferredType(rightJudgment, inferrer);
+    DartType rhsType = getInferredType(rightJudgment, inferrer);
     // - Let T = greatest closure of K with respect to `?` if K is not `_`, else
     //   UP(t0, t1)
     // - Then the inferred type is T.
@@ -509,8 +513,8 @@
   }
 
   void visitIfJudgment(IfJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression conditionJudgment = node.conditionJudgment;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -539,13 +543,13 @@
 
   void visitIndexAssignmentJudgment(
       IndexAssignmentJudgment node, DartType typeContext) {
-    var receiverType = node._inferReceiver(inferrer);
-    var writeMember =
+    DartType receiverType = node._inferReceiver(inferrer);
+    Object writeMember =
         inferrer.findMethodInvocationMember(receiverType, node.write);
     // To replicate analyzer behavior, we base type inference on the write
     // member.  TODO(paulberry): would it be better to use the read member
     // when doing compound assignment?
-    var calleeType = inferrer.getCalleeFunctionType(
+    FunctionType calleeType = inferrer.getCalleeFunctionType(
         inferrer.getCalleeType(writeMember, receiverType), false);
     DartType expectedIndexTypeForWrite;
     DartType indexContext = const UnknownType();
@@ -558,7 +562,7 @@
       writeContext = calleeType.positionalParameters[1];
     }
     inferrer.inferExpression(node.index, indexContext, true);
-    var indexType = getInferredType(node.index, inferrer);
+    DartType indexType = getInferredType(node.index, inferrer);
     node._storeLetType(inferrer, node.index, indexType);
     if (writeContext is! UnknownType) {
       inferrer.ensureAssignable(
@@ -570,9 +574,9 @@
     InvocationExpression read = node.read;
     DartType readType;
     if (read != null) {
-      var readMember = inferrer.findMethodInvocationMember(receiverType, read,
-          instrumented: false);
-      var calleeFunctionType = inferrer.getCalleeFunctionType(
+      Object readMember = inferrer
+          .findMethodInvocationMember(receiverType, read, instrumented: false);
+      FunctionType calleeFunctionType = inferrer.getCalleeFunctionType(
           inferrer.getCalleeType(readMember, receiverType), false);
       inferrer.ensureAssignable(
           getPositionalParameterType(calleeFunctionType, 0),
@@ -580,10 +584,12 @@
           node._getInvocationArguments(inferrer, read).positional[0],
           read.fileOffset);
       readType = calleeFunctionType.returnType;
-      var desugaredInvocation = read is MethodInvocation ? read : null;
-      var checkKind = inferrer.preCheckInvocationContravariance(node.receiver,
-          receiverType, readMember, desugaredInvocation, read.arguments, read);
-      var replacedRead = inferrer.handleInvocationContravariance(
+      MethodInvocation desugaredInvocation =
+          read is MethodInvocation ? read : null;
+      MethodContravarianceCheckKind checkKind =
+          inferrer.preCheckInvocationContravariance(node.receiver, receiverType,
+              readMember, desugaredInvocation, read.arguments, read);
+      Expression replacedRead = inferrer.handleInvocationContravariance(
           checkKind,
           desugaredInvocation,
           read.arguments,
@@ -855,8 +861,8 @@
 
   void visitListLiteralJudgment(
       ListLiteralJudgment node, DartType typeContext) {
-    var listClass = inferrer.coreTypes.listClass;
-    var listType = listClass.thisType;
+    Class listClass = inferrer.coreTypes.listClass;
+    InterfaceType listType = listClass.thisType;
     List<DartType> inferredTypes;
     DartType inferredTypeArgument;
     List<DartType> formalTypes;
@@ -930,9 +936,9 @@
 
   @override
   void visitLogicalExpression(LogicalExpression node, DartType typeContext) {
-    var boolType = inferrer.coreTypes.boolClass.rawType;
-    var left = node.left;
-    var right = node.right;
+    InterfaceType boolType = inferrer.coreTypes.boolClass.rawType;
+    Expression left = node.left;
+    Expression right = node.right;
     inferrer.inferExpression(left, boolType, !inferrer.isTopLevel);
     inferrer.inferExpression(right, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, getInferredType(left, inferrer),
@@ -1267,8 +1273,8 @@
   }
 
   void visitMapLiteralJudgment(MapLiteralJudgment node, DartType typeContext) {
-    var mapClass = inferrer.coreTypes.mapClass;
-    var mapType = mapClass.thisType;
+    Class mapClass = inferrer.coreTypes.mapClass;
+    InterfaceType mapType = mapClass.thisType;
     List<DartType> inferredTypes;
     DartType inferredKeyType;
     DartType inferredValueType;
@@ -1551,7 +1557,7 @@
         }
       }
     }
-    var inferenceResult = inferrer.inferMethodInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferMethodInvocation(
         node, node.receiver, node.fileOffset, node._isImplicitCall, typeContext,
         desugaredInvocation: node);
     node.inferredType = inferenceResult.type;
@@ -1568,8 +1574,8 @@
 
   @override
   void visitNot(Not node, DartType typeContext) {
-    var operand = node.operand;
-    var boolType = inferrer.coreTypes.boolClass.rawType;
+    Expression operand = node.operand;
+    InterfaceType boolType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(operand, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, getInferredType(operand, inferrer),
         node.operand, node.fileOffset);
@@ -1577,7 +1583,7 @@
 
   void visitNullAwareMethodInvocationJudgment(
       NullAwareMethodInvocationJudgment node, DartType typeContext) {
-    var inferenceResult = inferrer.inferMethodInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferMethodInvocation(
         node, node.variable.initializer, node.fileOffset, false, typeContext,
         receiverVariable: node.variable,
         desugaredInvocation: node._desugaredInvocation);
@@ -1615,12 +1621,12 @@
 
   void visitPropertyAssignmentJudgment(
       PropertyAssignmentJudgment node, DartType typeContext) {
-    var receiverType = node._inferReceiver(inferrer);
+    DartType receiverType = node._inferReceiver(inferrer);
 
     DartType readType;
     if (node.read != null) {
-      var readMember = inferrer.findPropertyGetMember(receiverType, node.read,
-          instrumented: false);
+      Object readMember = inferrer
+          .findPropertyGetMember(receiverType, node.read, instrumented: false);
       readType = inferrer.getCalleeType(readMember, receiverType);
       inferrer.handlePropertyGetContravariance(
           node.receiver,
@@ -1638,7 +1644,7 @@
     // To replicate analyzer behavior, we base type inference on the write
     // member.  TODO(paulberry): would it be better to use the read member when
     // doing compound assignment?
-    var writeContext = inferrer.getSetterType(writeMember, receiverType);
+    DartType writeContext = inferrer.getSetterType(writeMember, receiverType);
     node._inferRhs(inferrer, readType, writeContext);
     node.nullAwareGuard?.staticType = node.inferredType;
     node._replaceWithDesugared();
@@ -1676,8 +1682,8 @@
   void visitRethrow(Rethrow node, DartType typeContext) {}
 
   void visitReturnJudgment(ReturnJudgment node) {
-    var judgment = node.judgment;
-    var closureContext = inferrer.closureContext;
+    Expression judgment = node.judgment;
+    ClosureContext closureContext = inferrer.closureContext;
     DartType typeContext = !closureContext.isGenerator
         ? closureContext.returnOrYieldContext
         : const UnknownType();
@@ -1694,8 +1700,8 @@
   }
 
   void visitSetLiteralJudgment(SetLiteralJudgment node, DartType typeContext) {
-    var setClass = inferrer.coreTypes.setClass;
-    var setType = setClass.thisType;
+    Class setClass = inferrer.coreTypes.setClass;
+    InterfaceType setType = setClass.thisType;
     List<DartType> inferredTypes;
     DartType inferredTypeArgument;
     List<DartType> formalTypes;
@@ -1772,14 +1778,14 @@
   void visitStaticAssignmentJudgment(
       StaticAssignmentJudgment node, DartType typeContext) {
     DartType readType = const DynamicType(); // Only used in error recovery
-    var read = node.read;
+    Expression read = node.read;
     if (read is StaticGet) {
       readType = read.target.getterType;
       node._storeLetType(inferrer, read, readType);
     }
     Member writeMember;
     DartType writeContext = const UnknownType();
-    var write = node.write;
+    Expression write = node.write;
     if (write is StaticSet) {
       writeContext = write.target.setterType;
       writeMember = write.target;
@@ -1792,9 +1798,9 @@
 
   @override
   void visitStaticGet(StaticGet node, DartType typeContext) {
-    var target = node.target;
+    Member target = node.target;
     TypeInferenceEngine.resolveInferenceNode(target);
-    var type = target.getterType;
+    DartType type = target.getterType;
     if (target is Procedure && target.kind == ProcedureKind.Method) {
       type = inferrer.instantiateTearOff(type, typeContext, node);
     }
@@ -1808,8 +1814,12 @@
         : new FunctionType([], const DynamicType());
     bool hadExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    var inferenceResult = inferrer.inferInvocation(typeContext, node.fileOffset,
-        calleeType, calleeType.returnType, node.arguments);
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
+        typeContext,
+        node.fileOffset,
+        calleeType,
+        calleeType.returnType,
+        node.arguments);
     inferrer.storeInferredType(node, inferenceResult.type);
     if (!hadExplicitTypeArguments && node.target != null) {
       inferrer.library?.checkBoundsInStaticInvocation(
@@ -1822,7 +1832,7 @@
   void visitStringConcatenation(
       StringConcatenation node, DartType typeContext) {
     if (!inferrer.isTopLevel) {
-      for (var expression in node.expressions) {
+      for (Expression expression in node.expressions) {
         inferrer.inferExpression(
             expression, const UnknownType(), !inferrer.isTopLevel);
       }
@@ -1833,8 +1843,8 @@
   void visitStringLiteral(StringLiteral node, DartType typeContext) {}
 
   void visitSuperInitializerJudgment(SuperInitializerJudgment node) {
-    var substitution = Substitution.fromSupertype(inferrer.classHierarchy
-        .getClassAsInstanceOf(
+    Substitution substitution = Substitution.fromSupertype(
+        inferrer.classHierarchy.getClassAsInstanceOf(
             inferrer.thisType.classNode, node.target.enclosingClass));
     inferrer.inferInvocation(
         null,
@@ -1852,7 +1862,7 @@
       inferrer.instrumentation?.record(inferrer.uri, node.fileOffset, 'target',
           new InstrumentationValueForMember(node.interfaceTarget));
     }
-    var inferenceResult = inferrer.inferMethodInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferMethodInvocation(
         node, null, node.fileOffset, false, typeContext,
         interfaceMember: node.interfaceTarget,
         methodName: node.name,
@@ -1871,12 +1881,12 @@
   }
 
   void visitSwitchStatementJudgment(SwitchStatementJudgment node) {
-    var expressionJudgment = node.expressionJudgment;
+    Expression expressionJudgment = node.expressionJudgment;
     inferrer.inferExpression(expressionJudgment, const UnknownType(), true);
-    var expressionType = getInferredType(expressionJudgment, inferrer);
+    DartType expressionType = getInferredType(expressionJudgment, inferrer);
 
-    for (var switchCase in node.caseJudgments) {
-      for (var caseExpression in switchCase.expressionJudgments) {
+    for (SwitchCaseJudgment switchCase in node.caseJudgments) {
+      for (Expression caseExpression in switchCase.expressionJudgments) {
         DartType caseExpressionType =
             inferrer.inferExpression(caseExpression, expressionType, true);
 
@@ -1958,7 +1968,7 @@
 
   void visitTryCatchJudgment(TryCatchJudgment node) {
     inferrer.inferStatement(node.body);
-    for (var catch_ in node.catchJudgments) {
+    for (CatchJudgment catch_ in node.catchJudgments) {
       visitCatchJudgment(catch_);
     }
   }
@@ -1977,12 +1987,12 @@
   void visitVariableAssignmentJudgment(
       VariableAssignmentJudgment node, DartType typeContext) {
     DartType readType;
-    var read = node.read;
+    Expression read = node.read;
     if (read is VariableGet) {
       readType = read.promotedType ?? read.variable.type;
     }
     DartType writeContext = const UnknownType();
-    var write = node.write;
+    Expression write = node.write;
     if (write is VariableSet) {
       writeContext = write.variable.type;
       if (read != null) {
@@ -1995,8 +2005,9 @@
   }
 
   void visitVariableDeclarationJudgment(VariableDeclarationJudgment node) {
-    var initializerJudgment = node.initializerJudgment;
-    var declaredType = node._implicitlyTyped ? const UnknownType() : node.type;
+    Expression initializerJudgment = node.initializerJudgment;
+    DartType declaredType =
+        node._implicitlyTyped ? const UnknownType() : node.type;
     DartType inferredType;
     DartType initializerType;
     if (initializerJudgment != null) {
@@ -2014,7 +2025,7 @@
       node.type = inferredType;
     }
     if (node.initializer != null) {
-      var replacedInitializer = inferrer.ensureAssignable(
+      Expression replacedInitializer = inferrer.ensureAssignable(
           node.type, initializerType, node.initializer, node.fileOffset,
           isVoidAllowed: node.type is VoidType);
       if (replacedInitializer != null) {
@@ -2033,7 +2044,7 @@
 
   void visitUnresolvedTargetInvocationJudgment(
       UnresolvedTargetInvocationJudgment node, DartType typeContext) {
-    var result = visitSyntheticExpressionJudgment(node, typeContext);
+    void result = visitSyntheticExpressionJudgment(node, typeContext);
     inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
@@ -2065,7 +2076,7 @@
           'promotedType', new InstrumentationValueForType(promotedType));
     }
     node.promotedType = promotedType;
-    var type = promotedType ?? declaredOrInferredType;
+    DartType type = promotedType ?? declaredOrInferredType;
     if (variable._isLocalFunction) {
       type = inferrer.instantiateTearOff(type, typeContext, node);
     }
@@ -2074,8 +2085,8 @@
   }
 
   void visitWhileJudgment(WhileJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression conditionJudgment = node.conditionJudgment;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -2087,10 +2098,10 @@
   }
 
   void visitYieldJudgment(YieldJudgment node) {
-    var judgment = node.judgment;
-    var closureContext = inferrer.closureContext;
+    Expression judgment = node.judgment;
+    ClosureContext closureContext = inferrer.closureContext;
     if (closureContext.isGenerator) {
-      var typeContext = closureContext.returnOrYieldContext;
+      DartType typeContext = closureContext.returnOrYieldContext;
       if (node.isYieldStar && typeContext != null) {
         typeContext = inferrer.wrapType(
             typeContext,
@@ -2111,7 +2122,7 @@
     node.inferredType =
         inferrer.typeSchemaEnvironment.futureType(const DynamicType());
     if (node.arguments != null) {
-      var calleeType = new FunctionType([], node.inferredType);
+      FunctionType calleeType = new FunctionType([], node.inferredType);
       inferrer.inferInvocation(typeContext, node.fileOffset, calleeType,
           calleeType.returnType, node.argumentJudgments);
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index db9a1c5..00f8141 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -33,6 +33,8 @@
         InstrumentationValueForType,
         InstrumentationValueForTypeArgs;
 
+import '../builder/library_builder.dart' show LibraryBuilder;
+
 import '../fasta_codes.dart'
     show
         messageCantDisambiguateAmbiguousInformation,
@@ -65,7 +67,12 @@
     show IncludesTypeParametersNonCovariantly, TypeInferenceEngine;
 
 import '../type_inference/type_inferrer.dart'
-    show ExpressionInferenceResult, TypeInferrer, TypeInferrerImpl;
+    show
+        ClosureContext,
+        ExpressionInferenceResult,
+        MethodContravarianceCheckKind,
+        TypeInferrer,
+        TypeInferrerImpl;
 
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromoterImpl, TypePromotionFact, TypePromotionScope;
@@ -323,7 +330,7 @@
   ComplexAssignmentJudgment._(this.rhs) : super._(null);
 
   String toString() {
-    var parts = _getToStringParts();
+    List<String> parts = _getToStringParts();
     return '${runtimeType}(${parts.join(', ')})';
   }
 
@@ -350,7 +357,7 @@
       inferrer.helper
           ?.addProblem(messageVoidExpression, read.fileOffset, noLength);
     }
-    var writeOffset = write == null ? -1 : write.fileOffset;
+    int writeOffset = write == null ? -1 : write.fileOffset;
     Procedure combinerMember;
     DartType combinedType;
     if (combiner != null) {
@@ -362,7 +369,7 @@
             .isOverloadedArithmeticOperatorAndType(combinerMember, readType);
       }
       DartType rhsType;
-      var combinerType = inferrer.getCalleeFunctionType(
+      FunctionType combinerType = inferrer.getCalleeFunctionType(
           inferrer.getCalleeType(combinerMember, readType), false);
       if (isPreIncDec || isPostIncDec) {
         rhsType = inferrer.coreTypes.intClass.rawType;
@@ -377,7 +384,7 @@
         rhsType = getInferredType(rhs, inferrer);
         // Do not use rhs after this point because it may be a Shadow node
         // that has been replaced in the tree with its desugaring.
-        var expectedType = getPositionalParameterType(combinerType, 0);
+        DartType expectedType = getPositionalParameterType(combinerType, 0);
         inferrer.ensureAssignable(expectedType, rhsType,
             combiner.arguments.positional.first, combiner.fileOffset);
       }
@@ -387,9 +394,10 @@
       } else {
         combinedType = combinerType.returnType;
       }
-      var checkKind = inferrer.preCheckInvocationContravariance(read, readType,
-          combinerMember, combiner, combiner.arguments, combiner);
-      var replacedCombiner = inferrer.handleInvocationContravariance(
+      MethodContravarianceCheckKind checkKind =
+          inferrer.preCheckInvocationContravariance(read, readType,
+              combinerMember, combiner, combiner.arguments, combiner);
+      Expression replacedCombiner = inferrer.handleInvocationContravariance(
           checkKind,
           combiner,
           combiner.arguments,
@@ -397,7 +405,7 @@
           combinedType,
           combinerType,
           combiner.fileOffset);
-      var replacedCombiner2 = inferrer.ensureAssignable(
+      Expression replacedCombiner2 = inferrer.ensureAssignable(
           writeContext, combinedType, replacedCombiner, writeOffset);
       if (replacedCombiner2 != null) {
         replacedCombiner = replacedCombiner2;
@@ -406,8 +414,8 @@
     } else {
       inferrer.inferExpression(rhs, writeContext ?? const UnknownType(), true,
           isVoidAllowed: true);
-      var rhsType = getInferredType(rhs, inferrer);
-      var replacedRhs = inferrer.ensureAssignable(
+      DartType rhsType = getInferredType(rhs, inferrer);
+      Expression replacedRhs = inferrer.ensureAssignable(
           writeContext, rhsType, rhs, writeOffset,
           isVoidAllowed: writeContext is VoidType);
       _storeLetType(inferrer, replacedRhs ?? rhs, rhsType);
@@ -453,7 +461,7 @@
 
   @override
   List<String> _getToStringParts() {
-    var parts = super._getToStringParts();
+    List<String> parts = super._getToStringParts();
     if (receiver != null) parts.add('receiver=$receiver');
     if (isSuper) parts.add('isSuper=true');
     return parts;
@@ -462,7 +470,7 @@
   DartType _inferReceiver(ShadowTypeInferrer inferrer) {
     if (receiver != null) {
       inferrer.inferExpression(receiver, const UnknownType(), true);
-      var receiverType = getInferredType(receiver, inferrer);
+      DartType receiverType = getInferredType(receiver, inferrer);
       _storeLetType(inferrer, receiver, receiverType);
       return receiverType;
     } else if (isSuper) {
@@ -750,7 +758,7 @@
 
   @override
   List<String> _getToStringParts() {
-    var parts = super._getToStringParts();
+    List<String> parts = super._getToStringParts();
     if (index != null) parts.add('index=$index');
     return parts;
   }
@@ -1029,7 +1037,7 @@
 
   @override
   List<String> _getToStringParts() {
-    var parts = super._getToStringParts();
+    List<String> parts = super._getToStringParts();
     if (nullAwareGuard != null) parts.add('nullAwareGuard=$nullAwareGuard');
     return parts;
   }
@@ -1256,7 +1264,7 @@
     while (true) {
       if (desugared is Let) {
         Let desugaredLet = desugared;
-        var variable = desugaredLet.variable;
+        VariableDeclaration variable = desugaredLet.variable;
         if (identical(variable.initializer, expression)) {
           variable.type = type;
           return;
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 1fcfc87..b1ff995 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -118,6 +118,9 @@
 
           default:
             fileUri = uri;
+            // Check for empty package name entry (redirecting to package name
+            // from which we should get the fragment part).
+            packageFragment = target.uriTranslator?.getDefaultPackageFragment();
             break;
         }
       }
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index 9a462ff..c7899be 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -915,7 +915,7 @@
     }
     parser.reportRecoverableErrorWithToken(next, fasta.templateExpectedType);
     if (!isOneOfOrEof(
-        next, const ['>', ')', '[', ']', '[]', '{', '}', ',', ';'])) {
+        next, const ['<', '>', ')', '[', ']', '[]', '{', '}', ',', ';'])) {
       // When in doubt, consume the token to ensure we make progress
       token = next;
       next = token.next;
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 7b7f7a7..affb84563 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -688,8 +688,9 @@
   /// Recover given out-of-order clauses in an import directive where [token] is
   /// the import keyword.
   Token parseImportRecovery(Token token) {
-    final primaryListener = listener;
-    final recoveryListener = new ImportRecoveryListener();
+    final Listener primaryListener = listener;
+    final ImportRecoveryListener recoveryListener =
+        new ImportRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener
@@ -1817,8 +1818,9 @@
 
   /// Recover given out-of-order clauses in a class header.
   Token parseClassHeaderRecovery(Token token, Token begin, Token classKeyword) {
-    final primaryListener = listener;
-    final recoveryListener = new ClassHeaderRecoveryListener();
+    final Listener primaryListener = listener;
+    final ClassHeaderRecoveryListener recoveryListener =
+        new ClassHeaderRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener.
@@ -1977,8 +1979,9 @@
 
   Token parseMixinHeaderRecovery(
       Token token, Token mixinKeyword, Token headerStart) {
-    final primaryListener = listener;
-    final recoveryListener = new MixinHeaderRecoveryListener();
+    final Listener primaryListener = listener;
+    final MixinHeaderRecoveryListener recoveryListener =
+        new MixinHeaderRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener.
@@ -3729,7 +3732,7 @@
       return parseExpressionStatementOrDeclarationAfterModifiers(
           token, token, null, null, null, false);
     }
-    final value = token.next.stringValue;
+    final String value = token.next.stringValue;
     if (identical(value, '{')) {
       // The scanner ensures that `{` always has a closing `}`.
       return parseBlock(token, null);
@@ -4243,7 +4246,7 @@
   }
 
   Token parsePrimary(Token token, IdentifierContext context) {
-    final kind = token.next.kind;
+    final int kind = token.next.kind;
     if (kind == IDENTIFIER_TOKEN) {
       return parseSendOrFunctionLiteral(token, context);
     } else if (kind == INT_TOKEN || kind == HEXADECIMAL_TOKEN) {
@@ -4468,8 +4471,8 @@
         }
         // This looks like the start of an expression.
         // Report an error, insert the comma, and continue parsing.
-        var comma = new SyntheticToken(TokenType.COMMA, next.offset);
-        var message = ifCount > 0
+        SyntheticToken comma = new SyntheticToken(TokenType.COMMA, next.offset);
+        Message message = ifCount > 0
             ? fasta.messageExpectedElseOrComma
             : fasta.templateExpectedButGot.withArguments(',');
         next = rewriteAndRecover(token, message, comma);
@@ -4492,7 +4495,7 @@
       return next;
     }
 
-    final old = mayParseFunctionExpressions;
+    final bool old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
     int count = 0;
     // TODO(danrubel): hasSetEntry parameter exists for replicating existing
@@ -4506,7 +4509,7 @@
         // TODO(danrubel): Remove this section and use the while loop below
         // once hasSetEntry is no longer needed.
         token = parseExpression(token);
-        var isMapEntry = optional(':', token.next);
+        bool isMapEntry = optional(':', token.next);
         hasSetEntry ??= !isMapEntry;
         if (isMapEntry) {
           Token colon = token.next;
@@ -4550,8 +4553,9 @@
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           // TODO(danrubel): Consider better error message
-          var comma = new SyntheticToken(TokenType.COMMA, next.offset);
-          var message = ifCount > 0
+          SyntheticToken comma =
+              new SyntheticToken(TokenType.COMMA, next.offset);
+          Message message = ifCount > 0
               ? fasta.messageExpectedElseOrComma
               : fasta.templateExpectedButGot.withArguments(',');
           token = rewriteAndRecover(token, message, comma);
@@ -4868,7 +4872,7 @@
     // Parsing the prefix, for instance 'x of 'x${id}y${id}z'
     int interpolationCount = 0;
     Token next = token.next;
-    var kind = next.kind;
+    int kind = next.kind;
     while (kind != EOF_TOKEN) {
       if (identical(kind, STRING_INTERPOLATION_TOKEN)) {
         // Parsing ${expression}.
@@ -5285,7 +5289,7 @@
         // look past the next expression
         // to determine if this is part of a conditional expression
         //
-        final originalListener = listener;
+        Listener originalListener = listener;
         listener = new ForwardingListener();
         // TODO(danrubel): consider using TokenStreamGhostWriter here
         Token afterExpression =
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index a10dea0..dab1b69 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -67,11 +67,12 @@
 
   /// Returns the set of type constraints that was gathered.
   Map<TypeParameter, TypeConstraint> computeConstraints() {
-    var result = <TypeParameter, TypeConstraint>{};
-    for (var parameter in _parametersToConstrain) {
+    Map<TypeParameter, TypeConstraint> result =
+        <TypeParameter, TypeConstraint>{};
+    for (TypeParameter parameter in _parametersToConstrain) {
       result[parameter] = new TypeConstraint();
     }
-    for (var protoConstraint in _protoConstraints) {
+    for (_ProtoConstraint protoConstraint in _protoConstraints) {
       if (protoConstraint.isUpper) {
         addUpperBound(result[protoConstraint.parameter], protoConstraint.bound);
       } else {
@@ -133,9 +134,11 @@
       return false;
     }
     if (subtype.typeParameters.isNotEmpty) {
-      var subtypeSubstitution = <TypeParameter, DartType>{};
-      var supertypeSubstitution = <TypeParameter, DartType>{};
-      var freshTypeVariables = <TypeParameter>[];
+      Map<TypeParameter, DartType> subtypeSubstitution =
+          <TypeParameter, DartType>{};
+      Map<TypeParameter, DartType> supertypeSubstitution =
+          <TypeParameter, DartType>{};
+      List<TypeParameter> freshTypeVariables = <TypeParameter>[];
       if (!_matchTypeFormals(subtype.typeParameters, supertype.typeParameters,
           subtypeSubstitution, supertypeSubstitution, freshTypeVariables)) {
         return false;
@@ -155,8 +158,8 @@
 
     // Test the parameter types.
     for (int i = 0; i < supertype.positionalParameters.length; ++i) {
-      var supertypeParameter = supertype.positionalParameters[i];
-      var subtypeParameter = subtype.positionalParameters[i];
+      DartType supertypeParameter = supertype.positionalParameters[i];
+      DartType subtypeParameter = subtype.positionalParameters[i];
       // Termination: Both types shrink in size.
       if (!_isSubtypeMatch(supertypeParameter, subtypeParameter)) {
         return false;
@@ -201,7 +204,7 @@
     // of supertypes of a given type more than once, the order of the checks
     // above is irrelevant; we just need to find the matched superclass,
     // substitute, and then iterate through type variables.
-    var matchingSupertypeOfSubtype =
+    InterfaceType matchingSupertypeOfSubtype =
         getTypeAsInstanceOf(subtype, supertype.classNode);
     if (matchingSupertypeOfSubtype == null) return false;
     for (int i = 0; i < supertype.classNode.typeParameters.length; i++) {
@@ -266,14 +269,14 @@
     // Handle FutureOr<T> union type.
     if (subtype is InterfaceType &&
         identical(subtype.classNode, futureOrClass)) {
-      var subtypeArg = subtype.typeArguments[0];
+      DartType subtypeArg = subtype.typeArguments[0];
       if (supertype is InterfaceType &&
           identical(supertype.classNode, futureOrClass)) {
         // `FutureOr<P>` is a subtype match for `FutureOr<Q>` with respect to
         // `L` under constraints `C`:
         // - If `P` is a subtype match for `Q` with respect to `L` under
         //   constraints `C`.
-        var supertypeArg = supertype.typeArguments[0];
+        DartType supertypeArg = supertype.typeArguments[0];
         return _isSubtypeMatch(subtypeArg, supertypeArg);
       }
 
@@ -283,7 +286,7 @@
       //   constraints `C0`.
       // - And `P` is a subtype match for `Q` with respect to `L` under
       //   constraints `C1`.
-      var subtypeFuture = futureType(subtypeArg);
+      InterfaceType subtypeFuture = futureType(subtypeArg);
       return _isSubtypeMatch(subtypeFuture, supertype) &&
           _isSubtypeMatch(subtypeArg, supertype);
     }
@@ -298,8 +301,8 @@
       //   under constraints `C`
       //   - And `P` is a subtype match for `Q` with respect to `L` under
       //     constraints `C`
-      var supertypeArg = supertype.typeArguments[0];
-      var supertypeFuture = futureType(supertypeArg);
+      DartType supertypeArg = supertype.typeArguments[0];
+      InterfaceType supertypeFuture = futureType(supertypeArg);
       return trySubtypeMatch(subtype, supertypeFuture) ||
           _isSubtypeMatch(subtype, supertypeArg);
     }
@@ -342,9 +345,9 @@
     //   and `F` is a subtype match for a type `Q` with respect to `L` under
     //   constraints `C`.
     if (subtype is InterfaceType) {
-      var callMember = getInterfaceMember(subtype.classNode, callName);
+      Member callMember = getInterfaceMember(subtype.classNode, callName);
       if (callMember is Procedure && !callMember.isGetter) {
-        var callType = callMember.getterType;
+        DartType callType = callMember.getterType;
         if (callType != null) {
           callType =
               Substitution.fromInterfaceType(subtype).substituteType(callType);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 0bd0d70..7c8edce 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -56,7 +56,7 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/type_algebra.dart'
-    show getFreshTypeParameters, Substitution;
+    show FreshTypeParameters, getFreshTypeParameters, Substitution;
 
 import 'package:kernel/src/bounds_checks.dart' show calculateBounds;
 
@@ -132,13 +132,14 @@
     show
         getNamedParameterType,
         getPositionalParameterType,
+        TypeConstraint,
         TypeVariableEliminator,
         TypeSchemaEnvironment;
 
 /// Given a [FunctionNode], gets the named parameter identified by [name], or
 /// `null` if there is no parameter with the given name.
 VariableDeclaration getNamedFormal(FunctionNode function, String name) {
-  for (var formal in function.namedParameters) {
+  for (VariableDeclaration formal in function.namedParameters) {
     if (formal.name == name) return formal;
   }
   return null;
@@ -245,7 +246,7 @@
       ReturnStatement statement, DartType expressionType) {
     // The rules for valid returns for functions with return type T and possibly
     // a return expression with static type S.
-    var flattenedReturnType = isAsync
+    DartType flattenedReturnType = isAsync
         ? inferrer.typeSchemaEnvironment.unfutureType(returnType)
         : returnType;
     if (statement.expression == null) {
@@ -273,7 +274,7 @@
 
     // Sync: invalid if T is void and S is not void, dynamic, or Null
     // Async: invalid if T is void and flatten(S) is not void, dynamic, or Null.
-    var flattenedExpressionType = isAsync
+    DartType flattenedExpressionType = isAsync
         ? inferrer.typeSchemaEnvironment.unfutureType(expressionType)
         : expressionType;
     if (returnType is VoidType &&
@@ -332,7 +333,7 @@
         // Not assignable, use the expectation.
         type = greatestClosure(inferrer.coreTypes, returnOrYieldContext);
       }
-      var unwrappedType = type;
+      DartType unwrappedType = type;
       if (isAsync) {
         unwrappedType = inferrer.typeSchemaEnvironment.unfutureType(type);
       }
@@ -359,7 +360,7 @@
   void handleYield(TypeInferrerImpl inferrer, bool isYieldStar, DartType type,
       Expression expression, int fileOffset) {
     if (!isGenerator) return;
-    var expectedType = isYieldStar
+    DartType expectedType = isYieldStar
         ? _wrapAsyncOrGenerator(inferrer, returnOrYieldContext)
         : returnOrYieldContext;
     if (inferrer.ensureAssignable(expectedType, type, expression, fileOffset,
@@ -368,7 +369,7 @@
       type = greatestClosure(inferrer.coreTypes, expectedType);
     }
     if (_needToInferReturnType) {
-      var unwrappedType = type;
+      DartType unwrappedType = type;
       if (isYieldStar) {
         unwrappedType = inferrer.getDerivedTypeArgumentOf(
                 type,
@@ -633,23 +634,29 @@
     // should tear off `.call`.
     // TODO(paulberry): use resolveTypeParameter.  See findInterfaceMember.
     if (actualType is InterfaceType) {
-      var classNode = (actualType as InterfaceType).classNode;
-      var callMember = classHierarchy.getInterfaceMember(classNode, callName);
+      Class classNode = (actualType as InterfaceType).classNode;
+      Member callMember =
+          classHierarchy.getInterfaceMember(classNode, callName);
       if (callMember is Procedure && callMember.kind == ProcedureKind.Method) {
         if (_shouldTearOffCall(expectedType, actualType)) {
           // Replace expression with:
           // `let t = expression in t == null ? null : t.call`
-          var parent = expression.parent;
-          var t = new VariableDeclaration.forValue(expression, type: actualType)
-            ..fileOffset = fileOffset;
-          var nullCheck = buildIsNull(new VariableGet(t), fileOffset, helper);
-          var tearOff =
+          TreeNode parent = expression.parent;
+          VariableDeclaration t =
+              new VariableDeclaration.forValue(expression, type: actualType)
+                ..fileOffset = fileOffset;
+          Expression nullCheck =
+              buildIsNull(new VariableGet(t), fileOffset, helper);
+          PropertyGet tearOff =
               new PropertyGet(new VariableGet(t), callName, callMember)
                 ..fileOffset = fileOffset;
           actualType = getCalleeType(callMember, actualType);
-          var conditional = new ConditionalExpression(nullCheck,
-              new NullLiteral()..fileOffset = fileOffset, tearOff, actualType);
-          var let = new Let(t, conditional)..fileOffset = fileOffset;
+          ConditionalExpression conditional = new ConditionalExpression(
+              nullCheck,
+              new NullLiteral()..fileOffset = fileOffset,
+              tearOff,
+              actualType);
+          Let let = new Let(t, conditional)..fileOffset = fileOffset;
           parent?.replaceChild(expression, let);
           expression = let;
         }
@@ -673,7 +680,7 @@
 
     if (!typeSchemaEnvironment.isSubtypeOf(expectedType, actualType)) {
       // Error: not assignable.  Perform error recovery.
-      var parent = expression.parent;
+      TreeNode parent = expression.parent;
       Expression errorNode = new AsExpression(
           expression,
           // TODO(ahe): The outline phase doesn't correctly remove invalid
@@ -693,21 +700,23 @@
       parent?.replaceChild(expression, errorNode);
       return errorNode;
     } else {
-      var template = _getPreciseTypeErrorTemplate(expression);
+      Template<Message Function(DartType, DartType)> template =
+          _getPreciseTypeErrorTemplate(expression);
       if (template != null) {
         // The type of the expression is known precisely, so an implicit
         // downcast is guaranteed to fail.  Insert a compile-time error.
-        var parent = expression.parent;
-        var errorNode = helper.wrapInProblem(expression,
+        TreeNode parent = expression.parent;
+        Expression errorNode = helper.wrapInProblem(expression,
             template.withArguments(actualType, expectedType), noLength);
         parent?.replaceChild(expression, errorNode);
         return errorNode;
       } else {
         // Insert an implicit downcast.
-        var parent = expression.parent;
-        var typeCheck = new AsExpression(expression, initialExpectedType)
-          ..isTypeError = true
-          ..fileOffset = fileOffset;
+        TreeNode parent = expression.parent;
+        AsExpression typeCheck =
+            new AsExpression(expression, initialExpectedType)
+              ..isTypeError = true
+              ..fileOffset = fileOffset;
         parent?.replaceChild(expression, typeCheck);
         return typeCheck;
       }
@@ -785,21 +794,21 @@
     // TODO(paulberry): could we add getters to InvocationExpression to make
     // these is-checks unnecessary?
     if (methodInvocation is MethodInvocation) {
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, methodInvocation.name, methodInvocation.fileOffset,
           errorTemplate: templateUndefinedMethod,
           expression: methodInvocation,
           receiver: methodInvocation.receiver,
           instrumented: instrumented);
       if (receiverType == const DynamicType() && interfaceMember is Procedure) {
-        var arguments = methodInvocation.arguments;
-        var signature = interfaceMember.function;
+        Arguments arguments = methodInvocation.arguments;
+        FunctionNode signature = interfaceMember.function;
         if (arguments.positional.length < signature.requiredParameterCount ||
             arguments.positional.length >
                 signature.positionalParameters.length) {
           return null;
         }
-        for (var argument in arguments.named) {
+        for (kernel.NamedExpression argument in arguments.named) {
           if (!signature.namedParameters
               .any((declaration) => declaration.name == argument.name)) {
             return null;
@@ -816,7 +825,7 @@
       return interfaceMember;
     } else if (methodInvocation is SuperMethodInvocation) {
       assert(receiverType != const DynamicType());
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, methodInvocation.name, methodInvocation.fileOffset,
           instrumented: instrumented);
       if (interfaceMember is Member) {
@@ -836,7 +845,7 @@
     // TODO(paulberry): could we add a common base class to PropertyGet and
     // SuperPropertyGet to make these is-checks unnecessary?
     if (propertyGet is PropertyGet) {
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertyGet.name, propertyGet.fileOffset,
           errorTemplate: templateUndefinedGetter,
           expression: propertyGet,
@@ -854,7 +863,7 @@
       return interfaceMember;
     } else if (propertyGet is SuperPropertyGet) {
       assert(receiverType != const DynamicType());
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertyGet.name, propertyGet.fileOffset,
           instrumented: instrumented);
       if (interfaceMember is Member) {
@@ -872,7 +881,7 @@
   Object findPropertySetMember(DartType receiverType, Expression propertySet,
       {bool instrumented: true}) {
     if (propertySet is PropertySet) {
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertySet.name, propertySet.fileOffset,
           errorTemplate: templateUndefinedSetter,
           expression: propertySet,
@@ -891,7 +900,7 @@
       return interfaceMember;
     } else if (propertySet is SuperPropertySet) {
       assert(receiverType != const DynamicType());
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertySet.name, propertySet.fileOffset,
           setter: true, instrumented: instrumented);
       if (interfaceMember is Member) {
@@ -908,9 +917,9 @@
     if (calleeType is FunctionType) {
       return calleeType;
     } else if (followCall && calleeType is InterfaceType) {
-      var member =
+      Member member =
           _getInterfaceMember(calleeType.classNode, callName, false, -1);
-      var callType = getCalleeType(member, calleeType);
+      DartType callType = getCalleeType(member, calleeType);
       if (callType is FunctionType) {
         return callType;
       }
@@ -924,7 +933,7 @@
     } else if (interfaceMember == null) {
       return const DynamicType();
     } else if (interfaceMember is Member) {
-      var memberClass = interfaceMember.enclosingClass;
+      Class memberClass = interfaceMember.enclosingClass;
       DartType calleeType;
       if (interfaceMember is Procedure) {
         if (interfaceMember.kind == ProcedureKind.Getter) {
@@ -941,7 +950,7 @@
       if (memberClass.typeParameters.isNotEmpty) {
         receiverType = resolveTypeParameter(receiverType);
         if (receiverType is InterfaceType) {
-          var castedType =
+          InterfaceType castedType =
               classHierarchy.getTypeAsInstanceOf(receiverType, memberClass);
           calleeType = Substitution.fromInterfaceType(castedType)
               .substituteType(calleeType);
@@ -956,7 +965,7 @@
 
   DartType getDerivedTypeArgumentOf(DartType type, Class class_) {
     if (type is InterfaceType) {
-      var typeAsInstanceOfClass =
+      InterfaceType typeAsInstanceOfClass =
           classHierarchy.getTypeAsInstanceOf(type, class_);
       if (typeAsInstanceOfClass != null) {
         return typeAsInstanceOfClass.typeArguments[0];
@@ -984,11 +993,12 @@
     } else if (interfaceMember == null) {
       return const DynamicType();
     } else if (interfaceMember is Member) {
-      var memberClass = interfaceMember.enclosingClass;
+      Class memberClass = interfaceMember.enclosingClass;
       DartType setterType;
       if (interfaceMember is Procedure) {
         assert(interfaceMember.kind == ProcedureKind.Setter);
-        var setterParameters = interfaceMember.function.positionalParameters;
+        List<VariableDeclaration> setterParameters =
+            interfaceMember.function.positionalParameters;
         setterType = setterParameters.length > 0
             ? setterParameters[0].type
             : const DynamicType();
@@ -1001,7 +1011,7 @@
       if (memberClass.typeParameters.isNotEmpty) {
         receiverType = resolveTypeParameter(receiverType);
         if (receiverType is InterfaceType) {
-          var castedType =
+          InterfaceType castedType =
               classHierarchy.getTypeAsInstanceOf(receiverType, memberClass);
           setterType = Substitution.fromInterfaceType(castedType)
               .substituteType(setterType);
@@ -1035,13 +1045,14 @@
       DartType inferredType,
       FunctionType functionType,
       int fileOffset) {
-    var expressionToReplace = desugaredInvocation ?? expression;
+    Expression expressionToReplace = desugaredInvocation ?? expression;
     switch (checkKind) {
       case MethodContravarianceCheckKind.checkMethodReturn:
-        var parent = expressionToReplace.parent;
-        var replacement = new AsExpression(expressionToReplace, inferredType)
-          ..isTypeError = true
-          ..fileOffset = fileOffset;
+        TreeNode parent = expressionToReplace.parent;
+        AsExpression replacement =
+            new AsExpression(expressionToReplace, inferredType)
+              ..isTypeError = true
+              ..fileOffset = fileOffset;
         parent.replaceChild(expressionToReplace, replacement);
         if (instrumentation != null) {
           int offset = arguments.fileOffset == -1
@@ -1052,13 +1063,13 @@
         }
         return replacement;
       case MethodContravarianceCheckKind.checkGetterReturn:
-        var parent = expressionToReplace.parent;
-        var propertyGet = new PropertyGet(desugaredInvocation.receiver,
+        TreeNode parent = expressionToReplace.parent;
+        PropertyGet propertyGet = new PropertyGet(desugaredInvocation.receiver,
             desugaredInvocation.name, desugaredInvocation.interfaceTarget);
-        var asExpression = new AsExpression(propertyGet, functionType)
+        AsExpression asExpression = new AsExpression(propertyGet, functionType)
           ..isTypeError = true
           ..fileOffset = fileOffset;
-        var replacement = new MethodInvocation(
+        MethodInvocation replacement = new MethodInvocation(
             asExpression, callName, desugaredInvocation.arguments);
         parent.replaceChild(expressionToReplace, replacement);
         if (instrumentation != null) {
@@ -1099,10 +1110,10 @@
             interfaceMember.enclosingClass, interfaceMember.type);
       }
     }
-    var replacedExpression = desugaredGet ?? expression;
+    Expression replacedExpression = desugaredGet ?? expression;
     if (checkReturn) {
-      var expressionToReplace = replacedExpression;
-      var parent = expressionToReplace.parent;
+      Expression expressionToReplace = replacedExpression;
+      TreeNode parent = expressionToReplace.parent;
       replacedExpression = new AsExpression(expressionToReplace, inferredType)
         ..isTypeError = true
         ..fileOffset = fileOffset;
@@ -1151,7 +1162,7 @@
     assert(closureContext == null);
     assert(!isTopLevel);
     this.helper = helper;
-    var actualType =
+    DartType actualType =
         inferExpression(initializer, context, true, isVoidAllowed: true);
     ensureAssignable(context, actualType, initializer, initializer.fileOffset,
         isVoidAllowed: context is VoidType);
@@ -1190,7 +1201,7 @@
       // type parameters for the callee (see dartbug.com/31759).
       // TODO(paulberry): is it possible to find a narrower set of circumstances
       // in which me must do this, to avoid a performance regression?
-      var fresh = getFreshTypeParameters(calleeTypeParameters);
+      FreshTypeParameters fresh = getFreshTypeParameters(calleeTypeParameters);
       calleeType = fresh.applyToFunctionType(calleeType);
       returnType = fresh.substitute(returnType);
       calleeTypeParameters = fresh.freshTypeParameters;
@@ -1239,7 +1250,7 @@
       DartType inferredFormalType = substitution != null
           ? substitution.substituteType(formalType)
           : formalType;
-      var expressionType = inferExpression(
+      DartType expressionType = inferExpression(
           expression,
           inferredFormalType,
           inferenceNeeded ||
@@ -1256,28 +1267,30 @@
     });
 
     // Check for and remove duplicated named arguments.
-    var named = arguments.named;
+    List<kernel.NamedExpression> named = arguments.named;
     if (named.length == 2) {
       if (named[0].name == named[1].name) {
-        var name = named[1].name;
-        var error = helper.desugarSyntheticExpression(helper.buildProblem(
-            templateDuplicatedNamedArgument.withArguments(name),
-            named[1].fileOffset,
-            name.length));
+        String name = named[1].name;
+        Expression error = helper.desugarSyntheticExpression(
+            helper.buildProblem(
+                templateDuplicatedNamedArgument.withArguments(name),
+                named[1].fileOffset,
+                name.length));
         arguments.named = [new kernel.NamedExpression(named[1].name, error)];
         formalTypes.removeLast();
         actualTypes.removeLast();
       }
     } else if (named.length > 2) {
-      var seenNames = <String, kernel.NamedExpression>{};
-      var hasProblem = false;
-      var namedTypeIndex = arguments.positional.length;
-      var uniqueNamed = <kernel.NamedExpression>[];
-      for (var expression in named) {
-        var name = expression.name;
+      Map<String, kernel.NamedExpression> seenNames =
+          <String, kernel.NamedExpression>{};
+      bool hasProblem = false;
+      int namedTypeIndex = arguments.positional.length;
+      List<kernel.NamedExpression> uniqueNamed = <kernel.NamedExpression>[];
+      for (kernel.NamedExpression expression in named) {
+        String name = expression.name;
         if (seenNames.containsKey(name)) {
           hasProblem = true;
-          var prevNamedExpression = seenNames[name];
+          kernel.NamedExpression prevNamedExpression = seenNames[name];
           prevNamedExpression.value = helper.desugarSyntheticExpression(
               helper.buildProblem(
                   templateDuplicatedNamedArgument.withArguments(name),
@@ -1322,12 +1335,12 @@
         // Argument counts and names match. Compare types.
         int numPositionalArgs = arguments.positional.length;
         for (int i = 0; i < formalTypes.length; i++) {
-          var formalType = formalTypes[i];
-          var expectedType = substitution != null
+          DartType formalType = formalTypes[i];
+          DartType expectedType = substitution != null
               ? substitution.substituteType(formalType)
               : formalType;
-          var actualType = actualTypes[i];
-          var expression = i < numPositionalArgs
+          DartType actualType = actualTypes[i];
+          Expression expression = i < numPositionalArgs
               ? arguments.positional[i]
               : arguments.named[i - numPositionalArgs].value;
           ensureAssignable(
@@ -1354,15 +1367,16 @@
       returnContext = const DynamicType();
     }
     if (!isTopLevel) {
-      var positionalParameters = function.positionalParameters;
-      for (var i = 0; i < positionalParameters.length; i++) {
-        var parameter = positionalParameters[i];
+      List<VariableDeclaration> positionalParameters =
+          function.positionalParameters;
+      for (int i = 0; i < positionalParameters.length; i++) {
+        VariableDeclaration parameter = positionalParameters[i];
         inferMetadataKeepingHelper(parameter.annotations);
         if (parameter.initializer != null) {
           inferExpression(parameter.initializer, parameter.type, !isTopLevel);
         }
       }
-      for (var parameter in function.namedParameters) {
+      for (VariableDeclaration parameter in function.namedParameters) {
         inferMetadataKeepingHelper(parameter.annotations);
         inferExpression(parameter.initializer, parameter.type, !isTopLevel);
       }
@@ -1404,7 +1418,8 @@
 
       // Let `[T/S]` denote the type substitution where each `Si` is replaced
       // with the corresponding `Ti`.
-      var substitutionMap = <TypeParameter, DartType>{};
+      Map<TypeParameter, DartType> substitutionMap =
+          <TypeParameter, DartType>{};
       for (int i = 0; i < typeContext.typeParameters.length; i++) {
         substitutionMap[typeContext.typeParameters[i]] =
             i < typeParameters.length
@@ -1497,9 +1512,9 @@
       // Place annotations in a temporary list literal so that they will have a
       // parent.  This is necessary in case any of the annotations need to get
       // replaced during type inference.
-      var parents = annotations.map((e) => e.parent).toList();
+      List<TreeNode> parents = annotations.map((e) => e.parent).toList();
       new ListLiteral(annotations);
-      for (var annotation in annotations) {
+      for (Expression annotation in annotations) {
         inferExpression(annotation, const UnknownType(), !isTopLevel);
       }
       for (int i = 0; i < annotations.length; ++i) {
@@ -1522,7 +1537,7 @@
       Name methodName,
       Arguments arguments}) {
     // First infer the receiver so we can look up the method that was invoked.
-    var receiverType = receiver == null
+    DartType receiverType = receiver == null
         ? thisType
         : inferExpression(receiver, const UnknownType(), true);
     receiverVariable?.type = receiverType;
@@ -1535,26 +1550,32 @@
     bool isOverloadedArithmeticOperator = interfaceMember is Procedure &&
         typeSchemaEnvironment.isOverloadedArithmeticOperatorAndType(
             interfaceMember, receiverType);
-    var calleeType = getCalleeType(interfaceMember, receiverType);
-    var functionType = getCalleeFunctionType(calleeType, !isImplicitCall);
+    DartType calleeType = getCalleeType(interfaceMember, receiverType);
+    FunctionType functionType =
+        getCalleeFunctionType(calleeType, !isImplicitCall);
 
     if (interfaceMember != null &&
         calleeType is! DynamicType &&
         calleeType != coreTypes.functionClass.rawType &&
         identical(functionType, unknownFunction)) {
-      var parent = expression.parent;
+      TreeNode parent = expression.parent;
       kernel.Expression error = helper.wrapInProblem(expression,
           templateInvokeNonFunction.withArguments(methodName.name), noLength);
       parent?.replaceChild(expression, error);
       return new ExpressionInferenceResult(null, const DynamicType());
     }
-    var checkKind = preCheckInvocationContravariance(receiver, receiverType,
-        interfaceMember, desugaredInvocation, arguments, expression);
-    var inferenceResult = inferInvocation(typeContext, fileOffset, functionType,
-        functionType.returnType, arguments,
+    MethodContravarianceCheckKind checkKind = preCheckInvocationContravariance(
+        receiver,
+        receiverType,
+        interfaceMember,
+        desugaredInvocation,
+        arguments,
+        expression);
+    ExpressionInferenceResult inferenceResult = inferInvocation(typeContext,
+        fileOffset, functionType, functionType.returnType, arguments,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         receiverType: receiverType);
-    var inferredType = inferenceResult.type;
+    DartType inferredType = inferenceResult.type;
     if (methodName.name == '==') {
       inferredType = coreTypes.boolClass.rawType;
     }
@@ -1567,8 +1588,8 @@
               interfaceMember.kind == ProcedureKind.Method) &&
           receiverType is! DynamicType &&
           receiverType != typeSchemaEnvironment.rawFunctionType) {
-        var parent = expression.parent;
-        var errorNode = helper.wrapInProblem(
+        TreeNode parent = expression.parent;
+        Expression errorNode = helper.wrapInProblem(
             expression,
             templateImplicitCallOfNonMethod.withArguments(receiverType),
             noLength);
@@ -1619,7 +1640,7 @@
     assert(closureContext == null);
     this.helper = helper;
     assert(declaredType != null);
-    var actualType = inferExpression(initializer, declaredType, true);
+    DartType actualType = inferExpression(initializer, declaredType, true);
     ensureAssignable(
         declaredType, actualType, initializer, initializer.fileOffset);
     this.helper = null;
@@ -1657,8 +1678,8 @@
         desugaredGet.interfaceTarget = interfaceMember;
       }
     }
-    var inferredType = getCalleeType(interfaceMember, receiverType);
-    var replacedExpression = handlePropertyGetContravariance(receiver,
+    DartType inferredType = getCalleeType(interfaceMember, receiverType);
+    Expression replacedExpression = handlePropertyGetContravariance(receiver,
         interfaceMember, desugaredGet, expression, inferredType, fileOffset);
     if ((interfaceMember is Procedure &&
         interfaceMember.kind == ProcedureKind.Method)) {
@@ -1686,21 +1707,21 @@
     if (tearoffType is FunctionType &&
         context is FunctionType &&
         context.typeParameters.isEmpty) {
-      var typeParameters = tearoffType.typeParameters;
+      List<TypeParameter> typeParameters = tearoffType.typeParameters;
       if (typeParameters.isNotEmpty) {
-        var inferredTypes = new List<DartType>.filled(
+        List<DartType> inferredTypes = new List<DartType>.filled(
             typeParameters.length, const UnknownType());
-        var instantiatedType = tearoffType.withoutTypeParameters;
+        FunctionType instantiatedType = tearoffType.withoutTypeParameters;
         typeSchemaEnvironment.inferGenericFunctionOrType(
             instantiatedType, typeParameters, [], [], context, inferredTypes);
         if (!isTopLevel) {
-          var parent = expression.parent;
+          TreeNode parent = expression.parent;
           parent.replaceChild(
               expression,
               new Instantiation(expression, inferredTypes)
                 ..fileOffset = expression.fileOffset);
         }
-        var substitution =
+        Substitution substitution =
             Substitution.fromPairs(typeParameters, inferredTypes);
         return substitution.substituteType(instantiatedType);
       }
@@ -1745,7 +1766,7 @@
     if (interfaceMember is Field ||
         interfaceMember is Procedure &&
             interfaceMember.kind == ProcedureKind.Getter) {
-      var getType = getCalleeType(interfaceMember, receiverType);
+      DartType getType = getCalleeType(interfaceMember, receiverType);
       if (getType is DynamicType) {
         return MethodContravarianceCheckKind.none;
       }
@@ -1781,7 +1802,7 @@
       }
     }
 
-    var resolved = resolveOneStep(type);
+    DartType resolved = resolveOneStep(type);
     if (resolved == null) return type;
 
     // Detect circularities using the tortoise-and-hare algorithm.
@@ -1795,9 +1816,9 @@
       }
 
       // Hare takes two steps
-      var step1 = resolveOneStep(hare);
+      DartType step1 = resolveOneStep(hare);
       if (step1 == null) return hare;
-      var step2 = resolveOneStep(step1);
+      DartType step2 = resolveOneStep(step1);
       if (step2 == null) return hare;
       hare = step2;
 
@@ -1818,7 +1839,7 @@
   }
 
   DartType wrapFutureType(DartType type) {
-    var typeWithoutFutureOr = type ?? const DynamicType();
+    DartType typeWithoutFutureOr = type ?? const DynamicType();
     return new InterfaceType(
         coreTypes.futureClass, <DartType>[typeWithoutFutureOr]);
   }
@@ -1829,10 +1850,10 @@
 
   void _forEachArgument(
       Arguments arguments, void callback(String name, Expression expression)) {
-    for (var expression in arguments.positional) {
+    for (Expression expression in arguments.positional) {
       callback(null, expression);
     }
-    for (var namedExpression in arguments.named) {
+    for (kernel.NamedExpression namedExpression in arguments.named) {
       callback(namedExpression.name, namedExpression.value);
     }
   }
@@ -1872,7 +1893,7 @@
       return templateInvalidCastNewExpr;
     }
     if (expression is StaticGet) {
-      var target = expression.target;
+      Member target = expression.target;
       if (target is Procedure && target.kind == ProcedureKind.Method) {
         if (target.enclosingClass != null) {
           return templateInvalidCastStaticMethod;
@@ -1883,7 +1904,7 @@
       return null;
     }
     if (expression is VariableGet) {
-      var variable = expression.variable;
+      VariableDeclaration variable = expression.variable;
       if (variable is VariableDeclarationJudgment &&
           VariableDeclarationJudgment.isLocalFunction(variable)) {
         return templateInvalidCastLocalFunction;
@@ -1949,7 +1970,7 @@
       // abstract class S0&S1<...> extends Object implements S0, S1 {}
       // abstract class S0&S1<...> = S0 with S1;
       // abstract class S0&S1<...> extends S0 implements S1 {}
-      var mixinSuperclass = mixinSupertype.classNode;
+      Class mixinSuperclass = mixinSupertype.classNode;
       if (mixinSuperclass.mixedInType == null &&
           mixinSuperclass.implementedTypes.length != 1 &&
           (mixinSuperclass.superclass != coreTypes.objectClass ||
@@ -1962,7 +1983,7 @@
             mixinSuperclass.fileOffset,
             mixinSuperclass.fileUri);
       }
-      var substitution = Substitution.fromSupertype(mixinSupertype);
+      Substitution substitution = Substitution.fromSupertype(mixinSupertype);
       Supertype s0, s1;
       if (mixinSuperclass.implementedTypes.length == 2) {
         s0 = mixinSuperclass.implementedTypes[0];
@@ -2015,10 +2036,10 @@
     generateConstraints(mixinClass, baseType, mixinSupertype);
     // Solve them to get a map from type parameters to upper and lower
     // bounds.
-    var result = gatherer.computeConstraints();
+    Map<TypeParameter, TypeConstraint> result = gatherer.computeConstraints();
     // Generate new type parameters with the solution as bounds.
     List<TypeParameter> parameters = mixinClass.typeParameters.map((p) {
-      var constraint = result[p];
+      TypeConstraint constraint = result[p];
       // Because we solved for equality, a valid solution has a parameter
       // either unconstrained or else with identical upper and lower bounds.
       if (constraint != null && constraint.upper != constraint.lower) {
@@ -2036,9 +2057,10 @@
     }).toList();
     // Bounds might mention the mixin class's type parameters so we have to
     // substitute them before calling instantiate to bounds.
-    var substitution = Substitution.fromPairs(mixinClass.typeParameters,
+    Substitution substitution = Substitution.fromPairs(
+        mixinClass.typeParameters,
         parameters.map((p) => new TypeParameterType(p)).toList());
-    for (var p in parameters) {
+    for (TypeParameter p in parameters) {
       p.bound = substitution.substituteType(p.bound);
     }
     // Use instantiate to bounds.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
index 69c352e..f8f0ff5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
@@ -230,8 +230,8 @@
   void enterLogicalExpression(Expression lhs, String operator) {
     debugEvent('enterLogicalExpression');
     // Figure out what the facts are based on possible LHS outcomes.
-    var trueFacts = _factsWhenTrue(lhs);
-    var falseFacts = _factsWhenFalse(lhs);
+    TypePromotionFact trueFacts = _factsWhenTrue(lhs);
+    TypePromotionFact falseFacts = _factsWhenFalse(lhs);
     // Record the fact that we are entering a new scope, and save the
     // appropriate facts for the case where the expression gets short-cut.
     bool isAnd = identical(operator, '&&');
@@ -246,8 +246,8 @@
   void enterThen(Expression condition) {
     debugEvent('enterThen');
     // Figure out what the facts are based on possible condition outcomes.
-    var trueFacts = _factsWhenTrue(condition);
-    var falseFacts = _factsWhenFalse(condition);
+    TypePromotionFact trueFacts = _factsWhenTrue(condition);
+    TypePromotionFact falseFacts = _factsWhenFalse(condition);
     // Record the fact that we are entering a new scope, and save the "false"
     // facts for when we enter the "else" branch.
     _currentScope = new _ConditionalScope(_currentScope, falseFacts);
@@ -295,7 +295,7 @@
   TypePromotionFact getFactForAccess(
       VariableDeclaration variable, int functionNestingLevel) {
     debugEvent('getFactForAccess');
-    var fact = _computeCurrentFactMap()[variable];
+    TypePromotionFact fact = _computeCurrentFactMap()[variable];
     TypePromotionFact._recordAccessedInScope(
         fact, _currentScope, functionNestingLevel);
     return fact;
@@ -309,7 +309,7 @@
       VariableDeclaration variable, DartType type, int functionNestingLevel) {
     debugEvent('handleIsCheck');
     if (!isPromotionCandidate(variable)) return;
-    var isCheck = new _IsCheck(
+    _IsCheck isCheck = new _IsCheck(
         ++_lastFactSequenceNumber,
         variable,
         _currentFacts,
@@ -333,7 +333,7 @@
   /// mutated.
   void mutateVariable(VariableDeclaration variable, int functionNestingLevel) {
     debugEvent('mutateVariable');
-    var fact = _computeCurrentFactMap()[variable];
+    TypePromotionFact fact = _computeCurrentFactMap()[variable];
     TypePromotionFact._recordMutatedInScope(fact, _currentScope);
     if (getVariableFunctionNestingLevel(variable) < functionNestingLevel) {
       setVariableMutatedInClosure(variable);
@@ -386,7 +386,7 @@
     for (TypePromotionFact newState = _currentFacts;
         !identical(newState, commonAncestor);
         newState = newState.previous) {
-      var currentlyCached = _factCache[newState.variable];
+      TypePromotionFact currentlyCached = _factCache[newState.variable];
       // Note: Since we roll forward the most recent facts first, we need to be
       // careful not write an older fact over a newer one.
       if (currentlyCached == null ||
@@ -654,13 +654,13 @@
   @override
   DartType _computePromotedType(
       TypePromoterImpl promoter, TypePromotionScope scope) {
-    var previousPromotedType =
+    DartType previousPromotedType =
         previousForVariable?._computePromotedType(promoter, scope);
 
     // If the variable was mutated somewhere in the scope of the potential
     // promotion, promotion does not occur.
     if (_mutatedInScopes != null) {
-      for (var assignmentScope in _mutatedInScopes) {
+      for (TypePromotionScope assignmentScope in _mutatedInScopes) {
         if (assignmentScope.containsScope(scope)) {
           return previousPromotedType;
         }
@@ -672,7 +672,7 @@
     // not occur.
     if (promoter.wasVariableMutatedAnywhere(variable) &&
         _accessedInClosureInScopes != null) {
-      for (var accessScope in _accessedInClosureInScopes) {
+      for (TypePromotionScope accessScope in _accessedInClosureInScopes) {
         if (accessScope.containsScope(scope)) {
           return previousPromotedType;
         }
@@ -681,7 +681,7 @@
 
     // What we do now depends on the relationship between the previous type of
     // the variable and the type we are checking against.
-    var previousType = previousPromotedType ?? variable.type;
+    DartType previousType = previousPromotedType ?? variable.type;
     if (promoter.typeSchemaEnvironment.isSubtypeOf(checkedType, previousType)) {
       // The type we are checking against is a subtype of the previous type of
       // the variable, so this is a refinement; we can promote.
diff --git a/pkg/front_end/lib/src/fasta/uri_translator.dart b/pkg/front_end/lib/src/fasta/uri_translator.dart
index 4d0d91e..bb2b025 100644
--- a/pkg/front_end/lib/src/fasta/uri_translator.dart
+++ b/pkg/front_end/lib/src/fasta/uri_translator.dart
@@ -50,6 +50,16 @@
     return packageBaseUri.fragment;
   }
 
+  /// Get the fragment for the package specified as the default package, if any.
+  String getDefaultPackageFragment() {
+    Uri emptyPackageRedirect = packages.asMap()[""];
+    if (emptyPackageRedirect == null) return null;
+    String packageName = emptyPackageRedirect.toString();
+    Uri packageBaseUri = packages.asMap()[packageName];
+    if (packageBaseUri == null) return null;
+    return packageBaseUri.fragment;
+  }
+
   bool isLibrarySupported(String libraryName) {
     // TODO(sigmund): change this to `?? false` when all backends provide the
     // `libraries.json` file by default (Issue #32657).
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 76adabd..56dfe2e 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -323,7 +323,6 @@
 InvalidCatchArguments/example: Fail
 InvalidContinueTarget/analyzerCode: Fail
 InvalidContinueTarget/example: Fail
-InvalidInitializer/analyzerCode: Fail # The analyzer reports a different error
 InvalidInitializer/example: Fail
 InvalidPackageUri/analyzerCode: Fail
 InvalidPackageUri/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 4b3a96a..0b53548 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -925,8 +925,10 @@
 # TODO(danrubel): Review where this error is generated and consider generating
 # FieldInitializedOutsideDeclaringClass instead of this in some situations.
 InvalidInitializer:
+  index: 90
   template: "Not a valid initializer."
   tip: "To initialize a field, use the syntax 'name = value'."
+  analyzerCode: ParserErrorCode.INVALID_INITIALIZER
 
 FieldInitializedOutsideDeclaringClass:
   index: 88
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 731b221..2842dbf 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -9,7 +9,7 @@
   sdk: '>=2.2.2 <3.0.0'
 dependencies:
   kernel: 0.3.22
-  package_config: '^1.0.1'
+  package_config: '^1.1.0'
   path: '^1.3.9'
   yaml: '^2.1.12'
 dev_dependencies:
diff --git a/pkg/front_end/test/fasta/outline_test.dart b/pkg/front_end/test/fasta/outline_test.dart
index 3551732..43e9cc9 100644
--- a/pkg/front_end/test/fasta/outline_test.dart
+++ b/pkg/front_end/test/fasta/outline_test.dart
@@ -10,7 +10,6 @@
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  environment[LEGACY_MODE] = "";
   return FastaContext.create(suite, environment);
 }
 
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/.packages b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/.packages
new file mode 100644
index 0000000..6a19ae2
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo.dart
new file mode 100644
index 0000000..c669c23
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo.dart
@@ -0,0 +1,13 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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: languageVersion=2.8*/
+
+import 'foo2.dart';
+
+foo() {
+  print("Hello from foo!");
+  foo2();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo2.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo2.dart
new file mode 100644
index 0000000..0e38837
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo2.dart
@@ -0,0 +1,12 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.4
+
+/*library: languageVersion=2.4*/
+
+foo2() {
+  print("Hello from foo2!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/main.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/main.dart
new file mode 100644
index 0000000..cabb316
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/.packages
new file mode 100644
index 0000000..b18dc60
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/.packages
@@ -0,0 +1,2 @@
+foo:lib/#dart=2.5.3-dev.2
+:foo
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/lib/foo.dart
new file mode 100644
index 0000000..1fe23f3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/lib/foo.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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: languageVersion=2.5*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/main.dart
new file mode 100644
index 0000000..3870a48
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/main.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:foo/foo.dart';
+
+// Version comes from "default package" in .packages.
+
+/*library: languageVersion=2.5*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/.packages
new file mode 100644
index 0000000..c86b3a4
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=2.5.3-dev.2
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/lib/foo.dart
new file mode 100644
index 0000000..1fe23f3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/lib/foo.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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: languageVersion=2.5*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/main.dart
new file mode 100644
index 0000000..5117999
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/main.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:foo/foo.dart';
+
+/*library: languageVersion=2.8*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/.packages b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/.packages
new file mode 100644
index 0000000..24fcebf
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/.packages
@@ -0,0 +1,2 @@
+foo:lib/#dart=2.5.3-dev.2
+:bar
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/lib/foo.dart
new file mode 100644
index 0000000..1fe23f3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/lib/foo.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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: languageVersion=2.5*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/main.dart b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/main.dart
new file mode 100644
index 0000000..5117999
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/main.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:foo/foo.dart';
+
+/*library: languageVersion=2.8*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index 606ccfd..e22cfe5 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -1,13 +1,3 @@
 # Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE.md file.
-
-src/fasta/flow_analysis/flow_analysis: Fail
-src/fasta/kernel/body_builder: Fail
-src/fasta/kernel/expression_generator: Fail
-src/fasta/kernel/inference_visitor: Fail
-src/fasta/kernel/kernel_shadow_ast: Fail
-src/fasta/parser/parser: Fail
-src/fasta/type_inference/type_constraint_gatherer: Fail
-src/fasta/type_inference/type_inferrer: Fail
-src/fasta/type_inference/type_promotion: Fail
diff --git a/pkg/front_end/test/old_dill_test.dart b/pkg/front_end/test/old_dill_test.dart
new file mode 100644
index 0000000..df757c40
--- /dev/null
+++ b/pkg/front_end/test/old_dill_test.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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' show Future;
+
+import 'dart:io';
+
+import 'package:kernel/binary/tag.dart' show Tag;
+
+import 'package:testing/testing.dart'
+    show ChainContext, Result, Step, TestDescription, Chain, runMe;
+
+Future<Null> main([List<String> arguments = const []]) async {
+  if (arguments.length == 1 && arguments[0] == "--generate") {
+    print("Should now generate a dill of dart2js.");
+    await generateDill();
+    return null;
+  } else if (arguments.length == 1 && arguments[0] == "--checkDill") {
+    await checkDill();
+    return null;
+  }
+  await runMe(arguments, createContext, "../testing.json");
+  await checkDill();
+}
+
+String get dartVm => Platform.resolvedExecutable;
+
+Uri generateOutputUri(int binaryVersion, int compileNumber) {
+  return Uri.base.resolve("pkg/front_end/testcases/old_dills/"
+      "dart2js"
+      ".version.$binaryVersion"
+      ".compile.$compileNumber"
+      ".dill");
+}
+
+verifyNotUsingCheckedInDart() {
+  String vm = dartVm.replaceAll(r"\", "/");
+  if (vm.contains("tools/sdks/dart-sdk/bin/dart")) {
+    throw "Running with checked-in VM which is not supported";
+  }
+}
+
+Future<Null> checkDill() async {
+  Uri uri = generateOutputUri(Tag.BinaryFormatVersion, 1);
+  if (!new File.fromUri(uri).existsSync()) {
+    print("File $uri doesn't exist. Generate running script");
+    print("${Platform.script.toFilePath()} --generate");
+    exit(1);
+  }
+}
+
+Future<Null> generateDill() async {
+  Uri fastaCompile = Uri.base.resolve("pkg/front_end/tool/_fasta/compile.dart");
+  if (!new File.fromUri(fastaCompile).existsSync()) {
+    throw "compile.dart from fasta tools couldn't be found";
+  }
+
+  Uri dart2js = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
+  if (!new File.fromUri(dart2js).existsSync()) {
+    throw "dart2js couldn't be found";
+  }
+
+  int compileNumber = 0;
+  Uri output;
+  do {
+    compileNumber++;
+    output = generateOutputUri(Tag.BinaryFormatVersion, compileNumber);
+  } while (new File.fromUri(output).existsSync());
+
+  ProcessResult result = await Process.run(
+      dartVm,
+      [
+        fastaCompile.toFilePath(),
+        "sdkroot:/pkg/compiler/bin/dart2js.dart",
+        "-o",
+        output.toFilePath(),
+        "--target=vm",
+        "--single-root-base=${Uri.base.toFilePath()}",
+        "--single-root-scheme=sdkroot",
+      ],
+      workingDirectory: Uri.base.toFilePath());
+  if (result.exitCode != 0) {
+    print("stdout: ${result.stdout}");
+    print("stderr: ${result.stderr}");
+    print("Exit code: ${result.exitCode}");
+    throw "Got exit code ${result.exitCode}";
+  } else {
+    print("File generated.");
+  }
+}
+
+Future<Context> createContext(
+    Chain suite, Map<String, String> environment) async {
+  return new Context();
+}
+
+class Context extends ChainContext {
+  final List<Step> steps = const <Step>[
+    const RunDill(),
+  ];
+}
+
+class RunDill extends Step<TestDescription, TestDescription, Context> {
+  const RunDill();
+
+  String get name => "RunDill";
+
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    verifyNotUsingCheckedInDart();
+    ProcessResult result = await Process.run(
+        dartVm,
+        [
+          "--compile_all",
+          description.uri.toFilePath(),
+          "-h",
+        ],
+        workingDirectory: Uri.base.toFilePath());
+    print("stdout: ${result.stdout}");
+    print("stderr: ${result.stderr}");
+    print("Exit code: ${result.exitCode}");
+    if (result.exitCode != 0) {
+      return fail(description, "Got exit code ${result.exitCode}");
+    }
+    return pass(description);
+  }
+}
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 794a2a1..df8d7bd 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -108,6 +108,7 @@
 dictionary
 differs
 dillfile
+dills
 dirname
 disagree
 disconnect
@@ -316,6 +317,8 @@
 scans
 screen
 scripts
+sdkroot
+sdks
 secondary
 seconds
 segment
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect
index f7cedf9..dfcdbe8 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect
@@ -1,61 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:24: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension on Class {
-//                        ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:24: Error: 'Class' is already declared in this scope.
-// extension Extension on Class {
-//                        ^^^^^
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:5:7: Context: Previous declaration of 'Class'.
-// class Class {
-//       ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension GenericExtension<T> on GenericClass<T> {
-//           ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:31: Error: Expected '{' before this.
-// extension GenericExtension<T> on GenericClass<T> {
-//                               ^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:34: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension GenericExtension<T> on GenericClass<T> {
-//                                  ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:34: Error: 'GenericClass' is already declared in this scope.
-// extension GenericExtension<T> on GenericClass<T> {
-//                                  ^^^^^^^^^^^^
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:69:7: Context: Previous declaration of 'GenericClass'.
-// class GenericClass<T> {
-//       ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:1: Warning: Type 'extension' not found.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:21: Warning: Type 'on' not found.
-// extension Extension on Class {
-//                     ^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:1: Warning: Type 'extension' not found.
-// extension GenericExtension<T> on GenericClass<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:31: Warning: Type 'on' not found.
-// extension GenericExtension<T> on GenericClass<T> {
-//                               ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -69,8 +12,105 @@
   synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
     ;
 }
-static field invalid-type Extension;
-static method GenericExtension<T extends core::Object* = dynamic>() → invalid-type
+extension Extension on self::Class* {
+  method readGetter = self::Extension|readGetter;
+  method writeSetterRequired = self::Extension|writeSetterRequired;
+  method writeSetterOptional = self::Extension|writeSetterOptional;
+  method writeSetterNamed = self::Extension|writeSetterNamed;
+  get tearOffGetterNoArgs = self::Extension|get#tearOffGetterNoArgs;
+  get tearOffGetterRequired = self::Extension|get#tearOffGetterRequired;
+  get tearOffGetterOptional = self::Extension|get#tearOffGetterOptional;
+  get tearOffGetterNamed = self::Extension|get#tearOffGetterNamed;
+  get property = self::Extension|get#property;
+  method invocations = self::Extension|invocations;
+  method tearOffs = self::Extension|tearOffs;
+  method getterCalls = self::Extension|getterCalls;
+  set property = self::Extension|set#property;
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  method readGetter = self::GenericExtension|readGetter;
+  method writeSetterRequired = self::GenericExtension|writeSetterRequired;
+  method writeSetterOptional = self::GenericExtension|writeSetterOptional;
+  method writeSetterNamed = self::GenericExtension|writeSetterNamed;
+  method genericWriteSetterRequired = self::GenericExtension|genericWriteSetterRequired;
+  method genericWriteSetterOptional = self::GenericExtension|genericWriteSetterOptional;
+  method genericWriteSetterNamed = self::GenericExtension|genericWriteSetterNamed;
+  get property = self::GenericExtension|get#property;
+  get tearOffGetterNoArgs = self::GenericExtension|get#tearOffGetterNoArgs;
+  get tearOffGetterRequired = self::GenericExtension|get#tearOffGetterRequired;
+  get tearOffGetterOptional = self::GenericExtension|get#tearOffGetterOptional;
+  get tearOffGetterNamed = self::GenericExtension|get#tearOffGetterNamed;
+  get tearOffGetterGenericRequired = self::GenericExtension|get#tearOffGetterGenericRequired;
+  get tearOffGetterGenericOptional = self::GenericExtension|get#tearOffGetterGenericOptional;
+  get tearOffGetterGenericNamed = self::GenericExtension|get#tearOffGetterGenericNamed;
+  method invocations = self::GenericExtension|invocations;
+  method tearOffs = self::GenericExtension|tearOffs;
+  method getterCalls = self::GenericExtension|getterCalls;
+  set property = self::GenericExtension|set#property;
+}
+static method Extension|readGetter(final self::Class* #this) → dynamic
+  ;
+static method Extension|writeSetterRequired(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method Extension|writeSetterOptional(final self::Class* #this, [dynamic value]) → dynamic
+  ;
+static method Extension|writeSetterNamed(final self::Class* #this, {dynamic value}) → dynamic
+  ;
+static method Extension|get#tearOffGetterNoArgs(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#tearOffGetterRequired(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#tearOffGetterOptional(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#tearOffGetterNamed(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#property(final self::Class* #this) → dynamic
+  ;
+static method Extension|set#property(final self::Class* #this, dynamic value) → void
+  ;
+static method Extension|invocations(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method Extension|tearOffs(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method Extension|getterCalls(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method GenericExtension|readGetter<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|readGetter::#T*>* #this) → self::GenericExtension|readGetter::#T*
+  ;
+static method GenericExtension|writeSetterRequired<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterRequired::#T*>* #this, self::GenericExtension|writeSetterRequired::#T* value) → dynamic
+  ;
+static method GenericExtension|writeSetterOptional<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterOptional::#T*>* #this, [self::GenericExtension|writeSetterOptional::#T* value]) → dynamic
+  ;
+static method GenericExtension|writeSetterNamed<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterNamed::#T*>* #this, {self::GenericExtension|writeSetterNamed::#T* value}) → dynamic
+  ;
+static method GenericExtension|genericWriteSetterRequired<#T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::#T = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::#T*>* #this, self::GenericExtension|genericWriteSetterRequired::S value) → dynamic
+  ;
+static method GenericExtension|genericWriteSetterOptional<#T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::#T = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::#T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S value]) → dynamic
+  ;
+static method GenericExtension|genericWriteSetterNamed<#T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::#T = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::#T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S value}) → dynamic
+  ;
+static method GenericExtension|get#property<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#property::#T*>* #this) → self::GenericExtension|get#property::#T*
+  ;
+static method GenericExtension|set#property<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::#T*>* #this, self::GenericExtension|set#property::#T* value) → void
+  ;
+static method GenericExtension|get#tearOffGetterNoArgs<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterRequired<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterOptional<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterNamed<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterGenericRequired<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterGenericOptional<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterGenericNamed<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|invocations<#T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::#T = dynamic>(final self::GenericClass<self::GenericExtension|invocations::#T*>* #this, self::GenericExtension|invocations::S value) → dynamic
+  ;
+static method GenericExtension|tearOffs<#T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::#T = dynamic>(final self::GenericClass<self::GenericExtension|tearOffs::#T*>* #this, self::GenericExtension|tearOffs::S value) → dynamic
+  ;
+static method GenericExtension|getterCalls<#T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::#T = dynamic>(final self::GenericClass<self::GenericExtension|getterCalls::#T*>* #this, self::GenericExtension|getterCalls::S value) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect
index e6826b8..5a1e9ab 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect
@@ -1,36 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension<T> on Class<T> {
-//           ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:24: Error: Expected '{' before this.
-// extension Extension<T> on Class<T> {
-//                        ^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:27: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension<T> on Class<T> {
-//                           ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:27: Error: 'Class' is already declared in this scope.
-// extension Extension<T> on Class<T> {
-//                           ^^^^^
-// pkg/front_end/testcases/extensions/direct_static_access.dart:5:7: Context: Previous declaration of 'Class'.
-// class Class<T> {
-//       ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:1: Warning: Type 'extension' not found.
-// extension Extension<T> on Class<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:24: Warning: Type 'on' not found.
-// extension Extension<T> on Class<T> {
-//                        ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -39,7 +7,81 @@
   synthetic constructor •() → self::Class<self::Class::T*>*
     ;
 }
-static method Extension<T extends core::Object* = dynamic>() → invalid-type
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  static method readGetter = self::Extension|readGetter;
+  static method writeSetterRequired = self::Extension|writeSetterRequired;
+  static method writeSetterOptional = self::Extension|writeSetterOptional;
+  static method writeSetterNamed = self::Extension|writeSetterNamed;
+  static method genericWriteSetterRequired = self::Extension|genericWriteSetterRequired;
+  static method genericWriteSetterOptional = self::Extension|genericWriteSetterOptional;
+  static method genericWriteSetterNamed = self::Extension|genericWriteSetterNamed;
+  static get tearOffGetterNoArgs = get self::Extension|tearOffGetterNoArgs;
+  static get tearOffGetterRequired = get self::Extension|tearOffGetterRequired;
+  static get tearOffGetterOptional = get self::Extension|tearOffGetterOptional;
+  static get tearOffGetterNamed = get self::Extension|tearOffGetterNamed;
+  static get tearOffGetterGenericRequired = get self::Extension|tearOffGetterGenericRequired;
+  static get tearOffGetterGenericOptional = get self::Extension|tearOffGetterGenericOptional;
+  static get tearOffGetterGenericNamed = get self::Extension|tearOffGetterGenericNamed;
+  static method invocationsFromStaticContext = self::Extension|invocationsFromStaticContext;
+  static method tearOffsFromStaticContext = self::Extension|tearOffsFromStaticContext;
+  static method fieldAccessFromStaticContext = self::Extension|fieldAccessFromStaticContext;
+  static method getterCallsFromStaticContext = self::Extension|getterCallsFromStaticContext;
+  method invocationsFromInstanceContext = self::Extension|invocationsFromInstanceContext;
+  method tearOffsFromInstanceContext = self::Extension|tearOffsFromInstanceContext;
+  method fieldAccessFromInstanceContext = self::Extension|fieldAccessFromInstanceContext;
+  method getterCallsFromInstanceContext = self::Extension|getterCallsFromInstanceContext;
+  static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static get Extension|property() → dynamic
+  ;
+static set Extension|property(dynamic value) → void
+  ;
+static method Extension|readGetter() → dynamic
+  ;
+static method Extension|writeSetterRequired(dynamic value) → dynamic
+  ;
+static method Extension|writeSetterOptional([dynamic value]) → dynamic
+  ;
+static method Extension|writeSetterNamed({dynamic value}) → dynamic
+  ;
+static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic
+  ;
+static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value]) → dynamic
+  ;
+static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value}) → dynamic
+  ;
+static get Extension|tearOffGetterNoArgs() → dynamic
+  ;
+static get Extension|tearOffGetterRequired() → dynamic
+  ;
+static get Extension|tearOffGetterOptional() → dynamic
+  ;
+static get Extension|tearOffGetterNamed() → dynamic
+  ;
+static get Extension|tearOffGetterGenericRequired() → dynamic
+  ;
+static get Extension|tearOffGetterGenericOptional() → dynamic
+  ;
+static get Extension|tearOffGetterGenericNamed() → dynamic
+  ;
+static method Extension|invocationsFromStaticContext(core::int* value) → dynamic
+  ;
+static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic
+  ;
+static method Extension|fieldAccessFromStaticContext() → dynamic
+  ;
+static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic
+  ;
+static method Extension|invocationsFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|invocationsFromInstanceContext::#T*>* #this, self::Extension|invocationsFromInstanceContext::#T* value) → dynamic
+  ;
+static method Extension|tearOffsFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|tearOffsFromInstanceContext::#T*>* #this, self::Extension|tearOffsFromInstanceContext::#T* value) → dynamic
+  ;
+static method Extension|fieldAccessFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|fieldAccessFromInstanceContext::#T*>* #this) → dynamic
+  ;
+static method Extension|getterCallsFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|getterCallsFromInstanceContext::#T*>* #this, self::Extension|getterCallsFromInstanceContext::#T* value) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
index 6102ceb..0819186 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/explicit_this.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {
-//       ^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -37,6 +9,16 @@
   method method1() → void
     ;
 }
-static field invalid-type A2;
+extension A2 on self::A1* {
+  method method2 = self::A2|method2;
+  method method3 = self::A2|method3;
+  method method4 = self::A2|method4;
+}
+static method A2|method2(final self::A1* #this) → void
+  ;
+static method A2|method3(final self::A1* #this) → core::Object*
+  ;
+static method A2|method4(final self::A1* #this, core::Object* o) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
index ba9ea5f..0819186 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/implicit_this.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {
-//       ^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -37,6 +9,16 @@
   method method1() → void
     ;
 }
-static field invalid-type A2;
+extension A2 on self::A1* {
+  method method2 = self::A2|method2;
+  method method3 = self::A2|method3;
+  method method4 = self::A2|method4;
+}
+static method A2|method2(final self::A1* #this) → void
+  ;
+static method A2|method3(final self::A1* #this) → core::Object*
+  ;
+static method A2|method4(final self::A1* #this, core::Object* o) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect b/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
index f1182fb..c2ae0c9 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
@@ -1,61 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/instance_members.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//           ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Error: Expected '{' before this.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//                    ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: 'B1' is already declared in this scope.
-// extension B2<T> on B1<T> {
-//                    ^^
-// pkg/front_end/testcases/extensions/instance_members.dart:28:7: Context: Previous declaration of 'B1'.
-// class B1<T> {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:1: Warning: Type 'extension' not found.
-// extension B2<T> on B1<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Warning: Type 'on' not found.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -67,8 +10,27 @@
   synthetic constructor •() → self::B1<self::B1::T*>*
     ;
 }
-static field invalid-type A2;
-static method B2<T extends core::Object* = dynamic>() → invalid-type
+extension A2 on self::A1* {
+  method method1 = self::A2|method1;
+  method method2 = self::A2|method2;
+  method method3 = self::A2|method3;
+  method method4 = self::A2|method4;
+}
+extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+  method method1 = self::B2|method1;
+  method method2 = self::B2|method2;
+}
+static method A2|method1(final self::A1* #this) → self::A1*
+  ;
+static method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1*
+  ;
+static method A2|method3<T extends core::Object* = dynamic>(final self::A1* #this, [self::A2|method3::T* o]) → self::A1*
+  ;
+static method A2|method4<T extends core::Object* = dynamic>(final self::A1* #this, {self::A2|method4::T* o}) → self::A1*
+  ;
+static method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>*
+  ;
+static method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(final self::B1<self::B2|method2::#T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::#T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect
index a323fdb..48438c1 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/other_kinds.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {
-//       ^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -44,6 +16,24 @@
   static method setStaticField(core::int* value) → void
     ;
 }
-static field invalid-type A2;
+extension A2 on self::A1* {
+  get instanceProperty = self::A2|get#instanceProperty;
+  operator + = self::A2|+;
+  static field staticField = self::A2|staticField;
+  static get staticProperty = get self::A2|staticProperty;
+  set instanceProperty = self::A2|set#instanceProperty;
+  static set staticProperty = set self::A2|staticProperty;
+}
+static field core::int* A2|staticField;
+static method A2|get#instanceProperty(final self::A1* #this) → core::int*
+  ;
+static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → void
+  ;
+static method A2|+(final self::A1* #this, core::int* value) → core::int*
+  ;
+static get A2|staticProperty() → core::int*
+  ;
+static set A2|staticProperty(core::int* value) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.outline.expect b/pkg/front_end/testcases/extensions/static_access.dart.outline.expect
index 8334102..4e9dc86 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:24: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension on Class {
-//                        ^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:24: Error: 'Class' is already declared in this scope.
-// extension Extension on Class {
-//                        ^^^^^
-// pkg/front_end/testcases/extensions/static_access.dart:5:7: Context: Previous declaration of 'Class'.
-// class Class {}
-//       ^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:1: Warning: Type 'extension' not found.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:21: Warning: Type 'on' not found.
-// extension Extension on Class {
-//                     ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -34,6 +6,21 @@
   synthetic constructor •() → self::Class*
     ;
 }
-static field invalid-type Extension;
+extension Extension on self::Class* {
+  static method method = self::Extension|method;
+  static method genericMethod = self::Extension|genericMethod;
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic
+  ;
+static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic
+  ;
+static get Extension|property() → dynamic
+  ;
+static set Extension|property(dynamic value) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect b/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
index a6d69ea..3689d95 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
@@ -1,36 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2<T> on A1<T> {
-//           ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Error: Expected '{' before this.
-// extension A2<T> on A1<T> {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2<T> on A1<T> {
-//                    ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: 'A1' is already declared in this scope.
-// extension A2<T> on A1<T> {
-//                    ^^
-// pkg/front_end/testcases/extensions/type_variables.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1<T> {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:1: Warning: Type 'extension' not found.
-// extension A2<T> on A1<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Warning: Type 'on' not found.
-// extension A2<T> on A1<T> {
-//                 ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -38,7 +6,13 @@
   synthetic constructor •() → self::A1<self::A1::T*>*
     ;
 }
-static method A2<T extends core::Object* = dynamic>() → invalid-type
+extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+  method method1 = self::A2|method1;
+  method method2 = self::A2|method2;
+}
+static method A2|method1<#T extends core::Object* = dynamic, S extends self::A2|method1::#T = dynamic>(final self::A1<self::A2|method1::#T*>* #this) → self::A1<self::A2|method1::#T*>*
+  ;
+static method A2|method2<#T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::#T>* = dynamic>(final self::A1<self::A2|method2::#T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::#T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.outline.expect b/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
index 9c0d4ca..dbd8b2e 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
@@ -1,61 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/use_this.dart:7:7: Context: Previous declaration of 'A1'.
-// class A1 {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//           ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:17: Error: Expected '{' before this.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//                    ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: 'B1' is already declared in this scope.
-// extension B2<T> on B1<T> {
-//                    ^^
-// pkg/front_end/testcases/extensions/use_this.dart:20:7: Context: Previous declaration of 'B1'.
-// class B1<T> {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:1: Warning: Type 'extension' not found.
-// extension B2<T> on B1<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:17: Warning: Type 'on' not found.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -67,8 +10,21 @@
   synthetic constructor •() → self::B1<self::B1::T*>*
     ;
 }
-static field invalid-type A2;
-static method B2<T extends core::Object* = dynamic>() → invalid-type
+extension A2 on self::A1* {
+  method method1 = self::A2|method1;
+  method method2 = self::A2|method2;
+}
+extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+  method method1 = self::B2|method1;
+  method method2 = self::B2|method2;
+}
+static method A2|method1(final self::A1* #this) → self::A1*
+  ;
+static method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1*
+  ;
+static method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>*
+  ;
+static method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(final self::B1<self::B2|method2::#T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::#T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
index daecf9e..0d1797b 100644
--- a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
@@ -183,13 +183,13 @@
   method execute() → void
     ;
 }
-static const field dynamic REQUIRED = const self::Strength::•(0, "required");
-static const field dynamic STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
-static const field dynamic PREFERRED = const self::Strength::•(2, "preferred");
-static const field dynamic STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
-static const field dynamic NORMAL = const self::Strength::•(4, "normal");
-static const field dynamic WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
-static const field dynamic WEAKEST = const self::Strength::•(6, "weakest");
+static const field self::Strength* REQUIRED = const self::Strength::•(0, "required");
+static const field self::Strength* STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
+static const field self::Strength* PREFERRED = const self::Strength::•(2, "preferred");
+static const field self::Strength* STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
+static const field self::Strength* NORMAL = const self::Strength::•(4, "normal");
+static const field self::Strength* WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
+static const field self::Strength* WEAKEST = const self::Strength::•(6, "weakest");
 static const field core::int* NONE = 1;
 static const field core::int* FORWARD = 2;
 static const field core::int* BACKWARD = 0;
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
index 466c02c..4c54d2f 100644
--- a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
@@ -14,7 +14,7 @@
   static const field core::List<self::Foo*>* values = const <self::Foo*>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
   @self::hest
   static const field self::Foo* bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<dynamic>(self::hest)
+  @self::Fisk::fisk<core::int*>(self::hest)
   static const field self::Foo* baz = const self::Foo::•(1, "Foo.baz");
   static const field self::Foo* cafebabe = const self::Foo::•(2, "Foo.cafebabe");
   const constructor •(core::int* index, core::String* _name) → self::Foo*
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
index 60367e2..750b872 100644
--- a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
@@ -5,13 +5,13 @@
 class A<X extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
-  method bar<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
     ;
 }
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  static method foo<Y extends core::Object* = dynamic>() → self::A<self::B::foo::Y*>*
+  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
     ;
 }
 static method baz() → dynamic
diff --git a/pkg/front_end/testcases/general/bug30695.dart.outline.expect b/pkg/front_end/testcases/general/bug30695.dart.outline.expect
index bb6576d..8ab1586 100644
--- a/pkg/front_end/testcases/general/bug30695.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug30695.dart.outline.expect
@@ -13,7 +13,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic foo;
+  field core::int* foo;
   synthetic constructor •() → self::A*
     ;
 }
diff --git a/pkg/front_end/testcases/general/bug31124.dart.outline.expect b/pkg/front_end/testcases/general/bug31124.dart.outline.expect
index 8e65e77..7ac93d0 100644
--- a/pkg/front_end/testcases/general/bug31124.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug31124.dart.outline.expect
@@ -15,5 +15,6 @@
 //     ^
 //
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field () →* core::String* a;
diff --git a/pkg/front_end/testcases/general/bug32866.dart.outline.expect b/pkg/front_end/testcases/general/bug32866.dart.outline.expect
index cb6153c..6857612 100644
--- a/pkg/front_end/testcases/general/bug32866.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug32866.dart.outline.expect
@@ -9,9 +9,9 @@
 }
 class A extends core::Object implements self::B {
   final field core::String* f;
-  constructor •(dynamic f) → self::A*
+  constructor •(core::String* f) → self::A*
     ;
 }
-static field dynamic a;
+static field self::A* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/bug35470.dart.outline.expect b/pkg/front_end/testcases/general/bug35470.dart.outline.expect
index e3abe47..c18a369 100644
--- a/pkg/front_end/testcases/general/bug35470.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug35470.dart.outline.expect
@@ -5,7 +5,7 @@
 class A<X extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
-  method foo<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+  method foo<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
     ;
 }
 class B extends self::A<dynamic> {
diff --git a/pkg/front_end/testcases/general/bug37476.dart.outline.expect b/pkg/front_end/testcases/general/bug37476.dart.outline.expect
index 6c89350..50be2c0 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void
     ;
 }
-class B<T extends core::num* = dynamic> extends core::Object {
+class B<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   method foo() → (self::B::T*) →* void
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
index a5d2ec8..efd56f1 100644
--- a/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
index a513a65..9871382 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
@@ -21,6 +21,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
index a5d2ec8..efd56f1 100644
--- a/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
index 297fe46..fb0387c 100644
--- a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
@@ -1,12 +1,20 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/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);
+//   ^^^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field dynamic f;
-  constructor _circular(dynamic f) → self::C*
+  field self::C* f;
+  constructor _circular(self::C* f) → self::C*
     ;
 }
-static field dynamic x;
+static field self::C* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect b/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
index a2cf5b5..24bf6bc 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
@@ -26,6 +26,74 @@
 // class Ef1<X extends Function({int})> {
 //                                  ^
 //
+// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Jm2<Z> extends Object with Am2<Function, Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Mm2<Z> = Object with Am2<Function(int), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Nm2<Z> = Object with Am2<Function(int x), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Um2<Z> = Object with Am2<Function, Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -197,7 +265,7 @@
     : super core::Object::•()
     ;
 }
-class Am2<X extends () →* dynamic = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
     ;
 }
@@ -449,87 +517,87 @@
   synthetic constructor •() → self::Km3<self::Km3::Z*>*
     ;
 }
-class Af1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Af1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
     ;
 }
-class Bf1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
     ;
 }
-class Cf1<X extends () →* core::int* = dynamic> extends core::Object {
+class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
   static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
     ;
 }
-class Df1<X extends () →* dynamic = dynamic> extends core::Object {
+class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
     ;
 }
-class Ef1<X extends () →* dynamic = dynamic> extends core::Object {
+class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
     ;
 }
-class Ff1<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
   static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
     ;
 }
-class Gf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
     ;
 }
-class Hf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
     ;
 }
-class If1<X extends core::Function* = dynamic> extends core::Object {
+class If1<X extends core::Function* = core::Function*> extends core::Object {
   static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
     ;
 }
-class Jf1<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
     ;
 }
-class Kf1<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
     ;
 }
-class Bf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
     ;
 }
-class Cf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
     ;
 }
-class Df2<X extends () →* core::int* = dynamic> extends core::Object {
+class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
   static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
     ;
 }
-class Ef2<X extends () →* dynamic = dynamic> extends core::Object {
+class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
     ;
 }
-class Ff2<X extends () →* dynamic = dynamic> extends core::Object {
+class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
     ;
 }
-class Gf2<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
   static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
     ;
 }
-class Hf2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
     ;
 }
-class If2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
     ;
 }
-class Jf2<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
     ;
 }
-class Kf2<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
     ;
 }
diff --git a/pkg/front_end/testcases/general/closure.dart.outline.expect b/pkg/front_end/testcases/general/closure.dart.outline.expect
index 0f97df6..4f62ce2 100644
--- a/pkg/front_end/testcases/general/closure.dart.outline.expect
+++ b/pkg/front_end/testcases/general/closure.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field dynamic _field;
+  field self::Bar* _field;
   synthetic constructor •() → self::Foo*
     ;
 }
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
index 901ca71..73716f7 100644
--- a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
@@ -18,7 +18,7 @@
   synthetic constructor •() → self::D*
     ;
 }
-class G<T extends self::A* = dynamic> extends core::Object {
+class G<T extends self::A* = self::A*> extends core::Object {
   synthetic constructor •() → self::G<self::G::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
index 7640695..1446703 100644
--- a/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
@@ -20,6 +20,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
index bedeadd..42a79f3 100644
--- a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
@@ -9,11 +9,11 @@
 // class Dupe {}
 //       ^^^^
 //
-// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Error: Type 'Dupe.a' not found.
 //   Dupe.a b;
 //   ^^^^^^
 //
-// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart'.
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart'.
 // import 'duplicated_bad_prefix_lib2.dart' as dupe;
 //                                             ^
 //
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
index 6764ff8..1b8f882 100644
--- a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
@@ -299,7 +299,7 @@
 // typedef Typedef = Object Function();
 //         ^^^^^^^
 //
-// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Warning: 'C' isn't a type.
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
 // class Sub extends C {
 //                   ^
 // pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Context: This isn't a type.
@@ -332,7 +332,7 @@
     ;
 }
 class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  field dynamic field;
+  field core::String* field;
   constructor •(dynamic a) → self::C#2*
     ;
   method m() → dynamic
@@ -347,7 +347,7 @@
     ;
 }
 class C extends core::Object {
-  field dynamic field;
+  field core::String* field;
   constructor •(dynamic a) → self::C*
     ;
   method m() → dynamic
@@ -439,7 +439,7 @@
   method toString() → core::String*
     return this.{=self::AnotherEnum::_name};
 }
-static field dynamic field;
+static field core::String* field;
 static method main() → dynamic
   ;
 static method foo() → dynamic
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
index 8e9604a..96aece8 100644
--- a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
@@ -14,7 +14,7 @@
 
 class A extends core::Object {
   field core::int* a;
-  constructor •(dynamic a) → self::A*
+  constructor •(core::int* a) → self::A*
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
index 4327762..9583c9b 100644
--- a/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
+++ b/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
+// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Error: Type 'dynamic' not found.
 // /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
 //                           ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.outline.expect b/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
index 5fcae20..98495a1 100644
--- a/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E on C {
-//                ^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
-// extension E on C {
-//                ^
-// pkg/front_end/testcases/general/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: Type 'extension' not found.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:13: Warning: Type 'on' not found.
-// extension E on C {
-//             ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -38,6 +10,10 @@
   get one() → core::int*
     ;
 }
-static field invalid-type E;
+extension E on self::C* {
+  get two = self::E|get#two;
+}
+static method E|get#two(final self::C* #this) → core::int*
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/function_in_field.dart.outline.expect b/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
index 3470a7a..9f1148b 100644
--- a/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
+static field () →* core::int* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
index 055c6c8..3edc43d 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
@@ -7,9 +7,9 @@
 static field core::String* z;
 static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
   ;
-static method identityObject<T extends core::Object* = dynamic>(self::identityObject::T* t) → self::identityObject::T*
+static method identityObject<T extends core::Object* = core::Object*>(self::identityObject::T* t) → self::identityObject::T*
   ;
-static method identityList<T extends core::List<self::identityList::T>* = dynamic>(self::identityList::T* t) → self::identityList::T*
+static method identityList<T extends core::List<self::identityList::T>* = core::List<dynamic>*>(self::identityList::T* t) → self::identityList::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
index 9bfb098..9d451cd 100644
--- a/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
@@ -10,7 +10,7 @@
 // void Function({obj: Object}) x;
 //                   ^
 //
-// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Warning: Type 'obj' not found.
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Error: Type 'obj' not found.
 // void Function({obj: Object}) x;
 //                ^^^
 //
diff --git a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
index 07147d2..55f17dd 100644
--- a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static const field dynamic constField = 87;
+  static const field core::int* constField = 87;
   const constructor •(dynamic x) → self::C*
     : super core::Object::•()
     ;
 }
-static const field dynamic constTopLevelField = 42;
+static const field core::int* constTopLevelField = 42;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.outline.expect b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.outline.expect
new file mode 100644
index 0000000..5494096
--- /dev/null
+++ b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a() → self::C*
+    ;
+  constructor b() → self::C*
+    ;
+  constructor c() → self::C*
+    ;
+  constructor d() → self::C*
+    ;
+}
diff --git a/pkg/front_end/testcases/general/many_errors.dart.outline.expect b/pkg/front_end/testcases/general/many_errors.dart.outline.expect
index 27f485d..8485710 100644
--- a/pkg/front_end/testcases/general/many_errors.dart.outline.expect
+++ b/pkg/front_end/testcases/general/many_errors.dart.outline.expect
@@ -15,7 +15,7 @@
 //   const A.named2() : x = new Object();
 //                          ^^^
 //
-// pkg/front_end/testcases/general/many_errors.dart:10:24: Warning: 'x' is a final instance variable that has already been initialized.
+// pkg/front_end/testcases/general/many_errors.dart:10:24: Error: 'x' is a final instance variable that has already been initialized.
 //   const A.named2() : x = new Object();
 //                        ^
 // pkg/front_end/testcases/general/many_errors.dart:6:9: Context: 'x' was initialized here.
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
index fd825b0..c8bbb73 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -12,7 +12,7 @@
 // class A0 = S with M;
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -22,7 +22,7 @@
 // class A1 = S with M1, M;
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -32,7 +32,7 @@
 // class A2 = S with M1, M2, M;
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -42,7 +42,7 @@
 // class A0X = S with M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -52,7 +52,7 @@
 // class A1X = S with M1, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -62,7 +62,7 @@
 // class A2X = S with M1, M2, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -72,7 +72,7 @@
 // class B0 extends S with M {}
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -82,7 +82,7 @@
 // class B1 extends S with M1, M {}
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -92,7 +92,7 @@
 // class B2 extends S with M1, M2, M {}
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -102,7 +102,7 @@
 // class B0X extends S with M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -112,7 +112,7 @@
 // class B1X extends S with M1, M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
index 485f78a..5d68397 100644
--- a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A*
     ;
 }
-class C<T extends self::A* = dynamic> extends core::Object {
+class C<T extends self::A* = self::A*> extends core::Object {
   generic-covariant-impl field self::C::T* _field;
   synthetic constructor •() → self::C<self::C::T*>*
     ;
diff --git a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
index d28f088..2da0b47 100644
--- a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
@@ -1,4 +1,27 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:26:9: Error: The return type of the method 'F.y' is 'A', which does not match the return type, 'B', of the overridden method, 'D.y'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+// Change to a subtype of 'B'.
+//   A get y => null;
+//         ^
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:16:7: Context: This is the overridden method ('y').
+//   get y => null; // Inferred type: B
+//       ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:25:16: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.x'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:15:12: Context: This is the overridden method ('x').
+//   void set x(value) {} // Inferred type: A
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
index ba70391..5e1469f 100644
--- a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
@@ -1,4 +1,27 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:21:14: Error: The return type of the method 'E.y' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.y'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+// Change to a subtype of 'A'.
+//   Object get y => null;
+//              ^
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:11:9: Context: This is the overridden method ('y').
+//   A get y => null;
+//         ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:20:16: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:10:12: Context: This is the overridden method ('x').
+//   void set x(A value) {}
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
index a3eaa5e..c042245 100644
--- a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
@@ -1,4 +1,26 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:22:17: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x4'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x4(B value) {} // Not covariant
+//                 ^
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:13:12: Context: This is the overridden method ('x4').
+//   void set x4(A value) {}
+//            ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:23:32: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.x5'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x5(covariant String value) {}
+//                                ^
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:14:12: Context: This is the overridden method ('x5').
+//   void set x5(covariant A value) {}
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
index 3f00110..a04839a 100644
--- a/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
@@ -1,4 +1,17 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_after_inference.dart:22:12: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.f'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f(B x) {}
+//            ^
+// pkg/front_end/testcases/general/override_check_after_inference.dart:14:8: Context: This is the overridden method ('f').
+//   void f(x) {} // Inferred type: (A) -> void
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect b/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
index aa8593d..82a45c2 100644
--- a/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
@@ -1,4 +1,47 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:27:10: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.f4'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a subtype of 'A'.
+//   Object f4() {}
+//          ^
+// pkg/front_end/testcases/general/override_check_basic.dart:13:5: Context: This is the overridden method ('f4').
+//   A f4() {}
+//     ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:26:14: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f3'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f3({B x}) {}
+//              ^
+// pkg/front_end/testcases/general/override_check_basic.dart:12:8: Context: This is the overridden method ('f3').
+//   void f3({A x}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:24:13: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f1'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f1(B x) {}
+//             ^
+// pkg/front_end/testcases/general/override_check_basic.dart:10:8: Context: This is the overridden method ('f1').
+//   void f1(A x) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:25:14: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f2'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f2([B x]) {}
+//              ^
+// pkg/front_end/testcases/general/override_check_basic.dart:11:8: Context: This is the overridden method ('f2').
+//   void f2([A x]) {}
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
index 6865779..193f75c 100644
--- a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends self::Foo<self::Foo::T>* = dynamic> extends core::Object {
+class Foo<T extends self::Foo<self::Foo::T>* = self::Foo<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
 }
 abstract class Bar extends core::Object {
   synthetic constructor •() → self::Bar*
     ;
-  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = dynamic>() → void;
+  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = self::Foo<dynamic>*>() → void;
 }
 class Hest extends core::Object implements self::Bar {
   synthetic constructor •() → self::Hest*
     ;
   @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U>* = dynamic>() → void
+  method fisk<U extends self::Foo<self::Hest::fisk::U>* = self::Foo<dynamic>*>() → void
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
index a65975c..4c08082 100644
--- a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
@@ -1,4 +1,26 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:23:28: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.f5'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f5(covariant String x) {}
+//                            ^
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:14:8: Context: This is the overridden method ('f5').
+//   void f5(covariant A x) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:22:13: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f4'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f4(B x) {} // Not covariant
+//             ^
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:13:8: Context: This is the overridden method ('f4').
+//   void f4(A x) {}
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
index 6cf04c8..65071a6 100644
--- a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart' but its 'part of' declaration says 'foo'.
+// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Error: Using 'pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart' but its 'part of' declaration says 'foo'.
 // Try changing the 'part of' declaration to use a relative file name.
 // part 'part_not_part_of_same_named_library_lib1.dart';
 //      ^
diff --git a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
index de523ea..bcd74cd 100644
--- a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart'.
+// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Error: Using 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart'.
 // part 'part_part_of_different_unnamed_library_lib1.dart';
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
index 886001a..4f277c37 100644
--- a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Warning: Using 'pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart' as part of 'foo' but its 'part of' declaration says 'bar'.
+// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Error: Using 'pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart' as part of 'foo' but its 'part of' declaration says 'bar'.
 // part 'part_part_of_differently_named_library_lib1.dart';
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/qualified.dart.outline.expect b/pkg/front_end/testcases/general/qualified.dart.outline.expect
index 08d37e9..c8750b5 100644
--- a/pkg/front_end/testcases/general/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.outline.expect
@@ -9,18 +9,14 @@
 // class Bad extends lib.Missing {
 //       ^^^
 //
-// pkg/front_end/testcases/general/qualified.dart:11:19: Warning: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/general/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
 // pkg/front_end/testcases/general/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 // class Bad extends lib.Missing {
 //                   ^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
 // class IllegalSupertype extends lib.VoidFunction {}
 //       ^
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
index c4b1096..ba037f1 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
@@ -1,4 +1,13 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+//  - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+//   factory FooBase(int x) = Foo<Tf>;
+//                            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
index c5cbd80..b81eb59 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
@@ -3,10 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  constructor •() → self::A*
     ;
-  redirecting_factory first() = self::A::•;
-  redirecting_factory second() = self::A::first;
+  static factory first() → self::A*
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+  static factory second() → self::A*
+    let dynamic #redirecting_factory = self::A::first in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
index 8d1d812..636af62 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
@@ -10,8 +10,8 @@
   static factory •(dynamic p) → self::Foo*
     let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
 }
-static const field dynamic forParameter = 1;
-static const field dynamic forFactoryItself = 2;
-static const field dynamic anotherForParameter = 3;
+static const field core::int* forParameter = 1;
+static const field core::int* forFactoryItself = 2;
+static const field core::int* anotherForParameter = 3;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
index f14f820..fc62503 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
@@ -3,9 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
     ;
-  redirecting_factory redir() = self::A::•;
+  static factory redir() → self::A*
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
index e691673..caf6826 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
@@ -3,20 +3,22 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X*
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y*
     ;
 }
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
     ;
-  redirecting_factory redir() = self::B::•<self::Y>;
+  static factory redir() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
 }
-class B<T extends self::X> extends self::A {
-  constructor •() → void
+class B<T extends self::X* = self::X*> extends self::A {
+  constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
index 8e9ac92..4526c6e 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
@@ -2,10 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object, S extends core::Object> extends core::Object {
-  constructor •(self::A::T t, self::A::S s) → void
+class A<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     ;
-  redirecting_factory redir<T extends core::Object, S extends core::Object>(T t, S s) = self::A::•<T, S>;
+  static factory redir<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
index 01df3c7..5c26d8c 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
@@ -3,17 +3,19 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X*
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y*
     ;
 }
-class A<T extends core::Object, S extends self::A::T> extends core::Object {
-  constructor •(self::A::T t, self::A::S s) → void
+class A<T extends core::Object* = dynamic, S extends self::A::T* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     ;
-  redirecting_factory redir<T extends core::Object, S extends T>(T t, S s) = self::A::•<T, S>;
+  static factory redir<T extends core::Object* = dynamic, S extends self::A::redir::T* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
index f130ab6..0974ead 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::X*
     ;
 }
-class Foo<T extends self::X* = dynamic> extends core::Object {
+class Foo<T extends self::X* = self::X*> extends core::Object {
   generic-covariant-impl field self::Foo::T* x;
   constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
     ;
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
index af53cce..2160bc2 100644
--- a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
@@ -1,4 +1,11 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/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)> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/stringliteral.dart.outline.expect b/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
index a46e629..0c2680f 100644
--- a/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
+++ b/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
@@ -1,11 +1,12 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic color;
-static field dynamic thing;
-static field dynamic phrase;
-static field dynamic adjacent;
-static field dynamic linebreaks;
-static field dynamic other;
+static field core::String* color;
+static field core::String* thing;
+static field core::String* phrase;
+static field core::String* adjacent;
+static field core::String* linebreaks;
+static field core::String* other;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
index 8174b6c..519578a 100644
--- a/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/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.
+// pkg/front_end/testcases/general/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/general/type_variable_uses.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
index 9bdf117..6de5e4c 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+// pkg/front_end/testcases/general/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/general/unsound_promotion.dart.outline.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
index 45f6ecf..9a8c9d9 100644
--- a/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
@@ -15,7 +15,7 @@
     ;
 }
 static field core::List<self::A*>* list;
-static method g<T extends self::A* = dynamic>(self::g::T* t) → core::List<self::g::T*>*
+static method g<T extends self::A* = self::A*>(self::g::T* t) → core::List<self::g::T*>*
   ;
 static method f<S extends core::Object* = dynamic>(self::f::S* s) → core::List<self::f::S*>*
   ;
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
index 421073f..6da5c74 100644
--- a/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
@@ -6,7 +6,7 @@
 //   Map<String, var> m;
 //               ^^^
 //
-// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Warning: Type 'var' not found.
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Error: Type 'var' not found.
 //   Map<String, var> m;
 //               ^^^
 //
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.outline.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.outline.expect
new file mode 100644
index 0000000..2582eae
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field asy::Future<core::int*>* futureInt;
+static field () →* asy::Future<core::int*>* f;
+static field () →* asy::Future<core::int*>* g;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.outline.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.outline.expect
new file mode 100644
index 0000000..0231dd0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field () →* asy::Future<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.outline.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.outline.expect
new file mode 100644
index 0000000..d290a5b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field asy::FutureOr<core::int*>* futureOrInt;
+static field () →* asy::FutureOr<core::int*>* f;
+static field () →* asy::Future<core::int*>* g;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.outline.expect
new file mode 100644
index 0000000..49da2ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+import "dart:async";
+import "dart:math";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.outline.expect
new file mode 100644
index 0000000..49da2ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+import "dart:async";
+import "dart:math";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.outline.expect
new file mode 100644
index 0000000..49da2ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+import "dart:async";
+import "dart:math";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.outline.expect
new file mode 100644
index 0000000..666bc54
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+import "dart:async";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.outline.expect
new file mode 100644
index 0000000..d08afaa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::String* g;
+static method f() → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.outline.expect
new file mode 100644
index 0000000..55e2ed1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+import "dart:async";
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.outline.expect
new file mode 100644
index 0000000..55e2ed1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+import "dart:async";
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.outline.expect
new file mode 100644
index 0000000..672fbfb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic h;
+static method foo((core::Object*) →* core::int* f) → void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.outline.expect
new file mode 100644
index 0000000..0a623d0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+import "dart:math";
+
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/bottom.dart.outline.expect b/pkg/front_end/testcases/inference/bottom.dart.outline.expect
new file mode 100644
index 0000000..0387d83
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bottom.dart.outline.expect
@@ -0,0 +1,6 @@
+library test;
+import self as self;
+
+static field dynamic v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
new file mode 100644
index 0000000..5497bda
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::Null* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.outline.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.outline.expect
new file mode 100644
index 0000000..97b8e80
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
+//     ^
+//
+import self as self;
+
+static field invalid-type x;
+static field () →* invalid-type y;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.outline.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.outline.expect
new file mode 100644
index 0000000..947182a0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
+//     ^
+//
+import self as self;
+
+static field invalid-type x;
+static field () →* invalid-type y;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
index caf7760..a57d812 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
@@ -5,6 +5,6 @@
 static field core::bool* b;
 static field core::int* x;
 static field core::double* y;
-static field dynamic z;
+static field core::num* z;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
new file mode 100644
index 0000000..10031dd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
@@ -0,0 +1,51 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::I1*
+    ;
+}
+class I2 extends self::I1 {
+  field core::int* y;
+  synthetic constructor •() → self::I2*
+    ;
+}
+class A extends core::Object {
+  final field self::I1* a;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  final field self::I2* a;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C1 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C1*
+    ;
+  get a() → invalid-type
+    ;
+}
+class C2 extends core::Object implements self::B, self::A {
+  synthetic constructor •() → self::C2*
+    ;
+  get a() → invalid-type
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
new file mode 100644
index 0000000..f509791
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
@@ -0,0 +1,52 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::I1*
+    ;
+}
+class I2 extends core::Object {
+  field core::int* y;
+  synthetic constructor •() → self::I2*
+    ;
+}
+class I3 extends core::Object implements self::I1, self::I2 {
+  field core::int* x;
+  field core::int* y;
+  synthetic constructor •() → self::I3*
+    ;
+}
+class A extends core::Object {
+  final field self::I1* a;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  final field self::I2* a;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C1 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C1*
+    ;
+  get a() → self::I3*
+    ;
+}
+class C2 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C2*
+    ;
+  get a() → invalid-type
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.outline.expect
new file mode 100644
index 0000000..be7aa62
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class Foo<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.outline.expect
new file mode 100644
index 0000000..704851c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
index a195c85..0a07ab4 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::A*
     ;
 }
-class C<T extends self::A* = dynamic> extends core::Object {
+class C<T extends self::A* = self::A*> extends core::Object {
   constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.outline.expect
new file mode 100644
index 0000000..da1258f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
+    : self::C::t = t, super core::Object::•()
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.outline.expect
new file mode 100644
index 0000000..cbb70eb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D<T extends core::num* = core::num*> extends core::Object {
+  const constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.outline.expect
new file mode 100644
index 0000000..1936950
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::C::T*>* list) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.outline.expect
new file mode 100644
index 0000000..c33e3cc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor _() → self::C<self::C::T*>*
+    ;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.outline.expect
new file mode 100644
index 0000000..9bb0a3d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A<self::A::T*>* f;
+  constructor •() → self::A<self::A::T*>*
+    ;
+  static factory factory<T extends core::Object* = dynamic>() → self::A<self::A::factory::T*>*
+    ;
+  method m() → self::A<self::A::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.outline.expect
new file mode 100644
index 0000000..ba86a01
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.outline.expect
new file mode 100644
index 0000000..28ffdec
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •() → self::C<self::C::T*>*
+    ;
+  static factory named<T extends core::Object* = dynamic>(self::C::named::T* t) → self::C<self::C::named::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.outline.expect
new file mode 100644
index 0000000..306987f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    ;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.outline.expect
new file mode 100644
index 0000000..b66d0d6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::•];
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+}
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
index ee4e32e..4d266f4 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     ;
 }
-class Pair<T extends self::Cloneable<self::Pair::T>* = dynamic, U extends self::Cloneable<self::Pair::U>* = dynamic> extends core::Object {
+class Pair<T extends self::Cloneable<self::Pair::T>* = self::Cloneable<dynamic>*, U extends self::Cloneable<self::Pair::U>* = self::Cloneable<dynamic>*> extends core::Object {
   generic-covariant-impl field self::Pair::T* t;
   generic-covariant-impl field self::Pair::U* u;
   constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.outline.expect
new file mode 100644
index 0000000..f1f5c5d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl field self::Pair::U* u;
+  constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
+    ;
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.outline.expect
new file mode 100644
index 0000000..38f29cd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.outline.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.outline.expect
new file mode 100644
index 0000000..908d36a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.outline.expect
@@ -0,0 +1,30 @@
+library test;
+//
+// Problems in library:
+//
+// 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, 'int', of the overridden method, 'A.x'.
+// Change to a subtype of '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: Context: This is the overridden method ('x').
+//   final int x = 2;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → dynamic
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.outline.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.outline.expect
new file mode 100644
index 0000000..13d8894
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.outline.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic x;
+  static field core::int* y;
+  field dynamic x2;
+  field core::int* y2;
+  synthetic constructor •() → self::A*
+    ;
+}
+static field dynamic x;
+static field core::int* y;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.outline.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.outline.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.outline.expect
new file mode 100644
index 0000000..5df14ed
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field (self::A::T*) →* self::A::T* x;
+  constructor •((self::A::T*) →* self::A::T* x) → self::A<self::A::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
index 14bb442..2aa6d59 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
@@ -10,12 +10,12 @@
     : super core::Object::•()
     ;
 }
-@self::Foo::•(const <dynamic>[])
+@self::Foo::•(const <core::String*>[])
 class Bar extends core::Object {
   synthetic constructor •() → self::Bar*
     ;
 }
-@self::Foo::named(const <dynamic>[])
+@self::Foo::named(const <core::String*>[])
 class Baz extends core::Object {
   synthetic constructor •() → self::Baz*
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
index 779bc69..5b2f604 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
@@ -8,12 +8,12 @@
     ;
 }
 abstract class Bar extends core::Object {
-  @self::Foo::•(const <dynamic>[])
+  @self::Foo::•(const <core::String*>[])
   field dynamic x;
-  @self::Foo::•(const <dynamic>[])
+  @self::Foo::•(const <core::String*>[])
   constructor •() → self::Bar*
     ;
-  @self::Foo::•(const <dynamic>[])
+  @self::Foo::•(const <core::String*>[])
   abstract method f() → void;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.outline.expect
new file mode 100644
index 0000000..c74ce2b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.outline.expect
new file mode 100644
index 0000000..7554b7c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method main() → asy::Future<dynamic>*
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
new file mode 100644
index 0000000..3d473dc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    ;
+}
+static method F<T extends core::Object* = dynamic>() → self::F::T*
+  ;
+static method f() → asy::Future<dynamic>*
+  ;
+static method main() → asy::Future<dynamic>*
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.outline.expect
new file mode 100644
index 0000000..e0a7edc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = ([S*]) →* T*;
+class Foo extends core::Object {
+  field core::List<core::int*>* x;
+  constructor •([core::List<core::int*>* x]) → self::Foo*
+    ;
+  constructor named([core::List<core::int*>* x]) → self::Foo*
+    ;
+}
+static field ([core::List<core::int*>*]) →* core::String* g;
+static method f([core::List<core::int*>* l]) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.outline.expect
new file mode 100644
index 0000000..6794a5c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B<core::int*>* b;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
+    ;
+}
+static field self::A* t1;
+static field core::List<self::B<core::int*>*>* t2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
index e341531..9d0ad6f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -6,6 +6,6 @@
   constructor •(self::A::T* x) → self::A<self::A::T*>*
     ;
 }
-static field dynamic t1;
+static field core::List<self::A<core::int*>*>* t1;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..3ec491b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F0 extends core::Object {
+  constructor •(core::List<core::int*>* a) → self::F0*
+    ;
+}
+class F1 extends core::Object {
+  constructor •({core::List<core::int*>* a}) → self::F1*
+    ;
+}
+class F2 extends core::Object {
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
+    ;
+}
+class F3 extends core::Object {
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
+    ;
+}
+class F4 extends core::Object {
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a}) → self::F4*
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..2037825
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f0(core::List<core::int*>* a) → void
+  ;
+static method f1({core::List<core::int*>* a}) → void
+  ;
+static method f2(core::Iterable<core::int*>* a) → void
+  ;
+static method f3(core::Iterable<core::Iterable<core::int*>*>* a) → void
+  ;
+static method f4({core::Iterable<core::Iterable<core::int*>*>* a}) → void
+  ;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.outline.expect
new file mode 100644
index 0000000..3539aa7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.outline.expect
new file mode 100644
index 0000000..27b374a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.outline.expect
new file mode 100644
index 0000000..ba76888
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F3<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<core::Iterable<self::F3::T*>*>* a) → self::F3<self::F3::T*>*
+    ;
+}
+class F4<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::Iterable<core::Iterable<self::F4::T*>*>* a}) → self::F4<self::F4::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..c651d5f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F0<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::F0::T*>* a) → self::F0<self::F0::T*>*
+    ;
+}
+class F1<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::List<self::F1::T*>* a}) → self::F1<self::F1::T*>*
+    ;
+}
+class F2<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<self::F2::T*>* a) → self::F2<self::F2::T*>*
+    ;
+}
+class F3<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<core::Iterable<self::F3::T*>*>* a) → self::F3<self::F3::T*>*
+    ;
+}
+class F4<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::Iterable<core::Iterable<self::F4::T*>*>* a}) → self::F4<self::F4::T*>*
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.outline.expect
new file mode 100644
index 0000000..c74ce2b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..2bf3613
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.outline.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::S* x;
+  generic-covariant-impl field self::A::T* y;
+  constructor •(self::A::S* x, self::A::T* y) → self::A<self::A::S*, self::A::T*>*
+    ;
+  constructor named(self::A::S* x, self::A::T* y) → self::A<self::A::S*, self::A::T*>*
+    ;
+}
+class B<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::B::T*, self::B::S*> {
+  constructor •(self::B::S* y, self::B::T* x) → self::B<self::B::S*, self::B::T*>*
+    ;
+  constructor named(self::B::S* y, self::B::T* x) → self::B<self::B::S*, self::B::T*>*
+    ;
+}
+class C<S extends core::Object* = dynamic> extends self::B<self::C::S*, self::C::S*> {
+  constructor •(self::C::S* a) → self::C<self::C::S*>*
+    ;
+  constructor named(self::C::S* a) → self::C<self::C::S*>*
+    ;
+}
+class D<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::B<self::D::T*, core::int*> {
+  constructor •(self::D::T* a) → self::D<self::D::S*, self::D::T*>*
+    ;
+  constructor named(self::D::T* a) → self::D<self::D::S*, self::D::T*>*
+    ;
+}
+class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::C<self::E::S*>*, self::E::T*> {
+  constructor •(self::E::T* a) → self::E<self::E::S*, self::E::T*>*
+    ;
+}
+class F<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::F::S*, self::F::T*> {
+  constructor •(self::F::S* x, self::F::T* y, {core::List<self::F::S*>* a, core::List<self::F::T*>* b}) → self::F<self::F::S*, self::F::T*>*
+    ;
+  constructor named(self::F::S* x, self::F::T* y, [self::F::S* a, self::F::T* b]) → self::F<self::F::S*, self::F::T*>*
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..a92d585
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo([core::List<core::String*>* list1, core::List<core::String*>* list2]) → void
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.outline.expect
new file mode 100644
index 0000000..57c5b68
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.outline.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
+class DartType extends core::Object {
+  synthetic constructor •() → self::DartType*
+    ;
+}
+abstract class C extends core::Object {
+  static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf;
+  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  synthetic constructor •() → self::C*
+    ;
+  static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
+    ;
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic
+    ;
+}
+abstract class G<T extends core::Object* = dynamic> extends core::Object {
+  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  synthetic constructor •() → self::G<self::G::T*>*
+    ;
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic
+    ;
+}
+static field (self::DartType*) →* void _isInt;
+static field (self::DartType*) →* void _isString;
+static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf;
+static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.outline.expect
new file mode 100644
index 0000000..2456a4af
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo([core::Map<core::int*, core::String*>* m1, core::Map<core::int*, core::String*>* m2]) → void
+  ;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
new file mode 100644
index 0000000..e1e83f3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    ;
+}
+static method foo() → asy::Stream<core::List<core::int*>*>*
+  ;
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.outline.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.outline.expect
new file mode 100644
index 0000000..0ac31d4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::C*
+    ;
+  static get _x() → core::int*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.outline.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.outline.expect
new file mode 100644
index 0000000..2df00b8e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::C*
+    ;
+}
+static get y() → core::int*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.outline.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.outline.expect
new file mode 100644
index 0000000..c763edf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method add(core::int* x) → void
+  ;
+static method add2(core::int* y) → dynamic
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.outline.expect
new file mode 100644
index 0000000..c410a31
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef ToValue<T extends core::Object* = dynamic> = (T*) →* void;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.outline.expect
new file mode 100644
index 0000000..9f34989
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<S extends core::Object* = dynamic, T extends core::Object* = dynamic>(self::f::S* s) → self::f::T*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
index 464dcd7..1a8b966 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern* = dynamic> extends core::Object {
+class Foo<T extends core::Pattern* = core::Pattern*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
-  method method<generic-covariant-impl U extends self::Foo::T* = dynamic>(self::Foo::method::U* u) → self::Foo::method::U*
+  method method<generic-covariant-impl U extends self::Foo::T* = self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.outline.expect
new file mode 100644
index 0000000..47b4040
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.outline.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math";
+
+static method printInt(core::int* x) → void
+  ;
+static method printDouble(core::double* x) → void
+  ;
+static method myMax(core::num* x, core::num* y) → core::num*
+  ;
+static method f() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.outline.expect
new file mode 100644
index 0000000..07bf679
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.outline.expect
@@ -0,0 +1,36 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   m(x) => x;
+//   ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: 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:13:3: Error: The return type of the method 'D.m' is 'dynamic', which does not match the return type, 'T', of the overridden method, 'C.m'.
+// Change to a subtype of 'T'.
+//   m(x) => x;
+//   ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
+//   T m<T>(T x) => x;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method m(dynamic x) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.outline.expect
new file mode 100644
index 0000000..649bb11
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>(core::List<self::f::T*>* s) → self::f::T*
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.outline.expect
new file mode 100644
index 0000000..b3ae44d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+static method test() → void
+  ;
+static method functionExpressionInvocation() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.outline.expect
new file mode 100644
index 0000000..9bbf070
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.outline.expect
@@ -0,0 +1,55 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:5: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T m<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:12: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type, 'dynamic', in the overridden method, 'C.m'.
+// Change to a supertype of 'dynamic', or, for a covariant parameter, a subtype.
+//   T m<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:5: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T g<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: 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:15:12: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type, 'int', in the overridden method, 'C.g'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   T g<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m(dynamic x) → dynamic
+    ;
+  method g(core::int* x) → dynamic
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method m<T extends core::Object* = dynamic>(self::D::m::T* x) → self::D::m::T*
+    ;
+  method g<T extends core::Object* = dynamic>(self::D::g::T* x) → self::D::g::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.outline.expect
new file mode 100644
index 0000000..465372c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<V extends core::Object* = dynamic> = (V*) →* void;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::f::U*) →* void
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.outline.expect
new file mode 100644
index 0000000..cd56022
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef G<V extends core::Object* = dynamic> = () →* core::List<V*>*;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(() →* core::List<self::C::f::U*>* g) → void
+    ;
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  abstract method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.outline.expect
new file mode 100644
index 0000000..0a73a00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<V extends core::Object* = dynamic> = () →* V*;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → () →* self::C::f::U*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.outline.expect
new file mode 100644
index 0000000..e19be4b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.outline.expect
@@ -0,0 +1,45 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+import "dart:math";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::num* = core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
+    ;
+}
+static method test() → dynamic
+  ;
+static method takeIII((core::int*, core::int*) →* core::int* fn) → void
+  ;
+static method takeDDD((core::double*, core::double*) →* core::double* fn) → void
+  ;
+static method takeIDI((core::double*, core::int*) →* core::int* fn) → void
+  ;
+static method takeDID((core::int*, core::double*) →* core::double* fn) → void
+  ;
+static method takeIDN((core::double*, core::int*) →* core::num* fn) → void
+  ;
+static method takeDIN((core::int*, core::double*) →* core::num* fn) → void
+  ;
+static method takeIIN((core::int*, core::int*) →* core::num* fn) → void
+  ;
+static method takeDDN((core::double*, core::double*) →* core::num* fn) → void
+  ;
+static method takeNNN((core::num*, core::num*) →* core::num* fn) → void
+  ;
+static method takeOON((core::Object*, core::Object*) →* core::num* fn) → void
+  ;
+static method takeOOO((core::Object*, core::Object*) →* core::num* fn) → void
+  ;
+static method takeOOI((core::Object*, core::Object*) →* core::int* fn) → void
+  ;
+static method takeIIO((core::int*, core::int*) →* core::Object* fn) → void
+  ;
+static method takeDDO((core::double*, core::double*) →* core::Object* fn) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.outline.expect
new file mode 100644
index 0000000..45f2f2b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method m<S extends core::Object* = dynamic>(self::D::m::S* x) → self::D::m::S*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.outline.expect
new file mode 100644
index 0000000..824697a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method f() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.outline.expect
new file mode 100644
index 0000000..abf425d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method make(core::int* x) → asy::Future<core::int*>*
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.outline.expect
new file mode 100644
index 0000000..41b11c5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+
+class Trace extends core::Object {
+  field core::List<self::Frame*>* frames;
+  synthetic constructor •() → self::Trace*
+    ;
+}
+class Frame extends core::Object {
+  field core::String* location;
+  synthetic constructor •() → self::Frame*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.outline.expect
new file mode 100644
index 0000000..2afc98d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::Iterable<core::num*>*;
+typedef G = (core::double*) →* core::List<core::int*>*;
+static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
index 4046a6c..1374798 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
@@ -5,13 +5,13 @@
 class A extends core::Object implements self::B {
   synthetic constructor •() → self::A*
     ;
-  get x() → dynamic
+  get x() → core::int*
     ;
-  set x(dynamic value) → void
+  set x(core::int* value) → void
     ;
 }
 class B extends core::Object {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.outline.expect
new file mode 100644
index 0000000..7971d4a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* f;
+  synthetic constructor •() → self::A*
+    ;
+}
+static field self::A* a;
+static field core::int* c;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.outline.expect
new file mode 100644
index 0000000..f9000f4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.outline.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  operator +(dynamic other) → core::int*
+    ;
+  operator -(dynamic other) → core::double*
+    ;
+}
+static field core::int* v_add;
+static field core::double* v_minus;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.outline.expect
new file mode 100644
index 0000000..fc1ae00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::double* a_add;
+static field core::double* a_subtract;
+static field core::double* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::double* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.outline.expect
new file mode 100644
index 0000000..fc1ae00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::double* a_add;
+static field core::double* a_subtract;
+static field core::double* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::double* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.outline.expect
new file mode 100644
index 0000000..fc1ae00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::double* a_add;
+static field core::double* a_subtract;
+static field core::double* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::double* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.outline.expect
new file mode 100644
index 0000000..cc7c479
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::int* a_bitXor;
+static field core::int* a_bitAnd;
+static field core::int* a_bitOr;
+static field core::int* a_bitShiftRight;
+static field core::int* a_bitShiftLeft;
+static field core::int* a_add;
+static field core::int* a_subtract;
+static field core::int* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::int* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.outline.expect
new file mode 100644
index 0000000..6ea6d78
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::num* a;
+static field core::num* b;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
new file mode 100644
index 0000000..d58d84f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_consts_transitively_2_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
+
+static const field core::int* m1 = inf::a1;
+static const field core::int* m2 = inf::a2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+import "infer_consts_transitively_2.dart" as self;
+import "infer_consts_transitively_2_b.dart" as inf2;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
+import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
+
+static const field core::int* a1 = self::m2;
+static const field core::int* a2 = inf2::b1;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf2;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
new file mode 100644
index 0000000..cb88599
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_consts_transitively_2.dart" as test;
+import "infer_consts_transitively_2_b.dart" as inf;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
+import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
+
+static const field core::int* a1 = test::m2;
+static const field core::int* a2 = inf::b1;
+static method main() → dynamic
+  ;
+
+library test;
+import self as test;
+import "dart:core" as core;
+import "infer_consts_transitively_2_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
+
+static const field core::int* m1 = self::a1;
+static const field core::int* m2 = self::a2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.outline.expect
new file mode 100644
index 0000000..afdd6d7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.outline.expect
new file mode 100644
index 0000000..afdd6d7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.outline.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.outline.expect
new file mode 100644
index 0000000..dfad962
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic x;
+  field core::int* y;
+  field core::String* z;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  field dynamic x;
+  field core::int* y;
+  field core::String* z;
+  field core::int* w;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
index 218f5e9..4f999da 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
index b917227..915eb44 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field core::int* x;
-  constructor •(dynamic x) → self::B*
+  constructor •(core::int* x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
index 167fce8..b79c1b0 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
@@ -9,7 +9,7 @@
 }
 class B extends self::A {
   final field core::int* x;
-  constructor •(dynamic x) → self::B*
+  constructor •(core::int* x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
index afb8687..9e5258a 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
@@ -10,7 +10,7 @@
 }
 class B extends self::A {
   final field core::double* x;
-  constructor •(dynamic x) → self::B*
+  constructor •(core::double* x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.outline.expect
new file mode 100644
index 0000000..1a5ccea
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.outline.expect
@@ -0,0 +1,41 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Error: Getter not found: 'x'.
+// var 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
+//                                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+  operator +(dynamic other) → self::B*
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic ignore) → self::B*
+    ;
+}
+static field self::A* a;
+static field self::B* b;
+static field core::List<dynamic>* c1;
+static field core::List<dynamic>* c2;
+static field core::Map<dynamic, dynamic>* d;
+static field self::A* e;
+static field core::int* f;
+static field core::int* g;
+static field self::B* h;
+static field dynamic i;
+static field self::B* j;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.outline.expect
new file mode 100644
index 0000000..c17611a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  field dynamic x;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.outline.expect
new file mode 100644
index 0000000..8b9dd44
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field dynamic x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  final field dynamic x;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.outline.expect
new file mode 100644
index 0000000..6a7760a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.outline.expect
@@ -0,0 +1,51 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
+
+static field core::int* y;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+static field core::int* x;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self3;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self3::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self4;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self4::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.outline.expect
new file mode 100644
index 0000000..e70d202
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.outline.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self2::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.outline.expect
new file mode 100644
index 0000000..6cdbef6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.outline.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.outline.expect
new file mode 100644
index 0000000..7a1dac1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.outline.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+static field core::int* x;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self3::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.outline.expect
new file mode 100644
index 0000000..a618e67
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
+
+static field core::int* y;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static field core::int* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.outline.expect
new file mode 100644
index 0000000..07b69ed
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.outline.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self2::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.outline.expect
new file mode 100644
index 0000000..9aa0236
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.outline.expect
new file mode 100644
index 0000000..59f6600
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.outline.expect
new file mode 100644
index 0000000..dc27164
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, {core::String* b, self::C::m::T* c}) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.outline.expect
new file mode 100644
index 0000000..fab9845
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b]) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.outline.expect
new file mode 100644
index 0000000..da0aacf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, [core::String* b, self::C::m::T* c]) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.outline.expect
new file mode 100644
index 0000000..2798d5a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.outline.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.outline.expect
new file mode 100644
index 0000000..1421f70
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.outline.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Resource extends core::Object {
+  synthetic constructor •() → self::Resource*
+    ;
+}
+class Folder extends self::Resource {
+  synthetic constructor •() → self::Folder*
+    ;
+}
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::Foo::T* t) → self::Foo<self::Foo::T*>*
+    ;
+}
+static method getResource(core::String* str) → self::Resource*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.outline.expect
new file mode 100644
index 0000000..f87eb4f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::D {
+  synthetic constructor •() → self::C*
+    ;
+  set foo(core::int* x) → void
+    ;
+}
+class D extends core::Object {
+  field core::int* foo;
+  synthetic constructor •() → self::D*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.outline.expect
new file mode 100644
index 0000000..8d523c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::D {
+  synthetic constructor •() → self::C*
+    ;
+  set foo(core::int* x) → void
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+  set foo(core::int* x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.outline.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.outline.expect
new file mode 100644
index 0000000..5594f99
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_not;
+static field core::int* a_complement;
+static field core::int* a_negate;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.outline.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.outline.expect
new file mode 100644
index 0000000..264d18b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •() → self::A*
+    ;
+  operator ~() → core::int*
+    ;
+  operator unary-() → core::double*
+    ;
+}
+static field self::A* a;
+static field core::int* v_complement;
+static field core::double* v_negate;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.outline.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.outline.expect
new file mode 100644
index 0000000..628cf39
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method strings() → core::List<core::String*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.outline.expect
new file mode 100644
index 0000000..531005e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.outline.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1;
+static final field core::int* m2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self2::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.outline.expect
new file mode 100644
index 0000000..376e563
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* x1 = 1;
+static final field core::int* x2;
+static final field core::int* y1;
+static final field core::int* y2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
new file mode 100644
index 0000000..992d62b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_statics_transitively3_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
+import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
+
+static const field core::int* t1 = 1;
+static const field core::int* t2 = self::t1;
+static const field core::int* t3 = inf::a1;
+static const field core::int* t4 = inf::a2;
+static const field dynamic t5 = inf::A::a3;
+static const field dynamic t6 = inf::A::a3;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static const field dynamic a3 = null;
+  synthetic constructor •() → inf::A*
+    ;
+}
+static const field core::int* a1 = 3;
+static const field core::int* a2 = 4;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.outline.expect
new file mode 100644
index 0000000..7eda95a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.outline.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static const field dynamic a3 = null;
+  synthetic constructor •() → self::A*
+    ;
+}
+static const field core::int* a1 = 3;
+static const field core::int* a2 = 4;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.outline.expect
new file mode 100644
index 0000000..b62ec89
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.outline.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1;
+static final field core::int* m2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
+
+library;
+import self as self4;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self4::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.outline.expect
new file mode 100644
index 0000000..54f49cbb7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1;
+static final field core::int* m2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.outline.expect
new file mode 100644
index 0000000..1634bbb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.outline.expect
new file mode 100644
index 0000000..82eac85
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.outline.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
+
+class T extends core::Object {
+  static final field self::T* foo;
+  synthetic constructor •() → self::T*
+    ;
+  static method m1(core::String* m) → self::T*
+    ;
+  static method m2(dynamic e) → core::String*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static method m3(core::String* a, core::String* b, [dynamic a1, dynamic a2]) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.outline.expect
new file mode 100644
index 0000000..92e6635
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method m3(core::String* a, core::String* b, [dynamic a1, dynamic a2]) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_throw.dart.outline.expect b/pkg/front_end/testcases/inference/infer_throw.dart.outline.expect
new file mode 100644
index 0000000..a26c77f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_throw.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* t;
+static field dynamic a;
+static field core::int* b;
+static field core::int* c;
+static field core::int* d;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.outline.expect
new file mode 100644
index 0000000..fdad487
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.outline.expect
new file mode 100644
index 0000000..740163e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.outline.expect
new file mode 100644
index 0000000..59396ab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.outline.expect
new file mode 100644
index 0000000..556acab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  field core::int* y;
+  final field core::int* z;
+  synthetic constructor •() → self::A*
+    ;
+  method test1() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.outline.expect
new file mode 100644
index 0000000..818f5f5e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x;
+static field core::int* y;
+static final field core::int* z;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.outline.expect
new file mode 100644
index 0000000..6e632b8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.outline.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
+
+class C extends inf::B {
+  synthetic constructor •() → self::C*
+    ;
+  get x() → core::int*
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
+
+class B extends self::A {
+  synthetic constructor •() → inf::B*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.outline.expect
new file mode 100644
index 0000000..3dc6858
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
+
+class B extends test::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library test;
+import self as test;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
+
+class C extends self::B {
+  synthetic constructor •() → test::C*
+    ;
+  get x() → core::int*
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → test::A*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.outline.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.outline.expect
new file mode 100644
index 0000000..de41e4b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<core::int*, core::String*>* a;
+static field core::Map<core::double*, core::int*>* b;
+static field core::Map<core::List<core::int*>*, core::Map<core::String*, core::double*>*>* c;
+static field core::Map<core::int*, dynamic>* d;
+static field core::Map<dynamic, core::int*>* e;
+static field core::Map<dynamic, dynamic>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.outline.expect
new file mode 100644
index 0000000..fd0db16
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.outline.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  final field self::A::T* x;
+  final field self::A::T* w;
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → core::int*
+    ;
+  get w() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.outline.expect
new file mode 100644
index 0000000..42d4b2e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.outline.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::T* x;
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  generic-covariant-impl field self::B::E* y;
+  synthetic constructor •() → self::B<self::B::E*>*
+    ;
+  get x() → self::B::E*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.outline.expect
new file mode 100644
index 0000000..f7f66a7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.outline.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::E*>*
+    ;
+  abstract method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
+}
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> {
+  const constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+  abstract method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
+}
+abstract class M extends core::Object {
+  final field core::int* y;
+  synthetic constructor •() → self::M*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get y() → core::int*
+    ;
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.outline.expect
new file mode 100644
index 0000000..d10152ae
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.outline.expect
@@ -0,0 +1,46 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
+
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+}
+abstract class M extends core::Object {
+  final field core::int* y;
+  synthetic constructor •() → self::M*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get y() → core::int*
+    ;
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inf::I<inf::I::E*>*
+    ;
+  abstract method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.outline.expect
new file mode 100644
index 0000000..4b3a052
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::E*>*
+    ;
+  abstract method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
+}
+static method main() → dynamic
+  ;
+
+library test;
+import self as test;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
+
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
+    : super core::Object::•()
+    ;
+}
+abstract class M extends core::Object {
+  final field core::int* y;
+  synthetic constructor •() → test::M*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M {
+  const constructor •() → test::B<test::B::E*>*
+    : super test::A::•()
+    ;
+  get y() → core::int*
+    ;
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.outline.expect
new file mode 100644
index 0000000..6186c9d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.outline.expect
@@ -0,0 +1,30 @@
+library test;
+//
+// Problems in library:
+//
+// 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, 'int', of the overridden method, 'A.x'.
+// Change to a subtype of 'int'.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Context: This is the overridden method ('x').
+//   final T x = null;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  final field self::A::T* x;
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → dynamic
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.outline.expect
new file mode 100644
index 0000000..2ecbacc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.outline.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* bar;
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
+    ;
+  method foo(generic-covariant-impl self::Bar::T* t) → void
+    ;
+}
+class Baz<T extends core::Object* = dynamic, E extends core::Iterable<self::Baz::T*>* = core::Iterable<dynamic>*, S extends self::Baz::E* = core::Iterable<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
+    ;
+  method foo(generic-covariant-impl self::Baz::S* t) → void
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index 15b2a4d..43bc546 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -10,13 +10,13 @@
   synthetic constructor •() → self::Foo*
     ;
 }
-class Bar<T extends asy::Stream<core::String*>* = dynamic> extends core::Object {
+class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     ;
   method foo(generic-covariant-impl self::Bar::T* t) → dynamic
     ;
 }
-class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = asy::Stream<dynamic>*, S extends self::Baz::E* = asy::Stream<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     ;
   method foo(generic-covariant-impl self::Baz::S* t) → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_variable_void.dart.outline.expect b/pkg/front_end/testcases/inference/infer_variable_void.dart.outline.expect
new file mode 100644
index 0000000..3c20c2d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_variable_void.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+
+static field void x;
+static method f() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.outline.expect
new file mode 100644
index 0000000..e484bfb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* x;
+  constructor •([core::int* x]) → self::Foo*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.outline.expect
new file mode 100644
index 0000000..10e00b4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String* x;
+  field core::Map<core::String*, core::Map<core::String*, core::String*>*>* y;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.outline.expect
new file mode 100644
index 0000000..546284f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::String* y;
+  synthetic constructor •() → self::C*
+    ;
+}
+static field core::String* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.outline.expect
new file mode 100644
index 0000000..558a097
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a;
+  field core::List<core::int*>* b;
+  synthetic constructor •() → self::A*
+    ;
+  method m() → void
+    ;
+}
+static field self::A* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.outline.expect
new file mode 100644
index 0000000..023351f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator *(self::C* other) → core::bool*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.outline.expect
new file mode 100644
index 0000000..e63cff7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  operator *(self::C* other) → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.outline.expect
new file mode 100644
index 0000000..0bc720e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator [](core::int* index) → core::bool*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.outline.expect
new file mode 100644
index 0000000..071abaa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  operator [](core::int* index) → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static method f() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.outline.expect
new file mode 100644
index 0000000..4c4ec52
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator unary-() → core::bool*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.outline.expect
new file mode 100644
index 0000000..01d1040
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  operator unary-() → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.outline.expect
new file mode 100644
index 0000000..7f7e2d3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method g() → core::bool*
+    ;
+}
+static field () →* core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.outline.expect
new file mode 100644
index 0000000..dd6d6c5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  method g() → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field () →* core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.outline.expect
new file mode 100644
index 0000000..093165a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field (core::Object*) →* void v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.outline.expect
new file mode 100644
index 0000000..64a0c83
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method g() → core::bool*
+    ;
+}
+static field core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.outline.expect
new file mode 100644
index 0000000..1dc5beb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  method g() → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
new file mode 100644
index 0000000..f34fca1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::E*>* values = const <self::E*>[self::E::v1];
+  static const field self::E* v1 = const self::E::•(0, "E.v1");
+  const constructor •(core::int* index, core::String* _name) → self::E*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static final field self::E* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
new file mode 100644
index 0000000..c337f19
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::E*>* values = const <self::E*>[self::E::v1];
+  static const field self::E* v1 = const self::E::•(0, "E.v1");
+  const constructor •(core::int* index, core::String* _name) → self::E*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static final field core::List<self::E*>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.outline.expect
new file mode 100644
index 0000000..8c72258
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+static final field core::Map<core::String*, () →* void>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.outline.expect
new file mode 100644
index 0000000..41a8e7b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<T extends core::Object* = dynamic> = () →* T*;
+static final field core::Map<core::String*, () →* core::int*>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.outline.expect
new file mode 100644
index 0000000..022fc54
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<() →* core::Object*>* v;
+static method f() → core::int*
+  ;
+static method g() → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.outline.expect
new file mode 100644
index 0000000..19ea551
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<((core::String*) →* core::int*) →* core::Object*>* v;
+static method f((core::String*) →* core::int* x) → core::int*
+  ;
+static method g((core::String*) →* core::int* x) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.outline.expect
new file mode 100644
index 0000000..13063fa5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<({x: core::int*}) →* core::Object*>* v;
+static method f({core::int* x}) → core::int*
+  ;
+static method g({core::int* x}) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.outline.expect
new file mode 100644
index 0000000..bd37456
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<([core::int*]) →* core::Object*>* v;
+static method f([core::int* x]) → core::int*
+  ;
+static method g([core::int* x]) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.outline.expect
new file mode 100644
index 0000000..4de588f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<(core::int*) →* core::Object*>* v;
+static method f(core::int* x) → core::int*
+  ;
+static method g(core::int* x) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.outline.expect
new file mode 100644
index 0000000..4673ba3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* (core::int*) →* core::Map<core::int*, core::bool*>* f;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.outline.expect
new file mode 100644
index 0000000..a4ec082
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* core::bool* f;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.outline.expect
new file mode 100644
index 0000000..40aeb8e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* core::int* f;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.outline.expect
new file mode 100644
index 0000000..d303dfc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static final field (core::bool*) →* core::int* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
index 3a1211f..d0bd559 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  final field dynamic x;
+  final field core::int* x;
   synthetic constructor •() → self::I1*
     ;
 }
@@ -18,6 +18,6 @@
   get x() → core::int*
     ;
 }
-static field dynamic y;
+static field core::int* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.outline.expect
new file mode 100644
index 0000000..6aa475b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static field self::B<self::A<core::int*>*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.outline.expect
new file mode 100644
index 0000000..90698fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+static field self::B<self::A<core::int*>*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.outline.expect
new file mode 100644
index 0000000..0a2734e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+static field self::B<self::A<dynamic>*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.outline.expect
new file mode 100644
index 0000000..34b5179
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static field self::A<core::int*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.outline.expect
new file mode 100644
index 0000000..34b5179
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static field self::A<core::int*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.outline.expect
new file mode 100644
index 0000000..fc54b7b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.outline.expect
new file mode 100644
index 0000000..2d88b5d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static field self::C<core::int*>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.outline.expect
new file mode 100644
index 0000000..8f0c87e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+static field self::B<self::A*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.outline.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.outline.expect
new file mode 100644
index 0000000..a021f96
--- /dev/null
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method getListOfString() → core::List<core::String*>*
+  ;
+static method foo() → void
+  ;
+static method bar() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect
index ecd13b6..683fac8 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect
@@ -1,9 +1,10 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
-static field dynamic b;
-static field dynamic c;
-static field dynamic d;
+static field core::List<core::int*>* a;
+static field core::List<core::double*>* b;
+static field core::List<core::List<core::int*>*>* c;
+static field core::List<dynamic>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.outline.expect b/pkg/front_end/testcases/inference/list_literals.dart.outline.expect
new file mode 100644
index 0000000..893540e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.outline.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.outline.expect
new file mode 100644
index 0000000..24cab9d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* x1;
+static field core::List<core::num*>* x2;
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.outline.expect b/pkg/front_end/testcases/inference/map_literals.dart.outline.expect
new file mode 100644
index 0000000..893540e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.outline.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.outline.expect
new file mode 100644
index 0000000..f63db32
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<core::int*, core::String*>* x1;
+static field core::Map<core::num*, core::Pattern*>* x2;
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.outline.expect
new file mode 100644
index 0000000..9bfb5d5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::D<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.outline.expect
new file mode 100644
index 0000000..26e19b2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::C* c;
+static field self::D<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.outline.expect
new file mode 100644
index 0000000..ee571a5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::D<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.outline.expect
new file mode 100644
index 0000000..5edbaf7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::D<core::int*>* g;
+static method f<T extends core::Object* = dynamic>() → self::D<self::f::T*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
index a7ce02f..07c3f61 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<X extends core::Object* = dynamic, Y extends core::String* = dynamic> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends core::String* = core::String*> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
index 6af70be..f952fac 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
@@ -1,4 +1,16 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+//  - 'Comparable' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class A extends M1 with M0 {}
+//       ^
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
+// class M0<X, Y extends Comparable<Y>> extends I<X> {}
+//             ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -6,7 +18,7 @@
   synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = dynamic> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.outline.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.outline.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.outline.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.outline.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.outline.expect
new file mode 100644
index 0000000..672fbfb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic h;
+static method foo((core::Object*) →* core::int* f) → void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
index 583e980..3c44d0cc 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<X extends core::Object* = dynamic> extends core::Object {
-  final field dynamic foo;
+  final field core::String* foo;
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
 class B<Y extends core::Object* = dynamic> extends self::A<self::B::Y*> {
-  final field dynamic foo;
-  constructor •(dynamic foo) → self::B<self::B::Y*>*
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::B<self::B::Y*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
index 2efb122..6bd3591 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B* = dynamic>(self::f::T* a) → void
+static method f<T extends self::B* = self::B*>(self::f::T* a) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.outline.expect
new file mode 100644
index 0000000..24a81b6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.outline.expect
new file mode 100644
index 0000000..24a81b6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.outline.expect
new file mode 100644
index 0000000..630505e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method test5() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.outline.expect
new file mode 100644
index 0000000..b31847d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.outline.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  field self::A* a;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  field self::B* b;
+  synthetic constructor •() → self::C*
+    ;
+}
+class D extends core::Object {
+  field self::C* c;
+  synthetic constructor •() → self::D*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
index 1ec74b1..b1da205 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
 }
 static field self::C* c;
-static field dynamic function_ref;
-static field dynamic function_ref_list;
+static field () →* core::int* function_ref;
+static field core::List<() →* core::int*>* function_ref_list;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.outline.expect
new file mode 100644
index 0000000..a1ba81e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+static final field core::Type* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.outline.expect
new file mode 100644
index 0000000..4b7a850
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method op(core::double* b) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.outline.expect
new file mode 100644
index 0000000..c8572b5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method op(core::int* b) → void
+    ;
+  method opEq(core::int* b) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.outline.expect
new file mode 100644
index 0000000..5050ee5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method op(generic-covariant-impl self::C::T* b) → void
+    ;
+  method opEq(generic-covariant-impl self::C::T* b) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect
index 7e1ab76..7cc78f5 100644
--- a/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field core::bool* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect
index 7e1ab76..ce3f6d5 100644
--- a/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field core::double* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect
index 7e1ab76..0596698 100644
--- a/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field core::int* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
new file mode 100644
index 0000000..74e9791
--- /dev/null
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  static method f(core::String* s) → core::int*
+    ;
+}
+static const field (core::String*) →* core::int* v = self::C::f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/string_literal.dart.outline.expect b/pkg/front_end/testcases/inference/string_literal.dart.outline.expect
index b10c845..506fd95 100644
--- a/pkg/front_end/testcases/inference/string_literal.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/string_literal.dart.outline.expect
@@ -1,9 +1,10 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
-static field dynamic a;
-static field dynamic b;
-static field dynamic c;
+static field core::int* x;
+static field core::String* a;
+static field core::String* b;
+static field core::String* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
index b8b9db0..2148ea4 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
index 4752269..50d69f8 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field dynamic f;
+  field () →* core::int* f;
   synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
index ec6089a..93be11a 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
@@ -9,7 +9,7 @@
     ;
 }
 class C extends core::Object {
-  field dynamic f;
+  field self::CallableClass* f;
   synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect
index 3b44c95..e393ff8 100644
--- a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic i;
+static field core::int* i;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
index 0cf1b92..32f2f1d 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
@@ -13,6 +13,6 @@
     ;
 }
 static field self::A<core::num*>* a;
-static field dynamic b;
+static field self::B<core::int*>* b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.outline.expect
new file mode 100644
index 0000000..bd31fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    ;
+}
+static field self::C<dynamic>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..19474ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    ;
+}
+static field self::C<core::int*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..be2806f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.outline.expect
new file mode 100644
index 0000000..db56dbb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •(() →* dynamic x) → self::C*
+    ;
+}
+static field self::C* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.outline.expect
new file mode 100644
index 0000000..10eb51f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<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_dynamic_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
new file mode 100644
index 0000000..10eb51f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<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.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..f0dd2fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* 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_expr2.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
new file mode 100644
index 0000000..f0dd2fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* 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_implicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..c7133df
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.outline.expect
new file mode 100644
index 0000000..c7133df
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.outline.expect
new file mode 100644
index 0000000..8c0f7c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f(dynamic x) → core::double*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.outline.expect
new file mode 100644
index 0000000..8c0f7c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f(dynamic x) → core::double*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.outline.expect
new file mode 100644
index 0000000..87c776d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.outline.expect
new file mode 100644
index 0000000..87c776d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.outline.expect
new file mode 100644
index 0000000..a207fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..a207fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..a207fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.outline.expect
new file mode 100644
index 0000000..2579e0a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f(dynamic x) → core::double*
+    ;
+}
+static field core::double* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.outline.expect
new file mode 100644
index 0000000..24086b1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic x;
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T*
+  ;
+static method printRunning() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
index a833221..7ba11cd 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
@@ -1,4 +1,12 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:5: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var b = /*@ returnType=() ->* invalid-type */ () =>
+//     ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -10,10 +18,10 @@
   method g(dynamic i) → core::int*
     ;
 }
-static field dynamic a;
-static field dynamic b;
-static field dynamic c;
-static field dynamic d;
-static field dynamic e;
+static field self::A* a;
+static field invalid-type b;
+static field () →* invalid-type c;
+static field () →* () →* core::int* d;
+static field () →* core::int* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
index 078aa97..c44763e 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
@@ -1,15 +1,23 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
+// Specify the type explicitly.
+// var a = /*@ returnType=num* */ () => intValue /*@target=num::+*/ + b;
+//     ^
+//
 import self as self;
 import "dart:core" as core;
 
 static field core::int* intValue;
 static field core::num* numValue;
 static field core::double* doubleValue;
-static field dynamic a;
+static field invalid-type a;
 static field dynamic b;
-static field dynamic c;
-static field dynamic d;
-static field dynamic e;
-static field dynamic f;
+static field () →* core::num* c;
+static field core::num* d;
+static field () →* core::double* e;
+static field core::double* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
index 7322015..f42e8b5 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
@@ -11,6 +11,6 @@
   constructor •(self::B::T* x) → self::B<self::B::T*>*
     ;
 }
-static field dynamic t3;
+static field core::List<self::B<core::int*>*>* t3;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
index 7ce484e..382933c 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -6,6 +6,6 @@
   constructor •(self::A::T* x) → self::A<self::A::T*>*
     ;
 }
-static field dynamic t2;
+static field core::List<self::A<core::int*>*>* t2;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
index 93bd955..c95d0de 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
@@ -1,16 +1,24 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:7: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var x = /*@returnType=invalid-type*/ () => new B(). /*@target=B::x*/ x;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic x;
-  field dynamic y;
+  field invalid-type x;
+  field () →* invalid-type y;
   synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  field dynamic x;
-  field dynamic y;
+  field invalid-type x;
+  field () →* invalid-type y;
   synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
index 4f84fb6..b3128a3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static field core::List<core::double*>* a;
-static field dynamic b;
+static field core::double* b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
index 30d498e..e5e9410 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
@@ -7,13 +7,13 @@
   synthetic constructor •() → self::A*
     ;
 }
-static field dynamic v_assign;
-static field dynamic v_plus;
-static field dynamic v_minus;
-static field dynamic v_multiply;
-static field dynamic v_prefix_pp;
-static field dynamic v_prefix_mm;
-static field dynamic v_postfix_pp;
-static field dynamic v_postfix_mm;
+static field core::int* v_assign;
+static field core::int* v_plus;
+static field core::int* v_minus;
+static field core::int* v_multiply;
+static field core::int* v_prefix_pp;
+static field core::int* v_prefix_mm;
+static field core::int* v_postfix_pp;
+static field core::int* v_postfix_mm;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
index abd1782..f0cfbcc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
@@ -15,9 +15,9 @@
   synthetic constructor •() → self::B*
     ;
 }
-static field dynamic v_prefix_pp;
-static field dynamic v_prefix_mm;
-static field dynamic v_postfix_pp;
-static field dynamic v_postfix_mm;
+static field core::int* v_prefix_pp;
+static field core::double* v_prefix_mm;
+static field self::A* v_postfix_pp;
+static field self::A* v_postfix_mm;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
index 1e6470c..454ab6d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
@@ -8,8 +8,8 @@
     ;
 }
 static field self::A* a;
-static field dynamic b;
-static field dynamic c;
-static field dynamic d;
+static field core::int* b;
+static field core::int* c;
+static field core::int* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
index fe43c76..a468053 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
@@ -23,8 +23,8 @@
   synthetic constructor •() → self::D*
     ;
 }
-static field dynamic a;
-static field dynamic x;
-static field dynamic y;
+static field self::A* a;
+static field self::C* x;
+static field self::C* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
index f51db36..8c060c2 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
@@ -20,8 +20,8 @@
   synthetic constructor •() → self::D*
     ;
 }
-static field dynamic a;
-static field dynamic x;
-static field dynamic y;
+static field self::A* a;
+static field self::C* x;
+static field self::C* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
index aae5d7d..fee3471 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
@@ -1,15 +1,23 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:7: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+//   var b = /*@ returnType=() ->* invalid-type */ () => x;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic b;
-  field dynamic c;
+  field invalid-type b;
+  field () →* () →* invalid-type c;
   synthetic constructor •() → self::A*
     ;
 }
-static field dynamic a;
-static field dynamic x;
-static field dynamic y;
+static field self::A* a;
+static field () →* invalid-type x;
+static field () →* () →* () →* invalid-type y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
index 2f9d5ce..13732dc 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x;
-static field dynamic y;
+static field core::bool* x;
+static field core::bool* y;
 static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
index 093da51..2013872 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
@@ -14,6 +14,6 @@
   method f() → void
     ;
 }
-static field dynamic x;
+static field void x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
index 2c1f8c3..51cd968 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
@@ -4,6 +4,6 @@
 
 static field core::int* i;
 static field core::String* s;
-static field dynamic x;
+static field core::String* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
index cbf3089..efecb76 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
+static field core::List<core::Null*>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
index cbf3089..0f28e73 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
+static field core::Map<core::Null*, core::Null*>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
index c49eaef..ea79db2 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
@@ -12,11 +12,11 @@
     ;
 }
 static field self::C* c;
-static field dynamic field_ref;
-static field dynamic getter_ref;
-static field dynamic function_ref;
-static field dynamic field_ref_list;
-static field dynamic getter_ref_list;
-static field dynamic function_ref_list;
+static field core::int* field_ref;
+static field core::int* getter_ref;
+static field () →* core::int* function_ref;
+static field core::List<core::int*>* field_ref_list;
+static field core::List<core::int*>* getter_ref_list;
+static field core::List<() →* core::int*>* function_ref_list;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
index 34725d5..e14b203 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
@@ -1,10 +1,18 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => f() ? y : z;
+//     ^
+//
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x;
-static field dynamic y;
-static field dynamic z;
+static field invalid-type x;
+static field () →* invalid-type y;
+static field () →* invalid-type z;
 static method f() → core::bool*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
index 3e04860..d517114 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
@@ -40,7 +40,7 @@
   method foo() → self::C*
     ;
 }
-static field dynamic x;
+static field self::B* x;
 static method bar() → self::G*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
index 81dff1f..f0dd2fa 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v;
+static field core::List<core::int*>* 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/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
index 81dff1f..f0dd2fa 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v;
+static field core::List<core::int*>* 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/void_return_type_subtypes_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
index abbb66b..46dad28 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic y;
+static field void y;
 static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T*
   ;
 static method printRunning() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
index 773a50f..b3d2329 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
@@ -10,7 +10,7 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic, Z extends (self::D::Y*) →* self::D::X* = dynamic, W extends core::num* = dynamic> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null*) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
index 1c9866f..ddec6fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
index 1c9866f..ddec6fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
index a44d4e1..b719a1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+class A<T extends self::A<self::A::T>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
index 44ba958..3d491c7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
index 44ba958..3d491c7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
new file mode 100644
index 0000000..9038ebd
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<U extends (U) →* dynamic = (dynamic) →* dynamic> = (U*) →* dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method foo() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
index 5a9d18f..941b9b6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic>* c;
+static field self::C<core::num*, (core::Null*) →* void>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
index 38c128d..28f1f4b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-static field dynamic lc;
-static field dynamic mc;
+static field core::List<self::C<core::num*, (core::Null*) →* void>*>* lc;
+static field core::Map<self::C<core::num*, (core::Null*) →* void>*, self::C<core::num*, (core::Null*) →* void>*>* mc;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
index 42b3335..543c453 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic>* e;
+static field self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>* d;
+static field self::E<(core::Null*) →* void>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
index b75263b..bcf89d2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field dynamic ld;
-static field dynamic md;
-static field dynamic le;
-static field dynamic me;
+static field core::List<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* ld;
+static field core::Map<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*, self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* md;
+static field core::List<self::E<(core::Null*) →* void>*>* le;
+static field core::Map<self::E<(core::Null*) →* void>*, self::E<(core::Null*) →* void>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
index 06bc06a..e6c39b1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
@@ -6,25 +6,25 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic>* c;
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic, dynamic>* e;
-static field self::F<dynamic, dynamic>* f;
+static field self::C<dynamic, self::A<dynamic>*>* c;
+static field self::D<core::num*, self::A<core::num*>*>* d;
+static field self::E<dynamic, () →* dynamic>* e;
+static field self::F<core::num*, () →* core::num*>* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
index 32d8cdb..3bf392c8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
@@ -6,29 +6,29 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
 }
-static field dynamic lc;
-static field dynamic mc;
-static field dynamic ld;
-static field dynamic md;
-static field dynamic le;
-static field dynamic me;
-static field dynamic lf;
-static field dynamic mf;
+static field core::List<self::C<dynamic, self::A<dynamic>*>*>* lc;
+static field core::Map<self::C<dynamic, self::A<dynamic>*>*, self::C<dynamic, self::A<dynamic>*>*>* mc;
+static field core::List<self::D<core::num*, self::A<core::num*>*>*>* ld;
+static field core::Map<self::D<core::num*, self::A<core::num*>*>*, self::D<core::num*, self::A<core::num*>*>*>* md;
+static field core::List<self::E<dynamic, () →* dynamic>*>* le;
+static field core::Map<self::E<dynamic, () →* dynamic>*, self::E<dynamic, () →* dynamic>*>* me;
+static field core::List<self::F<core::num*, () →* core::num*>*>* lf;
+static field core::Map<self::F<core::num*, () →* core::num*>*, self::F<core::num*, () →* core::num*>*>* mf;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
index 2c04aba..ab32947 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
@@ -10,20 +10,20 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends () →* self::F::X = dynamic> extends core::Object {
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*>*
     ;
 }
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic, dynamic>* e;
-static field self::F<dynamic>* f;
+static field self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>* d;
+static field self::E<self::B<dynamic, dynamic>*, () →* dynamic>* e;
+static field self::F<() →* dynamic>* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
index 6cfd9f5..e9f5ac1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
@@ -10,23 +10,23 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends () →* self::F::X = dynamic> extends core::Object {
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*>*
     ;
 }
-static field dynamic ld;
-static field dynamic md;
-static field dynamic le;
-static field dynamic me;
-static field dynamic lf;
-static field dynamic mf;
+static field core::List<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* ld;
+static field core::Map<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* md;
+static field core::List<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* le;
+static field core::Map<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*, self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* me;
+static field core::List<self::F<() →* dynamic>*>* lf;
+static field core::Map<self::F<() →* dynamic>*, self::F<() →* dynamic>*>* mf;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
index 1a94d9d..e767b17 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
@@ -6,15 +6,15 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic>* c;
-static field self::D<dynamic, dynamic>* d;
+static field self::C<dynamic, (core::Null*) →* dynamic>* c;
+static field self::D<core::num*, (core::Null*) →* core::num*>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
index e27f41f..04e5fdf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
@@ -6,17 +6,17 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-static field dynamic lc;
-static field dynamic mc;
-static field dynamic ld;
-static field dynamic md;
+static field core::List<self::C<dynamic, (core::Null*) →* dynamic>*>* lc;
+static field core::Map<self::C<dynamic, (core::Null*) →* dynamic>*, self::C<dynamic, (core::Null*) →* dynamic>*>* mc;
+static field core::List<self::D<core::num*, (core::Null*) →* core::num*>*>* ld;
+static field core::Map<self::D<core::num*, (core::Null*) →* core::num*>*, self::D<core::num*, (core::Null*) →* core::num*>*>* md;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
index a014cc8..053b62f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
@@ -4,6 +4,6 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<dynamic>* y;
+static field col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
index b01dcf6..86fbb12 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
index b01dcf6..86fbb12 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
index 8db9fc1..1a8907a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends core::num* = dynamic, S extends core::List<self::B::T*>* = dynamic> extends self::A<self::B::T*> {
+class B<T extends core::num* = core::num*, S extends core::List<self::B::T*>* = core::List<core::num*>*> extends self::A<self::B::T*> {
   constructor •([self::B::T* x]) → self::B<self::B::T*, self::B::S*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
index dafb049..4b449c4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>* = dynamic> extends core::Object {
+class B<T extends core::Comparable<self::B::T>* = core::Comparable<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-static field dynamic y;
+static field self::B<core::Comparable<dynamic>*>* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
index 4db0df2..7bd7cea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  method foo(self::A<dynamic>* a) → dynamic
+  method foo(self::A<core::num*>* a) → dynamic
     ;
-  method bar() → self::A<dynamic>*
+  method bar() → self::A<core::num*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
index c7fd878..048cb6e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-static field dynamic a;
+static field core::List<self::A<core::num*>*>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
index c7fd878..1fef771 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-static field dynamic a;
+static field core::Map<self::A<core::num*>*, self::A<core::num*>*>* a;
 static method main() → dynamic
   ;
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 81409aa..556a2ee 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
@@ -37,40 +37,40 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::A<self::D::X>* = dynamic, Y extends self::A<self::D::Y>* = dynamic> extends core::Object {
+class D<X extends self::A<self::D::X>* = self::A<dynamic>*, Y extends self::A<self::D::Y>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>* = dynamic, X extends self::C<self::E::W*, self::E::X>* = dynamic, Y extends self::B<self::E::Y, self::E::Z>* = dynamic, Z extends self::C<self::E::Y*, self::E::Z>* = dynamic> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X>* = self::B<dynamic, dynamic>*, X extends self::C<self::E::W*, self::E::X>* = self::C<dynamic, dynamic>*, Y extends self::B<self::E::Y, self::E::Z>* = self::B<dynamic, dynamic>*, Z extends self::C<self::E::Y*, self::E::Z>* = self::C<dynamic, dynamic>*> extends core::Object {
   synthetic constructor •() → self::E<self::E::W*, self::E::X*, self::E::Y*, self::E::Z*>*
     ;
 }
-class F<V extends core::num* = dynamic, W extends self::B<self::F::W, self::F::X>* = dynamic, X extends self::C<self::F::W*, self::F::X>* = dynamic, Y extends self::B<self::F::W*, self::F::X*>* = dynamic, Z extends self::C<self::F::Y*, self::F::Z>* = dynamic> extends core::Object {
+class F<V extends core::num* = core::num*, W extends self::B<self::F::W, self::F::X>* = self::B<dynamic, dynamic>*, X extends self::C<self::F::W*, self::F::X>* = self::C<dynamic, dynamic>*, Y extends self::B<self::F::W*, self::F::X*>* = self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, Z extends self::C<self::F::Y*, self::F::Z>* = self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*> extends core::Object {
   synthetic constructor •() → self::F<self::F::V*, self::F::W*, self::F::X*, self::F::Y*, self::F::Z*>*
     ;
 }
-class G<V extends core::num* = dynamic, W extends self::B<self::G::V*, self::G::X>* = dynamic, X extends self::C<self::G::W*, self::G::V*>* = dynamic, Y extends self::B<self::G::W*, self::G::X*>* = dynamic, Z extends self::C<self::G::Y*, self::G::Z>* = dynamic> extends core::Object {
+class G<V extends core::num* = core::num*, W extends self::B<self::G::V*, self::G::X>* = self::B<core::num*, dynamic>*, X extends self::C<self::G::W*, self::G::V*>* = self::C<dynamic, core::num*>*, Y extends self::B<self::G::W*, self::G::X*>* = self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, Z extends self::C<self::G::Y*, self::G::Z>* = self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*> extends core::Object {
   synthetic constructor •() → self::G<self::G::V*, self::G::W*, self::G::X*, self::G::Y*, self::G::Z*>*
     ;
 }
-class H<S extends self::A<self::H::S>* = dynamic, T extends self::B<self::H::T, self::H::U>* = dynamic, U extends self::C<self::H::T*, self::H::U>* = dynamic, V extends self::A<self::H::V>* = dynamic, W extends self::H::S* = dynamic, X extends self::H::T* = dynamic, Y extends self::H::U* = dynamic, Z extends self::H::V* = dynamic> extends core::Object {
+class H<S extends self::A<self::H::S>* = self::A<dynamic>*, T extends self::B<self::H::T, self::H::U>* = self::B<dynamic, dynamic>*, U extends self::C<self::H::T*, self::H::U>* = self::C<dynamic, dynamic>*, V extends self::A<self::H::V>* = self::A<dynamic>*, W extends self::H::S* = self::A<dynamic>*, X extends self::H::T* = self::B<dynamic, dynamic>*, Y extends self::H::U* = self::C<dynamic, dynamic>*, Z extends self::H::V* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::H<self::H::S*, self::H::T*, self::H::U*, self::H::V*, self::H::W*, self::H::X*, self::H::Y*, self::H::Z*>*
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = dynamic, W extends (self::I::X) →* dynamic = dynamic, X extends (self::I::V*) →* dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = (core::Null*) →* dynamic, W extends (self::I::X) →* dynamic = (core::Null*) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null*) →* dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T, self::I::U, self::I::V*, self::I::W*, self::I::X*, self::I::Y, self::I::Z>*
     ;
 }
-class J<S extends (self::J::U) →* self::J::T = dynamic, T extends (self::J::S*) →* self::J::U = dynamic, U extends (self::J::T*) →* self::J::S* = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U) →* self::J::T = (core::Null*) →* dynamic, T extends (self::J::S*) →* self::J::U = (core::Null*) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null*) →* dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = (core::Null*) →* dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V, self::J::W, self::J::X*, self::J::Y, self::J::Z*>*
     ;
 }
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic, dynamic, dynamic, dynamic>* e;
-static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic>* f;
-static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic>* g;
-static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* h;
-static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* i;
-static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* j;
+static field self::D<self::A<dynamic>*, self::A<dynamic>*>* d;
+static field self::E<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>* e;
+static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
+static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
+static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
+static field self::I<dynamic, dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* i;
+static field self::J<(core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
index 8c2fc53..78b6d1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
@@ -6,50 +6,50 @@
   synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
     ;
 }
-class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
 }
-class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field self::C1<dynamic, dynamic>* c1;
-static field self::C2<dynamic, dynamic>* c2;
-static field self::C3<dynamic, dynamic>* c3;
-static field self::C4<dynamic, dynamic>* c4;
-static field self::D1<dynamic, dynamic>* d1;
-static field self::D2<dynamic, dynamic>* d2;
-static field self::D3<dynamic, dynamic>* d3;
-static field self::D4<dynamic, dynamic>* d4;
-static field self::E<dynamic>* e;
+static field self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c1;
+static field self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c2;
+static field self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c3;
+static field self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d4;
+static field self::E<(core::Null*) →* dynamic>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
index b742990..0db7d67 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
@@ -6,59 +6,59 @@
   synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
     ;
 }
-class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
 }
-class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field dynamic lc1;
-static field dynamic mc1;
-static field dynamic lc2;
-static field dynamic mc2;
-static field dynamic lc3;
-static field dynamic mc3;
-static field dynamic lc4;
-static field dynamic mc4;
-static field dynamic ld1;
-static field dynamic md1;
-static field dynamic ld2;
-static field dynamic md2;
-static field dynamic ld3;
-static field dynamic md3;
-static field dynamic ld4;
-static field dynamic md4;
-static field dynamic le;
-static field dynamic me;
+static field core::List<self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* lc1;
+static field core::Map<self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* mc1;
+static field core::List<self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* lc2;
+static field core::Map<self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* mc2;
+static field core::List<self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* lc3;
+static field core::Map<self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* mc3;
+static field core::List<self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* lc4;
+static field core::Map<self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* mc4;
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* ld1;
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* md1;
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* ld2;
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* md2;
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* ld3;
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* md3;
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* ld4;
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* md4;
+static field core::List<self::E<(core::Null*) →* dynamic>*>* le;
+static field core::Map<self::E<(core::Null*) →* dynamic>*, self::E<(core::Null*) →* dynamic>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
index 5f6a80b..18774f6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: Bound of this variable references variable 'TypeT' from the same declaration.
+// class A<TypeT, TypeS extends TypeT> {}
+//                ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -10,10 +21,10 @@
   synthetic constructor •() → self::B<self::B::TypeU*>*
     ;
 }
-class C<TypeV extends self::B<dynamic>* = dynamic> extends core::Object {
+class C<TypeV extends self::B<dynamic>* = self::B<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::TypeV*>*
     ;
 }
-static field self::C<dynamic>* c;
+static field self::C<self::B<dynamic>*>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
index 81293ce..c2e470a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: Bound of this variable references variable 'TypeT' from the same declaration.
+// class A<TypeT, TypeS extends TypeT> {}
+//                ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
index 6729f04..33a14b2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
@@ -1,9 +1,23 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: 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: Context: Bound of this variable references raw type 'Fisk'.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends self::Hest<dynamic>* = dynamic>() →* void;
-class Hest<TypeX extends <TypeY extends self::Hest<dynamic>* = dynamic>() →* void = dynamic> extends core::Object {
+typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = <TypeY extends core::Object* = dynamic>() →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
index a6fe87c..1283fc5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
@@ -1,9 +1,23 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: 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: Context: Bound of this variable references raw type 'Fisk'.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<TypeY extends self::Hest<dynamic>* = dynamic> = () →* void;
-class Hest<TypeX extends () →* void = dynamic> extends core::Object {
+typedef Fisk<TypeY extends core::Object* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void = () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
index b15092d..a14595a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
@@ -1,8 +1,16 @@
 library;
+//
+// Problems in library:
+//
+// 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> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic>* = dynamic> extends core::Object {
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
index 2c55b6f..667c623 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
@@ -1,8 +1,21 @@
 library;
+//
+// Problems in library:
+//
+// 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> {}
+//                                ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic, dynamic>* = dynamic, TypeY extends self::Hest<dynamic, dynamic>* = dynamic> extends core::Object {
+class Hest<TypeX extends core::Object* = dynamic, TypeY extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*, self::Hest::TypeY*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
index ce84ab3..84aeb37 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
@@ -1,8 +1,16 @@
 library;
+//
+// Problems in library:
+//
+// 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>> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
index 39ff531..e90977d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = dynamic> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
index 35c5f78..09fd8ad 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
@@ -1,12 +1,31 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: 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: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic>* = dynamic, TypeZ extends self::Hest<dynamic>* = dynamic> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic, TypeZ extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*, self::Fisk::TypeZ*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
index 286a5ac..261be38 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
@@ -1,11 +1,19 @@
 library;
+//
+// Problems in library:
+//
+// 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> {}
+//            ^
+//
 import self as self;
 import "dart:collection" as col;
 import "dart:core" as core;
 
 import "dart:collection";
 
-class Hest<X extends col::LinkedListEntry<dynamic>* = dynamic> extends core::Object {
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::X*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
index 760a2bd..b4a29e8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
@@ -1,8 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// 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)> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
index 175cfb3..cda7cca 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
@@ -1,16 +1,35 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: 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: Context: Bound of this variable references variable 'TypeY' from the same declaration.
+// class Fisk<TypeY extends Fisk<TypeY>> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY>* = dynamic> extends core::Object {
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY>* = self::Fisk<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
-class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>*, self::Fisk<dynamic>*>* = dynamic> extends core::Object {
+class Naebdyr<TypeZ extends core::Map<self::Hest<self::Hest<dynamic>*>*, self::Fisk<self::Fisk<dynamic>*>*>* = dynamic> extends core::Object {
   synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
index ed0fbab..fb1db93 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
@@ -1,11 +1,24 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: 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: Context: Bound of this variable references raw type 'Hest'.
+// class Hest<TypeY extends lib.Hest> {}
+//            ^^^^^
+//
 import self as self;
-import "non_simple_many_libs_same_name_cycle_lib.dart" as non;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-class Hest<TypeX extends non::Hest<dynamic>* = dynamic> extends core::Object {
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
@@ -13,13 +26,13 @@
   ;
 
 library non_simple_many_libs_same_name_cycle_lib;
-import self as non;
+import self as self2;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
-  synthetic constructor •() → non::Hest<non::Hest::TypeY*>*
+class Hest<TypeY extends self::Hest<dynamic>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
index a81c103..2337453 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
@@ -1,12 +1,23 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+class Fisk<TypeY extends core::Map<self::Hest<self::Hest<dynamic>*>*, self::Hest<self::Hest<dynamic>*>*>* = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
index 57cdeed..bd2bd0e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
@@ -1,16 +1,27 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic>* = dynamic> extends core::Object {
+class Naebdyr<TypeZ extends self::Fisk<dynamic>* = self::Fisk<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
index 49f116a..2097fc5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
@@ -1,12 +1,23 @@
 library;
+//
+// Problems in library:
+//
+// 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: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
index 77163cf..ff215ac 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+class B<T extends self::A<core::num*>* = self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect
index c1cd644..040e2a3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Comparable<self::A::X>* = dynamic> extends core::Object {
+class A<X extends core::Comparable<self::A::X>* = core::Comparable<dynamic>*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class B<Y extends self::A<dynamic>* = dynamic> extends core::Object {
+class B<Y extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::Y*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
index a2a9d19..2075628 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+class A<T extends self::A<self::A::T>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-static field self::A<dynamic>* a;
+static field self::A<self::A<dynamic>*>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
index c64d3c5..63d1e70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
@@ -8,11 +8,11 @@
   synthetic constructor •() → self::B*
     ;
 }
-class X<T extends self::B* = dynamic> extends core::Object {
+class X<T extends self::B* = self::B*> extends core::Object {
   synthetic constructor •() → self::X<self::X::T*>*
     ;
 }
-class Y extends self::X<dynamic> {
+class Y extends self::X<self::B*> {
   synthetic constructor •() → self::Y*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
index a05dade..a9a5b64 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  method foo((dynamic) →* dynamic a) → dynamic
+  method foo((core::num*) →* dynamic a) → dynamic
     ;
-  method bar() → (dynamic) →* dynamic
+  method bar() → (core::num*) →* dynamic
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
index e1932d8..9af14c6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
-static field dynamic a;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
+static field core::List<(core::num*) →* dynamic>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
index e1932d8..a1238c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
-static field dynamic a;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
+static field core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
index 434a8b9..345eb14 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
-class B<T extends (dynamic) →* dynamic = dynamic> extends core::Object {
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic = (core::num*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
new file mode 100644
index 0000000..7fd0a96
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<S extends (S) →* dynamic = (dynamic) →* dynamic> = (S*) →* dynamic;
+static field ((dynamic) →* dynamic) →* dynamic b;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/late.dart.outline.expect b/pkg/front_end/testcases/nnbd/late.dart.outline.expect
index 0c33cf6..3ab3586 100644
--- a/pkg/front_end/testcases/nnbd/late.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/late.dart.outline.expect
@@ -1,140 +1,18 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/late.dart:5:6: Error: Expected ';' after this.
-// late int lateStaticField;
-//      ^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:5:10: 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'.
-// late int lateStaticField;
-//          ^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:6:1: 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'.
-// late final int finalLateStaticField;
-// ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:6:1: Error: Expected ';' after this.
-// late final int finalLateStaticField;
-// ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:6:16: Error: The final variable 'finalLateStaticField' must be initialized.
-// Try adding an initializer ('= <expression>') to the declaration.
-// late final int finalLateStaticField;
-//                ^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:9:8: Error: Expected ';' after this.
-//   late int lateInstanceField;
-//        ^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:9:12: 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'.
-//   late int lateInstanceField;
-//            ^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:10:3: 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'.
-//   late final int finalLateInstanceField = 0;
-//   ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:10:3: Error: Expected ';' after this.
-//   late final int finalLateInstanceField = 0;
-//   ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:12:15: Error: Expected ';' after this.
-//   static late int lateStaticField;
-//               ^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:12:15: Error: 'int' is already declared in this scope.
-//   static late int lateStaticField;
-//               ^^^
-// pkg/front_end/testcases/nnbd/late.dart:9:8: Context: Previous declaration of 'int'.
-//   late int lateInstanceField;
-//        ^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:12:19: 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'.
-//   static late int lateStaticField;
-//                   ^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:13:10: 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'.
-//   static late final int finalLateStaticField = 0;
-//          ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:13:10: Error: Expected ';' after this.
-//   static late final int finalLateStaticField = 0;
-//          ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:13:10: Error: 'late' is already declared in this scope.
-//   static late final int finalLateStaticField = 0;
-//          ^^^^
-// pkg/front_end/testcases/nnbd/late.dart:10:3: Context: Previous declaration of 'late'.
-//   late final int finalLateInstanceField = 0;
-//   ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:9:3: Warning: 'late' isn't a type.
-//   late int lateInstanceField;
-//   ^^^^
-// pkg/front_end/testcases/nnbd/late.dart:9:3: Context: This isn't a type.
-//   late int lateInstanceField;
-//   ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:10:14: Warning: 'int' isn't a type.
-//   late final int finalLateInstanceField = 0;
-//              ^^^
-// pkg/front_end/testcases/nnbd/late.dart:10:14: Context: This isn't a type.
-//   late final int finalLateInstanceField = 0;
-//              ^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:12:10: Warning: 'late' isn't a type.
-//   static late int lateStaticField;
-//          ^^^^
-// pkg/front_end/testcases/nnbd/late.dart:12:10: Context: This isn't a type.
-//   static late int lateStaticField;
-//          ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:13:21: Warning: 'int' isn't a type.
-//   static late final int finalLateStaticField = 0;
-//                     ^^^
-// pkg/front_end/testcases/nnbd/late.dart:13:21: Context: This isn't a type.
-//   static late final int finalLateStaticField = 0;
-//                     ^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:5:1: Warning: 'late' isn't a type.
-// late int lateStaticField;
-// ^^^^
-// pkg/front_end/testcases/nnbd/late.dart:6:1: Context: This isn't a type.
-// late final int finalLateStaticField;
-// ^^^^
-//
-// pkg/front_end/testcases/nnbd/late.dart:6:12: Warning: 'int' isn't a type.
-// late final int finalLateStaticField;
-//            ^^^
-// pkg/front_end/testcases/nnbd/late.dart:5:6: Context: This isn't a type.
-// late int lateStaticField;
-//      ^^^
-//
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field invalid-type int;
-  field dynamic lateInstanceField;
-  field dynamic late;
-  final field invalid-type finalLateInstanceField;
-  field dynamic lateStaticField;
-  final field invalid-type finalLateStaticField;
+  late field core::int* lateInstanceField;
+  late final field core::int* finalLateInstanceField;
+  late static field core::int* lateStaticField;
+  late static final field core::int* finalLateStaticField;
   synthetic constructor •() → self::Class*
     ;
   method method() → dynamic
     ;
 }
-static field invalid-type int;
-static field dynamic lateStaticField;
-static field dynamic late;
-static final field invalid-type finalLateStaticField;
+late static field core::int* lateStaticField;
+late static final field core::int* finalLateStaticField;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect
index b50f3c71..0a3ac11 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect
@@ -2,26 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_param.dart:5:6: Error: This requires the 'non-nullable' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-//   int? field;
-//      ^
-//
-// pkg/front_end/testcases/nnbd/nullable_param.dart:6:6: Error: This requires the 'non-nullable' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-//   int? bar(int? x);
-//      ^
-//
-// pkg/front_end/testcases/nnbd/nullable_param.dart:6:15: Error: This requires the 'non-nullable' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-//   int? bar(int? x);
-//               ^
-//
-// pkg/front_end/testcases/nnbd/nullable_param.dart:17:54: Error: This requires the 'non-nullable' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// int test_nullable_function_type_formal_param({int f()? : null}) {
-//                                                      ^
-//
 // pkg/front_end/testcases/nnbd/nullable_param.dart:4:7: Error: The non-abstract class 'Foo' is missing implementations for these members:
 //  - Foo.bar
 // Try to either
diff --git a/pkg/front_end/testcases/nnbd/required.dart.outline.expect b/pkg/front_end/testcases/nnbd/required.dart.outline.expect
index 156e7c1..97154f2 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.outline.expect
@@ -1,60 +1,17 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/required.dart:5:29: Error: Expected '}' before this.
-// method({int a, required int b, required final int c}) {}
-//                             ^
-//
-// pkg/front_end/testcases/nnbd/required.dart:8:31: Error: Expected '}' before this.
-//   method({int a, required int b, required final int c, required covariant final int d}) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/required.dart:12:50: Error: Expected '}' before this.
-// typedef Typedef1 = Function({int a, required int b});
-//                                                  ^
-//
-// pkg/front_end/testcases/nnbd/required.dart:14:39: Error: Expected '}' before this.
-// typedef Typedef2({int a, required int b});
-//                                       ^
-//
-// pkg/front_end/testcases/nnbd/required.dart:16:31: Error: Expected '}' before this.
-// Function({int a, required int b}) field;
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/required.dart:5:16: Warning: Type 'required' not found.
-// method({int a, required int b, required final int c}) {}
-//                ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/required.dart:8:18: Warning: Type 'required' not found.
-//   method({int a, required int b, required final int c, required covariant final int d}) {}
-//                  ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/required.dart:12:37: Warning: Type 'required' not found.
-// typedef Typedef1 = Function({int a, required int b});
-//                                     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/required.dart:14:26: Warning: Type 'required' not found.
-// typedef Typedef2({int a, required int b});
-//                          ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/required.dart:16:18: Warning: Type 'required' not found.
-// Function({int a, required int b}) field;
-//                  ^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef Typedef1 = ({a: core::int*, int: invalid-type}) →* dynamic;
-typedef Typedef2 = ({a: core::int*, int: invalid-type}) →* dynamic;
+typedef Typedef1 = ({a: core::int*, required b: core::int*}) →* dynamic;
+typedef Typedef2 = ({a: core::int*, required b: core::int*}) →* dynamic;
 class Class extends core::Object {
   synthetic constructor •() → self::Class*
     ;
-  method method({core::int* a, invalid-type int}) → dynamic
+  method method({core::int* a, required core::int* b, required final core::int* c, required covariant final core::int* d}) → dynamic
     ;
 }
-static field ({a: core::int*, int: invalid-type}) →* dynamic field;
-static method method({core::int* a, invalid-type int}) → dynamic
+static field ({a: core::int*, required b: core::int*}) →* dynamic field;
+static method method({core::int* a, required core::int* b, required final core::int* c}) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/old_dills/dart2js.version.25.compile.1.dill b/pkg/front_end/testcases/old_dills/dart2js.version.25.compile.1.dill
new file mode 100644
index 0000000..deb7a1a
--- /dev/null
+++ b/pkg/front_end/testcases/old_dills/dart2js.version.25.compile.1.dill
Binary files differ
diff --git a/pkg/front_end/testcases/old_dills/dart2js.version.27.compile.1.dill b/pkg/front_end/testcases/old_dills/dart2js.version.27.compile.1.dill
new file mode 100644
index 0000000..40f0b90
--- /dev/null
+++ b/pkg/front_end/testcases/old_dills/dart2js.version.27.compile.1.dill
Binary files differ
diff --git a/pkg/front_end/testcases/old_dills/dart2js.version.28.compile.1.dill b/pkg/front_end/testcases/old_dills/dart2js.version.28.compile.1.dill
new file mode 100644
index 0000000..606bbf1
--- /dev/null
+++ b/pkg/front_end/testcases/old_dills/dart2js.version.28.compile.1.dill
Binary files differ
diff --git a/pkg/front_end/testcases/old_dills/dart2js.version.29.compile.1.dill b/pkg/front_end/testcases/old_dills/dart2js.version.29.compile.1.dill
new file mode 100644
index 0000000..060ab45
--- /dev/null
+++ b/pkg/front_end/testcases/old_dills/dart2js.version.29.compile.1.dill
Binary files differ
diff --git a/pkg/front_end/testcases/old_dills/old_dills.status b/pkg/front_end/testcases/old_dills/old_dills.status
new file mode 100644
index 0000000..e22cfe5
--- /dev/null
+++ b/pkg/front_end/testcases/old_dills/old_dills.status
@@ -0,0 +1,3 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 3b44d70..4037f63 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -2,247 +2,41 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE.md file.
 
-general/incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
-general/redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
-general/redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
-general/redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
-general/redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
-general/redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/abstract_members: TypeCheckError
+general/bug30695: TypeCheckError
+general/bug30695: TypeCheckError
+general/ignore_function: TypeCheckError
+general/mixin_application_override: TypeCheckError
+general/override_check_accessor_after_inference: TypeCheckError
+general/override_check_accessor_basic: TypeCheckError
+general/override_check_accessor_with_covariant_modifier: TypeCheckError
+general/override_check_after_inference: TypeCheckError
+general/override_check_basic: TypeCheckError
+general/override_check_with_covariant_modifier: TypeCheckError
 
-inference/async_closure_return_type_flatten: Fail
-inference/async_closure_return_type_future: Fail
-inference/async_closure_return_type_future_or: Fail
-inference/block_bodied_lambdas_async_all_returns_are_futures: Fail
-inference/block_bodied_lambdas_async_all_returns_are_values: Fail
-inference/block_bodied_lambdas_async_mix_of_values_and_futures: Fail
-inference/block_bodied_lambdas_async_star: Fail
-inference/block_bodied_lambdas_basic: Fail
-inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference: Fail
-inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level: Fail
-inference/block_bodied_lambdas_infer_bottom_async: Fail
-inference/block_bodied_lambdas_infer_bottom_async_star: Fail
-inference/block_bodied_lambdas_infer_bottom_sync: Fail
-inference/block_bodied_lambdas_infer_bottom_sync_star: Fail
-inference/block_bodied_lambdas_lub: Fail
-inference/block_bodied_lambdas_nested_lambdas: Fail
-inference/block_bodied_lambdas_no_return: Fail
-inference/block_bodied_lambdas_sync_star: Fail
-inference/bottom: Fail
-inference/bottom_in_closure: Fail
-inference/circular_reference_via_closures: Fail
-inference/circular_reference_via_closures_initializer_types: Fail
-inference/conflicts_can_happen: Fail
+inference/conflicting_fields: TypeCheckError
 inference/conflicts_can_happen2: Fail
-inference/constructors_downwards_with_constraint: Fail
-inference/constructors_infer_from_arguments: Fail
-inference/constructors_infer_from_arguments_const: Fail
-inference/constructors_infer_from_arguments_const_with_upper_bound: Fail
-inference/constructors_infer_from_arguments_downwards_from_constructor: Fail
-inference/constructors_infer_from_arguments_factory: Fail
-inference/constructors_infer_from_arguments_factory_calls_constructor: Fail
-inference/constructors_infer_from_arguments_named: Fail
-inference/constructors_infer_from_arguments_named_factory: Fail
-inference/constructors_infer_from_arguments_redirecting: Fail
-inference/constructors_infer_from_arguments_redirecting_factory: Fail
-inference/constructors_reverse_type_parameters: Fail
-inference/constructors_too_many_positional_arguments: Fail
+inference/conflicts_can_happen: Fail
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: Fail
-inference/dont_infer_field_type_when_initializer_is_null: Fail
-inference/dont_infer_type_on_dynamic: Fail
-inference/dont_infer_type_when_initializer_is_null: Fail
-inference/downward_inference_miscellaneous: Fail
-inference/downwards_inference_assignment_statements: Fail
-inference/downwards_inference_async_await: Fail
-inference/downwards_inference_for_each: Fail
-inference/downwards_inference_initializing_formal_default_formal: Fail
-inference/downwards_inference_inside_top_level: Fail
-inference/downwards_inference_on_constructor_arguments_infer_downwards: Fail
-inference/downwards_inference_on_function_arguments_infer_downwards: Fail
-inference/downwards_inference_on_function_expressions: Fail
-inference/downwards_inference_on_function_of_t_using_the_t: Fail
-inference/downwards_inference_on_generic_constructor_arguments_empty_list: Fail
-inference/downwards_inference_on_generic_constructor_arguments_infer_downwards: Fail
-inference/downwards_inference_on_generic_function_expressions: Fail
-inference/downwards_inference_on_instance_creations_infer_downwards: Fail
-inference/downwards_inference_on_list_literals_infer_downwards: Fail
-inference/downwards_inference_on_list_literals_infer_if_value_types_match_context: Fail
-inference/downwards_inference_on_map_literals: Fail
-inference/downwards_inference_yield_yield_star: Fail
-inference/field_refers_to_static_getter: Fail
-inference/field_refers_to_top_level_getter: Fail
-inference/future_or_subtyping: Fail
-inference/generic_functions_return_typedef: Fail
-inference/generic_methods_basic_downward_inference: Fail
-inference/generic_methods_dart_math_min_max: Fail
 inference/generic_methods_do_not_infer_invalid_override_of_generic_method: Fail
-inference/generic_methods_downwards_inference_affects_arguments: Fail
-inference/generic_methods_downwards_inference_fold: Fail
 inference/generic_methods_handle_override_of_non_generic_with_generic: Fail
-inference/generic_methods_infer_generic_function_parameter_type: Fail
-inference/generic_methods_infer_generic_function_parameter_type2: Fail
-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_inference_error: Fail
-inference/generic_methods_iterable_and_future: Fail
-inference/generic_methods_nested_generic_instantiation: Fail
-inference/generic_methods_uses_greatest_lower_bound: Fail
+inference/inconsistent_overrides: TypeCheckError
 inference/infer_assign_to_index: Fail
 inference/infer_assign_to_property: Fail
 inference/infer_assign_to_property_custom: Fail
-inference/infer_assign_to_ref: Fail
-inference/infer_binary_custom: Fail
-inference/infer_binary_double_double: Fail
-inference/infer_binary_double_int: Fail
-inference/infer_binary_int_double: Fail
-inference/infer_binary_int_int: Fail
-inference/infer_conditional: Fail
-inference/infer_consts_transitively_2: Fail
-inference/infer_consts_transitively_2_a: Fail
-inference/infer_consts_transitively_2_b: Fail
-inference/infer_consts_transitively_b: Fail
-inference/infer_correctly_on_multiple_variables_declared_together: Fail
-inference/infer_from_complex_expressions_if_outer_most_value_is_precise: Fail
-inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields: Fail
-inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2: Fail
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on: Fail
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2: Fail
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a: Fail
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a: Fail
-inference/infer_from_variables_in_non_cycle_imports_with_flag: Fail
-inference/infer_from_variables_in_non_cycle_imports_with_flag2: Fail
-inference/infer_from_variables_in_non_cycle_imports_with_flag2_a: Fail
-inference/infer_from_variables_in_non_cycle_imports_with_flag_a: Fail
-inference/infer_generic_method_type_named: Fail
-inference/infer_generic_method_type_positional: Fail
-inference/infer_generic_method_type_positional2: Fail
-inference/infer_generic_method_type_required: Fail
-inference/infer_list_literal_nested_in_map_literal: Fail
-inference/infer_local_function_return_type: Fail
-inference/infer_parameter_type_setter_from_field: Fail
-inference/infer_parameter_type_setter_from_setter: Fail
-inference/infer_prefix_expression: Fail
-inference/infer_prefix_expression_custom: Fail
-inference/infer_return_of_statement_lambda: Fail
-inference/infer_statics_transitively: Fail
-inference/infer_statics_transitively2: Fail
-inference/infer_statics_transitively3: Fail
-inference/infer_statics_transitively3_a: Fail
-inference/infer_statics_transitively_2_a: Fail
-inference/infer_statics_transitively_a: Fail
-inference/infer_statics_transitively_b: Fail
-inference/infer_statics_with_method_invocations: Fail
-inference/infer_statics_with_method_invocations_a: Fail
-inference/infer_throw: Fail
+inference/infer_field_override_multiple: TypeCheckError
+inference/infer_method_missing_params: TypeCheckError
 inference/infer_type_cast: Fail
-inference/infer_type_on_overridden_fields2: Fail
-inference/infer_type_on_overridden_fields4: Fail
-inference/infer_type_on_var: Fail
-inference/infer_type_on_var2: Fail
-inference/infer_type_on_var_from_field: Fail
-inference/infer_type_on_var_from_top_level: Fail
-inference/infer_type_regardless_of_declaration_order_or_cycles: Fail
-inference/infer_type_regardless_of_declaration_order_or_cycles_b: Fail
-inference/infer_typed_list_literal: Fail
-inference/infer_typed_map_literal: Fail
-inference/infer_types_on_generic_instantiations_3: Fail
-inference/infer_types_on_generic_instantiations_4: Fail
-inference/infer_types_on_generic_instantiations_5: Fail
-inference/infer_types_on_generic_instantiations_in_library_cycle: Fail
-inference/infer_types_on_generic_instantiations_in_library_cycle_a: Fail
-inference/infer_types_on_generic_instantiations_infer: Fail
-inference/infer_types_on_loop_indices_for_each_loop: Fail
-inference/infer_types_on_loop_indices_for_loop_with_inference: Fail
-inference/infer_variable_void: Fail
-inference/inferred_initializing_formal_checks_default_value: Fail
-inference/inferred_nonstatic_field_depends_on_static_field_complex: Fail
-inference/inferred_nonstatic_field_depends_on_top_level_var_simple: Fail
-inference/inferred_type_block_closure_no_args_no_return: Fail
-inference/inferred_type_cascade: Fail
-inference/inferred_type_custom_binary_op: Fail
-inference/inferred_type_custom_binary_op_via_interface: Fail
-inference/inferred_type_custom_index_op: Fail
-inference/inferred_type_custom_index_op_via_interface: Fail
-inference/inferred_type_custom_unary_op: Fail
-inference/inferred_type_custom_unary_op_via_interface: Fail
-inference/inferred_type_extract_method_tear_off: Fail
-inference/inferred_type_extract_method_tear_off_via_interface: Fail
-inference/inferred_type_from_top_level_executable_tear_off: Fail
-inference/inferred_type_invoke_method: Fail
-inference/inferred_type_invoke_method_via_interface: Fail
-inference/inferred_type_is_enum: Fail
-inference/inferred_type_is_enum_values: Fail
-inference/inferred_type_is_typedef: Fail
-inference/inferred_type_is_typedef_parameterized: Fail
-inference/inferred_type_uses_synthetic_function_type: Fail
-inference/inferred_type_uses_synthetic_function_type_function_typed_param: Fail
-inference/inferred_type_uses_synthetic_function_type_named_param: Fail
-inference/inferred_type_uses_synthetic_function_type_positional_param: Fail
-inference/inferred_type_uses_synthetic_function_type_required_param: Fail
-inference/inferred_type_via_closure_multiple_levels_of_nesting: Fail
-inference/inferred_type_via_closure_type_depends_on_args: Fail
-inference/inferred_type_via_closure_type_independent_of_args_field: Fail
-inference/inferred_type_via_closure_type_independent_of_args_top_level: Fail
-inference/instantiate_to_bounds_generic2_has_bound_defined_after: Fail
-inference/instantiate_to_bounds_generic2_has_bound_defined_before: Fail
-inference/instantiate_to_bounds_generic2_no_bound: Fail
-inference/instantiate_to_bounds_generic_has_bound_defined_after: Fail
-inference/instantiate_to_bounds_generic_has_bound_defined_before: Fail
-inference/instantiate_to_bounds_invoke_constructor_no_bound: Fail
-inference/instantiate_to_bounds_invoke_constructor_type_args_exact: Fail
-inference/instantiate_to_bounds_not_generic: Fail
-inference/lambda_does_not_have_propagated_type_hint: Fail
-inference/list_literals: Fail
-inference/list_literals_can_infer_null_bottom: Fail
-inference/list_literals_top_level: Fail
-inference/map_literals: Fail
-inference/map_literals_can_infer_null: Fail
-inference/map_literals_top_level: Fail
-inference/method_call_with_type_arguments_instance_method: Fail
-inference/method_call_with_type_arguments_instance_method_identifier_sequence: Fail
-inference/method_call_with_type_arguments_static_method: Fail
-inference/method_call_with_type_arguments_top_level_function: Fail
-inference/no_error_when_declared_type_is_num_and_assigned_null: Fail
-inference/null_coalescing_operator: Fail
-inference/null_coalescing_operator_2: Fail
-inference/null_literal_should_not_infer_as_bottom: Fail
-inference/propagate_inference_to_field_in_class: Fail
-inference/propagate_inference_to_field_in_class_dynamic_warnings: Fail
-inference/propagate_inference_transitively: Fail
-inference/propagate_inference_transitively2: Fail
-inference/reference_to_typedef: Fail
-inference/refine_binary_expression_type_type_parameter_t_double: Fail
-inference/refine_binary_expression_type_type_parameter_t_int: Fail
-inference/refine_binary_expression_type_type_parameter_t_t: Fail
-inference/static_method_tear_off: Fail
-inference/unsafe_block_closure_inference_closure_call: Fail
-inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param: Fail
-inference/unsafe_block_closure_inference_constructor_call_explicit_type_param: Fail
-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_expr2: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_type_param: 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
-inference/unsafe_block_closure_inference_function_call_no_type_param: Fail
-inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr: Fail
-inference/unsafe_block_closure_inference_in_list_dynamic: Fail
-inference/unsafe_block_closure_inference_in_list_typed: Fail
-inference/unsafe_block_closure_inference_in_list_untyped: Fail
-inference/unsafe_block_closure_inference_in_map_dynamic: Fail
-inference/unsafe_block_closure_inference_in_map_typed: Fail
-inference/unsafe_block_closure_inference_in_map_untyped: Fail
-inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param: Fail
-inference/unsafe_block_closure_inference_method_call_explicit_type_param: Fail
-inference/unsafe_block_closure_inference_method_call_implicit_type_param: Fail
-inference/unsafe_block_closure_inference_method_call_no_type_param: Fail
-inference/void_return_type_subtypes_dynamic: Fail
+inference/infer_types_on_generic_instantiations_infer: TypeCheckError
+inference/mixin_inference_outwards_3: TypeCheckError
+inference/mixin_inference_outwards_4: TypeCheckError
+inference/mixin_inference_unification_1: TypeCheckError
+inference/mixin_inference_unification_2: TypeCheckError
+inference_new/infer_field_getter_setter_mismatch: TypeCheckError
+inference_new/infer_field_override_accessors: TypeCheckError
+inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
 
-rasta/issue_000047: Fail
 rasta/native_is_illegal: Pass # Issue 29763
-rasta/type_with_parse_error: Fail
 
-instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
-instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
+runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
+runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect
index e6caacb..dfa4ba4 100644
--- a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   const C() : this.x(1);
 //                     ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect
index d7e7781..a7b1099 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Warning: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
 //   const B() : super();
 //                    ^
 //
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 f3e48bc..256fe64 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
@@ -2,22 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Warning: Type 'Missing' not found.
-// class A extends Missing {}
-//                 ^^^^^^^
-//
-// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Warning: Type 'Missing' not found.
-// class B implements Missing {}
-//                    ^^^^^^^
-//
-// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Warning: Type 'Missing' not found.
-// class C = Object with Missing;
-//                       ^^^^^^^
-//
-// 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 {}
 //                 ^^^^^^^
@@ -30,11 +14,15 @@
 // class C = Object with Missing;
 //                       ^^^^^^^
 //
-// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Warning: Couldn't find constructor 'Missing'.
+// 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:12:17: Error: 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'
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Redirection constructor target not found: 'Missing'
 //   factory D() = Missing;
 //           ^
 //
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect
index c9b0d8b..2188126 100644
--- a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic c = 1;
+static const field core::int* c = 1;
 static method main() → dynamic
   ;
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 185910f..3938bc8 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
@@ -2,14 +2,28 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Warning: Couldn't find constructor 'Missing'.
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: 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'
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Redirection constructor target not found: 'Missing'
 //   factory A.c() = Missing;
 //           ^
 //
+// pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory A.b() = B<C1>.a;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory B.b() = C<C2>;
+//                   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
index 1e569d8..742dcd7 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
@@ -12,6 +12,6 @@
   static factory fac(dynamic value) → self::Foo*
     ;
 }
-static field dynamic list;
+static field core::List<core::int*>* list;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.outline.expect
index 0ff4007..6de5524 100644
--- a/pkg/front_end/testcases/rasta/issue_000006.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000006.dart.outline.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic list;
+static field core::List<core::int*>* list;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect
index 147a7db..cdccc71 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect
@@ -4,15 +4,15 @@
 
 class C extends core::Object {
   field dynamic a;
-  field dynamic b;
-  field dynamic c;
+  field core::int* b;
+  field core::int* c;
   synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
   field dynamic a;
-  field dynamic b;
-  field dynamic c;
+  field core::int* b;
+  field core::int* c;
   constructor •() → self::D*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.outline.expect
index 44fbbbc..feabb09 100644
--- a/pkg/front_end/testcases/rasta/issue_000033.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Warning: Method not found: 'JS'.
+// pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.
 // @JS()
 //  ^^
 //
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 35d0544..cd96d0f 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
@@ -17,11 +17,11 @@
 //   C notEvenAConstructor(a) = h;
 //                            ^
 //
-// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Warning: Type 'a' not found.
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Error: Type 'a' not found.
 // a b(c) = d;
 // ^
 //
-// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Warning: Couldn't find constructor 'h'.
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Couldn't find constructor 'h'.
 //   C notEvenAConstructor(a) = h;
 //                              ^
 //
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.outline.expect
index ab80bb0b..de792f5 100644
--- a/pkg/front_end/testcases/rasta/issue_000047.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000047.dart.outline.expect
@@ -1,5 +1,13 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000047.dart:5:17: Error: Expected ')' before this.
+// typedef void T(C<C>);
+//                 ^
+//
 import self as self;
 
-static method main() → invalid-type
+typedef T = (dynamic) →* void;
+static method main() → (dynamic) →* void
   ;
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index 45c7070..afa2636 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -11,7 +11,7 @@
   constructor empty() → self::A<self::A::N*, self::A::S*, self::A::U*>*
     ;
   const constructor c(self::A::U* u, self::A::S* s) → self::A<self::A::N*, self::A::S*, self::A::U*>*
-    : self::A::field = const <dynamic>[null], super core::Object::•()
+    : self::A::field = const <core::Null*>[null], super core::Object::•()
     ;
   static factory f<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic>(self::A::f::S* s) → self::A<self::A::f::N*, self::A::f::S*, self::A::f::U*>*
     ;
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 a53eb28..186fdea 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
@@ -24,7 +24,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic x;
+  field core::String* x;
   constructor •() → self::A*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/static.dart.outline.expect b/pkg/front_end/testcases/rasta/static.dart.outline.expect
index eac130a..c9bb1ac 100644
--- a/pkg/front_end/testcases/rasta/static.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.outline.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static const field dynamic staticConstant = 42;
-  static field dynamic staticField;
+  static const field core::int* staticConstant = 42;
+  static field core::int* staticField;
   synthetic constructor •() → self::Foo*
     ;
   static method staticFunction() → dynamic
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.outline.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.outline.expect
index 6b89dbc..36905b0 100644
--- a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.outline.expect
@@ -1,15 +1,23 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/type_with_parse_error.dart:21:7: Error: Expected ';' after this.
+//   int i
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  synthetic constructor •() → self::A*
     ;
   method foo() → dynamic
     ;
 }
-class B extends core::Object {
-  constructor •() → void
+class B<T extends core::Object* = dynamic> extends core::Object {
+  field core::int* i;
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
index bdc4a96..254a3b9 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
@@ -1,9 +1,16 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: Expected 1 type arguments.
+//   C<String, String> field;
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
 class C<T extends core::Object* = dynamic> extends core::Object {
-  field self::C<dynamic>* field;
+  field invalid-type field;
   synthetic constructor •() → self::C<self::C::T*>*
     ;
 }
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 c60e8a0..a5b32ff 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
@@ -10,7 +10,7 @@
 // type T = Map<A, B>
 //                  ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: Type 'type' not found.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
 // type T = Map<A, B>
 // ^^^^
 //
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 7a2a75f..d75581b 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Warning: Can't use type arguments with type variable 'T'.
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: Can't use type arguments with type variable 'T'.
 // Try removing the type arguments.
 //   T<U> v;
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Warning: Type 'U' not found.
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: Type 'U' not found.
 //   T<U> v;
 //     ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
index 496a079..75340ee 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// 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.
+// 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.outline.expect b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
index 6a0f6b8..e4d2c10 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Warning: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
 //   foo(int x) => x;
 //   ^
 // pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
@@ -12,7 +12,7 @@
 // class E extends D {
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Warning: The method 'A.foo' has fewer named arguments than those of overridden method 'B.foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A.foo' has fewer named arguments than those of overridden method 'B.foo'.
 //   foo(int x) => x;
 //   ^
 // pkg/front_end/testcases/regress/issue_32660.dart:10:3: Context: This is the overridden method ('foo').
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
index 40c4590..98135e9 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
@@ -1,7 +1,13 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34291.dart:9:1: Error: Expected 0 type arguments.
+// lib.A<B> foo() {}
+// ^
+//
 import self as self;
 import "dart:core" as core;
-import "issue_34291_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
@@ -9,16 +15,16 @@
   synthetic constructor •() → self::B*
     ;
 }
-static method foo() → iss::A*
+static method foo() → invalid-type
   ;
 static method main() → dynamic
   ;
 
 library;
-import self as iss;
+import self as self2;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → iss::A*
+  synthetic constructor •() → self2::A*
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect
index da300e9..79df073 100644
--- a/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_34498.dart:8:3: Warning: 'lib.MyClass' can't be used as a type because 'lib' doesn't refer to an import prefix.
+// pkg/front_end/testcases/regress/issue_34498.dart:8:3: Error: 'lib.MyClass' can't be used as a type because 'lib' doesn't refer to an import prefix.
 //   lib.MyClass get lib => null; // (1)
 //   ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_34498.dart:10:3: Warning: 'foo' isn't a type.
+// pkg/front_end/testcases/regress/issue_34498.dart:10:3: Error: 'foo' isn't a type.
 //   foo foo() {}
 //   ^^^
 // pkg/front_end/testcases/regress/issue_34498.dart:10:7: Context: This isn't a type.
 //   foo foo() {}
 //       ^^^
 //
-// pkg/front_end/testcases/regress/issue_34498.dart:20:3: Warning: Can't use type arguments with type variable 'T'.
+// pkg/front_end/testcases/regress/issue_34498.dart:20:3: Error: Can't use type arguments with type variable 'T'.
 // Try removing the type arguments.
 //   T<String> foo() {}
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_34498.dart:12:3: Warning: Type 'Missing' not found.
+// pkg/front_end/testcases/regress/issue_34498.dart:12:3: Error: Type 'Missing' not found.
 //   Missing bar() {}
 //   ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
index 8f7f0f5..71b4abc 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
@@ -27,21 +27,29 @@
 // Future<List<>> f3() async {
 //             ^^
 //
-// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Warning: Type 'foo' not found.
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Type 'foo' not found.
 // <foo<
 //  ^^^
 //
-// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Warning: Type 'foo' not found.
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Expected 0 type arguments.
+// <foo<
+//  ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Error: Type 'foo' not found.
 // foo
 // ^^^
 //
-// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Warning: 'Future' isn't a type.
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: 'Future' isn't a type.
 // Future<List<>> f3() async {
 // ^^^^^^
 // pkg/front_end/testcases/regress/issue_34850.dart:12:1: Context: This isn't a type.
 // Future<List<int>> f2() async => null;
 // ^^^^^^
 //
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: Expected 0 type arguments.
+// Future<List<>> f3() async {
+// ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
index 67e0fdb..83a6c1d 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
@@ -9,19 +9,19 @@
 //   factory Supertype() = Unresolved;
 //           ^^^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Warning: Couldn't find constructor 'Unresolved'.
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Couldn't find constructor 'Unresolved'.
 //   factory Supertype() = Unresolved;
 //                         ^
 //
-// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Warning: Couldn't find constructor 'Unresolved'.
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Error: Couldn't find constructor 'Unresolved'.
 //   factory Supertype() = Unresolved;
 //                         ^
 //
-// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Warning: Redirection constructor target not found: 'Unresolved'
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: Redirection constructor target not found: 'Unresolved'
 //   factory Supertype() = Unresolved;
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Warning: Redirection constructor target not found: 'Unresolved'
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Error: Redirection constructor target not found: 'Unresolved'
 //   factory Supertype() = Unresolved;
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
index b7df60a..47f8846 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
@@ -53,7 +53,7 @@
 // class xxx xx XXX extends XXX {
 //              ^^^
 //
-// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Warning: Type 'xx' not found.
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Type 'xx' not found.
 // class xxx xx XXX extends XXX {
 //           ^^
 //
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
index ddce3da..e13202c 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
@@ -6,7 +6,7 @@
 class C<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<U extends (self::C::T*) →* void = dynamic>(self::C::f::U* x) → void
+  method f<U extends (self::C::T*) →* void = (self::C::T*) →* void>(self::C::f::U* x) → void
     ;
 }
 static method g(self::C<core::num*>* c) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
index 717c2fb..463d57a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
@@ -5,9 +5,9 @@
 class C<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void
+  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void
     ;
-  method g1<generic-covariant-impl U extends self::C::T* = dynamic>() → void
+  method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void
     ;
 }
 static method g2(self::C<core::Object*>* c) → void
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
index ebf34c1..a30e2aa 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
@@ -5,7 +5,7 @@
 class C<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void
+  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void
     ;
 }
 static method g1(dynamic d) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
index 2f68f15..3c7dca2 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = dynamic> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (dynamic) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     ;
   operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
index 63c538e..9a2b5c5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
@@ -9,7 +9,7 @@
     ;
   method g({generic-covariant-impl self::B::T* x}) → void
     ;
-  method h<generic-covariant-impl U extends self::B::T* = dynamic>() → void
+  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void
     ;
 }
 class C extends self::B<core::int*> {
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index c22b5fd..4aaa576 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -1,4 +1,19 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M.y' is 'int', which does not match the return type, 'Object', of the overridden method, 'I.y'.
+//  - 'Object' is from 'dart:core'.
+// Change to a subtype of 'Object'.
+//   int y;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:43:12: Context: This is the overridden method ('y').
+//   void set y(covariant Object value);
+//            ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:51:7: Context: Override was introduced in the mixin application class 'C'.
+// class C = B with M implements I<int>;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
index 9b609d2..e7cad7c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
@@ -1,4 +1,19 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M.y' has type 'int', which does not match the corresponding type, 'Object', in the overridden method, 'I.y'.
+//  - 'Object' is from 'dart:core'.
+// Change to a supertype of 'Object', or, for a covariant parameter, a subtype.
+//   void set y(int value) {
+//                  ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:43:12: Context: This is the overridden method ('y').
+//   void set y(covariant Object value);
+//            ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:58:7: Context: Override was introduced in the mixin application class 'C'.
+// class C = B with M implements I<int>;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 3f10468..9ee45ec 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -221,6 +221,19 @@
     },
 
     {
+      "name": "old_dill_test",
+      "kind": "Chain",
+      "source": "test/old_dill_test.dart",
+      "path": "testcases/old_dills/",
+      "status": "testcases/old_dills/old_dills.status",
+      "pattern": [
+        ".*\\.dill$"
+      ],
+      "exclude": [
+      ]
+    },
+
+    {
       "name": "lint_test",
       "kind": "Chain",
       "source": "test/lint_test.dart",
diff --git a/pkg/kernel/PRESUBMIT.py b/pkg/kernel/PRESUBMIT.py
new file mode 100644
index 0000000..9d898e4
--- /dev/null
+++ b/pkg/kernel/PRESUBMIT.py
@@ -0,0 +1,61 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+"""Front-end specific presubmit script.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into gcl.
+"""
+
+import imp
+import os.path
+import subprocess
+
+
+def runSmokeTest(input_api, output_api):
+    hasChangedFiles = False
+    for git_file in input_api.AffectedTextFiles():
+        filename = git_file.AbsoluteLocalPath()
+        if filename.endswith(".dart"):
+            hasChangedFiles = True
+            break
+
+    if hasChangedFiles:
+        local_root = input_api.change.RepositoryRoot()
+        utils = imp.load_source('utils',
+                        os.path.join(local_root, 'tools', 'utils.py'))
+        dart = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dart')
+        smoke_test = os.path.join(local_root, 'pkg', 'kernel', 'tool',
+                                  'smoke_test_quick.dart')
+
+        windows = utils.GuessOS() == 'win32'
+        if windows:
+            dart += '.exe'
+
+        if not os.path.isfile(dart):
+            print('WARNING: dart not found: %s' % dart)
+            return []
+
+        if not os.path.isfile(smoke_test):
+            print('WARNING: kernel smoke test not found: %s' % smoke_test)
+            return []
+
+        args = [dart, smoke_test]
+        process = subprocess.Popen(
+            args, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
+        outs, _ = process.communicate()
+
+        if process.returncode != 0:
+            return [output_api.PresubmitError(
+                    'Kernel smoke test failure(s):',
+                    long_text=outs)]
+
+    return []
+
+
+def CheckChangeOnCommit(input_api, output_api):
+    return runSmokeTest(input_api, output_api)
+
+
+def CheckChangeOnUpload(input_api, output_api):
+    return runSmokeTest(input_api, output_api)
diff --git a/pkg/kernel/tool/smoke_test_quick.dart b/pkg/kernel/tool/smoke_test_quick.dart
new file mode 100644
index 0000000..2065aea
--- /dev/null
+++ b/pkg/kernel/tool/smoke_test_quick.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+
+final String repoDir = _computeRepoDir();
+
+String get dartVm => Platform.executable;
+
+main(List<String> args) async {
+  Stopwatch stopwatch = new Stopwatch()..start();
+  List<Future> futures = new List<Future>();
+  futures.add(run("pkg/front_end/test/old_dill_test.dart", ["--checkDill"]));
+  await Future.wait(futures);
+  print("\n-----------------------\n");
+  print("Done with exitcode $exitCode in ${stopwatch.elapsedMilliseconds} ms");
+}
+
+Future<void> run(String script, List<String> scriptArguments,
+    {bool filter: true}) async {
+  List<String> arguments = [];
+  arguments.add("$script");
+  arguments.addAll(scriptArguments);
+
+  Stopwatch stopwatch = new Stopwatch()..start();
+  ProcessResult result =
+      await Process.run(dartVm, arguments, workingDirectory: repoDir);
+  String runWhat = "${dartVm} ${arguments.join(' ')}";
+  if (result.exitCode != 0) {
+    exitCode = result.exitCode;
+    print("-----");
+    print("Running: $runWhat: "
+        "Failed with exit code ${result.exitCode} "
+        "in ${stopwatch.elapsedMilliseconds} ms.");
+    String stdout = result.stdout.toString();
+    if (filter) {
+      List<String> lines = stdout.split("\n");
+      int lastIgnored = -1;
+      for (int i = 0; i < lines.length; i++) {
+        if (lines[i].startsWith("[ ")) lastIgnored = i;
+      }
+      lines.removeRange(0, lastIgnored + 1);
+      stdout = lines.join("\n");
+    }
+    stdout = stdout.trim();
+    if (stdout.isNotEmpty) {
+      print(stdout);
+      print("-----");
+    }
+  } else {
+    print("Running: $runWhat: Done in ${stopwatch.elapsedMilliseconds} ms.");
+  }
+}
+
+String _computeRepoDir() {
+  ProcessResult result = Process.runSync(
+      'git', ['rev-parse', '--show-toplevel'],
+      runInShell: true,
+      workingDirectory: new File.fromUri(Platform.script).parent.path);
+  return (result.stdout as String).trim();
+}
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 8010e63..df11b53 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -28,14 +28,14 @@
   return obj;
 }
 
-List<int> assertInts(List<int> list) {
+List<int> assertListOfInt(List<int> list) {
   for (int elem in list) {
     assertInt(elem);
   }
   return list;
 }
 
-List<String> assertStrings(List<String> list) {
+List<String> assertListOfString(List<String> list) {
   for (String elem in list) {
     assertString(elem);
   }
@@ -236,7 +236,7 @@
 vms.AllocationProfile assertAllocationProfile(vms.AllocationProfile obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertClassHeapStatss(obj.members);
+  assertListOfClassHeapStats(obj.members);
   assertMemoryUsage(obj.memoryUsage);
   return obj;
 }
@@ -273,7 +273,8 @@
   return obj;
 }
 
-List<vms.BoundVariable> assertBoundVariables(List<vms.BoundVariable> list) {
+List<vms.BoundVariable> assertListOfBoundVariable(
+    List<vms.BoundVariable> list) {
   for (vms.BoundVariable elem in list) {
     assertBoundVariable(elem);
   }
@@ -296,7 +297,7 @@
   return obj;
 }
 
-List<vms.Breakpoint> assertBreakpoints(List<vms.Breakpoint> list) {
+List<vms.Breakpoint> assertListOfBreakpoint(List<vms.Breakpoint> list) {
   for (vms.Breakpoint elem in list) {
     assertBreakpoint(elem);
   }
@@ -311,7 +312,7 @@
   return obj;
 }
 
-List<vms.ClassRef> assertClassRefs(List<vms.ClassRef> list) {
+List<vms.ClassRef> assertListOfClassRef(List<vms.ClassRef> list) {
   for (vms.ClassRef elem in list) {
     assertClassRef(elem);
   }
@@ -326,10 +327,10 @@
   assertBool(obj.isAbstract);
   assertBool(obj.isConst);
   assertLibraryRef(obj.library);
-  assertInstanceRefs(obj.interfaces);
-  assertFieldRefs(obj.fields);
-  assertFuncRefs(obj.functions);
-  assertClassRefs(obj.subclasses);
+  assertListOfInstanceRef(obj.interfaces);
+  assertListOfFieldRef(obj.fields);
+  assertListOfFuncRef(obj.functions);
+  assertListOfClassRef(obj.subclasses);
   return obj;
 }
 
@@ -344,7 +345,8 @@
   return obj;
 }
 
-List<vms.ClassHeapStats> assertClassHeapStatss(List<vms.ClassHeapStats> list) {
+List<vms.ClassHeapStats> assertListOfClassHeapStats(
+    List<vms.ClassHeapStats> list) {
   for (vms.ClassHeapStats elem in list) {
     assertClassHeapStats(elem);
   }
@@ -354,7 +356,7 @@
 vms.ClassList assertClassList(vms.ClassList obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertClassRefs(obj.classes);
+  assertListOfClassRef(obj.classes);
   return obj;
 }
 
@@ -367,7 +369,7 @@
   return obj;
 }
 
-List<vms.CodeRef> assertCodeRefs(List<vms.CodeRef> list) {
+List<vms.CodeRef> assertListOfCodeRef(List<vms.CodeRef> list) {
   for (vms.CodeRef elem in list) {
     assertCodeRef(elem);
   }
@@ -391,7 +393,7 @@
   return obj;
 }
 
-List<vms.ContextRef> assertContextRefs(List<vms.ContextRef> list) {
+List<vms.ContextRef> assertListOfContextRef(List<vms.ContextRef> list) {
   for (vms.ContextRef elem in list) {
     assertContextRef(elem);
   }
@@ -403,7 +405,7 @@
   assertString(obj.type);
   assertString(obj.id);
   assertInt(obj.length);
-  assertContextElements(obj.variables);
+  assertListOfContextElement(obj.variables);
   return obj;
 }
 
@@ -419,7 +421,8 @@
   return obj;
 }
 
-List<vms.ContextElement> assertContextElements(List<vms.ContextElement> list) {
+List<vms.ContextElement> assertListOfContextElement(
+    List<vms.ContextElement> list) {
   for (vms.ContextElement elem in list) {
     assertContextElement(elem);
   }
@@ -435,7 +438,7 @@
   return obj;
 }
 
-List<vms.ErrorRef> assertErrorRefs(List<vms.ErrorRef> list) {
+List<vms.ErrorRef> assertListOfErrorRef(List<vms.ErrorRef> list) {
   for (vms.ErrorRef elem in list) {
     assertErrorRef(elem);
   }
@@ -477,7 +480,7 @@
   return obj;
 }
 
-List<vms.FieldRef> assertFieldRefs(List<vms.FieldRef> list) {
+List<vms.FieldRef> assertListOfFieldRef(List<vms.FieldRef> list) {
   for (vms.FieldRef elem in list) {
     assertFieldRef(elem);
   }
@@ -505,7 +508,7 @@
   return obj;
 }
 
-List<vms.Flag> assertFlags(List<vms.Flag> list) {
+List<vms.Flag> assertListOfFlag(List<vms.Flag> list) {
   for (vms.Flag elem in list) {
     assertFlag(elem);
   }
@@ -515,7 +518,7 @@
 vms.FlagList assertFlagList(vms.FlagList obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertFlags(obj.flags);
+  assertListOfFlag(obj.flags);
   return obj;
 }
 
@@ -526,7 +529,7 @@
   return obj;
 }
 
-List<vms.Frame> assertFrames(List<vms.Frame> list) {
+List<vms.Frame> assertListOfFrame(List<vms.Frame> list) {
   for (vms.Frame elem in list) {
     assertFrame(elem);
   }
@@ -552,7 +555,7 @@
   return obj;
 }
 
-List<vms.FuncRef> assertFuncRefs(List<vms.FuncRef> list) {
+List<vms.FuncRef> assertListOfFuncRef(List<vms.FuncRef> list) {
   for (vms.FuncRef elem in list) {
     assertFuncRef(elem);
   }
@@ -585,7 +588,7 @@
   return obj;
 }
 
-List<vms.InstanceRef> assertInstanceRefs(List<vms.InstanceRef> list) {
+List<vms.InstanceRef> assertListOfInstanceRef(List<vms.InstanceRef> list) {
   for (vms.InstanceRef elem in list) {
     assertInstanceRef(elem);
   }
@@ -610,7 +613,7 @@
   return obj;
 }
 
-List<vms.IsolateRef> assertIsolateRefs(List<vms.IsolateRef> list) {
+List<vms.IsolateRef> assertListOfIsolateRef(List<vms.IsolateRef> list) {
   for (vms.IsolateRef elem in list) {
     assertIsolateRef(elem);
   }
@@ -628,8 +631,8 @@
   assertInt(obj.livePorts);
   assertBool(obj.pauseOnExit);
   assertEvent(obj.pauseEvent);
-  assertLibraryRefs(obj.libraries);
-  assertBreakpoints(obj.breakpoints);
+  assertListOfLibraryRef(obj.libraries);
+  assertListOfBreakpoint(obj.breakpoints);
   assertExceptionPauseMode(obj.exceptionPauseMode);
   return obj;
 }
@@ -637,7 +640,7 @@
 vms.InboundReferences assertInboundReferences(vms.InboundReferences obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertInboundReferences(obj.references);
+  assertListOfInboundReference(obj.references);
   return obj;
 }
 
@@ -647,11 +650,19 @@
   return obj;
 }
 
+List<vms.InboundReference> assertListOfInboundReference(
+    List<vms.InboundReference> list) {
+  for (vms.InboundReference elem in list) {
+    assertInboundReference(elem);
+  }
+  return list;
+}
+
 vms.InstanceSet assertInstanceSet(vms.InstanceSet obj) {
   assertNotNull(obj);
   assertString(obj.type);
   assertInt(obj.totalCount);
-  assertObjRefs(obj.instances);
+  assertListOfObjRef(obj.instances);
   return obj;
 }
 
@@ -664,7 +675,7 @@
   return obj;
 }
 
-List<vms.LibraryRef> assertLibraryRefs(List<vms.LibraryRef> list) {
+List<vms.LibraryRef> assertListOfLibraryRef(List<vms.LibraryRef> list) {
   for (vms.LibraryRef elem in list) {
     assertLibraryRef(elem);
   }
@@ -678,11 +689,11 @@
   assertString(obj.name);
   assertString(obj.uri);
   assertBool(obj.debuggable);
-  assertLibraryDependencies(obj.dependencies);
-  assertScriptRefs(obj.scripts);
-  assertFieldRefs(obj.variables);
-  assertFuncRefs(obj.functions);
-  assertClassRefs(obj.classes);
+  assertListOfLibraryDependency(obj.dependencies);
+  assertListOfScriptRef(obj.scripts);
+  assertListOfFieldRef(obj.variables);
+  assertListOfFuncRef(obj.functions);
+  assertListOfClassRef(obj.classes);
   return obj;
 }
 
@@ -695,7 +706,7 @@
   return obj;
 }
 
-List<vms.LibraryDependency> assertLibraryDependencies(
+List<vms.LibraryDependency> assertListOfLibraryDependency(
     List<vms.LibraryDependency> list) {
   for (vms.LibraryDependency elem in list) {
     assertLibraryDependency(elem);
@@ -755,7 +766,7 @@
   return obj;
 }
 
-List<vms.Message> assertMessages(List<vms.Message> list) {
+List<vms.Message> assertListOfMessage(List<vms.Message> list) {
   for (vms.Message elem in list) {
     assertMessage(elem);
   }
@@ -772,7 +783,7 @@
   return obj;
 }
 
-List<vms.NullValRef> assertNullValRefs(List<vms.NullValRef> list) {
+List<vms.NullValRef> assertListOfNullValRef(List<vms.NullValRef> list) {
   for (vms.NullValRef elem in list) {
     assertNullValRef(elem);
   }
@@ -796,7 +807,7 @@
   return obj;
 }
 
-List<vms.ObjRef> assertObjRefs(List<vms.ObjRef> list) {
+List<vms.ObjRef> assertListOfObjRef(List<vms.ObjRef> list) {
   for (vms.ObjRef elem in list) {
     assertObjRef(elem);
   }
@@ -823,12 +834,20 @@
   return obj;
 }
 
+List<vms.RetainingObject> assertListOfRetainingObject(
+    List<vms.RetainingObject> list) {
+  for (vms.RetainingObject elem in list) {
+    assertRetainingObject(elem);
+  }
+  return list;
+}
+
 vms.RetainingPath assertRetainingPath(vms.RetainingPath obj) {
   assertNotNull(obj);
   assertString(obj.type);
   assertInt(obj.length);
   assertString(obj.gcRootType);
-  assertRetainingObjects(obj.elements);
+  assertListOfRetainingObject(obj.elements);
   return obj;
 }
 
@@ -854,7 +873,7 @@
   return obj;
 }
 
-List<vms.ScriptRef> assertScriptRefs(List<vms.ScriptRef> list) {
+List<vms.ScriptRef> assertListOfScriptRef(List<vms.ScriptRef> list) {
   for (vms.ScriptRef elem in list) {
     assertScriptRef(elem);
   }
@@ -873,7 +892,7 @@
 vms.ScriptList assertScriptList(vms.ScriptList obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertScriptRefs(obj.scripts);
+  assertListOfScriptRef(obj.scripts);
   return obj;
 }
 
@@ -888,16 +907,16 @@
 vms.SourceReport assertSourceReport(vms.SourceReport obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertSourceReportRanges(obj.ranges);
-  assertScriptRefs(obj.scripts);
+  assertListOfSourceReportRange(obj.ranges);
+  assertListOfScriptRef(obj.scripts);
   return obj;
 }
 
 vms.SourceReportCoverage assertSourceReportCoverage(
     vms.SourceReportCoverage obj) {
   assertNotNull(obj);
-  assertInts(obj.hits);
-  assertInts(obj.misses);
+  assertListOfInt(obj.hits);
+  assertListOfInt(obj.misses);
   return obj;
 }
 
@@ -910,7 +929,7 @@
   return obj;
 }
 
-List<vms.SourceReportRange> assertSourceReportRanges(
+List<vms.SourceReportRange> assertListOfSourceReportRange(
     List<vms.SourceReportRange> list) {
   for (vms.SourceReportRange elem in list) {
     assertSourceReportRange(elem);
@@ -921,15 +940,15 @@
 vms.Stack assertStack(vms.Stack obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertFrames(obj.frames);
-  assertMessages(obj.messages);
+  assertListOfFrame(obj.frames);
+  assertListOfMessage(obj.messages);
   return obj;
 }
 
 vms.Timeline assertTimeline(vms.Timeline obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertTimelineEvents(obj.traceEvents);
+  assertListOfTimelineEvent(obj.traceEvents);
   assertInt(obj.timeOriginMicros);
   assertInt(obj.timeExtentMicros);
   return obj;
@@ -940,7 +959,8 @@
   return obj;
 }
 
-List<vms.TimelineEvent> assertTimelineEvents(List<vms.TimelineEvent> list) {
+List<vms.TimelineEvent> assertListOfTimelineEvent(
+    List<vms.TimelineEvent> list) {
   for (vms.TimelineEvent elem in list) {
     assertTimelineEvent(elem);
   }
@@ -951,8 +971,8 @@
   assertNotNull(obj);
   assertString(obj.type);
   assertString(obj.recorderName);
-  assertStrings(obj.availableStreams);
-  assertStrings(obj.recordedStreams);
+  assertListOfString(obj.availableStreams);
+  assertListOfString(obj.recordedStreams);
   return obj;
 }
 
@@ -971,7 +991,7 @@
   return obj;
 }
 
-List<vms.TypeArgumentsRef> assertTypeArgumentsRefs(
+List<vms.TypeArgumentsRef> assertListOfTypeArgumentsRef(
     List<vms.TypeArgumentsRef> list) {
   for (vms.TypeArgumentsRef elem in list) {
     assertTypeArgumentsRef(elem);
@@ -984,7 +1004,7 @@
   assertString(obj.type);
   assertString(obj.id);
   assertString(obj.name);
-  assertInstanceRefs(obj.types);
+  assertListOfInstanceRef(obj.types);
   return obj;
 }
 
@@ -1010,7 +1030,7 @@
   return obj;
 }
 
-List<vms.VMRef> assertVMRefs(List<vms.VMRef> list) {
+List<vms.VMRef> assertListOfVMRef(List<vms.VMRef> list) {
   for (vms.VMRef elem in list) {
     assertVMRef(elem);
   }
@@ -1028,6 +1048,6 @@
   assertString(obj.version);
   assertInt(obj.pid);
   assertInt(obj.startTime);
-  assertIsolateRefs(obj.isolates);
+  assertListOfIsolateRef(obj.isolates);
   return obj;
 }
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index 3360053..55a8c99 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.25
+version=3.26
diff --git a/pkg/vm_service/lib/vm_service.dart b/pkg/vm_service/lib/vm_service.dart
index 64dcf89..edaf14b 100644
--- a/pkg/vm_service/lib/vm_service.dart
+++ b/pkg/vm_service/lib/vm_service.dart
@@ -17,7 +17,7 @@
 
 export 'src/service_extension_registry.dart' show ServiceExtensionRegistry;
 
-const String vmServiceVersion = '3.25.0';
+const String vmServiceVersion = '3.26.0';
 
 /// @optional
 const String optional = 'optional';
@@ -186,6 +186,7 @@
   'registerService': const ['Success'],
   'reloadSources': const ['ReloadReport'],
   'removeBreakpoint': const ['Success'],
+  'requestHeapSnapshot': const ['Success'],
   'resume': const ['Success'],
   'setExceptionPauseMode': const ['Success'],
   'setFlag': const ['Success'],
@@ -692,6 +693,15 @@
   /// See [Success].
   Future<Success> removeBreakpoint(String isolateId, String breakpointId);
 
+  /// Requests a dump of the Dart heap of the given isolate.
+  ///
+  /// This method immediately returns success. The VM will then begin delivering
+  /// binary events on the `HeapSnapshot` event stream. The binary data in these
+  /// events, when concatenated together, conforms to the SnapshotGraph type.
+  /// The splitting of the SnapshotGraph into events can happen at any byte
+  /// offset, including the middle of scalar fields.
+  Future<Success> requestHeapSnapshot(String isolateId);
+
   /// The `resume` RPC is used to resume execution of a paused isolate.
   ///
   /// If the `step` parameter is not provided, the program will resume regular
@@ -795,6 +805,7 @@
   /// Timeline | TimelineEvents
   /// Logging | Logging
   /// Service | ServiceRegistered, ServiceUnregistered
+  /// HeapSnapshot | HeapSnapshot
   ///
   /// Additionally, some embedders provide the `Stdout` and `Stderr` streams.
   /// These streams allow the client to subscribe to writes to stdout and
@@ -1052,6 +1063,11 @@
             params['breakpointId'],
           );
           break;
+        case 'requestHeapSnapshot':
+          response = await _serviceImplementation.requestHeapSnapshot(
+            params['isolateId'],
+          );
+          break;
         case 'resume':
           response = await _serviceImplementation.resume(
             params['isolateId'],
@@ -1233,6 +1249,10 @@
   // ServiceRegistered, ServiceUnregistered
   Stream<Event> get onServiceEvent => _getEventController('Service').stream;
 
+  // HeapSnapshot
+  Stream<Event> get onHeapSnapshotEvent =>
+      _getEventController('HeapSnapshot').stream;
+
   // WriteEvent
   Stream<Event> get onStdoutEvent => _getEventController('Stdout').stream;
 
@@ -1510,6 +1530,11 @@
   }
 
   @override
+  Future<Success> requestHeapSnapshot(String isolateId) {
+    return _call('requestHeapSnapshot', {'isolateId': isolateId});
+  }
+
+  @override
   Future<Success> resume(String isolateId,
       {/*StepOption*/ String step, int frameIndex}) {
     Map m = {'isolateId': isolateId};
@@ -1841,6 +1866,7 @@
   static const String kTimeline = 'Timeline';
   static const String kLogging = 'Logging';
   static const String kService = 'Service';
+  static const String kHeapSnapshot = 'HeapSnapshot';
   static const String kStdout = 'Stdout';
   static const String kStderr = 'Stderr';
 }
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 04e8b59..244f517 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -811,14 +811,14 @@
   return obj;
 }
 
-List<int> assertInts(List<int> list) {
+List<int> assertListOfInt(List<int> list) {
   for (int elem in list) {
     assertInt(elem);
   }
   return list;
 }
 
-List<String> assertStrings(List<String> list) {
+List<String> assertListOfString(List<String> list) {
   for (String elem in list) {
     assertString(elem);
   }
@@ -902,15 +902,17 @@
           [
             'BoundVariable',
             'Breakpoint',
+            'ClassHeapStats',
+            'CodeRegion',
             'ContextElement',
             'Flag',
             'Frame',
+            'InboundReference',
             'LibraryDependency',
             'Message',
-            'SourceReportRange',
-            'ClassHeapStats',
-            'CodeRegion',
             'ProfileFunction',
+            'RetainingObject',
+            'SourceReportRange',
             'TimelineEvent',
           ].contains(type.name)) {
         type.generateListAssert(gen);
@@ -1187,10 +1189,6 @@
           name == 'bool' ||
           name == 'double');
 
-  String get namePlural => name.endsWith('y')
-      ? name.substring(0, name.length - 1) + 'ies'
-      : name + 's';
-
   String toString() => ref;
 }
 
@@ -1207,6 +1205,8 @@
   void generate(DartGenerator gen) {
     gen.write('${type.ref} ${name}');
   }
+
+  String toString() => '$type $name';
 }
 
 class Type extends Member {
@@ -1251,10 +1251,6 @@
 
   bool get isRef => name.endsWith('Ref');
 
-  String get namePlural => name.endsWith('y')
-      ? name.substring(0, name.length - 1) + 'ies'
-      : name + 's';
-
   bool get supportsIdentity {
     if (fields.any((f) => f.name == 'id')) return true;
     return superName == null ? false : getSuper().supportsIdentity;
@@ -1535,9 +1531,9 @@
         if (type.isArray) {
           TypeRef arrayType = type.types.first;
           if (arrayType.arrayDepth == 1) {
-            String assertMethodName = 'assert' +
+            String assertMethodName = 'assertListOf' +
                 arrayType.name.substring(0, 1).toUpperCase() +
-                arrayType.namePlural.substring(1);
+                arrayType.name.substring(1);
             gen.writeln('$assertMethodName(obj.${field.generatableName});');
           } else {
             gen.writeln(
@@ -1574,7 +1570,7 @@
 
   void generateListAssert(DartGenerator gen) {
     gen.writeln('List<vms.${name}> '
-        'assert${namePlural}(List<vms.${name}> list) {');
+        'assertListOf${name}(List<vms.${name}> list) {');
     gen.writeln('for (vms.${name} elem in list) {');
     gen.writeln('assert${name}(elem);');
     gen.writeln('}');
diff --git a/pkg/vm_service/tool/generate.dart b/pkg/vm_service/tool/generate.dart
index 151814f..73e8d2e 100644
--- a/pkg/vm_service/tool/generate.dart
+++ b/pkg/vm_service/tool/generate.dart
@@ -46,7 +46,11 @@
   dart.api.parse(nodes);
   dart.api.generate(generator);
   outputFile.writeAsStringSync(generator.toString());
-  Process.runSync('dartfmt', ['-w', outDirPath]);
+  ProcessResult result = Process.runSync('dartfmt', ['-w', outDirPath]);
+  if (result.exitCode != 0) {
+    print('dartfmt: ${result.stdout}\n${result.stderr}');
+    throw result.exitCode;
+  }
 
   if (_stampPubspecVersion) {
     // Update the pubspec file.
@@ -99,7 +103,11 @@
   dart.api.parse(nodes);
   dart.api.generateAsserts(generator);
   outputFile.writeAsStringSync(generator.toString());
-  Process.runSync('dartfmt', ['-w', outDirPath]);
+  ProcessResult result = Process.runSync('dartfmt', ['-w', outDirPath]);
+  if (result.exitCode != 0) {
+    print('dartfmt: ${result.stdout}\n${result.stderr}');
+    throw result.exitCode;
+  }
 
   if (_stampPubspecVersion) {
     // Update the pubspec file.
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index a3f6a6e..27cdef7 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -608,7 +608,7 @@
           instr->kind(),
           Integer::Handle(Z, Integer::Cast(left).BitOp(Token::kBIT_AND,
                                                        Integer::Cast(right))),
-          Smi::Handle(Z, Smi::New(0)));
+          Object::smi_zero());
       SetValue(instr, result ? Bool::True() : Bool::False());
     } else {
       SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 2f3c3af..a0db6a8 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -223,9 +223,8 @@
     const intptr_t num_counters = flow_graph_.preorder().length();
     const Array& edge_counters =
         Array::Handle(Array::New(num_counters, Heap::kOld));
-    const Smi& zero_smi = Smi::Handle(Smi::New(0));
     for (intptr_t i = 0; i < num_counters; ++i) {
-      edge_counters.SetAt(i, zero_smi);
+      edge_counters.SetAt(i, Object::smi_zero());
     }
     edge_counters_array_ = edge_counters.raw();
   }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index e39e0fa..8cbf68a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2623,7 +2623,7 @@
             new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, GetDeoptId());
         flow_graph->InsertBefore(this, deopt, env(), FlowGraph::kEffect);
         // Replace with zero since it always throws.
-        return CreateConstantResult(flow_graph, Integer::Handle(Smi::New(0)));
+        return CreateConstantResult(flow_graph, Object::smi_zero());
       }
       break;
 
@@ -2633,7 +2633,7 @@
         return left()->definition();
       } else if ((rhs >= kBitsPerInt64) ||
                  ((rhs >= result_bits) && is_truncating())) {
-        return CreateConstantResult(flow_graph, Integer::Handle(Smi::New(0)));
+        return CreateConstantResult(flow_graph, Object::smi_zero());
       } else if ((rhs < 0) || ((rhs >= result_bits) && !is_truncating())) {
         // Instruction will always throw on negative rhs operand or
         // deoptimize on large rhs operand.
@@ -2647,7 +2647,7 @@
             new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, GetDeoptId());
         flow_graph->InsertBefore(this, deopt, env(), FlowGraph::kEffect);
         // Replace with zero since it overshifted or always throws.
-        return CreateConstantResult(flow_graph, Integer::Handle(Smi::New(0)));
+        return CreateConstantResult(flow_graph, Object::smi_zero());
       }
       break;
     }
@@ -2898,7 +2898,7 @@
                  MethodRecognizer::kByteDataFactory) {
         // A _ByteDataView returned from the ByteData constructor always
         // has an offset of 0.
-        return flow_graph->GetConstant(Smi::Handle(Smi::New(0)));
+        return flow_graph->GetConstant(Object::smi_zero());
       }
     }
   } else if (slot().IsTypeArguments()) {
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index a71a380..8f5492a 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -2891,7 +2891,7 @@
   // Check adjusted_length > 0.
   // TODO(ajcbik): this is a synthetic check that cannot
   // be directly linked to a use, is that a sign of wrong use?
-  ConstantInstr* zero = flow_graph->GetConstant(Smi::Handle(Z, Smi::New(0)));
+  ConstantInstr* zero = flow_graph->GetConstant(Object::smi_zero());
   Definition* check =
       flow_graph->CreateCheckBound(adjusted_length, zero, call->deopt_id());
   *cursor =
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index b350e13..84e1557 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -1137,7 +1137,7 @@
         }
 
         if (left == NULL) {
-          left = flow_graph_->GetConstant(Smi::Handle(Smi::New(0)));
+          left = flow_graph_->GetConstant(Object::smi_zero());
         }
 
         if (right == NULL) {
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 14f3026..5d8dc50 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -17,6 +17,7 @@
 #include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/interpreter.h"
+#include "vm/isolate_reload.h"
 #include "vm/json_stream.h"
 #include "vm/kernel.h"
 #include "vm/longjump.h"
@@ -2032,6 +2033,7 @@
   // TODO(hausner): Could possibly be combined with RemoveOptimizedCode()
   const ClassTable& class_table = *isolate_->class_table();
   Zone* zone = Thread::Current()->zone();
+  CallSiteResetter resetter(zone);
   Class& cls = Class::Handle(zone);
   Array& functions = Array::Handle(zone);
   GrowableObjectArray& closures = GrowableObjectArray::Handle(zone);
@@ -2060,7 +2062,7 @@
           }
           code = function.unoptimized_code();
           if (!code.IsNull()) {
-            code.ResetSwitchableCalls(zone);
+            resetter.ResetSwitchableCalls(code);
           }
           // Also disable any optimized implicit closure functions.
           if (function.HasImplicitClosureFunction()) {
@@ -2070,7 +2072,7 @@
             }
             code = function.unoptimized_code();
             if (!code.IsNull()) {
-              code.ResetSwitchableCalls(zone);
+              resetter.ResetSwitchableCalls(code);
             }
           }
         }
@@ -2089,7 +2091,7 @@
     }
     code = function.unoptimized_code();
     if (!code.IsNull()) {
-      code.ResetSwitchableCalls(zone);
+      resetter.ResetSwitchableCalls(code);
     }
   }
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 5fe3c39..87cfc24 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -1883,13 +1883,14 @@
   Code& code = Code::Handle(zone);
   Bytecode& bytecode = Bytecode::Handle(zone);
   Function& function = Function::Handle(zone);
+  CallSiteResetter resetter(zone);
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   while (frame != NULL) {
     if (frame->is_interpreted()) {
       bytecode = frame->LookupDartBytecode();
-      bytecode.ResetICDatas(zone);
+      resetter.ResetICDatas(bytecode);
     } else {
       code = frame->LookupDartCode();
       if (code.is_optimized() && !code.is_force_optimized()) {
@@ -1899,11 +1900,11 @@
         function = code.function();
         code = function.unoptimized_code();
         ASSERT(!code.IsNull());
-        code.ResetSwitchableCalls(zone);
-        code.ResetICDatas(zone);
+        resetter.ResetSwitchableCalls(code);
+        resetter.ResetICDatas(code);
       } else {
-        code.ResetSwitchableCalls(zone);
-        code.ResetICDatas(zone);
+        resetter.ResetSwitchableCalls(code);
+        resetter.ResetICDatas(code);
       }
     }
     frame = iterator.NextFrame();
@@ -1985,6 +1986,8 @@
     }
   }
 
+  CallSiteResetter resetter(zone);
+
   Class& owning_class = Class::Handle(zone);
   Library& owning_lib = Library::Handle(zone);
   Code& code = Code::Handle(zone);
@@ -2010,12 +2013,12 @@
 
     // Zero edge counters, before clearing the ICDataArray, since that's where
     // they're held.
-    func.ZeroEdgeCounters();
+    resetter.ZeroEdgeCounters(func);
 
     if (!bytecode.IsNull()) {
       // We are preserving the bytecode, fill all ICData arrays with
       // the sentinel values so that we have no stale type feedback.
-      bytecode.ResetICDatas(zone);
+      resetter.ResetICDatas(bytecode);
     }
 
     if (stub_code) {
@@ -2030,8 +2033,8 @@
     } else {
       // We are preserving the unoptimized code, fill all ICData arrays with
       // the sentinel values so that we have no stale type feedback.
-      code.ResetSwitchableCalls(zone);
-      code.ResetICDatas(zone);
+      resetter.ResetSwitchableCalls(code);
+      resetter.ResetICDatas(code);
     }
 
     // Clear counters.
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index f21c539..6937915 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -372,6 +372,38 @@
   static Dart_FileModifiedCallback file_modified_callback_;
 };
 
+class CallSiteResetter : public ValueObject {
+ public:
+  explicit CallSiteResetter(Zone* zone);
+
+  void ZeroEdgeCounters(const Function& function);
+  void ResetICDatas(const Code& code);
+  void ResetICDatas(const Bytecode& code);
+  void ResetICDatas(const ObjectPool& pool);
+  void Reset(const ICData& ic);
+  void ResetSwitchableCalls(const Code& code);
+
+ private:
+  Zone* zone_;
+  Instructions& instrs_;
+  ObjectPool& pool_;
+  Object& object_;
+  String& name_;
+  Class& new_cls_;
+  Library& new_lib_;
+  Function& new_function_;
+  Field& new_field_;
+  Array& entries_;
+  Function& old_target_;
+  Function& new_target_;
+  Function& caller_;
+  Array& args_desc_array_;
+  Array& ic_data_array_;
+  Array& edge_counters_;
+  PcDescriptors& descriptors_;
+  ICData& ic_data_;
+};
+
 }  // namespace dart
 
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 1a07cc9..b9322cf 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -871,6 +871,7 @@
   *bool_false_ = Bool::New(false);
 
   *smi_illegal_cid_ = Smi::New(kIllegalCid);
+  *smi_zero_ = Smi::New(0);
 
   String& error_str = String::Handle();
   error_str = String::New("SnapshotWriter Error", Heap::kOld);
@@ -962,6 +963,7 @@
   ASSERT(!bool_false_->IsSmi());
   ASSERT(bool_false_->IsBool());
   ASSERT(smi_illegal_cid_->IsSmi());
+  ASSERT(smi_zero_->IsSmi());
   ASSERT(!snapshot_writer_error_->IsSmi());
   ASSERT(snapshot_writer_error_->IsLanguageError());
   ASSERT(!branch_offset_error_->IsSmi());
@@ -10995,7 +10997,7 @@
 static RawArray* NewDictionary(intptr_t initial_size) {
   const Array& dict = Array::Handle(Array::New(initial_size + 1, Heap::kOld));
   // The last element of the dictionary specifies the number of in use slots.
-  dict.SetAt(initial_size, Smi::Handle(Smi::New(0)));
+  dict.SetAt(initial_size, Object::smi_zero());
   return dict.raw();
 }
 
@@ -13685,7 +13687,10 @@
   const intptr_t len = Length();
   ASSERT(index >= 0);
   ASSERT(index < len);
-  Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t start = index * TestEntryLength();
   const intptr_t end = start + TestEntryLength();
   for (intptr_t i = start; i < end; i++) {
@@ -13712,7 +13717,10 @@
   const intptr_t num_args_tested = NumArgsTested();
   if (num_args_tested == 0) {
     // No type feedback is being collected.
-    const Array& data = Array::Handle(entries());
+    Thread* thread = Thread::Current();
+    REUSABLE_ARRAY_HANDLESCOPE(thread);
+    Array& data = thread->ArrayHandle();
+    data = entries();
     // Static calls with no argument checks hold only one target and the
     // sentinel value.
     ASSERT(len == 2);
@@ -13722,24 +13730,24 @@
     data.SetAt(TargetIndexFor(num_args_tested), func);
     // Set count to 0 as this is called during compilation, before the
     // call has been executed.
-    const Smi& value = Smi::Handle(Smi::New(0));
-    data.SetAt(CountIndexFor(num_args_tested), value);
+    data.SetAt(CountIndexFor(num_args_tested), Object::smi_zero());
   } else {
     // Type feedback on arguments is being collected.
-    const Array& data = Array::Handle(entries());
-
     // Fill all but the first entry with the sentinel.
     for (intptr_t i = len - 1; i > 0; i--) {
       WriteSentinelAt(i);
     }
+    Thread* thread = Thread::Current();
+    REUSABLE_ARRAY_HANDLESCOPE(thread);
+    Array& data = thread->ArrayHandle();
+    data = entries();
     // Rewrite the dummy entry.
     const Smi& object_cid = Smi::Handle(Smi::New(kObjectCid));
     for (intptr_t i = 0; i < NumArgsTested(); i++) {
       data.SetAt(i, object_cid);
     }
     data.SetAt(TargetIndexFor(num_args_tested), func);
-    const Smi& value = Smi::Handle(Smi::New(0));
-    data.SetAt(CountIndexFor(num_args_tested), value);
+    data.SetAt(CountIndexFor(num_args_tested), Object::smi_zero());
   }
 }
 
@@ -13803,7 +13811,10 @@
   // Can add only once.
   const intptr_t old_num = NumberOfChecks();
   ASSERT(old_num == 0);
-  Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t new_len = data.Length() + TestEntryLength();
   data = Array::Grow(data, new_len, Heap::kOld);
   WriteSentinel(data, TestEntryLength());
@@ -13812,8 +13823,7 @@
   data.SetAt(data_pos + TargetIndexFor(NumArgsTested()), target);
   // Set count to 0 as this is called during compilation, before the
   // call has been executed.
-  const Smi& value = Smi::Handle(Smi::New(0));
-  data.SetAt(data_pos + CountIndexFor(NumArgsTested()), value);
+  data.SetAt(data_pos + CountIndexFor(NumArgsTested()), Object::smi_zero());
   // Multithreaded access to ICData requires setting of array to be the last
   // operation.
   set_entries(data);
@@ -13977,7 +13987,10 @@
   if (!is_tracking_exactness()) {
     return StaticTypeExactnessState::NotTracking();
   }
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   intptr_t data_pos =
       index * TestEntryLength() + ExactnessIndexFor(NumArgsTested());
   return StaticTypeExactnessState::Decode(
@@ -13991,7 +14004,10 @@
   ASSERT(class_ids != NULL);
   ASSERT(target != NULL);
   class_ids->Clear();
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   intptr_t data_pos = index * TestEntryLength();
   for (intptr_t i = 0; i < NumArgsTested(); i++) {
     class_ids->Add(Smi::Value(Smi::RawCast(data.At(data_pos + i))));
@@ -14001,7 +14017,10 @@
 
 bool ICData::IsSentinelAt(intptr_t index) const {
   ASSERT(index < Length());
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t entry_length = TestEntryLength();
   intptr_t data_pos = index * TestEntryLength();
   for (intptr_t i = 0; i < entry_length; i++) {
@@ -14019,7 +14038,10 @@
   ASSERT(class_ids != NULL);
   ASSERT(!IsSentinelAt(index));
   class_ids->Clear();
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   intptr_t data_pos = index * TestEntryLength();
   for (intptr_t i = 0; i < NumArgsTested(); i++) {
     class_ids->Add(Smi::Value(Smi::RawCast(data.At(data_pos++))));
@@ -14032,7 +14054,10 @@
   ASSERT(class_id != NULL);
   ASSERT(target != NULL);
   ASSERT(NumArgsTested() == 1);
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t data_pos = index * TestEntryLength();
   *class_id = Smi::Value(Smi::RawCast(data.At(data_pos)));
   *target ^= data.At(data_pos + TargetIndexFor(NumArgsTested()));
@@ -14040,7 +14065,10 @@
 
 intptr_t ICData::GetCidAt(intptr_t index) const {
   ASSERT(NumArgsTested() == 1);
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t data_pos = index * TestEntryLength();
   return Smi::Value(Smi::RawCast(data.At(data_pos)));
 }
@@ -14090,7 +14118,10 @@
   ASSERT(0 <= value);
   ASSERT(value <= Smi::kMaxValue);
 
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t data_pos =
       index * TestEntryLength() + CountIndexFor(NumArgsTested());
   data.SetAt(data_pos, Smi::Handle(Smi::New(value)));
@@ -14098,7 +14129,10 @@
 
 intptr_t ICData::GetCountAt(intptr_t index) const {
   ASSERT(Isolate::Current()->compilation_allowed());
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t data_pos =
       index * TestEntryLength() + CountIndexFor(NumArgsTested());
   intptr_t value = Smi::Value(Smi::RawCast(data.At(data_pos)));
@@ -14122,7 +14156,10 @@
 
 void ICData::SetCodeAt(intptr_t index, const Code& value) const {
   ASSERT(!Isolate::Current()->compilation_allowed());
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t data_pos =
       index * TestEntryLength() + CodeIndexFor(NumArgsTested());
   data.SetAt(data_pos, value);
@@ -14130,7 +14167,10 @@
 
 void ICData::SetEntryPointAt(intptr_t index, const Smi& value) const {
   ASSERT(!Isolate::Current()->compilation_allowed());
-  const Array& data = Array::Handle(entries());
+  Thread* thread = Thread::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(thread);
+  Array& data = thread->ArrayHandle();
+  data = entries();
   const intptr_t data_pos =
       index * TestEntryLength() + EntryPointIndexFor(NumArgsTested());
   data.SetAt(data_pos, value);
@@ -14432,8 +14472,7 @@
 }
 
 bool ICData::IsImmutable() const {
-  const Array& data = Array::Handle(entries());
-  return data.IsImmutable();
+  return entries()->IsImmutableArray();
 }
 
 RawICData* ICData::New() {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 09a7c02..c5ab60c 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -413,6 +413,7 @@
   V(Bool, bool_true)                                                           \
   V(Bool, bool_false)                                                          \
   V(Smi, smi_illegal_cid)                                                      \
+  V(Smi, smi_zero)                                                             \
   V(LanguageError, snapshot_writer_error)                                      \
   V(LanguageError, branch_offset_error)                                        \
   V(LanguageError, speculative_inlining_error)                                 \
@@ -2065,6 +2066,7 @@
   friend class SnapshotWriter;
   friend class Serializer;
   friend class Deserializer;
+  friend class CallSiteResetter;
 };
 
 // Often used constants for number of free function type parameters.
@@ -2172,10 +2174,6 @@
                                 intptr_t num_free_fun_type_params = kAllFree,
                                 TrailPtr trail = NULL) const;
 
-  // Reloading support:
-  void Reparent(const Class& new_cls) const;
-  void ZeroEdgeCounters() const;
-
   RawClass* Owner() const;
   void set_owner(const Object& value) const;
   RawClass* origin() const;
@@ -4567,9 +4565,6 @@
     StoreNonPointer(&EntryAddr(index)->raw_value_, raw_value);
   }
 
-  // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas.
-  void ResetICDatas(Zone* zone) const;
-
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawObjectPool) ==
            OFFSET_OF_RETURNED_VALUE(RawObjectPool, data));
@@ -5292,11 +5287,6 @@
     StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw());
   }
 
-  // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas
-  // that are embedded inside the Code or ObjecPool objects.
-  void ResetICDatas(Zone* zone) const;
-  void ResetSwitchableCalls(Zone* zone) const;
-
   // Array of DeoptInfo objects.
   RawArray* deopt_info_array() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -5691,6 +5681,7 @@
   // So that the RawFunction pointer visitor can determine whether code the
   // function points to is optimized.
   friend class RawFunction;
+  friend class CallSiteResetter;
 };
 
 class Bytecode : public Object {
@@ -5731,10 +5722,6 @@
     StorePointer(&raw_ptr()->function_, function.raw());
   }
 
-  // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas
-  // that are embedded inside the Code or ObjecPool objects.
-  void ResetICDatas(Zone* zone) const;
-
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawBytecode));
   }
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index f3faad4..0120e58 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -21,57 +21,55 @@
 DECLARE_FLAG(bool, trace_reload_verbose);
 DECLARE_FLAG(bool, two_args_smi_icd);
 
-class ObjectReloadUtils : public AllStatic {
-  static void DumpLibraryDictionary(const Library& lib) {
-    DictionaryIterator it(lib);
-    Object& entry = Object::Handle();
-    String& name = String::Handle();
-    TIR_Print("Dumping dictionary for %s\n", lib.ToCString());
-    while (it.HasNext()) {
-      entry = it.GetNext();
-      name = entry.DictionaryName();
-      TIR_Print("%s -> %s\n", name.ToCString(), entry.ToCString());
-    }
-  }
-};
-
-void Function::Reparent(const Class& new_cls) const {
-  set_owner(new_cls);
-}
-
-void Function::ZeroEdgeCounters() const {
-  const Array& saved_ic_data = Array::Handle(ic_data_array());
-  if (saved_ic_data.IsNull()) {
+void CallSiteResetter::ZeroEdgeCounters(const Function& function) {
+  ic_data_array_ = function.ic_data_array();
+  if (ic_data_array_.IsNull()) {
     return;
   }
-  const intptr_t saved_ic_datalength = saved_ic_data.Length();
-  ASSERT(saved_ic_datalength > 0);
-  const Array& edge_counters_array =
-      Array::Handle(Array::RawCast(saved_ic_data.At(0)));
-  if (edge_counters_array.IsNull()) {
+  ASSERT(ic_data_array_.Length() > 0);
+  edge_counters_ ^= ic_data_array_.At(0);
+  if (edge_counters_.IsNull()) {
     return;
   }
   // Fill edge counters array with zeros.
-  const Smi& zero = Smi::Handle(Smi::New(0));
-  for (intptr_t i = 0; i < edge_counters_array.Length(); i++) {
-    edge_counters_array.SetAt(i, zero);
+  for (intptr_t i = 0; i < edge_counters_.Length(); i++) {
+    edge_counters_.SetAt(i, Object::smi_zero());
   }
 }
 
-void Code::ResetICDatas(Zone* zone) const {
-// Iterate over the Code's object pool and reset all ICDatas.
+CallSiteResetter::CallSiteResetter(Zone* zone)
+    : zone_(zone),
+      instrs_(Instructions::Handle(zone)),
+      pool_(ObjectPool::Handle(zone)),
+      object_(Object::Handle(zone)),
+      name_(String::Handle(zone)),
+      new_cls_(Class::Handle(zone)),
+      new_lib_(Library::Handle(zone)),
+      new_function_(Function::Handle(zone)),
+      new_field_(Field::Handle(zone)),
+      entries_(Array::Handle(zone)),
+      old_target_(Function::Handle(zone)),
+      new_target_(Function::Handle(zone)),
+      caller_(Function::Handle(zone)),
+      args_desc_array_(Array::Handle(zone)),
+      ic_data_array_(Array::Handle(zone)),
+      edge_counters_(Array::Handle(zone)),
+      descriptors_(PcDescriptors::Handle(zone)),
+      ic_data_(ICData::Handle(zone)) {}
+
+void CallSiteResetter::ResetICDatas(const Code& code) {
+  // Iterate over the Code's object pool and reset all ICDatas.
 #ifdef TARGET_ARCH_IA32
   // IA32 does not have an object pool, but, we can iterate over all
   // embedded objects by using the variable length data section.
-  if (!is_alive()) {
+  if (!code.is_alive()) {
     return;
   }
-  const Instructions& instrs = Instructions::Handle(zone, instructions());
-  ASSERT(!instrs.IsNull());
-  uword base_address = instrs.PayloadStart();
-  Object& object = Object::Handle(zone);
-  intptr_t offsets_length = pointer_offsets_length();
-  const int32_t* offsets = raw_ptr()->data();
+  instrs_ = code.instructions();
+  ASSERT(!instrs_.IsNull());
+  uword base_address = instrs_.PayloadStart();
+  intptr_t offsets_length = code.pointer_offsets_length();
+  const int32_t* offsets = code.raw_ptr()->data();
   for (intptr_t i = 0; i < offsets_length; i++) {
     int32_t offset = offsets[i];
     RawObject** object_ptr =
@@ -80,15 +78,15 @@
     if (!raw_object->IsHeapObject()) {
       continue;
     }
-    object = raw_object;
-    if (object.IsICData()) {
-      ICData::Cast(object).Reset(zone);
+    object_ = raw_object;
+    if (object_.IsICData()) {
+      Reset(ICData::Cast(object_));
     }
   }
 #else
-  const ObjectPool& pool = ObjectPool::Handle(zone, object_pool());
-  ASSERT(!pool.IsNull());
-  pool.ResetICDatas(zone);
+  pool_ = code.object_pool();
+  ASSERT(!pool_.IsNull());
+  ResetICDatas(pool_);
 #endif
 }
 
@@ -117,17 +115,17 @@
 }
 #endif  // !defined(TARGET_ARCH_DBC)
 
-void Code::ResetSwitchableCalls(Zone* zone) const {
+void CallSiteResetter::ResetSwitchableCalls(const Code& code) {
 #if !defined(TARGET_ARCH_DBC)
-  if (is_optimized()) {
+  if (code.is_optimized()) {
     return;  // No switchable calls in optimized code.
   }
 
-  const Object& owner = Object::Handle(zone, this->owner());
-  if (!owner.IsFunction()) {
+  object_ = code.owner();
+  if (!object_.IsFunction()) {
     return;  // No switchable calls in stub code.
   }
-  const Function& function = Function::Cast(owner);
+  const Function& function = Function::Cast(object_);
 
   if (function.kind() == RawFunction::kIrregexpFunction) {
     // Regex matchers do not support breakpoints or stepping, and they only call
@@ -138,102 +136,92 @@
     return;
   }
 
-  const Array& ic_data_array = Array::Handle(zone, function.ic_data_array());
-  if (ic_data_array.IsNull()) {
+  ic_data_array_ = function.ic_data_array();
+  if (ic_data_array_.IsNull()) {
     // The megamorphic miss stub and some recognized function doesn't populate
     // their ic_data_array. Check this only happens for functions without IC
     // calls.
 #if defined(DEBUG)
-    const PcDescriptors& descriptors =
-        PcDescriptors::Handle(zone, pc_descriptors());
-    PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kIcCall);
+    descriptors_ = code.pc_descriptors();
+    PcDescriptors::Iterator iter(descriptors_, RawPcDescriptors::kIcCall);
     while (iter.MoveNext()) {
-      FATAL1("%s has IC calls but no ic_data_array\n", owner.ToCString());
+      FATAL1("%s has IC calls but no ic_data_array\n", object_.ToCString());
     }
 #endif
     return;
   }
 
-  ICData& ic_data = ICData::Handle(zone);
-  Object& data = Object::Handle(zone);
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(zone, pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kIcCall);
+  descriptors_ = code.pc_descriptors();
+  PcDescriptors::Iterator iter(descriptors_, RawPcDescriptors::kIcCall);
   while (iter.MoveNext()) {
-    uword pc = PayloadStart() + iter.PcOffset();
-    CodePatcher::GetInstanceCallAt(pc, *this, &data);
+    uword pc = code.PayloadStart() + iter.PcOffset();
+    CodePatcher::GetInstanceCallAt(pc, code, &object_);
     // This check both avoids unnecessary patching to reduce log spam and
     // prevents patching over breakpoint stubs.
-    if (!data.IsICData()) {
-      FindICData(ic_data_array, iter.DeoptId(), &ic_data);
-      ASSERT(ic_data.rebind_rule() == ICData::kInstance);
-      ASSERT(ic_data.NumArgsTested() == 1);
+    if (!object_.IsICData()) {
+      FindICData(ic_data_array_, iter.DeoptId(), &ic_data_);
+      ASSERT(ic_data_.rebind_rule() == ICData::kInstance);
+      ASSERT(ic_data_.NumArgsTested() == 1);
       const Code& stub =
-          ic_data.is_tracking_exactness()
+          ic_data_.is_tracking_exactness()
               ? StubCode::OneArgCheckInlineCacheWithExactnessCheck()
               : StubCode::OneArgCheckInlineCache();
-      CodePatcher::PatchInstanceCallAt(pc, *this, ic_data, stub);
+      CodePatcher::PatchInstanceCallAt(pc, code, ic_data_, stub);
       if (FLAG_trace_ic) {
         OS::PrintErr("Instance call at %" Px
                      " resetting to polymorphic dispatch, %s\n",
-                     pc, ic_data.ToCString());
+                     pc, ic_data_.ToCString());
       }
     }
   }
 #endif
 }
 
-void Bytecode::ResetICDatas(Zone* zone) const {
+void CallSiteResetter::ResetICDatas(const Bytecode& bytecode) {
   // Iterate over the Bytecode's object pool and reset all ICDatas.
-  const ObjectPool& pool = ObjectPool::Handle(zone, object_pool());
-  ASSERT(!pool.IsNull());
-  pool.ResetICDatas(zone);
+  pool_ = bytecode.object_pool();
+  ASSERT(!pool_.IsNull());
+  ResetICDatas(pool_);
 
-  Object& object = Object::Handle(zone);
-  String& name = String::Handle(zone);
-  Class& new_cls = Class::Handle(zone);
-  Library& new_lib = Library::Handle(zone);
-  Function& new_function = Function::Handle(zone);
-  Field& new_field = Field::Handle(zone);
-  for (intptr_t i = 0; i < pool.Length(); i++) {
-    ObjectPool::EntryType entry_type = pool.TypeAt(i);
+  for (intptr_t i = 0; i < pool_.Length(); i++) {
+    ObjectPool::EntryType entry_type = pool_.TypeAt(i);
     if (entry_type != ObjectPool::EntryType::kTaggedObject) {
       continue;
     }
-    object = pool.ObjectAt(i);
-    if (object.IsFunction()) {
-      const Function& old_function = Function::Cast(object);
+    object_ = pool_.ObjectAt(i);
+    if (object_.IsFunction()) {
+      const Function& old_function = Function::Cast(object_);
       if (old_function.IsClosureFunction()) {
         continue;
       }
-      name = old_function.name();
-      new_cls = old_function.Owner();
-      if (new_cls.IsTopLevel()) {
-        new_lib = new_cls.library();
-        new_function = new_lib.LookupLocalFunction(name);
+      name_ = old_function.name();
+      new_cls_ = old_function.Owner();
+      if (new_cls_.IsTopLevel()) {
+        new_lib_ = new_cls_.library();
+        new_function_ = new_lib_.LookupLocalFunction(name_);
       } else {
-        new_function = new_cls.LookupFunction(name);
+        new_function_ = new_cls_.LookupFunction(name_);
       }
-      if (!new_function.IsNull() &&
-          (new_function.is_static() == old_function.is_static()) &&
-          (new_function.kind() == old_function.kind())) {
-        pool.SetObjectAt(i, new_function);
+      if (!new_function_.IsNull() &&
+          (new_function_.is_static() == old_function.is_static()) &&
+          (new_function_.kind() == old_function.kind())) {
+        pool_.SetObjectAt(i, new_function_);
       } else {
         VTIR_Print("Cannot rebind function %s\n", old_function.ToCString());
       }
-    } else if (object.IsField()) {
-      const Field& old_field = Field::Cast(object);
-      name = old_field.name();
-      new_cls = old_field.Owner();
-      if (new_cls.IsTopLevel()) {
-        new_lib = new_cls.library();
-        new_field = new_lib.LookupLocalField(name);
+    } else if (object_.IsField()) {
+      const Field& old_field = Field::Cast(object_);
+      name_ = old_field.name();
+      new_cls_ = old_field.Owner();
+      if (new_cls_.IsTopLevel()) {
+        new_lib_ = new_cls_.library();
+        new_field_ = new_lib_.LookupLocalField(name_);
       } else {
-        new_field = new_cls.LookupField(name);
+        new_field_ = new_cls_.LookupField(name_);
       }
-      if (!new_field.IsNull() &&
-          (new_field.is_static() == old_field.is_static())) {
-        pool.SetObjectAt(i, new_field);
+      if (!new_field_.IsNull() &&
+          (new_field_.is_static() == old_field.is_static())) {
+        pool_.SetObjectAt(i, new_field_);
       } else {
         VTIR_Print("Cannot rebind field %s\n", old_field.ToCString());
       }
@@ -241,16 +229,15 @@
   }
 }
 
-void ObjectPool::ResetICDatas(Zone* zone) const {
-  Object& object = Object::Handle(zone);
-  for (intptr_t i = 0; i < Length(); i++) {
-    ObjectPool::EntryType entry_type = TypeAt(i);
+void CallSiteResetter::ResetICDatas(const ObjectPool& pool) {
+  for (intptr_t i = 0; i < pool.Length(); i++) {
+    ObjectPool::EntryType entry_type = pool.TypeAt(i);
     if (entry_type != ObjectPool::EntryType::kTaggedObject) {
       continue;
     }
-    object = ObjectAt(i);
-    if (object.IsICData()) {
-      ICData::Cast(object).Reset(zone);
+    object_ = pool.ObjectAt(i);
+    if (object_.IsICData()) {
+      Reset(ICData::Cast(object_));
     }
   }
 }
@@ -702,6 +689,9 @@
                         IsolateReloadContext* context) const {
   ASSERT(IsolateReloadContext::IsSameClass(*this, replacement));
 
+  // Ensure is_enum_class etc have been set.
+  replacement.EnsureDeclarationLoaded();
+
   // Class cannot change enum property.
   if (is_enum_class() != replacement.is_enum_class()) {
     context->AddReasonForCancelling(new (context->zone()) EnumClassConflict(
@@ -838,96 +828,90 @@
   }
 }
 
-static const Function* static_call_target = NULL;
-
-void ICData::Reset(Zone* zone) const {
-  RebindRule rule = rebind_rule();
-  if (rule == kInstance) {
-    const intptr_t num_args = NumArgsTested();
-    const bool tracking_exactness = is_tracking_exactness();
-    const intptr_t len = Length();
+void CallSiteResetter::Reset(const ICData& ic) {
+  ICData::RebindRule rule = ic.rebind_rule();
+  if (rule == ICData::kInstance) {
+    const intptr_t num_args = ic.NumArgsTested();
+    const bool tracking_exactness = ic.is_tracking_exactness();
+    const intptr_t len = ic.Length();
     // We need at least one non-sentinel entry to require a check
     // for the smi fast path case.
     if (num_args == 2 && len >= 2) {
-      if (IsImmutable()) {
+      if (ic.IsImmutable()) {
         return;
       }
-      Zone* zone = Thread::Current()->zone();
-      const String& name = String::Handle(target_name());
-      const Class& smi_class = Class::Handle(Smi::Class());
+      name_ = ic.target_name();
+      const Class& smi_class = Class::Handle(zone_, Smi::Class());
       const Function& smi_op_target = Function::Handle(
-          Resolver::ResolveDynamicAnyArgs(zone, smi_class, name));
+          zone_, Resolver::ResolveDynamicAnyArgs(zone_, smi_class, name_));
       GrowableArray<intptr_t> class_ids(2);
-      Function& target = Function::Handle();
-      GetCheckAt(0, &class_ids, &target);
+      Function& target = Function::Handle(zone_);
+      ic.GetCheckAt(0, &class_ids, &target);
       if ((target.raw() == smi_op_target.raw()) && (class_ids[0] == kSmiCid) &&
           (class_ids[1] == kSmiCid)) {
         // The smi fast path case, preserve the initial entry but reset the
         // count.
-        ClearCountAt(0);
-        WriteSentinelAt(1);
-        const Array& array = Array::Handle(entries());
-        array.Truncate(2 * TestEntryLength());
+        ic.ClearCountAt(0);
+        ic.WriteSentinelAt(1);
+        entries_ = ic.entries();
+        entries_.Truncate(2 * ic.TestEntryLength());
         return;
       }
       // Fall back to the normal behavior with cached empty ICData arrays.
     }
-    const Array& data_array = Array::Handle(
-        zone, CachedEmptyICDataArray(num_args, tracking_exactness));
-    set_entries(data_array);
-    set_is_megamorphic(false);
+    entries_ = ICData::CachedEmptyICDataArray(num_args, tracking_exactness);
+    ic.set_entries(entries_);
+    ic.set_is_megamorphic(false);
     return;
-  } else if (rule == kNoRebind || rule == kNSMDispatch) {
+  } else if (rule == ICData::kNoRebind || rule == ICData::kNSMDispatch) {
     // TODO(30877) we should account for addition/removal of NSM.
     // Don't rebind dispatchers.
     return;
-  } else if (rule == kStatic || rule == kSuper) {
-    const Function& old_target = Function::Handle(zone, GetTargetAt(0));
-    if (old_target.IsNull()) {
+  } else if (rule == ICData::kStatic || rule == ICData::kSuper) {
+    old_target_ = ic.GetTargetAt(0);
+    if (old_target_.IsNull()) {
       FATAL("old_target is NULL.\n");
     }
-    static_call_target = &old_target;
+    name_ = old_target_.name();
 
-    const String& selector = String::Handle(zone, old_target.name());
-    Function& new_target = Function::Handle(zone);
-
-    if (rule == kStatic) {
-      ASSERT(old_target.is_static() ||
-             old_target.kind() == RawFunction::kConstructor);
+    if (rule == ICData::kStatic) {
+      ASSERT(old_target_.is_static() ||
+             old_target_.kind() == RawFunction::kConstructor);
       // This can be incorrect if the call site was an unqualified invocation.
-      const Class& cls = Class::Handle(zone, old_target.Owner());
-      new_target = cls.LookupFunction(selector);
-      if (new_target.kind() != old_target.kind()) {
-        new_target = Function::null();
+      new_cls_ = old_target_.Owner();
+      new_target_ = new_cls_.LookupFunction(name_);
+      if (new_target_.kind() != old_target_.kind()) {
+        new_target_ = Function::null();
       }
     } else {
       // Super call.
-      Function& caller = Function::Handle(zone);
-      caller = Owner();
-      ASSERT(!caller.is_static());
-      Class& cls = Class::Handle(zone, caller.Owner());
-      cls = cls.SuperClass();
-      while (!cls.IsNull()) {
+      caller_ = ic.Owner();
+      ASSERT(!caller_.is_static());
+      new_cls_ = caller_.Owner();
+      new_cls_ = new_cls_.SuperClass();
+      new_target_ = Function::null();
+      while (!new_cls_.IsNull()) {
         // TODO(rmacnak): Should use Resolver::ResolveDynamicAnyArgs to handle
         // method-extractors and call-through-getters, but we're in a no
         // safepoint scope here.
-        new_target = cls.LookupDynamicFunction(selector);
-        if (!new_target.IsNull()) {
+        new_target_ = new_cls_.LookupDynamicFunction(name_);
+        if (!new_target_.IsNull()) {
           break;
         }
-        cls = cls.SuperClass();
+        new_cls_ = new_cls_.SuperClass();
       }
     }
-    const Array& args_desc_array = Array::Handle(zone, arguments_descriptor());
-    ArgumentsDescriptor args_desc(args_desc_array);
-    if (new_target.IsNull() || !new_target.AreValidArguments(args_desc, NULL)) {
+    args_desc_array_ = ic.arguments_descriptor();
+    ArgumentsDescriptor args_desc(args_desc_array_);
+    if (new_target_.IsNull() ||
+        !new_target_.AreValidArguments(args_desc, NULL)) {
       // TODO(rmacnak): Patch to a NSME stub.
       VTIR_Print("Cannot rebind static call to %s from %s\n",
-                 old_target.ToCString(),
-                 Object::Handle(zone, Owner()).ToCString());
+                 old_target_.ToCString(),
+                 Object::Handle(zone_, ic.Owner()).ToCString());
       return;
     }
-    ClearAndSetStaticTarget(new_target);
+    ic.ClearAndSetStaticTarget(new_target_);
   } else {
     FATAL("Unexpected rebind rule.");
   }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 50a922e..7d9126c 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1352,6 +1352,7 @@
   friend class StackFrame;
   friend class Profiler;
   friend class FunctionDeserializationCluster;
+  friend class CallSiteResetter;
 };
 
 class RawBytecode : public RawObject {
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
index f800931..5ba4056 100644
--- a/runtime/vm/regexp_test.cc
+++ b/runtime/vm/regexp_test.cc
@@ -17,7 +17,7 @@
   Zone* zone = thread->zone();
   const RegExp& regexp =
       RegExp::Handle(RegExpEngine::CreateRegExp(thread, pat, RegExpFlags()));
-  const Smi& idx = Smi::Handle(Smi::New(0));
+  const Smi& idx = Object::smi_zero();
   return IRRegExpMacroAssembler::Execute(regexp, str, idx, /*sticky=*/false,
                                          zone);
 }
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 032bfd1..4a01769 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -894,8 +894,8 @@
 
     // No source code for this assertion, set url to null.
     args.SetAt(1, String::Handle(zone, String::null()));
-    args.SetAt(2, Smi::Handle(zone, Smi::New(0)));
-    args.SetAt(3, Smi::Handle(zone, Smi::New(0)));
+    args.SetAt(2, Object::smi_zero());
+    args.SetAt(3, Object::smi_zero());
     args.SetAt(4, String::Handle(zone, String::null()));
 
     Exceptions::ThrowByType(Exceptions::kAssertion, args);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 7981794..d212875 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -4064,6 +4064,7 @@
 
 static const MethodParameter* request_heap_snapshot_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
+    NULL,
 };
 
 static bool RequestHeapSnapshot(Thread* thread, JSONStream* js) {
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 6d65362..b0ae846 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -261,7 +261,7 @@
 It is considered a _backwards compatible_ change to add a new type of event to an existing stream.
 Clients should be written to handle this gracefully.
 
-### Binary Events
+## Binary Events
 
 Some events are associated with bulk binary data. These events are delivered as
 WebSocket binary frames instead of text frames. A binary event's metadata
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index d3ff62f..e388cd6 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -372,13 +372,6 @@
   return rawField;
 })()''');
 
-// TODO(jmesserly): the debugger extension hardcodes a call to this private
-// function. Fix that.
-@Deprecated('use replNameLookup')
-_dhelperRepl(obj, field, Function(Object) callback) {
-  return callback(replNameLookup(obj, field));
-}
-
 /// Shared code for dsend, dindex, and dsetindex.
 callMethod(obj, name, typeArgs, args, named, displayName) {
   if (JS('!', 'typeof # == "function" && # == "call"', obj, name)) {
diff --git a/tests/lib_2/isolate/spawn_function_custom_class_test.dart b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
index 515c973..d3ccfc1 100644
--- a/tests/lib_2/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
@@ -14,26 +14,38 @@
 import "remote_unittest_helper.dart";
 
 class MyClass {
-  var myVar = 'there';
+  final myVar = 'there';
   myFunc(msg) {
     return '$msg $myVar';
   }
 }
 
-child(args) {
-  var reply = args[1];
-  var msg = args[0];
+isolateEntryPoint(args) {
+  final reply = args[1];
+  final msg = args[0];
   reply.send('re: ${new MyClass().myFunc(msg)}');
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test('message - reply chain', () {
-    ReceivePort port = new ReceivePort();
-    Isolate.spawn(child, ['hi', port.sendPort]);
-    port.listen((msg) {
-      port.close();
+  if (testRemote(main, port)) {
+    return;
+  }
+
+  test('message - reply chain', () async {
+    final exitPort = ReceivePort();
+    final replyPort = ReceivePort();
+
+    final isolate = Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
+        onExit: exitPort.sendPort);
+
+    replyPort.listen((msg) {
+      replyPort.close();
       expect(msg, equals('re: hi there'));
     });
+
+    // Explicitly await spawned isolate exit to enforce main isolate not
+    // completing (and the stand-alone runtime exiting) before the spawned
+    // isolate is done.
+    await exitPort.first;
   });
 }
diff --git a/tools/VERSION b/tools/VERSION
index 69ff003..45046d5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 5
 PATCH 0
-PRERELEASE 3
+PRERELEASE 4
 PRERELEASE_PATCH 0
 ABI_VERSION 11
 OLDEST_SUPPORTED_ABI_VERSION 11
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index ca38187..e3c30d5 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -208,17 +208,16 @@
     out/ReleaseIA32/dart --profile-period=10000 --packages=.packages hello.dart
     out/ReleaseIA32/dart-sdk/bin/dart2js --packages=.packages --out=out.js -m hello.dart
     third_party/d8/linux/ia32/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
-    out/ReleaseIA32/dart-sdk/bin/dart2js --checked --packages=.packages --out=out.js -m hello.dart
-    third_party/d8/linux/ia32/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
     out/ReleaseIA32/dart-sdk/bin/dart2js --packages=.packages --out=out.js -m hello.dart
     LD_LIBRARY_PATH=third_party/firefox_jsshell/linux/jsshell/ third_party/firefox_jsshell/linux/jsshell/js -f sdk/lib/_internal/js_runtime/lib/preambles/jsshell.js -f out.js
     out/ReleaseIA32/dart-sdk/bin/dart2js --benchmarking-production --packages=.packages --out=out.js -m hello.dart
     third_party/d8/linux/ia32/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
+    out/ReleaseIA32/dart-sdk/bin/dart2js --benchmarking-x --packages=.packages --out=out.js -m hello.dart
+    third_party/d8/linux/ia32/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
     out/ReleaseIA32/dart-sdk/bin/dart2js --use-kernel --packages=.packages --out=out.js -m hello.dart
     third_party/d8/linux/ia32/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
     out/ReleaseIA32/dart pkg/front_end/tool/perf.dart parse hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/perf.dart scan hello.dart
-    out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart --legacy kernel_gen_e2e hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart kernel_gen_e2e hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart scan hello.dart
     out/ReleaseIA32/dart --print_metrics pkg/analyzer_cli/bin/analyzer.dart --dart-sdk=sdk hello.dart
@@ -398,7 +397,6 @@
     out/ReleaseX64/dart --profile-period=10000 --packages=.packages --use-bytecode-compiler --optimization-counter-threshold=-1 hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart parse hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart scan hello.dart
-    out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart --legacy kernel_gen_e2e hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart kernel_gen_e2e hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart scan hello.dart
     out/ReleaseX64/dart pkg/analysis_server/benchmark/benchmarks.dart run --quick --repeat 1 analysis-server-cold