diff --git a/DEPS b/DEPS
index 8b3cb84..c7b269e 100644
--- a/DEPS
+++ b/DEPS
@@ -108,7 +108,7 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164.
   "dart_style_rev": "d7b73536a8079331c888b7da539b80e6825270ea", # manually rev'd
 
-  "dartdoc_rev": "ff89da1c9831c81834977d3d67cf6f2462ee4936",
+  "dartdoc_rev": "e6c8861ad3559a6dd61066a12bb81310ce131ae5",
   "devtools_rev": "95d292626da26505b02417735f77e8922783b477",
   "ffi_rev": "18b2b549d55009ff594600b04705ff6161681e07",
   "file_rev": "0132eeedea2933513bf230513a766a8baeab0c4f",
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index d4c3681..40fdf76 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -46,15 +46,15 @@
   /// This is usually the default value, but can be overridden via
   /// initializationOptions (used for tests, but may also be useful for
   /// debugging).
-  late final CompletionBudget completionBudget;
+  late final Duration completionBudgetDuration;
 
   CompletionHandler(super.server, LspInitializationOptions options)
       : suggestFromUnimportedLibraries = options.suggestFromUnimportedLibraries,
         previewNotImportedCompletions = options.previewNotImportedCompletions {
     final budgetMs = options.completionBudgetMilliseconds;
-    completionBudget = CompletionBudget(budgetMs != null
+    completionBudgetDuration = budgetMs != null
         ? Duration(milliseconds: budgetMs)
-        : CompletionBudget.defaultDuration);
+        : CompletionBudget.defaultDuration;
   }
 
   @override
