diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 9e55d9d21..3708c2d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -1142,6 +1142,8 @@
     if (declaredMember == interfaceMember) {
       return;
     }
+    Member interfaceMemberOrigin =
+        interfaceMember.memberSignatureOrigin ?? interfaceMember;
     if (declaredMember is Constructor || interfaceMember is Constructor) {
       unimplemented(
           "Constructor in override check.", declaredMember.fileOffset, fileUri);
@@ -1150,18 +1152,18 @@
       if (declaredMember.kind == interfaceMember.kind) {
         if (declaredMember.kind == ProcedureKind.Method ||
             declaredMember.kind == ProcedureKind.Operator) {
-          bool seenCovariant = checkMethodOverride(
-              types, declaredMember, interfaceMember, isInterfaceCheck);
+          bool seenCovariant = checkMethodOverride(types, declaredMember,
+              interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
           if (seenCovariant) {
             handleSeenCovariant(
                 types, declaredMember, interfaceMember, isSetter, callback);
           }
         } else if (declaredMember.kind == ProcedureKind.Getter) {
-          checkGetterOverride(
-              types, declaredMember, interfaceMember, isInterfaceCheck);
+          checkGetterOverride(types, declaredMember, interfaceMember,
+              interfaceMemberOrigin, isInterfaceCheck);
         } else if (declaredMember.kind == ProcedureKind.Setter) {
-          bool seenCovariant = checkSetterOverride(
-              types, declaredMember, interfaceMember, isInterfaceCheck);
+          bool seenCovariant = checkSetterOverride(types, declaredMember,
+              interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
           if (seenCovariant) {
             handleSeenCovariant(
                 types, declaredMember, interfaceMember, isSetter, callback);
@@ -1187,12 +1189,12 @@
               !interfaceMember.isConst) ||
           interfaceMember is Procedure && interfaceMember.isSetter;
       if (declaredMemberHasGetter && interfaceMemberHasGetter) {
-        checkGetterOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
+        checkGetterOverride(types, declaredMember, interfaceMember,
+            interfaceMemberOrigin, isInterfaceCheck);
       }
       if (declaredMemberHasSetter && interfaceMemberHasSetter) {
-        bool seenCovariant = checkSetterOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
+        bool seenCovariant = checkSetterOverride(types, declaredMember,
+            interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
         if (seenCovariant) {
           handleSeenCovariant(
               types, declaredMember, interfaceMember, isSetter, callback);
@@ -1214,6 +1216,7 @@
       Types types,
       Member declaredMember,
       Member interfaceMember,
+      Member interfaceMemberOrigin,
       FunctionNode declaredFunction,
       FunctionNode interfaceFunction,
       bool isInterfaceCheck) {
@@ -1234,15 +1237,15 @@
           templateOverrideTypeVariablesMismatch.withArguments(
               "${declaredMember.enclosingClass.name}."
                   "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
+              "${interfaceMemberOrigin.enclosingClass.name}."
+                  "${interfaceMemberOrigin.name.name}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMember.name.name)
-                .withLocation(_getMemberUri(interfaceMember),
-                    interfaceMember.fileOffset, noLength)
+                .withArguments(interfaceMemberOrigin.name.name)
+                .withLocation(_getMemberUri(interfaceMemberOrigin),
+                    interfaceMemberOrigin.fileOffset, noLength)
           ]);
     } else if (declaredFunction?.typeParameters != null) {
       Map<TypeParameter, DartType> substitutionMap =
@@ -1283,16 +1286,16 @@
                     "${declaredMember.enclosingClass.name}."
                         "${declaredMember.name.name}",
                     computedBound,
-                    "${interfaceMember.enclosingClass.name}."
-                        "${interfaceMember.name.name}",
+                    "${interfaceMemberOrigin.enclosingClass.name}."
+                        "${interfaceMemberOrigin.name.name}",
                     library.isNonNullableByDefault),
                 declaredMember.fileOffset,
                 noLength,
                 context: [
                   templateOverriddenMethodCause
-                      .withArguments(interfaceMember.name.name)
-                      .withLocation(_getMemberUri(interfaceMember),
-                          interfaceMember.fileOffset, noLength)
+                      .withArguments(interfaceMemberOrigin.name.name)
+                      .withLocation(_getMemberUri(interfaceMemberOrigin),
+                          interfaceMemberOrigin.fileOffset, noLength)
                 ]);
           }
         }
@@ -1322,6 +1325,7 @@
       Substitution declaredSubstitution,
       Member declaredMember,
       Member interfaceMember,
+      Member interfaceMemberOrigin,
       DartType declaredType,
       DartType interfaceType,
       bool isCovariant,
@@ -1365,8 +1369,9 @@
       if (isErrorInNnbdOptedOutMode || library.isNonNullableByDefault) {
         String declaredMemberName = '${declaredMember.enclosingClass.name}'
             '.${declaredMember.name.name}';
-        String interfaceMemberName = '${interfaceMember.enclosingClass.name}'
-            '.${interfaceMember.name.name}';
+        String interfaceMemberName =
+            '${interfaceMemberOrigin.enclosingClass.name}'
+            '.${interfaceMemberOrigin.name.name}';
         Message message;
         int fileOffset;
         if (declaredParameter == null) {
@@ -1401,18 +1406,28 @@
             isInterfaceCheck, declaredMember, message, fileOffset, noLength,
             context: [
               templateOverriddenMethodCause
-                  .withArguments(interfaceMember.name.name)
-                  .withLocation(_getMemberUri(interfaceMember),
-                      interfaceMember.fileOffset, noLength)
+                  .withArguments(interfaceMemberOrigin.name.name)
+                  .withLocation(_getMemberUri(interfaceMemberOrigin),
+                      interfaceMemberOrigin.fileOffset, noLength)
             ]);
       }
     }
   }
 
+  /// Checks whether [declaredMember] correctly overrides [interfaceMember].
+  ///
+  /// If an error is reporter [interfaceMemberOrigin] is used as the context
+  /// for where [interfaceMember] was declared, since [interfaceMember] might
+  /// itself be synthesized.
+  ///
   /// Returns whether a covariant parameter was seen and more methods thus have
   /// to be checked.
-  bool checkMethodOverride(Types types, Procedure declaredMember,
-      Procedure interfaceMember, bool isInterfaceCheck) {
+  bool checkMethodOverride(
+      Types types,
+      Procedure declaredMember,
+      Procedure interfaceMember,
+      Member interfaceMemberOrigin,
+      bool isInterfaceCheck) {
     assert(declaredMember.kind == interfaceMember.kind);
     assert(declaredMember.kind == ProcedureKind.Method ||
         declaredMember.kind == ProcedureKind.Operator);
@@ -1424,6 +1439,7 @@
         types,
         declaredMember,
         interfaceMember,
+        interfaceMemberOrigin,
         declaredFunction,
         interfaceFunction,
         isInterfaceCheck);
@@ -1437,6 +1453,7 @@
         declaredSubstitution,
         declaredMember,
         interfaceMember,
+        interfaceMemberOrigin,
         declaredFunction.returnType,
         interfaceFunction.returnType,
         false,
@@ -1505,6 +1522,7 @@
           declaredSubstitution,
           declaredMember,
           interfaceMember,
+          interfaceMemberOrigin,
           declaredParameter.type,
           interfaceParameter.type,
           declaredParameter.isCovariant || interfaceParameter.isCovariant,
@@ -1524,15 +1542,15 @@
           templateOverrideFewerNamedArguments.withArguments(
               "${declaredMember.enclosingClass.name}."
                   "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
+              "${interfaceMemberOrigin.enclosingClass.name}."
+                  "${interfaceMemberOrigin.name.name}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMember.name.name)
-                .withLocation(interfaceMember.fileUri,
-                    interfaceMember.fileOffset, noLength)
+                .withArguments(interfaceMemberOrigin.name.name)
+                .withLocation(interfaceMemberOrigin.fileUri,
+                    interfaceMemberOrigin.fileOffset, noLength)
           ]);
     }
     int compareNamedParameters(VariableDeclaration p0, VariableDeclaration p1) {
@@ -1582,6 +1600,7 @@
           declaredSubstitution,
           declaredMember,
           interfaceMember,
+          interfaceMemberOrigin,
           declaredParameter.type,
           interfaceNamedParameters.current.type,
           declaredParameter.isCovariant,
@@ -1604,9 +1623,9 @@
             noLength,
             context: [
               templateOverriddenMethodCause
-                  .withArguments(interfaceMember.name.name)
-                  .withLocation(_getMemberUri(interfaceMember),
-                      interfaceMember.fileOffset, noLength)
+                  .withArguments(interfaceMemberOrigin.name.name)
+                  .withLocation(_getMemberUri(interfaceMemberOrigin),
+                      interfaceMemberOrigin.fileOffset, noLength)
             ]);
       }
       if (declaredParameter.isCovariant) seenCovariant = true;
@@ -1614,10 +1633,25 @@
     return seenCovariant;
   }
 
-  void checkGetterOverride(Types types, Member declaredMember,
-      Member interfaceMember, bool isInterfaceCheck) {
+  /// Checks whether [declaredMember] correctly overrides [interfaceMember].
+  ///
+  /// If an error is reporter [interfaceMemberOrigin] is used as the context
+  /// for where [interfaceMember] was declared, since [interfaceMember] might
+  /// itself be synthesized.
+  void checkGetterOverride(
+      Types types,
+      Member declaredMember,
+      Member interfaceMember,
+      Member interfaceMemberOrigin,
+      bool isInterfaceCheck) {
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
+        types,
+        declaredMember,
+        interfaceMember,
+        interfaceMemberOrigin,
+        /* declaredFunction = */ null,
+        /* interfaceFunction = */ null,
+        isInterfaceCheck);
     Substitution declaredSubstitution =
         _computeDeclaredSubstitution(types, declaredMember);
     DartType declaredType = declaredMember.getterType;
@@ -1628,19 +1662,36 @@
         declaredSubstitution,
         declaredMember,
         interfaceMember,
+        interfaceMemberOrigin,
         declaredType,
         interfaceType,
-        false,
-        null,
+        /* isCovariant = */ false,
+        /* declaredParameter = */ null,
         isInterfaceCheck);
   }
 