@@ -356,7 +356,7 @@
       final serverSuggestions2 =
           await performance.runAsync('computeSuggestions', (performance) async {
         var contributor = DartCompletionManager(
-          budget: completionBudget,
+          budget: CompletionBudget(completionBudgetDuration),
           includedElementKinds: includedElementKinds,
           includedElementNames: includedElementNames,
           includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_default_value.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_default_value.dart
new file mode 100644
index 0000000..cf766e4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_default_value.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveDefaultValue extends CorrectionProducer {
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedInBulk => false;
+
+  @override
+  // Not predictably the correct action.
+  bool get canBeAppliedToFile => false;
+
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_DEFAULT_VALUE;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    var defaultFormalParameter =
+        node.thisOrAncestorOfType<DefaultFormalParameter>();
+    if (defaultFormalParameter is! DefaultFormalParameter) return;
+    var separator = defaultFormalParameter.separator;
+    if (separator == null) return;
+    var defaultValue = defaultFormalParameter.defaultValue;
+    if (defaultValue == null) return;
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addDeletion(
+          range.endStart(separator.previous!, defaultValue.endToken.next!));
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index ec29617..74cce40 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -914,6 +914,11 @@
     DartFixKindPriority.DEFAULT,
     'Remove dead code',
   );
+  static const REMOVE_DEFAULT_VALUE = FixKind(
+    'dart.fix.remove.defaultValue',
+    DartFixKindPriority.DEFAULT,
+    "Remove the default value",
+  );
   static const REMOVE_DEPRECATED_NEW_IN_COMMENT_REFERENCE = FixKind(
     'dart.fix.remove.deprecatedNewInCommentReference',
     DartFixKindPriority.DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 57a79eb..0d781fb 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -116,6 +116,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_constructor_name.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_code.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_default_value.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_deprecated_new_in_comment_reference.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_duplicate_case.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_catch.dart';
@@ -914,6 +915,7 @@
       ReplaceWithFilled.new,
     ],
     CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER: [
+      RemoveDefaultValue.new,
       RemoveRequired.new,
     ],
     CompileTimeErrorCode.ENUM_WITH_ABSTRACT_MEMBER: [
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_default_value_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_default_value_test.dart
new file mode 100644
index 0000000..22d6d24
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_default_value_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveDefaultValueTest);
+  });
+}
+
+@reflectiveTest
+class RemoveDefaultValueTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_DEFAULT_VALUE;
+
+  Future<void> test_default_value_on_required_parameter() async {
+    await resolveTestCode('''
+class A {
+  int i;
+  A({required this.i = 1});
+}
+''');
+    await assertHasFix('''
+class A {
+  int i;
+  A({required this.i});
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 688c987..71a3037 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -141,6 +141,7 @@
 import 'remove_const_test.dart' as remove_const;
 import 'remove_constructor_name_test.dart' as remove_constructor_name;
 import 'remove_dead_code_test.dart' as remove_dead_code;
+import 'remove_default_value_test.dart' as remove_default_value;
 import 'remove_deprecated_new_in_comment_reference_test.dart'
     as remove_deprecated_new_in_comment_reference;
 import 'remove_duplicate_case_test.dart' as remove_duplicate_case;
@@ -361,6 +362,7 @@
     remove_const.main();
     remove_constructor_name.main();
     remove_dead_code.main();
+    remove_default_value.main();
     remove_deprecated_new_in_comment_reference.main();
     remove_duplicate_case.main();
     remove_empty_catch.main();
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 1b1265e..c0781e9 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -4,6 +4,7 @@
 * Deprecated `LibraryElement.exports`, use `libraryexports` instead.
 * Deprecated `LibraryElement.imports`, use `libraryImports` instead.
 * Deprecated `Element.enclosingElement`, use `enclosingElement2` instead.
+* `Member` is not equal to `ElementImpl`, use `Element.declaration`.
 
 ## 4.2.0
 * Update SDK constraints to `>=2.17.0 <3.0.0`.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index b14447a..4eb024d 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1626,7 +1626,7 @@
   CompilationUnitElement get definingCompilationUnit;
 
   /// Return a list containing all of the exports defined in this library.
-  @Deprecated('Use exports2 instead')
+  @Deprecated('Use libraryExports instead')
   List<ExportElement> get exports;
 
   /// The set of features available to this library.
@@ -1637,7 +1637,7 @@
   FeatureSet get featureSet;
 
   /// Return a list containing all of the imports defined in this library.
-  @Deprecated('Use imports2 instead')
+  @Deprecated('Use libraryImports instead')
   List<ImportElement> get imports;
 
   bool get isNonNullableByDefault;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 471c997..e37b820 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2569,7 +2569,9 @@
     if (identical(this, other)) {
       return true;
     }
-    return other is Element && other.kind == kind && other.location == location;
+    return other is ElementImpl &&
+        other.kind == kind &&
+        other.location == location;
   }
 
   /// Append a textual representation of this element to the given [builder].
@@ -4020,14 +4022,6 @@
     _exportNamespace = exportNamespace;
   }
 
-  @Deprecated('Use exports2 instead')
-  @override
-  List<ExportElement> get exports {
-    return libraryExports
-        .map((e) => ExportElementImpl(e as LibraryExportElementImpl))
-        .toList();
-  }
-
   bool get hasPartOfDirective {
     return hasModifier(Modifier.HAS_PART_OF_DIRECTIVE);
   }
@@ -4048,14 +4042,6 @@
         .toList();
   }
 
-  @Deprecated('Use imports2 instead')
-  @override
-  List<ImportElement> get imports {
-    return libraryImports
-        .map((e) => ImportElementImpl(e as LibraryImportElementImpl))
-        .toList();
-  }
-
   @override
   bool get isBrowserApplication =>
       entryPoint != null && isOrImportsBrowserLibrary;
@@ -4571,7 +4557,7 @@
     return _definingCompilationUnit;
   }
 
-  @Deprecated('Use exports2 instead')
+  @Deprecated('Use libraryExports instead')
   @override
   List<ExportElement> get exports {
     return libraryExports
@@ -4586,7 +4572,7 @@
   @override
   String get identifier => '${_definingCompilationUnit.source.uri}';
 
-  @Deprecated('Use imports2 instead')
+  @Deprecated('Use libraryImports instead')
   @override
   List<ImportElement> get imports {
     return libraryImports
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 66afde0..549c43b 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -579,18 +579,26 @@
     if (identifiers == null) {
       return;
     }
+
+    /// When an element is used, it might be converted into a `Member`,
+    /// to apply substitution, or turn it into legacy. But using something
+    /// is purely declaration based.
+    bool hasElement(SimpleIdentifier identifier, Element element) {
+      return identifier.staticElement?.declaration == element.declaration;
+    }
+
     int length = identifiers.length;
     for (int i = 0; i < length; i++) {
-      Identifier identifier = identifiers[i];
+      var identifier = identifiers[i];
       if (element is PropertyAccessorElement) {
         // If the getter or setter of a variable is used, then the variable (the
         // shown name) is used.
-        if (identifier.staticElement == element.variable) {
+        if (hasElement(identifier, element.variable)) {
           identifiers.remove(identifier);
           break;
         }
       } else {
-        if (identifier.staticElement == element) {
+        if (hasElement(identifier, element)) {
           identifiers.remove(identifier);
           break;
         }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 9467514..b4242a8 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -559,6 +559,7 @@
       nameOffset: -1, // TODO(scheglov) implement, test
     );
     augmentation.definingCompilationUnit = definingUnit;
+    augmentation.reference = definingUnit.reference!;
 
     final resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
     _readLibraryOrAugmentationElement(augmentation);
@@ -988,7 +989,9 @@
     final uri = _readDirectiveUri(
       container: container,
     );
-    final prefix = _readImportElementPrefix();
+    final prefix = _readImportElementPrefix(
+      container: container,
+    );
     final combinators = _reader.readTypedList(_readNamespaceCombinator);
 
     final element = LibraryImportElementImpl(
@@ -1000,9 +1003,13 @@
     return element;
   }
 
-  ImportElementPrefixImpl? _readImportElementPrefix() {
+  ImportElementPrefixImpl? _readImportElementPrefix({
+    required LibraryOrAugmentationElementImpl container,
+  }) {
     PrefixElementImpl buildElement(String name) {
-      final reference = _reference.getChild('@prefix').getChild(name);
+      // TODO(scheglov) Make reference required.
+      final containerRef = container.reference!;
+      final reference = containerRef.getChild('@prefix').getChild(name);
       final existing = reference.element;
       if (existing is PrefixElementImpl) {
         return existing;
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 690daa8..b18aafb 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -159,7 +159,7 @@
   void buildElements() {
     _buildDirectives(
       kind: kind,
-      element: element,
+      container: element,
     );
 
     for (var linkingUnit in units) {
@@ -467,10 +467,11 @@
           nameOffset: importedAugmentation.unlinked.libraryKeywordOffset,
         );
         augmentation.definingCompilationUnit = unitElement;
+        augmentation.reference = unitElement.reference!;
 
         _buildDirectives(
           kind: importedAugmentation,
-          element: augmentation,
+          container: augmentation,
         );
 
         uri = DirectiveUriWithAugmentationImpl(
@@ -537,13 +538,18 @@
   /// augmentations.
   void _buildDirectives({
     required LibraryOrAugmentationFileKind kind,
-    required LibraryOrAugmentationElementImpl element,
+    required LibraryOrAugmentationElementImpl container,
   }) {
-    element.libraryExports = kind.libraryExports.map(_buildExport).toList();
-    element.libraryImports = kind.libraryImports.map(_buildImport).toList();
+    container.libraryExports = kind.libraryExports.map(_buildExport).toList();
+    container.libraryImports = kind.libraryImports.map((state) {
+      return _buildImport(
+        container: container,
+        state: state,
+      );
+    }).toList();
 
-    element.augmentationImports = kind.augmentationImports.map((state) {
-      return _buildAugmentationImport(element, state);
+    container.augmentationImports = kind.augmentationImports.map((state) {
+      return _buildAugmentationImport(container, state);
     }).toList();
   }
 
@@ -614,21 +620,23 @@
     )..combinators = combinators;
   }
 
-  LibraryImportElementImpl _buildImport(LibraryImportState state) {
+  LibraryImportElementImpl _buildImport({
+    required LibraryOrAugmentationElementImpl container,
+    required LibraryImportState state,
+  }) {
     final importPrefix = state.unlinked.prefix.mapOrNull((unlinked) {
+      final prefix = _buildPrefix(
+        name: unlinked.name,
+        nameOffset: unlinked.nameOffset,
+        container: container,
+      );
       if (unlinked.deferredOffset != null) {
         return DeferredImportElementPrefixImpl(
-          element: _buildPrefix(
-            name: unlinked.name,
-            nameOffset: unlinked.nameOffset,
-          ),
+          element: prefix,
         );
       } else {
         return ImportElementPrefixImpl(
-          element: _buildPrefix(
-            name: unlinked.name,
-            nameOffset: unlinked.nameOffset,
-          ),
+          element: prefix,
         );
       }
     });
@@ -705,8 +713,11 @@
   PrefixElementImpl _buildPrefix({
     required String name,
     required int nameOffset,
+    required LibraryOrAugmentationElementImpl container,
   }) {
-    final reference = this.reference.getChild('@prefix').getChild(name);
+    // TODO(scheglov) Make reference required.
+    final containerRef = container.reference!;
+    final reference = containerRef.getChild('@prefix').getChild(name);
     final existing = reference.element;
     if (existing is PrefixElementImpl) {
       return existing;
@@ -716,7 +727,7 @@
         nameOffset,
         reference: reference,
       );
-      element.encloseElement(result);
+      container.encloseElement(result);
       return result;
     }
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 3a0d6d5..061e109 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -2230,7 +2230,13 @@
 
       var constructorName = creation.constructorName;
       expect(constructorName.name, isNull);
-      expect(constructorName.staticElement, defaultConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          defaultConstructor,
+          substitution: {'T': 'int'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments, isNull);
@@ -2258,9 +2264,21 @@
       expect(creation.staticType, cTypeDouble);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name!.staticElement, namedConstructor);
+      assertElement(
+        constructorName.name!.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'dynamic'},
+        ),
+      );
       expect(constructorName.name!.staticType, isNull);
-      expect(constructorName.staticElement, namedConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'double'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments, isNull);
@@ -2288,9 +2306,21 @@
       expect(creation.staticType, cTypeBool);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name!.staticElement, namedConstructor);
+      assertElement(
+        constructorName.name!.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'bool'},
+        ),
+      );
       expect(constructorName.name!.staticType, isNull);
-      expect(constructorName.staticElement, namedConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'bool'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments!.arguments, hasLength(1));
@@ -2345,7 +2375,13 @@
 
       var constructorName = creation.constructorName;
       expect(constructorName.name, isNull);
-      expect(constructorName.staticElement, defaultConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          defaultConstructor,
+          substitution: {'T': 'int'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments, isNull);
@@ -2367,7 +2403,13 @@
 
       var constructorName = creation.constructorName;
       expect(constructorName.name, isNull);
-      expect(constructorName.staticElement, defaultConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          defaultConstructor,
+          substitution: {'T': 'bool'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments!.arguments, hasLength(1));
@@ -2390,9 +2432,21 @@
       expect(creation.staticType, cTypeDouble);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name!.staticElement, namedConstructor);
+      assertElement(
+        constructorName.name!.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'dynamic'},
+        ),
+      );
       expect(constructorName.name!.staticType, isNull);
-      expect(constructorName.staticElement, namedConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'double'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments, isNull);
@@ -2413,9 +2467,21 @@
       expect(creation.staticType, cTypeBool);
 
       var constructorName = creation.constructorName;
-      expect(constructorName.name!.staticElement, namedConstructor);
+      assertElement(
+        constructorName.name!.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'bool'},
+        ),
+      );
       expect(constructorName.name!.staticType, isNull);
-      expect(constructorName.staticElement, namedConstructor);
+      assertElement(
+        constructorName.staticElement,
+        elementMatcher(
+          namedConstructor,
+          substitution: {'T': 'bool'},
+        ),
+      );
 
       NamedType namedType = constructorName.type;
       expect(namedType.typeArguments!.arguments, hasLength(1));
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 3fa8eab..0d394cc 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -23,6 +23,7 @@
     defineReflectiveTests(FieldElementImplTest);
     defineReflectiveTests(FunctionTypeImplTest);
     defineReflectiveTests(InterfaceTypeImplTest);
+    defineReflectiveTests(MethodElementImplTest);
     defineReflectiveTests(TypeParameterTypeImplTest);
     defineReflectiveTests(VoidTypeImplTest);
     defineReflectiveTests(ClassElementImplTest);
@@ -1241,6 +1242,30 @@
 }
 
 @reflectiveTest
+class MethodElementImplTest extends AbstractTypeSystemTest {
+  void test_equal() {
+    var foo = method('foo', intNone);
+    var T = typeParameter('T');
+    var A = class_(
+      name: 'A',
+      typeParameters: [T],
+      methods: [foo],
+    );
+
+    // MethodElementImpl is equal to itself.
+    expect(foo == foo, isTrue);
+
+    // MethodMember is not equal to MethodElementImpl.
+    var foo_int = A.instantiate(
+      typeArguments: [intNone],
+      nullabilitySuffix: NullabilitySuffix.none,
+    ).getMethod('foo')!;
+    expect(foo == foo_int, isFalse);
+    expect(foo_int == foo, isFalse);
+  }
+}
+
+@reflectiveTest
 class TopLevelVariableElementImplTest extends PubPackageResolutionTest {
   test_computeConstantValue() async {
     newFile('$testPackageLibPath/a.dart', r'''
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index c80647b..3d18ac2 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -300,7 +300,7 @@
 ''');
   }
 
-  test_augmentation_importScope_constant_field() async {
+  test_augmentation_importScope_constant_class_field() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {
   static const a = 0;
@@ -395,6 +395,89 @@
 ''');
   }
 