+  /// Checks whether [declaredMember] correctly overrides [interfaceMember].
+  ///
+  /// If an error is reporter [interfaceMemberOrigin] is used as the context
+  /// for where [interfaceMember] was declared, since [interfaceMember] might
+  /// itself be synthesized.
+  ///
   /// Returns whether a covariant parameter was seen and more methods thus have
   /// to be checked.
-  bool checkSetterOverride(Types types, Member declaredMember,
-      Member interfaceMember, bool isInterfaceCheck) {
+  bool checkSetterOverride(
+      Types types,
+      Member declaredMember,
+      Member interfaceMember,
+      Member interfaceMemberOrigin,
+      bool isInterfaceCheck) {
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
+        types,
+        declaredMember,
+        interfaceMember,
+        interfaceMemberOrigin,
+        /* declaredFunction = */ null,
+        /* interfaceFunction = */ null,
+        isInterfaceCheck);
     Substitution declaredSubstitution =
         _computeDeclaredSubstitution(types, declaredMember);
     DartType declaredType = declaredMember.setterType;
@@ -1660,6 +1711,7 @@
         declaredSubstitution,
         declaredMember,
         interfaceMember,
+        interfaceMemberOrigin,
         declaredType,
         interfaceType,
         isCovariant,
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 6df5e4c..be090da 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -1903,7 +1903,9 @@
           isMixinDeclaration ? null : supertype,
           isNamedMixinApplication
               ? interfaces
-              : isMixinDeclaration ? [supertype, mixin] : null,
+              : isMixinDeclaration
+                  ? [supertype, mixin]
+                  : null,
           null, // No `on` clause types.
           new Scope(
               local: <String, MemberBuilder>{},
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 ff8a429..874d7be 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
@@ -511,11 +511,28 @@
 
     // If Q is a legacy type Q0* then the match holds under constraint set C:
     //
-    // Only if P is a subtype match for Q? under constraint set C.
+    // If P is dynamic or void and P is a subtype match for Q0 under constraint
+    // set C.
+    // Or if P is not dynamic or void and P is a subtype match for Q0? under
+    // constraint set C.
     if (_isLegacyTypeConstructorApplication(q)) {
-      return _isNullabilityAwareSubtypeMatch(
-          p, q.withDeclaredNullability(Nullability.nullable),
-          constrainSupertype: constrainSupertype);
+      final int baseConstraintCount = _protoConstraints.length;
+
+      if ((p is DynamicType || p is VoidType) &&
+          _isNullabilityAwareSubtypeMatch(p, _computeRawType(q),
+              constrainSupertype: constrainSupertype)) {
+        return true;
+      }
+      _protoConstraints.length = baseConstraintCount;
+
+      if (p is! DynamicType &&
+          p is! VoidType &&
+          _isNullabilityAwareSubtypeMatch(
+              p, q.withDeclaredNullability(Nullability.nullable),
+              constrainSupertype: constrainSupertype)) {
+        return true;
+      }
+      _protoConstraints.length = baseConstraintCount;
     }
 
     // If Q is FutureOr<Q0> the match holds under constraint set C:
@@ -560,6 +577,8 @@
     // If Q is Q0? the match holds under constraint set C:
     //
     // If P is P0? and P0 is a subtype match for Q0 under constraint set C.
+    // Or if P is dynamic or void and Object is a subtype match for Q0 under
+    // constraint set C.
     // Or if P is a subtype match for Q0 under non-empty constraint set C.
     // Or if P is a subtype match for Null under constraint set C.
     // Or if P is a subtype match for Q0 under empty constraint set C.
@@ -575,6 +594,14 @@
       }
       _protoConstraints.length = baseConstraintCount;
 
+      if ((p is DynamicType || p is VoidType) &&
+          _isNullabilityAwareSubtypeMatch(
+              coreTypes.objectNonNullableRawType, rawQ,
+              constrainSupertype: constrainSupertype)) {
+        return true;
+      }
+      _protoConstraints.length = baseConstraintCount;
+
       bool isMatchWithRawQ = _isNullabilityAwareSubtypeMatch(p, rawQ,
           constrainSupertype: constrainSupertype);
       bool matchWithRawQAddsConstraints =
diff --git a/pkg/front_end/test/incremental_compiler_leak_test.dart b/pkg/front_end/test/incremental_compiler_leak_test.dart
index e8927d1..e526d98 100644
--- a/pkg/front_end/test/incremental_compiler_leak_test.dart
+++ b/pkg/front_end/test/incremental_compiler_leak_test.dart
@@ -36,15 +36,22 @@
         new Map<vmService.ClassRef, vmService.Class>();
 
     Completer<String> cTimeout = new Completer();
-    Timer timer = new Timer(new Duration(minutes: 4), () {
+    Timer timer = new Timer(new Duration(minutes: 6), () {
       cTimeout.complete("Timeout");
       killProcess();
     });
 
     Completer<String> cRunDone = new Completer();
     // ignore: unawaited_futures
-    runInternal(isolateRef, classInfo, instanceCounts,
-        () => cTimeout.isCompleted || cProcessExited.isCompleted).then((value) {
+    runInternal(
+        isolateRef,
+        classInfo,
+        instanceCounts,
+        (int iteration) =>
+            // Subtract 2 as it's logically one ahead and asks _before_ the run.
+            (iteration - 2) > limit ||
+            cTimeout.isCompleted ||
+            cProcessExited.isCompleted).then((value) {
       cRunDone.complete("Done");
     });
 
@@ -54,6 +61,9 @@
     print("\n\n======================\n\n");
 
     findPossibleLeaks(instanceCounts, classInfo);
+
+    // Make sure the process doesn't hang.
+    killProcess();
   }
 
   void findPossibleLeaks(Map<vmService.ClassRef, List<int>> instanceCounts,
@@ -115,11 +125,11 @@
       vmService.IsolateRef isolateRef,
       Map<vmService.ClassRef, vmService.Class> classInfo,
       Map<vmService.ClassRef, List<int>> instanceCounts,
-      bool Function() shouldBail) async {
+      bool Function(int iteration) shouldBail) async {
     int iterationNumber = 1;
     try {
       while (true) {
-        if (shouldBail()) break;
+        if (shouldBail(iterationNumber)) break;
         if (!await waitUntilPaused(isolateRef.id)) break;
         print("\n\n====================\n\nIteration #$iterationNumber");
         iterationNumber++;
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index d047ab7..23b1f6b 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.dart
@@ -30,12 +30,18 @@
 import 'package:testing/testing.dart'
     show Chain, ChainContext, Result, Step, TestDescription, runMe;
 
+import 'testing_utils.dart' show checkEnvironment, getGitFiles;
+
 main([List<String> arguments = const []]) =>
     runMe(arguments, createContext, configurationPath: "../testing.json");
 
 Future<Context> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new Context();
+  const Set<String> knownEnvironmentKeys = {"onlyInGit"};
+  checkEnvironment(environment, knownEnvironmentKeys);
+
+  bool onlyInGit = environment["onlyInGit"] != "false";
+  return new Context(onlyInGit: onlyInGit);
 }
 
 class LintTestDescription extends TestDescription {
@@ -70,6 +76,9 @@
 }
 
 class Context extends ChainContext {
+  final bool onlyInGit;
+  Context({this.onlyInGit});
+
   final List<Step> steps = const <Step>[
     const LintStep(),
   ];
@@ -82,6 +91,11 @@
   }
 
   Stream<LintTestDescription> list(Chain suite) async* {
+    Set<Uri> gitFiles;
+    if (onlyInGit) {
+      gitFiles = await getGitFiles(suite);
+    }
+
     Directory testRoot = new Directory.fromUri(suite.uri);
     if (await testRoot.exists()) {
       Stream<FileSystemEntity> files =
@@ -91,6 +105,7 @@
         String path = entity.uri.path;
         if (suite.exclude.any((RegExp r) => path.contains(r))) continue;
         if (suite.pattern.any((RegExp r) => path.contains(r))) {
+          if (onlyInGit && !gitFiles.contains(entity.uri)) continue;
           Uri root = suite.uri;
           String baseName = "${entity.uri}".substring("$root".length);
           baseName = baseName.substring(0, baseName.length - ".dart".length);
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index e985d0b..519403a 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -188,6 +188,7 @@
 doctype
 doesnt
 dog
+donly
 doo
 downstream
 draw
@@ -429,6 +430,7 @@
 observable
 oh
 okay
+onull
 ooo
 operate
 ops
@@ -535,6 +537,7 @@
 sigwinch
 slight
 smoke
+snull
 somehow
 spans
 spawn
diff --git a/pkg/front_end/test/spelling_test_base.dart b/pkg/front_end/test/spelling_test_base.dart
index 056d0e7..9879c8c 100644
--- a/pkg/front_end/test/spelling_test_base.dart
+++ b/pkg/front_end/test/spelling_test_base.dart
@@ -24,18 +24,21 @@
 import 'package:kernel/kernel.dart';
 
 import 'package:testing/testing.dart'
-    show ChainContext, Result, Step, TestDescription;
+    show Chain, ChainContext, Result, Step, TestDescription;
 
 import 'spell_checking_utils.dart' as spell;
 
+import 'testing_utils.dart' show filterList;
+
 abstract class SpellContext extends ChainContext {
   final List<Step> steps = const <Step>[
     const SpellTest(),
   ];
 
   final bool interactive;
+  final bool onlyInGit;
 
-  SpellContext({this.interactive});
+  SpellContext({this.interactive, this.onlyInGit});
 
   // Override special handling of negative tests.
   @override
@@ -52,6 +55,11 @@
   Set<String> reportedWordsDenylisted = {};
 
   @override
+  Stream<TestDescription> list(Chain suite) {
+    return filterList(suite, onlyInGit, super.list(suite));
+  }
+
+  @override
   Future<void> postRun() {
     if (reportedWordsDenylisted.isNotEmpty) {
       print("\n\n\n");
@@ -152,7 +160,8 @@
           print("");
           print("To add words easily, try to run this script in interactive "
               "mode via the command");
-          print("dart ${Platform.script.toFilePath()} -Dinteractive=true");
+          print("dart ${Platform.script.toFilePath()} "
+              "-DonlyInGit=$onlyInGit -Dinteractive=true");
         }
       }
       print("================");
diff --git a/pkg/front_end/test/spelling_test_external_targets.dart b/pkg/front_end/test/spelling_test_external_targets.dart
index 98faa82..f339a46 100644
--- a/pkg/front_end/test/spelling_test_external_targets.dart
+++ b/pkg/front_end/test/spelling_test_external_targets.dart
@@ -13,17 +13,25 @@
 
 import 'spell_checking_utils.dart' as spell;
 
+import 'testing_utils.dart' show checkEnvironment;
+
 main([List<String> arguments = const []]) =>
     runMe(arguments, createContext, configurationPath: "../testing.json");
 
 Future<SpellContext> createContext(
     Chain suite, Map<String, String> environment) async {
+  const Set<String> knownEnvironmentKeys = {"interactive", "onlyInGit"};
+  checkEnvironment(environment, knownEnvironmentKeys);
+
   bool interactive = environment["interactive"] == "true";
-  return new SpellContextExternal(interactive: interactive);
+  bool onlyInGit = environment["onlyInGit"] != "false";
+  return new SpellContextExternal(
+      interactive: interactive, onlyInGit: onlyInGit);
 }
 
 class SpellContextExternal extends SpellContext {
-  SpellContextExternal({bool interactive}) : super(interactive: interactive);
+  SpellContextExternal({bool interactive, bool onlyInGit})
+      : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
   List<spell.Dictionaries> get dictionaries => const <spell.Dictionaries>[];
diff --git a/pkg/front_end/test/spelling_test_not_src_suite.dart b/pkg/front_end/test/spelling_test_not_src_suite.dart
index 32627a6..28d5262 100644
--- a/pkg/front_end/test/spelling_test_not_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_not_src_suite.dart
@@ -10,17 +10,24 @@
 
 import 'spell_checking_utils.dart' as spell;
 
+import 'testing_utils.dart' show checkEnvironment;
+
 main([List<String> arguments = const []]) =>
     runMe(arguments, createContext, configurationPath: "../testing.json");
 
 Future<SpellContext> createContext(
     Chain suite, Map<String, String> environment) async {
+  const Set<String> knownEnvironmentKeys = {"interactive", "onlyInGit"};
+  checkEnvironment(environment, knownEnvironmentKeys);
+
   bool interactive = environment["interactive"] == "true";
-  return new SpellContextTest(interactive: interactive);
+  bool onlyInGit = environment["onlyInGit"] != "false";
+  return new SpellContextTest(interactive: interactive, onlyInGit: onlyInGit);
 }
 
 class SpellContextTest extends SpellContext {
-  SpellContextTest({bool interactive}) : super(interactive: interactive);
+  SpellContextTest({bool interactive, bool onlyInGit})
+      : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
   List<spell.Dictionaries> get dictionaries => const <spell.Dictionaries>[
diff --git a/pkg/front_end/test/spelling_test_src_suite.dart b/pkg/front_end/test/spelling_test_src_suite.dart
index 3e4f1f5..4fe9568 100644
--- a/pkg/front_end/test/spelling_test_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_src_suite.dart
@@ -10,17 +10,24 @@
 
 import 'spell_checking_utils.dart' as spell;
 
+import 'testing_utils.dart' show checkEnvironment;
+
 main([List<String> arguments = const []]) =>
     runMe(arguments, createContext, configurationPath: "../testing.json");
 
 Future<SpellContext> createContext(
     Chain suite, Map<String, String> environment) async {
+  const Set<String> knownEnvironmentKeys = {"interactive", "onlyInGit"};
+  checkEnvironment(environment, knownEnvironmentKeys);
+
   bool interactive = environment["interactive"] == "true";
-  return new SpellContextSource(interactive: interactive);
+  bool onlyInGit = environment["onlyInGit"] != "false";
+  return new SpellContextSource(interactive: interactive, onlyInGit: onlyInGit);
 }
 
 class SpellContextSource extends SpellContext {
-  SpellContextSource({bool interactive}) : super(interactive: interactive);
+  SpellContextSource({bool interactive, bool onlyInGit})
+      : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
   List<spell.Dictionaries> get dictionaries => const <spell.Dictionaries>[
diff --git a/pkg/front_end/test/testing_utils.dart b/pkg/front_end/test/testing_utils.dart
new file mode 100644
index 0000000..0ab71ff
--- /dev/null
+++ b/pkg/front_end/test/testing_utils.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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' show Directory, Process, ProcessResult;
+
+import 'package:testing/testing.dart' show Chain, TestDescription;
+
+Stream<TestDescription> filterList(
+    Chain suite, bool onlyInGit, Stream<TestDescription> base) async* {
+  Set<Uri> gitFiles;
+  if (onlyInGit) {
+    gitFiles = await getGitFiles(suite);
+  }
+  await for (TestDescription description in base) {
+    if (onlyInGit && !gitFiles.contains(description.uri)) {
+      continue;
+    }
+    yield description;
+  }
+}
+
+Future<Set<Uri>> getGitFiles(Chain suite) async {
+  ProcessResult result = await Process.run("git", ["ls-files", "."],
+      workingDirectory: new Directory.fromUri(suite.uri).absolute.path,
+      runInShell: true);
+  String stdout = result.stdout;
+  return stdout
+      .split(new RegExp('^', multiLine: true))
+      .map((line) => suite.uri.resolve(line.trimRight()))
+      .toSet();
+}
+
+void checkEnvironment(
+    Map<String, String> environment, Set<String> knownEnvironmentKeys) {
+  Set<String> environmentKeys = environment.keys.toSet();
+  environmentKeys.removeAll(knownEnvironmentKeys);
+  if (environmentKeys.isNotEmpty) {
+    throw "Unknown environment(s) given: ${environmentKeys.toList()}.\n"
+        "Knows about ${knownEnvironmentKeys.toList()}";
+  }
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart
new file mode 100644
index 0000000..71068db
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T f<T>(T t) => t;
+
+T g<T>(T? t) => t!;
+
+T h<T extends Object>(T? t) => t!;
+
+foo(dynamic d, void v, Object? onull, Object o, String? snull, String s) {
+  f(d);
+  f(v);
+  f(onull);
+  f(o);
+  f(snull);
+  f(s);
+
+  g(d);
+  g(v);
+  g(onull);
+  g(o);
+  g(snull);
+  g(s);
+
+  h(d);
+  h(v);
+  h(onull);
+  h(o);
+  h(snull);
+  h(s);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.outline.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.outline.expect
new file mode 100644
index 0000000..4238908
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.outline.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  ;
+static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
+  ;
+static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+  ;
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect
new file mode 100644
index 0000000..046b42e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+//   g(v);
+//     ^
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+//   h(v);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
+  return t!;
+static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+  return t!;
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  self::f<dynamic>(d);
+  self::f<void>(v);
+  self::f<core::Object?>(onull);
+  self::f<core::Object>(o);
+  self::f<core::String?>(snull);
+  self::f<core::String>(s);
+  self::g<core::Object>(d);
+  self::g<core::Object>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+  g(v);
+    ^" in v);
+  self::g<core::Object>(onull);
+  self::g<core::Object>(o);
+  self::g<core::String>(snull);
+  self::g<core::String>(s);
+  self::h<core::Object>(d);
+  self::h<core::Object>(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+  h(v);
+    ^" in v);
+  self::h<core::Object>(onull);
+  self::h<core::Object>(o);
+  self::h<core::String>(snull);
+  self::h<core::String>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect
new file mode 100644
index 0000000..046b42e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+//   g(v);
+//     ^
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+//   h(v);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
+  return t!;
+static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+  return t!;
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  self::f<dynamic>(d);
+  self::f<void>(v);
+  self::f<core::Object?>(onull);
+  self::f<core::Object>(o);
+  self::f<core::String?>(snull);
+  self::f<core::String>(s);
+  self::g<core::Object>(d);
+  self::g<core::Object>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+  g(v);
+    ^" in v);
+  self::g<core::Object>(onull);
+  self::g<core::Object>(o);
+  self::g<core::String>(snull);
+  self::g<core::String>(s);
+  self::h<core::Object>(d);
+  self::h<core::Object>(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+  h(v);
+    ^" in v);
+  self::h<core::Object>(onull);
+  self::h<core::Object>(o);
+  self::h<core::String>(snull);
+  self::h<core::String>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.textual_outline.expect
new file mode 100644
index 0000000..51fed79
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+T f<T>(T t) => t;
+T g<T>(T? t) => t!;
+T h<T extends Object>(T? t) => t!;
+foo(dynamic d, void v, Object? onull, Object o, String? snull, String s) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..51fed79
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+T f<T>(T t) => t;
+T g<T>(T? t) => t!;
+T h<T extends Object>(T? t) => t!;
+foo(dynamic d, void v, Object? onull, Object o, String? snull, String s) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect
new file mode 100644
index 0000000..046b42e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+//   g(v);
+//     ^
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+//   h(v);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
+  return t!;
+static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+  return t!;
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  self::f<dynamic>(d);
+  self::f<void>(v);
+  self::f<core::Object?>(onull);
+  self::f<core::Object>(o);
+  self::f<core::String?>(snull);
+  self::f<core::String>(s);
+  self::g<core::Object>(d);
+  self::g<core::Object>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+  g(v);
+    ^" in v);
+  self::g<core::Object>(onull);
+  self::g<core::Object>(o);
+  self::g<core::String>(snull);
+  self::g<core::String>(s);
+  self::h<core::Object>(d);
+  self::h<core::Object>(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+  h(v);
+    ^" in v);
+  self::h<core::Object>(onull);
+  self::h<core::Object>(o);
+  self::h<core::String>(snull);
+  self::h<core::String>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect
new file mode 100644
index 0000000..046b42e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+//   g(v);
+//     ^
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+//   h(v);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
+  return t!;
+static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+  return t!;
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  self::f<dynamic>(d);
+  self::f<void>(v);
+  self::f<core::Object?>(onull);
+  self::f<core::Object>(o);
+  self::f<core::String?>(snull);
+  self::f<core::String>(s);
+  self::g<core::Object>(d);
+  self::g<core::Object>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+  g(v);
+    ^" in v);
+  self::g<core::Object>(onull);
+  self::g<core::Object>(o);
+  self::g<core::String>(snull);
+  self::g<core::String>(s);
+  self::h<core::Object>(d);
+  self::h<core::Object>(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+  h(v);
+    ^" in v);
+  self::h<core::Object>(onull);
+  self::h<core::Object>(o);
+  self::h<core::String>(snull);
+  self::h<core::String>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.expect
index 2571ea6..433878f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart:11:27: Error: The parameter 'cls' of the method 'SubClass.invariant' has type 'SubClass', which does not match the corresponding type, 'Class', in the overridden method, 'Class with Mixin.invariant'.
+// pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart:11:27: Error: The parameter 'cls' of the method 'SubClass.invariant' has type 'SubClass', which does not match the corresponding type, 'Class', in the overridden method, 'Class.invariant'.
 //  - 'SubClass' is from 'pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart'.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in_lib.dart'.
 // Change to a supertype of 'Class', or, for a covariant parameter, a subtype.
 //   void invariant(SubClass cls) {} // error
 //                           ^
-// pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart:9:7: Context: This is the overridden method ('invariant').
-// class SubClass extends Class with Mixin {
-//       ^
+// pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in_lib.dart:9:8: Context: This is the overridden method ('invariant').
+//   void invariant(Class cls);
+//        ^
 //
 import self as self;
 import "covariant_from_opt_in_lib.dart" as cov;
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart
new file mode 100644
index 0000000..0e43b03
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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 './opt_out_lib.dart';
+
+foo(dynamic d, void v, Object? onull, Object o, String? snull, String s) {
+  f(d);
+  f(v);
+  f(onull);
+  f(o);
+  f(snull);
+  f(s);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.textual_outline.expect
new file mode 100644
index 0000000..7188a11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+import './opt_out_lib.dart';
+
+foo(dynamic d, void v, Object? onull, Object o, String? snull, String s) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7188a11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+import './opt_out_lib.dart';
+
+foo(dynamic d, void v, Object? onull, Object o, String? snull, String s) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.expect
new file mode 100644
index 0000000..216a6b7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "opt_out_lib.dart" as opt;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  opt::f<dynamic>(d);
+  opt::f<void>(v);
+  opt::f<core::Object?>(onull);
+  opt::f<core::Object>(o);
+  opt::f<core::String?>(snull);
+  opt::f<core::String>(s);
+}
+static method main() → dynamic {}
+
+library;
+import self as opt;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>(opt::f::T* a) → opt::f::T*
+  return a;
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..216a6b7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "opt_out_lib.dart" as opt;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  opt::f<dynamic>(d);
+  opt::f<void>(v);
+  opt::f<core::Object?>(onull);
+  opt::f<core::Object>(o);
+  opt::f<core::String?>(snull);
+  opt::f<core::String>(s);
+}
+static method main() → dynamic {}
+
+library;
+import self as opt;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>(opt::f::T* a) → opt::f::T*
+  return a;
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/opt_out_lib.dart b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/opt_out_lib.dart
new file mode 100644
index 0000000..1b2aaa8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/opt_out_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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.8
+
+T f<T>(T a) => a;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index bbde631..74ef5a2 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3790,13 +3790,16 @@
 
   factory Arguments.forwarded(FunctionNode function, Library library) {
     return new Arguments(
-        function.positionalParameters.map((p) => new VariableGet(p)).toList(),
+        function.positionalParameters
+            .map<Expression>((p) => new VariableGet(p))
+            .toList(),
         named: function.namedParameters
             .map((p) => new NamedExpression(p.name, new VariableGet(p)))
             .toList(),
         types: function.typeParameters
-            .map((p) => new TypeParameterType.withDefaultNullabilityForLibrary(
-                p, library))
+            .map<DartType>((p) =>
+                new TypeParameterType.withDefaultNullabilityForLibrary(
+                    p, library))
             .toList());
   }
 
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 314803a..f075b34 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -325,7 +325,9 @@
         hierarchy.getDispatchTarget(lookupClass, new Name("noSuchMethod"));
     String methodNameUsed = (isGetter)
         ? "get:$methodName"
-        : (isSetter) ? "set:$methodName=" : methodName;
+        : (isSetter)
+            ? "set:$methodName="
+            : methodName;
     if (noSuchMethod != null &&
         noSuchMethod.function.positionalParameters.length == 1 &&
         noSuchMethod.function.namedParameters.isEmpty) {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 70955b1..6391890 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -85,7 +85,7 @@
 front_end/test/fasta/text_serialization_test: Pass, ExtraSlow
 front_end/test/fasta/types/dart2js_benchmark_test: Pass, Slow
 front_end/test/fasta/types/large_app_benchmark_test: Pass, ExtraSlow
-front_end/test/incremental_compiler_leak_test: Pass, Slow
+front_end/test/incremental_compiler_leak_test: Pass, ExtraSlow
 front_end/test/incremental_dart2js_test: Pass, Slow
 front_end/test/minimal_incremental_kernel_generator_test: Slow, Pass
 front_end/testcases/*: Skip # These are not tests but input for tests.
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 02d1f3e..25709e2 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -678,7 +678,7 @@
       for (var name in testFile.otherResources) {
         var namePath = Path(name);
         var fromPath = testFile.path.directoryPath.join(namePath);
-        File('$tempDir/$name').parent.createSync(recursive: true);
+        File('$tempDir/$name').createSync(recursive: true);
         File(fromPath.toNativePath()).copySync('$tempDir/$name');
       }
     }
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 9ba04b2..8ec1805 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -406,7 +406,9 @@
     //   _fromAddress<Int8>(_loadIntPtr(pointer, offset));
     final loadMethod = isPointer
         ? loadMethods[NativeType.kIntptr]
-        : optimizedTypes.contains(type) ? loadMethods[type] : loadStructMethod;
+        : optimizedTypes.contains(type)
+            ? loadMethods[type]
+            : loadStructMethod;
     Expression getterReturnValue = StaticInvocation(
         loadMethod,
         Arguments([
diff --git a/tests/language/async/await_test.dart b/tests/language/async/await_test.dart
index eca75a8..07c3dad 100644
--- a/tests/language/async/await_test.dart
+++ b/tests/language/async/await_test.dart
@@ -1367,7 +1367,7 @@
 
   group("if", () {
     test("await in test", () {
-      f(v) async {
+      f(bool v) async {
         if (await new Future.value(v)) {
           return 42;
         } else {
@@ -1379,7 +1379,7 @@
     });
 
     test("await err in test", () {
-      f(v) async {
+      f(bool v) async {
         if (await new Future.error("err")) {
           return 42;
         } else {
@@ -1391,7 +1391,7 @@
     });
 
     test("await in then", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return await new Future.value(42);
         }
@@ -1402,7 +1402,7 @@
     });
 
     test("await err in then", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return await new Future.error("err");
         }
@@ -1413,7 +1413,7 @@
     });
 
     test("await in then with else", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return await new Future.value(42);
         } else {
@@ -1426,7 +1426,7 @@
     });
 
     test("await err in then with else", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return await new Future.error("err");
         } else {
@@ -1439,7 +1439,7 @@
     });
 
     test("await in else", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return 37;
         } else {
@@ -1452,7 +1452,7 @@
     });
 
     test("await err in else", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return 37;
         } else {
@@ -1465,7 +1465,7 @@
     });
 
     test("await in else-if test", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return 37;
         } else if (!await new Future.value(v)) {
@@ -1480,7 +1480,7 @@
     });
 
     test("await in else-if then", () {
-      f(v) async {
+      f(bool v) async {
         if (v) {
           return 37;
         } else if (!v) {
@@ -1497,7 +1497,7 @@
 
   group("conditional operator", () {
     test("await in test", () {
-      f(v) async {
+      f(bool v) async {
         return (await new Future.value(v)) ? 42 : 37;
       }
 
@@ -1505,7 +1505,7 @@
     });
 
     test("await err in test", () {
-      f(v) async {
+      f(bool v) async {
         return (await new Future.error("err")) ? 42 : 37;
       }
 
@@ -1513,7 +1513,7 @@
     });
 
     test("await in then", () {
-      f(v) async {
+      f(bool v) async {
         return v ? (await new Future.value(42)) : 37;
       }
 
@@ -1521,7 +1521,7 @@
     });
 
     test("await err in then", () {
-      f(v) async {
+      f(bool v) async {
         return v ? (await new Future.error("err")) : 37;
       }
 
@@ -1529,7 +1529,7 @@
     });
 
     test("await in else", () {
-      f(v) async {
+      f(bool v) async {
         return v ? 37 : (await new Future.value(42));
       }
 
@@ -1537,7 +1537,7 @@
     });
 
     test("await err in else", () {
-      f(v) async {
+      f(bool v) async {
         return v ? 37 : (await new Future.error("err"));
       }
 
diff --git a/tests/language/function/call_generic_test.dart b/tests/language/function/call_generic_test.dart
index de3b0bd..19ea8ba 100644
--- a/tests/language/function/call_generic_test.dart
+++ b/tests/language/function/call_generic_test.dart
@@ -35,7 +35,7 @@
 }
 
 main() {
-  check([dynamic, 1, 2, 3, null, null], staticFn(1 as dynamic, 2, 3));
+  check([Object, 1, 2, 3, null, null], staticFn(1 as dynamic, 2, 3));
 
   check([Object, 'Z', 2, 4, null, null], staticFn('Z', 2, 4));
 
@@ -53,13 +53,13 @@
 
   var c = new C();
 
-  check([dynamic, 8, 2, 3, null, null], c.memberFn(8 as dynamic, 2, 3));
+  check([Object, 8, 2, 3, null, null], c.memberFn(8 as dynamic, 2, 3));
 
   check([Object, 'A', 2, 3, null, null], c.memberFn('A', 2, 3));
 
   check([int, 9, 2, 3, null, null], c.memberFn<int>(9, 2, 3));
 
-  check([dynamic, 10, 2, 3, null, null], c.map(10 as dynamic, 2, 3));
+  check([Object, 10, 2, 3, null, null], c.map(10 as dynamic, 2, 3));
 
   check([Object, 'B', 2, 3, null, null], c.map('B', 2, 3));
 
diff --git a/tests/language/inference/dynamic_nullable_test.dart b/tests/language/inference/dynamic_nullable_test.dart
index 6bcb121..46b6591 100644
--- a/tests/language/inference/dynamic_nullable_test.dart
+++ b/tests/language/inference/dynamic_nullable_test.dart
@@ -55,7 +55,7 @@
 
     var c = C.list(o);
     var f = bar(o);
-    var l = o.whereNotNull;
+    var l = o.whereNotNull();
 
     c.expectStaticType<Exactly<C<Object>>>();
     Expect.type<C<Object>>(c); // Run-time type is subtype of C<Object>.
diff --git a/tools/VERSION b/tools/VERSION
index 66e08aa..6597a0f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 134
+PRERELEASE 135
 PRERELEASE_PATCH 0
\ No newline at end of file