+  test_augmentation_importScope_constant_prefix_class_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static const a = 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+library augment 'test.dart';
+import 'a.dart' as prefix;
+const b = prefix.A.a;
+''');
+
+    final library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  augmentationImports
+    package:test/b.dart
+      imports
+        package:test/a.dart as prefix @48
+      definingUnit
+        topLevelVariables
+          static const b @62
+            type: int
+            constantInitializer
+              PropertyAccess
+                target: PrefixedIdentifier
+                  prefix: SimpleIdentifier
+                    token: prefix @66
+                    staticElement: self::@augmentation::package:test/b.dart::@prefix::prefix
+                    staticType: null
+                  period: . @72
+                  identifier: SimpleIdentifier
+                    token: A @73
+                    staticElement: package:test/a.dart::@class::A
+                    staticType: null
+                  staticElement: package:test/a.dart::@class::A
+                  staticType: null
+                operator: . @74
+                propertyName: SimpleIdentifier
+                  token: a @75
+                  staticElement: package:test/a.dart::@class::A::@getter::a
+                  staticType: int
+                staticType: int
+        accessors
+          synthetic static get b @-1
+            returnType: int
+  definingUnit
+''');
+  }
+
+  test_augmentation_importScope_prefixed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+library augment 'test.dart';
+import 'a.dart' as prefix;
+prefix.A f() {}
+''');
+
+    final library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  augmentationImports
+    package:test/b.dart
+      imports
+        package:test/a.dart as prefix @48
+      definingUnit
+        functions
+          f @65
+            returnType: A
+  definingUnit
+''');
+  }
+
   test_augmentation_importScope_topInference() async {
     newFile('$testPackageLibPath/a.dart', r'''
 final a = 0;
diff --git a/pkg/compiler/lib/compiler_api.dart b/pkg/compiler/lib/compiler_api.dart
index 893b07e..bb73103 100644
--- a/pkg/compiler/lib/compiler_api.dart
+++ b/pkg/compiler/lib/compiler_api.dart
@@ -108,6 +108,20 @@
   /// is expected to hold a zero element at the last position. If this is not
   /// the case, the entire data structure is copied before scanning.
   Future<Input> readFromUri(Uri uri, {InputKind inputKind = InputKind.UTF8});
+
+  /// Register that [uri] should be an `InputKind.UTF8` input with the
+  /// given [source] as its zero-terminated list of contents.
+  ///
+  /// If [uri] was read prior to this call, this registration has no effect,
+  /// otherwise it is expected that a future [readFromUri] will return the
+  /// contents provided here.
+  ///
+  /// The main purpose of this API is to assist in error reporting when
+  /// compiling from kernel binary files. Binary files embed the contents
+  /// of source files that may not be available on disk. By using these
+  /// registered contents, dart2js will be able to provide accurate line/column
+  /// information on an error.
+  void registerUtf8ContentsForDiagnostics(Uri uri, List<int> source);
 }
 
 /// Output types used in `CompilerOutput.createOutputSink`.
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index bb3680f..7765e59 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -1085,7 +1085,6 @@
     return result;
   }
 
-  diagnosticHandler.autoReadFileUri = true;
   CompilerOptions compilerOptions = CompilerOptions.parse(options,
       featureOptions: features,
       librariesSpecificationUri: librariesSpecificationUri,
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 4eb1c89..25a334b 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -104,11 +104,11 @@
   /// [FeatureOption]s which default to enabled.
   late final List<FeatureOption> shipping = [
     useContentSecurityPolicy,
+    deferredSerialization,
   ];
 
   /// [FeatureOption]s which default to disabled.
   late final List<FeatureOption> canary = [
-    deferredSerialization,
     writeUtf8,
     newDumpInfo,
     simpleAsyncToFuture,
diff --git a/pkg/compiler/lib/src/phase/load_kernel.dart b/pkg/compiler/lib/src/phase/load_kernel.dart
index de39f19..6145d84 100644
--- a/pkg/compiler/lib/src/phase/load_kernel.dart
+++ b/pkg/compiler/lib/src/phase/load_kernel.dart
@@ -196,6 +196,8 @@
   if (options.cfeOnly) {
     _doGlobalTransforms(component);
   }
+
+  registerSources(component, compilerInput);
   return _LoadFromKernelResult(component, entryLibrary, moduleLibraries);
 }
 
@@ -287,6 +289,7 @@
   if (isModularCompile) {
     component?.computeCanonicalNames();
   }
+  registerSources(component, compilerInput);
   return _LoadFromSourceResult(
       component, initializedCompilerState, isModularCompile ? sources : []);
 }
@@ -394,3 +397,16 @@
   return _createOutput(options, reporter, entryLibrary, component,
       moduleLibraries, initializedCompilerState);
 }
+
+/// Registers with the dart2js compiler all sources embeded in a kernel
+/// component. This may include sources that were read from disk directly as
+/// files, but also sources that were embedded in binary `.dill` files (like the
+/// platform kernel file and kernel files from modular compilation pipelines).
+///
+/// This registration improves how locations are presented when errors
+/// or crashes are reported by the dart2js compiler.
+void registerSources(ir.Component? component, api.CompilerInput compilerInput) {
+  component?.uriToSource.forEach((uri, source) {
+    compilerInput.registerUtf8ContentsForDiagnostics(uri, source.source);
+  });
+}
diff --git a/pkg/compiler/lib/src/serialization/indexed_sink_source.dart b/pkg/compiler/lib/src/serialization/indexed_sink_source.dart
index ec54310..b341713 100644
--- a/pkg/compiler/lib/src/serialization/indexed_sink_source.dart
+++ b/pkg/compiler/lib/src/serialization/indexed_sink_source.dart
@@ -18,8 +18,6 @@
   void write(E value, void writeValue(E value));
 }
 
-const int _defaultStartOffset = 1;
-
 /// Data sink helper that canonicalizes [E?] values using IDs.
 ///
 /// Writes a unique ID in place of previously visited indexable values. This
@@ -39,7 +37,7 @@
       {Map<E?, int>? cache, int? startOffset})
       : // [cache] slot 1 is pre-allocated to `null`.
         this._cache = cache ?? {null: 1},
-        this._startOffset = startOffset ?? _defaultStartOffset;
+        this._startOffset = startOffset ?? 0;
 
   /// Write a reference to [value] to the data sink.
   ///
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index ee9dea5..8813a7f 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -29,15 +29,7 @@
     if (!resourceUri.isAbsolute) {
       resourceUri = cwd.resolveUri(resourceUri);
     }
-    api.Input<List<int>> input;
-    switch (inputKind) {
-      case api.InputKind.UTF8:
-        input = utf8SourceFiles[resourceUri];
-        break;
-      case api.InputKind.binary:
-        input = binarySourceFiles[resourceUri];
-        break;
-    }
+    api.Input<List<int>> input = _loadInputFromCache(resourceUri, inputKind);
     if (input != null) return Future.value(input);
 
     if (resourceUri.isScheme('file')) {
@@ -49,6 +41,52 @@
     }
   }
 
+  /// Fetches any existing value of [resourceUri] in a cache.
+  ///
+  /// For `api.InputKind.UTF8` inputs, this looks up both the cache of
+  /// utf8 source files and binary source files. This is done today because of
+  /// how dart2js binds to the CFE's file system. While dart2js reads sources as
+  /// utf8, the CFE file system may read them as binary inputs. In case the CFE
+  /// needs to report errors, dart2js will only find the location data if it
+  /// checks both caches.
+  api.Input<List<int>> _loadInputFromCache(
+      Uri resourceUri, api.InputKind inputKind) {
+    switch (inputKind) {
+      case api.InputKind.UTF8:
+        var input = utf8SourceFiles[resourceUri];
+        if (input != null) return input;
+        input = binarySourceFiles[resourceUri];
+        if (input == null) return null;
+        return _storeSourceInCache(resourceUri, input.data, api.InputKind.UTF8);
+      case api.InputKind.binary:
+        return binarySourceFiles[resourceUri];
+    }
+    return null;
+  }
+
+  /// Adds [source] to the cache under the [resourceUri] key.
+  api.Input _storeSourceInCache(
+      Uri resourceUri, List<int> source, api.InputKind inputKind) {
+    switch (inputKind) {
+      case api.InputKind.UTF8:
+        return utf8SourceFiles[resourceUri] = CachingUtf8BytesSourceFile(
+            resourceUri, relativizeUri(resourceUri), source);
+      case api.InputKind.binary:
+        return binarySourceFiles[resourceUri] = Binary(resourceUri, source);
+    }
+    return null;
+  }
+
+  @override
+  void registerUtf8ContentsForDiagnostics(Uri resourceUri, List<int> source) {
+    if (!resourceUri.isAbsolute) {
+      resourceUri = cwd.resolveUri(resourceUri);
+    }
+    if (!utf8SourceFiles.containsKey(resourceUri)) {
+      _storeSourceInCache(resourceUri, source, api.InputKind.UTF8);
+    }
+  }
+
   api.Input _readFromFileSync(Uri resourceUri, api.InputKind inputKind) {
     assert(resourceUri.isScheme('file'));
     List<int> source;
@@ -61,29 +99,19 @@
       throw "Error reading '${relativizeUri(resourceUri)}' $detail";
     }
     dartCharactersRead += source.length;
-    api.Input input;
-    switch (inputKind) {
-      case api.InputKind.UTF8:
-        input = utf8SourceFiles[resourceUri] = CachingUtf8BytesSourceFile(
-            resourceUri, relativizeUri(resourceUri), source);
-        break;
-      case api.InputKind.binary:
-        input = binarySourceFiles[resourceUri] = Binary(resourceUri, source);
-        break;
-    }
-    return input;
+    return _storeSourceInCache(resourceUri, source, inputKind);
   }
 
   /// Read [resourceUri] directly as a UTF-8 file. If reading fails, `null` is
   /// returned.
-  api.Input autoReadFromFile(Uri resourceUri) {
+  api.Input readUtf8FromFileSyncForTesting(Uri resourceUri) {
     try {
       return _readFromFileSync(resourceUri, api.InputKind.UTF8);
     } catch (e) {
       // Silence the error. The [resourceUri] was not requested by the user and
       // was only needed to give better error messages.
+      return null;
     }
-    return null;
   }
 
   Future<api.Input<List<int>>> _readFromFile(
@@ -139,11 +167,14 @@
   relativizeUri(Uri uri) => fe.relativizeUri(cwd, uri, isWindows);
 
   SourceFile<List<int>> getUtf8SourceFile(Uri resourceUri) {
-    return utf8SourceFiles[resourceUri];
+    return _loadInputFromCache(resourceUri, api.InputKind.UTF8);
   }
 
   Iterable<Uri> getSourceUris() {
     Set<Uri> uris = Set<Uri>();
+    // Note: this includes also indirect sources that were used to create
+    // `.dill` inputs to the compiler. This is OK, since this API is only
+    // used to calculate DEPS for gn build systems.
     uris.addAll(utf8SourceFiles.keys);
     uris.addAll(binarySourceFiles.keys);
     return uris;
@@ -179,7 +210,6 @@
   bool isAborting = false;
   bool enableColors = false;
   bool throwOnError = false;
-  bool autoReadFileUri = false;
   int throwOnErrorCount = 0;
   api.Diagnostic lastKind = null;
   int fatalCount = 0;
@@ -265,17 +295,6 @@
       print('${color(message)}');
     } else {
       api.Input file = provider.getUtf8SourceFile(uri);
-      if (file == null &&
-          autoReadFileUri &&
-          (uri.isScheme('file') || !uri.isAbsolute) &&
-          uri.path.endsWith('.dart')) {
-        if (!uri.isAbsolute) {
-          uri = provider.cwd.resolveUri(uri);
-        }
-        // When reading from .dill files, the original source files haven't been
-        // loaded. Load the file if possible to provide a better error message.
-        file = provider.autoReadFromFile(uri);
-      }
       if (file is SourceFile) {
         print(file.getLocationMessage(color(message), begin, end,
             colorize: color));
@@ -574,21 +593,6 @@
     }
     return result;
   }
-
-  @override
-  api.Input autoReadFromFile(Uri resourceUri) {
-    var path = resourceUri.path;
-    if (path.startsWith('/bazel-root')) {
-      path = path.substring('/bazel-root/'.length);
-      for (var dir in dirs) {
-        var file = dir.resolve(path);
-        if (File.fromUri(file).existsSync()) {
-          return super.autoReadFromFile(file);
-        }
-      }
-    }
-    return null;
-  }
 }
 
 /// Adapter to support one or more synthetic uri schemes.
@@ -635,18 +639,4 @@
     }
     return result;
   }
-
-  @override
-  api.Input autoReadFromFile(Uri resourceUri) {
-    if (resourceUri.isScheme(markerScheme)) {
-      var path = resourceUri.path;
-      for (var dir in roots) {
-        var file = dir.resolve(path);
-        if (File.fromUri(file).existsSync()) {
-          return super.autoReadFromFile(file);
-        }
-      }
-    }
-    return null;
-  }
 }
diff --git a/pkg/compiler/test/dump_info/data/deferred/main.dart b/pkg/compiler/test/dump_info/data/deferred/main.dart
index 95af0bd..b562e90 100644
--- a/pkg/compiler/test/dump_info/data/deferred/main.dart
+++ b/pkg/compiler/test/dump_info/data/deferred/main.dart
@@ -4,7 +4,122 @@
 
 // @dart = 2.7
 
-/*library: 
+/*spec.library: 
+ constant=[
+  {
+  "id": "constant/B.C_Deferred = A.lib__funky$closure();\n",
+  "kind": "constant",
+  "name": "",
+  "size": 39,
+  "outputUnit": "outputUnit/1",
+  "code": "B.C_Deferred = A.lib__funky$closure();\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": "",
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.C__RootZone = new A._RootZone();\n",
+  "kind": "constant",
+  "name": "",
+  "size": 35,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__RootZone = new A._RootZone();\n"
+},
+  {
+  "id": "constant/B.C__StringStackTrace = new A._StringStackTrace();\n",
+  "kind": "constant",
+  "name": "",
+  "size": 51,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__StringStackTrace = new A._StringStackTrace();\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSInt_methods = J.JSInt.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 37,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSInt_methods = J.JSInt.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+}],
+ deferredFiles=[{
+  "main.dart": {
+    "name": "<unnamed>",
+    "imports": {
+      "lib": [
+        "out_1.part.js"
+      ]
+    }
+  }
+}],
+ dependencies=[{}],
+ library=[{
+  "id": "library/memory:sdk/tests/web/native/main.dart::",
+  "kind": "library",
+  "name": "<unnamed>",
+  "size": 301,
+  "children": [
+    "function/memory:sdk/tests/web/native/main.dart::main"
+  ],
+  "canonicalUri": "memory:sdk/tests/web/native/main.dart"
+}],
+ outputUnits=[
+  {
+  "id": "outputUnit/1",
+  "kind": "outputUnit",
+  "name": "1",
+  "size": 1087,
+  "filename": "out_1.part.js",
+  "imports": [
+    "lib"
+  ]
+},
+  {
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "filename": "out",
+  "imports": []
+}]
+*/
+
+/*canary.library: 
  constant=[
   {
   "id": "constant/B.C_Deferred = A.lib__funky$closure();\n",
diff --git a/pkg/compiler/test/dump_info/data/deferred_future/main.dart b/pkg/compiler/test/dump_info/data/deferred_future/main.dart
index e95b65c..0d5b68a 100644
--- a/pkg/compiler/test/dump_info/data/deferred_future/main.dart
+++ b/pkg/compiler/test/dump_info/data/deferred_future/main.dart
@@ -2,7 +2,130 @@
 // for 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: 
+/*spec.library: 
+ constant=[
+  {
+  "id": "constant/B.C_A = new A.A();\n",
+  "kind": "constant",
+  "name": "",
+  "size": 19,
+  "outputUnit": "outputUnit/1",
+  "code": "B.C_A = new A.A();\n"
+},
+  {
+  "id": "constant/B.C_Deferred = B.C_A;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 22,
+  "outputUnit": "outputUnit/1",
+  "code": "B.C_Deferred = B.C_A;\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": "",
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.C__RootZone = new A._RootZone();\n",
+  "kind": "constant",
+  "name": "",
+  "size": 35,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__RootZone = new A._RootZone();\n"
+},
+  {
+  "id": "constant/B.C__StringStackTrace = new A._StringStackTrace();\n",
+  "kind": "constant",
+  "name": "",
+  "size": 51,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__StringStackTrace = new A._StringStackTrace();\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSInt_methods = J.JSInt.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 37,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSInt_methods = J.JSInt.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+}],
+ deferredFiles=[{
+  "main.dart": {
+    "name": "<unnamed>",
+    "imports": {
+      "lib1": [
+        "out_1.part.js"
+      ]
+    }
+  }
+}],
+ dependencies=[{}],
+ library=[{
+  "id": "library/memory:sdk/tests/web/native/main.dart::",
+  "kind": "library",
+  "name": "<unnamed>",
+  "size": 857,
+  "children": [
+    "function/memory:sdk/tests/web/native/main.dart::main"
+  ],
+  "canonicalUri": "memory:sdk/tests/web/native/main.dart"
+}],
+ outputUnits=[
+  {
+  "id": "outputUnit/1",
+  "kind": "outputUnit",
+  "name": "1",
+  "size": 870,
+  "filename": "out_1.part.js",
+  "imports": [
+    "lib1"
+  ]
+},
+  {
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "filename": "out",
+  "imports": []
+}]
+*/
+
+/*canary.library: 
  constant=[
   {
   "id": "constant/B.C_A = new A.A();\n",
diff --git a/pkg/compiler/test/equivalence/show_helper.dart b/pkg/compiler/test/equivalence/show_helper.dart
index 4aa3850..a022064 100644
--- a/pkg/compiler/test/equivalence/show_helper.dart
+++ b/pkg/compiler/test/equivalence/show_helper.dart
@@ -71,7 +71,7 @@
       if (show != null && !show.any((f) => '$fileUri'.endsWith(f))) {
         continue;
       }
-      SourceFile sourceFile = await provider.autoReadFromFile(fileUri);
+      SourceFile sourceFile = provider.readUtf8FromFileSyncForTesting(fileUri);
       String sourceCode = sourceFile?.slowText();
       if (sourceCode == null) {
         sourceCode = new File.fromUri(fileUri).readAsStringSync();
diff --git a/pkg/compiler/test/helpers/memory_compiler.dart b/pkg/compiler/test/helpers/memory_compiler.dart
index 310120a..451ebc7 100644
--- a/pkg/compiler/test/helpers/memory_compiler.dart
+++ b/pkg/compiler/test/helpers/memory_compiler.dart
@@ -60,13 +60,10 @@
   api.CompilerDiagnostics handler = diagnostics;
   if (showDiagnostics) {
     if (diagnostics == null) {
-      handler = new FormattingDiagnosticHandler(provider)
-        ..verbose = verbose
-        ..autoReadFileUri = true;
+      handler = new FormattingDiagnosticHandler(provider)..verbose = verbose;
     } else {
       var formattingHandler = new FormattingDiagnosticHandler(provider)
-        ..verbose = verbose
-        ..autoReadFileUri = true;
+        ..verbose = verbose;
       handler = new MultiDiagnostics([diagnostics, formattingHandler]);
     }
   } else if (diagnostics == null) {
diff --git a/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart b/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart
index 35628cd..3d20d8e 100644
--- a/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart
+++ b/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart
@@ -105,7 +105,7 @@
   @override
   SourceFile getSourceFile(uri) {
     SourceFile sourceFile = sourceFileProvider.getUtf8SourceFile(uri);
-    sourceFile ??= sourceFileProvider.autoReadFromFile(uri);
+    sourceFile ??= sourceFileProvider.readUtf8FromFileSyncForTesting(uri);
     if (sourceFile == null) {
       sourceFile = outputProvider.getSourceFile(uri);
     }
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index 09d9ca8..7ca5376 100644
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 /// Command line entry point for Dart Development Compiler (dartdevc), used to
 /// compile a collection of dart libraries into a single JS module
 
@@ -16,6 +14,6 @@
 ///
 /// [sendPort] may be passed in when started in an isolate. If provided, it is
 /// used for bazel worker communication instead of stdin/stdout.
-Future main(List<String> args, [SendPort sendPort]) async {
+Future main(List<String> args, [SendPort? sendPort]) async {
   return ddc.internalMain(args, sendPort);
 }
diff --git a/pkg/dev_compiler/lib/dev_compiler.dart b/pkg/dev_compiler/lib/dev_compiler.dart
index 899fd4f..ca0a8bd 100644
--- a/pkg/dev_compiler/lib/dev_compiler.dart
+++ b/pkg/dev_compiler/lib/dev_compiler.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 // The dev_compiler does not have a publishable public API, instead this is
 // intended for other consumers within the Dart SDK.
 export 'src/compiler/module_builder.dart' show ModuleFormat, parseModuleFormat;
diff --git a/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart b/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart
index 2fcc44e..f24c12e 100644
--- a/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart
+++ b/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart
@@ -3,8 +3,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 /// Tool that consumes the .dill file of an entire dart-sdk and produces the
 /// corresponding Javascript module.
 
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index a66e98c..2259c4a 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -21,8 +21,7 @@
     "Usage: dart update_static_error_tests.dart [flags...] <path glob>";
 
 final _dartPath = _findBinary("dart", "exe");
-final _analyzerPath = _findBinary("dartanalyzer", "bat");
-final _dart2jsPath = _findBinary("dart2js", "bat");
+final _analyzerPath = p.join('pkg', 'analyzer_cli', 'bin', 'analyzer.dart');
 
 Future<void> main(List<String> args) async {
   var sources = ErrorSource.all.map((e) => e.marker).toList();
@@ -210,7 +209,8 @@
   // TODO(rnystrom): Running the analyzer command line each time is very slow.
   // Either import the analyzer as a library, or at least invoke it in a batch
   // mode.
-  var result = await Process.run(_analyzerPath, [
+  var result = await Process.run(_dartPath, [
+    _analyzerPath,
     ...options,
     "--format=json",
     file.absolute.path,
@@ -265,7 +265,9 @@
 /// Invoke dart2js on [file] and gather all static errors it reports.
 Future<List<StaticError>> runDart2js(
     File file, List<String> options, List<StaticError> cfeErrors) async {
-  var result = await Process.run(_dart2jsPath, [
+  var result = await Process.run(_dartPath, [
+    'compile',
+    'js',
     ...options,
     "-o",
     "dev:null", // Output is only created for file URIs.
diff --git a/runtime/lib/date.cc b/runtime/lib/date.cc
index e605c05..118461f 100644
--- a/runtime/lib/date.cc
+++ b/runtime/lib/date.cc
@@ -36,11 +36,6 @@
   return Integer::New(offset);
 }
 
-DEFINE_NATIVE_ENTRY(DateTime_localTimeZoneAdjustmentInSeconds, 0, 0) {
-  int adjustment = OS::GetLocalTimeZoneAdjustmentInSeconds();
-  return Integer::New(adjustment);
-}
-
 DEFINE_NATIVE_ENTRY(DateTime_currentTimeMicros, 0, 0) {
   return Integer::New(OS::GetCurrentTimeMicros());
 }
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 6e82679..a380012 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -145,7 +145,6 @@
   V(DateTime_currentTimeMicros, 0)                                             \
   V(DateTime_timeZoneName, 1)                                                  \
   V(DateTime_timeZoneOffsetInSeconds, 1)                                       \
-  V(DateTime_localTimeZoneAdjustmentInSeconds, 0)                              \
   V(AssertionError_throwNew, 3)                                                \
   V(AssertionError_throwNewSource, 4)                                          \
   V(Error_throwWithStackTrace, 2)                                              \
diff --git a/runtime/vm/os.h b/runtime/vm/os.h
index ccc0bf7..d0f9e4c 100644
--- a/runtime/vm/os.h
+++ b/runtime/vm/os.h
@@ -34,11 +34,6 @@
   // For example 3600 for CET, and 7200 for CEST.
   static int GetTimeZoneOffsetInSeconds(int64_t seconds_since_epoch);
 
-  // Returns the difference in seconds between local time and UTC when no
-  // daylight saving is active.
-  // For example 3600 in CET and CEST.
-  static int GetLocalTimeZoneAdjustmentInSeconds();
-
   // Returns the current time in milliseconds measured
   // from midnight January 1, 1970 UTC.
   static int64_t GetCurrentTimeMillis();
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index adc2a06..08af326 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -121,14 +121,6 @@
   return succeeded ? static_cast<int>(decomposed.tm_gmtoff) : 0;
 }
 
-int OS::GetLocalTimeZoneAdjustmentInSeconds() {
-  // TODO(floitsch): avoid excessive calls to tzset?
-  tzset();
-  // Even if the offset was 24 hours it would still easily fit into 32 bits.
-  // Note that Unix and Dart disagree on the sign.
-  return static_cast<int>(-timezone);
-}
-
 int64_t OS::GetCurrentTimeMillis() {
   return GetCurrentTimeMicros() / 1000;
 }
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index aa9684c..07150b3 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -415,14 +415,6 @@
   return status == ZX_OK ? local_offset + dst_offset : 0;
 }
 
-int OS::GetLocalTimeZoneAdjustmentInSeconds() {
-  int32_t local_offset, dst_offset;
-  int64_t now_seconds = GetCurrentTimeNanos() / ZX_SEC(1);
-  zx_status_t status =
-      GetLocalAndDstOffsetInSeconds(now_seconds, &local_offset, &dst_offset);
-  return status == ZX_OK ? local_offset : 0;
-}
-
 int64_t OS::GetCurrentTimeMillis() {
   return GetCurrentTimeNanos() / ZX_MSEC(1);
 }
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 782cd0e..411871a 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -440,14 +440,6 @@
   return succeeded ? static_cast<int>(decomposed.tm_gmtoff) : 0;
 }
 
-int OS::GetLocalTimeZoneAdjustmentInSeconds() {
-  // TODO(floitsch): avoid excessive calls to tzset?
-  tzset();
-  // Even if the offset was 24 hours it would still easily fit into 32 bits.
-  // Note that Unix and Dart disagree on the sign.
-  return static_cast<int>(-timezone);
-}
-
 int64_t OS::GetCurrentTimeMillis() {
   return GetCurrentTimeMicros() / 1000;
 }
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index 97090fc..a4f58f6 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -60,14 +60,6 @@
   return succeeded ? static_cast<int>(decomposed.tm_gmtoff) : 0;
 }
 
-int OS::GetLocalTimeZoneAdjustmentInSeconds() {
-  // TODO(floitsch): avoid excessive calls to tzset?
-  tzset();
-  // Even if the offset was 24 hours it would still easily fit into 32 bits.
-  // Note that Unix and Dart disagree on the sign.
-  return static_cast<int>(-timezone);
-}
-
 int64_t OS::GetCurrentTimeMillis() {
   return GetCurrentTimeMicros() / 1000;
 }
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 5a4b01c..a19fb63 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -106,13 +106,6 @@
   }
 }
 
-int OS::GetLocalTimeZoneAdjustmentInSeconds() {
-  // TODO(floitsch): avoid excessive calls to _tzset?
-  _tzset();
-  // Dart and Windows disagree on the sign of the bias.
-  return static_cast<int>(-_timezone);
-}
-
 int64_t OS::GetCurrentTimeMillis() {
   return GetCurrentTimeMicros() / 1000;
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index 3c7ccc7..0d8ebd4 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -1156,35 +1156,40 @@
 }
 
 @notNull
-String typeName(type) => JS('', '''(() => {
-  if ($type === void 0) return "undefined type";
-  if ($type === null) return "null type";
+String typeName(type) {
+  if (JS<bool>('!', '# === void 0', type)) return 'undefined type';
+  if (JS<bool>('!', '# === null', type)) return 'null type';
   // Non-instance types
-  if (${_jsInstanceOf(type, DartType)}) {
-    return $type.toString();
+  if (_jsInstanceOf(type, DartType)) {
+    return JS<String>('!', '#.toString()', type);
   }
 
   // Instance types
-  let tag = $type[$_runtimeType];
-  if (tag === $Type) {
-    let name = $type.name;
-    let args = ${getGenericArgs(type)};
+  var tag = JS('', '#[#]', type, _runtimeType);
+  if (JS<bool>('!', '# === #', tag, Type)) {
+    var name = JS<String>('!', '#.name', type);
+    var args = getGenericArgs(type);
     if (args == null) return name;
 
-    if (${getGenericClass(type)} == ${getGenericClassStatic<JSArray>()}) name = 'List';
+    if (JS<bool>('!', '# == #', getGenericClass(type),
+        getGenericClassStatic<JSArray>())) {
+      name = 'List';
+    }
 
-    let result = name;
-    result += '<';
-    for (let i = 0; i < args.length; ++i) {
+    var result = name + '<';
+    for (var i = 0; i < JS<int>('!', '#.length', args); ++i) {
       if (i > 0) result += ', ';
-      result += $typeName(args[i]);
+      result += typeName(JS('', '#[#]', args, i));
     }
     result += '>';
     return result;
   }
-  if (tag) return "Not a type: " + tag.name;
-  return "JSObject<" + $type.name + ">";
-})()''');
+  // Test the JavaScript "truthiness" of `tag`.
+  if (JS<bool>('!', '!!#', tag)) {
+    return 'Not a type: ' + JS<String>('!', '#.name', tag);
+  }
+  return 'JSObject<' + JS<String>('!', '#.name', type) + '>';
+}
 
 /// Returns true if [ft1] <: [ft2].
 @notNull
diff --git a/sdk/lib/_internal/vm/lib/date_patch.dart b/sdk/lib/_internal/vm/lib/date_patch.dart
index d404a16..1fc5550 100644
--- a/sdk/lib/_internal/vm/lib/date_patch.dart
+++ b/sdk/lib/_internal/vm/lib/date_patch.dart
@@ -19,10 +19,6 @@
   external static int _timeZoneOffsetInSecondsForClampedSeconds(
       int secondsSinceEpoch);
 
-  // Daylight-savings independent adjustment for the local time zone.
-  @pragma("vm:external-name", "DateTime_localTimeZoneAdjustmentInSeconds")
-  external static int _localTimeZoneAdjustmentInSeconds();
-
   static const _MICROSECOND_INDEX = 0;
   static const _MILLISECOND_INDEX = 1;
   static const _SECOND_INDEX = 2;
diff --git a/sdk/lib/_internal/wasm/lib/date_patch.dart b/sdk/lib/_internal/wasm/lib/date_patch.dart
index f2f0672..9b31078 100644
--- a/sdk/lib/_internal/wasm/lib/date_patch.dart
+++ b/sdk/lib/_internal/wasm/lib/date_patch.dart
@@ -28,10 +28,6 @@
   external static int _timeZoneOffsetInSecondsForClampedSeconds(
       int secondsSinceEpoch);
 
-  // Daylight-savings independent adjustment for the local time zone.
-  @pragma("vm:external-name", "DateTime_localTimeZoneAdjustmentInSeconds")
-  external static int _localTimeZoneAdjustmentInSeconds();
-
   static const _MICROSECOND_INDEX = 0;
   static const _MILLISECOND_INDEX = 1;
   static const _SECOND_INDEX = 2;
diff --git a/tools/VERSION b/tools/VERSION
index 1e7230c..f20d368 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 12
+PRERELEASE 13
 PRERELEASE_PATCH 0
\ No newline at end of file
